1/* Noncanonical Mode Example
2 Copyright (C) 1991-2024 Free Software Foundation, Inc.
3
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, see <https://www.gnu.org/licenses/>.
16*/
17
18#include <unistd.h>
19#include <stdio.h>
20#include <stdlib.h>
21#include <termios.h>
22
23/* Use this variable to remember original terminal attributes. */
24
25struct termios saved_attributes;
26
27void
28reset_input_mode (void)
29{
30 tcsetattr (STDIN_FILENO, TCSANOW, &saved_attributes);
31}
32
33void
34set_input_mode (void)
35{
36 struct termios tattr;
37
38 /* Make sure stdin is a terminal. */
39 if (!isatty (STDIN_FILENO))
40 {
41 fprintf (stderr, "Not a terminal.\n");
42 exit (EXIT_FAILURE);
43 }
44
45 /* Save the terminal attributes so we can restore them later. */
46 tcgetattr (STDIN_FILENO, termios_p: &saved_attributes);
47 atexit (func: reset_input_mode);
48
49/*@group*/
50 /* Set the funny terminal modes. */
51 tcgetattr (STDIN_FILENO, termios_p: &tattr);
52 tattr.c_lflag &= ~(ICANON|ECHO); /* Clear ICANON and ECHO. */
53 tattr.c_cc[VMIN] = 1;
54 tattr.c_cc[VTIME] = 0;
55 tcsetattr (STDIN_FILENO, TCSAFLUSH, &tattr);
56}
57/*@end group*/
58
59int
60main (void)
61{
62 char c;
63
64 set_input_mode ();
65
66 while (1)
67 {
68 read (STDIN_FILENO, &c, 1);
69 if (c == '\004') /* @kbd{C-d} */
70 break;
71 else
72 write (STDOUT_FILENO, &c, 1);
73 }
74
75 return EXIT_SUCCESS;
76}
77

source code of glibc/manual/examples/termios.c