SyntheticFileSystem.h 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #pragma once
  2. #include "FileSystem.h"
  3. #include "UnixTypes.h"
  4. #include <AK/HashMap.h>
  5. class SynthFSInode;
  6. class SynthFS : public FS {
  7. public:
  8. virtual ~SynthFS() override;
  9. static Retained<SynthFS> create();
  10. virtual bool initialize() override;
  11. virtual const char* class_name() const override;
  12. virtual InodeIdentifier root_inode() const override;
  13. virtual RetainPtr<Inode> create_inode(InodeIdentifier parentInode, const String& name, mode_t, unsigned size, int& error) override;
  14. virtual RetainPtr<Inode> create_directory(InodeIdentifier parentInode, const String& name, mode_t, int& error) override;
  15. virtual RetainPtr<Inode> get_inode(InodeIdentifier) const override;
  16. protected:
  17. typedef unsigned InodeIndex;
  18. InodeIndex generate_inode_index();
  19. static constexpr InodeIndex RootInodeIndex = 1;
  20. SynthFS();
  21. Retained<SynthFSInode> create_directory(String&& name);
  22. Retained<SynthFSInode> create_text_file(String&& name, ByteBuffer&&, mode_t = 0010644);
  23. Retained<SynthFSInode> create_generated_file(String&& name, Function<ByteBuffer(SynthFSInode&)>&&, mode_t = 0100644);
  24. Retained<SynthFSInode> create_generated_file(String&& name, Function<ByteBuffer(SynthFSInode&)>&&, Function<ssize_t(SynthFSInode&, const ByteBuffer&)>&&, mode_t = 0100644);
  25. InodeIdentifier add_file(RetainPtr<SynthFSInode>&&, InodeIndex parent = RootInodeIndex);
  26. bool remove_file(InodeIndex);
  27. private:
  28. InodeIndex m_next_inode_index { 2 };
  29. HashMap<InodeIndex, RetainPtr<SynthFSInode>> m_inodes;
  30. mutable Lock m_lock;
  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, byte* buffer, FileDescriptor*) 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(const String& name) override;
  49. virtual String reverse_lookup(InodeIdentifier) override;
  50. virtual void flush_metadata() override;
  51. virtual ssize_t write_bytes(off_t, ssize_t, const byte* buffer, FileDescriptor*) override;
  52. virtual bool add_child(InodeIdentifier child_id, const String& name, byte file_type, int& error) override;
  53. virtual bool remove_child(const String& name, int& error) override;
  54. virtual RetainPtr<Inode> parent() const override;
  55. virtual size_t directory_entry_count() const override;
  56. virtual KResult chmod(mode_t) override;
  57. virtual KResult chown(uid_t, gid_t) override;
  58. SynthFS& fs();
  59. const SynthFS& fs() const;
  60. SynthFSInode(SynthFS&, unsigned index);
  61. String m_name;
  62. InodeIdentifier m_parent;
  63. ByteBuffer m_data;
  64. Function<ByteBuffer(SynthFSInode&)> m_generator;
  65. Function<ssize_t(SynthFSInode&, const ByteBuffer&)> m_write_callback;
  66. Vector<SynthFSInode*> m_children;
  67. InodeMetadata m_metadata;
  68. OwnPtr<SynthFSInodeCustomData> m_custom_data;
  69. };
  70. inline SynthFS& SynthFSInode::fs()
  71. {
  72. return static_cast<SynthFS&>(Inode::fs());
  73. }
  74. inline const SynthFS& SynthFSInode::fs() const
  75. {
  76. return static_cast<const SynthFS&>(Inode::fs());
  77. }