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