SysFS.h 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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/SysFS/Component.h>
  10. #include <Kernel/Locking/MutexProtected.h>
  11. namespace Kernel {
  12. class SysFS final : public FileSystem {
  13. friend class SysFSInode;
  14. friend class SysFSDirectoryInode;
  15. public:
  16. virtual ~SysFS() override;
  17. static ErrorOr<NonnullRefPtr<FileSystem>> try_create();
  18. virtual ErrorOr<void> initialize() override;
  19. virtual StringView class_name() const override { return "SysFS"sv; }
  20. virtual Inode& root_inode() override;
  21. private:
  22. SysFS();
  23. RefPtr<SysFSInode> m_root_inode;
  24. };
  25. class SysFSInode : public Inode {
  26. friend class SysFS;
  27. friend class SysFSDirectoryInode;
  28. public:
  29. static ErrorOr<NonnullRefPtr<SysFSInode>> try_create(SysFS const&, SysFSComponent const&);
  30. StringView name() const { return m_associated_component->name(); }
  31. protected:
  32. SysFSInode(SysFS const&, SysFSComponent const&);
  33. virtual ErrorOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override;
  34. virtual ErrorOr<void> traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override;
  35. virtual ErrorOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
  36. virtual ErrorOr<void> flush_metadata() override;
  37. virtual InodeMetadata metadata() const override;
  38. virtual ErrorOr<size_t> write_bytes(off_t, size_t, UserOrKernelBuffer const&, OpenFileDescription*) override;
  39. virtual ErrorOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
  40. virtual ErrorOr<void> add_child(Inode&, StringView name, mode_t) override;
  41. virtual ErrorOr<void> remove_child(StringView name) override;
  42. virtual ErrorOr<void> chmod(mode_t) override;
  43. virtual ErrorOr<void> chown(UserID, GroupID) override;
  44. virtual ErrorOr<void> truncate(u64) override;
  45. virtual ErrorOr<void> set_mtime(time_t) override;
  46. virtual ErrorOr<void> attach(OpenFileDescription& description) override final;
  47. virtual void did_seek(OpenFileDescription&, off_t) override final;
  48. NonnullRefPtr<SysFSComponent> m_associated_component;
  49. };
  50. class SysFSDirectoryInode : public SysFSInode {
  51. friend class SysFS;
  52. public:
  53. static ErrorOr<NonnullRefPtr<SysFSDirectoryInode>> try_create(SysFS const&, SysFSComponent const&);
  54. virtual ~SysFSDirectoryInode() override;
  55. SysFS& fs() { return static_cast<SysFS&>(Inode::fs()); }
  56. SysFS const& fs() const { return static_cast<SysFS const&>(Inode::fs()); }
  57. protected:
  58. SysFSDirectoryInode(SysFS const&, SysFSComponent const&);
  59. // ^Inode
  60. virtual InodeMetadata metadata() const override;
  61. virtual ErrorOr<void> traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override;
  62. virtual ErrorOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
  63. };
  64. }