#pragma once #include "fs/VFS.h" #include #include #include #include #include namespace TmpFS { class FileSystem : public VFS::FileSystem { public: SharedPtr root_inode() const override { return m_root_inode; } Result> create_file_inode() override; Result> create_dir_inode(SharedPtr parent) override; static Result> create(); virtual ~FileSystem() = default; private: FileSystem() = default; void set_root(SharedPtr root); SharedPtr m_root_inode; Vector> m_inodes; Atomic m_next_inode_number { 2 }; }; class FileInode : public VFS::FileInode { public: FileInode() = default; void set_fs(FileSystem& fs, Badge) { m_fs = &fs; } void set_inode_number(usize inum, Badge) { m_inode_number = inum; } VFS::FileSystem& fs() const override { return *m_fs; } usize inode_number() const override { return m_inode_number; } Result read(u8*, usize, usize) const override; Result write(const u8*, usize, usize) override; Result truncate(usize size) override; virtual ~FileInode() = default; private: VFS::FileSystem* m_fs; Buffer m_data_buffer; usize m_inode_number; }; class DirInode : public VFS::Inode { public: DirInode() = default; void set_fs(FileSystem& fs, Badge) { m_fs = &fs; } void set_inode_number(usize inum, Badge) { m_inode_number = inum; } void set_self(SharedPtr self, Badge) { m_self = self; } Result> find(const char* name) const override; Result read(u8*, usize, usize) const override { return err(EISDIR); } Result write(const u8*, usize, usize) override { return err(EISDIR); } Result truncate(usize) override { return err(EISDIR); } VFS::FileSystem& fs() const override { return *m_fs; } usize inode_number() const override { return m_inode_number; } VFS::InodeType type() const override { return VFS::InodeType::Directory; } Result> create_file(const char* name) override; Result> create_subdirectory(const char* name) override; Result add_entry(SharedPtr inode, const char* name); virtual ~DirInode() = default; private: VFS::FileSystem* m_fs; usize m_inode_number; SharedPtr m_self; struct Entry { SharedPtr inode; StaticString<128> name; }; Vector m_entries; }; }