tty.c revision 1.70 1 1.70 christos /* $NetBSD: tty.c,v 1.70 2021/07/14 07:47:23 christos Exp $ */
2 1.2 lukem
3 1.1 cgd /*-
4 1.1 cgd * Copyright (c) 1992, 1993
5 1.1 cgd * The Regents of the University of California. All rights reserved.
6 1.1 cgd *
7 1.1 cgd * This code is derived from software contributed to Berkeley by
8 1.1 cgd * Christos Zoulas of Cornell University.
9 1.1 cgd *
10 1.1 cgd * Redistribution and use in source and binary forms, with or without
11 1.1 cgd * modification, are permitted provided that the following conditions
12 1.1 cgd * are met:
13 1.1 cgd * 1. Redistributions of source code must retain the above copyright
14 1.1 cgd * notice, this list of conditions and the following disclaimer.
15 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright
16 1.1 cgd * notice, this list of conditions and the following disclaimer in the
17 1.1 cgd * documentation and/or other materials provided with the distribution.
18 1.18 agc * 3. Neither the name of the University nor the names of its contributors
19 1.1 cgd * may be used to endorse or promote products derived from this software
20 1.1 cgd * without specific prior written permission.
21 1.1 cgd *
22 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26 1.1 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 1.1 cgd * SUCH DAMAGE.
33 1.1 cgd */
34 1.1 cgd
35 1.16 christos #include "config.h"
36 1.1 cgd #if !defined(lint) && !defined(SCCSID)
37 1.2 lukem #if 0
38 1.1 cgd static char sccsid[] = "@(#)tty.c 8.1 (Berkeley) 6/4/93";
39 1.2 lukem #else
40 1.70 christos __RCSID("$NetBSD: tty.c,v 1.70 2021/07/14 07:47:23 christos Exp $");
41 1.2 lukem #endif
42 1.1 cgd #endif /* not lint && not SCCSID */
43 1.1 cgd
44 1.11 simonb /*
45 1.1 cgd * tty.c: tty interface stuff
46 1.1 cgd */
47 1.19 christos #include <assert.h>
48 1.28 sketch #include <errno.h>
49 1.46 christos #include <stdlib.h> /* for abort */
50 1.56 christos #include <string.h>
51 1.57 christos #include <strings.h> /* for ffs */
52 1.57 christos #include <unistd.h> /* for isatty */
53 1.52 christos
54 1.32 christos #include "el.h"
55 1.64 christos #include "fcns.h"
56 1.55 christos #include "parse.h"
57 1.1 cgd
58 1.1 cgd typedef struct ttymodes_t {
59 1.14 jdolecek const char *m_name;
60 1.23 lukem unsigned int m_value;
61 1.13 lukem int m_type;
62 1.13 lukem } ttymodes_t;
63 1.1 cgd
64 1.1 cgd typedef struct ttymap_t {
65 1.51 christos wint_t nch, och; /* Internal and termio rep of chars */
66 1.13 lukem el_action_t bind[3]; /* emacs, vi, and vi-cmd */
67 1.16 christos } ttymap_t;
68 1.1 cgd
69 1.1 cgd
70 1.63 christos static const ttyperm_t ttyperm = {
71 1.13 lukem {
72 1.13 lukem {"iflag:", ICRNL, (INLCR | IGNCR)},
73 1.13 lukem {"oflag:", (OPOST | ONLCR), ONLRET},
74 1.13 lukem {"cflag:", 0, 0},
75 1.13 lukem {"lflag:", (ISIG | ICANON | ECHO | ECHOE | ECHOCTL | IEXTEN),
76 1.13 lukem (NOFLSH | ECHONL | EXTPROC | FLUSHO)},
77 1.13 lukem {"chars:", 0, 0},
78 1.13 lukem },
79 1.13 lukem {
80 1.13 lukem {"iflag:", (INLCR | ICRNL), IGNCR},
81 1.13 lukem {"oflag:", (OPOST | ONLCR), ONLRET},
82 1.13 lukem {"cflag:", 0, 0},
83 1.13 lukem {"lflag:", ISIG,
84 1.13 lukem (NOFLSH | ICANON | ECHO | ECHOK | ECHONL | EXTPROC | IEXTEN | FLUSHO)},
85 1.13 lukem {"chars:", (C_SH(C_MIN) | C_SH(C_TIME) | C_SH(C_SWTCH) | C_SH(C_DSWTCH) |
86 1.13 lukem C_SH(C_SUSP) | C_SH(C_DSUSP) | C_SH(C_EOL) | C_SH(C_DISCARD) |
87 1.13 lukem C_SH(C_PGOFF) | C_SH(C_PAGE) | C_SH(C_STATUS)), 0}
88 1.13 lukem },
89 1.13 lukem {
90 1.13 lukem {"iflag:", 0, IXON | IXOFF | INLCR | ICRNL},
91 1.13 lukem {"oflag:", 0, 0},
92 1.13 lukem {"cflag:", 0, 0},
93 1.13 lukem {"lflag:", 0, ISIG | IEXTEN},
94 1.13 lukem {"chars:", 0, 0},
95 1.13 lukem }
96 1.1 cgd };
97 1.1 cgd
98 1.63 christos static const ttychar_t ttychar = {
99 1.13 lukem {
100 1.13 lukem CINTR, CQUIT, CERASE, CKILL,
101 1.13 lukem CEOF, CEOL, CEOL2, CSWTCH,
102 1.13 lukem CDSWTCH, CERASE2, CSTART, CSTOP,
103 1.13 lukem CWERASE, CSUSP, CDSUSP, CREPRINT,
104 1.13 lukem CDISCARD, CLNEXT, CSTATUS, CPAGE,
105 1.13 lukem CPGOFF, CKILL2, CBRK, CMIN,
106 1.13 lukem CTIME
107 1.13 lukem },
108 1.13 lukem {
109 1.13 lukem CINTR, CQUIT, CERASE, CKILL,
110 1.13 lukem _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE,
111 1.13 lukem _POSIX_VDISABLE, CERASE2, CSTART, CSTOP,
112 1.13 lukem _POSIX_VDISABLE, CSUSP, _POSIX_VDISABLE, _POSIX_VDISABLE,
113 1.13 lukem CDISCARD, _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE,
114 1.13 lukem _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, 1,
115 1.13 lukem 0
116 1.13 lukem },
117 1.13 lukem {
118 1.13 lukem 0, 0, 0, 0,
119 1.13 lukem 0, 0, 0, 0,
120 1.13 lukem 0, 0, 0, 0,
121 1.13 lukem 0, 0, 0, 0,
122 1.13 lukem 0, 0, 0, 0,
123 1.13 lukem 0, 0, 0, 0,
124 1.13 lukem 0
125 1.13 lukem }
126 1.1 cgd };
127 1.1 cgd
128 1.63 christos static const ttymap_t tty_map[] = {
129 1.1 cgd #ifdef VERASE
130 1.13 lukem {C_ERASE, VERASE,
131 1.21 mycroft {EM_DELETE_PREV_CHAR, VI_DELETE_PREV_CHAR, ED_PREV_CHAR}},
132 1.1 cgd #endif /* VERASE */
133 1.1 cgd #ifdef VERASE2
134 1.13 lukem {C_ERASE2, VERASE2,
135 1.21 mycroft {EM_DELETE_PREV_CHAR, VI_DELETE_PREV_CHAR, ED_PREV_CHAR}},
136 1.1 cgd #endif /* VERASE2 */
137 1.1 cgd #ifdef VKILL
138 1.13 lukem {C_KILL, VKILL,
139 1.13 lukem {EM_KILL_LINE, VI_KILL_LINE_PREV, ED_UNASSIGNED}},
140 1.1 cgd #endif /* VKILL */
141 1.1 cgd #ifdef VKILL2
142 1.13 lukem {C_KILL2, VKILL2,
143 1.13 lukem {EM_KILL_LINE, VI_KILL_LINE_PREV, ED_UNASSIGNED}},
144 1.1 cgd #endif /* VKILL2 */
145 1.1 cgd #ifdef VEOF
146 1.13 lukem {C_EOF, VEOF,
147 1.13 lukem {EM_DELETE_OR_LIST, VI_LIST_OR_EOF, ED_UNASSIGNED}},
148 1.1 cgd #endif /* VEOF */
149 1.1 cgd #ifdef VWERASE
150 1.13 lukem {C_WERASE, VWERASE,
151 1.13 lukem {ED_DELETE_PREV_WORD, ED_DELETE_PREV_WORD, ED_PREV_WORD}},
152 1.1 cgd #endif /* VWERASE */
153 1.1 cgd #ifdef VREPRINT
154 1.13 lukem {C_REPRINT, VREPRINT,
155 1.13 lukem {ED_REDISPLAY, ED_INSERT, ED_REDISPLAY}},
156 1.1 cgd #endif /* VREPRINT */
157 1.1 cgd #ifdef VLNEXT
158 1.13 lukem {C_LNEXT, VLNEXT,
159 1.13 lukem {ED_QUOTED_INSERT, ED_QUOTED_INSERT, ED_UNASSIGNED}},
160 1.1 cgd #endif /* VLNEXT */
161 1.51 christos {(wint_t)-1, (wint_t)-1,
162 1.13 lukem {ED_UNASSIGNED, ED_UNASSIGNED, ED_UNASSIGNED}}
163 1.13 lukem };
164 1.1 cgd
165 1.63 christos static const ttymodes_t ttymodes[] = {
166 1.13 lukem #ifdef IGNBRK
167 1.13 lukem {"ignbrk", IGNBRK, MD_INP},
168 1.13 lukem #endif /* IGNBRK */
169 1.13 lukem #ifdef BRKINT
170 1.13 lukem {"brkint", BRKINT, MD_INP},
171 1.13 lukem #endif /* BRKINT */
172 1.13 lukem #ifdef IGNPAR
173 1.13 lukem {"ignpar", IGNPAR, MD_INP},
174 1.13 lukem #endif /* IGNPAR */
175 1.13 lukem #ifdef PARMRK
176 1.13 lukem {"parmrk", PARMRK, MD_INP},
177 1.13 lukem #endif /* PARMRK */
178 1.13 lukem #ifdef INPCK
179 1.13 lukem {"inpck", INPCK, MD_INP},
180 1.13 lukem #endif /* INPCK */
181 1.13 lukem #ifdef ISTRIP
182 1.13 lukem {"istrip", ISTRIP, MD_INP},
183 1.13 lukem #endif /* ISTRIP */
184 1.13 lukem #ifdef INLCR
185 1.13 lukem {"inlcr", INLCR, MD_INP},
186 1.13 lukem #endif /* INLCR */
187 1.13 lukem #ifdef IGNCR
188 1.13 lukem {"igncr", IGNCR, MD_INP},
189 1.13 lukem #endif /* IGNCR */
190 1.13 lukem #ifdef ICRNL
191 1.13 lukem {"icrnl", ICRNL, MD_INP},
192 1.13 lukem #endif /* ICRNL */
193 1.13 lukem #ifdef IUCLC
194 1.13 lukem {"iuclc", IUCLC, MD_INP},
195 1.13 lukem #endif /* IUCLC */
196 1.13 lukem #ifdef IXON
197 1.13 lukem {"ixon", IXON, MD_INP},
198 1.13 lukem #endif /* IXON */
199 1.13 lukem #ifdef IXANY
200 1.13 lukem {"ixany", IXANY, MD_INP},
201 1.13 lukem #endif /* IXANY */
202 1.13 lukem #ifdef IXOFF
203 1.13 lukem {"ixoff", IXOFF, MD_INP},
204 1.13 lukem #endif /* IXOFF */
205 1.13 lukem #ifdef IMAXBEL
206 1.13 lukem {"imaxbel", IMAXBEL, MD_INP},
207 1.13 lukem #endif /* IMAXBEL */
208 1.13 lukem
209 1.13 lukem #ifdef OPOST
210 1.13 lukem {"opost", OPOST, MD_OUT},
211 1.13 lukem #endif /* OPOST */
212 1.13 lukem #ifdef OLCUC
213 1.13 lukem {"olcuc", OLCUC, MD_OUT},
214 1.13 lukem #endif /* OLCUC */
215 1.13 lukem #ifdef ONLCR
216 1.13 lukem {"onlcr", ONLCR, MD_OUT},
217 1.13 lukem #endif /* ONLCR */
218 1.13 lukem #ifdef OCRNL
219 1.13 lukem {"ocrnl", OCRNL, MD_OUT},
220 1.13 lukem #endif /* OCRNL */
221 1.13 lukem #ifdef ONOCR
222 1.13 lukem {"onocr", ONOCR, MD_OUT},
223 1.13 lukem #endif /* ONOCR */
224 1.13 lukem #ifdef ONOEOT
225 1.13 lukem {"onoeot", ONOEOT, MD_OUT},
226 1.13 lukem #endif /* ONOEOT */
227 1.13 lukem #ifdef ONLRET
228 1.13 lukem {"onlret", ONLRET, MD_OUT},
229 1.13 lukem #endif /* ONLRET */
230 1.13 lukem #ifdef OFILL
231 1.13 lukem {"ofill", OFILL, MD_OUT},
232 1.13 lukem #endif /* OFILL */
233 1.13 lukem #ifdef OFDEL
234 1.13 lukem {"ofdel", OFDEL, MD_OUT},
235 1.13 lukem #endif /* OFDEL */
236 1.13 lukem #ifdef NLDLY
237 1.13 lukem {"nldly", NLDLY, MD_OUT},
238 1.13 lukem #endif /* NLDLY */
239 1.13 lukem #ifdef CRDLY
240 1.13 lukem {"crdly", CRDLY, MD_OUT},
241 1.13 lukem #endif /* CRDLY */
242 1.13 lukem #ifdef TABDLY
243 1.13 lukem {"tabdly", TABDLY, MD_OUT},
244 1.13 lukem #endif /* TABDLY */
245 1.13 lukem #ifdef XTABS
246 1.13 lukem {"xtabs", XTABS, MD_OUT},
247 1.13 lukem #endif /* XTABS */
248 1.13 lukem #ifdef BSDLY
249 1.13 lukem {"bsdly", BSDLY, MD_OUT},
250 1.13 lukem #endif /* BSDLY */
251 1.13 lukem #ifdef VTDLY
252 1.13 lukem {"vtdly", VTDLY, MD_OUT},
253 1.13 lukem #endif /* VTDLY */
254 1.13 lukem #ifdef FFDLY
255 1.13 lukem {"ffdly", FFDLY, MD_OUT},
256 1.13 lukem #endif /* FFDLY */
257 1.13 lukem #ifdef PAGEOUT
258 1.13 lukem {"pageout", PAGEOUT, MD_OUT},
259 1.13 lukem #endif /* PAGEOUT */
260 1.13 lukem #ifdef WRAP
261 1.13 lukem {"wrap", WRAP, MD_OUT},
262 1.13 lukem #endif /* WRAP */
263 1.13 lukem
264 1.13 lukem #ifdef CIGNORE
265 1.13 lukem {"cignore", CIGNORE, MD_CTL},
266 1.13 lukem #endif /* CBAUD */
267 1.13 lukem #ifdef CBAUD
268 1.13 lukem {"cbaud", CBAUD, MD_CTL},
269 1.13 lukem #endif /* CBAUD */
270 1.13 lukem #ifdef CSTOPB
271 1.13 lukem {"cstopb", CSTOPB, MD_CTL},
272 1.13 lukem #endif /* CSTOPB */
273 1.13 lukem #ifdef CREAD
274 1.13 lukem {"cread", CREAD, MD_CTL},
275 1.13 lukem #endif /* CREAD */
276 1.13 lukem #ifdef PARENB
277 1.13 lukem {"parenb", PARENB, MD_CTL},
278 1.13 lukem #endif /* PARENB */
279 1.13 lukem #ifdef PARODD
280 1.13 lukem {"parodd", PARODD, MD_CTL},
281 1.13 lukem #endif /* PARODD */
282 1.13 lukem #ifdef HUPCL
283 1.13 lukem {"hupcl", HUPCL, MD_CTL},
284 1.13 lukem #endif /* HUPCL */
285 1.13 lukem #ifdef CLOCAL
286 1.13 lukem {"clocal", CLOCAL, MD_CTL},
287 1.13 lukem #endif /* CLOCAL */
288 1.13 lukem #ifdef LOBLK
289 1.13 lukem {"loblk", LOBLK, MD_CTL},
290 1.13 lukem #endif /* LOBLK */
291 1.13 lukem #ifdef CIBAUD
292 1.13 lukem {"cibaud", CIBAUD, MD_CTL},
293 1.13 lukem #endif /* CIBAUD */
294 1.13 lukem #ifdef CRTSCTS
295 1.13 lukem #ifdef CCTS_OFLOW
296 1.13 lukem {"ccts_oflow", CCTS_OFLOW, MD_CTL},
297 1.13 lukem #else
298 1.13 lukem {"crtscts", CRTSCTS, MD_CTL},
299 1.13 lukem #endif /* CCTS_OFLOW */
300 1.13 lukem #endif /* CRTSCTS */
301 1.13 lukem #ifdef CRTS_IFLOW
302 1.13 lukem {"crts_iflow", CRTS_IFLOW, MD_CTL},
303 1.13 lukem #endif /* CRTS_IFLOW */
304 1.13 lukem #ifdef CDTRCTS
305 1.13 lukem {"cdtrcts", CDTRCTS, MD_CTL},
306 1.13 lukem #endif /* CDTRCTS */
307 1.13 lukem #ifdef MDMBUF
308 1.13 lukem {"mdmbuf", MDMBUF, MD_CTL},
309 1.13 lukem #endif /* MDMBUF */
310 1.13 lukem #ifdef RCV1EN
311 1.13 lukem {"rcv1en", RCV1EN, MD_CTL},
312 1.13 lukem #endif /* RCV1EN */
313 1.13 lukem #ifdef XMT1EN
314 1.13 lukem {"xmt1en", XMT1EN, MD_CTL},
315 1.13 lukem #endif /* XMT1EN */
316 1.13 lukem
317 1.13 lukem #ifdef ISIG
318 1.13 lukem {"isig", ISIG, MD_LIN},
319 1.13 lukem #endif /* ISIG */
320 1.13 lukem #ifdef ICANON
321 1.13 lukem {"icanon", ICANON, MD_LIN},
322 1.13 lukem #endif /* ICANON */
323 1.13 lukem #ifdef XCASE
324 1.13 lukem {"xcase", XCASE, MD_LIN},
325 1.13 lukem #endif /* XCASE */
326 1.13 lukem #ifdef ECHO
327 1.13 lukem {"echo", ECHO, MD_LIN},
328 1.13 lukem #endif /* ECHO */
329 1.13 lukem #ifdef ECHOE
330 1.13 lukem {"echoe", ECHOE, MD_LIN},
331 1.13 lukem #endif /* ECHOE */
332 1.13 lukem #ifdef ECHOK
333 1.13 lukem {"echok", ECHOK, MD_LIN},
334 1.13 lukem #endif /* ECHOK */
335 1.13 lukem #ifdef ECHONL
336 1.13 lukem {"echonl", ECHONL, MD_LIN},
337 1.13 lukem #endif /* ECHONL */
338 1.13 lukem #ifdef NOFLSH
339 1.13 lukem {"noflsh", NOFLSH, MD_LIN},
340 1.13 lukem #endif /* NOFLSH */
341 1.13 lukem #ifdef TOSTOP
342 1.13 lukem {"tostop", TOSTOP, MD_LIN},
343 1.13 lukem #endif /* TOSTOP */
344 1.13 lukem #ifdef ECHOCTL
345 1.13 lukem {"echoctl", ECHOCTL, MD_LIN},
346 1.13 lukem #endif /* ECHOCTL */
347 1.13 lukem #ifdef ECHOPRT
348 1.13 lukem {"echoprt", ECHOPRT, MD_LIN},
349 1.13 lukem #endif /* ECHOPRT */
350 1.13 lukem #ifdef ECHOKE
351 1.13 lukem {"echoke", ECHOKE, MD_LIN},
352 1.13 lukem #endif /* ECHOKE */
353 1.13 lukem #ifdef DEFECHO
354 1.13 lukem {"defecho", DEFECHO, MD_LIN},
355 1.13 lukem #endif /* DEFECHO */
356 1.13 lukem #ifdef FLUSHO
357 1.13 lukem {"flusho", FLUSHO, MD_LIN},
358 1.13 lukem #endif /* FLUSHO */
359 1.13 lukem #ifdef PENDIN
360 1.13 lukem {"pendin", PENDIN, MD_LIN},
361 1.13 lukem #endif /* PENDIN */
362 1.13 lukem #ifdef IEXTEN
363 1.13 lukem {"iexten", IEXTEN, MD_LIN},
364 1.13 lukem #endif /* IEXTEN */
365 1.13 lukem #ifdef NOKERNINFO
366 1.13 lukem {"nokerninfo", NOKERNINFO, MD_LIN},
367 1.13 lukem #endif /* NOKERNINFO */
368 1.13 lukem #ifdef ALTWERASE
369 1.13 lukem {"altwerase", ALTWERASE, MD_LIN},
370 1.13 lukem #endif /* ALTWERASE */
371 1.13 lukem #ifdef EXTPROC
372 1.13 lukem {"extproc", EXTPROC, MD_LIN},
373 1.13 lukem #endif /* EXTPROC */
374 1.13 lukem
375 1.13 lukem #if defined(VINTR)
376 1.13 lukem {"intr", C_SH(C_INTR), MD_CHAR},
377 1.13 lukem #endif /* VINTR */
378 1.13 lukem #if defined(VQUIT)
379 1.13 lukem {"quit", C_SH(C_QUIT), MD_CHAR},
380 1.13 lukem #endif /* VQUIT */
381 1.13 lukem #if defined(VERASE)
382 1.13 lukem {"erase", C_SH(C_ERASE), MD_CHAR},
383 1.13 lukem #endif /* VERASE */
384 1.13 lukem #if defined(VKILL)
385 1.13 lukem {"kill", C_SH(C_KILL), MD_CHAR},
386 1.13 lukem #endif /* VKILL */
387 1.13 lukem #if defined(VEOF)
388 1.13 lukem {"eof", C_SH(C_EOF), MD_CHAR},
389 1.13 lukem #endif /* VEOF */
390 1.13 lukem #if defined(VEOL)
391 1.13 lukem {"eol", C_SH(C_EOL), MD_CHAR},
392 1.13 lukem #endif /* VEOL */
393 1.13 lukem #if defined(VEOL2)
394 1.13 lukem {"eol2", C_SH(C_EOL2), MD_CHAR},
395 1.13 lukem #endif /* VEOL2 */
396 1.13 lukem #if defined(VSWTCH)
397 1.13 lukem {"swtch", C_SH(C_SWTCH), MD_CHAR},
398 1.13 lukem #endif /* VSWTCH */
399 1.13 lukem #if defined(VDSWTCH)
400 1.13 lukem {"dswtch", C_SH(C_DSWTCH), MD_CHAR},
401 1.13 lukem #endif /* VDSWTCH */
402 1.13 lukem #if defined(VERASE2)
403 1.13 lukem {"erase2", C_SH(C_ERASE2), MD_CHAR},
404 1.13 lukem #endif /* VERASE2 */
405 1.13 lukem #if defined(VSTART)
406 1.13 lukem {"start", C_SH(C_START), MD_CHAR},
407 1.13 lukem #endif /* VSTART */
408 1.13 lukem #if defined(VSTOP)
409 1.13 lukem {"stop", C_SH(C_STOP), MD_CHAR},
410 1.13 lukem #endif /* VSTOP */
411 1.13 lukem #if defined(VWERASE)
412 1.13 lukem {"werase", C_SH(C_WERASE), MD_CHAR},
413 1.13 lukem #endif /* VWERASE */
414 1.13 lukem #if defined(VSUSP)
415 1.13 lukem {"susp", C_SH(C_SUSP), MD_CHAR},
416 1.13 lukem #endif /* VSUSP */
417 1.13 lukem #if defined(VDSUSP)
418 1.13 lukem {"dsusp", C_SH(C_DSUSP), MD_CHAR},
419 1.13 lukem #endif /* VDSUSP */
420 1.13 lukem #if defined(VREPRINT)
421 1.13 lukem {"reprint", C_SH(C_REPRINT), MD_CHAR},
422 1.13 lukem #endif /* VREPRINT */
423 1.13 lukem #if defined(VDISCARD)
424 1.13 lukem {"discard", C_SH(C_DISCARD), MD_CHAR},
425 1.13 lukem #endif /* VDISCARD */
426 1.13 lukem #if defined(VLNEXT)
427 1.13 lukem {"lnext", C_SH(C_LNEXT), MD_CHAR},
428 1.13 lukem #endif /* VLNEXT */
429 1.13 lukem #if defined(VSTATUS)
430 1.13 lukem {"status", C_SH(C_STATUS), MD_CHAR},
431 1.13 lukem #endif /* VSTATUS */
432 1.13 lukem #if defined(VPAGE)
433 1.13 lukem {"page", C_SH(C_PAGE), MD_CHAR},
434 1.13 lukem #endif /* VPAGE */
435 1.13 lukem #if defined(VPGOFF)
436 1.13 lukem {"pgoff", C_SH(C_PGOFF), MD_CHAR},
437 1.13 lukem #endif /* VPGOFF */
438 1.13 lukem #if defined(VKILL2)
439 1.13 lukem {"kill2", C_SH(C_KILL2), MD_CHAR},
440 1.13 lukem #endif /* VKILL2 */
441 1.13 lukem #if defined(VBRK)
442 1.13 lukem {"brk", C_SH(C_BRK), MD_CHAR},
443 1.13 lukem #endif /* VBRK */
444 1.13 lukem #if defined(VMIN)
445 1.13 lukem {"min", C_SH(C_MIN), MD_CHAR},
446 1.13 lukem #endif /* VMIN */
447 1.13 lukem #if defined(VTIME)
448 1.13 lukem {"time", C_SH(C_TIME), MD_CHAR},
449 1.13 lukem #endif /* VTIME */
450 1.13 lukem {NULL, 0, -1},
451 1.1 cgd };
452 1.1 cgd
453 1.1 cgd
454 1.1 cgd
455 1.13 lukem #define tty__gettabs(td) ((((td)->c_oflag & TAB3) == TAB3) ? 0 : 1)
456 1.13 lukem #define tty__geteightbit(td) (((td)->c_cflag & CSIZE) == CS8)
457 1.13 lukem #define tty__cooked_mode(td) ((td)->c_lflag & ICANON)
458 1.13 lukem
459 1.63 christos static int tty_getty(EditLine *, struct termios *);
460 1.63 christos static int tty_setty(EditLine *, int, const struct termios *);
461 1.63 christos static int tty__getcharindex(int);
462 1.63 christos static void tty__getchar(struct termios *, unsigned char *);
463 1.63 christos static void tty__setchar(struct termios *, unsigned char *);
464 1.63 christos static speed_t tty__getspeed(struct termios *);
465 1.63 christos static int tty_setup(EditLine *);
466 1.63 christos static void tty_setup_flags(EditLine *, struct termios *, int);
467 1.1 cgd
468 1.13 lukem #define t_qu t_ts
469 1.1 cgd
470 1.26 christos /* tty_getty():
471 1.26 christos * Wrapper for tcgetattr to handle EINTR
472 1.26 christos */
473 1.63 christos static int
474 1.26 christos tty_getty(EditLine *el, struct termios *t)
475 1.26 christos {
476 1.26 christos int rv;
477 1.26 christos while ((rv = tcgetattr(el->el_infd, t)) == -1 && errno == EINTR)
478 1.26 christos continue;
479 1.26 christos return rv;
480 1.26 christos }
481 1.26 christos
482 1.26 christos /* tty_setty():
483 1.26 christos * Wrapper for tcsetattr to handle EINTR
484 1.26 christos */
485 1.63 christos static int
486 1.26 christos tty_setty(EditLine *el, int action, const struct termios *t)
487 1.26 christos {
488 1.26 christos int rv;
489 1.26 christos while ((rv = tcsetattr(el->el_infd, action, t)) == -1 && errno == EINTR)
490 1.26 christos continue;
491 1.26 christos return rv;
492 1.26 christos }
493 1.1 cgd
494 1.1 cgd /* tty_setup():
495 1.1 cgd * Get the tty parameters and initialize the editing state
496 1.1 cgd */
497 1.63 christos static int
498 1.13 lukem tty_setup(EditLine *el)
499 1.1 cgd {
500 1.66 christos int rst = (el->el_flags & NO_RESET) == 0;
501 1.12 sommerfe
502 1.13 lukem if (el->el_flags & EDIT_DISABLED)
503 1.38 christos return 0;
504 1.13 lukem
505 1.59 christos if (el->el_tty.t_initialized)
506 1.59 christos return -1;
507 1.59 christos
508 1.34 christos if (!isatty(el->el_outfd)) {
509 1.34 christos #ifdef DEBUG_TTY
510 1.42 christos (void) fprintf(el->el_errfile, "%s: isatty: %s\n", __func__,
511 1.42 christos strerror(errno));
512 1.34 christos #endif /* DEBUG_TTY */
513 1.38 christos return -1;
514 1.34 christos }
515 1.42 christos if (tty_getty(el, &el->el_tty.t_or) == -1) {
516 1.1 cgd #ifdef DEBUG_TTY
517 1.42 christos (void) fprintf(el->el_errfile, "%s: tty_getty: %s\n", __func__,
518 1.42 christos strerror(errno));
519 1.1 cgd #endif /* DEBUG_TTY */
520 1.38 christos return -1;
521 1.13 lukem }
522 1.42 christos el->el_tty.t_ts = el->el_tty.t_ex = el->el_tty.t_ed = el->el_tty.t_or;
523 1.13 lukem
524 1.13 lukem el->el_tty.t_speed = tty__getspeed(&el->el_tty.t_ex);
525 1.13 lukem el->el_tty.t_tabs = tty__gettabs(&el->el_tty.t_ex);
526 1.13 lukem el->el_tty.t_eight = tty__geteightbit(&el->el_tty.t_ex);
527 1.13 lukem
528 1.43 christos tty_setup_flags(el, &el->el_tty.t_ex, EX_IO);
529 1.13 lukem
530 1.13 lukem /*
531 1.13 lukem * Reset the tty chars to reasonable defaults
532 1.13 lukem * If they are disabled, then enable them.
533 1.13 lukem */
534 1.13 lukem if (rst) {
535 1.13 lukem if (tty__cooked_mode(&el->el_tty.t_ts)) {
536 1.13 lukem tty__getchar(&el->el_tty.t_ts, el->el_tty.t_c[TS_IO]);
537 1.13 lukem /*
538 1.13 lukem * Don't affect CMIN and CTIME for the editor mode
539 1.13 lukem */
540 1.13 lukem for (rst = 0; rst < C_NCC - 2; rst++)
541 1.13 lukem if (el->el_tty.t_c[TS_IO][rst] !=
542 1.13 lukem el->el_tty.t_vdisable
543 1.13 lukem && el->el_tty.t_c[ED_IO][rst] !=
544 1.13 lukem el->el_tty.t_vdisable)
545 1.13 lukem el->el_tty.t_c[ED_IO][rst] =
546 1.13 lukem el->el_tty.t_c[TS_IO][rst];
547 1.13 lukem for (rst = 0; rst < C_NCC; rst++)
548 1.13 lukem if (el->el_tty.t_c[TS_IO][rst] !=
549 1.13 lukem el->el_tty.t_vdisable)
550 1.13 lukem el->el_tty.t_c[EX_IO][rst] =
551 1.13 lukem el->el_tty.t_c[TS_IO][rst];
552 1.13 lukem }
553 1.13 lukem tty__setchar(&el->el_tty.t_ex, el->el_tty.t_c[EX_IO]);
554 1.26 christos if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ex) == -1) {
555 1.1 cgd #ifdef DEBUG_TTY
556 1.42 christos (void) fprintf(el->el_errfile, "%s: tty_setty: %s\n",
557 1.42 christos __func__, strerror(errno));
558 1.1 cgd #endif /* DEBUG_TTY */
559 1.38 christos return -1;
560 1.13 lukem }
561 1.25 christos }
562 1.13 lukem
563 1.43 christos tty_setup_flags(el, &el->el_tty.t_ed, ED_IO);
564 1.13 lukem
565 1.13 lukem tty__setchar(&el->el_tty.t_ed, el->el_tty.t_c[ED_IO]);
566 1.13 lukem tty_bind_char(el, 1);
567 1.58 christos el->el_tty.t_initialized = 1;
568 1.38 christos return 0;
569 1.1 cgd }
570 1.1 cgd
571 1.65 christos libedit_private int
572 1.13 lukem tty_init(EditLine *el)
573 1.1 cgd {
574 1.13 lukem
575 1.13 lukem el->el_tty.t_mode = EX_IO;
576 1.13 lukem el->el_tty.t_vdisable = _POSIX_VDISABLE;
577 1.59 christos el->el_tty.t_initialized = 0;
578 1.13 lukem (void) memcpy(el->el_tty.t_t, ttyperm, sizeof(ttyperm_t));
579 1.13 lukem (void) memcpy(el->el_tty.t_c, ttychar, sizeof(ttychar_t));
580 1.38 christos return tty_setup(el);
581 1.13 lukem }
582 1.1 cgd
583 1.1 cgd
584 1.1 cgd /* tty_end():
585 1.1 cgd * Restore the tty to its original settings
586 1.1 cgd */
587 1.65 christos libedit_private void
588 1.1 cgd /*ARGSUSED*/
589 1.67 christos tty_end(EditLine *el, int how)
590 1.1 cgd {
591 1.48 christos if (el->el_flags & EDIT_DISABLED)
592 1.49 gson return;
593 1.48 christos
594 1.59 christos if (!el->el_tty.t_initialized)
595 1.58 christos return;
596 1.58 christos
597 1.67 christos if (tty_setty(el, how, &el->el_tty.t_or) == -1)
598 1.67 christos {
599 1.42 christos #ifdef DEBUG_TTY
600 1.42 christos (void) fprintf(el->el_errfile,
601 1.42 christos "%s: tty_setty: %s\n", __func__, strerror(errno));
602 1.42 christos #endif /* DEBUG_TTY */
603 1.42 christos }
604 1.1 cgd }
605 1.1 cgd
606 1.1 cgd
607 1.1 cgd /* tty__getspeed():
608 1.1 cgd * Get the tty speed
609 1.1 cgd */
610 1.63 christos static speed_t
611 1.13 lukem tty__getspeed(struct termios *td)
612 1.1 cgd {
613 1.13 lukem speed_t spd;
614 1.1 cgd
615 1.13 lukem if ((spd = cfgetispeed(td)) == 0)
616 1.13 lukem spd = cfgetospeed(td);
617 1.38 christos return spd;
618 1.13 lukem }
619 1.1 cgd
620 1.19 christos /* tty__getspeed():
621 1.19 christos * Return the index of the asked char in the c_cc array
622 1.19 christos */
623 1.63 christos static int
624 1.19 christos tty__getcharindex(int i)
625 1.19 christos {
626 1.19 christos switch (i) {
627 1.19 christos #ifdef VINTR
628 1.19 christos case C_INTR:
629 1.19 christos return VINTR;
630 1.19 christos #endif /* VINTR */
631 1.19 christos #ifdef VQUIT
632 1.19 christos case C_QUIT:
633 1.19 christos return VQUIT;
634 1.19 christos #endif /* VQUIT */
635 1.19 christos #ifdef VERASE
636 1.19 christos case C_ERASE:
637 1.19 christos return VERASE;
638 1.19 christos #endif /* VERASE */
639 1.19 christos #ifdef VKILL
640 1.19 christos case C_KILL:
641 1.19 christos return VKILL;
642 1.19 christos #endif /* VKILL */
643 1.19 christos #ifdef VEOF
644 1.19 christos case C_EOF:
645 1.19 christos return VEOF;
646 1.19 christos #endif /* VEOF */
647 1.19 christos #ifdef VEOL
648 1.19 christos case C_EOL:
649 1.19 christos return VEOL;
650 1.19 christos #endif /* VEOL */
651 1.19 christos #ifdef VEOL2
652 1.19 christos case C_EOL2:
653 1.19 christos return VEOL2;
654 1.19 christos #endif /* VEOL2 */
655 1.19 christos #ifdef VSWTCH
656 1.19 christos case C_SWTCH:
657 1.19 christos return VSWTCH;
658 1.19 christos #endif /* VSWTCH */
659 1.19 christos #ifdef VDSWTCH
660 1.19 christos case C_DSWTCH:
661 1.19 christos return VDSWTCH;
662 1.19 christos #endif /* VDSWTCH */
663 1.19 christos #ifdef VERASE2
664 1.19 christos case C_ERASE2:
665 1.19 christos return VERASE2;
666 1.19 christos #endif /* VERASE2 */
667 1.19 christos #ifdef VSTART
668 1.19 christos case C_START:
669 1.19 christos return VSTART;
670 1.19 christos #endif /* VSTART */
671 1.19 christos #ifdef VSTOP
672 1.19 christos case C_STOP:
673 1.19 christos return VSTOP;
674 1.19 christos #endif /* VSTOP */
675 1.19 christos #ifdef VWERASE
676 1.19 christos case C_WERASE:
677 1.19 christos return VWERASE;
678 1.19 christos #endif /* VWERASE */
679 1.19 christos #ifdef VSUSP
680 1.19 christos case C_SUSP:
681 1.19 christos return VSUSP;
682 1.19 christos #endif /* VSUSP */
683 1.19 christos #ifdef VDSUSP
684 1.19 christos case C_DSUSP:
685 1.19 christos return VDSUSP;
686 1.19 christos #endif /* VDSUSP */
687 1.19 christos #ifdef VREPRINT
688 1.19 christos case C_REPRINT:
689 1.19 christos return VREPRINT;
690 1.19 christos #endif /* VREPRINT */
691 1.19 christos #ifdef VDISCARD
692 1.19 christos case C_DISCARD:
693 1.19 christos return VDISCARD;
694 1.19 christos #endif /* VDISCARD */
695 1.19 christos #ifdef VLNEXT
696 1.19 christos case C_LNEXT:
697 1.19 christos return VLNEXT;
698 1.19 christos #endif /* VLNEXT */
699 1.19 christos #ifdef VSTATUS
700 1.19 christos case C_STATUS:
701 1.19 christos return VSTATUS;
702 1.19 christos #endif /* VSTATUS */
703 1.19 christos #ifdef VPAGE
704 1.19 christos case C_PAGE:
705 1.19 christos return VPAGE;
706 1.19 christos #endif /* VPAGE */
707 1.19 christos #ifdef VPGOFF
708 1.19 christos case C_PGOFF:
709 1.19 christos return VPGOFF;
710 1.19 christos #endif /* VPGOFF */
711 1.19 christos #ifdef VKILL2
712 1.19 christos case C_KILL2:
713 1.19 christos return VKILL2;
714 1.19 christos #endif /* KILL2 */
715 1.19 christos #ifdef VMIN
716 1.19 christos case C_MIN:
717 1.19 christos return VMIN;
718 1.19 christos #endif /* VMIN */
719 1.19 christos #ifdef VTIME
720 1.19 christos case C_TIME:
721 1.19 christos return VTIME;
722 1.19 christos #endif /* VTIME */
723 1.19 christos default:
724 1.19 christos return -1;
725 1.19 christos }
726 1.19 christos }
727 1.1 cgd
728 1.1 cgd /* tty__getchar():
729 1.1 cgd * Get the tty characters
730 1.1 cgd */
731 1.63 christos static void
732 1.13 lukem tty__getchar(struct termios *td, unsigned char *s)
733 1.11 simonb {
734 1.13 lukem
735 1.13 lukem #ifdef VINTR
736 1.13 lukem s[C_INTR] = td->c_cc[VINTR];
737 1.13 lukem #endif /* VINTR */
738 1.13 lukem #ifdef VQUIT
739 1.13 lukem s[C_QUIT] = td->c_cc[VQUIT];
740 1.13 lukem #endif /* VQUIT */
741 1.13 lukem #ifdef VERASE
742 1.13 lukem s[C_ERASE] = td->c_cc[VERASE];
743 1.13 lukem #endif /* VERASE */
744 1.13 lukem #ifdef VKILL
745 1.13 lukem s[C_KILL] = td->c_cc[VKILL];
746 1.13 lukem #endif /* VKILL */
747 1.13 lukem #ifdef VEOF
748 1.13 lukem s[C_EOF] = td->c_cc[VEOF];
749 1.13 lukem #endif /* VEOF */
750 1.13 lukem #ifdef VEOL
751 1.13 lukem s[C_EOL] = td->c_cc[VEOL];
752 1.13 lukem #endif /* VEOL */
753 1.13 lukem #ifdef VEOL2
754 1.13 lukem s[C_EOL2] = td->c_cc[VEOL2];
755 1.13 lukem #endif /* VEOL2 */
756 1.13 lukem #ifdef VSWTCH
757 1.13 lukem s[C_SWTCH] = td->c_cc[VSWTCH];
758 1.13 lukem #endif /* VSWTCH */
759 1.13 lukem #ifdef VDSWTCH
760 1.13 lukem s[C_DSWTCH] = td->c_cc[VDSWTCH];
761 1.13 lukem #endif /* VDSWTCH */
762 1.13 lukem #ifdef VERASE2
763 1.13 lukem s[C_ERASE2] = td->c_cc[VERASE2];
764 1.13 lukem #endif /* VERASE2 */
765 1.13 lukem #ifdef VSTART
766 1.13 lukem s[C_START] = td->c_cc[VSTART];
767 1.13 lukem #endif /* VSTART */
768 1.13 lukem #ifdef VSTOP
769 1.13 lukem s[C_STOP] = td->c_cc[VSTOP];
770 1.13 lukem #endif /* VSTOP */
771 1.13 lukem #ifdef VWERASE
772 1.13 lukem s[C_WERASE] = td->c_cc[VWERASE];
773 1.13 lukem #endif /* VWERASE */
774 1.13 lukem #ifdef VSUSP
775 1.13 lukem s[C_SUSP] = td->c_cc[VSUSP];
776 1.13 lukem #endif /* VSUSP */
777 1.13 lukem #ifdef VDSUSP
778 1.13 lukem s[C_DSUSP] = td->c_cc[VDSUSP];
779 1.13 lukem #endif /* VDSUSP */
780 1.13 lukem #ifdef VREPRINT
781 1.13 lukem s[C_REPRINT] = td->c_cc[VREPRINT];
782 1.13 lukem #endif /* VREPRINT */
783 1.13 lukem #ifdef VDISCARD
784 1.13 lukem s[C_DISCARD] = td->c_cc[VDISCARD];
785 1.13 lukem #endif /* VDISCARD */
786 1.13 lukem #ifdef VLNEXT
787 1.13 lukem s[C_LNEXT] = td->c_cc[VLNEXT];
788 1.13 lukem #endif /* VLNEXT */
789 1.13 lukem #ifdef VSTATUS
790 1.13 lukem s[C_STATUS] = td->c_cc[VSTATUS];
791 1.13 lukem #endif /* VSTATUS */
792 1.13 lukem #ifdef VPAGE
793 1.13 lukem s[C_PAGE] = td->c_cc[VPAGE];
794 1.13 lukem #endif /* VPAGE */
795 1.13 lukem #ifdef VPGOFF
796 1.13 lukem s[C_PGOFF] = td->c_cc[VPGOFF];
797 1.13 lukem #endif /* VPGOFF */
798 1.13 lukem #ifdef VKILL2
799 1.13 lukem s[C_KILL2] = td->c_cc[VKILL2];
800 1.13 lukem #endif /* KILL2 */
801 1.13 lukem #ifdef VMIN
802 1.13 lukem s[C_MIN] = td->c_cc[VMIN];
803 1.13 lukem #endif /* VMIN */
804 1.13 lukem #ifdef VTIME
805 1.13 lukem s[C_TIME] = td->c_cc[VTIME];
806 1.13 lukem #endif /* VTIME */
807 1.13 lukem } /* tty__getchar */
808 1.1 cgd
809 1.1 cgd
810 1.1 cgd /* tty__setchar():
811 1.1 cgd * Set the tty characters
812 1.1 cgd */
813 1.63 christos static void
814 1.13 lukem tty__setchar(struct termios *td, unsigned char *s)
815 1.11 simonb {
816 1.13 lukem
817 1.13 lukem #ifdef VINTR
818 1.13 lukem td->c_cc[VINTR] = s[C_INTR];
819 1.13 lukem #endif /* VINTR */
820 1.13 lukem #ifdef VQUIT
821 1.13 lukem td->c_cc[VQUIT] = s[C_QUIT];
822 1.13 lukem #endif /* VQUIT */
823 1.13 lukem #ifdef VERASE
824 1.13 lukem td->c_cc[VERASE] = s[C_ERASE];
825 1.13 lukem #endif /* VERASE */
826 1.13 lukem #ifdef VKILL
827 1.13 lukem td->c_cc[VKILL] = s[C_KILL];
828 1.13 lukem #endif /* VKILL */
829 1.13 lukem #ifdef VEOF
830 1.13 lukem td->c_cc[VEOF] = s[C_EOF];
831 1.13 lukem #endif /* VEOF */
832 1.13 lukem #ifdef VEOL
833 1.13 lukem td->c_cc[VEOL] = s[C_EOL];
834 1.13 lukem #endif /* VEOL */
835 1.13 lukem #ifdef VEOL2
836 1.13 lukem td->c_cc[VEOL2] = s[C_EOL2];
837 1.13 lukem #endif /* VEOL2 */
838 1.13 lukem #ifdef VSWTCH
839 1.13 lukem td->c_cc[VSWTCH] = s[C_SWTCH];
840 1.13 lukem #endif /* VSWTCH */
841 1.13 lukem #ifdef VDSWTCH
842 1.13 lukem td->c_cc[VDSWTCH] = s[C_DSWTCH];
843 1.13 lukem #endif /* VDSWTCH */
844 1.13 lukem #ifdef VERASE2
845 1.13 lukem td->c_cc[VERASE2] = s[C_ERASE2];
846 1.13 lukem #endif /* VERASE2 */
847 1.13 lukem #ifdef VSTART
848 1.13 lukem td->c_cc[VSTART] = s[C_START];
849 1.13 lukem #endif /* VSTART */
850 1.13 lukem #ifdef VSTOP
851 1.13 lukem td->c_cc[VSTOP] = s[C_STOP];
852 1.13 lukem #endif /* VSTOP */
853 1.13 lukem #ifdef VWERASE
854 1.13 lukem td->c_cc[VWERASE] = s[C_WERASE];
855 1.13 lukem #endif /* VWERASE */
856 1.13 lukem #ifdef VSUSP
857 1.13 lukem td->c_cc[VSUSP] = s[C_SUSP];
858 1.13 lukem #endif /* VSUSP */
859 1.13 lukem #ifdef VDSUSP
860 1.13 lukem td->c_cc[VDSUSP] = s[C_DSUSP];
861 1.13 lukem #endif /* VDSUSP */
862 1.13 lukem #ifdef VREPRINT
863 1.13 lukem td->c_cc[VREPRINT] = s[C_REPRINT];
864 1.13 lukem #endif /* VREPRINT */
865 1.13 lukem #ifdef VDISCARD
866 1.13 lukem td->c_cc[VDISCARD] = s[C_DISCARD];
867 1.13 lukem #endif /* VDISCARD */
868 1.13 lukem #ifdef VLNEXT
869 1.13 lukem td->c_cc[VLNEXT] = s[C_LNEXT];
870 1.13 lukem #endif /* VLNEXT */
871 1.13 lukem #ifdef VSTATUS
872 1.13 lukem td->c_cc[VSTATUS] = s[C_STATUS];
873 1.13 lukem #endif /* VSTATUS */
874 1.13 lukem #ifdef VPAGE
875 1.13 lukem td->c_cc[VPAGE] = s[C_PAGE];
876 1.13 lukem #endif /* VPAGE */
877 1.13 lukem #ifdef VPGOFF
878 1.13 lukem td->c_cc[VPGOFF] = s[C_PGOFF];
879 1.13 lukem #endif /* VPGOFF */
880 1.13 lukem #ifdef VKILL2
881 1.13 lukem td->c_cc[VKILL2] = s[C_KILL2];
882 1.13 lukem #endif /* VKILL2 */
883 1.13 lukem #ifdef VMIN
884 1.13 lukem td->c_cc[VMIN] = s[C_MIN];
885 1.13 lukem #endif /* VMIN */
886 1.13 lukem #ifdef VTIME
887 1.13 lukem td->c_cc[VTIME] = s[C_TIME];
888 1.13 lukem #endif /* VTIME */
889 1.13 lukem } /* tty__setchar */
890 1.1 cgd
891 1.1 cgd
892 1.1 cgd /* tty_bind_char():
893 1.1 cgd * Rebind the editline functions
894 1.1 cgd */
895 1.65 christos libedit_private void
896 1.13 lukem tty_bind_char(EditLine *el, int force)
897 1.1 cgd {
898 1.13 lukem
899 1.13 lukem unsigned char *t_n = el->el_tty.t_c[ED_IO];
900 1.13 lukem unsigned char *t_o = el->el_tty.t_ed.c_cc;
901 1.62 christos wchar_t new[2], old[2];
902 1.14 jdolecek const ttymap_t *tp;
903 1.14 jdolecek el_action_t *map, *alt;
904 1.14 jdolecek const el_action_t *dmap, *dalt;
905 1.13 lukem new[1] = old[1] = '\0';
906 1.13 lukem
907 1.13 lukem map = el->el_map.key;
908 1.13 lukem alt = el->el_map.alt;
909 1.13 lukem if (el->el_map.type == MAP_VI) {
910 1.13 lukem dmap = el->el_map.vii;
911 1.13 lukem dalt = el->el_map.vic;
912 1.13 lukem } else {
913 1.13 lukem dmap = el->el_map.emacs;
914 1.13 lukem dalt = NULL;
915 1.13 lukem }
916 1.13 lukem
917 1.51 christos for (tp = tty_map; tp->nch != (wint_t)-1; tp++) {
918 1.62 christos new[0] = (wchar_t)t_n[tp->nch];
919 1.62 christos old[0] = (wchar_t)t_o[tp->och];
920 1.13 lukem if (new[0] == old[0] && !force)
921 1.13 lukem continue;
922 1.13 lukem /* Put the old default binding back, and set the new binding */
923 1.37 christos keymacro_clear(el, map, old);
924 1.60 christos map[(unsigned char)old[0]] = dmap[(unsigned char)old[0]];
925 1.37 christos keymacro_clear(el, map, new);
926 1.13 lukem /* MAP_VI == 1, MAP_EMACS == 0... */
927 1.60 christos map[(unsigned char)new[0]] = tp->bind[el->el_map.type];
928 1.13 lukem if (dalt) {
929 1.37 christos keymacro_clear(el, alt, old);
930 1.60 christos alt[(unsigned char)old[0]] =
931 1.60 christos dalt[(unsigned char)old[0]];
932 1.37 christos keymacro_clear(el, alt, new);
933 1.60 christos alt[(unsigned char)new[0]] =
934 1.60 christos tp->bind[el->el_map.type + 1];
935 1.13 lukem }
936 1.1 cgd }
937 1.1 cgd }
938 1.1 cgd
939 1.13 lukem
940 1.63 christos static tcflag_t *
941 1.44 christos tty__get_flag(struct termios *t, int kind) {
942 1.44 christos switch (kind) {
943 1.44 christos case MD_INP:
944 1.44 christos return &t->c_iflag;
945 1.44 christos case MD_OUT:
946 1.44 christos return &t->c_oflag;
947 1.44 christos case MD_CTL:
948 1.44 christos return &t->c_cflag;
949 1.44 christos case MD_LIN:
950 1.44 christos return &t->c_lflag;
951 1.44 christos default:
952 1.44 christos abort();
953 1.44 christos /*NOTREACHED*/
954 1.44 christos }
955 1.44 christos }
956 1.44 christos
957 1.44 christos
958 1.63 christos static tcflag_t
959 1.44 christos tty_update_flag(EditLine *el, tcflag_t f, int mode, int kind)
960 1.44 christos {
961 1.44 christos f &= ~el->el_tty.t_t[mode][kind].t_clrmask;
962 1.44 christos f |= el->el_tty.t_t[mode][kind].t_setmask;
963 1.44 christos return f;
964 1.44 christos }
965 1.44 christos
966 1.44 christos
967 1.63 christos static void
968 1.44 christos tty_update_flags(EditLine *el, int kind)
969 1.44 christos {
970 1.44 christos tcflag_t *tt, *ed, *ex;
971 1.44 christos tt = tty__get_flag(&el->el_tty.t_ts, kind);
972 1.44 christos ed = tty__get_flag(&el->el_tty.t_ed, kind);
973 1.44 christos ex = tty__get_flag(&el->el_tty.t_ex, kind);
974 1.44 christos
975 1.44 christos if (*tt != *ex && (kind != MD_CTL || *tt != *ed)) {
976 1.44 christos *ed = tty_update_flag(el, *tt, ED_IO, kind);
977 1.44 christos *ex = tty_update_flag(el, *tt, EX_IO, kind);
978 1.44 christos }
979 1.44 christos }
980 1.44 christos
981 1.44 christos
982 1.63 christos static void
983 1.44 christos tty_update_char(EditLine *el, int mode, int c) {
984 1.44 christos if (!((el->el_tty.t_t[mode][MD_CHAR].t_setmask & C_SH(c)))
985 1.44 christos && (el->el_tty.t_c[TS_IO][c] != el->el_tty.t_c[EX_IO][c]))
986 1.44 christos el->el_tty.t_c[mode][c] = el->el_tty.t_c[TS_IO][c];
987 1.44 christos if (el->el_tty.t_t[mode][MD_CHAR].t_clrmask & C_SH(c))
988 1.44 christos el->el_tty.t_c[mode][c] = el->el_tty.t_vdisable;
989 1.44 christos }
990 1.44 christos
991 1.44 christos
992 1.1 cgd /* tty_rawmode():
993 1.57 christos * Set terminal into 1 character at a time mode.
994 1.1 cgd */
995 1.65 christos libedit_private int
996 1.13 lukem tty_rawmode(EditLine *el)
997 1.1 cgd {
998 1.1 cgd
999 1.13 lukem if (el->el_tty.t_mode == ED_IO || el->el_tty.t_mode == QU_IO)
1000 1.38 christos return 0;
1001 1.13 lukem
1002 1.13 lukem if (el->el_flags & EDIT_DISABLED)
1003 1.38 christos return 0;
1004 1.12 sommerfe
1005 1.13 lukem if (tty_getty(el, &el->el_tty.t_ts) == -1) {
1006 1.1 cgd #ifdef DEBUG_TTY
1007 1.42 christos (void) fprintf(el->el_errfile, "%s: tty_getty: %s\n", __func__,
1008 1.13 lukem strerror(errno));
1009 1.1 cgd #endif /* DEBUG_TTY */
1010 1.38 christos return -1;
1011 1.1 cgd }
1012 1.13 lukem /*
1013 1.13 lukem * We always keep up with the eight bit setting and the speed of the
1014 1.32 christos * tty. But we only believe changes that are made to cooked mode!
1015 1.13 lukem */
1016 1.13 lukem el->el_tty.t_eight = tty__geteightbit(&el->el_tty.t_ts);
1017 1.13 lukem el->el_tty.t_speed = tty__getspeed(&el->el_tty.t_ts);
1018 1.13 lukem
1019 1.13 lukem if (tty__getspeed(&el->el_tty.t_ex) != el->el_tty.t_speed ||
1020 1.13 lukem tty__getspeed(&el->el_tty.t_ed) != el->el_tty.t_speed) {
1021 1.13 lukem (void) cfsetispeed(&el->el_tty.t_ex, el->el_tty.t_speed);
1022 1.13 lukem (void) cfsetospeed(&el->el_tty.t_ex, el->el_tty.t_speed);
1023 1.13 lukem (void) cfsetispeed(&el->el_tty.t_ed, el->el_tty.t_speed);
1024 1.13 lukem (void) cfsetospeed(&el->el_tty.t_ed, el->el_tty.t_speed);
1025 1.1 cgd }
1026 1.13 lukem if (tty__cooked_mode(&el->el_tty.t_ts)) {
1027 1.44 christos int i;
1028 1.44 christos
1029 1.44 christos for (i = MD_INP; i <= MD_LIN; i++)
1030 1.44 christos tty_update_flags(el, i);
1031 1.44 christos
1032 1.13 lukem if (tty__gettabs(&el->el_tty.t_ex) == 0)
1033 1.13 lukem el->el_tty.t_tabs = 0;
1034 1.13 lukem else
1035 1.13 lukem el->el_tty.t_tabs = EL_CAN_TAB ? 1 : 0;
1036 1.1 cgd
1037 1.44 christos tty__getchar(&el->el_tty.t_ts, el->el_tty.t_c[TS_IO]);
1038 1.44 christos /*
1039 1.44 christos * Check if the user made any changes.
1040 1.44 christos * If he did, then propagate the changes to the
1041 1.44 christos * edit and execute data structures.
1042 1.44 christos */
1043 1.44 christos for (i = 0; i < C_NCC; i++)
1044 1.44 christos if (el->el_tty.t_c[TS_IO][i] !=
1045 1.44 christos el->el_tty.t_c[EX_IO][i])
1046 1.44 christos break;
1047 1.1 cgd
1048 1.44 christos if (i != C_NCC) {
1049 1.13 lukem /*
1050 1.65 christos * Propagate changes only to the unlibedit_private
1051 1.44 christos * chars that have been modified just now.
1052 1.44 christos */
1053 1.44 christos for (i = 0; i < C_NCC; i++)
1054 1.44 christos tty_update_char(el, ED_IO, i);
1055 1.44 christos
1056 1.44 christos tty_bind_char(el, 0);
1057 1.44 christos tty__setchar(&el->el_tty.t_ed, el->el_tty.t_c[ED_IO]);
1058 1.44 christos
1059 1.13 lukem for (i = 0; i < C_NCC; i++)
1060 1.44 christos tty_update_char(el, EX_IO, i);
1061 1.44 christos
1062 1.44 christos tty__setchar(&el->el_tty.t_ex, el->el_tty.t_c[EX_IO]);
1063 1.1 cgd }
1064 1.1 cgd }
1065 1.26 christos if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ed) == -1) {
1066 1.1 cgd #ifdef DEBUG_TTY
1067 1.42 christos (void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", __func__,
1068 1.13 lukem strerror(errno));
1069 1.1 cgd #endif /* DEBUG_TTY */
1070 1.38 christos return -1;
1071 1.13 lukem }
1072 1.13 lukem el->el_tty.t_mode = ED_IO;
1073 1.38 christos return 0;
1074 1.13 lukem }
1075 1.1 cgd
1076 1.1 cgd
1077 1.1 cgd /* tty_cookedmode():
1078 1.1 cgd * Set the tty back to normal mode
1079 1.1 cgd */
1080 1.65 christos libedit_private int
1081 1.13 lukem tty_cookedmode(EditLine *el)
1082 1.1 cgd { /* set tty in normal setup */
1083 1.1 cgd
1084 1.13 lukem if (el->el_tty.t_mode == EX_IO)
1085 1.38 christos return 0;
1086 1.13 lukem
1087 1.13 lukem if (el->el_flags & EDIT_DISABLED)
1088 1.38 christos return 0;
1089 1.13 lukem
1090 1.26 christos if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ex) == -1) {
1091 1.1 cgd #ifdef DEBUG_TTY
1092 1.42 christos (void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", __func__,
1093 1.13 lukem strerror(errno));
1094 1.1 cgd #endif /* DEBUG_TTY */
1095 1.38 christos return -1;
1096 1.13 lukem }
1097 1.13 lukem el->el_tty.t_mode = EX_IO;
1098 1.38 christos return 0;
1099 1.13 lukem }
1100 1.1 cgd
1101 1.1 cgd
1102 1.1 cgd /* tty_quotemode():
1103 1.1 cgd * Turn on quote mode
1104 1.1 cgd */
1105 1.65 christos libedit_private int
1106 1.13 lukem tty_quotemode(EditLine *el)
1107 1.1 cgd {
1108 1.13 lukem if (el->el_tty.t_mode == QU_IO)
1109 1.38 christos return 0;
1110 1.1 cgd
1111 1.13 lukem el->el_tty.t_qu = el->el_tty.t_ed;
1112 1.1 cgd
1113 1.43 christos tty_setup_flags(el, &el->el_tty.t_qu, QU_IO);
1114 1.1 cgd
1115 1.26 christos if (tty_setty(el, TCSADRAIN, &el->el_tty.t_qu) == -1) {
1116 1.1 cgd #ifdef DEBUG_TTY
1117 1.42 christos (void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", __func__,
1118 1.13 lukem strerror(errno));
1119 1.1 cgd #endif /* DEBUG_TTY */
1120 1.38 christos return -1;
1121 1.13 lukem }
1122 1.13 lukem el->el_tty.t_mode = QU_IO;
1123 1.38 christos return 0;
1124 1.13 lukem }
1125 1.1 cgd
1126 1.1 cgd
1127 1.1 cgd /* tty_noquotemode():
1128 1.1 cgd * Turn off quote mode
1129 1.1 cgd */
1130 1.65 christos libedit_private int
1131 1.13 lukem tty_noquotemode(EditLine *el)
1132 1.1 cgd {
1133 1.13 lukem
1134 1.13 lukem if (el->el_tty.t_mode != QU_IO)
1135 1.38 christos return 0;
1136 1.26 christos if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ed) == -1) {
1137 1.1 cgd #ifdef DEBUG_TTY
1138 1.42 christos (void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", __func__,
1139 1.13 lukem strerror(errno));
1140 1.1 cgd #endif /* DEBUG_TTY */
1141 1.38 christos return -1;
1142 1.13 lukem }
1143 1.13 lukem el->el_tty.t_mode = ED_IO;
1144 1.38 christos return 0;
1145 1.1 cgd }
1146 1.1 cgd
1147 1.13 lukem
1148 1.1 cgd /* tty_stty():
1149 1.1 cgd * Stty builtin
1150 1.1 cgd */
1151 1.65 christos libedit_private int
1152 1.1 cgd /*ARGSUSED*/
1153 1.62 christos tty_stty(EditLine *el, int argc __attribute__((__unused__)),
1154 1.62 christos const wchar_t **argv)
1155 1.1 cgd {
1156 1.14 jdolecek const ttymodes_t *m;
1157 1.16 christos char x;
1158 1.13 lukem int aflag = 0;
1159 1.62 christos const wchar_t *s, *d;
1160 1.32 christos char name[EL_BUFSIZ];
1161 1.19 christos struct termios *tios = &el->el_tty.t_ex;
1162 1.13 lukem int z = EX_IO;
1163 1.13 lukem
1164 1.13 lukem if (argv == NULL)
1165 1.38 christos return -1;
1166 1.69 christos strlcpy(name, ct_encode_string(*argv++, &el->el_scratch), sizeof(name));
1167 1.13 lukem
1168 1.13 lukem while (argv && *argv && argv[0][0] == '-' && argv[0][2] == '\0')
1169 1.13 lukem switch (argv[0][1]) {
1170 1.13 lukem case 'a':
1171 1.13 lukem aflag++;
1172 1.13 lukem argv++;
1173 1.13 lukem break;
1174 1.13 lukem case 'd':
1175 1.13 lukem argv++;
1176 1.19 christos tios = &el->el_tty.t_ed;
1177 1.13 lukem z = ED_IO;
1178 1.13 lukem break;
1179 1.13 lukem case 'x':
1180 1.13 lukem argv++;
1181 1.19 christos tios = &el->el_tty.t_ex;
1182 1.13 lukem z = EX_IO;
1183 1.13 lukem break;
1184 1.13 lukem case 'q':
1185 1.13 lukem argv++;
1186 1.19 christos tios = &el->el_tty.t_ts;
1187 1.13 lukem z = QU_IO;
1188 1.13 lukem break;
1189 1.13 lukem default:
1190 1.13 lukem (void) fprintf(el->el_errfile,
1191 1.51 christos "%s: Unknown switch `%lc'.\n",
1192 1.51 christos name, (wint_t)argv[0][1]);
1193 1.38 christos return -1;
1194 1.13 lukem }
1195 1.1 cgd
1196 1.13 lukem if (!argv || !*argv) {
1197 1.13 lukem int i = -1;
1198 1.29 christos size_t len = 0, st = 0, cu;
1199 1.13 lukem for (m = ttymodes; m->m_name; m++) {
1200 1.13 lukem if (m->m_type != i) {
1201 1.13 lukem (void) fprintf(el->el_outfile, "%s%s",
1202 1.13 lukem i != -1 ? "\n" : "",
1203 1.13 lukem el->el_tty.t_t[z][m->m_type].t_name);
1204 1.13 lukem i = m->m_type;
1205 1.13 lukem st = len =
1206 1.13 lukem strlen(el->el_tty.t_t[z][m->m_type].t_name);
1207 1.13 lukem }
1208 1.24 christos if (i != -1) {
1209 1.24 christos x = (el->el_tty.t_t[z][i].t_setmask & m->m_value)
1210 1.24 christos ? '+' : '\0';
1211 1.40 christos
1212 1.40 christos if (el->el_tty.t_t[z][i].t_clrmask & m->m_value)
1213 1.40 christos x = '-';
1214 1.24 christos } else {
1215 1.24 christos x = '\0';
1216 1.24 christos }
1217 1.13 lukem
1218 1.13 lukem if (x != '\0' || aflag) {
1219 1.13 lukem
1220 1.13 lukem cu = strlen(m->m_name) + (x != '\0') + 1;
1221 1.13 lukem
1222 1.42 christos if (len + cu >=
1223 1.42 christos (size_t)el->el_terminal.t_size.h) {
1224 1.13 lukem (void) fprintf(el->el_outfile, "\n%*s",
1225 1.29 christos (int)st, "");
1226 1.13 lukem len = st + cu;
1227 1.13 lukem } else
1228 1.13 lukem len += cu;
1229 1.13 lukem
1230 1.13 lukem if (x != '\0')
1231 1.13 lukem (void) fprintf(el->el_outfile, "%c%s ",
1232 1.13 lukem x, m->m_name);
1233 1.13 lukem else
1234 1.13 lukem (void) fprintf(el->el_outfile, "%s ",
1235 1.13 lukem m->m_name);
1236 1.13 lukem }
1237 1.1 cgd }
1238 1.13 lukem (void) fprintf(el->el_outfile, "\n");
1239 1.38 christos return 0;
1240 1.1 cgd }
1241 1.13 lukem while (argv && (s = *argv++)) {
1242 1.62 christos const wchar_t *p;
1243 1.13 lukem switch (*s) {
1244 1.13 lukem case '+':
1245 1.13 lukem case '-':
1246 1.40 christos x = (char)*s++;
1247 1.13 lukem break;
1248 1.13 lukem default:
1249 1.13 lukem x = '\0';
1250 1.13 lukem break;
1251 1.13 lukem }
1252 1.13 lukem d = s;
1253 1.61 christos p = wcschr(s, L'=');
1254 1.13 lukem for (m = ttymodes; m->m_name; m++)
1255 1.42 christos if ((p ? strncmp(m->m_name, ct_encode_string(d,
1256 1.42 christos &el->el_scratch), (size_t)(p - d)) :
1257 1.42 christos strcmp(m->m_name, ct_encode_string(d,
1258 1.42 christos &el->el_scratch))) == 0 &&
1259 1.19 christos (p == NULL || m->m_type == MD_CHAR))
1260 1.13 lukem break;
1261 1.13 lukem
1262 1.13 lukem if (!m->m_name) {
1263 1.13 lukem (void) fprintf(el->el_errfile,
1264 1.60 christos "%s: Invalid argument `%ls'.\n", name, d);
1265 1.38 christos return -1;
1266 1.19 christos }
1267 1.19 christos if (p) {
1268 1.19 christos int c = ffs((int)m->m_value);
1269 1.32 christos int v = *++p ? parse__escape(&p) :
1270 1.19 christos el->el_tty.t_vdisable;
1271 1.31 christos assert(c != 0);
1272 1.31 christos c--;
1273 1.19 christos c = tty__getcharindex(c);
1274 1.19 christos assert(c != -1);
1275 1.40 christos tios->c_cc[c] = (cc_t)v;
1276 1.19 christos continue;
1277 1.13 lukem }
1278 1.13 lukem switch (x) {
1279 1.13 lukem case '+':
1280 1.13 lukem el->el_tty.t_t[z][m->m_type].t_setmask |= m->m_value;
1281 1.13 lukem el->el_tty.t_t[z][m->m_type].t_clrmask &= ~m->m_value;
1282 1.13 lukem break;
1283 1.13 lukem case '-':
1284 1.13 lukem el->el_tty.t_t[z][m->m_type].t_setmask &= ~m->m_value;
1285 1.13 lukem el->el_tty.t_t[z][m->m_type].t_clrmask |= m->m_value;
1286 1.13 lukem break;
1287 1.13 lukem default:
1288 1.13 lukem el->el_tty.t_t[z][m->m_type].t_setmask &= ~m->m_value;
1289 1.13 lukem el->el_tty.t_t[z][m->m_type].t_clrmask &= ~m->m_value;
1290 1.13 lukem break;
1291 1.13 lukem }
1292 1.1 cgd }
1293 1.27 christos
1294 1.45 christos tty_setup_flags(el, tios, z);
1295 1.27 christos if (el->el_tty.t_mode == z) {
1296 1.27 christos if (tty_setty(el, TCSADRAIN, tios) == -1) {
1297 1.27 christos #ifdef DEBUG_TTY
1298 1.42 christos (void) fprintf(el->el_errfile, "%s: tty_setty: %s\n",
1299 1.42 christos __func__, strerror(errno));
1300 1.27 christos #endif /* DEBUG_TTY */
1301 1.38 christos return -1;
1302 1.27 christos }
1303 1.27 christos }
1304 1.27 christos
1305 1.38 christos return 0;
1306 1.13 lukem }
1307 1.1 cgd
1308 1.1 cgd
1309 1.1 cgd #ifdef notyet
1310 1.1 cgd /* tty_printchar():
1311 1.1 cgd * DEbugging routine to print the tty characters
1312 1.1 cgd */
1313 1.63 christos static void
1314 1.13 lukem tty_printchar(EditLine *el, unsigned char *s)
1315 1.1 cgd {
1316 1.13 lukem ttyperm_t *m;
1317 1.13 lukem int i;
1318 1.1 cgd
1319 1.13 lukem for (i = 0; i < C_NCC; i++) {
1320 1.13 lukem for (m = el->el_tty.t_t; m->m_name; m++)
1321 1.13 lukem if (m->m_type == MD_CHAR && C_SH(i) == m->m_value)
1322 1.13 lukem break;
1323 1.13 lukem if (m->m_name)
1324 1.13 lukem (void) fprintf(el->el_errfile, "%s ^%c ",
1325 1.13 lukem m->m_name, s[i] + 'A' - 1);
1326 1.13 lukem if (i % 5 == 0)
1327 1.13 lukem (void) fprintf(el->el_errfile, "\n");
1328 1.13 lukem }
1329 1.13 lukem (void) fprintf(el->el_errfile, "\n");
1330 1.1 cgd }
1331 1.1 cgd #endif /* notyet */
1332 1.43 christos
1333 1.43 christos
1334 1.63 christos static void
1335 1.43 christos tty_setup_flags(EditLine *el, struct termios *tios, int mode)
1336 1.43 christos {
1337 1.44 christos int kind;
1338 1.44 christos for (kind = MD_INP; kind <= MD_LIN; kind++) {
1339 1.44 christos tcflag_t *f = tty__get_flag(tios, kind);
1340 1.44 christos *f = tty_update_flag(el, *f, mode, kind);
1341 1.44 christos }
1342 1.43 christos }
1343 1.68 christos
1344 1.68 christos libedit_private int
1345 1.68 christos tty_get_signal_character(EditLine *el, int sig)
1346 1.68 christos {
1347 1.68 christos #ifdef ECHOCTL
1348 1.68 christos tcflag_t *ed = tty__get_flag(&el->el_tty.t_ed, MD_INP);
1349 1.68 christos if ((*ed & ECHOCTL) == 0)
1350 1.68 christos return -1;
1351 1.68 christos #endif
1352 1.68 christos switch (sig) {
1353 1.70 christos #if defined(SIGINT) && defined(VINTR)
1354 1.68 christos case SIGINT:
1355 1.68 christos return el->el_tty.t_c[ED_IO][VINTR];
1356 1.68 christos #endif
1357 1.70 christos #if defined(SIGQUIT) && defined(VQUIT)
1358 1.68 christos case SIGQUIT:
1359 1.68 christos return el->el_tty.t_c[ED_IO][VQUIT];
1360 1.68 christos #endif
1361 1.70 christos #if defined(SIGINFO) && defined(VSTATUS)
1362 1.68 christos case SIGINFO:
1363 1.68 christos return el->el_tty.t_c[ED_IO][VSTATUS];
1364 1.68 christos #endif
1365 1.70 christos #if defined(SIGTSTP) && defined(VSUSP)
1366 1.68 christos case SIGTSTP:
1367 1.68 christos return el->el_tty.t_c[ED_IO][VSUSP];
1368 1.68 christos #endif
1369 1.68 christos default:
1370 1.68 christos return -1;
1371 1.68 christos }
1372 1.68 christos }
1373