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