159243Sobrien/*
259243Sobrien * ed.term.c: Low level terminal interface
359243Sobrien */
459243Sobrien/*-
559243Sobrien * Copyright (c) 1980, 1991 The Regents of the University of California.
659243Sobrien * All rights reserved.
759243Sobrien *
859243Sobrien * Redistribution and use in source and binary forms, with or without
959243Sobrien * modification, are permitted provided that the following conditions
1059243Sobrien * are met:
1159243Sobrien * 1. Redistributions of source code must retain the above copyright
1259243Sobrien *    notice, this list of conditions and the following disclaimer.
1359243Sobrien * 2. Redistributions in binary form must reproduce the above copyright
1459243Sobrien *    notice, this list of conditions and the following disclaimer in the
1559243Sobrien *    documentation and/or other materials provided with the distribution.
16100616Smp * 3. Neither the name of the University nor the names of its contributors
1759243Sobrien *    may be used to endorse or promote products derived from this software
1859243Sobrien *    without specific prior written permission.
1959243Sobrien *
2059243Sobrien * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2159243Sobrien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2259243Sobrien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2359243Sobrien * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2459243Sobrien * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2559243Sobrien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2659243Sobrien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2759243Sobrien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2859243Sobrien * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2959243Sobrien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3059243Sobrien * SUCH DAMAGE.
3159243Sobrien */
3259243Sobrien#include "sh.h"
3369408Sache#ifndef WINNT_NATIVE
34231990Smp#include <assert.h>
3559243Sobrien#include "ed.h"
3659243Sobrien
3759243Sobrienint didsetty = 0;
3859243Sobrienttyperm_t ttylist = {
3959243Sobrien    {
4059243Sobrien#if defined(POSIX) || defined(TERMIO)
4159243Sobrien	{ "iflag:", ICRNL, (INLCR|IGNCR) },
4259243Sobrien	{ "oflag:", (OPOST|ONLCR), ONLRET },
4359243Sobrien	{ "cflag:", 0, 0 },
4459243Sobrien	{ "lflag:", (ISIG|ICANON|ECHO|ECHOE|ECHOCTL|IEXTEN),
4559243Sobrien		    (NOFLSH|ECHONL|EXTPROC|FLUSHO|IDEFAULT) },
4659243Sobrien#else /* GSTTY */
4759243Sobrien	{ "nrmal:", (ECHO|CRMOD|ANYP), (CBREAK|RAW|LCASE|VTDELAY|ALLDELAY) },
4859243Sobrien	{ "local:", (LCRTBS|LCRTERA|LCRTKIL), (LPRTERA|LFLUSHO) },
4959243Sobrien#endif /* POSIX || TERMIO */
5059243Sobrien	{ "chars:", 	0, 0 },
5159243Sobrien    },
5259243Sobrien    {
5359243Sobrien#if defined(POSIX) || defined(TERMIO)
5459243Sobrien	{ "iflag:", (INLCR|ICRNL), IGNCR },
5559243Sobrien	{ "oflag:", (OPOST|ONLCR), ONLRET },
5659243Sobrien	{ "cflag:", 0, 0 },
5759243Sobrien	{ "lflag:", ISIG,
5859243Sobrien		    (NOFLSH|ICANON|ECHO|ECHOK|ECHONL|EXTPROC|IEXTEN|FLUSHO|
5959243Sobrien		     IDEFAULT) },
6059243Sobrien#else /* GSTTY */
6159243Sobrien	{ "nrmal:", (CBREAK|CRMOD|ANYP), (RAW|ECHO|LCASE|VTDELAY|ALLDELAY) },
6259243Sobrien	{ "local:", (LCRTBS|LCRTERA|LCRTKIL), (LPRTERA|LFLUSHO) },
6359243Sobrien#endif /* POSIX || TERMIO */
6459243Sobrien	{ "chars:", (C_SH(C_MIN)|C_SH(C_TIME)|C_SH(C_SWTCH)|C_SH(C_DSWTCH)|
6559243Sobrien		     C_SH(C_WERASE)|C_SH(C_REPRINT)|C_SH(C_SUSP)|C_SH(C_DSUSP)|
6659243Sobrien		     C_SH(C_EOF)|C_SH(C_EOL)|C_SH(C_DISCARD)|C_SH(C_PGOFF)|
6759243Sobrien		     C_SH(C_KILL2)|C_SH(C_PAGE)|C_SH(C_STATUS)|C_SH(C_LNEXT)),
6859243Sobrien		     0 }
6959243Sobrien    },
7059243Sobrien    {
7159243Sobrien#if defined(POSIX) || defined(TERMIO)
7259243Sobrien	{ "iflag:", 0, IXON | IXOFF },
7359243Sobrien	{ "oflag:", 0, 0 },
7459243Sobrien	{ "cflag:", 0, 0 },
7559243Sobrien	{ "lflag:", 0, ISIG | IEXTEN },
7659243Sobrien#else /* GSTTY */
7759243Sobrien	{ "nrmal:", RAW, CBREAK },
7859243Sobrien	{ "local:", 0, 0 },
7959243Sobrien#endif /* POSIX || TERMIO */
8059243Sobrien	{ "chars:", 0, 0 },
8159243Sobrien    }
8259243Sobrien};
8359243Sobrien
84167465Smpstatic const struct tcshmodes {
85145479Smp    const char *m_name;
8659243Sobrien#ifdef SOLARIS2
8759243Sobrien    unsigned long m_value;
8859243Sobrien#else /* !SOLARIS2 */
8959243Sobrien    int   m_value;
9059243Sobrien#endif /* SOLARIS2 */
9159243Sobrien    int   m_type;
9259243Sobrien} modelist[] = {
9359243Sobrien#if defined(POSIX) || defined(TERMIO)
9459243Sobrien
9559243Sobrien# ifdef	IGNBRK
9659243Sobrien    { "ignbrk",	IGNBRK,	M_INPUT },
9759243Sobrien# endif /* IGNBRK */
9859243Sobrien# ifdef	BRKINT
9959243Sobrien    { "brkint",	BRKINT,	M_INPUT },
10059243Sobrien# endif /* BRKINT */
10159243Sobrien# ifdef	IGNPAR
10259243Sobrien    { "ignpar",	IGNPAR,	M_INPUT },
10359243Sobrien# endif /* IGNPAR */
10459243Sobrien# ifdef	PARMRK
10559243Sobrien    { "parmrk",	PARMRK,	M_INPUT },
10659243Sobrien# endif /* PARMRK */
10759243Sobrien# ifdef	INPCK
10859243Sobrien    { "inpck",	INPCK,	M_INPUT },
10959243Sobrien# endif /* INPCK */
11059243Sobrien# ifdef	ISTRIP
11159243Sobrien    { "istrip",	ISTRIP,	M_INPUT },
11259243Sobrien# endif /* ISTRIP */
11359243Sobrien# ifdef	INLCR
11459243Sobrien    { "inlcr",	INLCR,	M_INPUT },
11559243Sobrien# endif /* INLCR */
11659243Sobrien# ifdef	IGNCR
11759243Sobrien    { "igncr",	IGNCR,	M_INPUT },
11859243Sobrien# endif /* IGNCR */
11959243Sobrien# ifdef	ICRNL
12059243Sobrien    { "icrnl",	ICRNL,	M_INPUT },
12159243Sobrien# endif /* ICRNL */
12259243Sobrien# ifdef	IUCLC
12359243Sobrien    { "iuclc",	IUCLC,	M_INPUT },
12459243Sobrien# endif /* IUCLC */
12559243Sobrien# ifdef	IXON
12659243Sobrien    { "ixon",	IXON,	M_INPUT },
12759243Sobrien# endif /* IXON */
12859243Sobrien# ifdef	IXANY
12959243Sobrien    { "ixany",	IXANY,	M_INPUT },
13059243Sobrien# endif /* IXANY */
13159243Sobrien# ifdef	IXOFF
13259243Sobrien    { "ixoff",	IXOFF,	M_INPUT },
13359243Sobrien# endif /* IXOFF */
13459243Sobrien# ifdef  IMAXBEL
13559243Sobrien    { "imaxbel",IMAXBEL,M_INPUT },
13659243Sobrien# endif /* IMAXBEL */
13759243Sobrien# ifdef  IDELETE
13859243Sobrien    { "idelete",IDELETE,M_INPUT },
13959243Sobrien# endif /* IDELETE */
14059243Sobrien
14159243Sobrien# ifdef	OPOST
14259243Sobrien    { "opost",	OPOST,	M_OUTPUT },
14359243Sobrien# endif /* OPOST */
14459243Sobrien# ifdef	OLCUC
14559243Sobrien    { "olcuc",	OLCUC,	M_OUTPUT },
14659243Sobrien# endif /* OLCUC */
14759243Sobrien# ifdef	ONLCR
14859243Sobrien    { "onlcr",	ONLCR,	M_OUTPUT },
14959243Sobrien# endif /* ONLCR */
15059243Sobrien# ifdef	OCRNL
15159243Sobrien    { "ocrnl",	OCRNL,	M_OUTPUT },
15259243Sobrien# endif /* OCRNL */
15359243Sobrien# ifdef	ONOCR
15459243Sobrien    { "onocr",	ONOCR,	M_OUTPUT },
15559243Sobrien# endif /* ONOCR */
15659243Sobrien# ifdef ONOEOT
15759243Sobrien    { "onoeot",	ONOEOT,	M_OUTPUT },
15859243Sobrien# endif /* ONOEOT */
15959243Sobrien# ifdef	ONLRET
16059243Sobrien    { "onlret",	ONLRET,	M_OUTPUT },
16159243Sobrien# endif /* ONLRET */
16259243Sobrien# ifdef	OFILL
16359243Sobrien    { "ofill",	OFILL,	M_OUTPUT },
16459243Sobrien# endif /* OFILL */
16559243Sobrien# ifdef	OFDEL
16659243Sobrien    { "ofdel",	OFDEL,	M_OUTPUT },
16759243Sobrien# endif /* OFDEL */
16859243Sobrien# ifdef	NLDLY
16959243Sobrien    { "nldly",	NLDLY,	M_OUTPUT },
17059243Sobrien# endif /* NLDLY */
17159243Sobrien# ifdef	CRDLY
17259243Sobrien    { "crdly",	CRDLY,	M_OUTPUT },
17359243Sobrien# endif /* CRDLY */
17459243Sobrien# ifdef	TABDLY
17559243Sobrien    { "tabdly",	TABDLY,	M_OUTPUT },
17659243Sobrien# endif /* TABDLY */
17759243Sobrien# ifdef	XTABS
17859243Sobrien    { "xtabs",	XTABS,	M_OUTPUT },
17959243Sobrien# endif /* XTABS */
18059243Sobrien# ifdef	BSDLY
18159243Sobrien    { "bsdly",	BSDLY,	M_OUTPUT },
18259243Sobrien# endif /* BSDLY */
18359243Sobrien# ifdef	VTDLY
18459243Sobrien    { "vtdly",	VTDLY,	M_OUTPUT },
18559243Sobrien# endif /* VTDLY */
18659243Sobrien# ifdef	FFDLY
18759243Sobrien    { "ffdly",	FFDLY,	M_OUTPUT },
18859243Sobrien# endif /* FFDLY */
18959243Sobrien# ifdef	PAGEOUT
19059243Sobrien    { "pageout",PAGEOUT,M_OUTPUT },
19159243Sobrien# endif /* PAGEOUT */
19259243Sobrien# ifdef	WRAP
19359243Sobrien    { "wrap",	WRAP,	M_OUTPUT },
19459243Sobrien# endif /* WRAP */
19559243Sobrien
19659243Sobrien# ifdef	CIGNORE
19759243Sobrien    { "cignore",CIGNORE,M_CONTROL },
19859243Sobrien# endif /* CBAUD */
19959243Sobrien# ifdef	CBAUD
20059243Sobrien    { "cbaud",	CBAUD,	M_CONTROL },
20159243Sobrien# endif /* CBAUD */
20259243Sobrien# ifdef	CSTOPB
20359243Sobrien    { "cstopb",	CSTOPB,	M_CONTROL },
20459243Sobrien# endif /* CSTOPB */
20559243Sobrien# ifdef	CREAD
20659243Sobrien    { "cread",	CREAD,	M_CONTROL },
20759243Sobrien# endif /* CREAD */
20859243Sobrien# ifdef	PARENB
20959243Sobrien    { "parenb",	PARENB,	M_CONTROL },
21059243Sobrien# endif /* PARENB */
21159243Sobrien# ifdef	PARODD
21259243Sobrien    { "parodd",	PARODD,	M_CONTROL },
21359243Sobrien# endif /* PARODD */
21459243Sobrien# ifdef	HUPCL
21559243Sobrien    { "hupcl",	HUPCL,	M_CONTROL },
21659243Sobrien# endif /* HUPCL */
21759243Sobrien# ifdef	CLOCAL
21859243Sobrien    { "clocal",	CLOCAL,	M_CONTROL },
21959243Sobrien# endif /* CLOCAL */
22059243Sobrien# ifdef	LOBLK
22159243Sobrien    { "loblk",	LOBLK,	M_CONTROL },
22259243Sobrien# endif /* LOBLK */
22359243Sobrien# ifdef	CIBAUD
22459243Sobrien    { "cibaud",	CIBAUD,	M_CONTROL },
22559243Sobrien# endif /* CIBAUD */
22659243Sobrien# ifdef CRTSCTS
22759243Sobrien#  ifdef CCTS_OFLOW
22859243Sobrien    { "ccts_oflow",CCTS_OFLOW,M_CONTROL },
22959243Sobrien#  else
23059243Sobrien    { "crtscts",CRTSCTS,M_CONTROL },
23159243Sobrien#  endif /* CCTS_OFLOW */
23259243Sobrien# endif /* CRTSCTS */
23359243Sobrien# ifdef CRTS_IFLOW
23459243Sobrien    { "crts_iflow",CRTS_IFLOW,M_CONTROL },
23559243Sobrien# endif /* CRTS_IFLOW */
23659243Sobrien# ifdef MDMBUF
23759243Sobrien    { "mdmbuf",	MDMBUF,	M_CONTROL },
23859243Sobrien# endif /* MDMBUF */
23959243Sobrien# ifdef RCV1EN
24059243Sobrien    { "rcv1en",	RCV1EN,	M_CONTROL },
24159243Sobrien# endif /* RCV1EN */
24259243Sobrien# ifdef XMT1EN
24359243Sobrien    { "xmt1en",	XMT1EN,	M_CONTROL },
24459243Sobrien# endif /* XMT1EN */
24559243Sobrien
24659243Sobrien# ifdef	ISIG
24759243Sobrien    { "isig",	ISIG,	M_LINED },
24859243Sobrien# endif /* ISIG */
24959243Sobrien# ifdef	ICANON
25059243Sobrien    { "icanon",	ICANON,	M_LINED },
25159243Sobrien# endif /* ICANON */
25259243Sobrien# ifdef	XCASE
25359243Sobrien    { "xcase",	XCASE,	M_LINED },
25459243Sobrien# endif /* XCASE */
25559243Sobrien# ifdef	ECHO
25659243Sobrien    { "echo",	ECHO,	M_LINED },
25759243Sobrien# endif /* ECHO */
25859243Sobrien# ifdef	ECHOE
25959243Sobrien    { "echoe",	ECHOE,	M_LINED },
26059243Sobrien# endif /* ECHOE */
26159243Sobrien# ifdef	ECHOK
26259243Sobrien    { "echok",	ECHOK,	M_LINED },
26359243Sobrien# endif /* ECHOK */
26459243Sobrien# ifdef	ECHONL
26559243Sobrien    { "echonl",	ECHONL,	M_LINED },
26659243Sobrien# endif /* ECHONL */
26759243Sobrien# ifdef	NOFLSH
26859243Sobrien    { "noflsh",	NOFLSH,	M_LINED },
26959243Sobrien# endif /* NOFLSH */
27059243Sobrien# ifdef	TOSTOP
27159243Sobrien    { "tostop",	TOSTOP,	M_LINED },
27259243Sobrien# endif /* TOSTOP */
27359243Sobrien# ifdef	ECHOCTL
27459243Sobrien    { "echoctl",ECHOCTL,M_LINED },
27559243Sobrien# endif /* ECHOCTL */
27659243Sobrien# ifdef	ECHOPRT
27759243Sobrien    { "echoprt",ECHOPRT,M_LINED },
27859243Sobrien# endif /* ECHOPRT */
27959243Sobrien# ifdef	ECHOKE
28059243Sobrien    { "echoke",	ECHOKE,	M_LINED },
28159243Sobrien# endif /* ECHOKE */
28259243Sobrien# ifdef	DEFECHO
28359243Sobrien    { "defecho",DEFECHO,M_LINED },
28459243Sobrien# endif /* DEFECHO */
28559243Sobrien# ifdef	FLUSHO
28659243Sobrien    { "flusho",	FLUSHO,	M_LINED },
28759243Sobrien# endif /* FLUSHO */
28859243Sobrien# ifdef	PENDIN
28959243Sobrien    { "pendin",	PENDIN,	M_LINED },
29059243Sobrien# endif /* PENDIN */
29159243Sobrien# ifdef	IEXTEN
29259243Sobrien    { "iexten",	IEXTEN,	M_LINED },
29359243Sobrien# endif /* IEXTEN */
29459243Sobrien# ifdef	NOKERNINFO
29559243Sobrien    { "nokerninfo",NOKERNINFO,M_LINED },
29659243Sobrien# endif /* NOKERNINFO */
29759243Sobrien# ifdef	ALTWERASE
29859243Sobrien    { "altwerase",ALTWERASE,M_LINED },
29959243Sobrien# endif /* ALTWERASE */
30059243Sobrien# ifdef	EXTPROC
30159243Sobrien    { "extproc",EXTPROC,M_LINED },
30259243Sobrien# endif /* EXTPROC */
30359243Sobrien# ifdef IDEFAULT
30459243Sobrien    { "idefault",IDEFAULT,M_LINED },
30559243Sobrien# endif /* IDEFAULT */
30659243Sobrien
30759243Sobrien#else /* GSTTY */
30859243Sobrien
30959243Sobrien# ifdef	TANDEM
31059243Sobrien    { "tandem",	TANDEM,	M_CONTROL },
31159243Sobrien# endif /* TANDEM */
31259243Sobrien# ifdef	CBREAK
31359243Sobrien    { "cbreak",	CBREAK,	M_CONTROL },
31459243Sobrien# endif /* CBREAK */
31559243Sobrien# ifdef	LCASE
31659243Sobrien    { "lcase",	LCASE,	M_CONTROL },
31759243Sobrien# endif /* LCASE */
31859243Sobrien# ifdef	ECHO
31959243Sobrien    { "echo",	ECHO,	M_CONTROL },
32059243Sobrien# endif /* ECHO */
32159243Sobrien# ifdef	CRMOD
32259243Sobrien    { "crmod",	CRMOD,	M_CONTROL },
32359243Sobrien# endif /* CRMOD */
32459243Sobrien# ifdef	RAW
32559243Sobrien    { "raw",	RAW,	M_CONTROL },
32659243Sobrien# endif /* RAW */
32759243Sobrien# ifdef	ODDP
32859243Sobrien    { "oddp",	ODDP,	M_CONTROL },
32959243Sobrien# endif /* ODDP */
33059243Sobrien# ifdef	EVENP
33159243Sobrien    { "evenp",	EVENP,	M_CONTROL },
33259243Sobrien# endif /* EVENP */
33359243Sobrien# ifdef	ANYP
33459243Sobrien    { "anyp",	ANYP,	M_CONTROL },
33559243Sobrien# endif /* ANYP */
33659243Sobrien# ifdef	NLDELAY
33759243Sobrien    { "nldelay",NLDELAY,M_CONTROL },
33859243Sobrien# endif /* NLDELAY */
33959243Sobrien# ifdef	TBDELAY
34059243Sobrien    { "tbdelay",TBDELAY,M_CONTROL },
34159243Sobrien# endif /* TBDELAY */
34259243Sobrien# ifdef	XTABS
34359243Sobrien    { "xtabs",	XTABS,	M_CONTROL },
34459243Sobrien# endif /* XTABS */
34559243Sobrien# ifdef	CRDELAY
34659243Sobrien    { "crdelay",CRDELAY,M_CONTROL },
34759243Sobrien# endif /* CRDELAY */
34859243Sobrien# ifdef	VTDELAY
34959243Sobrien    { "vtdelay",VTDELAY,M_CONTROL },
35059243Sobrien# endif /* VTDELAY */
35159243Sobrien# ifdef	BSDELAY
35259243Sobrien    { "bsdelay",BSDELAY,M_CONTROL },
35359243Sobrien# endif /* BSDELAY */
35459243Sobrien# ifdef	CRTBS
35559243Sobrien    { "crtbs",	CRTBS,	M_CONTROL },
35659243Sobrien# endif /* CRTBS */
35759243Sobrien# ifdef	PRTERA
35859243Sobrien    { "prtera",	PRTERA,	M_CONTROL },
35959243Sobrien# endif /* PRTERA */
36059243Sobrien# ifdef	CRTERA
36159243Sobrien    { "crtera",	CRTERA,	M_CONTROL },
36259243Sobrien# endif /* CRTERA */
36359243Sobrien# ifdef	TILDE
36459243Sobrien    { "tilde",	TILDE,	M_CONTROL },
36559243Sobrien# endif /* TILDE */
36659243Sobrien# ifdef	MDMBUF
36759243Sobrien    { "mdmbuf",	MDMBUF,	M_CONTROL },
36859243Sobrien# endif /* MDMBUF */
36959243Sobrien# ifdef	LITOUT
37059243Sobrien    { "litout",	LITOUT,	M_CONTROL },
37159243Sobrien# endif /* LITOUT */
37259243Sobrien# ifdef	TOSTOP
37359243Sobrien    { "tostop",	TOSTOP,	M_CONTROL },
37459243Sobrien# endif /* TOSTOP */
37559243Sobrien# ifdef	FLUSHO
37659243Sobrien    { "flusho",	FLUSHO,	M_CONTROL },
37759243Sobrien# endif /* FLUSHO */
37859243Sobrien# ifdef	NOHANG
37959243Sobrien    { "nohang",	NOHANG,	M_CONTROL },
38059243Sobrien# endif /* NOHANG */
38159243Sobrien# ifdef	L001000
38259243Sobrien    { "l001000",L001000,M_CONTROL },
38359243Sobrien# endif /* L001000 */
38459243Sobrien# ifdef	CRTKIL
38559243Sobrien    { "crtkil",	CRTKIL,	M_CONTROL },
38659243Sobrien# endif /* CRTKIL */
38759243Sobrien# ifdef	PASS8
38859243Sobrien    { "pass8",	PASS8,	M_CONTROL },
38959243Sobrien# endif /* PASS8 */
39059243Sobrien# ifdef	CTLECH
39159243Sobrien    { "ctlech",	CTLECH,	M_CONTROL },
39259243Sobrien# endif /* CTLECH */
39359243Sobrien# ifdef	PENDIN
39459243Sobrien    { "pendin",	PENDIN,	M_CONTROL },
39559243Sobrien# endif /* PENDIN */
39659243Sobrien# ifdef	DECCTQ
39759243Sobrien    { "decctq",	DECCTQ,	M_CONTROL },
39859243Sobrien# endif /* DECCTQ */
39959243Sobrien# ifdef	NOFLSH
40059243Sobrien    { "noflsh",	NOFLSH,	M_CONTROL },
40159243Sobrien# endif /* NOFLSH */
40259243Sobrien
40359243Sobrien# ifdef	LCRTBS
40459243Sobrien    { "lcrtbs",	LCRTBS,	M_LOCAL },
40559243Sobrien# endif /* LCRTBS */
40659243Sobrien# ifdef	LPRTERA
40759243Sobrien    { "lprtera",LPRTERA,M_LOCAL },
40859243Sobrien# endif /* LPRTERA */
40959243Sobrien# ifdef	LCRTERA
41059243Sobrien    { "lcrtera",LCRTERA,M_LOCAL },
41159243Sobrien# endif /* LCRTERA */
41259243Sobrien# ifdef	LTILDE
41359243Sobrien    { "ltilde",	LTILDE,	M_LOCAL },
41459243Sobrien# endif /* LTILDE */
41559243Sobrien# ifdef	LMDMBUF
41659243Sobrien    { "lmdmbuf",LMDMBUF,M_LOCAL },
41759243Sobrien# endif /* LMDMBUF */
41859243Sobrien# ifdef	LLITOUT
41959243Sobrien    { "llitout",LLITOUT,M_LOCAL },
42059243Sobrien# endif /* LLITOUT */
42159243Sobrien# ifdef	LTOSTOP
42259243Sobrien    { "ltostop",LTOSTOP,M_LOCAL },
42359243Sobrien# endif /* LTOSTOP */
42459243Sobrien# ifdef	LFLUSHO
42559243Sobrien    { "lflusho",LFLUSHO,M_LOCAL },
42659243Sobrien# endif /* LFLUSHO */
42759243Sobrien# ifdef	LNOHANG
42859243Sobrien    { "lnohang",LNOHANG,M_LOCAL },
42959243Sobrien# endif /* LNOHANG */
43059243Sobrien# ifdef	LCRTKIL
43159243Sobrien    { "lcrtkil",LCRTKIL,M_LOCAL },
43259243Sobrien# endif /* LCRTKIL */
43359243Sobrien# ifdef	LPASS8
43459243Sobrien    { "lpass8",	LPASS8,	M_LOCAL },
43559243Sobrien# endif /* LPASS8 */
43659243Sobrien# ifdef	LCTLECH
43759243Sobrien    { "lctlech",LCTLECH,M_LOCAL },
43859243Sobrien# endif /* LCTLECH */
43959243Sobrien# ifdef	LPENDIN
44059243Sobrien    { "lpendin",LPENDIN,M_LOCAL },
44159243Sobrien# endif /* LPENDIN */
44259243Sobrien# ifdef	LDECCTQ
44359243Sobrien    { "ldecctq",LDECCTQ,M_LOCAL },
44459243Sobrien# endif /* LDECCTQ */
44559243Sobrien# ifdef	LNOFLSH
44659243Sobrien    { "lnoflsh",LNOFLSH,M_LOCAL },
44759243Sobrien# endif /* LNOFLSH */
44859243Sobrien
44959243Sobrien#endif /* POSIX || TERMIO */
45059243Sobrien# if defined(VINTR) || defined(TIOCGETC)
45159243Sobrien    { "intr",		C_SH(C_INTR), 	M_CHAR },
45259243Sobrien# endif /* VINTR */
45359243Sobrien# if defined(VQUIT) || defined(TIOCGETC)
45459243Sobrien    { "quit",		C_SH(C_QUIT), 	M_CHAR },
45559243Sobrien# endif /* VQUIT */
45659243Sobrien# if defined(VERASE) || defined(TIOCGETP)
45759243Sobrien    { "erase",		C_SH(C_ERASE), 	M_CHAR },
45859243Sobrien# endif /* VERASE */
45959243Sobrien# if defined(VKILL) || defined(TIOCGETP)
46059243Sobrien    { "kill",		C_SH(C_KILL), 	M_CHAR },
46159243Sobrien# endif /* VKILL */
46259243Sobrien# if defined(VEOF) || defined(TIOCGETC)
46359243Sobrien    { "eof",		C_SH(C_EOF), 	M_CHAR },
46459243Sobrien# endif /* VEOF */
46559243Sobrien# if defined(VEOL)
46659243Sobrien    { "eol",		C_SH(C_EOL), 	M_CHAR },
46759243Sobrien# endif /* VEOL */
46859243Sobrien# if defined(VEOL2)
46959243Sobrien    { "eol2",		C_SH(C_EOL2), 	M_CHAR },
47059243Sobrien# endif  /* VEOL2 */
47159243Sobrien# if defined(VSWTCH)
47259243Sobrien    { "swtch",		C_SH(C_SWTCH), 	M_CHAR },
47359243Sobrien# endif /* VSWTCH */
47459243Sobrien# if defined(VDSWTCH)
47559243Sobrien    { "dswtch",		C_SH(C_DSWTCH),	M_CHAR },
47659243Sobrien# endif /* VDSWTCH */
47759243Sobrien# if defined(VERASE2)
47859243Sobrien    { "erase2",		C_SH(C_ERASE2),	M_CHAR },
47959243Sobrien# endif /* VERASE2 */
48059243Sobrien# if defined(VSTART) || defined(TIOCGETC)
48159243Sobrien    { "start",		C_SH(C_START), 	M_CHAR },
48259243Sobrien# endif /* VSTART */
48359243Sobrien# if defined(VSTOP) || defined(TIOCGETC)
48459243Sobrien    { "stop",		C_SH(C_STOP), 	M_CHAR },
48559243Sobrien# endif /* VSTOP */
48659243Sobrien# if defined(VWERASE) || defined(TIOCGLTC)
48759243Sobrien    { "werase",		C_SH(C_WERASE),	M_CHAR },
48859243Sobrien# endif /* VWERASE */
48959243Sobrien# if defined(VSUSP) || defined(TIOCGLTC)
49059243Sobrien    { "susp",		C_SH(C_SUSP), 	M_CHAR },
49159243Sobrien# endif /* VSUSP */
49259243Sobrien# if defined(VDSUSP) || defined(TIOCGLTC)
49359243Sobrien    { "dsusp",		C_SH(C_DSUSP), 	M_CHAR },
49459243Sobrien# endif /* VDSUSP */
49559243Sobrien# if defined(VREPRINT) || defined(TIOCGLTC)
49659243Sobrien    { "reprint",	C_SH(C_REPRINT),M_CHAR },
49759243Sobrien# endif /* WREPRINT */
49859243Sobrien# if defined(VDISCARD) || defined(TIOCGLTC)
49959243Sobrien    { "discard",	C_SH(C_DISCARD),M_CHAR },
50059243Sobrien# endif /* VDISCARD */
50159243Sobrien# if defined(VLNEXT) || defined(TIOCGLTC)
50259243Sobrien    { "lnext",		C_SH(C_LNEXT), 	M_CHAR },
50359243Sobrien# endif /* VLNEXT */
50459243Sobrien# if defined(VSTATUS) || defined(TIOCGPAGE)
50559243Sobrien    { "status",		C_SH(C_STATUS),	M_CHAR },
50659243Sobrien# endif /* VSTATUS */
50759243Sobrien# if defined(VPAGE) || defined(TIOCGPAGE)
50859243Sobrien    { "page",		C_SH(C_PAGE), 	M_CHAR },
50959243Sobrien# endif /* VPAGE */
51059243Sobrien# if defined(VPGOFF) || defined(TIOCGPAGE)
51159243Sobrien    { "pgoff",		C_SH(C_PGOFF), 	M_CHAR },
51259243Sobrien# endif /* VPGOFF */
51359243Sobrien# if defined(VKILL2)
51459243Sobrien    { "kill2",		C_SH(C_KILL2), 	M_CHAR },
51559243Sobrien# endif /* VKILL2 */
51659243Sobrien# if defined(VBRK) || defined(TIOCGETC)
51759243Sobrien    { "brk",		C_SH(C_BRK), 	M_CHAR },
51859243Sobrien# endif /* VBRK */
51959243Sobrien# if defined(VMIN)
52059243Sobrien    { "min",		C_SH(C_MIN), 	M_CHAR },
52159243Sobrien# endif /* VMIN */
52259243Sobrien# if defined(VTIME)
52359243Sobrien    { "time",		C_SH(C_TIME), 	M_CHAR },
52459243Sobrien# endif /* VTIME */
52559243Sobrien    { NULL, 0, -1 },
52659243Sobrien};
52759243Sobrien
52859243Sobrien/*
52959243Sobrien * If EAGAIN and/or EWOULDBLOCK are defined, we can't just return -1 in all
53059243Sobrien * situations where ioctl() does.
53159243Sobrien *
53259243Sobrien * On AIX 4.1.5 (and presumably some other versions and OSes), as you
53359243Sobrien * perform the manual test suite in the README, if you 'bg' vi immediately
53459243Sobrien * after suspending it, all is well, but if you wait a few seconds,
53559243Sobrien * usually ioctl() will return -1, which previously caused tty_setty() to
53659243Sobrien * return -1, causing Rawmode() to return -1, causing Inputl() to return
53759243Sobrien * 0, causing bgetc() to return -1, causing readc() to set doneinp to 1,
53859243Sobrien * causing process() to break out of the main loop, causing tcsh to exit
53959243Sobrien * prematurely.
54059243Sobrien *
54159243Sobrien * If ioctl()'s errno is EAGAIN/EWOULDBLOCK ("Resource temporarily
54259243Sobrien * unavailable"), apparently the tty is being messed with by the OS and we
54359243Sobrien * need to try again.  In my testing, ioctl() was never called more than
54459243Sobrien * twice in a row.
54559243Sobrien *
54659243Sobrien * -- Dan Harkless <dan@wave.eng.uci.edu>
54759243Sobrien *
54859243Sobrien * So, I retry all ioctl's in case others happen to fail too (christos)
54959243Sobrien */
55059243Sobrien
55159243Sobrien#if defined(EAGAIN) && defined(EWOULDBLOCK) && (EWOULDBLOCK != EAGAIN)
55259243Sobrien# define OKERROR(e) (((e) == EAGAIN) || ((e) == EWOULDBLOCK) || ((e) == EINTR))
553131962Smp#elif defined(EAGAIN)
55459243Sobrien# define OKERROR(e) (((e) == EAGAIN) || ((e) == EINTR))
55559243Sobrien#elif defined(EWOULDBLOCK)
55659243Sobrien# define OKERROR(e) (((e) == EWOULDBLOCK) || ((e) == EINTR))
55759243Sobrien#else
55859243Sobrien# define OKERROR(e) ((e) == EINTR)
55959243Sobrien#endif
56059243Sobrien
56183098Smp#ifdef __NetBSD__
56283098Smp#define KLUDGE (errno == ENOTTY && count < 10)
56383098Smp#else
56483098Smp#define KLUDGE 0
56583098Smp#endif
56683098Smp
56759243Sobrien/* Retry a system call */
568167465Smp#define RETRY(x)				\
569167465Smpdo {						\
570167465Smp    int count;					\
571167465Smp						\
572167465Smp    for (count = 0;; count++)			\
573167465Smp	if ((x) == -1) {			\
574167465Smp	    if (OKERROR(errno) || KLUDGE)	\
575167465Smp		continue;			\
576167465Smp	    else				\
577167465Smp		return -1;			\
578167465Smp	}					\
579167465Smp	else					\
580167465Smp	    break;				\
581167465Smp} while (0)
58259243Sobrien
58359243Sobrien/*ARGSUSED*/
58459243Sobrienvoid
585167465Smpdosetty(Char **v, struct command *t)
58659243Sobrien{
587167465Smp    const struct tcshmodes *m;
588167465Smp    char x, *d, *cmdname;
58959243Sobrien    int aflag = 0;
59059243Sobrien    Char *s;
59159243Sobrien    int z = EX_IO;
59259243Sobrien
59359243Sobrien    USE(t);
594167465Smp    cmdname = strsave(short2str(*v++));
595167465Smp    cleanup_push(cmdname, xfree);
596167465Smp    setname(cmdname);
59759243Sobrien
59859243Sobrien    while (v && *v && v[0][0] == '-' && v[0][2] == '\0')
59959243Sobrien	switch (v[0][1]) {
60059243Sobrien	case 'a':
60159243Sobrien	    aflag++;
60259243Sobrien	    v++;
60359243Sobrien	    break;
60459243Sobrien	case 'd':
60559243Sobrien	    v++;
60659243Sobrien	    z = ED_IO;
60759243Sobrien	    break;
60859243Sobrien	case 'x':
60959243Sobrien	    v++;
61059243Sobrien	    z = EX_IO;
61159243Sobrien	    break;
61259243Sobrien	case 'q':
61359243Sobrien	    v++;
61459243Sobrien	    z = QU_IO;
61559243Sobrien	    break;
61659243Sobrien	default:
617167465Smp	    stderror(ERR_NAME | ERR_SYSTEM, short2str(v[0]),
61859243Sobrien		     CGETS(8, 1, "Unknown switch"));
61959243Sobrien	    break;
62059243Sobrien	}
62159243Sobrien
62259243Sobrien    didsetty = 1;
62359243Sobrien    if (!v || !*v) {
62459243Sobrien	int i = -1;
62559243Sobrien	int len = 0, st = 0, cu;
62659243Sobrien	for (m = modelist; m->m_name; m++) {
62759243Sobrien	    if (m->m_type != i) {
628167465Smp		xprintf("%s%s", i != -1 ? "\n" : "",
62959243Sobrien			ttylist[z][m->m_type].t_name);
63059243Sobrien		i = m->m_type;
63159243Sobrien		st = len = strlen(ttylist[z][m->m_type].t_name);
63259243Sobrien	    }
633231990Smp	    assert(i != -1);
63459243Sobrien
63559243Sobrien	    x = (ttylist[z][i].t_setmask & m->m_value) ? '+' : '\0';
63659243Sobrien	    x = (ttylist[z][i].t_clrmask & m->m_value) ? '-' : x;
63759243Sobrien
63859243Sobrien	    if (x != '\0' || aflag) {
63959243Sobrien		cu = strlen(m->m_name) + (x != '\0') + 1;
640167465Smp		if (len + cu >= TermH) {
64159243Sobrien		    xprintf("\n%*s", st, "");
64259243Sobrien		    len = st + cu;
64359243Sobrien		}
64459243Sobrien		else
64559243Sobrien		    len += cu;
64659243Sobrien		if (x != '\0')
64759243Sobrien		    xprintf("%c%s ", x, m->m_name);
64859243Sobrien		else
64959243Sobrien		    xprintf("%s ", m->m_name);
65059243Sobrien	    }
65159243Sobrien	}
65259243Sobrien	xputchar('\n');
653167465Smp	cleanup_until(cmdname);
65459243Sobrien	return;
65559243Sobrien    }
65659243Sobrien    while (v && (s = *v++)) {
65759243Sobrien	switch (*s) {
65859243Sobrien	case '+':
65959243Sobrien	case '-':
66059243Sobrien	    x = *s++;
66159243Sobrien	    break;
66259243Sobrien	default:
66359243Sobrien	    x = '\0';
66459243Sobrien	    break;
66559243Sobrien	}
66659243Sobrien	d = short2str(s);
66759243Sobrien	for (m = modelist; m->m_name; m++)
66859243Sobrien	    if (strcmp(m->m_name, d) == 0)
66959243Sobrien		break;
67059243Sobrien	if (!m->m_name)
67159243Sobrien	    stderror(ERR_NAME | ERR_SYSTEM, d, CGETS(8, 2, "Invalid argument"));
67259243Sobrien
67359243Sobrien	switch (x) {
67459243Sobrien	case '+':
67559243Sobrien	    ttylist[z][m->m_type].t_setmask |= m->m_value;
67659243Sobrien	    ttylist[z][m->m_type].t_clrmask &= ~m->m_value;
67759243Sobrien	    break;
67859243Sobrien	case '-':
67959243Sobrien	    ttylist[z][m->m_type].t_setmask &= ~m->m_value;
68059243Sobrien	    ttylist[z][m->m_type].t_clrmask |= m->m_value;
68159243Sobrien	    break;
68259243Sobrien	default:
68359243Sobrien	    ttylist[z][m->m_type].t_setmask &= ~m->m_value;
68459243Sobrien	    ttylist[z][m->m_type].t_clrmask &= ~m->m_value;
68559243Sobrien	    break;
68659243Sobrien	}
68759243Sobrien    }
688167465Smp    cleanup_until(cmdname);
68959243Sobrien} /* end dosetty */
69059243Sobrien
69159243Sobrienint
692167465Smptty_getty(int fd, ttydata_t *td)
69359243Sobrien{
69459243Sobrien#ifdef POSIX
69559243Sobrien    RETRY(tcgetattr(fd, &td->d_t));
69659243Sobrien#else /* TERMIO || GSTTY */
69759243Sobrien# ifdef TERMIO
69859243Sobrien    RETRY(ioctl(fd, TCGETA,    (ioctl_t) &td->d_t));
69959243Sobrien# else /* GSTTY */
70059243Sobrien#  ifdef TIOCGETP
70159243Sobrien    RETRY(ioctl(fd, TIOCGETP,  (ioctl_t) &td->d_t));
70259243Sobrien#  endif /* TIOCGETP */
70359243Sobrien#  ifdef TIOCGETC
70459243Sobrien    RETRY(ioctl(fd, TIOCGETC,  (ioctl_t) &td->d_tc));
70559243Sobrien#  endif /* TIOCGETC */
70659243Sobrien#  ifdef TIOCGPAGE
70759243Sobrien    RETRY(ioctl(fd, TIOCGPAGE, (ioctl_t) &td->d_pc));
70859243Sobrien#  endif /* TIOCGPAGE */
70959243Sobrien#  ifdef TIOCLGET
71059243Sobrien    RETRY(ioctl(fd, TIOCLGET,  (ioctl_t) &td->d_lb));
71159243Sobrien#  endif /* TIOCLGET */
71259243Sobrien# endif /* TERMIO */
71359243Sobrien#endif /* POSIX */
71459243Sobrien
71559243Sobrien#ifdef TIOCGLTC
71659243Sobrien    RETRY(ioctl(fd, TIOCGLTC,  (ioctl_t) &td->d_ltc));
71759243Sobrien#endif /* TIOCGLTC */
71859243Sobrien
71959243Sobrien    return 0;
72059243Sobrien}
72159243Sobrien
72259243Sobrienint
723167465Smptty_setty(int fd, ttydata_t *td)
72459243Sobrien{
72559243Sobrien#ifdef POSIX
726167465Smp    RETRY(xtcsetattr(fd, TCSADRAIN, &td->d_t));
72759243Sobrien#else
72859243Sobrien# ifdef TERMIO
72959243Sobrien    RETRY(ioctl(fd, TCSETAW,    (ioctl_t) &td->d_t));
73059243Sobrien# else
73159243Sobrien#  ifdef TIOCSETN
73259243Sobrien    RETRY(ioctl(fd, TIOCSETN,  (ioctl_t) &td->d_t));
73359243Sobrien#  endif /* TIOCSETN */
73459243Sobrien#  ifdef TIOCGETC
73559243Sobrien    RETRY(ioctl(fd, TIOCSETC,  (ioctl_t) &td->d_tc));
73659243Sobrien#  endif /* TIOCGETC */
73759243Sobrien#  ifdef TIOCGPAGE
73859243Sobrien    RETRY(ioctl(fd, TIOCSPAGE, (ioctl_t) &td->d_pc));
73959243Sobrien#  endif /* TIOCGPAGE */
74059243Sobrien#  ifdef TIOCLGET
74159243Sobrien    RETRY(ioctl(fd, TIOCLSET,  (ioctl_t) &td->d_lb));
74259243Sobrien#  endif /* TIOCLGET */
74359243Sobrien# endif /* TERMIO */
74459243Sobrien#endif /* POSIX */
74559243Sobrien
74659243Sobrien#ifdef TIOCGLTC
74759243Sobrien    RETRY(ioctl(fd, TIOCSLTC,  (ioctl_t) &td->d_ltc));
74859243Sobrien#endif /* TIOCGLTC */
74959243Sobrien
75059243Sobrien    return 0;
75159243Sobrien}
75259243Sobrien
75359243Sobrienvoid
754167465Smptty_getchar(ttydata_t *td, unsigned char *s)
75559243Sobrien{
75659243Sobrien#ifdef TIOCGLTC
75759243Sobrien    {
75859243Sobrien	struct ltchars *n = &td->d_ltc;
75959243Sobrien
76059243Sobrien	s[C_SUSP]	= n->t_suspc;
76159243Sobrien	s[C_DSUSP]	= n->t_dsuspc;
76259243Sobrien	s[C_REPRINT]	= n->t_rprntc;
76359243Sobrien	s[C_DISCARD]	= n->t_flushc;
76459243Sobrien	s[C_WERASE]	= n->t_werasc;
76559243Sobrien	s[C_LNEXT]	= n->t_lnextc;
76659243Sobrien    }
76759243Sobrien#endif /* TIOCGLTC */
76859243Sobrien
76959243Sobrien#if defined(POSIX) || defined(TERMIO)
77059243Sobrien    {
77159243Sobrien# ifdef POSIX
77259243Sobrien	struct termios *n = &td->d_t;
77359243Sobrien# else
77459243Sobrien	struct termio *n = &td->d_t;
77559243Sobrien# endif /* POSIX */
77659243Sobrien
77759243Sobrien# ifdef VINTR
77859243Sobrien	s[C_INTR]	= n->c_cc[VINTR];
77959243Sobrien# endif /* VINTR */
78059243Sobrien# ifdef VQUIT
78159243Sobrien	s[C_QUIT]	= n->c_cc[VQUIT];
78259243Sobrien# endif /* VQUIT */
78359243Sobrien# ifdef VERASE
78459243Sobrien	s[C_ERASE]	= n->c_cc[VERASE];
78559243Sobrien# endif /* VERASE */
78659243Sobrien# ifdef VKILL
78759243Sobrien	s[C_KILL]	= n->c_cc[VKILL];
78859243Sobrien# endif /* VKILL */
78959243Sobrien# ifdef VEOF
79059243Sobrien	s[C_EOF]	= n->c_cc[VEOF];
79159243Sobrien# endif /* VEOF */
79259243Sobrien# ifdef VEOL
79359243Sobrien	s[C_EOL]	= n->c_cc[VEOL];
79459243Sobrien# endif /* VEOL */
79559243Sobrien# ifdef VEOL2
79659243Sobrien	s[C_EOL2]	= n->c_cc[VEOL2];
79759243Sobrien# endif  /* VEOL2 */
79859243Sobrien# ifdef VSWTCH
79959243Sobrien	s[C_SWTCH]	= n->c_cc[VSWTCH];
80059243Sobrien# endif /* VSWTCH */
80159243Sobrien# ifdef VDSWTCH
80259243Sobrien	s[C_DSWTCH]	= n->c_cc[VDSWTCH];
80359243Sobrien# endif /* VDSWTCH */
80459243Sobrien# ifdef VERASE2
80559243Sobrien	s[C_ERASE2]	= n->c_cc[VERASE2];
80659243Sobrien# endif /* VERASE2 */
80759243Sobrien# ifdef VSTART
80859243Sobrien	s[C_START]	= n->c_cc[VSTART];
80959243Sobrien# endif /* VSTART */
81059243Sobrien# ifdef VSTOP
81159243Sobrien	s[C_STOP]	= n->c_cc[VSTOP];
81259243Sobrien# endif /* VSTOP */
81359243Sobrien# ifdef VWERASE
81459243Sobrien	s[C_WERASE]	= n->c_cc[VWERASE];
81559243Sobrien# endif /* VWERASE */
81659243Sobrien# ifdef VSUSP
81759243Sobrien	s[C_SUSP]	= n->c_cc[VSUSP];
81859243Sobrien# endif /* VSUSP */
81959243Sobrien# ifdef VDSUSP
82059243Sobrien	s[C_DSUSP]	= n->c_cc[VDSUSP];
82159243Sobrien# endif /* VDSUSP */
82259243Sobrien# ifdef VREPRINT
82359243Sobrien	s[C_REPRINT]	= n->c_cc[VREPRINT];
82459243Sobrien# endif /* WREPRINT */
82559243Sobrien# ifdef VDISCARD
82659243Sobrien	s[C_DISCARD]	= n->c_cc[VDISCARD];
82759243Sobrien# endif /* VDISCARD */
82859243Sobrien# ifdef VLNEXT
82959243Sobrien	s[C_LNEXT]	= n->c_cc[VLNEXT];
83059243Sobrien# endif /* VLNEXT */
83159243Sobrien# ifdef VSTATUS
83259243Sobrien	s[C_STATUS]	= n->c_cc[VSTATUS];
83359243Sobrien# endif /* VSTATUS */
83459243Sobrien# ifdef VPAGE
83559243Sobrien	s[C_PAGE]	= n->c_cc[VPAGE];
83659243Sobrien# endif /* VPAGE */
83759243Sobrien# ifdef VPGOFF
83859243Sobrien	s[C_PGOFF]	= n->c_cc[VPGOFF];
83959243Sobrien# endif /* VPGOFF */
84059243Sobrien# ifdef VKILL2
84159243Sobrien	s[C_KILL2]	= n->c_cc[VKILL2];
84259243Sobrien# endif /* KILL2 */
84359243Sobrien# ifdef VMIN
84459243Sobrien	s[C_MIN]	= n->c_cc[VMIN];
84559243Sobrien# endif /* VMIN */
84659243Sobrien# ifdef VTIME
84759243Sobrien	s[C_TIME]	= n->c_cc[VTIME];
84859243Sobrien# endif /* VTIME */
84959243Sobrien    }
85059243Sobrien
85159243Sobrien#else /* SGTTY */
85259243Sobrien
85359243Sobrien# ifdef TIOCGPAGE
85459243Sobrien    {
85559243Sobrien	struct ttypagestat *n = &td->d_pc;
85659243Sobrien
85759243Sobrien	s[C_STATUS]	= n->tps_statc;
85859243Sobrien	s[C_PAGE]	= n->tps_pagec;
85959243Sobrien	s[C_PGOFF]	= n->tps_pgoffc;
86059243Sobrien    }
86159243Sobrien# endif /* TIOCGPAGE */
86259243Sobrien
86359243Sobrien# ifdef TIOCGETC
86459243Sobrien    {
86559243Sobrien	struct tchars *n = &td->d_tc;
86659243Sobrien
86759243Sobrien	s[C_INTR]	= n->t_intrc;
86859243Sobrien	s[C_QUIT]	= n->t_quitc;
86959243Sobrien	s[C_START]	= n->t_startc;
87059243Sobrien	s[C_STOP]	= n->t_stopc;
87159243Sobrien	s[C_EOF]	= n->t_eofc;
87259243Sobrien	s[C_BRK]	= n->t_brkc;
87359243Sobrien    }
87459243Sobrien# endif /* TIOCGETC */
87559243Sobrien
87659243Sobrien# ifdef TIOCGETP
87759243Sobrien    {
87859243Sobrien	struct sgttyb *n = &td->d_t;
87959243Sobrien
88059243Sobrien	s[C_ERASE]	= n->sg_erase;
88159243Sobrien	s[C_KILL]	= n->sg_kill;
88259243Sobrien    }
88359243Sobrien# endif /* TIOCGETP */
88459243Sobrien#endif /* !POSIX || TERMIO */
88559243Sobrien
88659243Sobrien} /* tty_getchar */
88759243Sobrien
88859243Sobrien
88959243Sobrienvoid
890167465Smptty_setchar(ttydata_t *td, unsigned char *s)
89159243Sobrien{
89259243Sobrien#ifdef TIOCGLTC
89359243Sobrien    {
89459243Sobrien	struct ltchars *n = &td->d_ltc;
89559243Sobrien
89659243Sobrien	n->t_suspc 		= s[C_SUSP];
89759243Sobrien	n->t_dsuspc		= s[C_DSUSP];
89859243Sobrien	n->t_rprntc		= s[C_REPRINT];
89959243Sobrien	n->t_flushc		= s[C_DISCARD];
90059243Sobrien	n->t_werasc		= s[C_WERASE];
90159243Sobrien	n->t_lnextc		= s[C_LNEXT];
90259243Sobrien    }
90359243Sobrien#endif /* TIOCGLTC */
90459243Sobrien
90559243Sobrien#if defined(POSIX) || defined(TERMIO)
90659243Sobrien    {
90759243Sobrien# ifdef POSIX
90859243Sobrien	struct termios *n = &td->d_t;
90959243Sobrien# else
91059243Sobrien	struct termio *n = &td->d_t;
91159243Sobrien# endif /* POSIX */
91259243Sobrien
91359243Sobrien# ifdef VINTR
91459243Sobrien	n->c_cc[VINTR]		= s[C_INTR];
91559243Sobrien# endif /* VINTR */
91659243Sobrien# ifdef VQUIT
91759243Sobrien	n->c_cc[VQUIT]		= s[C_QUIT];
91859243Sobrien# endif /* VQUIT */
91959243Sobrien# ifdef VERASE
92059243Sobrien	n->c_cc[VERASE]		= s[C_ERASE];
92159243Sobrien# endif /* VERASE */
92259243Sobrien# ifdef VKILL
92359243Sobrien	n->c_cc[VKILL]		= s[C_KILL];
92459243Sobrien# endif /* VKILL */
92559243Sobrien# ifdef VEOF
92659243Sobrien	n->c_cc[VEOF]		= s[C_EOF];
92759243Sobrien# endif /* VEOF */
92859243Sobrien# ifdef VEOL
92959243Sobrien	n->c_cc[VEOL]		= s[C_EOL];
93059243Sobrien# endif /* VEOL */
93159243Sobrien# ifdef VEOL2
93259243Sobrien	n->c_cc[VEOL2]		= s[C_EOL2];
93359243Sobrien# endif  /* VEOL2 */
93459243Sobrien# ifdef VSWTCH
93559243Sobrien	n->c_cc[VSWTCH]		= s[C_SWTCH];
93659243Sobrien# endif /* VSWTCH */
93759243Sobrien# ifdef VDSWTCH
93859243Sobrien	n->c_cc[VDSWTCH]	= s[C_DSWTCH];
93959243Sobrien# endif /* VDSWTCH */
94059243Sobrien# ifdef VERASE2
94159243Sobrien	n->c_cc[VERASE2]	= s[C_ERASE2];
94259243Sobrien# endif /* VERASE2 */
94359243Sobrien# ifdef VSTART
94459243Sobrien	n->c_cc[VSTART]		= s[C_START];
94559243Sobrien# endif /* VSTART */
94659243Sobrien# ifdef VSTOP
94759243Sobrien	n->c_cc[VSTOP]		= s[C_STOP];
94859243Sobrien# endif /* VSTOP */
94959243Sobrien# ifdef VWERASE
95059243Sobrien	n->c_cc[VWERASE]	= s[C_WERASE];
95159243Sobrien# endif /* VWERASE */
95259243Sobrien# ifdef VSUSP
95359243Sobrien	n->c_cc[VSUSP]		= s[C_SUSP];
95459243Sobrien# endif /* VSUSP */
95559243Sobrien# ifdef VDSUSP
95659243Sobrien	n->c_cc[VDSUSP]		= s[C_DSUSP];
95759243Sobrien# endif /* VDSUSP */
95859243Sobrien# ifdef VREPRINT
95959243Sobrien	n->c_cc[VREPRINT]	= s[C_REPRINT];
96059243Sobrien# endif /* WREPRINT */
96159243Sobrien# ifdef VDISCARD
96259243Sobrien	n->c_cc[VDISCARD]	= s[C_DISCARD];
96359243Sobrien# endif /* VDISCARD */
96459243Sobrien# ifdef VLNEXT
96559243Sobrien	n->c_cc[VLNEXT]		= s[C_LNEXT];
96659243Sobrien# endif /* VLNEXT */
96759243Sobrien# ifdef VSTATUS
96859243Sobrien	n->c_cc[VSTATUS]	= s[C_STATUS];
96959243Sobrien# endif /* VSTATUS */
97059243Sobrien# ifdef VPAGE
97159243Sobrien	n->c_cc[VPAGE]		= s[C_PAGE];
97259243Sobrien# endif /* VPAGE */
97359243Sobrien# ifdef VPGOFF
97459243Sobrien	n->c_cc[VPGOFF]		= s[C_PGOFF];
97559243Sobrien# endif /* VPGOFF */
97659243Sobrien# ifdef VKILL2
97759243Sobrien	n->c_cc[VKILL2]		= s[C_KILL2];
97859243Sobrien# endif /* VKILL2 */
97959243Sobrien# ifdef VMIN
98059243Sobrien	n->c_cc[VMIN]		= s[C_MIN];
98159243Sobrien# endif /* VMIN */
98259243Sobrien# ifdef VTIME
98359243Sobrien	n->c_cc[VTIME]		= s[C_TIME];
98459243Sobrien# endif /* VTIME */
98559243Sobrien    }
98659243Sobrien
98759243Sobrien#else /* GSTTY */
98859243Sobrien
98959243Sobrien# ifdef TIOCGPAGE
99059243Sobrien    {
99159243Sobrien	struct ttypagestat *n = &td->d_pc;
99259243Sobrien
99359243Sobrien	n->tps_length		= 0;
99459243Sobrien	n->tps_lpos		= 0;
99559243Sobrien	n->tps_statc		= s[C_STATUS];
99659243Sobrien	n->tps_pagec		= s[C_PAGE];
99759243Sobrien	n->tps_pgoffc		= s[C_PGOFF];
99859243Sobrien	n->tps_flag		= 0;
99959243Sobrien    }
100059243Sobrien# endif /* TIOCGPAGE */
100159243Sobrien
100259243Sobrien# ifdef TIOCGETC
100359243Sobrien    {
100459243Sobrien	struct tchars *n = &td->d_tc;
100559243Sobrien	n->t_intrc		= s[C_INTR];
100659243Sobrien	n->t_quitc		= s[C_QUIT];
100759243Sobrien	n->t_startc		= s[C_START];
100859243Sobrien	n->t_stopc		= s[C_STOP];
100959243Sobrien	n->t_eofc		= s[C_EOF];
101059243Sobrien	n->t_brkc		= s[C_BRK];
101159243Sobrien    }
101259243Sobrien# endif /* TIOCGETC */
101359243Sobrien
101459243Sobrien# ifdef TIOCGETP
101559243Sobrien    {
101659243Sobrien	struct sgttyb *n = &td->d_t;
101759243Sobrien
101859243Sobrien	n->sg_erase		= s[C_ERASE];
101959243Sobrien	n->sg_kill		= s[C_KILL];
102059243Sobrien    }
102159243Sobrien# endif /* TIOCGETP */
102259243Sobrien#endif /* !POSIX || TERMIO */
102359243Sobrien
102459243Sobrien} /* tty_setchar */
102559243Sobrien
102659243Sobrienspeed_t
1027167465Smptty_getspeed(ttydata_t *td)
102859243Sobrien{
102959243Sobrien    speed_t spd;
103059243Sobrien
103159243Sobrien#ifdef POSIX
103259243Sobrien    if ((spd = cfgetispeed(&td->d_t)) == 0)
103359243Sobrien	spd = cfgetospeed(&td->d_t);
103459243Sobrien#else /* ! POSIX */
103559243Sobrien# ifdef TERMIO
103659243Sobrien#  ifdef CBAUD
103759243Sobrien    spd = td->d_t.c_cflag & CBAUD;
103859243Sobrien#  else
103959243Sobrien    spd = 0;
104059243Sobrien#  endif
104159243Sobrien# else /* SGTTY */
104259243Sobrien    spd = td->d_t.sg_ispeed;
104359243Sobrien# endif /* TERMIO */
104459243Sobrien#endif /* POSIX */
104559243Sobrien
104659243Sobrien    return spd;
104759243Sobrien} /* end tty_getspeed */
104859243Sobrien
104959243Sobrienint
1050167465Smptty_gettabs(ttydata_t *td)
105159243Sobrien{
105259243Sobrien#if defined(POSIX) || defined(TERMIO)
105359243Sobrien    return ((td->d_t.c_oflag & TAB3) == TAB3) ? 0 : 1;
105459243Sobrien#else /* SGTTY */
105559243Sobrien    return (td->d_t.sg_flags & XTABS) == XTABS ? 0 : 1;
105659243Sobrien#endif /* POSIX || TERMIO */
105759243Sobrien} /* end tty_gettabs */
105859243Sobrien
105959243Sobrienint
1060167465Smptty_geteightbit(ttydata_t *td)
106159243Sobrien{
106259243Sobrien#if defined(POSIX) || defined(TERMIO)
106359243Sobrien    return (td->d_t.c_cflag & CSIZE) == CS8;
106459243Sobrien#else /* SGTTY */
106559243Sobrien    return td->d_lb & (LPASS8 | LLITOUT);
106659243Sobrien#endif /* POSIX || TERMIO */
106759243Sobrien} /* end tty_geteightbit */
106859243Sobrien
106959243Sobrienint
1070167465Smptty_cooked_mode(ttydata_t *td)
107159243Sobrien{
107259243Sobrien#if defined(POSIX) || defined(TERMIO)
107359243Sobrien    return (td->d_t.c_lflag & ICANON);
107459243Sobrien#else /* SGTTY */
107559243Sobrien    return !(td->d_t.sg_flags & (RAW | CBREAK));
107659243Sobrien#endif /* POSIX || TERMIO */
107759243Sobrien} /* end tty_cooked_mode */
107859243Sobrien
107959243Sobrien#ifdef _IBMR2
108059243Sobrienvoid
1081167465Smptty_setdisc(int fd, int dis)
108259243Sobrien{
1083145479Smp    static int edit_discipline = 0;
108459243Sobrien    static union txname tx_disc;
108559243Sobrien    extern char strPOSIX[];
108659243Sobrien
108759243Sobrien    switch (dis) {
108859243Sobrien    case EX_IO:
108959243Sobrien	if (edit_discipline) {
109059243Sobrien	    if (ioctl(fd, TXSETLD, (ioctl_t) & tx_disc) == -1)
109159243Sobrien		return;
109259243Sobrien	    edit_discipline = 0;
109359243Sobrien	}
109459243Sobrien	return;
109559243Sobrien
109659243Sobrien    case ED_IO:
109759243Sobrien	tx_disc.tx_which = 0;
109859243Sobrien	if (ioctl(fd, TXGETLD, (ioctl_t) & tx_disc) == -1)
109959243Sobrien	    return;
110059243Sobrien	if (strcmp(tx_disc.tx_name, strPOSIX) != 0) {
110159243Sobrien	    edit_discipline = 1;
110259243Sobrien	    if (ioctl(fd, TXSETLD, (ioctl_t) strPOSIX) == -1)
110359243Sobrien	    return;
110459243Sobrien	}
110559243Sobrien	return;
110659243Sobrien
110759243Sobrien    default:
110859243Sobrien	return;
110959243Sobrien    }
111059243Sobrien} /* end tty_setdisc */
111159243Sobrien#endif /* _IBMR2 */
111259243Sobrien
111359243Sobrien#ifdef DEBUG_TTY
111459243Sobrienstatic void
1115167465Smptty_printchar(unsigned char *s)
111659243Sobrien{
111759243Sobrien    struct tcshmodes *m;
111859243Sobrien    int i;
111959243Sobrien
112059243Sobrien    for (i = 0; i < C_NCC; i++) {
112159243Sobrien	for (m = modelist; m->m_name; m++)
112259243Sobrien	    if (m->m_type == M_CHAR && C_SH(i) == m->m_value)
112359243Sobrien		break;
112459243Sobrien	if (m->m_name)
112559243Sobrien	    xprintf("%s ^%c ", m->m_name, s[i] + 'A' - 1);
112659243Sobrien	if (i % 5 == 0)
112759243Sobrien	    xputchar('\n');
112859243Sobrien    }
112959243Sobrien    xputchar('\n');
113059243Sobrien}
113159243Sobrien#endif /* DEBUG_TTY */
113269408Sache#else /* WINNT_NATIVE */
113359243Sobrienint
1134167465Smptty_cooked_mode(void *td)
113559243Sobrien{
113659243Sobrien    return do_nt_check_cooked_mode();
113759243Sobrien}
113869408Sache#endif /* !WINNT_NATIVE */
1139