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