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