VirtualFileSystem.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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 "FileSystem.h"
  11. #include <Kernel/KResult.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. class Device;
  26. class FileDescriptor;
  27. inline constexpr dword encoded_device(unsigned major, unsigned minor)
  28. {
  29. return (minor & 0xff) | (major << 8) | ((minor & ~0xff) << 12);
  30. }
  31. class VFS;
  32. class VFS {
  33. AK_MAKE_ETERNAL
  34. public:
  35. class Mount {
  36. public:
  37. Mount(InodeIdentifier host, RetainPtr<FS>&&);
  38. InodeIdentifier host() const { return m_host; }
  39. InodeIdentifier guest() const { return m_guest; }
  40. const FS& guest_fs() const { return *m_guest_fs; }
  41. private:
  42. InodeIdentifier m_host;
  43. InodeIdentifier m_guest;
  44. RetainPtr<FS> m_guest_fs;
  45. };
  46. [[gnu::pure]] static VFS& the();
  47. VFS();
  48. ~VFS();
  49. bool mount_root(RetainPtr<FS>&&);
  50. bool mount(RetainPtr<FS>&&, const String& path);
  51. KResultOr<Retained<FileDescriptor>> open(RetainPtr<Device>&&, int options);
  52. KResultOr<Retained<FileDescriptor>> open(const String& path, int options, mode_t mode, Inode& base);
  53. KResultOr<Retained<FileDescriptor>> create(const String& path, int options, mode_t mode, Inode& base);
  54. KResult mkdir(const String& path, mode_t mode, Inode& base);
  55. KResult link(const String& old_path, const String& new_path, Inode& base);
  56. KResult unlink(const String& path, Inode& base);
  57. KResult symlink(const String& target, const String& linkpath, Inode& base);
  58. KResult rmdir(const String& path, Inode& base);
  59. KResult chmod(const String& path, mode_t, Inode& base);
  60. KResult chmod(Inode&, mode_t);
  61. KResult chown(const String& path, uid_t, gid_t, Inode& base);
  62. KResult access(const String& path, int mode, Inode& base);
  63. KResult stat(const String& path, int options, Inode& base, struct stat&);
  64. KResult utime(const String& path, Inode& base, time_t atime, time_t mtime);
  65. KResultOr<Retained<Inode>> open_directory(const String& path, Inode& base);
  66. void register_device(Device&);
  67. void unregister_device(Device&);
  68. size_t mount_count() const { return m_mounts.size(); }
  69. void for_each_mount(Function<void(const Mount&)>) const;
  70. KResultOr<String> absolute_path(Inode&);
  71. KResultOr<String> absolute_path(InodeIdentifier);
  72. InodeIdentifier root_inode_id() const;
  73. Inode* root_inode() { return m_root_inode.ptr(); }
  74. const Inode* root_inode() const { return m_root_inode.ptr(); }
  75. void sync();
  76. Device* get_device(unsigned major, unsigned minor);
  77. private:
  78. friend class FileDescriptor;
  79. RetainPtr<Inode> get_inode(InodeIdentifier);
  80. bool is_vfs_root(InodeIdentifier) const;
  81. void traverse_directory_inode(Inode&, Function<bool(const FS::DirectoryEntry&)>);
  82. InodeIdentifier old_resolve_path(const String& path, InodeIdentifier base, int& error, int options = 0, InodeIdentifier* parent_id = nullptr);
  83. KResultOr<InodeIdentifier> resolve_path(const String& path, InodeIdentifier base, int options = 0, InodeIdentifier* parent_id = nullptr);
  84. KResultOr<Retained<Inode>> resolve_path_to_inode(const String& path, Inode& base, RetainPtr<Inode>* parent_id = nullptr, int options = 0);
  85. KResultOr<InodeIdentifier> resolve_symbolic_link(InodeIdentifier base, Inode& symlink_inode);
  86. Mount* find_mount_for_host(InodeIdentifier);
  87. Mount* find_mount_for_guest(InodeIdentifier);
  88. RetainPtr<Inode> m_root_inode;
  89. Vector<OwnPtr<Mount>> m_mounts;
  90. HashMap<dword, Device*> m_devices;
  91. };