#pragma once #include "fs/VFS.h" #include #include class MasterPTY; class SlavePTY : public VFS::DeviceInode { public: SlavePTY() = default; VFS::InodeType type() const override { return VFS::InodeType::CharacterDevice; } Result query_shared_memory(off_t, usize) override { return err(ENOTSUP); } VFS::FileSystem* fs() const override { return nullptr; } Result read(u8* buf, usize offset, usize length) const override; Result write(const u8* buf, usize offset, usize length) override; Result ioctl(int request, void* arg) override; Result isatty() const override { return 1; } Result truncate(usize) override { // POSIX says truncate is for regular files, but doesn't tell us what error to return for non-regular files. return err(EINVAL); } bool will_block_if_read() const override { return m_buffer.is_empty(); } void did_link() override { m_metadata.nlinks++; } void did_unlink() override { m_metadata.nlinks--; } virtual ~SlavePTY() = default; private: mutable Buffer m_buffer; MasterPTY* m_master; String m_name; friend class MasterPTY; };