| /* | |
| * Unix test code that puts the terminal into raw mode, then echos typed | |
| * characters to stdout. Derived from sample code in the Stevens book, posted | |
| * online at http://www.lafn.org/~dave/linux/terminalIO.html. | |
| */ | |
| static struct termios save_termios; | |
| static int term_saved; | |
| /* RAW! mode */ | |
| int tty_raw(int fd) | |
| { | |
| struct termios buf; | |
| if (tcgetattr(fd, &save_termios) < 0) /* get the original state */ | |
| return -1; | |
| buf = save_termios; | |
| /* echo off, canonical mode off, extended input | |
| processing off, signal chars off */ | |
| buf.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG); | |
| /* no SIGINT on BREAK, CR-to-NL off, input parity | |
| check off, don't strip the 8th bit on input, | |
| ouput flow control off */ | |
| buf.c_iflag &= ~(BRKINT | ICRNL | ISTRIP | IXON); | |
| /* clear size bits, parity checking off */ | |
| buf.c_cflag &= ~(CSIZE | PARENB); | |
| /* set 8 bits/char */ | |
| buf.c_cflag |= CS8; | |
| /* output processing off */ | |
| buf.c_oflag &= ~(OPOST); | |
| buf.c_cc[VMIN] = 1; /* 1 byte at a time */ | |
| buf.c_cc[VTIME] = 0; /* no timer on input */ | |
| if (tcsetattr(fd, TCSAFLUSH, &buf) < 0) | |
| return -1; | |
| term_saved = 1; | |
| return 0; | |
| } | |
| /* set it to normal! */ | |
| int tty_reset(int fd) | |
| { | |
| if (term_saved) | |
| if (tcsetattr(fd, TCSAFLUSH, &save_termios) < 0) | |
| return -1; | |
| return 0; | |
| } | |
| int main() | |
| { | |
| tty_raw(0); | |
| int count = 0; | |
| while (true) { | |
| char ch; | |
| char buf[16]; | |
| int actual = read(0, &ch, 1); | |
| if (actual != 1) { | |
| perror("read error"); | |
| break; | |
| } | |
| formatChar(buf, ch); | |
| fputs(buf, stdout); | |
| fflush(stdout); | |
| if (ch == 3) // Ctrl-C | |
| break; | |
| } | |
| tty_reset(0); | |
| return 0; | |
| } | |