#pragma once #include namespace Kernel { class Device : public TmpInode { public: virtual ~Device() = default; virtual void update() {} virtual bool is_device() const override { return true; } virtual bool is_partition() const { return false; } virtual bool is_storage_device() const { return false; } virtual dev_t rdev() const override = 0; virtual BAN::StringView name() const = 0; protected: Device(mode_t, uid_t, gid_t); }; class BlockDevice : public Device { public: virtual BAN::ErrorOr read_blocks(uint64_t first_block, size_t block_count, BAN::ByteSpan) = 0; virtual BAN::ErrorOr write_blocks(uint64_t first_block, size_t block_count, BAN::ConstByteSpan) = 0; virtual blksize_t blksize() const = 0; protected: BlockDevice(mode_t mode, uid_t uid, gid_t gid) : Device(mode, uid, gid) { m_inode_info.mode |= Inode::Mode::IFBLK; } }; class CharacterDevice : public Device { protected: CharacterDevice(mode_t mode, uid_t uid, gid_t gid) : Device(mode, uid, gid) { m_inode_info.mode |= Inode::Mode::IFCHR; } }; }