Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/bash/src/lib/sh/shtty.c |
Source code | Switch to Preprocessed file |
Line | Source | Count | ||||||
---|---|---|---|---|---|---|---|---|
1 | /* | - | ||||||
2 | * shtty.c -- abstract interface to the terminal, focusing on capabilities. | - | ||||||
3 | */ | - | ||||||
4 | - | |||||||
5 | /* Copyright (C) 1999 Free Software Foundation, Inc. | - | ||||||
6 | - | |||||||
7 | This file is part of GNU Bash, the Bourne Again SHell. | - | ||||||
8 | - | |||||||
9 | Bash is free software: you can redistribute it and/or modify | - | ||||||
10 | it under the terms of the GNU General Public License as published by | - | ||||||
11 | the Free Software Foundation, either version 3 of the License, or | - | ||||||
12 | (at your option) any later version. | - | ||||||
13 | - | |||||||
14 | Bash is distributed in the hope that it will be useful, | - | ||||||
15 | but WITHOUT ANY WARRANTY; without even the implied warranty of | - | ||||||
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | - | ||||||
17 | GNU General Public License for more details. | - | ||||||
18 | - | |||||||
19 | You should have received a copy of the GNU General Public License | - | ||||||
20 | along with Bash. If not, see <http://www.gnu.org/licenses/>. | - | ||||||
21 | */ | - | ||||||
22 | - | |||||||
23 | #ifdef HAVE_CONFIG_H | - | ||||||
24 | # include <config.h> | - | ||||||
25 | #endif | - | ||||||
26 | - | |||||||
27 | #ifdef HAVE_UNISTD_H | - | ||||||
28 | # include <unistd.h> | - | ||||||
29 | #endif | - | ||||||
30 | - | |||||||
31 | #include <shtty.h> | - | ||||||
32 | - | |||||||
33 | static TTYSTRUCT ttin, ttout; | - | ||||||
34 | static int ttsaved = 0; | - | ||||||
35 | - | |||||||
36 | int | - | ||||||
37 | ttgetattr(fd, ttp) | - | ||||||
38 | int fd; | - | ||||||
39 | TTYSTRUCT *ttp; | - | ||||||
40 | { | - | ||||||
41 | #ifdef TERMIOS_TTY_DRIVER | - | ||||||
42 | return tcgetattr(fd, ttp); never executed: return tcgetattr(fd, ttp); | 0 | ||||||
43 | #else | - | ||||||
44 | # ifdef TERMIO_TTY_DRIVER | - | ||||||
45 | return ioctl(fd, TCGETA, ttp); | - | ||||||
46 | # else | - | ||||||
47 | return ioctl(fd, TIOCGETP, ttp); | - | ||||||
48 | # endif | - | ||||||
49 | #endif | - | ||||||
50 | } | - | ||||||
51 | - | |||||||
52 | int | - | ||||||
53 | ttsetattr(fd, ttp) | - | ||||||
54 | int fd; | - | ||||||
55 | TTYSTRUCT *ttp; | - | ||||||
56 | { | - | ||||||
57 | #ifdef TERMIOS_TTY_DRIVER | - | ||||||
58 | return tcsetattr(fd, TCSADRAIN, ttp); never executed: return tcsetattr(fd, 1 , ttp); | 0 | ||||||
59 | #else | - | ||||||
60 | # ifdef TERMIO_TTY_DRIVER | - | ||||||
61 | return ioctl(fd, TCSETAW, ttp); | - | ||||||
62 | # else | - | ||||||
63 | return ioctl(fd, TIOCSETN, ttp); | - | ||||||
64 | # endif | - | ||||||
65 | #endif | - | ||||||
66 | } | - | ||||||
67 | - | |||||||
68 | void | - | ||||||
69 | ttsave() | - | ||||||
70 | { | - | ||||||
71 | if (ttsaved)
| 0 | ||||||
72 | return; never executed: return; | 0 | ||||||
73 | ttgetattr (0, &ttin); | - | ||||||
74 | ttgetattr (1, &ttout); | - | ||||||
75 | ttsaved = 1; | - | ||||||
76 | } never executed: end of block | 0 | ||||||
77 | - | |||||||
78 | void | - | ||||||
79 | ttrestore() | - | ||||||
80 | { | - | ||||||
81 | if (ttsaved == 0)
| 0 | ||||||
82 | return; never executed: return; | 0 | ||||||
83 | ttsetattr (0, &ttin); | - | ||||||
84 | ttsetattr (1, &ttout); | - | ||||||
85 | ttsaved = 0; | - | ||||||
86 | } never executed: end of block | 0 | ||||||
87 | - | |||||||
88 | /* Retrieve the internally-saved attributes associated with tty fd FD. */ | - | ||||||
89 | TTYSTRUCT * | - | ||||||
90 | ttattr (fd) | - | ||||||
91 | int fd; | - | ||||||
92 | { | - | ||||||
93 | if (ttsaved == 0)
| 0 | ||||||
94 | return ((TTYSTRUCT *)0); never executed: return ((struct termios *)0); | 0 | ||||||
95 | if (fd == 0)
| 0 | ||||||
96 | return &ttin; never executed: return &ttin; | 0 | ||||||
97 | else if (fd == 1)
| 0 | ||||||
98 | return &ttout; never executed: return &ttout; | 0 | ||||||
99 | else | - | ||||||
100 | return ((TTYSTRUCT *)0); never executed: return ((struct termios *)0); | 0 | ||||||
101 | } | - | ||||||
102 | - | |||||||
103 | /* | - | ||||||
104 | * Change attributes in ttp so that when it is installed using | - | ||||||
105 | * ttsetattr, the terminal will be in one-char-at-a-time mode. | - | ||||||
106 | */ | - | ||||||
107 | int | - | ||||||
108 | tt_setonechar(ttp) | - | ||||||
109 | TTYSTRUCT *ttp; | - | ||||||
110 | { | - | ||||||
111 | #if defined (TERMIOS_TTY_DRIVER) || defined (TERMIO_TTY_DRIVER) | - | ||||||
112 | - | |||||||
113 | /* XXX - might not want this -- it disables erase and kill processing. */ | - | ||||||
114 | ttp->c_lflag &= ~ICANON; | - | ||||||
115 | - | |||||||
116 | ttp->c_lflag |= ISIG; | - | ||||||
117 | # ifdef IEXTEN | - | ||||||
118 | ttp->c_lflag |= IEXTEN; | - | ||||||
119 | # endif | - | ||||||
120 | - | |||||||
121 | ttp->c_iflag |= ICRNL; /* make sure we get CR->NL on input */ | - | ||||||
122 | ttp->c_iflag &= ~INLCR; /* but no NL->CR */ | - | ||||||
123 | - | |||||||
124 | # ifdef OPOST | - | ||||||
125 | ttp->c_oflag |= OPOST; | - | ||||||
126 | # endif | - | ||||||
127 | # ifdef ONLCR | - | ||||||
128 | ttp->c_oflag |= ONLCR; | - | ||||||
129 | # endif | - | ||||||
130 | # ifdef OCRNL | - | ||||||
131 | ttp->c_oflag &= ~OCRNL; | - | ||||||
132 | # endif | - | ||||||
133 | # ifdef ONOCR | - | ||||||
134 | ttp->c_oflag &= ~ONOCR; | - | ||||||
135 | # endif | - | ||||||
136 | # ifdef ONLRET | - | ||||||
137 | ttp->c_oflag &= ~ONLRET; | - | ||||||
138 | # endif | - | ||||||
139 | - | |||||||
140 | ttp->c_cc[VMIN] = 1; | - | ||||||
141 | ttp->c_cc[VTIME] = 0; | - | ||||||
142 | - | |||||||
143 | #else | - | ||||||
144 | - | |||||||
145 | ttp->sg_flags |= CBREAK; | - | ||||||
146 | - | |||||||
147 | #endif | - | ||||||
148 | - | |||||||
149 | return 0; never executed: return 0; | 0 | ||||||
150 | } | - | ||||||
151 | - | |||||||
152 | /* Set the tty associated with FD and TTP into one-character-at-a-time mode */ | - | ||||||
153 | int | - | ||||||
154 | ttfd_onechar (fd, ttp) | - | ||||||
155 | int fd; | - | ||||||
156 | TTYSTRUCT *ttp; | - | ||||||
157 | { | - | ||||||
158 | if (tt_setonechar(ttp) < 0)
| 0 | ||||||
159 | return -1; never executed: return -1; | 0 | ||||||
160 | return (ttsetattr (fd, ttp)); never executed: return (ttsetattr (fd, ttp)); | 0 | ||||||
161 | } | - | ||||||
162 | - | |||||||
163 | /* Set the terminal into one-character-at-a-time mode */ | - | ||||||
164 | int | - | ||||||
165 | ttonechar () | - | ||||||
166 | { | - | ||||||
167 | TTYSTRUCT tt; | - | ||||||
168 | - | |||||||
169 | if (ttsaved == 0)
| 0 | ||||||
170 | return -1; never executed: return -1; | 0 | ||||||
171 | tt = ttin; | - | ||||||
172 | return (ttfd_onechar (0, &tt)); never executed: return (ttfd_onechar (0, &tt)); | 0 | ||||||
173 | } | - | ||||||
174 | - | |||||||
175 | /* | - | ||||||
176 | * Change attributes in ttp so that when it is installed using | - | ||||||
177 | * ttsetattr, the terminal will be in no-echo mode. | - | ||||||
178 | */ | - | ||||||
179 | int | - | ||||||
180 | tt_setnoecho(ttp) | - | ||||||
181 | TTYSTRUCT *ttp; | - | ||||||
182 | { | - | ||||||
183 | #if defined (TERMIOS_TTY_DRIVER) || defined (TERMIO_TTY_DRIVER) | - | ||||||
184 | ttp->c_lflag &= ~(ECHO|ECHOK|ECHONL); | - | ||||||
185 | #else | - | ||||||
186 | ttp->sg_flags &= ~ECHO; | - | ||||||
187 | #endif | - | ||||||
188 | - | |||||||
189 | return 0; never executed: return 0; | 0 | ||||||
190 | } | - | ||||||
191 | - | |||||||
192 | /* Set the tty associated with FD and TTP into no-echo mode */ | - | ||||||
193 | int | - | ||||||
194 | ttfd_noecho (fd, ttp) | - | ||||||
195 | int fd; | - | ||||||
196 | TTYSTRUCT *ttp; | - | ||||||
197 | { | - | ||||||
198 | if (tt_setnoecho (ttp) < 0)
| 0 | ||||||
199 | return -1; never executed: return -1; | 0 | ||||||
200 | return (ttsetattr (fd, ttp)); never executed: return (ttsetattr (fd, ttp)); | 0 | ||||||
201 | } | - | ||||||
202 | - | |||||||
203 | /* Set the terminal into no-echo mode */ | - | ||||||
204 | int | - | ||||||
205 | ttnoecho () | - | ||||||
206 | { | - | ||||||
207 | TTYSTRUCT tt; | - | ||||||
208 | - | |||||||
209 | if (ttsaved == 0)
| 0 | ||||||
210 | return -1; never executed: return -1; | 0 | ||||||
211 | tt = ttin; | - | ||||||
212 | return (ttfd_noecho (0, &tt)); never executed: return (ttfd_noecho (0, &tt)); | 0 | ||||||
213 | } | - | ||||||
214 | - | |||||||
215 | /* | - | ||||||
216 | * Change attributes in ttp so that when it is installed using | - | ||||||
217 | * ttsetattr, the terminal will be in eight-bit mode (pass8). | - | ||||||
218 | */ | - | ||||||
219 | int | - | ||||||
220 | tt_seteightbit (ttp) | - | ||||||
221 | TTYSTRUCT *ttp; | - | ||||||
222 | { | - | ||||||
223 | #if defined (TERMIOS_TTY_DRIVER) || defined (TERMIO_TTY_DRIVER) | - | ||||||
224 | ttp->c_iflag &= ~ISTRIP; | - | ||||||
225 | ttp->c_cflag |= CS8; | - | ||||||
226 | ttp->c_cflag &= ~PARENB; | - | ||||||
227 | #else | - | ||||||
228 | ttp->sg_flags |= ANYP; | - | ||||||
229 | #endif | - | ||||||
230 | - | |||||||
231 | return 0; never executed: return 0; | 0 | ||||||
232 | } | - | ||||||
233 | - | |||||||
234 | /* Set the tty associated with FD and TTP into eight-bit mode */ | - | ||||||
235 | int | - | ||||||
236 | ttfd_eightbit (fd, ttp) | - | ||||||
237 | int fd; | - | ||||||
238 | TTYSTRUCT *ttp; | - | ||||||
239 | { | - | ||||||
240 | if (tt_seteightbit (ttp) < 0)
| 0 | ||||||
241 | return -1; never executed: return -1; | 0 | ||||||
242 | return (ttsetattr (fd, ttp)); never executed: return (ttsetattr (fd, ttp)); | 0 | ||||||
243 | } | - | ||||||
244 | - | |||||||
245 | /* Set the terminal into eight-bit mode */ | - | ||||||
246 | int | - | ||||||
247 | tteightbit () | - | ||||||
248 | { | - | ||||||
249 | TTYSTRUCT tt; | - | ||||||
250 | - | |||||||
251 | if (ttsaved == 0)
| 0 | ||||||
252 | return -1; never executed: return -1; | 0 | ||||||
253 | tt = ttin; | - | ||||||
254 | return (ttfd_eightbit (0, &tt)); never executed: return (ttfd_eightbit (0, &tt)); | 0 | ||||||
255 | } | - | ||||||
256 | - | |||||||
257 | /* | - | ||||||
258 | * Change attributes in ttp so that when it is installed using | - | ||||||
259 | * ttsetattr, the terminal will be in non-canonical input mode. | - | ||||||
260 | */ | - | ||||||
261 | int | - | ||||||
262 | tt_setnocanon (ttp) | - | ||||||
263 | TTYSTRUCT *ttp; | - | ||||||
264 | { | - | ||||||
265 | #if defined (TERMIOS_TTY_DRIVER) || defined (TERMIO_TTY_DRIVER) | - | ||||||
266 | ttp->c_lflag &= ~ICANON; | - | ||||||
267 | #endif | - | ||||||
268 | - | |||||||
269 | return 0; never executed: return 0; | 0 | ||||||
270 | } | - | ||||||
271 | - | |||||||
272 | /* Set the tty associated with FD and TTP into non-canonical mode */ | - | ||||||
273 | int | - | ||||||
274 | ttfd_nocanon (fd, ttp) | - | ||||||
275 | int fd; | - | ||||||
276 | TTYSTRUCT *ttp; | - | ||||||
277 | { | - | ||||||
278 | if (tt_setnocanon (ttp) < 0)
| 0 | ||||||
279 | return -1; never executed: return -1; | 0 | ||||||
280 | return (ttsetattr (fd, ttp)); never executed: return (ttsetattr (fd, ttp)); | 0 | ||||||
281 | } | - | ||||||
282 | - | |||||||
283 | /* Set the terminal into non-canonical mode */ | - | ||||||
284 | int | - | ||||||
285 | ttnocanon () | - | ||||||
286 | { | - | ||||||
287 | TTYSTRUCT tt; | - | ||||||
288 | - | |||||||
289 | if (ttsaved == 0)
| 0 | ||||||
290 | return -1; never executed: return -1; | 0 | ||||||
291 | tt = ttin; | - | ||||||
292 | return (ttfd_nocanon (0, &tt)); never executed: return (ttfd_nocanon (0, &tt)); | 0 | ||||||
293 | } | - | ||||||
294 | - | |||||||
295 | /* | - | ||||||
296 | * Change attributes in ttp so that when it is installed using | - | ||||||
297 | * ttsetattr, the terminal will be in cbreak, no-echo mode. | - | ||||||
298 | */ | - | ||||||
299 | int | - | ||||||
300 | tt_setcbreak(ttp) | - | ||||||
301 | TTYSTRUCT *ttp; | - | ||||||
302 | { | - | ||||||
303 | if (tt_setonechar (ttp) < 0)
| 0 | ||||||
304 | return -1; never executed: return -1; | 0 | ||||||
305 | return (tt_setnoecho (ttp)); never executed: return (tt_setnoecho (ttp)); | 0 | ||||||
306 | } | - | ||||||
307 | - | |||||||
308 | /* Set the tty associated with FD and TTP into cbreak (no-echo, | - | ||||||
309 | one-character-at-a-time) mode */ | - | ||||||
310 | int | - | ||||||
311 | ttfd_cbreak (fd, ttp) | - | ||||||
312 | int fd; | - | ||||||
313 | TTYSTRUCT *ttp; | - | ||||||
314 | { | - | ||||||
315 | if (tt_setcbreak (ttp) < 0)
| 0 | ||||||
316 | return -1; never executed: return -1; | 0 | ||||||
317 | return (ttsetattr (fd, ttp)); never executed: return (ttsetattr (fd, ttp)); | 0 | ||||||
318 | } | - | ||||||
319 | - | |||||||
320 | /* Set the terminal into cbreak (no-echo, one-character-at-a-time) mode */ | - | ||||||
321 | int | - | ||||||
322 | ttcbreak () | - | ||||||
323 | { | - | ||||||
324 | TTYSTRUCT tt; | - | ||||||
325 | - | |||||||
326 | if (ttsaved == 0)
| 0 | ||||||
327 | return -1; never executed: return -1; | 0 | ||||||
328 | tt = ttin; | - | ||||||
329 | return (ttfd_cbreak (0, &tt)); never executed: return (ttfd_cbreak (0, &tt)); | 0 | ||||||
330 | } | - | ||||||
Source code | Switch to Preprocessed file |