2 * ed.term.c: Low level terminal interface
5 * Copyright (c) 1980, 1991 The Regents of the University of California.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. Neither the name of the University nor the names of its contributors
17 * may be used to endorse or promote products derived from this software
18 * without specific prior written permission.
20 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
40 #if defined(POSIX) || defined(TERMIO)
41 { "iflag:", ICRNL
, (INLCR
|IGNCR
) },
42 { "oflag:", (OPOST
|ONLCR
), ONLRET
},
44 { "lflag:", (ISIG
|ICANON
|ECHO
|ECHOE
|ECHOCTL
|IEXTEN
),
45 (NOFLSH
|ECHONL
|EXTPROC
|FLUSHO
|IDEFAULT
) },
47 { "nrmal:", (ECHO
|CRMOD
|ANYP
), (CBREAK
|RAW
|LCASE
|VTDELAY
|ALLDELAY
) },
48 { "local:", (LCRTBS
|LCRTERA
|LCRTKIL
), (LPRTERA
|LFLUSHO
) },
49 #endif /* POSIX || TERMIO */
53 #if defined(POSIX) || defined(TERMIO)
54 { "iflag:", (INLCR
|ICRNL
), IGNCR
},
55 { "oflag:", (OPOST
|ONLCR
), ONLRET
},
58 (NOFLSH
|ICANON
|ECHO
|ECHOK
|ECHONL
|EXTPROC
|IEXTEN
|FLUSHO
|
61 { "nrmal:", (CBREAK
|CRMOD
|ANYP
), (RAW
|ECHO
|LCASE
|VTDELAY
|ALLDELAY
) },
62 { "local:", (LCRTBS
|LCRTERA
|LCRTKIL
), (LPRTERA
|LFLUSHO
) },
63 #endif /* POSIX || TERMIO */
64 { "chars:", (C_SH(C_MIN
)|C_SH(C_TIME
)|C_SH(C_SWTCH
)|C_SH(C_DSWTCH
)|
65 C_SH(C_WERASE
)|C_SH(C_REPRINT
)|C_SH(C_SUSP
)|C_SH(C_DSUSP
)|
66 C_SH(C_EOF
)|C_SH(C_EOL
)|C_SH(C_DISCARD
)|C_SH(C_PGOFF
)|
67 C_SH(C_KILL2
)|C_SH(C_PAGE
)|C_SH(C_STATUS
)|C_SH(C_CHECKPT
)|
72 #if defined(POSIX) || defined(TERMIO)
73 { "iflag:", 0, IXON
| IXOFF
},
76 { "lflag:", 0, ISIG
| IEXTEN
},
78 { "nrmal:", RAW
, CBREAK
},
80 #endif /* POSIX || TERMIO */
85 static const struct tcshmodes
{
88 unsigned long m_value
;
94 #if defined(POSIX) || defined(TERMIO)
97 { "ignbrk", IGNBRK
, M_INPUT
},
100 { "brkint", BRKINT
, M_INPUT
},
103 { "ignpar", IGNPAR
, M_INPUT
},
106 { "parmrk", PARMRK
, M_INPUT
},
109 { "inpck", INPCK
, M_INPUT
},
112 { "istrip", ISTRIP
, M_INPUT
},
115 { "inlcr", INLCR
, M_INPUT
},
118 { "igncr", IGNCR
, M_INPUT
},
121 { "icrnl", ICRNL
, M_INPUT
},
124 { "iuclc", IUCLC
, M_INPUT
},
127 { "ixon", IXON
, M_INPUT
},
130 { "ixany", IXANY
, M_INPUT
},
133 { "ixoff", IXOFF
, M_INPUT
},
136 { "imaxbel",IMAXBEL
,M_INPUT
},
137 # endif /* IMAXBEL */
139 { "idelete",IDELETE
,M_INPUT
},
140 # endif /* IDELETE */
143 { "opost", OPOST
, M_OUTPUT
},
146 { "olcuc", OLCUC
, M_OUTPUT
},
149 { "onlcr", ONLCR
, M_OUTPUT
},
152 { "ocrnl", OCRNL
, M_OUTPUT
},
155 { "onocr", ONOCR
, M_OUTPUT
},
158 { "onoeot", ONOEOT
, M_OUTPUT
},
161 { "onlret", ONLRET
, M_OUTPUT
},
164 { "ofill", OFILL
, M_OUTPUT
},
167 { "ofdel", OFDEL
, M_OUTPUT
},
170 { "nldly", NLDLY
, M_OUTPUT
},
173 { "crdly", CRDLY
, M_OUTPUT
},
176 { "tabdly", TABDLY
, M_OUTPUT
},
179 { "xtabs", XTABS
, M_OUTPUT
},
182 { "bsdly", BSDLY
, M_OUTPUT
},
185 { "vtdly", VTDLY
, M_OUTPUT
},
188 { "ffdly", FFDLY
, M_OUTPUT
},
191 { "pageout",PAGEOUT
,M_OUTPUT
},
192 # endif /* PAGEOUT */
194 { "wrap", WRAP
, M_OUTPUT
},
198 { "cignore",CIGNORE
,M_CONTROL
},
201 { "cbaud", CBAUD
, M_CONTROL
},
204 { "cstopb", CSTOPB
, M_CONTROL
},
207 { "cread", CREAD
, M_CONTROL
},
210 { "parenb", PARENB
, M_CONTROL
},
213 { "parodd", PARODD
, M_CONTROL
},
216 { "hupcl", HUPCL
, M_CONTROL
},
219 { "clocal", CLOCAL
, M_CONTROL
},
222 { "loblk", LOBLK
, M_CONTROL
},
225 { "cibaud", CIBAUD
, M_CONTROL
},
229 { "ccts_oflow",CCTS_OFLOW
,M_CONTROL
},
231 { "crtscts",CRTSCTS
,M_CONTROL
},
232 # endif /* CCTS_OFLOW */
233 # endif /* CRTSCTS */
235 { "crts_iflow",CRTS_IFLOW
,M_CONTROL
},
236 # endif /* CRTS_IFLOW */
238 { "mdmbuf", MDMBUF
, M_CONTROL
},
241 { "rcv1en", RCV1EN
, M_CONTROL
},
244 { "xmt1en", XMT1EN
, M_CONTROL
},
248 { "isig", ISIG
, M_LINED
},
251 { "icanon", ICANON
, M_LINED
},
254 { "xcase", XCASE
, M_LINED
},
257 { "echo", ECHO
, M_LINED
},
260 { "echoe", ECHOE
, M_LINED
},
263 { "echok", ECHOK
, M_LINED
},
266 { "echonl", ECHONL
, M_LINED
},
269 { "noflsh", NOFLSH
, M_LINED
},
272 { "tostop", TOSTOP
, M_LINED
},
275 { "echoctl",ECHOCTL
,M_LINED
},
276 # endif /* ECHOCTL */
278 { "echoprt",ECHOPRT
,M_LINED
},
279 # endif /* ECHOPRT */
281 { "echoke", ECHOKE
, M_LINED
},
284 { "defecho",DEFECHO
,M_LINED
},
285 # endif /* DEFECHO */
287 { "flusho", FLUSHO
, M_LINED
},
290 { "pendin", PENDIN
, M_LINED
},
293 { "iexten", IEXTEN
, M_LINED
},
296 { "nokerninfo",NOKERNINFO
,M_LINED
},
297 # endif /* NOKERNINFO */
299 { "altwerase",ALTWERASE
,M_LINED
},
300 # endif /* ALTWERASE */
302 { "extproc",EXTPROC
,M_LINED
},
303 # endif /* EXTPROC */
305 { "idefault",IDEFAULT
,M_LINED
},
306 # endif /* IDEFAULT */
311 { "tandem", TANDEM
, M_CONTROL
},
314 { "cbreak", CBREAK
, M_CONTROL
},
317 { "lcase", LCASE
, M_CONTROL
},
320 { "echo", ECHO
, M_CONTROL
},
323 { "crmod", CRMOD
, M_CONTROL
},
326 { "raw", RAW
, M_CONTROL
},
329 { "oddp", ODDP
, M_CONTROL
},
332 { "evenp", EVENP
, M_CONTROL
},
335 { "anyp", ANYP
, M_CONTROL
},
338 { "nldelay",NLDELAY
,M_CONTROL
},
339 # endif /* NLDELAY */
341 { "tbdelay",TBDELAY
,M_CONTROL
},
342 # endif /* TBDELAY */
344 { "xtabs", XTABS
, M_CONTROL
},
347 { "crdelay",CRDELAY
,M_CONTROL
},
348 # endif /* CRDELAY */
350 { "vtdelay",VTDELAY
,M_CONTROL
},
351 # endif /* VTDELAY */
353 { "bsdelay",BSDELAY
,M_CONTROL
},
354 # endif /* BSDELAY */
356 { "crtbs", CRTBS
, M_CONTROL
},
359 { "prtera", PRTERA
, M_CONTROL
},
362 { "crtera", CRTERA
, M_CONTROL
},
365 { "tilde", TILDE
, M_CONTROL
},
368 { "mdmbuf", MDMBUF
, M_CONTROL
},
371 { "litout", LITOUT
, M_CONTROL
},
374 { "tostop", TOSTOP
, M_CONTROL
},
377 { "flusho", FLUSHO
, M_CONTROL
},
380 { "nohang", NOHANG
, M_CONTROL
},
383 { "l001000",L001000
,M_CONTROL
},
384 # endif /* L001000 */
386 { "crtkil", CRTKIL
, M_CONTROL
},
389 { "pass8", PASS8
, M_CONTROL
},
392 { "ctlech", CTLECH
, M_CONTROL
},
395 { "pendin", PENDIN
, M_CONTROL
},
398 { "decctq", DECCTQ
, M_CONTROL
},
401 { "noflsh", NOFLSH
, M_CONTROL
},
405 { "lcrtbs", LCRTBS
, M_LOCAL
},
408 { "lprtera",LPRTERA
,M_LOCAL
},
409 # endif /* LPRTERA */
411 { "lcrtera",LCRTERA
,M_LOCAL
},
412 # endif /* LCRTERA */
414 { "ltilde", LTILDE
, M_LOCAL
},
417 { "lmdmbuf",LMDMBUF
,M_LOCAL
},
418 # endif /* LMDMBUF */
420 { "llitout",LLITOUT
,M_LOCAL
},
421 # endif /* LLITOUT */
423 { "ltostop",LTOSTOP
,M_LOCAL
},
424 # endif /* LTOSTOP */
426 { "lflusho",LFLUSHO
,M_LOCAL
},
427 # endif /* LFLUSHO */
429 { "lnohang",LNOHANG
,M_LOCAL
},
430 # endif /* LNOHANG */
432 { "lcrtkil",LCRTKIL
,M_LOCAL
},
433 # endif /* LCRTKIL */
435 { "lpass8", LPASS8
, M_LOCAL
},
438 { "lctlech",LCTLECH
,M_LOCAL
},
439 # endif /* LCTLECH */
441 { "lpendin",LPENDIN
,M_LOCAL
},
442 # endif /* LPENDIN */
444 { "ldecctq",LDECCTQ
,M_LOCAL
},
445 # endif /* LDECCTQ */
447 { "lnoflsh",LNOFLSH
,M_LOCAL
},
448 # endif /* LNOFLSH */
450 #endif /* POSIX || TERMIO */
451 # if defined(VINTR) || defined(TIOCGETC)
452 { "intr", C_SH(C_INTR
), M_CHAR
},
454 # if defined(VQUIT) || defined(TIOCGETC)
455 { "quit", C_SH(C_QUIT
), M_CHAR
},
457 # if defined(VERASE) || defined(TIOCGETP)
458 { "erase", C_SH(C_ERASE
), M_CHAR
},
460 # if defined(VKILL) || defined(TIOCGETP)
461 { "kill", C_SH(C_KILL
), M_CHAR
},
463 # if defined(VEOF) || defined(TIOCGETC)
464 { "eof", C_SH(C_EOF
), M_CHAR
},
467 { "eol", C_SH(C_EOL
), M_CHAR
},
470 { "eol2", C_SH(C_EOL2
), M_CHAR
},
473 { "swtch", C_SH(C_SWTCH
), M_CHAR
},
475 # if defined(VDSWTCH)
476 { "dswtch", C_SH(C_DSWTCH
), M_CHAR
},
477 # endif /* VDSWTCH */
478 # if defined(VERASE2)
479 { "erase2", C_SH(C_ERASE2
), M_CHAR
},
480 # endif /* VERASE2 */
481 # if defined(VSTART) || defined(TIOCGETC)
482 { "start", C_SH(C_START
), M_CHAR
},
484 # if defined(VSTOP) || defined(TIOCGETC)
485 { "stop", C_SH(C_STOP
), M_CHAR
},
487 # if defined(VWERASE) || defined(TIOCGLTC)
488 { "werase", C_SH(C_WERASE
), M_CHAR
},
489 # endif /* VWERASE */
490 # if defined(VSUSP) || defined(TIOCGLTC)
491 { "susp", C_SH(C_SUSP
), M_CHAR
},
493 # if defined(VDSUSP) || defined(TIOCGLTC)
494 { "dsusp", C_SH(C_DSUSP
), M_CHAR
},
496 # if defined(VREPRINT) || defined(TIOCGLTC)
497 { "reprint", C_SH(C_REPRINT
),M_CHAR
},
498 # endif /* WREPRINT */
499 # if defined(VDISCARD) || defined(TIOCGLTC)
500 { "discard", C_SH(C_DISCARD
),M_CHAR
},
501 # endif /* VDISCARD */
502 # if defined(VLNEXT) || defined(TIOCGLTC)
503 { "lnext", C_SH(C_LNEXT
), M_CHAR
},
505 # if defined(VSTATUS) || defined(TIOCGPAGE)
506 { "status", C_SH(C_STATUS
), M_CHAR
},
507 # endif /* VSTATUS */
508 # if defined(VCHECKPT) || defined(TIOCGPAGE)
509 { "ckpt", C_SH(C_CHECKPT
),M_CHAR
},
510 # endif /* VCHECKPT */
511 # if defined(VPAGE) || defined(TIOCGPAGE)
512 { "page", C_SH(C_PAGE
), M_CHAR
},
514 # if defined(VPGOFF) || defined(TIOCGPAGE)
515 { "pgoff", C_SH(C_PGOFF
), M_CHAR
},
518 { "kill2", C_SH(C_KILL2
), M_CHAR
},
520 # if defined(VBRK) || defined(TIOCGETC)
521 { "brk", C_SH(C_BRK
), M_CHAR
},
524 { "min", C_SH(C_MIN
), M_CHAR
},
527 { "time", C_SH(C_TIME
), M_CHAR
},
533 * If EAGAIN and/or EWOULDBLOCK are defined, we can't just return -1 in all
534 * situations where ioctl() does.
536 * On AIX 4.1.5 (and presumably some other versions and OSes), as you
537 * perform the manual test suite in the README, if you 'bg' vi immediately
538 * after suspending it, all is well, but if you wait a few seconds,
539 * usually ioctl() will return -1, which previously caused tty_setty() to
540 * return -1, causing Rawmode() to return -1, causing Inputl() to return
541 * 0, causing bgetc() to return -1, causing readc() to set doneinp to 1,
542 * causing process() to break out of the main loop, causing tcsh to exit
545 * If ioctl()'s errno is EAGAIN/EWOULDBLOCK ("Resource temporarily
546 * unavailable"), apparently the tty is being messed with by the OS and we
547 * need to try again. In my testing, ioctl() was never called more than
550 * -- Dan Harkless <dan@wave.eng.uci.edu>
552 * So, I retry all ioctl's in case others happen to fail too (christos)
555 #if defined(EAGAIN) && defined(EWOULDBLOCK) && (EWOULDBLOCK != EAGAIN)
556 # define OKERROR(e) (((e) == EAGAIN) || ((e) == EWOULDBLOCK) || ((e) == EINTR))
557 #elif defined(EAGAIN)
558 # define OKERROR(e) (((e) == EAGAIN) || ((e) == EINTR))
559 #elif defined(EWOULDBLOCK)
560 # define OKERROR(e) (((e) == EWOULDBLOCK) || ((e) == EINTR))
562 # define OKERROR(e) ((e) == EINTR)
566 #define KLUDGE (errno == ENOTTY && count < 10)
571 /* Retry a system call */
576 for (count = 0;; count++) \
578 if (OKERROR(errno) || KLUDGE) \
589 dosetty(Char
**v
, struct command
*t
)
591 const struct tcshmodes
*m
;
592 char x
, *d
, *cmdname
;
598 cmdname
= strsave(short2str(*v
++));
599 cleanup_push(cmdname
, xfree
);
602 while (v
&& *v
&& v
[0][0] == '-' && v
[0][2] == '\0')
621 stderror(ERR_NAME
| ERR_SYSTEM
, short2str(v
[0]),
622 CGETS(8, 1, "Unknown switch"));
629 int len
= 0, st
= 0, cu
;
630 for (m
= modelist
; m
->m_name
; m
++) {
631 if (m
->m_type
!= i
) {
632 xprintf("%s%s", i
!= -1 ? "\n" : "",
633 ttylist
[z
][m
->m_type
].t_name
);
635 st
= len
= strlen(ttylist
[z
][m
->m_type
].t_name
);
639 x
= (ttylist
[z
][i
].t_setmask
& m
->m_value
) ? '+' : '\0';
640 x
= (ttylist
[z
][i
].t_clrmask
& m
->m_value
) ? '-' : x
;
642 if (x
!= '\0' || aflag
) {
643 cu
= strlen(m
->m_name
) + (x
!= '\0') + 1;
644 if (len
+ cu
>= TermH
) {
645 xprintf("\n%*s", st
, "");
651 xprintf("%c%s ", x
, m
->m_name
);
653 xprintf("%s ", m
->m_name
);
657 cleanup_until(cmdname
);
660 while (v
&& (s
= *v
++)) {
671 for (m
= modelist
; m
->m_name
; m
++)
672 if (strcmp(m
->m_name
, d
) == 0)
675 stderror(ERR_NAME
| ERR_SYSTEM
, d
, CGETS(8, 2, "Invalid argument"));
679 ttylist
[z
][m
->m_type
].t_setmask
|= m
->m_value
;
680 ttylist
[z
][m
->m_type
].t_clrmask
&= ~m
->m_value
;
683 ttylist
[z
][m
->m_type
].t_setmask
&= ~m
->m_value
;
684 ttylist
[z
][m
->m_type
].t_clrmask
|= m
->m_value
;
687 ttylist
[z
][m
->m_type
].t_setmask
&= ~m
->m_value
;
688 ttylist
[z
][m
->m_type
].t_clrmask
&= ~m
->m_value
;
692 cleanup_until(cmdname
);
696 tty_getty(int fd
, ttydata_t
*td
)
699 RETRY(tcgetattr(fd
, &td
->d_t
));
700 #else /* TERMIO || GSTTY */
702 RETRY(ioctl(fd
, TCGETA
, (ioctl_t
) &td
->d_t
));
705 RETRY(ioctl(fd
, TIOCGETP
, (ioctl_t
) &td
->d_t
));
706 # endif /* TIOCGETP */
708 RETRY(ioctl(fd
, TIOCGETC
, (ioctl_t
) &td
->d_tc
));
709 # endif /* TIOCGETC */
711 RETRY(ioctl(fd
, TIOCGPAGE
, (ioctl_t
) &td
->d_pc
));
712 # endif /* TIOCGPAGE */
714 RETRY(ioctl(fd
, TIOCLGET
, (ioctl_t
) &td
->d_lb
));
715 # endif /* TIOCLGET */
720 RETRY(ioctl(fd
, TIOCGLTC
, (ioctl_t
) &td
->d_ltc
));
721 #endif /* TIOCGLTC */
727 tty_setty(int fd
, ttydata_t
*td
)
730 RETRY(xtcsetattr(fd
, TCSADRAIN
, &td
->d_t
));
733 RETRY(ioctl(fd
, TCSETAW
, (ioctl_t
) &td
->d_t
));
736 RETRY(ioctl(fd
, TIOCSETN
, (ioctl_t
) &td
->d_t
));
737 # endif /* TIOCSETN */
739 RETRY(ioctl(fd
, TIOCSETC
, (ioctl_t
) &td
->d_tc
));
740 # endif /* TIOCGETC */
742 RETRY(ioctl(fd
, TIOCSPAGE
, (ioctl_t
) &td
->d_pc
));
743 # endif /* TIOCGPAGE */
745 RETRY(ioctl(fd
, TIOCLSET
, (ioctl_t
) &td
->d_lb
));
746 # endif /* TIOCLGET */
751 RETRY(ioctl(fd
, TIOCSLTC
, (ioctl_t
) &td
->d_ltc
));
752 #endif /* TIOCGLTC */
758 tty_getchar(ttydata_t
*td
, unsigned char *s
)
762 struct ltchars
*n
= &td
->d_ltc
;
764 s
[C_SUSP
] = n
->t_suspc
;
765 s
[C_DSUSP
] = n
->t_dsuspc
;
766 s
[C_REPRINT
] = n
->t_rprntc
;
767 s
[C_DISCARD
] = n
->t_flushc
;
768 s
[C_WERASE
] = n
->t_werasc
;
769 s
[C_LNEXT
] = n
->t_lnextc
;
771 #endif /* TIOCGLTC */
773 #if defined(POSIX) || defined(TERMIO)
776 struct termios
*n
= &td
->d_t
;
778 struct termio
*n
= &td
->d_t
;
782 s
[C_INTR
] = n
->c_cc
[VINTR
];
785 s
[C_QUIT
] = n
->c_cc
[VQUIT
];
788 s
[C_ERASE
] = n
->c_cc
[VERASE
];
791 s
[C_KILL
] = n
->c_cc
[VKILL
];
794 s
[C_EOF
] = n
->c_cc
[VEOF
];
797 s
[C_EOL
] = n
->c_cc
[VEOL
];
800 s
[C_EOL2
] = n
->c_cc
[VEOL2
];
803 s
[C_SWTCH
] = n
->c_cc
[VSWTCH
];
806 s
[C_DSWTCH
] = n
->c_cc
[VDSWTCH
];
807 # endif /* VDSWTCH */
809 s
[C_ERASE2
] = n
->c_cc
[VERASE2
];
810 # endif /* VERASE2 */
812 s
[C_START
] = n
->c_cc
[VSTART
];
815 s
[C_STOP
] = n
->c_cc
[VSTOP
];
818 s
[C_WERASE
] = n
->c_cc
[VWERASE
];
819 # endif /* VWERASE */
821 s
[C_SUSP
] = n
->c_cc
[VSUSP
];
824 s
[C_DSUSP
] = n
->c_cc
[VDSUSP
];
827 s
[C_REPRINT
] = n
->c_cc
[VREPRINT
];
828 # endif /* WREPRINT */
830 s
[C_DISCARD
] = n
->c_cc
[VDISCARD
];
831 # endif /* VDISCARD */
833 s
[C_LNEXT
] = n
->c_cc
[VLNEXT
];
836 s
[C_STATUS
] = n
->c_cc
[VSTATUS
];
837 # endif /* VSTATUS */
839 s
[C_CHECKPT
] = n
->c_cc
[VCHECKPT
];
840 # endif /* VCHECKPT */
842 s
[C_PAGE
] = n
->c_cc
[VPAGE
];
845 s
[C_PGOFF
] = n
->c_cc
[VPGOFF
];
848 s
[C_KILL2
] = n
->c_cc
[VKILL2
];
851 s
[C_MIN
] = n
->c_cc
[VMIN
];
854 s
[C_TIME
] = n
->c_cc
[VTIME
];
862 struct ttypagestat
*n
= &td
->d_pc
;
864 s
[C_STATUS
] = n
->tps_statc
;
865 s
[C_CHECKPT
] = n
->tps_checkp
;
866 s
[C_PAGE
] = n
->tps_pagec
;
867 s
[C_PGOFF
] = n
->tps_pgoffc
;
869 # endif /* TIOCGPAGE */
873 struct tchars
*n
= &td
->d_tc
;
875 s
[C_INTR
] = n
->t_intrc
;
876 s
[C_QUIT
] = n
->t_quitc
;
877 s
[C_START
] = n
->t_startc
;
878 s
[C_STOP
] = n
->t_stopc
;
879 s
[C_EOF
] = n
->t_eofc
;
880 s
[C_BRK
] = n
->t_brkc
;
882 # endif /* TIOCGETC */
886 struct sgttyb
*n
= &td
->d_t
;
888 s
[C_ERASE
] = n
->sg_erase
;
889 s
[C_KILL
] = n
->sg_kill
;
891 # endif /* TIOCGETP */
892 #endif /* !POSIX || TERMIO */
898 tty_setchar(ttydata_t
*td
, unsigned char *s
)
902 struct ltchars
*n
= &td
->d_ltc
;
904 n
->t_suspc
= s
[C_SUSP
];
905 n
->t_dsuspc
= s
[C_DSUSP
];
906 n
->t_rprntc
= s
[C_REPRINT
];
907 n
->t_flushc
= s
[C_DISCARD
];
908 n
->t_werasc
= s
[C_WERASE
];
909 n
->t_lnextc
= s
[C_LNEXT
];
911 #endif /* TIOCGLTC */
913 #if defined(POSIX) || defined(TERMIO)
916 struct termios
*n
= &td
->d_t
;
918 struct termio
*n
= &td
->d_t
;
922 n
->c_cc
[VINTR
] = s
[C_INTR
];
925 n
->c_cc
[VQUIT
] = s
[C_QUIT
];
928 n
->c_cc
[VERASE
] = s
[C_ERASE
];
931 n
->c_cc
[VKILL
] = s
[C_KILL
];
934 n
->c_cc
[VEOF
] = s
[C_EOF
];
937 n
->c_cc
[VEOL
] = s
[C_EOL
];
940 n
->c_cc
[VEOL2
] = s
[C_EOL2
];
943 n
->c_cc
[VSWTCH
] = s
[C_SWTCH
];
946 n
->c_cc
[VDSWTCH
] = s
[C_DSWTCH
];
947 # endif /* VDSWTCH */
949 n
->c_cc
[VERASE2
] = s
[C_ERASE2
];
950 # endif /* VERASE2 */
952 n
->c_cc
[VSTART
] = s
[C_START
];
955 n
->c_cc
[VSTOP
] = s
[C_STOP
];
958 n
->c_cc
[VWERASE
] = s
[C_WERASE
];
959 # endif /* VWERASE */
961 n
->c_cc
[VSUSP
] = s
[C_SUSP
];
964 n
->c_cc
[VDSUSP
] = s
[C_DSUSP
];
967 n
->c_cc
[VREPRINT
] = s
[C_REPRINT
];
968 # endif /* WREPRINT */
970 n
->c_cc
[VDISCARD
] = s
[C_DISCARD
];
971 # endif /* VDISCARD */
973 n
->c_cc
[VLNEXT
] = s
[C_LNEXT
];
976 n
->c_cc
[VSTATUS
] = s
[C_STATUS
];
977 # endif /* VSTATUS */
979 n
->c_cc
[VCHECKPT
] = s
[C_CHECKPT
];
980 # endif /* VCHECKPT */
982 n
->c_cc
[VPAGE
] = s
[C_PAGE
];
985 n
->c_cc
[VPGOFF
] = s
[C_PGOFF
];
988 n
->c_cc
[VKILL2
] = s
[C_KILL2
];
991 n
->c_cc
[VMIN
] = s
[C_MIN
];
994 n
->c_cc
[VTIME
] = s
[C_TIME
];
1002 struct ttypagestat
*n
= &td
->d_pc
;
1006 n
->tps_statc
= s
[C_STATUS
];
1007 n
->tps_pagec
= s
[C_PAGE
];
1008 n
->tps_pgoffc
= s
[C_PGOFF
];
1011 # endif /* TIOCGPAGE */
1015 struct tchars
*n
= &td
->d_tc
;
1016 n
->t_intrc
= s
[C_INTR
];
1017 n
->t_quitc
= s
[C_QUIT
];
1018 n
->t_startc
= s
[C_START
];
1019 n
->t_stopc
= s
[C_STOP
];
1020 n
->t_eofc
= s
[C_EOF
];
1021 n
->t_brkc
= s
[C_BRK
];
1023 # endif /* TIOCGETC */
1027 struct sgttyb
*n
= &td
->d_t
;
1029 n
->sg_erase
= s
[C_ERASE
];
1030 n
->sg_kill
= s
[C_KILL
];
1032 # endif /* TIOCGETP */
1033 #endif /* !POSIX || TERMIO */
1038 tty_getspeed(ttydata_t
*td
)
1043 if ((spd
= cfgetispeed(&td
->d_t
)) == 0)
1044 spd
= cfgetospeed(&td
->d_t
);
1048 spd
= td
->d_t
.c_cflag
& CBAUD
;
1053 spd
= td
->d_t
.sg_ispeed
;
1054 # endif /* TERMIO */
1058 } /* end tty_getspeed */
1061 tty_gettabs(ttydata_t
*td
)
1063 #if defined(POSIX) || defined(TERMIO)
1064 return ((td
->d_t
.c_oflag
& TAB3
) == TAB3
) ? 0 : 1;
1066 return (td
->d_t
.sg_flags
& XTABS
) == XTABS
? 0 : 1;
1067 #endif /* POSIX || TERMIO */
1068 } /* end tty_gettabs */
1071 tty_geteightbit(ttydata_t
*td
)
1073 #if defined(POSIX) || defined(TERMIO)
1074 return (td
->d_t
.c_cflag
& CSIZE
) == CS8
;
1076 return td
->d_lb
& (LPASS8
| LLITOUT
);
1077 #endif /* POSIX || TERMIO */
1078 } /* end tty_geteightbit */
1081 tty_cooked_mode(ttydata_t
*td
)
1083 #if defined(POSIX) || defined(TERMIO)
1084 return (td
->d_t
.c_lflag
& ICANON
);
1086 return !(td
->d_t
.sg_flags
& (RAW
| CBREAK
));
1087 #endif /* POSIX || TERMIO */
1088 } /* end tty_cooked_mode */
1092 tty_setdisc(int fd
, int dis
)
1094 static int edit_discipline
= 0;
1095 static union txname tx_disc
;
1096 extern char strPOSIX
[];
1100 if (edit_discipline
) {
1101 if (ioctl(fd
, TXSETLD
, (ioctl_t
) & tx_disc
) == -1)
1103 edit_discipline
= 0;
1108 tx_disc
.tx_which
= 0;
1109 if (ioctl(fd
, TXGETLD
, (ioctl_t
) & tx_disc
) == -1)
1111 if (strcmp(tx_disc
.tx_name
, strPOSIX
) != 0) {
1112 edit_discipline
= 1;
1113 if (ioctl(fd
, TXSETLD
, (ioctl_t
) strPOSIX
) == -1)
1121 } /* end tty_setdisc */
1126 tty_printchar(unsigned char *s
)
1128 struct tcshmodes
*m
;
1131 for (i
= 0; i
< C_NCC
; i
++) {
1132 for (m
= modelist
; m
->m_name
; m
++)
1133 if (m
->m_type
== M_CHAR
&& C_SH(i
) == m
->m_value
)
1136 xprintf("%s ^%c ", m
->m_name
, s
[i
] + 'A' - 1);
1142 #endif /* DEBUG_TTY */
1143 #else /* WINNT_NATIVE */
1145 tty_cooked_mode(void *td
)
1147 return do_nt_check_cooked_mode();
1149 #endif /* !WINNT_NATIVE */