#pragma once #include #include namespace Kernel { class Pipe : public Inode { public: static BAN::ErrorOr> create(const Credentials&); virtual bool is_pipe() const override { return true; } void clone_writing(); void close_writing(); virtual ino_t ino() const override { return 0; } // FIXME virtual Mode mode() const override { return { Mode::IFIFO | Mode::IRUSR | Mode::IWUSR }; } virtual nlink_t nlink() const override { return 1; } virtual uid_t uid() const override { return m_uid; } virtual gid_t gid() const override { return m_gid; } virtual off_t size() const override { return 0; } virtual timespec atime() const override { return m_atime; } virtual timespec mtime() const override { return m_mtime; } virtual timespec ctime() const override { return m_ctime; } virtual blksize_t blksize() const override { return 4096; } virtual blkcnt_t blocks() const override { return 0; } virtual dev_t dev() const override { return 0; } // FIXME virtual dev_t rdev() const override { return 0; } // FIXME protected: virtual BAN::ErrorOr read_impl(off_t, BAN::ByteSpan) override; virtual BAN::ErrorOr write_impl(off_t, BAN::ConstByteSpan) override; virtual bool can_read_impl() const override { return !m_buffer.empty(); } virtual bool can_write_impl() const override { return true; } virtual bool has_error_impl() const override { return false; } private: Pipe(const Credentials&); private: const uid_t m_uid; const gid_t m_gid; timespec m_atime {}; timespec m_mtime {}; timespec m_ctime {}; BAN::Vector m_buffer; Semaphore m_semaphore; uint32_t m_writing_count { 1 }; }; }