xref: /freebsd/contrib/tcsh/ed.term.c (revision 6560ac57ce879857203bc456cdc3849808dc0700)
1c80476e4SDavid E. O'Brien /*
2c80476e4SDavid E. O'Brien  * ed.term.c: Low level terminal interface
3c80476e4SDavid E. O'Brien  */
4c80476e4SDavid E. O'Brien /*-
5c80476e4SDavid E. O'Brien  * Copyright (c) 1980, 1991 The Regents of the University of California.
6c80476e4SDavid E. O'Brien  * All rights reserved.
7c80476e4SDavid E. O'Brien  *
8c80476e4SDavid E. O'Brien  * Redistribution and use in source and binary forms, with or without
9c80476e4SDavid E. O'Brien  * modification, are permitted provided that the following conditions
10c80476e4SDavid E. O'Brien  * are met:
11c80476e4SDavid E. O'Brien  * 1. Redistributions of source code must retain the above copyright
12c80476e4SDavid E. O'Brien  *    notice, this list of conditions and the following disclaimer.
13c80476e4SDavid E. O'Brien  * 2. Redistributions in binary form must reproduce the above copyright
14c80476e4SDavid E. O'Brien  *    notice, this list of conditions and the following disclaimer in the
15c80476e4SDavid E. O'Brien  *    documentation and/or other materials provided with the distribution.
1629301572SMark Peek  * 3. Neither the name of the University nor the names of its contributors
17c80476e4SDavid E. O'Brien  *    may be used to endorse or promote products derived from this software
18c80476e4SDavid E. O'Brien  *    without specific prior written permission.
19c80476e4SDavid E. O'Brien  *
20c80476e4SDavid E. O'Brien  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21c80476e4SDavid E. O'Brien  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22c80476e4SDavid E. O'Brien  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23c80476e4SDavid E. O'Brien  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24c80476e4SDavid E. O'Brien  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25c80476e4SDavid E. O'Brien  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26c80476e4SDavid E. O'Brien  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27c80476e4SDavid E. O'Brien  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28c80476e4SDavid E. O'Brien  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29c80476e4SDavid E. O'Brien  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30c80476e4SDavid E. O'Brien  * SUCH DAMAGE.
31c80476e4SDavid E. O'Brien  */
32c80476e4SDavid E. O'Brien #include "sh.h"
333b6eaa7bSAndrey A. Chernov #ifndef WINNT_NATIVE
34*9ccc37e3SMark Peek #include <assert.h>
35c80476e4SDavid E. O'Brien #include "ed.h"
36c80476e4SDavid E. O'Brien 
37c80476e4SDavid E. O'Brien int didsetty = 0;
38c80476e4SDavid E. O'Brien ttyperm_t ttylist = {
39c80476e4SDavid E. O'Brien     {
40c80476e4SDavid E. O'Brien #if defined(POSIX) || defined(TERMIO)
41c80476e4SDavid E. O'Brien 	{ "iflag:", ICRNL, (INLCR|IGNCR) },
42c80476e4SDavid E. O'Brien 	{ "oflag:", (OPOST|ONLCR), ONLRET },
43c80476e4SDavid E. O'Brien 	{ "cflag:", 0, 0 },
44c80476e4SDavid E. O'Brien 	{ "lflag:", (ISIG|ICANON|ECHO|ECHOE|ECHOCTL|IEXTEN),
45c80476e4SDavid E. O'Brien 		    (NOFLSH|ECHONL|EXTPROC|FLUSHO|IDEFAULT) },
46c80476e4SDavid E. O'Brien #else /* GSTTY */
47c80476e4SDavid E. O'Brien 	{ "nrmal:", (ECHO|CRMOD|ANYP), (CBREAK|RAW|LCASE|VTDELAY|ALLDELAY) },
48c80476e4SDavid E. O'Brien 	{ "local:", (LCRTBS|LCRTERA|LCRTKIL), (LPRTERA|LFLUSHO) },
49c80476e4SDavid E. O'Brien #endif /* POSIX || TERMIO */
50c80476e4SDavid E. O'Brien 	{ "chars:", 	0, 0 },
51c80476e4SDavid E. O'Brien     },
52c80476e4SDavid E. O'Brien     {
53c80476e4SDavid E. O'Brien #if defined(POSIX) || defined(TERMIO)
54c80476e4SDavid E. O'Brien 	{ "iflag:", (INLCR|ICRNL), IGNCR },
55c80476e4SDavid E. O'Brien 	{ "oflag:", (OPOST|ONLCR), ONLRET },
56c80476e4SDavid E. O'Brien 	{ "cflag:", 0, 0 },
57c80476e4SDavid E. O'Brien 	{ "lflag:", ISIG,
58c80476e4SDavid E. O'Brien 		    (NOFLSH|ICANON|ECHO|ECHOK|ECHONL|EXTPROC|IEXTEN|FLUSHO|
59c80476e4SDavid E. O'Brien 		     IDEFAULT) },
60c80476e4SDavid E. O'Brien #else /* GSTTY */
61c80476e4SDavid E. O'Brien 	{ "nrmal:", (CBREAK|CRMOD|ANYP), (RAW|ECHO|LCASE|VTDELAY|ALLDELAY) },
62c80476e4SDavid E. O'Brien 	{ "local:", (LCRTBS|LCRTERA|LCRTKIL), (LPRTERA|LFLUSHO) },
63c80476e4SDavid E. O'Brien #endif /* POSIX || TERMIO */
64c80476e4SDavid E. O'Brien 	{ "chars:", (C_SH(C_MIN)|C_SH(C_TIME)|C_SH(C_SWTCH)|C_SH(C_DSWTCH)|
65c80476e4SDavid E. O'Brien 		     C_SH(C_WERASE)|C_SH(C_REPRINT)|C_SH(C_SUSP)|C_SH(C_DSUSP)|
66c80476e4SDavid E. O'Brien 		     C_SH(C_EOF)|C_SH(C_EOL)|C_SH(C_DISCARD)|C_SH(C_PGOFF)|
67c80476e4SDavid E. O'Brien 		     C_SH(C_KILL2)|C_SH(C_PAGE)|C_SH(C_STATUS)|C_SH(C_LNEXT)),
68c80476e4SDavid E. O'Brien 		     0 }
69c80476e4SDavid E. O'Brien     },
70c80476e4SDavid E. O'Brien     {
71c80476e4SDavid E. O'Brien #if defined(POSIX) || defined(TERMIO)
72c80476e4SDavid E. O'Brien 	{ "iflag:", 0, IXON | IXOFF },
73c80476e4SDavid E. O'Brien 	{ "oflag:", 0, 0 },
74c80476e4SDavid E. O'Brien 	{ "cflag:", 0, 0 },
75c80476e4SDavid E. O'Brien 	{ "lflag:", 0, ISIG | IEXTEN },
76c80476e4SDavid E. O'Brien #else /* GSTTY */
77c80476e4SDavid E. O'Brien 	{ "nrmal:", RAW, CBREAK },
78c80476e4SDavid E. O'Brien 	{ "local:", 0, 0 },
79c80476e4SDavid E. O'Brien #endif /* POSIX || TERMIO */
80c80476e4SDavid E. O'Brien 	{ "chars:", 0, 0 },
81c80476e4SDavid E. O'Brien     }
82c80476e4SDavid E. O'Brien };
83c80476e4SDavid E. O'Brien 
8445e5710bSMark Peek static const struct tcshmodes {
8523338178SMark Peek     const char *m_name;
86c80476e4SDavid E. O'Brien #ifdef SOLARIS2
87c80476e4SDavid E. O'Brien     unsigned long m_value;
88c80476e4SDavid E. O'Brien #else /* !SOLARIS2 */
89c80476e4SDavid E. O'Brien     int   m_value;
90c80476e4SDavid E. O'Brien #endif /* SOLARIS2 */
91c80476e4SDavid E. O'Brien     int   m_type;
92c80476e4SDavid E. O'Brien } modelist[] = {
93c80476e4SDavid E. O'Brien #if defined(POSIX) || defined(TERMIO)
94c80476e4SDavid E. O'Brien 
95c80476e4SDavid E. O'Brien # ifdef	IGNBRK
96c80476e4SDavid E. O'Brien     { "ignbrk",	IGNBRK,	M_INPUT },
97c80476e4SDavid E. O'Brien # endif /* IGNBRK */
98c80476e4SDavid E. O'Brien # ifdef	BRKINT
99c80476e4SDavid E. O'Brien     { "brkint",	BRKINT,	M_INPUT },
100c80476e4SDavid E. O'Brien # endif /* BRKINT */
101c80476e4SDavid E. O'Brien # ifdef	IGNPAR
102c80476e4SDavid E. O'Brien     { "ignpar",	IGNPAR,	M_INPUT },
103c80476e4SDavid E. O'Brien # endif /* IGNPAR */
104c80476e4SDavid E. O'Brien # ifdef	PARMRK
105c80476e4SDavid E. O'Brien     { "parmrk",	PARMRK,	M_INPUT },
106c80476e4SDavid E. O'Brien # endif /* PARMRK */
107c80476e4SDavid E. O'Brien # ifdef	INPCK
108c80476e4SDavid E. O'Brien     { "inpck",	INPCK,	M_INPUT },
109c80476e4SDavid E. O'Brien # endif /* INPCK */
110c80476e4SDavid E. O'Brien # ifdef	ISTRIP
111c80476e4SDavid E. O'Brien     { "istrip",	ISTRIP,	M_INPUT },
112c80476e4SDavid E. O'Brien # endif /* ISTRIP */
113c80476e4SDavid E. O'Brien # ifdef	INLCR
114c80476e4SDavid E. O'Brien     { "inlcr",	INLCR,	M_INPUT },
115c80476e4SDavid E. O'Brien # endif /* INLCR */
116c80476e4SDavid E. O'Brien # ifdef	IGNCR
117c80476e4SDavid E. O'Brien     { "igncr",	IGNCR,	M_INPUT },
118c80476e4SDavid E. O'Brien # endif /* IGNCR */
119c80476e4SDavid E. O'Brien # ifdef	ICRNL
120c80476e4SDavid E. O'Brien     { "icrnl",	ICRNL,	M_INPUT },
121c80476e4SDavid E. O'Brien # endif /* ICRNL */
122c80476e4SDavid E. O'Brien # ifdef	IUCLC
123c80476e4SDavid E. O'Brien     { "iuclc",	IUCLC,	M_INPUT },
124c80476e4SDavid E. O'Brien # endif /* IUCLC */
125c80476e4SDavid E. O'Brien # ifdef	IXON
126c80476e4SDavid E. O'Brien     { "ixon",	IXON,	M_INPUT },
127c80476e4SDavid E. O'Brien # endif /* IXON */
128c80476e4SDavid E. O'Brien # ifdef	IXANY
129c80476e4SDavid E. O'Brien     { "ixany",	IXANY,	M_INPUT },
130c80476e4SDavid E. O'Brien # endif /* IXANY */
131c80476e4SDavid E. O'Brien # ifdef	IXOFF
132c80476e4SDavid E. O'Brien     { "ixoff",	IXOFF,	M_INPUT },
133c80476e4SDavid E. O'Brien # endif /* IXOFF */
134c80476e4SDavid E. O'Brien # ifdef  IMAXBEL
135c80476e4SDavid E. O'Brien     { "imaxbel",IMAXBEL,M_INPUT },
136c80476e4SDavid E. O'Brien # endif /* IMAXBEL */
137c80476e4SDavid E. O'Brien # ifdef  IDELETE
138c80476e4SDavid E. O'Brien     { "idelete",IDELETE,M_INPUT },
139c80476e4SDavid E. O'Brien # endif /* IDELETE */
140c80476e4SDavid E. O'Brien 
141c80476e4SDavid E. O'Brien # ifdef	OPOST
142c80476e4SDavid E. O'Brien     { "opost",	OPOST,	M_OUTPUT },
143c80476e4SDavid E. O'Brien # endif /* OPOST */
144c80476e4SDavid E. O'Brien # ifdef	OLCUC
145c80476e4SDavid E. O'Brien     { "olcuc",	OLCUC,	M_OUTPUT },
146c80476e4SDavid E. O'Brien # endif /* OLCUC */
147c80476e4SDavid E. O'Brien # ifdef	ONLCR
148c80476e4SDavid E. O'Brien     { "onlcr",	ONLCR,	M_OUTPUT },
149c80476e4SDavid E. O'Brien # endif /* ONLCR */
150c80476e4SDavid E. O'Brien # ifdef	OCRNL
151c80476e4SDavid E. O'Brien     { "ocrnl",	OCRNL,	M_OUTPUT },
152c80476e4SDavid E. O'Brien # endif /* OCRNL */
153c80476e4SDavid E. O'Brien # ifdef	ONOCR
154c80476e4SDavid E. O'Brien     { "onocr",	ONOCR,	M_OUTPUT },
155c80476e4SDavid E. O'Brien # endif /* ONOCR */
156c80476e4SDavid E. O'Brien # ifdef ONOEOT
157c80476e4SDavid E. O'Brien     { "onoeot",	ONOEOT,	M_OUTPUT },
158c80476e4SDavid E. O'Brien # endif /* ONOEOT */
159c80476e4SDavid E. O'Brien # ifdef	ONLRET
160c80476e4SDavid E. O'Brien     { "onlret",	ONLRET,	M_OUTPUT },
161c80476e4SDavid E. O'Brien # endif /* ONLRET */
162c80476e4SDavid E. O'Brien # ifdef	OFILL
163c80476e4SDavid E. O'Brien     { "ofill",	OFILL,	M_OUTPUT },
164c80476e4SDavid E. O'Brien # endif /* OFILL */
165c80476e4SDavid E. O'Brien # ifdef	OFDEL
166c80476e4SDavid E. O'Brien     { "ofdel",	OFDEL,	M_OUTPUT },
167c80476e4SDavid E. O'Brien # endif /* OFDEL */
168c80476e4SDavid E. O'Brien # ifdef	NLDLY
169c80476e4SDavid E. O'Brien     { "nldly",	NLDLY,	M_OUTPUT },
170c80476e4SDavid E. O'Brien # endif /* NLDLY */
171c80476e4SDavid E. O'Brien # ifdef	CRDLY
172c80476e4SDavid E. O'Brien     { "crdly",	CRDLY,	M_OUTPUT },
173c80476e4SDavid E. O'Brien # endif /* CRDLY */
174c80476e4SDavid E. O'Brien # ifdef	TABDLY
175c80476e4SDavid E. O'Brien     { "tabdly",	TABDLY,	M_OUTPUT },
176c80476e4SDavid E. O'Brien # endif /* TABDLY */
177c80476e4SDavid E. O'Brien # ifdef	XTABS
178c80476e4SDavid E. O'Brien     { "xtabs",	XTABS,	M_OUTPUT },
179c80476e4SDavid E. O'Brien # endif /* XTABS */
180c80476e4SDavid E. O'Brien # ifdef	BSDLY
181c80476e4SDavid E. O'Brien     { "bsdly",	BSDLY,	M_OUTPUT },
182c80476e4SDavid E. O'Brien # endif /* BSDLY */
183c80476e4SDavid E. O'Brien # ifdef	VTDLY
184c80476e4SDavid E. O'Brien     { "vtdly",	VTDLY,	M_OUTPUT },
185c80476e4SDavid E. O'Brien # endif /* VTDLY */
186c80476e4SDavid E. O'Brien # ifdef	FFDLY
187c80476e4SDavid E. O'Brien     { "ffdly",	FFDLY,	M_OUTPUT },
188c80476e4SDavid E. O'Brien # endif /* FFDLY */
189c80476e4SDavid E. O'Brien # ifdef	PAGEOUT
190c80476e4SDavid E. O'Brien     { "pageout",PAGEOUT,M_OUTPUT },
191c80476e4SDavid E. O'Brien # endif /* PAGEOUT */
192c80476e4SDavid E. O'Brien # ifdef	WRAP
193c80476e4SDavid E. O'Brien     { "wrap",	WRAP,	M_OUTPUT },
194c80476e4SDavid E. O'Brien # endif /* WRAP */
195c80476e4SDavid E. O'Brien 
196c80476e4SDavid E. O'Brien # ifdef	CIGNORE
197c80476e4SDavid E. O'Brien     { "cignore",CIGNORE,M_CONTROL },
198c80476e4SDavid E. O'Brien # endif /* CBAUD */
199c80476e4SDavid E. O'Brien # ifdef	CBAUD
200c80476e4SDavid E. O'Brien     { "cbaud",	CBAUD,	M_CONTROL },
201c80476e4SDavid E. O'Brien # endif /* CBAUD */
202c80476e4SDavid E. O'Brien # ifdef	CSTOPB
203c80476e4SDavid E. O'Brien     { "cstopb",	CSTOPB,	M_CONTROL },
204c80476e4SDavid E. O'Brien # endif /* CSTOPB */
205c80476e4SDavid E. O'Brien # ifdef	CREAD
206c80476e4SDavid E. O'Brien     { "cread",	CREAD,	M_CONTROL },
207c80476e4SDavid E. O'Brien # endif /* CREAD */
208c80476e4SDavid E. O'Brien # ifdef	PARENB
209c80476e4SDavid E. O'Brien     { "parenb",	PARENB,	M_CONTROL },
210c80476e4SDavid E. O'Brien # endif /* PARENB */
211c80476e4SDavid E. O'Brien # ifdef	PARODD
212c80476e4SDavid E. O'Brien     { "parodd",	PARODD,	M_CONTROL },
213c80476e4SDavid E. O'Brien # endif /* PARODD */
214c80476e4SDavid E. O'Brien # ifdef	HUPCL
215c80476e4SDavid E. O'Brien     { "hupcl",	HUPCL,	M_CONTROL },
216c80476e4SDavid E. O'Brien # endif /* HUPCL */
217c80476e4SDavid E. O'Brien # ifdef	CLOCAL
218c80476e4SDavid E. O'Brien     { "clocal",	CLOCAL,	M_CONTROL },
219c80476e4SDavid E. O'Brien # endif /* CLOCAL */
220c80476e4SDavid E. O'Brien # ifdef	LOBLK
221c80476e4SDavid E. O'Brien     { "loblk",	LOBLK,	M_CONTROL },
222c80476e4SDavid E. O'Brien # endif /* LOBLK */
223c80476e4SDavid E. O'Brien # ifdef	CIBAUD
224c80476e4SDavid E. O'Brien     { "cibaud",	CIBAUD,	M_CONTROL },
225c80476e4SDavid E. O'Brien # endif /* CIBAUD */
226c80476e4SDavid E. O'Brien # ifdef CRTSCTS
227c80476e4SDavid E. O'Brien #  ifdef CCTS_OFLOW
228c80476e4SDavid E. O'Brien     { "ccts_oflow",CCTS_OFLOW,M_CONTROL },
229c80476e4SDavid E. O'Brien #  else
230c80476e4SDavid E. O'Brien     { "crtscts",CRTSCTS,M_CONTROL },
231c80476e4SDavid E. O'Brien #  endif /* CCTS_OFLOW */
232c80476e4SDavid E. O'Brien # endif /* CRTSCTS */
233c80476e4SDavid E. O'Brien # ifdef CRTS_IFLOW
234c80476e4SDavid E. O'Brien     { "crts_iflow",CRTS_IFLOW,M_CONTROL },
235c80476e4SDavid E. O'Brien # endif /* CRTS_IFLOW */
236c80476e4SDavid E. O'Brien # ifdef MDMBUF
237c80476e4SDavid E. O'Brien     { "mdmbuf",	MDMBUF,	M_CONTROL },
238c80476e4SDavid E. O'Brien # endif /* MDMBUF */
239c80476e4SDavid E. O'Brien # ifdef RCV1EN
240c80476e4SDavid E. O'Brien     { "rcv1en",	RCV1EN,	M_CONTROL },
241c80476e4SDavid E. O'Brien # endif /* RCV1EN */
242c80476e4SDavid E. O'Brien # ifdef XMT1EN
243c80476e4SDavid E. O'Brien     { "xmt1en",	XMT1EN,	M_CONTROL },
244c80476e4SDavid E. O'Brien # endif /* XMT1EN */
245c80476e4SDavid E. O'Brien 
246c80476e4SDavid E. O'Brien # ifdef	ISIG
247c80476e4SDavid E. O'Brien     { "isig",	ISIG,	M_LINED },
248c80476e4SDavid E. O'Brien # endif /* ISIG */
249c80476e4SDavid E. O'Brien # ifdef	ICANON
250c80476e4SDavid E. O'Brien     { "icanon",	ICANON,	M_LINED },
251c80476e4SDavid E. O'Brien # endif /* ICANON */
252c80476e4SDavid E. O'Brien # ifdef	XCASE
253c80476e4SDavid E. O'Brien     { "xcase",	XCASE,	M_LINED },
254c80476e4SDavid E. O'Brien # endif /* XCASE */
255c80476e4SDavid E. O'Brien # ifdef	ECHO
256c80476e4SDavid E. O'Brien     { "echo",	ECHO,	M_LINED },
257c80476e4SDavid E. O'Brien # endif /* ECHO */
258c80476e4SDavid E. O'Brien # ifdef	ECHOE
259c80476e4SDavid E. O'Brien     { "echoe",	ECHOE,	M_LINED },
260c80476e4SDavid E. O'Brien # endif /* ECHOE */
261c80476e4SDavid E. O'Brien # ifdef	ECHOK
262c80476e4SDavid E. O'Brien     { "echok",	ECHOK,	M_LINED },
263c80476e4SDavid E. O'Brien # endif /* ECHOK */
264c80476e4SDavid E. O'Brien # ifdef	ECHONL
265c80476e4SDavid E. O'Brien     { "echonl",	ECHONL,	M_LINED },
266c80476e4SDavid E. O'Brien # endif /* ECHONL */
267c80476e4SDavid E. O'Brien # ifdef	NOFLSH
268c80476e4SDavid E. O'Brien     { "noflsh",	NOFLSH,	M_LINED },
269c80476e4SDavid E. O'Brien # endif /* NOFLSH */
270c80476e4SDavid E. O'Brien # ifdef	TOSTOP
271c80476e4SDavid E. O'Brien     { "tostop",	TOSTOP,	M_LINED },
272c80476e4SDavid E. O'Brien # endif /* TOSTOP */
273c80476e4SDavid E. O'Brien # ifdef	ECHOCTL
274c80476e4SDavid E. O'Brien     { "echoctl",ECHOCTL,M_LINED },
275c80476e4SDavid E. O'Brien # endif /* ECHOCTL */
276c80476e4SDavid E. O'Brien # ifdef	ECHOPRT
277c80476e4SDavid E. O'Brien     { "echoprt",ECHOPRT,M_LINED },
278c80476e4SDavid E. O'Brien # endif /* ECHOPRT */
279c80476e4SDavid E. O'Brien # ifdef	ECHOKE
280c80476e4SDavid E. O'Brien     { "echoke",	ECHOKE,	M_LINED },
281c80476e4SDavid E. O'Brien # endif /* ECHOKE */
282c80476e4SDavid E. O'Brien # ifdef	DEFECHO
283c80476e4SDavid E. O'Brien     { "defecho",DEFECHO,M_LINED },
284c80476e4SDavid E. O'Brien # endif /* DEFECHO */
285c80476e4SDavid E. O'Brien # ifdef	FLUSHO
286c80476e4SDavid E. O'Brien     { "flusho",	FLUSHO,	M_LINED },
287c80476e4SDavid E. O'Brien # endif /* FLUSHO */
288c80476e4SDavid E. O'Brien # ifdef	PENDIN
289c80476e4SDavid E. O'Brien     { "pendin",	PENDIN,	M_LINED },
290c80476e4SDavid E. O'Brien # endif /* PENDIN */
291c80476e4SDavid E. O'Brien # ifdef	IEXTEN
292c80476e4SDavid E. O'Brien     { "iexten",	IEXTEN,	M_LINED },
293c80476e4SDavid E. O'Brien # endif /* IEXTEN */
294c80476e4SDavid E. O'Brien # ifdef	NOKERNINFO
295c80476e4SDavid E. O'Brien     { "nokerninfo",NOKERNINFO,M_LINED },
296c80476e4SDavid E. O'Brien # endif /* NOKERNINFO */
297c80476e4SDavid E. O'Brien # ifdef	ALTWERASE
298c80476e4SDavid E. O'Brien     { "altwerase",ALTWERASE,M_LINED },
299c80476e4SDavid E. O'Brien # endif /* ALTWERASE */
300c80476e4SDavid E. O'Brien # ifdef	EXTPROC
301c80476e4SDavid E. O'Brien     { "extproc",EXTPROC,M_LINED },
302c80476e4SDavid E. O'Brien # endif /* EXTPROC */
303c80476e4SDavid E. O'Brien # ifdef IDEFAULT
304c80476e4SDavid E. O'Brien     { "idefault",IDEFAULT,M_LINED },
305c80476e4SDavid E. O'Brien # endif /* IDEFAULT */
306c80476e4SDavid E. O'Brien 
307c80476e4SDavid E. O'Brien #else /* GSTTY */
308c80476e4SDavid E. O'Brien 
309c80476e4SDavid E. O'Brien # ifdef	TANDEM
310c80476e4SDavid E. O'Brien     { "tandem",	TANDEM,	M_CONTROL },
311c80476e4SDavid E. O'Brien # endif /* TANDEM */
312c80476e4SDavid E. O'Brien # ifdef	CBREAK
313c80476e4SDavid E. O'Brien     { "cbreak",	CBREAK,	M_CONTROL },
314c80476e4SDavid E. O'Brien # endif /* CBREAK */
315c80476e4SDavid E. O'Brien # ifdef	LCASE
316c80476e4SDavid E. O'Brien     { "lcase",	LCASE,	M_CONTROL },
317c80476e4SDavid E. O'Brien # endif /* LCASE */
318c80476e4SDavid E. O'Brien # ifdef	ECHO
319c80476e4SDavid E. O'Brien     { "echo",	ECHO,	M_CONTROL },
320c80476e4SDavid E. O'Brien # endif /* ECHO */
321c80476e4SDavid E. O'Brien # ifdef	CRMOD
322c80476e4SDavid E. O'Brien     { "crmod",	CRMOD,	M_CONTROL },
323c80476e4SDavid E. O'Brien # endif /* CRMOD */
324c80476e4SDavid E. O'Brien # ifdef	RAW
325c80476e4SDavid E. O'Brien     { "raw",	RAW,	M_CONTROL },
326c80476e4SDavid E. O'Brien # endif /* RAW */
327c80476e4SDavid E. O'Brien # ifdef	ODDP
328c80476e4SDavid E. O'Brien     { "oddp",	ODDP,	M_CONTROL },
329c80476e4SDavid E. O'Brien # endif /* ODDP */
330c80476e4SDavid E. O'Brien # ifdef	EVENP
331c80476e4SDavid E. O'Brien     { "evenp",	EVENP,	M_CONTROL },
332c80476e4SDavid E. O'Brien # endif /* EVENP */
333c80476e4SDavid E. O'Brien # ifdef	ANYP
334c80476e4SDavid E. O'Brien     { "anyp",	ANYP,	M_CONTROL },
335c80476e4SDavid E. O'Brien # endif /* ANYP */
336c80476e4SDavid E. O'Brien # ifdef	NLDELAY
337c80476e4SDavid E. O'Brien     { "nldelay",NLDELAY,M_CONTROL },
338c80476e4SDavid E. O'Brien # endif /* NLDELAY */
339c80476e4SDavid E. O'Brien # ifdef	TBDELAY
340c80476e4SDavid E. O'Brien     { "tbdelay",TBDELAY,M_CONTROL },
341c80476e4SDavid E. O'Brien # endif /* TBDELAY */
342c80476e4SDavid E. O'Brien # ifdef	XTABS
343c80476e4SDavid E. O'Brien     { "xtabs",	XTABS,	M_CONTROL },
344c80476e4SDavid E. O'Brien # endif /* XTABS */
345c80476e4SDavid E. O'Brien # ifdef	CRDELAY
346c80476e4SDavid E. O'Brien     { "crdelay",CRDELAY,M_CONTROL },
347c80476e4SDavid E. O'Brien # endif /* CRDELAY */
348c80476e4SDavid E. O'Brien # ifdef	VTDELAY
349c80476e4SDavid E. O'Brien     { "vtdelay",VTDELAY,M_CONTROL },
350c80476e4SDavid E. O'Brien # endif /* VTDELAY */
351c80476e4SDavid E. O'Brien # ifdef	BSDELAY
352c80476e4SDavid E. O'Brien     { "bsdelay",BSDELAY,M_CONTROL },
353c80476e4SDavid E. O'Brien # endif /* BSDELAY */
354c80476e4SDavid E. O'Brien # ifdef	CRTBS
355c80476e4SDavid E. O'Brien     { "crtbs",	CRTBS,	M_CONTROL },
356c80476e4SDavid E. O'Brien # endif /* CRTBS */
357c80476e4SDavid E. O'Brien # ifdef	PRTERA
358c80476e4SDavid E. O'Brien     { "prtera",	PRTERA,	M_CONTROL },
359c80476e4SDavid E. O'Brien # endif /* PRTERA */
360c80476e4SDavid E. O'Brien # ifdef	CRTERA
361c80476e4SDavid E. O'Brien     { "crtera",	CRTERA,	M_CONTROL },
362c80476e4SDavid E. O'Brien # endif /* CRTERA */
363c80476e4SDavid E. O'Brien # ifdef	TILDE
364c80476e4SDavid E. O'Brien     { "tilde",	TILDE,	M_CONTROL },
365c80476e4SDavid E. O'Brien # endif /* TILDE */
366c80476e4SDavid E. O'Brien # ifdef	MDMBUF
367c80476e4SDavid E. O'Brien     { "mdmbuf",	MDMBUF,	M_CONTROL },
368c80476e4SDavid E. O'Brien # endif /* MDMBUF */
369c80476e4SDavid E. O'Brien # ifdef	LITOUT
370c80476e4SDavid E. O'Brien     { "litout",	LITOUT,	M_CONTROL },
371c80476e4SDavid E. O'Brien # endif /* LITOUT */
372c80476e4SDavid E. O'Brien # ifdef	TOSTOP
373c80476e4SDavid E. O'Brien     { "tostop",	TOSTOP,	M_CONTROL },
374c80476e4SDavid E. O'Brien # endif /* TOSTOP */
375c80476e4SDavid E. O'Brien # ifdef	FLUSHO
376c80476e4SDavid E. O'Brien     { "flusho",	FLUSHO,	M_CONTROL },
377c80476e4SDavid E. O'Brien # endif /* FLUSHO */
378c80476e4SDavid E. O'Brien # ifdef	NOHANG
379c80476e4SDavid E. O'Brien     { "nohang",	NOHANG,	M_CONTROL },
380c80476e4SDavid E. O'Brien # endif /* NOHANG */
381c80476e4SDavid E. O'Brien # ifdef	L001000
382c80476e4SDavid E. O'Brien     { "l001000",L001000,M_CONTROL },
383c80476e4SDavid E. O'Brien # endif /* L001000 */
384c80476e4SDavid E. O'Brien # ifdef	CRTKIL
385c80476e4SDavid E. O'Brien     { "crtkil",	CRTKIL,	M_CONTROL },
386c80476e4SDavid E. O'Brien # endif /* CRTKIL */
387c80476e4SDavid E. O'Brien # ifdef	PASS8
388c80476e4SDavid E. O'Brien     { "pass8",	PASS8,	M_CONTROL },
389c80476e4SDavid E. O'Brien # endif /* PASS8 */
390c80476e4SDavid E. O'Brien # ifdef	CTLECH
391c80476e4SDavid E. O'Brien     { "ctlech",	CTLECH,	M_CONTROL },
392c80476e4SDavid E. O'Brien # endif /* CTLECH */
393c80476e4SDavid E. O'Brien # ifdef	PENDIN
394c80476e4SDavid E. O'Brien     { "pendin",	PENDIN,	M_CONTROL },
395c80476e4SDavid E. O'Brien # endif /* PENDIN */
396c80476e4SDavid E. O'Brien # ifdef	DECCTQ
397c80476e4SDavid E. O'Brien     { "decctq",	DECCTQ,	M_CONTROL },
398c80476e4SDavid E. O'Brien # endif /* DECCTQ */
399c80476e4SDavid E. O'Brien # ifdef	NOFLSH
400c80476e4SDavid E. O'Brien     { "noflsh",	NOFLSH,	M_CONTROL },
401c80476e4SDavid E. O'Brien # endif /* NOFLSH */
402c80476e4SDavid E. O'Brien 
403c80476e4SDavid E. O'Brien # ifdef	LCRTBS
404c80476e4SDavid E. O'Brien     { "lcrtbs",	LCRTBS,	M_LOCAL },
405c80476e4SDavid E. O'Brien # endif /* LCRTBS */
406c80476e4SDavid E. O'Brien # ifdef	LPRTERA
407c80476e4SDavid E. O'Brien     { "lprtera",LPRTERA,M_LOCAL },
408c80476e4SDavid E. O'Brien # endif /* LPRTERA */
409c80476e4SDavid E. O'Brien # ifdef	LCRTERA
410c80476e4SDavid E. O'Brien     { "lcrtera",LCRTERA,M_LOCAL },
411c80476e4SDavid E. O'Brien # endif /* LCRTERA */
412c80476e4SDavid E. O'Brien # ifdef	LTILDE
413c80476e4SDavid E. O'Brien     { "ltilde",	LTILDE,	M_LOCAL },
414c80476e4SDavid E. O'Brien # endif /* LTILDE */
415c80476e4SDavid E. O'Brien # ifdef	LMDMBUF
416c80476e4SDavid E. O'Brien     { "lmdmbuf",LMDMBUF,M_LOCAL },
417c80476e4SDavid E. O'Brien # endif /* LMDMBUF */
418c80476e4SDavid E. O'Brien # ifdef	LLITOUT
419c80476e4SDavid E. O'Brien     { "llitout",LLITOUT,M_LOCAL },
420c80476e4SDavid E. O'Brien # endif /* LLITOUT */
421c80476e4SDavid E. O'Brien # ifdef	LTOSTOP
422c80476e4SDavid E. O'Brien     { "ltostop",LTOSTOP,M_LOCAL },
423c80476e4SDavid E. O'Brien # endif /* LTOSTOP */
424c80476e4SDavid E. O'Brien # ifdef	LFLUSHO
425c80476e4SDavid E. O'Brien     { "lflusho",LFLUSHO,M_LOCAL },
426c80476e4SDavid E. O'Brien # endif /* LFLUSHO */
427c80476e4SDavid E. O'Brien # ifdef	LNOHANG
428c80476e4SDavid E. O'Brien     { "lnohang",LNOHANG,M_LOCAL },
429c80476e4SDavid E. O'Brien # endif /* LNOHANG */
430c80476e4SDavid E. O'Brien # ifdef	LCRTKIL
431c80476e4SDavid E. O'Brien     { "lcrtkil",LCRTKIL,M_LOCAL },
432c80476e4SDavid E. O'Brien # endif /* LCRTKIL */
433c80476e4SDavid E. O'Brien # ifdef	LPASS8
434c80476e4SDavid E. O'Brien     { "lpass8",	LPASS8,	M_LOCAL },
435c80476e4SDavid E. O'Brien # endif /* LPASS8 */
436c80476e4SDavid E. O'Brien # ifdef	LCTLECH
437c80476e4SDavid E. O'Brien     { "lctlech",LCTLECH,M_LOCAL },
438c80476e4SDavid E. O'Brien # endif /* LCTLECH */
439c80476e4SDavid E. O'Brien # ifdef	LPENDIN
440c80476e4SDavid E. O'Brien     { "lpendin",LPENDIN,M_LOCAL },
441c80476e4SDavid E. O'Brien # endif /* LPENDIN */
442c80476e4SDavid E. O'Brien # ifdef	LDECCTQ
443c80476e4SDavid E. O'Brien     { "ldecctq",LDECCTQ,M_LOCAL },
444c80476e4SDavid E. O'Brien # endif /* LDECCTQ */
445c80476e4SDavid E. O'Brien # ifdef	LNOFLSH
446c80476e4SDavid E. O'Brien     { "lnoflsh",LNOFLSH,M_LOCAL },
447c80476e4SDavid E. O'Brien # endif /* LNOFLSH */
448c80476e4SDavid E. O'Brien 
449c80476e4SDavid E. O'Brien #endif /* POSIX || TERMIO */
450c80476e4SDavid E. O'Brien # if defined(VINTR) || defined(TIOCGETC)
451c80476e4SDavid E. O'Brien     { "intr",		C_SH(C_INTR), 	M_CHAR },
452c80476e4SDavid E. O'Brien # endif /* VINTR */
453c80476e4SDavid E. O'Brien # if defined(VQUIT) || defined(TIOCGETC)
454c80476e4SDavid E. O'Brien     { "quit",		C_SH(C_QUIT), 	M_CHAR },
455c80476e4SDavid E. O'Brien # endif /* VQUIT */
456c80476e4SDavid E. O'Brien # if defined(VERASE) || defined(TIOCGETP)
457c80476e4SDavid E. O'Brien     { "erase",		C_SH(C_ERASE), 	M_CHAR },
458c80476e4SDavid E. O'Brien # endif /* VERASE */
459c80476e4SDavid E. O'Brien # if defined(VKILL) || defined(TIOCGETP)
460c80476e4SDavid E. O'Brien     { "kill",		C_SH(C_KILL), 	M_CHAR },
461c80476e4SDavid E. O'Brien # endif /* VKILL */
462c80476e4SDavid E. O'Brien # if defined(VEOF) || defined(TIOCGETC)
463c80476e4SDavid E. O'Brien     { "eof",		C_SH(C_EOF), 	M_CHAR },
464c80476e4SDavid E. O'Brien # endif /* VEOF */
465c80476e4SDavid E. O'Brien # if defined(VEOL)
466c80476e4SDavid E. O'Brien     { "eol",		C_SH(C_EOL), 	M_CHAR },
467c80476e4SDavid E. O'Brien # endif /* VEOL */
468c80476e4SDavid E. O'Brien # if defined(VEOL2)
469c80476e4SDavid E. O'Brien     { "eol2",		C_SH(C_EOL2), 	M_CHAR },
470c80476e4SDavid E. O'Brien # endif  /* VEOL2 */
471c80476e4SDavid E. O'Brien # if defined(VSWTCH)
472c80476e4SDavid E. O'Brien     { "swtch",		C_SH(C_SWTCH), 	M_CHAR },
473c80476e4SDavid E. O'Brien # endif /* VSWTCH */
474c80476e4SDavid E. O'Brien # if defined(VDSWTCH)
475c80476e4SDavid E. O'Brien     { "dswtch",		C_SH(C_DSWTCH),	M_CHAR },
476c80476e4SDavid E. O'Brien # endif /* VDSWTCH */
477c80476e4SDavid E. O'Brien # if defined(VERASE2)
478c80476e4SDavid E. O'Brien     { "erase2",		C_SH(C_ERASE2),	M_CHAR },
479c80476e4SDavid E. O'Brien # endif /* VERASE2 */
480c80476e4SDavid E. O'Brien # if defined(VSTART) || defined(TIOCGETC)
481c80476e4SDavid E. O'Brien     { "start",		C_SH(C_START), 	M_CHAR },
482c80476e4SDavid E. O'Brien # endif /* VSTART */
483c80476e4SDavid E. O'Brien # if defined(VSTOP) || defined(TIOCGETC)
484c80476e4SDavid E. O'Brien     { "stop",		C_SH(C_STOP), 	M_CHAR },
485c80476e4SDavid E. O'Brien # endif /* VSTOP */
486c80476e4SDavid E. O'Brien # if defined(VWERASE) || defined(TIOCGLTC)
487c80476e4SDavid E. O'Brien     { "werase",		C_SH(C_WERASE),	M_CHAR },
488c80476e4SDavid E. O'Brien # endif /* VWERASE */
489c80476e4SDavid E. O'Brien # if defined(VSUSP) || defined(TIOCGLTC)
490c80476e4SDavid E. O'Brien     { "susp",		C_SH(C_SUSP), 	M_CHAR },
491c80476e4SDavid E. O'Brien # endif /* VSUSP */
492c80476e4SDavid E. O'Brien # if defined(VDSUSP) || defined(TIOCGLTC)
493c80476e4SDavid E. O'Brien     { "dsusp",		C_SH(C_DSUSP), 	M_CHAR },
494c80476e4SDavid E. O'Brien # endif /* VDSUSP */
495c80476e4SDavid E. O'Brien # if defined(VREPRINT) || defined(TIOCGLTC)
496c80476e4SDavid E. O'Brien     { "reprint",	C_SH(C_REPRINT),M_CHAR },
497c80476e4SDavid E. O'Brien # endif /* WREPRINT */
498c80476e4SDavid E. O'Brien # if defined(VDISCARD) || defined(TIOCGLTC)
499c80476e4SDavid E. O'Brien     { "discard",	C_SH(C_DISCARD),M_CHAR },
500c80476e4SDavid E. O'Brien # endif /* VDISCARD */
501c80476e4SDavid E. O'Brien # if defined(VLNEXT) || defined(TIOCGLTC)
502c80476e4SDavid E. O'Brien     { "lnext",		C_SH(C_LNEXT), 	M_CHAR },
503c80476e4SDavid E. O'Brien # endif /* VLNEXT */
504c80476e4SDavid E. O'Brien # if defined(VSTATUS) || defined(TIOCGPAGE)
505c80476e4SDavid E. O'Brien     { "status",		C_SH(C_STATUS),	M_CHAR },
506c80476e4SDavid E. O'Brien # endif /* VSTATUS */
507c80476e4SDavid E. O'Brien # if defined(VPAGE) || defined(TIOCGPAGE)
508c80476e4SDavid E. O'Brien     { "page",		C_SH(C_PAGE), 	M_CHAR },
509c80476e4SDavid E. O'Brien # endif /* VPAGE */
510c80476e4SDavid E. O'Brien # if defined(VPGOFF) || defined(TIOCGPAGE)
511c80476e4SDavid E. O'Brien     { "pgoff",		C_SH(C_PGOFF), 	M_CHAR },
512c80476e4SDavid E. O'Brien # endif /* VPGOFF */
513c80476e4SDavid E. O'Brien # if defined(VKILL2)
514c80476e4SDavid E. O'Brien     { "kill2",		C_SH(C_KILL2), 	M_CHAR },
515c80476e4SDavid E. O'Brien # endif /* VKILL2 */
516c80476e4SDavid E. O'Brien # if defined(VBRK) || defined(TIOCGETC)
517c80476e4SDavid E. O'Brien     { "brk",		C_SH(C_BRK), 	M_CHAR },
518c80476e4SDavid E. O'Brien # endif /* VBRK */
519c80476e4SDavid E. O'Brien # if defined(VMIN)
520c80476e4SDavid E. O'Brien     { "min",		C_SH(C_MIN), 	M_CHAR },
521c80476e4SDavid E. O'Brien # endif /* VMIN */
522c80476e4SDavid E. O'Brien # if defined(VTIME)
523c80476e4SDavid E. O'Brien     { "time",		C_SH(C_TIME), 	M_CHAR },
524c80476e4SDavid E. O'Brien # endif /* VTIME */
525c80476e4SDavid E. O'Brien     { NULL, 0, -1 },
526c80476e4SDavid E. O'Brien };
527c80476e4SDavid E. O'Brien 
528c80476e4SDavid E. O'Brien /*
529c80476e4SDavid E. O'Brien  * If EAGAIN and/or EWOULDBLOCK are defined, we can't just return -1 in all
530c80476e4SDavid E. O'Brien  * situations where ioctl() does.
531c80476e4SDavid E. O'Brien  *
532c80476e4SDavid E. O'Brien  * On AIX 4.1.5 (and presumably some other versions and OSes), as you
533c80476e4SDavid E. O'Brien  * perform the manual test suite in the README, if you 'bg' vi immediately
534c80476e4SDavid E. O'Brien  * after suspending it, all is well, but if you wait a few seconds,
535c80476e4SDavid E. O'Brien  * usually ioctl() will return -1, which previously caused tty_setty() to
536c80476e4SDavid E. O'Brien  * return -1, causing Rawmode() to return -1, causing Inputl() to return
537c80476e4SDavid E. O'Brien  * 0, causing bgetc() to return -1, causing readc() to set doneinp to 1,
538c80476e4SDavid E. O'Brien  * causing process() to break out of the main loop, causing tcsh to exit
539c80476e4SDavid E. O'Brien  * prematurely.
540c80476e4SDavid E. O'Brien  *
541c80476e4SDavid E. O'Brien  * If ioctl()'s errno is EAGAIN/EWOULDBLOCK ("Resource temporarily
542c80476e4SDavid E. O'Brien  * unavailable"), apparently the tty is being messed with by the OS and we
543c80476e4SDavid E. O'Brien  * need to try again.  In my testing, ioctl() was never called more than
544c80476e4SDavid E. O'Brien  * twice in a row.
545c80476e4SDavid E. O'Brien  *
546c80476e4SDavid E. O'Brien  * -- Dan Harkless <dan@wave.eng.uci.edu>
547c80476e4SDavid E. O'Brien  *
548c80476e4SDavid E. O'Brien  * So, I retry all ioctl's in case others happen to fail too (christos)
549c80476e4SDavid E. O'Brien  */
550c80476e4SDavid E. O'Brien 
551c80476e4SDavid E. O'Brien #if defined(EAGAIN) && defined(EWOULDBLOCK) && (EWOULDBLOCK != EAGAIN)
552c80476e4SDavid E. O'Brien # define OKERROR(e) (((e) == EAGAIN) || ((e) == EWOULDBLOCK) || ((e) == EINTR))
553b2d5d167SMark Peek #elif defined(EAGAIN)
554c80476e4SDavid E. O'Brien # define OKERROR(e) (((e) == EAGAIN) || ((e) == EINTR))
555c80476e4SDavid E. O'Brien #elif defined(EWOULDBLOCK)
556c80476e4SDavid E. O'Brien # define OKERROR(e) (((e) == EWOULDBLOCK) || ((e) == EINTR))
557c80476e4SDavid E. O'Brien #else
558c80476e4SDavid E. O'Brien # define OKERROR(e) ((e) == EINTR)
559c80476e4SDavid E. O'Brien #endif
560c80476e4SDavid E. O'Brien 
5616767bd61SMark Peek #ifdef __NetBSD__
5626767bd61SMark Peek #define KLUDGE (errno == ENOTTY && count < 10)
5636767bd61SMark Peek #else
5646767bd61SMark Peek #define KLUDGE 0
5656767bd61SMark Peek #endif
5666767bd61SMark Peek 
567c80476e4SDavid E. O'Brien /* Retry a system call */
568c80476e4SDavid E. O'Brien #define RETRY(x)				\
56945e5710bSMark Peek do {						\
57045e5710bSMark Peek     int count;					\
57145e5710bSMark Peek 						\
5726767bd61SMark Peek     for (count = 0;; count++)			\
573c80476e4SDavid E. O'Brien 	if ((x) == -1) {			\
5746767bd61SMark Peek 	    if (OKERROR(errno) || KLUDGE)	\
575c80476e4SDavid E. O'Brien 		continue;			\
576c80476e4SDavid E. O'Brien 	    else				\
577c80476e4SDavid E. O'Brien 		return -1;			\
578c80476e4SDavid E. O'Brien 	}					\
579c80476e4SDavid E. O'Brien 	else					\
58045e5710bSMark Peek 	    break;				\
58145e5710bSMark Peek } while (0)
582c80476e4SDavid E. O'Brien 
583c80476e4SDavid E. O'Brien /*ARGSUSED*/
584c80476e4SDavid E. O'Brien void
dosetty(Char ** v,struct command * t)58545e5710bSMark Peek dosetty(Char **v, struct command *t)
586c80476e4SDavid E. O'Brien {
58745e5710bSMark Peek     const struct tcshmodes *m;
58845e5710bSMark Peek     char x, *d, *cmdname;
589c80476e4SDavid E. O'Brien     int aflag = 0;
590c80476e4SDavid E. O'Brien     Char *s;
591c80476e4SDavid E. O'Brien     int z = EX_IO;
592c80476e4SDavid E. O'Brien 
593c80476e4SDavid E. O'Brien     USE(t);
59445e5710bSMark Peek     cmdname = strsave(short2str(*v++));
59545e5710bSMark Peek     cleanup_push(cmdname, xfree);
59645e5710bSMark Peek     setname(cmdname);
597c80476e4SDavid E. O'Brien 
598c80476e4SDavid E. O'Brien     while (v && *v && v[0][0] == '-' && v[0][2] == '\0')
599c80476e4SDavid E. O'Brien 	switch (v[0][1]) {
600c80476e4SDavid E. O'Brien 	case 'a':
601c80476e4SDavid E. O'Brien 	    aflag++;
602c80476e4SDavid E. O'Brien 	    v++;
603c80476e4SDavid E. O'Brien 	    break;
604c80476e4SDavid E. O'Brien 	case 'd':
605c80476e4SDavid E. O'Brien 	    v++;
606c80476e4SDavid E. O'Brien 	    z = ED_IO;
607c80476e4SDavid E. O'Brien 	    break;
608c80476e4SDavid E. O'Brien 	case 'x':
609c80476e4SDavid E. O'Brien 	    v++;
610c80476e4SDavid E. O'Brien 	    z = EX_IO;
611c80476e4SDavid E. O'Brien 	    break;
612c80476e4SDavid E. O'Brien 	case 'q':
613c80476e4SDavid E. O'Brien 	    v++;
614c80476e4SDavid E. O'Brien 	    z = QU_IO;
615c80476e4SDavid E. O'Brien 	    break;
616c80476e4SDavid E. O'Brien 	default:
617c80476e4SDavid E. O'Brien 	    stderror(ERR_NAME | ERR_SYSTEM, short2str(v[0]),
618c80476e4SDavid E. O'Brien 		     CGETS(8, 1, "Unknown switch"));
619c80476e4SDavid E. O'Brien 	    break;
620c80476e4SDavid E. O'Brien 	}
621c80476e4SDavid E. O'Brien 
622c80476e4SDavid E. O'Brien     didsetty = 1;
623c80476e4SDavid E. O'Brien     if (!v || !*v) {
624c80476e4SDavid E. O'Brien 	int i = -1;
625c80476e4SDavid E. O'Brien 	int len = 0, st = 0, cu;
626c80476e4SDavid E. O'Brien 	for (m = modelist; m->m_name; m++) {
627c80476e4SDavid E. O'Brien 	    if (m->m_type != i) {
628c80476e4SDavid E. O'Brien 		xprintf("%s%s", i != -1 ? "\n" : "",
629c80476e4SDavid E. O'Brien 			ttylist[z][m->m_type].t_name);
630c80476e4SDavid E. O'Brien 		i = m->m_type;
631c80476e4SDavid E. O'Brien 		st = len = strlen(ttylist[z][m->m_type].t_name);
632c80476e4SDavid E. O'Brien 	    }
633*9ccc37e3SMark Peek 	    assert(i != -1);
634c80476e4SDavid E. O'Brien 
635c80476e4SDavid E. O'Brien 	    x = (ttylist[z][i].t_setmask & m->m_value) ? '+' : '\0';
636c80476e4SDavid E. O'Brien 	    x = (ttylist[z][i].t_clrmask & m->m_value) ? '-' : x;
637c80476e4SDavid E. O'Brien 
638c80476e4SDavid E. O'Brien 	    if (x != '\0' || aflag) {
639c80476e4SDavid E. O'Brien 		cu = strlen(m->m_name) + (x != '\0') + 1;
64045e5710bSMark Peek 		if (len + cu >= TermH) {
641c80476e4SDavid E. O'Brien 		    xprintf("\n%*s", st, "");
642c80476e4SDavid E. O'Brien 		    len = st + cu;
643c80476e4SDavid E. O'Brien 		}
644c80476e4SDavid E. O'Brien 		else
645c80476e4SDavid E. O'Brien 		    len += cu;
646c80476e4SDavid E. O'Brien 		if (x != '\0')
647c80476e4SDavid E. O'Brien 		    xprintf("%c%s ", x, m->m_name);
648c80476e4SDavid E. O'Brien 		else
649c80476e4SDavid E. O'Brien 		    xprintf("%s ", m->m_name);
650c80476e4SDavid E. O'Brien 	    }
651c80476e4SDavid E. O'Brien 	}
652c80476e4SDavid E. O'Brien 	xputchar('\n');
65345e5710bSMark Peek 	cleanup_until(cmdname);
654c80476e4SDavid E. O'Brien 	return;
655c80476e4SDavid E. O'Brien     }
656c80476e4SDavid E. O'Brien     while (v && (s = *v++)) {
657c80476e4SDavid E. O'Brien 	switch (*s) {
658c80476e4SDavid E. O'Brien 	case '+':
659c80476e4SDavid E. O'Brien 	case '-':
660c80476e4SDavid E. O'Brien 	    x = *s++;
661c80476e4SDavid E. O'Brien 	    break;
662c80476e4SDavid E. O'Brien 	default:
663c80476e4SDavid E. O'Brien 	    x = '\0';
664c80476e4SDavid E. O'Brien 	    break;
665c80476e4SDavid E. O'Brien 	}
666c80476e4SDavid E. O'Brien 	d = short2str(s);
667c80476e4SDavid E. O'Brien 	for (m = modelist; m->m_name; m++)
668c80476e4SDavid E. O'Brien 	    if (strcmp(m->m_name, d) == 0)
669c80476e4SDavid E. O'Brien 		break;
670c80476e4SDavid E. O'Brien 	if (!m->m_name)
671c80476e4SDavid E. O'Brien 	    stderror(ERR_NAME | ERR_SYSTEM, d, CGETS(8, 2, "Invalid argument"));
672c80476e4SDavid E. O'Brien 
673c80476e4SDavid E. O'Brien 	switch (x) {
674c80476e4SDavid E. O'Brien 	case '+':
675c80476e4SDavid E. O'Brien 	    ttylist[z][m->m_type].t_setmask |= m->m_value;
676c80476e4SDavid E. O'Brien 	    ttylist[z][m->m_type].t_clrmask &= ~m->m_value;
677c80476e4SDavid E. O'Brien 	    break;
678c80476e4SDavid E. O'Brien 	case '-':
679c80476e4SDavid E. O'Brien 	    ttylist[z][m->m_type].t_setmask &= ~m->m_value;
680c80476e4SDavid E. O'Brien 	    ttylist[z][m->m_type].t_clrmask |= m->m_value;
681c80476e4SDavid E. O'Brien 	    break;
682c80476e4SDavid E. O'Brien 	default:
683c80476e4SDavid E. O'Brien 	    ttylist[z][m->m_type].t_setmask &= ~m->m_value;
684c80476e4SDavid E. O'Brien 	    ttylist[z][m->m_type].t_clrmask &= ~m->m_value;
685c80476e4SDavid E. O'Brien 	    break;
686c80476e4SDavid E. O'Brien 	}
687c80476e4SDavid E. O'Brien     }
68845e5710bSMark Peek     cleanup_until(cmdname);
689c80476e4SDavid E. O'Brien } /* end dosetty */
690c80476e4SDavid E. O'Brien 
691c80476e4SDavid E. O'Brien int
tty_getty(int fd,ttydata_t * td)69245e5710bSMark Peek tty_getty(int fd, ttydata_t *td)
693c80476e4SDavid E. O'Brien {
694c80476e4SDavid E. O'Brien #ifdef POSIX
695c80476e4SDavid E. O'Brien     RETRY(tcgetattr(fd, &td->d_t));
696c80476e4SDavid E. O'Brien #else /* TERMIO || GSTTY */
697c80476e4SDavid E. O'Brien # ifdef TERMIO
698c80476e4SDavid E. O'Brien     RETRY(ioctl(fd, TCGETA,    (ioctl_t) &td->d_t));
699c80476e4SDavid E. O'Brien # else /* GSTTY */
700c80476e4SDavid E. O'Brien #  ifdef TIOCGETP
701c80476e4SDavid E. O'Brien     RETRY(ioctl(fd, TIOCGETP,  (ioctl_t) &td->d_t));
702c80476e4SDavid E. O'Brien #  endif /* TIOCGETP */
703c80476e4SDavid E. O'Brien #  ifdef TIOCGETC
704c80476e4SDavid E. O'Brien     RETRY(ioctl(fd, TIOCGETC,  (ioctl_t) &td->d_tc));
705c80476e4SDavid E. O'Brien #  endif /* TIOCGETC */
706c80476e4SDavid E. O'Brien #  ifdef TIOCGPAGE
707c80476e4SDavid E. O'Brien     RETRY(ioctl(fd, TIOCGPAGE, (ioctl_t) &td->d_pc));
708c80476e4SDavid E. O'Brien #  endif /* TIOCGPAGE */
709c80476e4SDavid E. O'Brien #  ifdef TIOCLGET
710c80476e4SDavid E. O'Brien     RETRY(ioctl(fd, TIOCLGET,  (ioctl_t) &td->d_lb));
711c80476e4SDavid E. O'Brien #  endif /* TIOCLGET */
712c80476e4SDavid E. O'Brien # endif /* TERMIO */
713c80476e4SDavid E. O'Brien #endif /* POSIX */
714c80476e4SDavid E. O'Brien 
715c80476e4SDavid E. O'Brien #ifdef TIOCGLTC
716c80476e4SDavid E. O'Brien     RETRY(ioctl(fd, TIOCGLTC,  (ioctl_t) &td->d_ltc));
717c80476e4SDavid E. O'Brien #endif /* TIOCGLTC */
718c80476e4SDavid E. O'Brien 
719c80476e4SDavid E. O'Brien     return 0;
720c80476e4SDavid E. O'Brien }
721c80476e4SDavid E. O'Brien 
722c80476e4SDavid E. O'Brien int
tty_setty(int fd,ttydata_t * td)72345e5710bSMark Peek tty_setty(int fd, ttydata_t *td)
724c80476e4SDavid E. O'Brien {
725c80476e4SDavid E. O'Brien #ifdef POSIX
72645e5710bSMark Peek     RETRY(xtcsetattr(fd, TCSADRAIN, &td->d_t));
727c80476e4SDavid E. O'Brien #else
728c80476e4SDavid E. O'Brien # ifdef TERMIO
729c80476e4SDavid E. O'Brien     RETRY(ioctl(fd, TCSETAW,    (ioctl_t) &td->d_t));
730c80476e4SDavid E. O'Brien # else
731c80476e4SDavid E. O'Brien #  ifdef TIOCSETN
732c80476e4SDavid E. O'Brien     RETRY(ioctl(fd, TIOCSETN,  (ioctl_t) &td->d_t));
733c80476e4SDavid E. O'Brien #  endif /* TIOCSETN */
734c80476e4SDavid E. O'Brien #  ifdef TIOCGETC
735c80476e4SDavid E. O'Brien     RETRY(ioctl(fd, TIOCSETC,  (ioctl_t) &td->d_tc));
736c80476e4SDavid E. O'Brien #  endif /* TIOCGETC */
737c80476e4SDavid E. O'Brien #  ifdef TIOCGPAGE
738c80476e4SDavid E. O'Brien     RETRY(ioctl(fd, TIOCSPAGE, (ioctl_t) &td->d_pc));
739c80476e4SDavid E. O'Brien #  endif /* TIOCGPAGE */
740c80476e4SDavid E. O'Brien #  ifdef TIOCLGET
741c80476e4SDavid E. O'Brien     RETRY(ioctl(fd, TIOCLSET,  (ioctl_t) &td->d_lb));
742c80476e4SDavid E. O'Brien #  endif /* TIOCLGET */
743c80476e4SDavid E. O'Brien # endif /* TERMIO */
744c80476e4SDavid E. O'Brien #endif /* POSIX */
745c80476e4SDavid E. O'Brien 
746c80476e4SDavid E. O'Brien #ifdef TIOCGLTC
747c80476e4SDavid E. O'Brien     RETRY(ioctl(fd, TIOCSLTC,  (ioctl_t) &td->d_ltc));
748c80476e4SDavid E. O'Brien #endif /* TIOCGLTC */
749c80476e4SDavid E. O'Brien 
750c80476e4SDavid E. O'Brien     return 0;
751c80476e4SDavid E. O'Brien }
752c80476e4SDavid E. O'Brien 
753c80476e4SDavid E. O'Brien void
tty_getchar(ttydata_t * td,unsigned char * s)75445e5710bSMark Peek tty_getchar(ttydata_t *td, unsigned char *s)
755c80476e4SDavid E. O'Brien {
756c80476e4SDavid E. O'Brien #ifdef TIOCGLTC
757c80476e4SDavid E. O'Brien     {
758c80476e4SDavid E. O'Brien 	struct ltchars *n = &td->d_ltc;
759c80476e4SDavid E. O'Brien 
760c80476e4SDavid E. O'Brien 	s[C_SUSP]	= n->t_suspc;
761c80476e4SDavid E. O'Brien 	s[C_DSUSP]	= n->t_dsuspc;
762c80476e4SDavid E. O'Brien 	s[C_REPRINT]	= n->t_rprntc;
763c80476e4SDavid E. O'Brien 	s[C_DISCARD]	= n->t_flushc;
764c80476e4SDavid E. O'Brien 	s[C_WERASE]	= n->t_werasc;
765c80476e4SDavid E. O'Brien 	s[C_LNEXT]	= n->t_lnextc;
766c80476e4SDavid E. O'Brien     }
767c80476e4SDavid E. O'Brien #endif /* TIOCGLTC */
768c80476e4SDavid E. O'Brien 
769c80476e4SDavid E. O'Brien #if defined(POSIX) || defined(TERMIO)
770c80476e4SDavid E. O'Brien     {
771c80476e4SDavid E. O'Brien # ifdef POSIX
772c80476e4SDavid E. O'Brien 	struct termios *n = &td->d_t;
773c80476e4SDavid E. O'Brien # else
774c80476e4SDavid E. O'Brien 	struct termio *n = &td->d_t;
775c80476e4SDavid E. O'Brien # endif /* POSIX */
776c80476e4SDavid E. O'Brien 
777c80476e4SDavid E. O'Brien # ifdef VINTR
778c80476e4SDavid E. O'Brien 	s[C_INTR]	= n->c_cc[VINTR];
779c80476e4SDavid E. O'Brien # endif /* VINTR */
780c80476e4SDavid E. O'Brien # ifdef VQUIT
781c80476e4SDavid E. O'Brien 	s[C_QUIT]	= n->c_cc[VQUIT];
782c80476e4SDavid E. O'Brien # endif /* VQUIT */
783c80476e4SDavid E. O'Brien # ifdef VERASE
784c80476e4SDavid E. O'Brien 	s[C_ERASE]	= n->c_cc[VERASE];
785c80476e4SDavid E. O'Brien # endif /* VERASE */
786c80476e4SDavid E. O'Brien # ifdef VKILL
787c80476e4SDavid E. O'Brien 	s[C_KILL]	= n->c_cc[VKILL];
788c80476e4SDavid E. O'Brien # endif /* VKILL */
789c80476e4SDavid E. O'Brien # ifdef VEOF
790c80476e4SDavid E. O'Brien 	s[C_EOF]	= n->c_cc[VEOF];
791c80476e4SDavid E. O'Brien # endif /* VEOF */
792c80476e4SDavid E. O'Brien # ifdef VEOL
793c80476e4SDavid E. O'Brien 	s[C_EOL]	= n->c_cc[VEOL];
794c80476e4SDavid E. O'Brien # endif /* VEOL */
795c80476e4SDavid E. O'Brien # ifdef VEOL2
796c80476e4SDavid E. O'Brien 	s[C_EOL2]	= n->c_cc[VEOL2];
797c80476e4SDavid E. O'Brien # endif  /* VEOL2 */
798c80476e4SDavid E. O'Brien # ifdef VSWTCH
799c80476e4SDavid E. O'Brien 	s[C_SWTCH]	= n->c_cc[VSWTCH];
800c80476e4SDavid E. O'Brien # endif /* VSWTCH */
801c80476e4SDavid E. O'Brien # ifdef VDSWTCH
802c80476e4SDavid E. O'Brien 	s[C_DSWTCH]	= n->c_cc[VDSWTCH];
803c80476e4SDavid E. O'Brien # endif /* VDSWTCH */
804c80476e4SDavid E. O'Brien # ifdef VERASE2
805c80476e4SDavid E. O'Brien 	s[C_ERASE2]	= n->c_cc[VERASE2];
806c80476e4SDavid E. O'Brien # endif /* VERASE2 */
807c80476e4SDavid E. O'Brien # ifdef VSTART
808c80476e4SDavid E. O'Brien 	s[C_START]	= n->c_cc[VSTART];
809c80476e4SDavid E. O'Brien # endif /* VSTART */
810c80476e4SDavid E. O'Brien # ifdef VSTOP
811c80476e4SDavid E. O'Brien 	s[C_STOP]	= n->c_cc[VSTOP];
812c80476e4SDavid E. O'Brien # endif /* VSTOP */
813c80476e4SDavid E. O'Brien # ifdef VWERASE
814c80476e4SDavid E. O'Brien 	s[C_WERASE]	= n->c_cc[VWERASE];
815c80476e4SDavid E. O'Brien # endif /* VWERASE */
816c80476e4SDavid E. O'Brien # ifdef VSUSP
817c80476e4SDavid E. O'Brien 	s[C_SUSP]	= n->c_cc[VSUSP];
818c80476e4SDavid E. O'Brien # endif /* VSUSP */
819c80476e4SDavid E. O'Brien # ifdef VDSUSP
820c80476e4SDavid E. O'Brien 	s[C_DSUSP]	= n->c_cc[VDSUSP];
821c80476e4SDavid E. O'Brien # endif /* VDSUSP */
822c80476e4SDavid E. O'Brien # ifdef VREPRINT
823c80476e4SDavid E. O'Brien 	s[C_REPRINT]	= n->c_cc[VREPRINT];
824c80476e4SDavid E. O'Brien # endif /* WREPRINT */
825c80476e4SDavid E. O'Brien # ifdef VDISCARD
826c80476e4SDavid E. O'Brien 	s[C_DISCARD]	= n->c_cc[VDISCARD];
827c80476e4SDavid E. O'Brien # endif /* VDISCARD */
828c80476e4SDavid E. O'Brien # ifdef VLNEXT
829c80476e4SDavid E. O'Brien 	s[C_LNEXT]	= n->c_cc[VLNEXT];
830c80476e4SDavid E. O'Brien # endif /* VLNEXT */
831c80476e4SDavid E. O'Brien # ifdef VSTATUS
832c80476e4SDavid E. O'Brien 	s[C_STATUS]	= n->c_cc[VSTATUS];
833c80476e4SDavid E. O'Brien # endif /* VSTATUS */
834c80476e4SDavid E. O'Brien # ifdef VPAGE
835c80476e4SDavid E. O'Brien 	s[C_PAGE]	= n->c_cc[VPAGE];
836c80476e4SDavid E. O'Brien # endif /* VPAGE */
837c80476e4SDavid E. O'Brien # ifdef VPGOFF
838c80476e4SDavid E. O'Brien 	s[C_PGOFF]	= n->c_cc[VPGOFF];
839c80476e4SDavid E. O'Brien # endif /* VPGOFF */
840c80476e4SDavid E. O'Brien # ifdef VKILL2
841c80476e4SDavid E. O'Brien 	s[C_KILL2]	= n->c_cc[VKILL2];
842c80476e4SDavid E. O'Brien # endif /* KILL2 */
843c80476e4SDavid E. O'Brien # ifdef VMIN
844c80476e4SDavid E. O'Brien 	s[C_MIN]	= n->c_cc[VMIN];
845c80476e4SDavid E. O'Brien # endif /* VMIN */
846c80476e4SDavid E. O'Brien # ifdef VTIME
847c80476e4SDavid E. O'Brien 	s[C_TIME]	= n->c_cc[VTIME];
848c80476e4SDavid E. O'Brien # endif /* VTIME */
849c80476e4SDavid E. O'Brien     }
850c80476e4SDavid E. O'Brien 
851c80476e4SDavid E. O'Brien #else /* SGTTY */
852c80476e4SDavid E. O'Brien 
853c80476e4SDavid E. O'Brien # ifdef TIOCGPAGE
854c80476e4SDavid E. O'Brien     {
855c80476e4SDavid E. O'Brien 	struct ttypagestat *n = &td->d_pc;
856c80476e4SDavid E. O'Brien 
857c80476e4SDavid E. O'Brien 	s[C_STATUS]	= n->tps_statc;
858c80476e4SDavid E. O'Brien 	s[C_PAGE]	= n->tps_pagec;
859c80476e4SDavid E. O'Brien 	s[C_PGOFF]	= n->tps_pgoffc;
860c80476e4SDavid E. O'Brien     }
861c80476e4SDavid E. O'Brien # endif /* TIOCGPAGE */
862c80476e4SDavid E. O'Brien 
863c80476e4SDavid E. O'Brien # ifdef TIOCGETC
864c80476e4SDavid E. O'Brien     {
865c80476e4SDavid E. O'Brien 	struct tchars *n = &td->d_tc;
866c80476e4SDavid E. O'Brien 
867c80476e4SDavid E. O'Brien 	s[C_INTR]	= n->t_intrc;
868c80476e4SDavid E. O'Brien 	s[C_QUIT]	= n->t_quitc;
869c80476e4SDavid E. O'Brien 	s[C_START]	= n->t_startc;
870c80476e4SDavid E. O'Brien 	s[C_STOP]	= n->t_stopc;
871c80476e4SDavid E. O'Brien 	s[C_EOF]	= n->t_eofc;
872c80476e4SDavid E. O'Brien 	s[C_BRK]	= n->t_brkc;
873c80476e4SDavid E. O'Brien     }
874c80476e4SDavid E. O'Brien # endif /* TIOCGETC */
875c80476e4SDavid E. O'Brien 
876c80476e4SDavid E. O'Brien # ifdef TIOCGETP
877c80476e4SDavid E. O'Brien     {
878c80476e4SDavid E. O'Brien 	struct sgttyb *n = &td->d_t;
879c80476e4SDavid E. O'Brien 
880c80476e4SDavid E. O'Brien 	s[C_ERASE]	= n->sg_erase;
881c80476e4SDavid E. O'Brien 	s[C_KILL]	= n->sg_kill;
882c80476e4SDavid E. O'Brien     }
883c80476e4SDavid E. O'Brien # endif /* TIOCGETP */
884c80476e4SDavid E. O'Brien #endif /* !POSIX || TERMIO */
885c80476e4SDavid E. O'Brien 
886c80476e4SDavid E. O'Brien } /* tty_getchar */
887c80476e4SDavid E. O'Brien 
888c80476e4SDavid E. O'Brien 
889c80476e4SDavid E. O'Brien void
tty_setchar(ttydata_t * td,unsigned char * s)89045e5710bSMark Peek tty_setchar(ttydata_t *td, unsigned char *s)
891c80476e4SDavid E. O'Brien {
892c80476e4SDavid E. O'Brien #ifdef TIOCGLTC
893c80476e4SDavid E. O'Brien     {
894c80476e4SDavid E. O'Brien 	struct ltchars *n = &td->d_ltc;
895c80476e4SDavid E. O'Brien 
896c80476e4SDavid E. O'Brien 	n->t_suspc 		= s[C_SUSP];
897c80476e4SDavid E. O'Brien 	n->t_dsuspc		= s[C_DSUSP];
898c80476e4SDavid E. O'Brien 	n->t_rprntc		= s[C_REPRINT];
899c80476e4SDavid E. O'Brien 	n->t_flushc		= s[C_DISCARD];
900c80476e4SDavid E. O'Brien 	n->t_werasc		= s[C_WERASE];
901c80476e4SDavid E. O'Brien 	n->t_lnextc		= s[C_LNEXT];
902c80476e4SDavid E. O'Brien     }
903c80476e4SDavid E. O'Brien #endif /* TIOCGLTC */
904c80476e4SDavid E. O'Brien 
905c80476e4SDavid E. O'Brien #if defined(POSIX) || defined(TERMIO)
906c80476e4SDavid E. O'Brien     {
907c80476e4SDavid E. O'Brien # ifdef POSIX
908c80476e4SDavid E. O'Brien 	struct termios *n = &td->d_t;
909c80476e4SDavid E. O'Brien # else
910c80476e4SDavid E. O'Brien 	struct termio *n = &td->d_t;
911c80476e4SDavid E. O'Brien # endif /* POSIX */
912c80476e4SDavid E. O'Brien 
913c80476e4SDavid E. O'Brien # ifdef VINTR
914c80476e4SDavid E. O'Brien 	n->c_cc[VINTR]		= s[C_INTR];
915c80476e4SDavid E. O'Brien # endif /* VINTR */
916c80476e4SDavid E. O'Brien # ifdef VQUIT
917c80476e4SDavid E. O'Brien 	n->c_cc[VQUIT]		= s[C_QUIT];
918c80476e4SDavid E. O'Brien # endif /* VQUIT */
919c80476e4SDavid E. O'Brien # ifdef VERASE
920c80476e4SDavid E. O'Brien 	n->c_cc[VERASE]		= s[C_ERASE];
921c80476e4SDavid E. O'Brien # endif /* VERASE */
922c80476e4SDavid E. O'Brien # ifdef VKILL
923c80476e4SDavid E. O'Brien 	n->c_cc[VKILL]		= s[C_KILL];
924c80476e4SDavid E. O'Brien # endif /* VKILL */
925c80476e4SDavid E. O'Brien # ifdef VEOF
926c80476e4SDavid E. O'Brien 	n->c_cc[VEOF]		= s[C_EOF];
927c80476e4SDavid E. O'Brien # endif /* VEOF */
928c80476e4SDavid E. O'Brien # ifdef VEOL
929c80476e4SDavid E. O'Brien 	n->c_cc[VEOL]		= s[C_EOL];
930c80476e4SDavid E. O'Brien # endif /* VEOL */
931c80476e4SDavid E. O'Brien # ifdef VEOL2
932c80476e4SDavid E. O'Brien 	n->c_cc[VEOL2]		= s[C_EOL2];
933c80476e4SDavid E. O'Brien # endif  /* VEOL2 */
934c80476e4SDavid E. O'Brien # ifdef VSWTCH
935c80476e4SDavid E. O'Brien 	n->c_cc[VSWTCH]		= s[C_SWTCH];
936c80476e4SDavid E. O'Brien # endif /* VSWTCH */
937c80476e4SDavid E. O'Brien # ifdef VDSWTCH
938c80476e4SDavid E. O'Brien 	n->c_cc[VDSWTCH]	= s[C_DSWTCH];
939c80476e4SDavid E. O'Brien # endif /* VDSWTCH */
940c80476e4SDavid E. O'Brien # ifdef VERASE2
941c80476e4SDavid E. O'Brien 	n->c_cc[VERASE2]	= s[C_ERASE2];
942c80476e4SDavid E. O'Brien # endif /* VERASE2 */
943c80476e4SDavid E. O'Brien # ifdef VSTART
944c80476e4SDavid E. O'Brien 	n->c_cc[VSTART]		= s[C_START];
945c80476e4SDavid E. O'Brien # endif /* VSTART */
946c80476e4SDavid E. O'Brien # ifdef VSTOP
947c80476e4SDavid E. O'Brien 	n->c_cc[VSTOP]		= s[C_STOP];
948c80476e4SDavid E. O'Brien # endif /* VSTOP */
949c80476e4SDavid E. O'Brien # ifdef VWERASE
950c80476e4SDavid E. O'Brien 	n->c_cc[VWERASE]	= s[C_WERASE];
951c80476e4SDavid E. O'Brien # endif /* VWERASE */
952c80476e4SDavid E. O'Brien # ifdef VSUSP
953c80476e4SDavid E. O'Brien 	n->c_cc[VSUSP]		= s[C_SUSP];
954c80476e4SDavid E. O'Brien # endif /* VSUSP */
955c80476e4SDavid E. O'Brien # ifdef VDSUSP
956c80476e4SDavid E. O'Brien 	n->c_cc[VDSUSP]		= s[C_DSUSP];
957c80476e4SDavid E. O'Brien # endif /* VDSUSP */
958c80476e4SDavid E. O'Brien # ifdef VREPRINT
959c80476e4SDavid E. O'Brien 	n->c_cc[VREPRINT]	= s[C_REPRINT];
960c80476e4SDavid E. O'Brien # endif /* WREPRINT */
961c80476e4SDavid E. O'Brien # ifdef VDISCARD
962c80476e4SDavid E. O'Brien 	n->c_cc[VDISCARD]	= s[C_DISCARD];
963c80476e4SDavid E. O'Brien # endif /* VDISCARD */
964c80476e4SDavid E. O'Brien # ifdef VLNEXT
965c80476e4SDavid E. O'Brien 	n->c_cc[VLNEXT]		= s[C_LNEXT];
966c80476e4SDavid E. O'Brien # endif /* VLNEXT */
967c80476e4SDavid E. O'Brien # ifdef VSTATUS
968c80476e4SDavid E. O'Brien 	n->c_cc[VSTATUS]	= s[C_STATUS];
969c80476e4SDavid E. O'Brien # endif /* VSTATUS */
970c80476e4SDavid E. O'Brien # ifdef VPAGE
971c80476e4SDavid E. O'Brien 	n->c_cc[VPAGE]		= s[C_PAGE];
972c80476e4SDavid E. O'Brien # endif /* VPAGE */
973c80476e4SDavid E. O'Brien # ifdef VPGOFF
974c80476e4SDavid E. O'Brien 	n->c_cc[VPGOFF]		= s[C_PGOFF];
975c80476e4SDavid E. O'Brien # endif /* VPGOFF */
976c80476e4SDavid E. O'Brien # ifdef VKILL2
977c80476e4SDavid E. O'Brien 	n->c_cc[VKILL2]		= s[C_KILL2];
978c80476e4SDavid E. O'Brien # endif /* VKILL2 */
979c80476e4SDavid E. O'Brien # ifdef VMIN
980c80476e4SDavid E. O'Brien 	n->c_cc[VMIN]		= s[C_MIN];
981c80476e4SDavid E. O'Brien # endif /* VMIN */
982c80476e4SDavid E. O'Brien # ifdef VTIME
983c80476e4SDavid E. O'Brien 	n->c_cc[VTIME]		= s[C_TIME];
984c80476e4SDavid E. O'Brien # endif /* VTIME */
985c80476e4SDavid E. O'Brien     }
986c80476e4SDavid E. O'Brien 
987c80476e4SDavid E. O'Brien #else /* GSTTY */
988c80476e4SDavid E. O'Brien 
989c80476e4SDavid E. O'Brien # ifdef TIOCGPAGE
990c80476e4SDavid E. O'Brien     {
991c80476e4SDavid E. O'Brien 	struct ttypagestat *n = &td->d_pc;
992c80476e4SDavid E. O'Brien 
993c80476e4SDavid E. O'Brien 	n->tps_length		= 0;
994c80476e4SDavid E. O'Brien 	n->tps_lpos		= 0;
995c80476e4SDavid E. O'Brien 	n->tps_statc		= s[C_STATUS];
996c80476e4SDavid E. O'Brien 	n->tps_pagec		= s[C_PAGE];
997c80476e4SDavid E. O'Brien 	n->tps_pgoffc		= s[C_PGOFF];
998c80476e4SDavid E. O'Brien 	n->tps_flag		= 0;
999c80476e4SDavid E. O'Brien     }
1000c80476e4SDavid E. O'Brien # endif /* TIOCGPAGE */
1001c80476e4SDavid E. O'Brien 
1002c80476e4SDavid E. O'Brien # ifdef TIOCGETC
1003c80476e4SDavid E. O'Brien     {
1004c80476e4SDavid E. O'Brien 	struct tchars *n = &td->d_tc;
1005c80476e4SDavid E. O'Brien 	n->t_intrc		= s[C_INTR];
1006c80476e4SDavid E. O'Brien 	n->t_quitc		= s[C_QUIT];
1007c80476e4SDavid E. O'Brien 	n->t_startc		= s[C_START];
1008c80476e4SDavid E. O'Brien 	n->t_stopc		= s[C_STOP];
1009c80476e4SDavid E. O'Brien 	n->t_eofc		= s[C_EOF];
1010c80476e4SDavid E. O'Brien 	n->t_brkc		= s[C_BRK];
1011c80476e4SDavid E. O'Brien     }
1012c80476e4SDavid E. O'Brien # endif /* TIOCGETC */
1013c80476e4SDavid E. O'Brien 
1014c80476e4SDavid E. O'Brien # ifdef TIOCGETP
1015c80476e4SDavid E. O'Brien     {
1016c80476e4SDavid E. O'Brien 	struct sgttyb *n = &td->d_t;
1017c80476e4SDavid E. O'Brien 
1018c80476e4SDavid E. O'Brien 	n->sg_erase		= s[C_ERASE];
1019c80476e4SDavid E. O'Brien 	n->sg_kill		= s[C_KILL];
1020c80476e4SDavid E. O'Brien     }
1021c80476e4SDavid E. O'Brien # endif /* TIOCGETP */
1022c80476e4SDavid E. O'Brien #endif /* !POSIX || TERMIO */
1023c80476e4SDavid E. O'Brien 
1024c80476e4SDavid E. O'Brien } /* tty_setchar */
1025c80476e4SDavid E. O'Brien 
1026c80476e4SDavid E. O'Brien speed_t
tty_getspeed(ttydata_t * td)102745e5710bSMark Peek tty_getspeed(ttydata_t *td)
1028c80476e4SDavid E. O'Brien {
1029c80476e4SDavid E. O'Brien     speed_t spd;
1030c80476e4SDavid E. O'Brien 
1031c80476e4SDavid E. O'Brien #ifdef POSIX
1032c80476e4SDavid E. O'Brien     if ((spd = cfgetispeed(&td->d_t)) == 0)
1033c80476e4SDavid E. O'Brien 	spd = cfgetospeed(&td->d_t);
1034c80476e4SDavid E. O'Brien #else /* ! POSIX */
1035c80476e4SDavid E. O'Brien # ifdef TERMIO
1036c80476e4SDavid E. O'Brien #  ifdef CBAUD
1037c80476e4SDavid E. O'Brien     spd = td->d_t.c_cflag & CBAUD;
1038c80476e4SDavid E. O'Brien #  else
1039c80476e4SDavid E. O'Brien     spd = 0;
1040c80476e4SDavid E. O'Brien #  endif
1041c80476e4SDavid E. O'Brien # else /* SGTTY */
1042c80476e4SDavid E. O'Brien     spd = td->d_t.sg_ispeed;
1043c80476e4SDavid E. O'Brien # endif /* TERMIO */
1044c80476e4SDavid E. O'Brien #endif /* POSIX */
1045c80476e4SDavid E. O'Brien 
1046c80476e4SDavid E. O'Brien     return spd;
1047c80476e4SDavid E. O'Brien } /* end tty_getspeed */
1048c80476e4SDavid E. O'Brien 
1049c80476e4SDavid E. O'Brien int
tty_gettabs(ttydata_t * td)105045e5710bSMark Peek tty_gettabs(ttydata_t *td)
1051c80476e4SDavid E. O'Brien {
1052c80476e4SDavid E. O'Brien #if defined(POSIX) || defined(TERMIO)
1053c80476e4SDavid E. O'Brien     return ((td->d_t.c_oflag & TAB3) == TAB3) ? 0 : 1;
1054c80476e4SDavid E. O'Brien #else /* SGTTY */
1055c80476e4SDavid E. O'Brien     return (td->d_t.sg_flags & XTABS) == XTABS ? 0 : 1;
1056c80476e4SDavid E. O'Brien #endif /* POSIX || TERMIO */
1057c80476e4SDavid E. O'Brien } /* end tty_gettabs */
1058c80476e4SDavid E. O'Brien 
1059c80476e4SDavid E. O'Brien int
tty_geteightbit(ttydata_t * td)106045e5710bSMark Peek tty_geteightbit(ttydata_t *td)
1061c80476e4SDavid E. O'Brien {
1062c80476e4SDavid E. O'Brien #if defined(POSIX) || defined(TERMIO)
1063c80476e4SDavid E. O'Brien     return (td->d_t.c_cflag & CSIZE) == CS8;
1064c80476e4SDavid E. O'Brien #else /* SGTTY */
1065c80476e4SDavid E. O'Brien     return td->d_lb & (LPASS8 | LLITOUT);
1066c80476e4SDavid E. O'Brien #endif /* POSIX || TERMIO */
1067c80476e4SDavid E. O'Brien } /* end tty_geteightbit */
1068c80476e4SDavid E. O'Brien 
1069c80476e4SDavid E. O'Brien int
tty_cooked_mode(ttydata_t * td)107045e5710bSMark Peek tty_cooked_mode(ttydata_t *td)
1071c80476e4SDavid E. O'Brien {
1072c80476e4SDavid E. O'Brien #if defined(POSIX) || defined(TERMIO)
1073c80476e4SDavid E. O'Brien     return (td->d_t.c_lflag & ICANON);
1074c80476e4SDavid E. O'Brien #else /* SGTTY */
1075c80476e4SDavid E. O'Brien     return !(td->d_t.sg_flags & (RAW | CBREAK));
1076c80476e4SDavid E. O'Brien #endif /* POSIX || TERMIO */
1077c80476e4SDavid E. O'Brien } /* end tty_cooked_mode */
1078c80476e4SDavid E. O'Brien 
1079c80476e4SDavid E. O'Brien #ifdef _IBMR2
1080c80476e4SDavid E. O'Brien void
tty_setdisc(int fd,int dis)108145e5710bSMark Peek tty_setdisc(int fd, int dis)
1082c80476e4SDavid E. O'Brien {
108323338178SMark Peek     static int edit_discipline = 0;
1084c80476e4SDavid E. O'Brien     static union txname tx_disc;
1085c80476e4SDavid E. O'Brien     extern char strPOSIX[];
1086c80476e4SDavid E. O'Brien 
1087c80476e4SDavid E. O'Brien     switch (dis) {
1088c80476e4SDavid E. O'Brien     case EX_IO:
1089c80476e4SDavid E. O'Brien 	if (edit_discipline) {
1090c80476e4SDavid E. O'Brien 	    if (ioctl(fd, TXSETLD, (ioctl_t) & tx_disc) == -1)
1091c80476e4SDavid E. O'Brien 		return;
1092c80476e4SDavid E. O'Brien 	    edit_discipline = 0;
1093c80476e4SDavid E. O'Brien 	}
1094c80476e4SDavid E. O'Brien 	return;
1095c80476e4SDavid E. O'Brien 
1096c80476e4SDavid E. O'Brien     case ED_IO:
1097c80476e4SDavid E. O'Brien 	tx_disc.tx_which = 0;
1098c80476e4SDavid E. O'Brien 	if (ioctl(fd, TXGETLD, (ioctl_t) & tx_disc) == -1)
1099c80476e4SDavid E. O'Brien 	    return;
1100c80476e4SDavid E. O'Brien 	if (strcmp(tx_disc.tx_name, strPOSIX) != 0) {
1101c80476e4SDavid E. O'Brien 	    edit_discipline = 1;
1102c80476e4SDavid E. O'Brien 	    if (ioctl(fd, TXSETLD, (ioctl_t) strPOSIX) == -1)
1103c80476e4SDavid E. O'Brien 	    return;
1104c80476e4SDavid E. O'Brien 	}
1105c80476e4SDavid E. O'Brien 	return;
1106c80476e4SDavid E. O'Brien 
1107c80476e4SDavid E. O'Brien     default:
1108c80476e4SDavid E. O'Brien 	return;
1109c80476e4SDavid E. O'Brien     }
1110c80476e4SDavid E. O'Brien } /* end tty_setdisc */
1111c80476e4SDavid E. O'Brien #endif /* _IBMR2 */
1112c80476e4SDavid E. O'Brien 
1113c80476e4SDavid E. O'Brien #ifdef DEBUG_TTY
1114c80476e4SDavid E. O'Brien static void
tty_printchar(unsigned char * s)111545e5710bSMark Peek tty_printchar(unsigned char *s)
1116c80476e4SDavid E. O'Brien {
1117c80476e4SDavid E. O'Brien     struct tcshmodes *m;
1118c80476e4SDavid E. O'Brien     int i;
1119c80476e4SDavid E. O'Brien 
1120c80476e4SDavid E. O'Brien     for (i = 0; i < C_NCC; i++) {
1121c80476e4SDavid E. O'Brien 	for (m = modelist; m->m_name; m++)
1122c80476e4SDavid E. O'Brien 	    if (m->m_type == M_CHAR && C_SH(i) == m->m_value)
1123c80476e4SDavid E. O'Brien 		break;
1124c80476e4SDavid E. O'Brien 	if (m->m_name)
1125c80476e4SDavid E. O'Brien 	    xprintf("%s ^%c ", m->m_name, s[i] + 'A' - 1);
1126c80476e4SDavid E. O'Brien 	if (i % 5 == 0)
1127c80476e4SDavid E. O'Brien 	    xputchar('\n');
1128c80476e4SDavid E. O'Brien     }
1129c80476e4SDavid E. O'Brien     xputchar('\n');
1130c80476e4SDavid E. O'Brien }
1131c80476e4SDavid E. O'Brien #endif /* DEBUG_TTY */
11323b6eaa7bSAndrey A. Chernov #else /* WINNT_NATIVE */
1133c80476e4SDavid E. O'Brien int
tty_cooked_mode(void * td)113445e5710bSMark Peek tty_cooked_mode(void *td)
1135c80476e4SDavid E. O'Brien {
1136c80476e4SDavid E. O'Brien     return do_nt_check_cooked_mode();
1137c80476e4SDavid E. O'Brien }
11383b6eaa7bSAndrey A. Chernov #endif /* !WINNT_NATIVE */
1139