1 /* $Header: /p/tcsh/cvsroot/tcsh/ed.term.c,v 1.36 2006/03/02 18:46:44 christos Exp $ */
3 * ed.term.c: Low level terminal interface
6 * Copyright (c) 1980, 1991 The Regents of the University of California.
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
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. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 RCSID("$tcsh: ed.term.c,v 1.36 2006/03/02 18:46:44 christos Exp $")
43 #if defined(POSIX) || defined(TERMIO)
44 { "iflag:", ICRNL, (INLCR|IGNCR) },
45 { "oflag:", (OPOST|ONLCR), ONLRET },
47 { "lflag:", (ISIG|ICANON|ECHO|ECHOE|ECHOCTL|IEXTEN),
48 (NOFLSH|ECHONL|EXTPROC|FLUSHO|IDEFAULT) },
50 { "nrmal:", (ECHO|CRMOD|ANYP), (CBREAK|RAW|LCASE|VTDELAY|ALLDELAY) },
51 { "local:", (LCRTBS|LCRTERA|LCRTKIL), (LPRTERA|LFLUSHO) },
52 #endif /* POSIX || TERMIO */
56 #if defined(POSIX) || defined(TERMIO)
57 { "iflag:", (INLCR|ICRNL), IGNCR },
58 { "oflag:", (OPOST|ONLCR), ONLRET },
61 (NOFLSH|ICANON|ECHO|ECHOK|ECHONL|EXTPROC|IEXTEN|FLUSHO|
64 { "nrmal:", (CBREAK|CRMOD|ANYP), (RAW|ECHO|LCASE|VTDELAY|ALLDELAY) },
65 { "local:", (LCRTBS|LCRTERA|LCRTKIL), (LPRTERA|LFLUSHO) },
66 #endif /* POSIX || TERMIO */
67 { "chars:", (C_SH(C_MIN)|C_SH(C_TIME)|C_SH(C_SWTCH)|C_SH(C_DSWTCH)|
68 C_SH(C_WERASE)|C_SH(C_REPRINT)|C_SH(C_SUSP)|C_SH(C_DSUSP)|
69 C_SH(C_EOF)|C_SH(C_EOL)|C_SH(C_DISCARD)|C_SH(C_PGOFF)|
70 C_SH(C_KILL2)|C_SH(C_PAGE)|C_SH(C_STATUS)|C_SH(C_LNEXT)),
74 #if defined(POSIX) || defined(TERMIO)
75 { "iflag:", 0, IXON | IXOFF },
78 { "lflag:", 0, ISIG | IEXTEN },
80 { "nrmal:", RAW, CBREAK },
82 #endif /* POSIX || TERMIO */
87 static const struct tcshmodes {
90 unsigned long m_value;
96 #if defined(POSIX) || defined(TERMIO)
99 { "ignbrk", IGNBRK, M_INPUT },
102 { "brkint", BRKINT, M_INPUT },
105 { "ignpar", IGNPAR, M_INPUT },
108 { "parmrk", PARMRK, M_INPUT },
111 { "inpck", INPCK, M_INPUT },
114 { "istrip", ISTRIP, M_INPUT },
117 { "inlcr", INLCR, M_INPUT },
120 { "igncr", IGNCR, M_INPUT },
123 { "icrnl", ICRNL, M_INPUT },
126 { "iuclc", IUCLC, M_INPUT },
129 { "ixon", IXON, M_INPUT },
132 { "ixany", IXANY, M_INPUT },
135 { "ixoff", IXOFF, M_INPUT },
138 { "imaxbel",IMAXBEL,M_INPUT },
139 # endif /* IMAXBEL */
141 { "idelete",IDELETE,M_INPUT },
142 # endif /* IDELETE */
145 { "opost", OPOST, M_OUTPUT },
148 { "olcuc", OLCUC, M_OUTPUT },
151 { "onlcr", ONLCR, M_OUTPUT },
154 { "ocrnl", OCRNL, M_OUTPUT },
157 { "onocr", ONOCR, M_OUTPUT },
160 { "onoeot", ONOEOT, M_OUTPUT },
163 { "onlret", ONLRET, M_OUTPUT },
166 { "ofill", OFILL, M_OUTPUT },
169 { "ofdel", OFDEL, M_OUTPUT },
172 { "nldly", NLDLY, M_OUTPUT },
175 { "crdly", CRDLY, M_OUTPUT },
178 { "tabdly", TABDLY, M_OUTPUT },
181 { "xtabs", XTABS, M_OUTPUT },
184 { "bsdly", BSDLY, M_OUTPUT },
187 { "vtdly", VTDLY, M_OUTPUT },
190 { "ffdly", FFDLY, M_OUTPUT },
193 { "pageout",PAGEOUT,M_OUTPUT },
194 # endif /* PAGEOUT */
196 { "wrap", WRAP, M_OUTPUT },
200 { "cignore",CIGNORE,M_CONTROL },
203 { "cbaud", CBAUD, M_CONTROL },
206 { "cstopb", CSTOPB, M_CONTROL },
209 { "cread", CREAD, M_CONTROL },
212 { "parenb", PARENB, M_CONTROL },
215 { "parodd", PARODD, M_CONTROL },
218 { "hupcl", HUPCL, M_CONTROL },
221 { "clocal", CLOCAL, M_CONTROL },
224 { "loblk", LOBLK, M_CONTROL },
227 { "cibaud", CIBAUD, M_CONTROL },
231 { "ccts_oflow",CCTS_OFLOW,M_CONTROL },
233 { "crtscts",CRTSCTS,M_CONTROL },
234 # endif /* CCTS_OFLOW */
235 # endif /* CRTSCTS */
237 { "crts_iflow",CRTS_IFLOW,M_CONTROL },
238 # endif /* CRTS_IFLOW */
240 { "mdmbuf", MDMBUF, M_CONTROL },
243 { "rcv1en", RCV1EN, M_CONTROL },
246 { "xmt1en", XMT1EN, M_CONTROL },
250 { "isig", ISIG, M_LINED },
253 { "icanon", ICANON, M_LINED },
256 { "xcase", XCASE, M_LINED },
259 { "echo", ECHO, M_LINED },
262 { "echoe", ECHOE, M_LINED },
265 { "echok", ECHOK, M_LINED },
268 { "echonl", ECHONL, M_LINED },
271 { "noflsh", NOFLSH, M_LINED },
274 { "tostop", TOSTOP, M_LINED },
277 { "echoctl",ECHOCTL,M_LINED },
278 # endif /* ECHOCTL */
280 { "echoprt",ECHOPRT,M_LINED },
281 # endif /* ECHOPRT */
283 { "echoke", ECHOKE, M_LINED },
286 { "defecho",DEFECHO,M_LINED },
287 # endif /* DEFECHO */
289 { "flusho", FLUSHO, M_LINED },
292 { "pendin", PENDIN, M_LINED },
295 { "iexten", IEXTEN, M_LINED },
298 { "nokerninfo",NOKERNINFO,M_LINED },
299 # endif /* NOKERNINFO */
301 { "altwerase",ALTWERASE,M_LINED },
302 # endif /* ALTWERASE */
304 { "extproc",EXTPROC,M_LINED },
305 # endif /* EXTPROC */
307 { "idefault",IDEFAULT,M_LINED },
308 # endif /* IDEFAULT */
313 { "tandem", TANDEM, M_CONTROL },
316 { "cbreak", CBREAK, M_CONTROL },
319 { "lcase", LCASE, M_CONTROL },
322 { "echo", ECHO, M_CONTROL },
325 { "crmod", CRMOD, M_CONTROL },
328 { "raw", RAW, M_CONTROL },
331 { "oddp", ODDP, M_CONTROL },
334 { "evenp", EVENP, M_CONTROL },
337 { "anyp", ANYP, M_CONTROL },
340 { "nldelay",NLDELAY,M_CONTROL },
341 # endif /* NLDELAY */
343 { "tbdelay",TBDELAY,M_CONTROL },
344 # endif /* TBDELAY */
346 { "xtabs", XTABS, M_CONTROL },
349 { "crdelay",CRDELAY,M_CONTROL },
350 # endif /* CRDELAY */
352 { "vtdelay",VTDELAY,M_CONTROL },
353 # endif /* VTDELAY */
355 { "bsdelay",BSDELAY,M_CONTROL },
356 # endif /* BSDELAY */
358 { "crtbs", CRTBS, M_CONTROL },
361 { "prtera", PRTERA, M_CONTROL },
364 { "crtera", CRTERA, M_CONTROL },
367 { "tilde", TILDE, M_CONTROL },
370 { "mdmbuf", MDMBUF, M_CONTROL },
373 { "litout", LITOUT, M_CONTROL },
376 { "tostop", TOSTOP, M_CONTROL },
379 { "flusho", FLUSHO, M_CONTROL },
382 { "nohang", NOHANG, M_CONTROL },
385 { "l001000",L001000,M_CONTROL },
386 # endif /* L001000 */
388 { "crtkil", CRTKIL, M_CONTROL },
391 { "pass8", PASS8, M_CONTROL },
394 { "ctlech", CTLECH, M_CONTROL },
397 { "pendin", PENDIN, M_CONTROL },
400 { "decctq", DECCTQ, M_CONTROL },
403 { "noflsh", NOFLSH, M_CONTROL },
407 { "lcrtbs", LCRTBS, M_LOCAL },
410 { "lprtera",LPRTERA,M_LOCAL },
411 # endif /* LPRTERA */
413 { "lcrtera",LCRTERA,M_LOCAL },
414 # endif /* LCRTERA */
416 { "ltilde", LTILDE, M_LOCAL },
419 { "lmdmbuf",LMDMBUF,M_LOCAL },
420 # endif /* LMDMBUF */
422 { "llitout",LLITOUT,M_LOCAL },
423 # endif /* LLITOUT */
425 { "ltostop",LTOSTOP,M_LOCAL },
426 # endif /* LTOSTOP */
428 { "lflusho",LFLUSHO,M_LOCAL },
429 # endif /* LFLUSHO */
431 { "lnohang",LNOHANG,M_LOCAL },
432 # endif /* LNOHANG */
434 { "lcrtkil",LCRTKIL,M_LOCAL },
435 # endif /* LCRTKIL */
437 { "lpass8", LPASS8, M_LOCAL },
440 { "lctlech",LCTLECH,M_LOCAL },
441 # endif /* LCTLECH */
443 { "lpendin",LPENDIN,M_LOCAL },
444 # endif /* LPENDIN */
446 { "ldecctq",LDECCTQ,M_LOCAL },
447 # endif /* LDECCTQ */
449 { "lnoflsh",LNOFLSH,M_LOCAL },
450 # endif /* LNOFLSH */
452 #endif /* POSIX || TERMIO */
453 # if defined(VINTR) || defined(TIOCGETC)
454 { "intr", C_SH(C_INTR), M_CHAR },
456 # if defined(VQUIT) || defined(TIOCGETC)
457 { "quit", C_SH(C_QUIT), M_CHAR },
459 # if defined(VERASE) || defined(TIOCGETP)
460 { "erase", C_SH(C_ERASE), M_CHAR },
462 # if defined(VKILL) || defined(TIOCGETP)
463 { "kill", C_SH(C_KILL), M_CHAR },
465 # if defined(VEOF) || defined(TIOCGETC)
466 { "eof", C_SH(C_EOF), M_CHAR },
469 { "eol", C_SH(C_EOL), M_CHAR },
472 { "eol2", C_SH(C_EOL2), M_CHAR },
475 { "swtch", C_SH(C_SWTCH), M_CHAR },
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 },
486 # if defined(VSTOP) || defined(TIOCGETC)
487 { "stop", C_SH(C_STOP), M_CHAR },
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 },
495 # if defined(VDSUSP) || defined(TIOCGLTC)
496 { "dsusp", C_SH(C_DSUSP), M_CHAR },
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 },
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 },
513 # if defined(VPGOFF) || defined(TIOCGPAGE)
514 { "pgoff", C_SH(C_PGOFF), M_CHAR },
517 { "kill2", C_SH(C_KILL2), M_CHAR },
519 # if defined(VBRK) || defined(TIOCGETC)
520 { "brk", C_SH(C_BRK), M_CHAR },
523 { "min", C_SH(C_MIN), M_CHAR },
526 { "time", C_SH(C_TIME), M_CHAR },
532 * If EAGAIN and/or EWOULDBLOCK are defined, we can't just return -1 in all
533 * situations where ioctl() does.
535 * On AIX 4.1.5 (and presumably some other versions and OSes), as you
536 * perform the manual test suite in the README, if you 'bg' vi immediately
537 * after suspending it, all is well, but if you wait a few seconds,
538 * usually ioctl() will return -1, which previously caused tty_setty() to
539 * return -1, causing Rawmode() to return -1, causing Inputl() to return
540 * 0, causing bgetc() to return -1, causing readc() to set doneinp to 1,
541 * causing process() to break out of the main loop, causing tcsh to exit
544 * If ioctl()'s errno is EAGAIN/EWOULDBLOCK ("Resource temporarily
545 * unavailable"), apparently the tty is being messed with by the OS and we
546 * need to try again. In my testing, ioctl() was never called more than
549 * -- Dan Harkless <dan@wave.eng.uci.edu>
551 * So, I retry all ioctl's in case others happen to fail too (christos)
554 #if defined(EAGAIN) && defined(EWOULDBLOCK) && (EWOULDBLOCK != EAGAIN)
555 # define OKERROR(e) (((e) == EAGAIN) || ((e) == EWOULDBLOCK) || ((e) == EINTR))
556 #elif defined(EAGAIN)
557 # define OKERROR(e) (((e) == EAGAIN) || ((e) == EINTR))
558 #elif defined(EWOULDBLOCK)
559 # define OKERROR(e) (((e) == EWOULDBLOCK) || ((e) == EINTR))
561 # define OKERROR(e) ((e) == EINTR)
565 #define KLUDGE (errno == ENOTTY && count < 10)
570 /* Retry a system call */
575 for (count = 0;; count++) \
577 if (OKERROR(errno) || KLUDGE) \
588 dosetty(Char **v, struct command *t)
590 const struct tcshmodes *m;
591 char x, *d, *cmdname;
597 cmdname = strsave(short2str(*v++));
598 cleanup_push(cmdname, xfree);
601 while (v && *v && v[0][0] == '-' && v[0][2] == '\0')
620 stderror(ERR_NAME | ERR_SYSTEM, short2str(v[0]),
621 CGETS(8, 1, "Unknown switch"));
628 int len = 0, st = 0, cu;
629 for (m = modelist; m->m_name; m++) {
630 if (m->m_type != i) {
631 xprintf("%s%s", i != -1 ? "\n" : "",
632 ttylist[z][m->m_type].t_name);
634 st = len = strlen(ttylist[z][m->m_type].t_name);
637 x = (ttylist[z][i].t_setmask & m->m_value) ? '+' : '\0';
638 x = (ttylist[z][i].t_clrmask & m->m_value) ? '-' : x;
640 if (x != '\0' || aflag) {
641 cu = strlen(m->m_name) + (x != '\0') + 1;
642 if (len + cu >= TermH) {
643 xprintf("\n%*s", st, "");
649 xprintf("%c%s ", x, m->m_name);
651 xprintf("%s ", m->m_name);
655 cleanup_until(cmdname);
658 while (v && (s = *v++)) {
669 for (m = modelist; m->m_name; m++)
670 if (strcmp(m->m_name, d) == 0)
673 stderror(ERR_NAME | ERR_SYSTEM, d, CGETS(8, 2, "Invalid argument"));
677 ttylist[z][m->m_type].t_setmask |= m->m_value;
678 ttylist[z][m->m_type].t_clrmask &= ~m->m_value;
681 ttylist[z][m->m_type].t_setmask &= ~m->m_value;
682 ttylist[z][m->m_type].t_clrmask |= m->m_value;
685 ttylist[z][m->m_type].t_setmask &= ~m->m_value;
686 ttylist[z][m->m_type].t_clrmask &= ~m->m_value;
690 cleanup_until(cmdname);
694 tty_getty(int fd, ttydata_t *td)
697 RETRY(tcgetattr(fd, &td->d_t));
698 #else /* TERMIO || GSTTY */
700 RETRY(ioctl(fd, TCGETA, (ioctl_t) &td->d_t));
703 RETRY(ioctl(fd, TIOCGETP, (ioctl_t) &td->d_t));
704 # endif /* TIOCGETP */
706 RETRY(ioctl(fd, TIOCGETC, (ioctl_t) &td->d_tc));
707 # endif /* TIOCGETC */
709 RETRY(ioctl(fd, TIOCGPAGE, (ioctl_t) &td->d_pc));
710 # endif /* TIOCGPAGE */
712 RETRY(ioctl(fd, TIOCLGET, (ioctl_t) &td->d_lb));
713 # endif /* TIOCLGET */
718 RETRY(ioctl(fd, TIOCGLTC, (ioctl_t) &td->d_ltc));
719 #endif /* TIOCGLTC */
725 tty_setty(int fd, ttydata_t *td)
728 RETRY(xtcsetattr(fd, TCSADRAIN, &td->d_t));
731 RETRY(ioctl(fd, TCSETAW, (ioctl_t) &td->d_t));
734 RETRY(ioctl(fd, TIOCSETN, (ioctl_t) &td->d_t));
735 # endif /* TIOCSETN */
737 RETRY(ioctl(fd, TIOCSETC, (ioctl_t) &td->d_tc));
738 # endif /* TIOCGETC */
740 RETRY(ioctl(fd, TIOCSPAGE, (ioctl_t) &td->d_pc));
741 # endif /* TIOCGPAGE */
743 RETRY(ioctl(fd, TIOCLSET, (ioctl_t) &td->d_lb));
744 # endif /* TIOCLGET */
749 RETRY(ioctl(fd, TIOCSLTC, (ioctl_t) &td->d_ltc));
750 #endif /* TIOCGLTC */
756 tty_getchar(ttydata_t *td, unsigned char *s)
760 struct ltchars *n = &td->d_ltc;
762 s[C_SUSP] = n->t_suspc;
763 s[C_DSUSP] = n->t_dsuspc;
764 s[C_REPRINT] = n->t_rprntc;
765 s[C_DISCARD] = n->t_flushc;
766 s[C_WERASE] = n->t_werasc;
767 s[C_LNEXT] = n->t_lnextc;
769 #endif /* TIOCGLTC */
771 #if defined(POSIX) || defined(TERMIO)
774 struct termios *n = &td->d_t;
776 struct termio *n = &td->d_t;
780 s[C_INTR] = n->c_cc[VINTR];
783 s[C_QUIT] = n->c_cc[VQUIT];
786 s[C_ERASE] = n->c_cc[VERASE];
789 s[C_KILL] = n->c_cc[VKILL];
792 s[C_EOF] = n->c_cc[VEOF];
795 s[C_EOL] = n->c_cc[VEOL];
798 s[C_EOL2] = n->c_cc[VEOL2];
801 s[C_SWTCH] = n->c_cc[VSWTCH];
804 s[C_DSWTCH] = n->c_cc[VDSWTCH];
805 # endif /* VDSWTCH */
807 s[C_ERASE2] = n->c_cc[VERASE2];
808 # endif /* VERASE2 */
810 s[C_START] = n->c_cc[VSTART];
813 s[C_STOP] = n->c_cc[VSTOP];
816 s[C_WERASE] = n->c_cc[VWERASE];
817 # endif /* VWERASE */
819 s[C_SUSP] = n->c_cc[VSUSP];
822 s[C_DSUSP] = n->c_cc[VDSUSP];
825 s[C_REPRINT] = n->c_cc[VREPRINT];
826 # endif /* WREPRINT */
828 s[C_DISCARD] = n->c_cc[VDISCARD];
829 # endif /* VDISCARD */
831 s[C_LNEXT] = n->c_cc[VLNEXT];
834 s[C_STATUS] = n->c_cc[VSTATUS];
835 # endif /* VSTATUS */
837 s[C_PAGE] = n->c_cc[VPAGE];
840 s[C_PGOFF] = n->c_cc[VPGOFF];
843 s[C_KILL2] = n->c_cc[VKILL2];
846 s[C_MIN] = n->c_cc[VMIN];
849 s[C_TIME] = n->c_cc[VTIME];
857 struct ttypagestat *n = &td->d_pc;
859 s[C_STATUS] = n->tps_statc;
860 s[C_PAGE] = n->tps_pagec;
861 s[C_PGOFF] = n->tps_pgoffc;
863 # endif /* TIOCGPAGE */
867 struct tchars *n = &td->d_tc;
869 s[C_INTR] = n->t_intrc;
870 s[C_QUIT] = n->t_quitc;
871 s[C_START] = n->t_startc;
872 s[C_STOP] = n->t_stopc;
873 s[C_EOF] = n->t_eofc;
874 s[C_BRK] = n->t_brkc;
876 # endif /* TIOCGETC */
880 struct sgttyb *n = &td->d_t;
882 s[C_ERASE] = n->sg_erase;
883 s[C_KILL] = n->sg_kill;
885 # endif /* TIOCGETP */
886 #endif /* !POSIX || TERMIO */
892 tty_setchar(ttydata_t *td, unsigned char *s)
896 struct ltchars *n = &td->d_ltc;
898 n->t_suspc = s[C_SUSP];
899 n->t_dsuspc = s[C_DSUSP];
900 n->t_rprntc = s[C_REPRINT];
901 n->t_flushc = s[C_DISCARD];
902 n->t_werasc = s[C_WERASE];
903 n->t_lnextc = s[C_LNEXT];
905 #endif /* TIOCGLTC */
907 #if defined(POSIX) || defined(TERMIO)
910 struct termios *n = &td->d_t;
912 struct termio *n = &td->d_t;
916 n->c_cc[VINTR] = s[C_INTR];
919 n->c_cc[VQUIT] = s[C_QUIT];
922 n->c_cc[VERASE] = s[C_ERASE];
925 n->c_cc[VKILL] = s[C_KILL];
928 n->c_cc[VEOF] = s[C_EOF];
931 n->c_cc[VEOL] = s[C_EOL];
934 n->c_cc[VEOL2] = s[C_EOL2];
937 n->c_cc[VSWTCH] = s[C_SWTCH];
940 n->c_cc[VDSWTCH] = s[C_DSWTCH];
941 # endif /* VDSWTCH */
943 n->c_cc[VERASE2] = s[C_ERASE2];
944 # endif /* VERASE2 */
946 n->c_cc[VSTART] = s[C_START];
949 n->c_cc[VSTOP] = s[C_STOP];
952 n->c_cc[VWERASE] = s[C_WERASE];
953 # endif /* VWERASE */
955 n->c_cc[VSUSP] = s[C_SUSP];
958 n->c_cc[VDSUSP] = s[C_DSUSP];
961 n->c_cc[VREPRINT] = s[C_REPRINT];
962 # endif /* WREPRINT */
964 n->c_cc[VDISCARD] = s[C_DISCARD];
965 # endif /* VDISCARD */
967 n->c_cc[VLNEXT] = s[C_LNEXT];
970 n->c_cc[VSTATUS] = s[C_STATUS];
971 # endif /* VSTATUS */
973 n->c_cc[VPAGE] = s[C_PAGE];
976 n->c_cc[VPGOFF] = s[C_PGOFF];
979 n->c_cc[VKILL2] = s[C_KILL2];
982 n->c_cc[VMIN] = s[C_MIN];
985 n->c_cc[VTIME] = s[C_TIME];
993 struct ttypagestat *n = &td->d_pc;
997 n->tps_statc = s[C_STATUS];
998 n->tps_pagec = s[C_PAGE];
999 n->tps_pgoffc = s[C_PGOFF];
1002 # endif /* TIOCGPAGE */
1006 struct tchars *n = &td->d_tc;
1007 n->t_intrc = s[C_INTR];
1008 n->t_quitc = s[C_QUIT];
1009 n->t_startc = s[C_START];
1010 n->t_stopc = s[C_STOP];
1011 n->t_eofc = s[C_EOF];
1012 n->t_brkc = s[C_BRK];
1014 # endif /* TIOCGETC */
1018 struct sgttyb *n = &td->d_t;
1020 n->sg_erase = s[C_ERASE];
1021 n->sg_kill = s[C_KILL];
1023 # endif /* TIOCGETP */
1024 #endif /* !POSIX || TERMIO */
1029 tty_getspeed(ttydata_t *td)
1034 if ((spd = cfgetispeed(&td->d_t)) == 0)
1035 spd = cfgetospeed(&td->d_t);
1039 spd = td->d_t.c_cflag & CBAUD;
1044 spd = td->d_t.sg_ispeed;
1045 # endif /* TERMIO */
1049 } /* end tty_getspeed */
1052 tty_gettabs(ttydata_t *td)
1054 #if defined(POSIX) || defined(TERMIO)
1055 return ((td->d_t.c_oflag & TAB3) == TAB3) ? 0 : 1;
1057 return (td->d_t.sg_flags & XTABS) == XTABS ? 0 : 1;
1058 #endif /* POSIX || TERMIO */
1059 } /* end tty_gettabs */
1062 tty_geteightbit(ttydata_t *td)
1064 #if defined(POSIX) || defined(TERMIO)
1065 return (td->d_t.c_cflag & CSIZE) == CS8;
1067 return td->d_lb & (LPASS8 | LLITOUT);
1068 #endif /* POSIX || TERMIO */
1069 } /* end tty_geteightbit */
1072 tty_cooked_mode(ttydata_t *td)
1074 #if defined(POSIX) || defined(TERMIO)
1075 return (td->d_t.c_lflag & ICANON);
1077 return !(td->d_t.sg_flags & (RAW | CBREAK));
1078 #endif /* POSIX || TERMIO */
1079 } /* end tty_cooked_mode */
1083 tty_setdisc(int fd, int dis)
1085 static int edit_discipline = 0;
1086 static union txname tx_disc;
1087 extern char strPOSIX[];
1091 if (edit_discipline) {
1092 if (ioctl(fd, TXSETLD, (ioctl_t) & tx_disc) == -1)
1094 edit_discipline = 0;
1099 tx_disc.tx_which = 0;
1100 if (ioctl(fd, TXGETLD, (ioctl_t) & tx_disc) == -1)
1102 if (strcmp(tx_disc.tx_name, strPOSIX) != 0) {
1103 edit_discipline = 1;
1104 if (ioctl(fd, TXSETLD, (ioctl_t) strPOSIX) == -1)
1112 } /* end tty_setdisc */
1117 tty_printchar(unsigned char *s)
1119 struct tcshmodes *m;
1122 for (i = 0; i < C_NCC; i++) {
1123 for (m = modelist; m->m_name; m++)
1124 if (m->m_type == M_CHAR && C_SH(i) == m->m_value)
1127 xprintf("%s ^%c ", m->m_name, s[i] + 'A' - 1);
1133 #endif /* DEBUG_TTY */
1134 #else /* WINNT_NATIVE */
1136 tty_cooked_mode(void *td)
1138 return do_nt_check_cooked_mode();
1140 #endif /* !WINNT_NATIVE */