#pragma once #include "fs/ext2/FileSystem.h" #include #define EXT2_FIFO 0x1000 #define EXT2_CHR 0x2000 #define EXT2_DIR 0x4000 #define EXT2_BLK 0x6000 #define EXT2_REG 0x8000 #define EXT2_LNK 0xA000 #define EXT2_SOCK 0xC000 namespace Ext2 { class Inode : public VFS::Inode { public: VFS::InodeType type() const override { return m_type; } usize size() const override; mode_t mode() const override { return m_raw_inode.mode & 07777; } nlink_t nlinks() const override { return m_raw_inode.nlinks; } u32 uid() const override { return m_raw_inode.uid; } u32 gid() const override { return m_raw_inode.gid; } usize inode_number() const override { return m_inum; } VFS::FileSystem* fs() const override { return m_fs; } void did_link() override { } void did_unlink() override { } Result chmod(mode_t) override { return err(EROFS); } Result chown(u32, u32) override { return err(EROFS); } Result read(u8* buf, usize offset, usize length) const override; Result write(const u8*, usize, usize) override { return err(EROFS); } Result truncate(usize) override { return err(EROFS); } Result> find(const char*) const override; Option get(usize) const override; Result> create_file(const char*) override { if (m_type != VFS::InodeType::Directory) return err(ENOTDIR); return err(EROFS); } Result> create_subdirectory(const char*) override { if (m_type != VFS::InodeType::Directory) return err(ENOTDIR); return err(EROFS); } Result add_entry(SharedPtr, const char*) override { if (m_type != VFS::InodeType::Directory) return err(ENOTDIR); return err(EROFS); } Result replace_entry(SharedPtr, const char*) override; Result remove_entry(const char*) override { if (m_type != VFS::InodeType::Directory) return err(ENOTDIR); return err(EROFS); } usize entries() const override { return m_entries.size(); } bool blocking() const override { return false; } Result readlink() override; Result lazy_initialize_dir() const; // FIXME: Implement readlink() and device numbers. Inode(Badge, FileSystem* fs); virtual ~Inode() = default; private: VFS::InodeType m_type; RawInode m_raw_inode; FileSystem* m_fs; ino_t m_inum; String m_link; mutable Vector m_entries; mutable bool m_dir_already_lazily_initialized { false }; usize find_block(usize index) const; friend class FileSystem; }; }