SlavePTY.cpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #include "SlavePTY.h"
  2. #include "MasterPTY.h"
  3. #include <Kernel/FileSystem/DevPtsFS.h>
  4. #include <Kernel/Process.h>
  5. //#define SLAVEPTY_DEBUG
  6. SlavePTY::SlavePTY(MasterPTY& master, unsigned index)
  7. : TTY(11, index)
  8. , m_master(master)
  9. , m_index(index)
  10. {
  11. m_tty_name = String::format("/dev/pts/%u", m_index);
  12. set_uid(current->process().uid());
  13. set_gid(current->process().gid());
  14. DevPtsFS::register_slave_pty(*this);
  15. set_size(80, 25);
  16. }
  17. SlavePTY::~SlavePTY()
  18. {
  19. #ifdef SLAVEPTY_DEBUG
  20. dbgprintf("~SlavePTY(%u)\n", m_index);
  21. #endif
  22. DevPtsFS::unregister_slave_pty(*this);
  23. }
  24. String SlavePTY::tty_name() const
  25. {
  26. return m_tty_name;
  27. }
  28. void SlavePTY::on_master_write(const u8* buffer, ssize_t size)
  29. {
  30. for (ssize_t i = 0; i < size; ++i)
  31. emit(buffer[i]);
  32. }
  33. ssize_t SlavePTY::on_tty_write(const u8* data, ssize_t size)
  34. {
  35. return m_master->on_slave_write(data, size);
  36. }
  37. bool SlavePTY::can_write(FileDescription&) const
  38. {
  39. return m_master->can_write_from_slave();
  40. }
  41. bool SlavePTY::can_read(FileDescription& description) const
  42. {
  43. if (m_master->is_closed())
  44. return true;
  45. return TTY::can_read(description);
  46. }
  47. ssize_t SlavePTY::read(FileDescription& description, u8* buffer, ssize_t size)
  48. {
  49. if (m_master->is_closed())
  50. return 0;
  51. return TTY::read(description, buffer, size);
  52. }
  53. void SlavePTY::close()
  54. {
  55. m_master->notify_slave_closed({});
  56. }