source: trunk/third/tcsh/ed.term.c @ 9006

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