VirtualFileSystem.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #pragma once
  2. #include <AK/HashMap.h>
  3. #include <AK/OwnPtr.h>
  4. #include <AK/RetainPtr.h>
  5. #include <AK/AKString.h>
  6. #include <AK/Vector.h>
  7. #include <AK/Function.h>
  8. #include "InodeIdentifier.h"
  9. #include "InodeMetadata.h"
  10. #include "Limits.h"
  11. #include "FileSystem.h"
  12. #include <Kernel/KResult.h>
  13. #define O_RDONLY 0
  14. #define O_WRONLY 1
  15. #define O_RDWR 2
  16. #define O_CREAT 0100
  17. #define O_EXCL 0200
  18. #define O_NOCTTY 0400
  19. #define O_TRUNC 01000
  20. #define O_APPEND 02000
  21. #define O_NONBLOCK 04000
  22. #define O_DIRECTORY 00200000
  23. #define O_NOFOLLOW 00400000
  24. #define O_CLOEXEC 02000000
  25. #define O_NOFOLLOW_NOERROR 0x4000000
  26. class Device;
  27. class FileDescriptor;
  28. inline constexpr dword encoded_device(unsigned major, unsigned minor)
  29. {
  30. return (minor & 0xff) | (major << 8) | ((minor & ~0xff) << 12);
  31. }
  32. class VFS;
  33. class VFS {
  34. AK_MAKE_ETERNAL
  35. public:
  36. class Mount {
  37. public:
  38. Mount(InodeIdentifier host, RetainPtr<FS>&&);
  39. InodeIdentifier host() const { return m_host; }
  40. InodeIdentifier guest() const { return m_guest; }
  41. const FS& guest_fs() const { return *m_guest_fs; }
  42. private:
  43. InodeIdentifier m_host;
  44. InodeIdentifier m_guest;
  45. RetainPtr<FS> m_guest_fs;
  46. };
  47. [[gnu::pure]] static VFS& the();
  48. VFS();
  49. ~VFS();
  50. bool mount_root(RetainPtr<FS>&&);
  51. bool mount(RetainPtr<FS>&&, const String& path);
  52. RetainPtr<FileDescriptor> open(RetainPtr<Device>&&, int& error, int options);
  53. RetainPtr<FileDescriptor> open(const String& path, int& error, int options, mode_t mode, Inode& base);
  54. RetainPtr<FileDescriptor> create(const String& path, int& error, int options, mode_t mode, Inode& base);
  55. KResult mkdir(const String& path, mode_t mode, Inode& base);
  56. bool link(const String& old_path, const String& new_path, Inode& base, int& error);
  57. bool unlink(const String& path, Inode& base, int& error);
  58. bool rmdir(const String& path, Inode& base, int& error);
  59. KResult chmod(const String& path, mode_t, Inode& base);
  60. KResult chown(const String& path, uid_t, gid_t, Inode& base);
  61. KResult access(const String& path, int mode, Inode& base);
  62. bool stat(const String& path, int& error, int options, Inode& base, struct stat&);
  63. KResult utime(const String& path, Inode& base, time_t atime, time_t mtime);
  64. void register_device(Device&);
  65. void unregister_device(Device&);
  66. size_t mount_count() const { return m_mounts.size(); }
  67. void for_each_mount(Function<void(const Mount&)>) const;
  68. String absolute_path(Inode&);
  69. String absolute_path(InodeIdentifier);
  70. InodeIdentifier root_inode_id() const;
  71. Inode* root_inode() { return m_root_inode.ptr(); }
  72. const Inode* root_inode() const { return m_root_inode.ptr(); }
  73. void sync();
  74. Device* get_device(unsigned major, unsigned minor);
  75. private:
  76. friend class FileDescriptor;
  77. RetainPtr<Inode> get_inode(InodeIdentifier);
  78. bool is_vfs_root(InodeIdentifier) const;
  79. void traverse_directory_inode(Inode&, Function<bool(const FS::DirectoryEntry&)>);
  80. InodeIdentifier old_resolve_path(const String& path, InodeIdentifier base, int& error, int options = 0, InodeIdentifier* parent_id = nullptr);
  81. KResultOr<InodeIdentifier> resolve_path(const String& path, InodeIdentifier base, int options = 0, InodeIdentifier* parent_id = nullptr);
  82. RetainPtr<Inode> resolve_path_to_inode(const String& path, Inode& base, int& error, RetainPtr<Inode>* parent_id = nullptr);
  83. KResultOr<RetainPtr<Inode>> resolve_path_to_inode(const String& path, Inode& base, RetainPtr<Inode>* parent_id = nullptr);
  84. KResultOr<InodeIdentifier> resolve_symbolic_link(InodeIdentifier base, Inode& symlink_inode);
  85. Mount* find_mount_for_host(InodeIdentifier);
  86. Mount* find_mount_for_guest(InodeIdentifier);
  87. RetainPtr<Inode> m_root_inode;
  88. Vector<OwnPtr<Mount>> m_mounts;
  89. HashMap<dword, Device*> m_devices;
  90. };