/* * Copyright (c) 2018-2021, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include namespace Kernel { class MasterPTY; class SlavePTY final : public TTY { public: virtual bool unref() const override; virtual ~SlavePTY() override; void on_master_write(UserOrKernelBuffer const&, size_t); unsigned index() const { return m_index; } UnixDateTime time_of_last_write() const { return m_time_of_last_write; } virtual FileBlockerSet& blocker_set() override; private: // ^Device virtual bool is_openable_by_jailed_processes() const override { return true; } // ^TTY virtual ErrorOr> pseudo_name() const override; virtual ErrorOr on_tty_write(UserOrKernelBuffer const&, size_t) override; virtual void echo(u8) override; // ^CharacterDevice virtual bool can_read(OpenFileDescription const&, u64) const override; virtual ErrorOr read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override; virtual bool can_write(OpenFileDescription const&, u64) const override; virtual StringView class_name() const override { return "SlavePTY"sv; } virtual ErrorOr close() override; friend class MasterPTY; SlavePTY(NonnullRefPtr, unsigned index); NonnullRefPtr const m_master; UnixDateTime m_time_of_last_write {}; unsigned m_index { 0 }; mutable IntrusiveListNode m_list_node; public: using List = IntrusiveList<&SlavePTY::m_list_node>; static SpinlockProtected& all_instances(); }; }