summaryrefslogtreecommitdiff
path: root/manual/examples/termios.c
diff options
context:
space:
mode:
Diffstat (limited to 'manual/examples/termios.c')
-rw-r--r--manual/examples/termios.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/manual/examples/termios.c b/manual/examples/termios.c
new file mode 100644
index 0000000000..6db5990a0c
--- /dev/null
+++ b/manual/examples/termios.c
@@ -0,0 +1,60 @@
+#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;
+}