VirtualFileSystem.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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. 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. static VFS& the() PURE;
  48. VFS();
  49. ~VFS();
  50. bool mount_root(RetainPtr<FS>&&);
  51. bool mount(RetainPtr<FS>&&, const String& path);
  52. RetainPtr<FileDescriptor> open(RetainPtr<CharacterDevice>&&, 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. bool mkdir(const String& path, mode_t mode, Inode& base, int& error);
  56. bool unlink(const String& path, Inode& base, int& error);
  57. bool rmdir(const String& path, Inode& base, int& error);
  58. bool chmod(const String& path, mode_t, Inode& base, int& error);
  59. void register_character_device(CharacterDevice&);
  60. void unregister_character_device(CharacterDevice&);
  61. size_t mount_count() const { return m_mounts.size(); }
  62. void for_each_mount(Function<void(const Mount&)>) const;
  63. String absolute_path(Inode&);
  64. String absolute_path(InodeIdentifier);
  65. InodeIdentifier root_inode_id() const;
  66. Inode* root_inode() { return m_root_inode.ptr(); }
  67. const Inode* root_inode() const { return m_root_inode.ptr(); }
  68. void sync();
  69. CharacterDevice* get_device(unsigned major, unsigned minor);
  70. private:
  71. friend class FileDescriptor;
  72. RetainPtr<Inode> get_inode(InodeIdentifier);
  73. bool is_vfs_root(InodeIdentifier) const;
  74. void traverse_directory_inode(Inode&, Function<bool(const FS::DirectoryEntry&)>);
  75. InodeIdentifier resolve_path(const String& path, InodeIdentifier base, int& error, int options = 0, InodeIdentifier* parent_id = nullptr);
  76. InodeIdentifier resolve_symbolic_link(InodeIdentifier base, Inode& symlink_inode, int& error);
  77. Mount* find_mount_for_host(InodeIdentifier);
  78. Mount* find_mount_for_guest(InodeIdentifier);
  79. RetainPtr<Inode> m_root_inode;
  80. Vector<OwnPtr<Mount>> m_mounts;
  81. HashMap<dword, CharacterDevice*> m_character_devices;
  82. };