DevFS.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. /*
  2. * Copyright (c) 2020, Liav A. <liavalb@hotmail.co.il>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Types.h>
  8. #include <Kernel/FileSystem/FileSystem.h>
  9. #include <Kernel/FileSystem/Inode.h>
  10. #include <Kernel/FileSystem/InodeMetadata.h>
  11. #include <Kernel/TTY/SlavePTY.h>
  12. namespace Kernel {
  13. class DevFSInode;
  14. class DevFSDeviceInode;
  15. class DevFSDirectoryInode;
  16. class DevFSRootDirectoryInode;
  17. class DevFSDevicesDirectoryInode;
  18. class DevFSPtsDirectoryInode;
  19. class Device;
  20. class DevFS final : public FS {
  21. friend class DevFSInode;
  22. friend class DevFSRootDirectoryInode;
  23. public:
  24. virtual ~DevFS() override;
  25. static NonnullRefPtr<DevFS> create();
  26. virtual bool initialize() override;
  27. virtual const char* class_name() const override { return "DevFS"; }
  28. void notify_new_device(Device&);
  29. void notify_device_removal(Device&);
  30. virtual NonnullRefPtr<Inode> root_inode() const override;
  31. private:
  32. DevFS();
  33. RefPtr<Inode> get_inode(InodeIdentifier) const;
  34. size_t allocate_inode_index();
  35. NonnullRefPtr<DevFSRootDirectoryInode> m_root_inode;
  36. NonnullRefPtrVector<DevFSInode> m_nodes;
  37. InodeIndex m_next_inode_index { 0 };
  38. };
  39. class DevFSInode : public Inode {
  40. friend class DevFS;
  41. friend class DevFSRootDirectoryInode;
  42. public:
  43. virtual String name() const = 0;
  44. protected:
  45. DevFSInode(DevFS&);
  46. virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override;
  47. virtual KResult traverse_as_directory(Function<bool(const FS::DirectoryEntryView&)>) const override;
  48. virtual RefPtr<Inode> lookup(StringView name) override;
  49. virtual void flush_metadata() override;
  50. virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override;
  51. virtual KResultOr<NonnullRefPtr<Inode>> create_child(const String& name, mode_t, dev_t, uid_t, gid_t) override;
  52. virtual KResult add_child(Inode&, const StringView& name, mode_t) override;
  53. virtual KResult remove_child(const StringView& name) override;
  54. virtual KResultOr<size_t> directory_entry_count() const override;
  55. virtual KResult chmod(mode_t) override;
  56. virtual KResult chown(uid_t, gid_t) override;
  57. virtual KResult truncate(u64) override;
  58. };
  59. class DevFSDeviceInode : public DevFSInode {
  60. friend class DevFS;
  61. friend class DevFSRootDirectoryInode;
  62. public:
  63. virtual String name() const override;
  64. virtual ~DevFSDeviceInode() override;
  65. private:
  66. String determine_name() const;
  67. DevFSDeviceInode(DevFS&, const Device&);
  68. // ^Inode
  69. virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override;
  70. virtual InodeMetadata metadata() const override;
  71. virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override;
  72. virtual KResult chown(uid_t, gid_t) override;
  73. NonnullRefPtr<Device> m_attached_device;
  74. String m_cached_name;
  75. uid_t m_uid { 0 };
  76. gid_t m_gid { 0 };
  77. };
  78. class DevFSLinkInode : public DevFSInode {
  79. friend class DevFS;
  80. friend class DevFSRootDirectoryInode;
  81. public:
  82. virtual String name() const override;
  83. virtual ~DevFSLinkInode() override;
  84. protected:
  85. DevFSLinkInode(DevFS&, String);
  86. // ^Inode
  87. virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override;
  88. virtual InodeMetadata metadata() const override;
  89. virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override;
  90. const String m_name;
  91. String m_link;
  92. };
  93. class DevFSDirectoryInode : public DevFSInode {
  94. friend class DevFS;
  95. friend class DevFSRootDirectoryInode;
  96. public:
  97. virtual ~DevFSDirectoryInode() override;
  98. protected:
  99. DevFSDirectoryInode(DevFS&);
  100. // ^Inode
  101. virtual InodeMetadata metadata() const override;
  102. virtual KResult traverse_as_directory(Function<bool(const FS::DirectoryEntryView&)>) const override;
  103. virtual RefPtr<Inode> lookup(StringView name) override;
  104. virtual KResultOr<size_t> directory_entry_count() const override;
  105. NonnullRefPtrVector<DevFSDeviceInode> m_devices;
  106. };
  107. class DevFSPtsDirectoryInode final : public DevFSDirectoryInode {
  108. friend class DevFS;
  109. friend class DevFSRootDirectoryInode;
  110. public:
  111. virtual ~DevFSPtsDirectoryInode() override;
  112. virtual String name() const override { return "pts"; };
  113. private:
  114. explicit DevFSPtsDirectoryInode(DevFS&);
  115. virtual KResult traverse_as_directory(Function<bool(const FS::DirectoryEntryView&)>) const override;
  116. virtual RefPtr<Inode> lookup(StringView name) override;
  117. virtual InodeMetadata metadata() const override;
  118. virtual KResultOr<size_t> directory_entry_count() const override;
  119. };
  120. class DevFSRootDirectoryInode final : public DevFSDirectoryInode {
  121. friend class DevFS;
  122. public:
  123. virtual ~DevFSRootDirectoryInode() override;
  124. virtual String name() const override { return "."; }
  125. private:
  126. explicit DevFSRootDirectoryInode(DevFS&);
  127. virtual KResultOr<NonnullRefPtr<Inode>> create_child(const String& name, mode_t, dev_t, uid_t, gid_t) override;
  128. virtual KResult traverse_as_directory(Function<bool(const FS::DirectoryEntryView&)>) const override;
  129. virtual RefPtr<Inode> lookup(StringView name) override;
  130. virtual InodeMetadata metadata() const override;
  131. virtual KResultOr<size_t> directory_entry_count() const override;
  132. NonnullRefPtrVector<DevFSDirectoryInode> m_subfolders;
  133. NonnullRefPtrVector<DevFSLinkInode> m_links;
  134. DevFS& m_parent_fs;
  135. };
  136. }