SysFS.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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/FileSystem/SysFSComponent.h>
  10. namespace Kernel {
  11. class SysFSRootDirectory final : public SysFSDirectory {
  12. friend class SysFSComponentRegistry;
  13. public:
  14. static NonnullRefPtr<SysFSRootDirectory> create();
  15. virtual KResult traverse_as_directory(unsigned, Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
  16. private:
  17. SysFSRootDirectory();
  18. RefPtr<SysFSBusDirectory> m_buses_directory;
  19. };
  20. class SysFSBusDirectory : public SysFSDirectory {
  21. friend class SysFSComponentRegistry;
  22. public:
  23. static NonnullRefPtr<SysFSBusDirectory> must_create(SysFSRootDirectory const&);
  24. private:
  25. explicit SysFSBusDirectory(SysFSRootDirectory const&);
  26. };
  27. class SysFSComponentRegistry {
  28. public:
  29. static SysFSComponentRegistry& the();
  30. static void initialize();
  31. SysFSComponentRegistry();
  32. void register_new_component(SysFSComponent&);
  33. SysFSDirectory& root_directory() { return m_root_directory; }
  34. Mutex& get_lock() { return m_lock; }
  35. void register_new_bus_directory(SysFSDirectory&);
  36. SysFSBusDirectory& buses_directory();
  37. private:
  38. Mutex m_lock;
  39. NonnullRefPtr<SysFSRootDirectory> m_root_directory;
  40. };
  41. class SysFS final : public FileSystem {
  42. friend class SysFSInode;
  43. friend class SysFSDirectoryInode;
  44. public:
  45. virtual ~SysFS() override;
  46. static NonnullRefPtr<SysFS> create();
  47. virtual KResult initialize() override;
  48. virtual StringView class_name() const override { return "SysFS"sv; }
  49. virtual Inode& root_inode() override;
  50. private:
  51. SysFS();
  52. NonnullRefPtr<SysFSInode> m_root_inode;
  53. };
  54. class SysFSInode : public Inode {
  55. friend class SysFS;
  56. friend class SysFSDirectoryInode;
  57. public:
  58. static NonnullRefPtr<SysFSInode> create(SysFS const&, SysFSComponent const&);
  59. StringView name() const { return m_associated_component->name(); }
  60. protected:
  61. SysFSInode(SysFS const&, SysFSComponent const&);
  62. virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override;
  63. virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
  64. virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
  65. virtual void flush_metadata() override;
  66. virtual InodeMetadata metadata() const override;
  67. virtual KResultOr<size_t> write_bytes(off_t, size_t, UserOrKernelBuffer const&, FileDescription*) override;
  68. virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
  69. virtual KResult add_child(Inode&, StringView const& name, mode_t) override;
  70. virtual KResult remove_child(StringView const& name) override;
  71. virtual KResult chmod(mode_t) override;
  72. virtual KResult chown(UserID, GroupID) override;
  73. virtual KResult truncate(u64) override;
  74. virtual KResult attach(FileDescription& description) override final;
  75. virtual void did_seek(FileDescription&, off_t) override final;
  76. NonnullRefPtr<SysFSComponent> m_associated_component;
  77. };
  78. class SysFSDirectoryInode : public SysFSInode {
  79. friend class SysFS;
  80. public:
  81. static NonnullRefPtr<SysFSDirectoryInode> create(SysFS const&, SysFSComponent const&);
  82. virtual ~SysFSDirectoryInode() override;
  83. SysFS& fs() { return static_cast<SysFS&>(Inode::fs()); }
  84. SysFS const& fs() const { return static_cast<SysFS const&>(Inode::fs()); }
  85. protected:
  86. SysFSDirectoryInode(SysFS const&, SysFSComponent const&);
  87. // ^Inode
  88. virtual InodeMetadata metadata() const override;
  89. virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
  90. virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
  91. };
  92. }