SysFS.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /*
  2. * Copyright (c) 2021, Liav A. <liavalb@hotmail.co.il>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <Kernel/FileSystem/FileSystem.h>
  8. #include <Kernel/FileSystem/Inode.h>
  9. #include <Kernel/SystemExposed.h>
  10. namespace Kernel {
  11. class SysFSRootFolder final : public SysFSDirectory {
  12. friend class SysFSComponentRegistry;
  13. public:
  14. static NonnullRefPtr<SysFSRootFolder> create();
  15. virtual KResult traverse_as_directory(unsigned, Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
  16. private:
  17. SysFSRootFolder();
  18. };
  19. class SysFSComponentRegistry {
  20. friend class SysFS;
  21. friend class SysFSComponent;
  22. friend class SysFSDirectory;
  23. friend class SysFSRootFolder;
  24. public:
  25. static SysFSComponentRegistry& the();
  26. static void initialize();
  27. SysFSComponentRegistry();
  28. void register_new_component(SysFSComponent&);
  29. NonnullRefPtr<SysFSDirectory> root_folder() { return m_root_folder; }
  30. private:
  31. Lock m_lock;
  32. NonnullRefPtr<SysFSRootFolder> m_root_folder;
  33. };
  34. class SysFS final : public FileSystem {
  35. friend class SysFSInode;
  36. friend class SysFSDirectoryInode;
  37. public:
  38. virtual ~SysFS() override;
  39. static NonnullRefPtr<SysFS> create();
  40. virtual bool initialize() override;
  41. virtual char const* class_name() const override { return "SysFS"; }
  42. virtual NonnullRefPtr<Inode> root_inode() const override;
  43. private:
  44. SysFS();
  45. NonnullRefPtr<SysFSInode> m_root_inode;
  46. };
  47. class SysFSInode : public Inode {
  48. friend class SysFS;
  49. friend class SysFSDirectoryInode;
  50. public:
  51. static NonnullRefPtr<SysFSInode> create(SysFS const&, SysFSComponent const&);
  52. StringView name() const { return m_associated_component->name(); }
  53. protected:
  54. SysFSInode(SysFS const&, SysFSComponent const&);
  55. virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override;
  56. virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
  57. virtual RefPtr<Inode> lookup(StringView name) override;
  58. virtual void flush_metadata() override;
  59. virtual InodeMetadata metadata() const override;
  60. virtual KResultOr<size_t> write_bytes(off_t, size_t, UserOrKernelBuffer const&, FileDescription*) override;
  61. virtual KResultOr<NonnullRefPtr<Inode>> create_child(String const& name, mode_t, dev_t, uid_t, gid_t) override;
  62. virtual KResult add_child(Inode&, StringView const& name, mode_t) override;
  63. virtual KResult remove_child(StringView const& name) override;
  64. virtual KResultOr<size_t> directory_entry_count() const override;
  65. virtual KResult chmod(mode_t) override;
  66. virtual KResult chown(uid_t, gid_t) override;
  67. virtual KResult truncate(u64) override;
  68. NonnullRefPtr<SysFSComponent> m_associated_component;
  69. };
  70. class SysFSDirectoryInode : public SysFSInode {
  71. friend class SysFS;
  72. public:
  73. static NonnullRefPtr<SysFSDirectoryInode> create(SysFS const&, SysFSComponent const&);
  74. virtual ~SysFSDirectoryInode() override;
  75. protected:
  76. SysFSDirectoryInode(SysFS const&, SysFSComponent const&);
  77. // ^Inode
  78. virtual InodeMetadata metadata() const override;
  79. virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
  80. virtual RefPtr<Inode> lookup(StringView name) override;
  81. virtual KResultOr<size_t> directory_entry_count() const override;
  82. SysFS& m_parent_fs;
  83. };
  84. }