SysFS.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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. };
  19. class SysFSComponentRegistry {
  20. public:
  21. static SysFSComponentRegistry& the();
  22. static void initialize();
  23. SysFSComponentRegistry();
  24. void register_new_component(SysFSComponent&);
  25. SysFSDirectory& root_directory() { return m_root_directory; }
  26. Mutex& get_lock() { return m_lock; }
  27. private:
  28. Mutex m_lock;
  29. NonnullRefPtr<SysFSRootDirectory> m_root_directory;
  30. };
  31. class SysFS final : public FileSystem {
  32. friend class SysFSInode;
  33. friend class SysFSDirectoryInode;
  34. public:
  35. virtual ~SysFS() override;
  36. static NonnullRefPtr<SysFS> create();
  37. virtual bool initialize() override;
  38. virtual StringView class_name() const override { return "SysFS"sv; }
  39. virtual NonnullRefPtr<Inode> root_inode() const override;
  40. private:
  41. SysFS();
  42. NonnullRefPtr<SysFSInode> m_root_inode;
  43. };
  44. class SysFSInode : public Inode {
  45. friend class SysFS;
  46. friend class SysFSDirectoryInode;
  47. public:
  48. static NonnullRefPtr<SysFSInode> create(SysFS const&, SysFSComponent const&);
  49. StringView name() const { return m_associated_component->name(); }
  50. protected:
  51. SysFSInode(SysFS const&, SysFSComponent const&);
  52. virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override;
  53. virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
  54. virtual RefPtr<Inode> lookup(StringView name) override;
  55. virtual void flush_metadata() override;
  56. virtual InodeMetadata metadata() const override;
  57. virtual KResultOr<size_t> write_bytes(off_t, size_t, UserOrKernelBuffer const&, FileDescription*) override;
  58. virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, uid_t, gid_t) override;
  59. virtual KResult add_child(Inode&, StringView const& name, mode_t) override;
  60. virtual KResult remove_child(StringView const& name) override;
  61. virtual KResult chmod(mode_t) override;
  62. virtual KResult chown(uid_t, gid_t) override;
  63. virtual KResult truncate(u64) override;
  64. NonnullRefPtr<SysFSComponent> m_associated_component;
  65. };
  66. class SysFSDirectoryInode : public SysFSInode {
  67. friend class SysFS;
  68. public:
  69. static NonnullRefPtr<SysFSDirectoryInode> create(SysFS const&, SysFSComponent const&);
  70. virtual ~SysFSDirectoryInode() override;
  71. protected:
  72. SysFSDirectoryInode(SysFS const&, SysFSComponent const&);
  73. // ^Inode
  74. virtual InodeMetadata metadata() const override;
  75. virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
  76. virtual RefPtr<Inode> lookup(StringView name) override;
  77. SysFS& m_parent_fs;
  78. };
  79. }