source: vendor/bash/3.1-p17/lib/sh/shtty.c

Last change on this file was 3231, checked in by bird, 18 years ago

eol style.

  • Property svn:eol-style set to native
File size: 5.1 KB
Line 
1/* Copyright (C) 1999 Free Software Foundation, Inc.
2
3 This file is part of GNU Bash, the Bourne Again SHell.
4
5 Bash is free software; you can redistribute it and/or modify it under
6 the terms of the GNU General Public License as published by the Free
7 Software Foundation; either version 2, or (at your option) any later
8 version.
9
10 Bash is distributed in the hope that it will be useful, but WITHOUT ANY
11 WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 for more details.
14
15 You should have received a copy of the GNU General Public License along
16 with Bash; see the file COPYING. If not, write to the Free Software
17 Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
18
19/*
20 * shtty.c -- abstract interface to the terminal, focusing on capabilities.
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
33static TTYSTRUCT ttin, ttout;
34static int ttsaved = 0;
35
36int
37ttgetattr(fd, ttp)
38int fd;
39TTYSTRUCT *ttp;
40{
41#ifdef TERMIOS_TTY_DRIVER
42 return tcgetattr(fd, ttp);
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
52int
53ttsetattr(fd, ttp)
54int fd;
55TTYSTRUCT *ttp;
56{
57#ifdef TERMIOS_TTY_DRIVER
58 return tcsetattr(fd, TCSADRAIN, ttp);
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
68void
69ttsave()
70{
71 if (ttsaved)
72 return;
73 ttgetattr (0, &ttin);
74 ttgetattr (1, &ttout);
75 ttsaved = 1;
76}
77
78void
79ttrestore()
80{
81 if (ttsaved == 0)
82 return;
83 ttsetattr (0, &ttin);
84 ttsetattr (1, &ttout);
85 ttsaved = 0;
86}
87
88/* Retrieve the attributes associated with tty fd FD. */
89TTYSTRUCT *
90ttattr (fd)
91 int fd;
92{
93 if (ttsaved == 0)
94 return ((TTYSTRUCT *)0);
95 if (fd == 0)
96 return &ttin;
97 else if (fd == 1)
98 return &ttout;
99 else
100 return ((TTYSTRUCT *)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 */
107int
108tt_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;
150}
151
152/* Set the terminal into one-character-at-a-time mode */
153int
154ttonechar ()
155{
156 TTYSTRUCT tt;
157
158 if (ttsaved == 0)
159 return -1;
160 tt = ttin;
161 if (tt_setonechar(&tt) < 0)
162 return -1;
163 return (ttsetattr (0, &tt));
164}
165
166/*
167 * Change attributes in ttp so that when it is installed using
168 * ttsetattr, the terminal will be in no-echo mode.
169 */
170int
171tt_setnoecho(ttp)
172 TTYSTRUCT *ttp;
173{
174#if defined (TERMIOS_TTY_DRIVER) || defined (TERMIO_TTY_DRIVER)
175 ttp->c_lflag &= ~(ECHO|ECHOK|ECHONL);
176#else
177 ttp->sg_flags &= ~ECHO;
178#endif
179
180 return 0;
181}
182
183/* Set the terminal into no-echo mode */
184int
185ttnoecho ()
186{
187 TTYSTRUCT tt;
188
189 if (ttsaved == 0)
190 return -1;
191 tt = ttin;
192 if (tt_setnoecho (&tt) < 0)
193 return -1;
194 return (ttsetattr (0, &tt));
195}
196
197/*
198 * Change attributes in ttp so that when it is installed using
199 * ttsetattr, the terminal will be in eight-bit mode (pass8).
200 */
201int
202tt_seteightbit (ttp)
203 TTYSTRUCT *ttp;
204{
205#if defined (TERMIOS_TTY_DRIVER) || defined (TERMIO_TTY_DRIVER)
206 ttp->c_iflag &= ~ISTRIP;
207 ttp->c_cflag |= CS8;
208 ttp->c_cflag &= ~PARENB;
209#else
210 ttp->sg_flags |= ANYP;
211#endif
212
213 return 0;
214}
215
216/* Set the terminal into eight-bit mode */
217int
218tteightbit ()
219{
220 TTYSTRUCT tt;
221
222 if (ttsaved == 0)
223 return -1;
224 tt = ttin;
225 if (tt_seteightbit (&tt) < 0)
226 return -1;
227 return (ttsetattr (0, &tt));
228}
229
230/*
231 * Change attributes in ttp so that when it is installed using
232 * ttsetattr, the terminal will be in non-canonical input mode.
233 */
234int
235tt_setnocanon (ttp)
236 TTYSTRUCT *ttp;
237{
238#if defined (TERMIOS_TTY_DRIVER) || defined (TERMIO_TTY_DRIVER)
239 ttp->c_lflag &= ~ICANON;
240#endif
241
242 return 0;
243}
244
245/* Set the terminal into non-canonical mode */
246int
247ttnocanon ()
248{
249 TTYSTRUCT tt;
250
251 if (ttsaved == 0)
252 return -1;
253 tt = ttin;
254 if (tt_setnocanon (&tt) < 0)
255 return -1;
256 return (ttsetattr (0, &tt));
257}
258
259/*
260 * Change attributes in ttp so that when it is installed using
261 * ttsetattr, the terminal will be in cbreak, no-echo mode.
262 */
263int
264tt_setcbreak(ttp)
265 TTYSTRUCT *ttp;
266{
267 if (tt_setonechar (ttp) < 0)
268 return -1;
269 return (tt_setnoecho (ttp));
270}
271
272/* Set the terminal into cbreak (no-echo, one-character-at-a-time) mode */
273int
274ttcbreak ()
275{
276 TTYSTRUCT tt;
277
278 if (ttsaved == 0)
279 return -1;
280 tt = ttin;
281 if (tt_setcbreak (&tt) < 0)
282 return -1;
283 return (ttsetattr (0, &tt));
284}
Note: See TracBrowser for help on using the repository browser.