#pragma once #include "fs/ext2/FileSystem.h" #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::FileInode { public: VFS::InodeType type() const override { return m_type; } usize size() const override { // FIXME: If EXT2_REVISION >= 1.0, use size_high as well. return m_raw_inode.size_low; } 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); } Inode(Badge, FileSystem* fs); virtual ~Inode() = default; private: VFS::InodeType m_type; RawInode m_raw_inode; FileSystem* m_fs; ino_t m_inum; friend class FileSystem; }; }