ed.term.c revision 69408
169408Sache/* $Header: /src/pub/tcsh/ed.term.c,v 1.25 2000/11/11 23:03:34 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 4069408SacheRCSID("$Id: ed.term.c,v 1.25 2000/11/11 23:03:34 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 56959243Sobrien/* Retry a system call */ 57059243Sobrien#define RETRY(x) \ 57159243Sobrien for (;;) \ 57259243Sobrien if ((x) == -1) { \ 57359243Sobrien if (OKERROR(errno)) \ 57459243Sobrien continue; \ 57559243Sobrien else \ 57659243Sobrien return -1; \ 57759243Sobrien } \ 57859243Sobrien else \ 57959243Sobrien break \ 58059243Sobrien 58159243Sobrien/*ARGSUSED*/ 58259243Sobrienvoid 58359243Sobriendosetty(v, t) 58459243Sobrien Char **v; 58559243Sobrien struct command *t; 58659243Sobrien{ 58759243Sobrien struct tcshmodes *m; 58859243Sobrien char x, *d; 58959243Sobrien int aflag = 0; 59059243Sobrien Char *s; 59159243Sobrien int z = EX_IO; 59259243Sobrien char cmdname[BUFSIZE]; 59359243Sobrien 59459243Sobrien USE(t); 59559243Sobrien setname(strcpy(cmdname, short2str(*v++))); 59659243Sobrien 59759243Sobrien while (v && *v && v[0][0] == '-' && v[0][2] == '\0') 59859243Sobrien switch (v[0][1]) { 59959243Sobrien case 'a': 60059243Sobrien aflag++; 60159243Sobrien v++; 60259243Sobrien break; 60359243Sobrien case 'd': 60459243Sobrien v++; 60559243Sobrien z = ED_IO; 60659243Sobrien break; 60759243Sobrien case 'x': 60859243Sobrien v++; 60959243Sobrien z = EX_IO; 61059243Sobrien break; 61159243Sobrien case 'q': 61259243Sobrien v++; 61359243Sobrien z = QU_IO; 61459243Sobrien break; 61559243Sobrien default: 61659243Sobrien stderror(ERR_NAME | ERR_SYSTEM, short2str(v[0]), 61759243Sobrien CGETS(8, 1, "Unknown switch")); 61859243Sobrien break; 61959243Sobrien } 62059243Sobrien 62159243Sobrien didsetty = 1; 62259243Sobrien if (!v || !*v) { 62359243Sobrien int i = -1; 62459243Sobrien int len = 0, st = 0, cu; 62559243Sobrien for (m = modelist; m->m_name; m++) { 62659243Sobrien if (m->m_type != i) { 62759243Sobrien xprintf("%s%s", i != -1 ? "\n" : "", 62859243Sobrien ttylist[z][m->m_type].t_name); 62959243Sobrien i = m->m_type; 63059243Sobrien st = len = strlen(ttylist[z][m->m_type].t_name); 63159243Sobrien } 63259243Sobrien 63359243Sobrien x = (ttylist[z][i].t_setmask & m->m_value) ? '+' : '\0'; 63459243Sobrien x = (ttylist[z][i].t_clrmask & m->m_value) ? '-' : x; 63559243Sobrien 63659243Sobrien if (x != '\0' || aflag) { 63759243Sobrien cu = strlen(m->m_name) + (x != '\0') + 1; 63859243Sobrien if (len + cu >= T_Cols) { 63959243Sobrien xprintf("\n%*s", st, ""); 64059243Sobrien len = st + cu; 64159243Sobrien } 64259243Sobrien else 64359243Sobrien len += cu; 64459243Sobrien if (x != '\0') 64559243Sobrien xprintf("%c%s ", x, m->m_name); 64659243Sobrien else 64759243Sobrien xprintf("%s ", m->m_name); 64859243Sobrien } 64959243Sobrien } 65059243Sobrien xputchar('\n'); 65159243Sobrien return; 65259243Sobrien } 65359243Sobrien while (v && (s = *v++)) { 65459243Sobrien switch (*s) { 65559243Sobrien case '+': 65659243Sobrien case '-': 65759243Sobrien x = *s++; 65859243Sobrien break; 65959243Sobrien default: 66059243Sobrien x = '\0'; 66159243Sobrien break; 66259243Sobrien } 66359243Sobrien d = short2str(s); 66459243Sobrien for (m = modelist; m->m_name; m++) 66559243Sobrien if (strcmp(m->m_name, d) == 0) 66659243Sobrien break; 66759243Sobrien if (!m->m_name) 66859243Sobrien stderror(ERR_NAME | ERR_SYSTEM, d, CGETS(8, 2, "Invalid argument")); 66959243Sobrien 67059243Sobrien switch (x) { 67159243Sobrien case '+': 67259243Sobrien ttylist[z][m->m_type].t_setmask |= m->m_value; 67359243Sobrien ttylist[z][m->m_type].t_clrmask &= ~m->m_value; 67459243Sobrien break; 67559243Sobrien case '-': 67659243Sobrien ttylist[z][m->m_type].t_setmask &= ~m->m_value; 67759243Sobrien ttylist[z][m->m_type].t_clrmask |= m->m_value; 67859243Sobrien break; 67959243Sobrien default: 68059243Sobrien ttylist[z][m->m_type].t_setmask &= ~m->m_value; 68159243Sobrien ttylist[z][m->m_type].t_clrmask &= ~m->m_value; 68259243Sobrien break; 68359243Sobrien } 68459243Sobrien } 68559243Sobrien} /* end dosetty */ 68659243Sobrien 68759243Sobrienint 68859243Sobrientty_getty(fd, td) 68959243Sobrien int fd; 69059243Sobrien ttydata_t *td; 69159243Sobrien{ 69259243Sobrien#ifdef POSIX 69359243Sobrien RETRY(tcgetattr(fd, &td->d_t)); 69459243Sobrien#else /* TERMIO || GSTTY */ 69559243Sobrien# ifdef TERMIO 69659243Sobrien RETRY(ioctl(fd, TCGETA, (ioctl_t) &td->d_t)); 69759243Sobrien# else /* GSTTY */ 69859243Sobrien# ifdef TIOCGETP 69959243Sobrien RETRY(ioctl(fd, TIOCGETP, (ioctl_t) &td->d_t)); 70059243Sobrien# endif /* TIOCGETP */ 70159243Sobrien# ifdef TIOCGETC 70259243Sobrien RETRY(ioctl(fd, TIOCGETC, (ioctl_t) &td->d_tc)); 70359243Sobrien# endif /* TIOCGETC */ 70459243Sobrien# ifdef TIOCGPAGE 70559243Sobrien RETRY(ioctl(fd, TIOCGPAGE, (ioctl_t) &td->d_pc)); 70659243Sobrien# endif /* TIOCGPAGE */ 70759243Sobrien# ifdef TIOCLGET 70859243Sobrien RETRY(ioctl(fd, TIOCLGET, (ioctl_t) &td->d_lb)); 70959243Sobrien# endif /* TIOCLGET */ 71059243Sobrien# endif /* TERMIO */ 71159243Sobrien#endif /* POSIX */ 71259243Sobrien 71359243Sobrien#ifdef TIOCGLTC 71459243Sobrien RETRY(ioctl(fd, TIOCGLTC, (ioctl_t) &td->d_ltc)); 71559243Sobrien#endif /* TIOCGLTC */ 71659243Sobrien 71759243Sobrien return 0; 71859243Sobrien} 71959243Sobrien 72059243Sobrienint 72159243Sobrientty_setty(fd, td) 72259243Sobrien int fd; 72359243Sobrien ttydata_t *td; 72459243Sobrien{ 72559243Sobrien#ifdef POSIX 72659243Sobrien RETRY(tcsetattr(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 75459243Sobrientty_getchar(td, s) 75559243Sobrien ttydata_t *td; 75659243Sobrien unsigned char *s; 75759243Sobrien{ 75859243Sobrien#ifdef TIOCGLTC 75959243Sobrien { 76059243Sobrien struct ltchars *n = &td->d_ltc; 76159243Sobrien 76259243Sobrien s[C_SUSP] = n->t_suspc; 76359243Sobrien s[C_DSUSP] = n->t_dsuspc; 76459243Sobrien s[C_REPRINT] = n->t_rprntc; 76559243Sobrien s[C_DISCARD] = n->t_flushc; 76659243Sobrien s[C_WERASE] = n->t_werasc; 76759243Sobrien s[C_LNEXT] = n->t_lnextc; 76859243Sobrien } 76959243Sobrien#endif /* TIOCGLTC */ 77059243Sobrien 77159243Sobrien#if defined(POSIX) || defined(TERMIO) 77259243Sobrien { 77359243Sobrien# ifdef POSIX 77459243Sobrien struct termios *n = &td->d_t; 77559243Sobrien# else 77659243Sobrien struct termio *n = &td->d_t; 77759243Sobrien# endif /* POSIX */ 77859243Sobrien 77959243Sobrien# ifdef VINTR 78059243Sobrien s[C_INTR] = n->c_cc[VINTR]; 78159243Sobrien# endif /* VINTR */ 78259243Sobrien# ifdef VQUIT 78359243Sobrien s[C_QUIT] = n->c_cc[VQUIT]; 78459243Sobrien# endif /* VQUIT */ 78559243Sobrien# ifdef VERASE 78659243Sobrien s[C_ERASE] = n->c_cc[VERASE]; 78759243Sobrien# endif /* VERASE */ 78859243Sobrien# ifdef VKILL 78959243Sobrien s[C_KILL] = n->c_cc[VKILL]; 79059243Sobrien# endif /* VKILL */ 79159243Sobrien# ifdef VEOF 79259243Sobrien s[C_EOF] = n->c_cc[VEOF]; 79359243Sobrien# endif /* VEOF */ 79459243Sobrien# ifdef VEOL 79559243Sobrien s[C_EOL] = n->c_cc[VEOL]; 79659243Sobrien# endif /* VEOL */ 79759243Sobrien# ifdef VEOL2 79859243Sobrien s[C_EOL2] = n->c_cc[VEOL2]; 79959243Sobrien# endif /* VEOL2 */ 80059243Sobrien# ifdef VSWTCH 80159243Sobrien s[C_SWTCH] = n->c_cc[VSWTCH]; 80259243Sobrien# endif /* VSWTCH */ 80359243Sobrien# ifdef VDSWTCH 80459243Sobrien s[C_DSWTCH] = n->c_cc[VDSWTCH]; 80559243Sobrien# endif /* VDSWTCH */ 80659243Sobrien# ifdef VERASE2 80759243Sobrien s[C_ERASE2] = n->c_cc[VERASE2]; 80859243Sobrien# endif /* VERASE2 */ 80959243Sobrien# ifdef VSTART 81059243Sobrien s[C_START] = n->c_cc[VSTART]; 81159243Sobrien# endif /* VSTART */ 81259243Sobrien# ifdef VSTOP 81359243Sobrien s[C_STOP] = n->c_cc[VSTOP]; 81459243Sobrien# endif /* VSTOP */ 81559243Sobrien# ifdef VWERASE 81659243Sobrien s[C_WERASE] = n->c_cc[VWERASE]; 81759243Sobrien# endif /* VWERASE */ 81859243Sobrien# ifdef VSUSP 81959243Sobrien s[C_SUSP] = n->c_cc[VSUSP]; 82059243Sobrien# endif /* VSUSP */ 82159243Sobrien# ifdef VDSUSP 82259243Sobrien s[C_DSUSP] = n->c_cc[VDSUSP]; 82359243Sobrien# endif /* VDSUSP */ 82459243Sobrien# ifdef VREPRINT 82559243Sobrien s[C_REPRINT] = n->c_cc[VREPRINT]; 82659243Sobrien# endif /* WREPRINT */ 82759243Sobrien# ifdef VDISCARD 82859243Sobrien s[C_DISCARD] = n->c_cc[VDISCARD]; 82959243Sobrien# endif /* VDISCARD */ 83059243Sobrien# ifdef VLNEXT 83159243Sobrien s[C_LNEXT] = n->c_cc[VLNEXT]; 83259243Sobrien# endif /* VLNEXT */ 83359243Sobrien# ifdef VSTATUS 83459243Sobrien s[C_STATUS] = n->c_cc[VSTATUS]; 83559243Sobrien# endif /* VSTATUS */ 83659243Sobrien# ifdef VPAGE 83759243Sobrien s[C_PAGE] = n->c_cc[VPAGE]; 83859243Sobrien# endif /* VPAGE */ 83959243Sobrien# ifdef VPGOFF 84059243Sobrien s[C_PGOFF] = n->c_cc[VPGOFF]; 84159243Sobrien# endif /* VPGOFF */ 84259243Sobrien# ifdef VKILL2 84359243Sobrien s[C_KILL2] = n->c_cc[VKILL2]; 84459243Sobrien# endif /* KILL2 */ 84559243Sobrien# ifdef VMIN 84659243Sobrien s[C_MIN] = n->c_cc[VMIN]; 84759243Sobrien# endif /* VMIN */ 84859243Sobrien# ifdef VTIME 84959243Sobrien s[C_TIME] = n->c_cc[VTIME]; 85059243Sobrien# endif /* VTIME */ 85159243Sobrien } 85259243Sobrien 85359243Sobrien#else /* SGTTY */ 85459243Sobrien 85559243Sobrien# ifdef TIOCGPAGE 85659243Sobrien { 85759243Sobrien struct ttypagestat *n = &td->d_pc; 85859243Sobrien 85959243Sobrien s[C_STATUS] = n->tps_statc; 86059243Sobrien s[C_PAGE] = n->tps_pagec; 86159243Sobrien s[C_PGOFF] = n->tps_pgoffc; 86259243Sobrien } 86359243Sobrien# endif /* TIOCGPAGE */ 86459243Sobrien 86559243Sobrien# ifdef TIOCGETC 86659243Sobrien { 86759243Sobrien struct tchars *n = &td->d_tc; 86859243Sobrien 86959243Sobrien s[C_INTR] = n->t_intrc; 87059243Sobrien s[C_QUIT] = n->t_quitc; 87159243Sobrien s[C_START] = n->t_startc; 87259243Sobrien s[C_STOP] = n->t_stopc; 87359243Sobrien s[C_EOF] = n->t_eofc; 87459243Sobrien s[C_BRK] = n->t_brkc; 87559243Sobrien } 87659243Sobrien# endif /* TIOCGETC */ 87759243Sobrien 87859243Sobrien# ifdef TIOCGETP 87959243Sobrien { 88059243Sobrien struct sgttyb *n = &td->d_t; 88159243Sobrien 88259243Sobrien s[C_ERASE] = n->sg_erase; 88359243Sobrien s[C_KILL] = n->sg_kill; 88459243Sobrien } 88559243Sobrien# endif /* TIOCGETP */ 88659243Sobrien#endif /* !POSIX || TERMIO */ 88759243Sobrien 88859243Sobrien} /* tty_getchar */ 88959243Sobrien 89059243Sobrien 89159243Sobrienvoid 89259243Sobrientty_setchar(td, s) 89359243Sobrien ttydata_t *td; 89459243Sobrien unsigned char *s; 89559243Sobrien{ 89659243Sobrien#ifdef TIOCGLTC 89759243Sobrien { 89859243Sobrien struct ltchars *n = &td->d_ltc; 89959243Sobrien 90059243Sobrien n->t_suspc = s[C_SUSP]; 90159243Sobrien n->t_dsuspc = s[C_DSUSP]; 90259243Sobrien n->t_rprntc = s[C_REPRINT]; 90359243Sobrien n->t_flushc = s[C_DISCARD]; 90459243Sobrien n->t_werasc = s[C_WERASE]; 90559243Sobrien n->t_lnextc = s[C_LNEXT]; 90659243Sobrien } 90759243Sobrien#endif /* TIOCGLTC */ 90859243Sobrien 90959243Sobrien#if defined(POSIX) || defined(TERMIO) 91059243Sobrien { 91159243Sobrien# ifdef POSIX 91259243Sobrien struct termios *n = &td->d_t; 91359243Sobrien# else 91459243Sobrien struct termio *n = &td->d_t; 91559243Sobrien# endif /* POSIX */ 91659243Sobrien 91759243Sobrien# ifdef VINTR 91859243Sobrien n->c_cc[VINTR] = s[C_INTR]; 91959243Sobrien# endif /* VINTR */ 92059243Sobrien# ifdef VQUIT 92159243Sobrien n->c_cc[VQUIT] = s[C_QUIT]; 92259243Sobrien# endif /* VQUIT */ 92359243Sobrien# ifdef VERASE 92459243Sobrien n->c_cc[VERASE] = s[C_ERASE]; 92559243Sobrien# endif /* VERASE */ 92659243Sobrien# ifdef VKILL 92759243Sobrien n->c_cc[VKILL] = s[C_KILL]; 92859243Sobrien# endif /* VKILL */ 92959243Sobrien# ifdef VEOF 93059243Sobrien n->c_cc[VEOF] = s[C_EOF]; 93159243Sobrien# endif /* VEOF */ 93259243Sobrien# ifdef VEOL 93359243Sobrien n->c_cc[VEOL] = s[C_EOL]; 93459243Sobrien# endif /* VEOL */ 93559243Sobrien# ifdef VEOL2 93659243Sobrien n->c_cc[VEOL2] = s[C_EOL2]; 93759243Sobrien# endif /* VEOL2 */ 93859243Sobrien# ifdef VSWTCH 93959243Sobrien n->c_cc[VSWTCH] = s[C_SWTCH]; 94059243Sobrien# endif /* VSWTCH */ 94159243Sobrien# ifdef VDSWTCH 94259243Sobrien n->c_cc[VDSWTCH] = s[C_DSWTCH]; 94359243Sobrien# endif /* VDSWTCH */ 94459243Sobrien# ifdef VERASE2 94559243Sobrien n->c_cc[VERASE2] = s[C_ERASE2]; 94659243Sobrien# endif /* VERASE2 */ 94759243Sobrien# ifdef VSTART 94859243Sobrien n->c_cc[VSTART] = s[C_START]; 94959243Sobrien# endif /* VSTART */ 95059243Sobrien# ifdef VSTOP 95159243Sobrien n->c_cc[VSTOP] = s[C_STOP]; 95259243Sobrien# endif /* VSTOP */ 95359243Sobrien# ifdef VWERASE 95459243Sobrien n->c_cc[VWERASE] = s[C_WERASE]; 95559243Sobrien# endif /* VWERASE */ 95659243Sobrien# ifdef VSUSP 95759243Sobrien n->c_cc[VSUSP] = s[C_SUSP]; 95859243Sobrien# endif /* VSUSP */ 95959243Sobrien# ifdef VDSUSP 96059243Sobrien n->c_cc[VDSUSP] = s[C_DSUSP]; 96159243Sobrien# endif /* VDSUSP */ 96259243Sobrien# ifdef VREPRINT 96359243Sobrien n->c_cc[VREPRINT] = s[C_REPRINT]; 96459243Sobrien# endif /* WREPRINT */ 96559243Sobrien# ifdef VDISCARD 96659243Sobrien n->c_cc[VDISCARD] = s[C_DISCARD]; 96759243Sobrien# endif /* VDISCARD */ 96859243Sobrien# ifdef VLNEXT 96959243Sobrien n->c_cc[VLNEXT] = s[C_LNEXT]; 97059243Sobrien# endif /* VLNEXT */ 97159243Sobrien# ifdef VSTATUS 97259243Sobrien n->c_cc[VSTATUS] = s[C_STATUS]; 97359243Sobrien# endif /* VSTATUS */ 97459243Sobrien# ifdef VPAGE 97559243Sobrien n->c_cc[VPAGE] = s[C_PAGE]; 97659243Sobrien# endif /* VPAGE */ 97759243Sobrien# ifdef VPGOFF 97859243Sobrien n->c_cc[VPGOFF] = s[C_PGOFF]; 97959243Sobrien# endif /* VPGOFF */ 98059243Sobrien# ifdef VKILL2 98159243Sobrien n->c_cc[VKILL2] = s[C_KILL2]; 98259243Sobrien# endif /* VKILL2 */ 98359243Sobrien# ifdef VMIN 98459243Sobrien n->c_cc[VMIN] = s[C_MIN]; 98559243Sobrien# endif /* VMIN */ 98659243Sobrien# ifdef VTIME 98759243Sobrien n->c_cc[VTIME] = s[C_TIME]; 98859243Sobrien# endif /* VTIME */ 98959243Sobrien } 99059243Sobrien 99159243Sobrien#else /* GSTTY */ 99259243Sobrien 99359243Sobrien# ifdef TIOCGPAGE 99459243Sobrien { 99559243Sobrien struct ttypagestat *n = &td->d_pc; 99659243Sobrien 99759243Sobrien n->tps_length = 0; 99859243Sobrien n->tps_lpos = 0; 99959243Sobrien n->tps_statc = s[C_STATUS]; 100059243Sobrien n->tps_pagec = s[C_PAGE]; 100159243Sobrien n->tps_pgoffc = s[C_PGOFF]; 100259243Sobrien n->tps_flag = 0; 100359243Sobrien } 100459243Sobrien# endif /* TIOCGPAGE */ 100559243Sobrien 100659243Sobrien# ifdef TIOCGETC 100759243Sobrien { 100859243Sobrien struct tchars *n = &td->d_tc; 100959243Sobrien n->t_intrc = s[C_INTR]; 101059243Sobrien n->t_quitc = s[C_QUIT]; 101159243Sobrien n->t_startc = s[C_START]; 101259243Sobrien n->t_stopc = s[C_STOP]; 101359243Sobrien n->t_eofc = s[C_EOF]; 101459243Sobrien n->t_brkc = s[C_BRK]; 101559243Sobrien } 101659243Sobrien# endif /* TIOCGETC */ 101759243Sobrien 101859243Sobrien# ifdef TIOCGETP 101959243Sobrien { 102059243Sobrien struct sgttyb *n = &td->d_t; 102159243Sobrien 102259243Sobrien n->sg_erase = s[C_ERASE]; 102359243Sobrien n->sg_kill = s[C_KILL]; 102459243Sobrien } 102559243Sobrien# endif /* TIOCGETP */ 102659243Sobrien#endif /* !POSIX || TERMIO */ 102759243Sobrien 102859243Sobrien} /* tty_setchar */ 102959243Sobrien 103059243Sobrienspeed_t 103159243Sobrientty_getspeed(td) 103259243Sobrien ttydata_t *td; 103359243Sobrien{ 103459243Sobrien speed_t spd; 103559243Sobrien 103659243Sobrien#ifdef POSIX 103759243Sobrien if ((spd = cfgetispeed(&td->d_t)) == 0) 103859243Sobrien spd = cfgetospeed(&td->d_t); 103959243Sobrien#else /* ! POSIX */ 104059243Sobrien# ifdef TERMIO 104159243Sobrien# ifdef CBAUD 104259243Sobrien spd = td->d_t.c_cflag & CBAUD; 104359243Sobrien# else 104459243Sobrien spd = 0; 104559243Sobrien# endif 104659243Sobrien# else /* SGTTY */ 104759243Sobrien spd = td->d_t.sg_ispeed; 104859243Sobrien# endif /* TERMIO */ 104959243Sobrien#endif /* POSIX */ 105059243Sobrien 105159243Sobrien return spd; 105259243Sobrien} /* end tty_getspeed */ 105359243Sobrien 105459243Sobrienint 105559243Sobrientty_gettabs(td) 105659243Sobrien ttydata_t *td; 105759243Sobrien{ 105859243Sobrien#if defined(POSIX) || defined(TERMIO) 105959243Sobrien return ((td->d_t.c_oflag & TAB3) == TAB3) ? 0 : 1; 106059243Sobrien#else /* SGTTY */ 106159243Sobrien return (td->d_t.sg_flags & XTABS) == XTABS ? 0 : 1; 106259243Sobrien#endif /* POSIX || TERMIO */ 106359243Sobrien} /* end tty_gettabs */ 106459243Sobrien 106559243Sobrienint 106659243Sobrientty_geteightbit(td) 106759243Sobrien ttydata_t *td; 106859243Sobrien{ 106959243Sobrien#if defined(POSIX) || defined(TERMIO) 107059243Sobrien return (td->d_t.c_cflag & CSIZE) == CS8; 107159243Sobrien#else /* SGTTY */ 107259243Sobrien return td->d_lb & (LPASS8 | LLITOUT); 107359243Sobrien#endif /* POSIX || TERMIO */ 107459243Sobrien} /* end tty_geteightbit */ 107559243Sobrien 107659243Sobrienint 107759243Sobrientty_cooked_mode(td) 107859243Sobrien ttydata_t *td; 107959243Sobrien{ 108059243Sobrien#if defined(POSIX) || defined(TERMIO) 108159243Sobrien return (td->d_t.c_lflag & ICANON); 108259243Sobrien#else /* SGTTY */ 108359243Sobrien return !(td->d_t.sg_flags & (RAW | CBREAK)); 108459243Sobrien#endif /* POSIX || TERMIO */ 108559243Sobrien} /* end tty_cooked_mode */ 108659243Sobrien 108759243Sobrien#ifdef _IBMR2 108859243Sobrienvoid 108959243Sobrientty_setdisc(fd, dis) 109059243Sobrien int fd; 109159243Sobrien int dis; 109259243Sobrien{ 109359243Sobrien static bool edit_discipline = 0; 109459243Sobrien static union txname tx_disc; 109559243Sobrien extern char strPOSIX[]; 109659243Sobrien 109759243Sobrien switch (dis) { 109859243Sobrien case EX_IO: 109959243Sobrien if (edit_discipline) { 110059243Sobrien if (ioctl(fd, TXSETLD, (ioctl_t) & tx_disc) == -1) 110159243Sobrien return; 110259243Sobrien edit_discipline = 0; 110359243Sobrien } 110459243Sobrien return; 110559243Sobrien 110659243Sobrien case ED_IO: 110759243Sobrien tx_disc.tx_which = 0; 110859243Sobrien if (ioctl(fd, TXGETLD, (ioctl_t) & tx_disc) == -1) 110959243Sobrien return; 111059243Sobrien if (strcmp(tx_disc.tx_name, strPOSIX) != 0) { 111159243Sobrien edit_discipline = 1; 111259243Sobrien if (ioctl(fd, TXSETLD, (ioctl_t) strPOSIX) == -1) 111359243Sobrien return; 111459243Sobrien } 111559243Sobrien return; 111659243Sobrien 111759243Sobrien default: 111859243Sobrien return; 111959243Sobrien } 112059243Sobrien} /* end tty_setdisc */ 112159243Sobrien#endif /* _IBMR2 */ 112259243Sobrien 112359243Sobrien#ifdef DEBUG_TTY 112459243Sobrienstatic void 112559243Sobrientty_printchar(s) 112659243Sobrien unsigned char *s; 112759243Sobrien{ 112859243Sobrien struct tcshmodes *m; 112959243Sobrien int i; 113059243Sobrien 113159243Sobrien for (i = 0; i < C_NCC; i++) { 113259243Sobrien for (m = modelist; m->m_name; m++) 113359243Sobrien if (m->m_type == M_CHAR && C_SH(i) == m->m_value) 113459243Sobrien break; 113559243Sobrien if (m->m_name) 113659243Sobrien xprintf("%s ^%c ", m->m_name, s[i] + 'A' - 1); 113759243Sobrien if (i % 5 == 0) 113859243Sobrien xputchar('\n'); 113959243Sobrien } 114059243Sobrien xputchar('\n'); 114159243Sobrien} 114259243Sobrien#endif /* DEBUG_TTY */ 114369408Sache#else /* WINNT_NATIVE */ 114459243Sobrienint 114559243Sobrientty_cooked_mode(td) 114659243Sobrien void *td; 114759243Sobrien{ 114859243Sobrien return do_nt_check_cooked_mode(); 114959243Sobrien} 115069408Sache#endif /* !WINNT_NATIVE */ 1151