| #include <unistd.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <termios.h> |
| |
| /* Use this variable to remember original terminal attributes. */ |
| |
| struct termios saved_attributes; |
| |
| void |
| reset_input_mode (void) |
| { |
| tcsetattr (STDIN_FILENO, TCSANOW, &saved_attributes); |
| } |
| |
| void |
| set_input_mode (void) |
| { |
| struct termios tattr; |
| char *name; |
| |
| /* Make sure stdin is a terminal. */ |
| if (!isatty (STDIN_FILENO)) |
| { |
| fprintf (stderr, "Not a terminal.\n"); |
| exit (EXIT_FAILURE); |
| } |
| |
| /* Save the terminal attributes so we can restore them later. */ |
| tcgetattr (STDIN_FILENO, &saved_attributes); |
| atexit (reset_input_mode); |
| |
| /*@group*/ |
| /* Set the funny terminal modes. */ |
| tcgetattr (STDIN_FILENO, &tattr); |
| tattr.c_lflag &= ~(ICANON|ECHO); /* Clear ICANON and ECHO. */ |
| tattr.c_cc[VMIN] = 1; |
| tattr.c_cc[VTIME] = 0; |
| tcsetattr (STDIN_FILENO, TCSAFLUSH, &tattr); |
| } |
| /*@end group*/ |
| |
| int |
| main (void) |
| { |
| char c; |
| |
| set_input_mode (); |
| |
| while (1) |
| { |
| read (STDIN_FILENO, &c, 1); |
| if (c == '\004') /* @kbd{C-d} */ |
| break; |
| else |
| putchar (c); |
| } |
| |
| return EXIT_SUCCESS; |
| } |