VirtualFileSystem.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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. #define O_RDONLY 0
  13. #define O_WRONLY 1
  14. #define O_RDWR 2
  15. #define O_CREAT 0100
  16. #define O_EXCL 0200
  17. #define O_NOCTTY 0400
  18. #define O_TRUNC 01000
  19. #define O_APPEND 02000
  20. #define O_NONBLOCK 04000
  21. #define O_DIRECTORY 00200000
  22. #define O_NOFOLLOW 00400000
  23. #define O_CLOEXEC 02000000
  24. #define O_NOFOLLOW_NOERROR 0x4000000
  25. #define O_DONT_OPEN_DEVICE 0x8000000
  26. class CharacterDevice;
  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. static void initialize_globals();
  37. class Mount {
  38. public:
  39. Mount(InodeIdentifier host, RetainPtr<FS>&&);
  40. InodeIdentifier host() const { return m_host; }
  41. InodeIdentifier guest() const { return m_guest; }
  42. const FS& guest_fs() const { return *m_guest_fs; }
  43. private:
  44. InodeIdentifier m_host;
  45. InodeIdentifier m_guest;
  46. RetainPtr<FS> m_guest_fs;
  47. };
  48. static VFS& the() PURE;
  49. VFS();
  50. ~VFS();
  51. bool mount_root(RetainPtr<FS>&&);
  52. bool mount(RetainPtr<FS>&&, const String& path);
  53. RetainPtr<FileDescriptor> open(RetainPtr<CharacterDevice>&&, int& error, int options);
  54. RetainPtr<FileDescriptor> open(const String& path, int& error, int options, mode_t mode, Inode& base);
  55. RetainPtr<FileDescriptor> create(const String& path, int& error, int options, mode_t mode, Inode& base);
  56. bool mkdir(const String& path, mode_t mode, 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. bool chmod(const String& path, mode_t, Inode& base, int& error);
  60. void register_character_device(CharacterDevice&);
  61. void unregister_character_device(CharacterDevice&);
  62. size_t mount_count() const { return m_mounts.size(); }
  63. void for_each_mount(Function<void(const Mount&)>) const;
  64. String absolute_path(Inode&);
  65. String absolute_path(InodeIdentifier);
  66. InodeIdentifier root_inode_id() const;
  67. Inode* root_inode() { return m_root_inode.ptr(); }
  68. const Inode* root_inode() const { return m_root_inode.ptr(); }
  69. void sync();
  70. CharacterDevice* get_device(unsigned major, unsigned minor);
  71. private:
  72. friend class FileDescriptor;
  73. RetainPtr<Inode> get_inode(InodeIdentifier);
  74. bool is_vfs_root(InodeIdentifier) const;
  75. void traverse_directory_inode(Inode&, Function<bool(const FS::DirectoryEntry&)>);
  76. InodeIdentifier resolve_path(const String& path, InodeIdentifier base, int& error, int options = 0, InodeIdentifier* parent_id = nullptr);
  77. InodeIdentifier resolve_symbolic_link(InodeIdentifier base, Inode& symlink_inode, int& error);
  78. Mount* find_mount_for_host(InodeIdentifier);
  79. Mount* find_mount_for_guest(InodeIdentifier);
  80. RetainPtr<Inode> m_root_inode;
  81. Vector<OwnPtr<Mount>> m_mounts;
  82. HashMap<dword, CharacterDevice*> m_character_devices;
  83. };