#pragma once #include #include namespace Kernel { class Device : public TmpInode { public: virtual ~Device() = default; virtual void update() {} virtual BAN::ErrorOr> mmap_region(PageTable&, off_t offset, size_t len, AddressRange, MemoryRegion::Type, PageTable::flags_t, int status_flags) { (void)offset; (void)len; (void)status_flags; return BAN::Error::from_errno(ENOTSUP); } virtual BAN::StringView name() const = 0; protected: Device(mode_t, uid_t, gid_t); private: BAN::ErrorOr sync_inode(SyncType) final override { return {}; } BAN::ErrorOr sync_data() final override { return {}; } }; class BlockDevice : public Device, public BAN::Weakable { 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 BAN::ErrorOr sync_blocks(uint64_t block, size_t block_count) = 0; virtual blksize_t blksize() const = 0; protected: BlockDevice(mode_t mode, uid_t uid, gid_t gid) : Device(mode, uid, gid) { m_mode |= Inode::Mode::IFBLK; } }; class CharacterDevice : public Device { protected: CharacterDevice(mode_t mode, uid_t uid, gid_t gid) : Device(mode, uid, gid) { m_mode |= Inode::Mode::IFCHR; } }; }