doc1.txt 853 B

12345678910111213141516171819202122232425262728293031323334353637
  1. static struct termios told;
  2. struct termios tnew;
  3. mch_tcgetattr(read_cmd_fd, &told);
  4. tnew = told;
  5. if (tmode == TMODE_RAW)
  6. {
  7. tnew.c_iflag &= ~(ICRNL | (T_XON == NULL || *T_XON == NUL ? IXON : 0));
  8. tnew.c_lflag &= ~(ICANON | ECHO | ISIG | ECHOE | IEXTEN);
  9. //
  10. tnew.c_oflag &= ~(ONLCR | XTABS);
  11. tnew.c_oflag &= ~(ONLCR | TAB3);
  12. tnew.c_oflag &= ~ONLCR;
  13. //
  14. tnew.c_cc[VMIN] = 1; // return after 1 char
  15. tnew.c_cc[VTIME] = 0; // don't wait
  16. }
  17. else if (tmode == TMODE_SLEEP)
  18. {
  19. tnew.c_lflag &= ~(ICANON | ECHO);
  20. tnew.c_cc[VMIN] = 1; // return after 1 char
  21. tnew.c_cc[VTIME] = 0; // don't wait
  22. }
  23. {
  24. int n = 10;
  25. // A signal may cause tcsetattr() to fail (e.g., SIGCONT). Retry a
  26. // few times.
  27. while (tcsetattr(read_cmd_fd, TCSANOW, &tnew) == -1
  28. && errno == EINTR && n > 0)
  29. --n;
  30. }