TTY.cpp 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #include "TTY.h"
  2. #include "Process.h"
  3. #include <LibC/signal_numbers.h>
  4. TTY::TTY(unsigned major, unsigned minor)
  5. : CharacterDevice(major, minor)
  6. {
  7. memset(&m_termios, 0, sizeof(m_termios));
  8. m_termios.c_lflag |= ISIG | ECHO;
  9. }
  10. TTY::~TTY()
  11. {
  12. }
  13. ssize_t TTY::read(byte* buffer, size_t size)
  14. {
  15. ssize_t nread = min(m_buffer.size(), size);
  16. memcpy(buffer, m_buffer.data(), nread);
  17. if (nread == (ssize_t)m_buffer.size())
  18. m_buffer.clear();
  19. else {
  20. dbgprintf("had %u, read %u\n", m_buffer.size(), nread);
  21. ASSERT_NOT_REACHED();
  22. }
  23. return nread;
  24. }
  25. ssize_t TTY::write(const byte* buffer, size_t size)
  26. {
  27. onTTYWrite(buffer, size);
  28. return 0;
  29. }
  30. bool TTY::hasDataAvailableForRead() const
  31. {
  32. return !m_buffer.isEmpty();
  33. }
  34. void TTY::emit(byte ch)
  35. {
  36. m_buffer.append(ch);
  37. }
  38. void TTY::interrupt()
  39. {
  40. if (!should_generate_signals())
  41. return;
  42. dbgprintf("%s: Interrupt ^C pressed!\n", ttyName().characters());
  43. if (pgid()) {
  44. dbgprintf("%s: Send SIGINT to everyone in pgrp %d\n", ttyName().characters(), pgid());
  45. InterruptDisabler disabler;
  46. Process::for_each_in_pgrp(pgid(), [this] (auto& process) {
  47. dbgprintf("%s: Send SIGINT to %d\n", ttyName().characters(), process.pid());
  48. process.send_signal(SIGINT, nullptr);
  49. return true;
  50. });
  51. }
  52. }