SyntheticFileSystem.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #pragma once
  2. #include <AK/HashMap.h>
  3. #include <Kernel/FileSystem/FileSystem.h>
  4. #include <Kernel/FileSystem/Inode.h>
  5. #include <Kernel/KBuffer.h>
  6. #include <Kernel/UnixTypes.h>
  7. class SynthFSInode;
  8. class SynthFS : public FS {
  9. public:
  10. virtual ~SynthFS() override;
  11. static NonnullRefPtr<SynthFS> create();
  12. virtual bool initialize() override;
  13. virtual const char* class_name() const override;
  14. virtual InodeIdentifier root_inode() const override;
  15. virtual RefPtr<Inode> create_inode(InodeIdentifier parentInode, const String& name, mode_t, off_t size, dev_t, int& error) override;
  16. virtual RefPtr<Inode> create_directory(InodeIdentifier parentInode, const String& name, mode_t, int& error) override;
  17. virtual RefPtr<Inode> get_inode(InodeIdentifier) const override;
  18. protected:
  19. typedef unsigned InodeIndex;
  20. InodeIndex generate_inode_index();
  21. static constexpr InodeIndex RootInodeIndex = 1;
  22. SynthFS();
  23. NonnullRefPtr<SynthFSInode> create_directory(String&& name);
  24. NonnullRefPtr<SynthFSInode> create_generated_file(String&& name, Function<ByteBuffer(SynthFSInode&)>&&, mode_t = 0100644);
  25. NonnullRefPtr<SynthFSInode> create_generated_file(String&& name, Function<ByteBuffer(SynthFSInode&)>&&, Function<ssize_t(SynthFSInode&, const ByteBuffer&)>&&, mode_t = 0100644);
  26. InodeIdentifier add_file(RefPtr<SynthFSInode>&&, InodeIndex parent = RootInodeIndex);
  27. bool remove_file(InodeIndex);
  28. private:
  29. InodeIndex m_next_inode_index { 2 };
  30. HashMap<InodeIndex, RefPtr<SynthFSInode>> m_inodes;
  31. };
  32. struct SynthFSInodeCustomData {
  33. virtual ~SynthFSInodeCustomData();
  34. };
  35. class SynthFSInode final : public Inode {
  36. friend class SynthFS;
  37. friend class DevPtsFS;
  38. public:
  39. virtual ~SynthFSInode() override;
  40. void set_custom_data(OwnPtr<SynthFSInodeCustomData>&& custom_data) { m_custom_data = move(custom_data); }
  41. SynthFSInodeCustomData* custom_data() { return m_custom_data.ptr(); }
  42. const SynthFSInodeCustomData* custom_data() const { return m_custom_data.ptr(); }
  43. private:
  44. // ^Inode
  45. virtual ssize_t read_bytes(off_t, ssize_t, u8* buffer, FileDescription*) const override;
  46. virtual InodeMetadata metadata() const override;
  47. virtual bool traverse_as_directory(Function<bool(const FS::DirectoryEntry&)>) const override;
  48. virtual InodeIdentifier lookup(StringView name) override;
  49. virtual void flush_metadata() override;
  50. virtual ssize_t write_bytes(off_t, ssize_t, const u8* buffer, FileDescription*) override;
  51. virtual KResult add_child(InodeIdentifier child_id, const StringView& name, mode_t) override;
  52. virtual KResult remove_child(const StringView& name) override;
  53. virtual size_t directory_entry_count() const override;
  54. virtual KResult chmod(mode_t) override;
  55. virtual KResult chown(uid_t, gid_t) override;
  56. SynthFS& fs();
  57. const SynthFS& fs() const;
  58. SynthFSInode(SynthFS&, unsigned index);
  59. String m_name;
  60. InodeIdentifier m_parent;
  61. Function<KBuffer(SynthFSInode&)> m_generator;
  62. Function<ssize_t(SynthFSInode&, const ByteBuffer&)> m_write_callback;
  63. Vector<SynthFSInode*> m_children;
  64. InodeMetadata m_metadata;
  65. OwnPtr<SynthFSInodeCustomData> m_custom_data;
  66. };
  67. inline SynthFS& SynthFSInode::fs()
  68. {
  69. return static_cast<SynthFS&>(Inode::fs());
  70. }
  71. inline const SynthFS& SynthFSInode::fs() const
  72. {
  73. return static_cast<const SynthFS&>(Inode::fs());
  74. }