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