SlavePTY.h 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. /*
  2. * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <Kernel/FileSystem/InodeIdentifier.h>
  8. #include <Kernel/TTY/TTY.h>
  9. namespace Kernel {
  10. class MasterPTY;
  11. class SlavePTY final : public TTY {
  12. public:
  13. virtual bool unref() const override;
  14. virtual ~SlavePTY() override;
  15. void on_master_write(const UserOrKernelBuffer&, size_t);
  16. unsigned index() const { return m_index; }
  17. time_t time_of_last_write() const { return m_time_of_last_write; }
  18. virtual FileBlockerSet& blocker_set() override;
  19. private:
  20. // ^TTY
  21. virtual String const& tty_name() const override;
  22. virtual KResultOr<size_t> on_tty_write(const UserOrKernelBuffer&, size_t) override;
  23. virtual void echo(u8) override;
  24. // ^CharacterDevice
  25. virtual bool can_read(const FileDescription&, size_t) const override;
  26. virtual KResultOr<size_t> read(FileDescription&, u64, UserOrKernelBuffer&, size_t) override;
  27. virtual bool can_write(const FileDescription&, size_t) const override;
  28. virtual StringView class_name() const override { return "SlavePTY"; }
  29. virtual KResult close() override;
  30. // ^Device
  31. virtual String device_name() const override;
  32. friend class MasterPTY;
  33. SlavePTY(MasterPTY&, unsigned index);
  34. RefPtr<MasterPTY> m_master;
  35. time_t m_time_of_last_write { 0 };
  36. unsigned m_index { 0 };
  37. String m_tty_name;
  38. mutable IntrusiveListNode<SlavePTY> m_list_node;
  39. public:
  40. using List = IntrusiveList<SlavePTY, RawPtr<SlavePTY>, &SlavePTY::m_list_node>;
  41. static SpinlockProtected<SlavePTY::List>& all_instances();
  42. };
  43. }