1232633Smp/* $Header: /p/tcsh/cvsroot/tcsh/ed.term.c,v 1.38 2011/02/25 23:58:34 christos Exp $ */ 259243Sobrien/* 359243Sobrien * ed.term.c: Low level terminal interface 459243Sobrien */ 559243Sobrien/*- 659243Sobrien * Copyright (c) 1980, 1991 The Regents of the University of California. 759243Sobrien * All rights reserved. 859243Sobrien * 959243Sobrien * Redistribution and use in source and binary forms, with or without 1059243Sobrien * modification, are permitted provided that the following conditions 1159243Sobrien * are met: 1259243Sobrien * 1. Redistributions of source code must retain the above copyright 1359243Sobrien * notice, this list of conditions and the following disclaimer. 1459243Sobrien * 2. Redistributions in binary form must reproduce the above copyright 1559243Sobrien * notice, this list of conditions and the following disclaimer in the 1659243Sobrien * documentation and/or other materials provided with the distribution. 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 36232633SmpRCSID("$tcsh: ed.term.c,v 1.38 2011/02/25 23:58:34 christos Exp $") 37232633Smp#include <assert.h> 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 87167465Smpstatic const 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 */ 571167465Smp#define RETRY(x) \ 572167465Smpdo { \ 573167465Smp int count; \ 574167465Smp \ 575167465Smp for (count = 0;; count++) \ 576167465Smp if ((x) == -1) { \ 577167465Smp if (OKERROR(errno) || KLUDGE) \ 578167465Smp continue; \ 579167465Smp else \ 580167465Smp return -1; \ 581167465Smp } \ 582167465Smp else \ 583167465Smp break; \ 584167465Smp} while (0) 58559243Sobrien 58659243Sobrien/*ARGSUSED*/ 58759243Sobrienvoid 588167465Smpdosetty(Char **v, struct command *t) 58959243Sobrien{ 590167465Smp const struct tcshmodes *m; 591167465Smp char x, *d, *cmdname; 59259243Sobrien int aflag = 0; 59359243Sobrien Char *s; 59459243Sobrien int z = EX_IO; 59559243Sobrien 59659243Sobrien USE(t); 597167465Smp cmdname = strsave(short2str(*v++)); 598167465Smp cleanup_push(cmdname, xfree); 599167465Smp setname(cmdname); 60059243Sobrien 60159243Sobrien while (v && *v && v[0][0] == '-' && v[0][2] == '\0') 60259243Sobrien switch (v[0][1]) { 60359243Sobrien case 'a': 60459243Sobrien aflag++; 60559243Sobrien v++; 60659243Sobrien break; 60759243Sobrien case 'd': 60859243Sobrien v++; 60959243Sobrien z = ED_IO; 61059243Sobrien break; 61159243Sobrien case 'x': 61259243Sobrien v++; 61359243Sobrien z = EX_IO; 61459243Sobrien break; 61559243Sobrien case 'q': 61659243Sobrien v++; 61759243Sobrien z = QU_IO; 61859243Sobrien break; 61959243Sobrien default: 620167465Smp stderror(ERR_NAME | ERR_SYSTEM, short2str(v[0]), 62159243Sobrien CGETS(8, 1, "Unknown switch")); 62259243Sobrien break; 62359243Sobrien } 62459243Sobrien 62559243Sobrien didsetty = 1; 62659243Sobrien if (!v || !*v) { 62759243Sobrien int i = -1; 62859243Sobrien int len = 0, st = 0, cu; 62959243Sobrien for (m = modelist; m->m_name; m++) { 63059243Sobrien if (m->m_type != i) { 631167465Smp xprintf("%s%s", i != -1 ? "\n" : "", 63259243Sobrien ttylist[z][m->m_type].t_name); 63359243Sobrien i = m->m_type; 63459243Sobrien st = len = strlen(ttylist[z][m->m_type].t_name); 63559243Sobrien } 636232633Smp assert(i != -1); 63759243Sobrien 63859243Sobrien x = (ttylist[z][i].t_setmask & m->m_value) ? '+' : '\0'; 63959243Sobrien x = (ttylist[z][i].t_clrmask & m->m_value) ? '-' : x; 64059243Sobrien 64159243Sobrien if (x != '\0' || aflag) { 64259243Sobrien cu = strlen(m->m_name) + (x != '\0') + 1; 643167465Smp if (len + cu >= TermH) { 64459243Sobrien xprintf("\n%*s", st, ""); 64559243Sobrien len = st + cu; 64659243Sobrien } 64759243Sobrien else 64859243Sobrien len += cu; 64959243Sobrien if (x != '\0') 65059243Sobrien xprintf("%c%s ", x, m->m_name); 65159243Sobrien else 65259243Sobrien xprintf("%s ", m->m_name); 65359243Sobrien } 65459243Sobrien } 65559243Sobrien xputchar('\n'); 656167465Smp cleanup_until(cmdname); 65759243Sobrien return; 65859243Sobrien } 65959243Sobrien while (v && (s = *v++)) { 66059243Sobrien switch (*s) { 66159243Sobrien case '+': 66259243Sobrien case '-': 66359243Sobrien x = *s++; 66459243Sobrien break; 66559243Sobrien default: 66659243Sobrien x = '\0'; 66759243Sobrien break; 66859243Sobrien } 66959243Sobrien d = short2str(s); 67059243Sobrien for (m = modelist; m->m_name; m++) 67159243Sobrien if (strcmp(m->m_name, d) == 0) 67259243Sobrien break; 67359243Sobrien if (!m->m_name) 67459243Sobrien stderror(ERR_NAME | ERR_SYSTEM, d, CGETS(8, 2, "Invalid argument")); 67559243Sobrien 67659243Sobrien switch (x) { 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 case '-': 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 default: 68659243Sobrien ttylist[z][m->m_type].t_setmask &= ~m->m_value; 68759243Sobrien ttylist[z][m->m_type].t_clrmask &= ~m->m_value; 68859243Sobrien break; 68959243Sobrien } 69059243Sobrien } 691167465Smp cleanup_until(cmdname); 69259243Sobrien} /* end dosetty */ 69359243Sobrien 69459243Sobrienint 695167465Smptty_getty(int fd, ttydata_t *td) 69659243Sobrien{ 69759243Sobrien#ifdef POSIX 69859243Sobrien RETRY(tcgetattr(fd, &td->d_t)); 69959243Sobrien#else /* TERMIO || GSTTY */ 70059243Sobrien# ifdef TERMIO 70159243Sobrien RETRY(ioctl(fd, TCGETA, (ioctl_t) &td->d_t)); 70259243Sobrien# else /* GSTTY */ 70359243Sobrien# ifdef TIOCGETP 70459243Sobrien RETRY(ioctl(fd, TIOCGETP, (ioctl_t) &td->d_t)); 70559243Sobrien# endif /* TIOCGETP */ 70659243Sobrien# ifdef TIOCGETC 70759243Sobrien RETRY(ioctl(fd, TIOCGETC, (ioctl_t) &td->d_tc)); 70859243Sobrien# endif /* TIOCGETC */ 70959243Sobrien# ifdef TIOCGPAGE 71059243Sobrien RETRY(ioctl(fd, TIOCGPAGE, (ioctl_t) &td->d_pc)); 71159243Sobrien# endif /* TIOCGPAGE */ 71259243Sobrien# ifdef TIOCLGET 71359243Sobrien RETRY(ioctl(fd, TIOCLGET, (ioctl_t) &td->d_lb)); 71459243Sobrien# endif /* TIOCLGET */ 71559243Sobrien# endif /* TERMIO */ 71659243Sobrien#endif /* POSIX */ 71759243Sobrien 71859243Sobrien#ifdef TIOCGLTC 71959243Sobrien RETRY(ioctl(fd, TIOCGLTC, (ioctl_t) &td->d_ltc)); 72059243Sobrien#endif /* TIOCGLTC */ 72159243Sobrien 72259243Sobrien return 0; 72359243Sobrien} 72459243Sobrien 72559243Sobrienint 726167465Smptty_setty(int fd, ttydata_t *td) 72759243Sobrien{ 72859243Sobrien#ifdef POSIX 729167465Smp RETRY(xtcsetattr(fd, TCSADRAIN, &td->d_t)); 73059243Sobrien#else 73159243Sobrien# ifdef TERMIO 73259243Sobrien RETRY(ioctl(fd, TCSETAW, (ioctl_t) &td->d_t)); 73359243Sobrien# else 73459243Sobrien# ifdef TIOCSETN 73559243Sobrien RETRY(ioctl(fd, TIOCSETN, (ioctl_t) &td->d_t)); 73659243Sobrien# endif /* TIOCSETN */ 73759243Sobrien# ifdef TIOCGETC 73859243Sobrien RETRY(ioctl(fd, TIOCSETC, (ioctl_t) &td->d_tc)); 73959243Sobrien# endif /* TIOCGETC */ 74059243Sobrien# ifdef TIOCGPAGE 74159243Sobrien RETRY(ioctl(fd, TIOCSPAGE, (ioctl_t) &td->d_pc)); 74259243Sobrien# endif /* TIOCGPAGE */ 74359243Sobrien# ifdef TIOCLGET 74459243Sobrien RETRY(ioctl(fd, TIOCLSET, (ioctl_t) &td->d_lb)); 74559243Sobrien# endif /* TIOCLGET */ 74659243Sobrien# endif /* TERMIO */ 74759243Sobrien#endif /* POSIX */ 74859243Sobrien 74959243Sobrien#ifdef TIOCGLTC 75059243Sobrien RETRY(ioctl(fd, TIOCSLTC, (ioctl_t) &td->d_ltc)); 75159243Sobrien#endif /* TIOCGLTC */ 75259243Sobrien 75359243Sobrien return 0; 75459243Sobrien} 75559243Sobrien 75659243Sobrienvoid 757167465Smptty_getchar(ttydata_t *td, unsigned char *s) 75859243Sobrien{ 75959243Sobrien#ifdef TIOCGLTC 76059243Sobrien { 76159243Sobrien struct ltchars *n = &td->d_ltc; 76259243Sobrien 76359243Sobrien s[C_SUSP] = n->t_suspc; 76459243Sobrien s[C_DSUSP] = n->t_dsuspc; 76559243Sobrien s[C_REPRINT] = n->t_rprntc; 76659243Sobrien s[C_DISCARD] = n->t_flushc; 76759243Sobrien s[C_WERASE] = n->t_werasc; 76859243Sobrien s[C_LNEXT] = n->t_lnextc; 76959243Sobrien } 77059243Sobrien#endif /* TIOCGLTC */ 77159243Sobrien 77259243Sobrien#if defined(POSIX) || defined(TERMIO) 77359243Sobrien { 77459243Sobrien# ifdef POSIX 77559243Sobrien struct termios *n = &td->d_t; 77659243Sobrien# else 77759243Sobrien struct termio *n = &td->d_t; 77859243Sobrien# endif /* POSIX */ 77959243Sobrien 78059243Sobrien# ifdef VINTR 78159243Sobrien s[C_INTR] = n->c_cc[VINTR]; 78259243Sobrien# endif /* VINTR */ 78359243Sobrien# ifdef VQUIT 78459243Sobrien s[C_QUIT] = n->c_cc[VQUIT]; 78559243Sobrien# endif /* VQUIT */ 78659243Sobrien# ifdef VERASE 78759243Sobrien s[C_ERASE] = n->c_cc[VERASE]; 78859243Sobrien# endif /* VERASE */ 78959243Sobrien# ifdef VKILL 79059243Sobrien s[C_KILL] = n->c_cc[VKILL]; 79159243Sobrien# endif /* VKILL */ 79259243Sobrien# ifdef VEOF 79359243Sobrien s[C_EOF] = n->c_cc[VEOF]; 79459243Sobrien# endif /* VEOF */ 79559243Sobrien# ifdef VEOL 79659243Sobrien s[C_EOL] = n->c_cc[VEOL]; 79759243Sobrien# endif /* VEOL */ 79859243Sobrien# ifdef VEOL2 79959243Sobrien s[C_EOL2] = n->c_cc[VEOL2]; 80059243Sobrien# endif /* VEOL2 */ 80159243Sobrien# ifdef VSWTCH 80259243Sobrien s[C_SWTCH] = n->c_cc[VSWTCH]; 80359243Sobrien# endif /* VSWTCH */ 80459243Sobrien# ifdef VDSWTCH 80559243Sobrien s[C_DSWTCH] = n->c_cc[VDSWTCH]; 80659243Sobrien# endif /* VDSWTCH */ 80759243Sobrien# ifdef VERASE2 80859243Sobrien s[C_ERASE2] = n->c_cc[VERASE2]; 80959243Sobrien# endif /* VERASE2 */ 81059243Sobrien# ifdef VSTART 81159243Sobrien s[C_START] = n->c_cc[VSTART]; 81259243Sobrien# endif /* VSTART */ 81359243Sobrien# ifdef VSTOP 81459243Sobrien s[C_STOP] = n->c_cc[VSTOP]; 81559243Sobrien# endif /* VSTOP */ 81659243Sobrien# ifdef VWERASE 81759243Sobrien s[C_WERASE] = n->c_cc[VWERASE]; 81859243Sobrien# endif /* VWERASE */ 81959243Sobrien# ifdef VSUSP 82059243Sobrien s[C_SUSP] = n->c_cc[VSUSP]; 82159243Sobrien# endif /* VSUSP */ 82259243Sobrien# ifdef VDSUSP 82359243Sobrien s[C_DSUSP] = n->c_cc[VDSUSP]; 82459243Sobrien# endif /* VDSUSP */ 82559243Sobrien# ifdef VREPRINT 82659243Sobrien s[C_REPRINT] = n->c_cc[VREPRINT]; 82759243Sobrien# endif /* WREPRINT */ 82859243Sobrien# ifdef VDISCARD 82959243Sobrien s[C_DISCARD] = n->c_cc[VDISCARD]; 83059243Sobrien# endif /* VDISCARD */ 83159243Sobrien# ifdef VLNEXT 83259243Sobrien s[C_LNEXT] = n->c_cc[VLNEXT]; 83359243Sobrien# endif /* VLNEXT */ 83459243Sobrien# ifdef VSTATUS 83559243Sobrien s[C_STATUS] = n->c_cc[VSTATUS]; 83659243Sobrien# endif /* VSTATUS */ 83759243Sobrien# ifdef VPAGE 83859243Sobrien s[C_PAGE] = n->c_cc[VPAGE]; 83959243Sobrien# endif /* VPAGE */ 84059243Sobrien# ifdef VPGOFF 84159243Sobrien s[C_PGOFF] = n->c_cc[VPGOFF]; 84259243Sobrien# endif /* VPGOFF */ 84359243Sobrien# ifdef VKILL2 84459243Sobrien s[C_KILL2] = n->c_cc[VKILL2]; 84559243Sobrien# endif /* KILL2 */ 84659243Sobrien# ifdef VMIN 84759243Sobrien s[C_MIN] = n->c_cc[VMIN]; 84859243Sobrien# endif /* VMIN */ 84959243Sobrien# ifdef VTIME 85059243Sobrien s[C_TIME] = n->c_cc[VTIME]; 85159243Sobrien# endif /* VTIME */ 85259243Sobrien } 85359243Sobrien 85459243Sobrien#else /* SGTTY */ 85559243Sobrien 85659243Sobrien# ifdef TIOCGPAGE 85759243Sobrien { 85859243Sobrien struct ttypagestat *n = &td->d_pc; 85959243Sobrien 86059243Sobrien s[C_STATUS] = n->tps_statc; 86159243Sobrien s[C_PAGE] = n->tps_pagec; 86259243Sobrien s[C_PGOFF] = n->tps_pgoffc; 86359243Sobrien } 86459243Sobrien# endif /* TIOCGPAGE */ 86559243Sobrien 86659243Sobrien# ifdef TIOCGETC 86759243Sobrien { 86859243Sobrien struct tchars *n = &td->d_tc; 86959243Sobrien 87059243Sobrien s[C_INTR] = n->t_intrc; 87159243Sobrien s[C_QUIT] = n->t_quitc; 87259243Sobrien s[C_START] = n->t_startc; 87359243Sobrien s[C_STOP] = n->t_stopc; 87459243Sobrien s[C_EOF] = n->t_eofc; 87559243Sobrien s[C_BRK] = n->t_brkc; 87659243Sobrien } 87759243Sobrien# endif /* TIOCGETC */ 87859243Sobrien 87959243Sobrien# ifdef TIOCGETP 88059243Sobrien { 88159243Sobrien struct sgttyb *n = &td->d_t; 88259243Sobrien 88359243Sobrien s[C_ERASE] = n->sg_erase; 88459243Sobrien s[C_KILL] = n->sg_kill; 88559243Sobrien } 88659243Sobrien# endif /* TIOCGETP */ 88759243Sobrien#endif /* !POSIX || TERMIO */ 88859243Sobrien 88959243Sobrien} /* tty_getchar */ 89059243Sobrien 89159243Sobrien 89259243Sobrienvoid 893167465Smptty_setchar(ttydata_t *td, unsigned char *s) 89459243Sobrien{ 89559243Sobrien#ifdef TIOCGLTC 89659243Sobrien { 89759243Sobrien struct ltchars *n = &td->d_ltc; 89859243Sobrien 89959243Sobrien n->t_suspc = s[C_SUSP]; 90059243Sobrien n->t_dsuspc = s[C_DSUSP]; 90159243Sobrien n->t_rprntc = s[C_REPRINT]; 90259243Sobrien n->t_flushc = s[C_DISCARD]; 90359243Sobrien n->t_werasc = s[C_WERASE]; 90459243Sobrien n->t_lnextc = s[C_LNEXT]; 90559243Sobrien } 90659243Sobrien#endif /* TIOCGLTC */ 90759243Sobrien 90859243Sobrien#if defined(POSIX) || defined(TERMIO) 90959243Sobrien { 91059243Sobrien# ifdef POSIX 91159243Sobrien struct termios *n = &td->d_t; 91259243Sobrien# else 91359243Sobrien struct termio *n = &td->d_t; 91459243Sobrien# endif /* POSIX */ 91559243Sobrien 91659243Sobrien# ifdef VINTR 91759243Sobrien n->c_cc[VINTR] = s[C_INTR]; 91859243Sobrien# endif /* VINTR */ 91959243Sobrien# ifdef VQUIT 92059243Sobrien n->c_cc[VQUIT] = s[C_QUIT]; 92159243Sobrien# endif /* VQUIT */ 92259243Sobrien# ifdef VERASE 92359243Sobrien n->c_cc[VERASE] = s[C_ERASE]; 92459243Sobrien# endif /* VERASE */ 92559243Sobrien# ifdef VKILL 92659243Sobrien n->c_cc[VKILL] = s[C_KILL]; 92759243Sobrien# endif /* VKILL */ 92859243Sobrien# ifdef VEOF 92959243Sobrien n->c_cc[VEOF] = s[C_EOF]; 93059243Sobrien# endif /* VEOF */ 93159243Sobrien# ifdef VEOL 93259243Sobrien n->c_cc[VEOL] = s[C_EOL]; 93359243Sobrien# endif /* VEOL */ 93459243Sobrien# ifdef VEOL2 93559243Sobrien n->c_cc[VEOL2] = s[C_EOL2]; 93659243Sobrien# endif /* VEOL2 */ 93759243Sobrien# ifdef VSWTCH 93859243Sobrien n->c_cc[VSWTCH] = s[C_SWTCH]; 93959243Sobrien# endif /* VSWTCH */ 94059243Sobrien# ifdef VDSWTCH 94159243Sobrien n->c_cc[VDSWTCH] = s[C_DSWTCH]; 94259243Sobrien# endif /* VDSWTCH */ 94359243Sobrien# ifdef VERASE2 94459243Sobrien n->c_cc[VERASE2] = s[C_ERASE2]; 94559243Sobrien# endif /* VERASE2 */ 94659243Sobrien# ifdef VSTART 94759243Sobrien n->c_cc[VSTART] = s[C_START]; 94859243Sobrien# endif /* VSTART */ 94959243Sobrien# ifdef VSTOP 95059243Sobrien n->c_cc[VSTOP] = s[C_STOP]; 95159243Sobrien# endif /* VSTOP */ 95259243Sobrien# ifdef VWERASE 95359243Sobrien n->c_cc[VWERASE] = s[C_WERASE]; 95459243Sobrien# endif /* VWERASE */ 95559243Sobrien# ifdef VSUSP 95659243Sobrien n->c_cc[VSUSP] = s[C_SUSP]; 95759243Sobrien# endif /* VSUSP */ 95859243Sobrien# ifdef VDSUSP 95959243Sobrien n->c_cc[VDSUSP] = s[C_DSUSP]; 96059243Sobrien# endif /* VDSUSP */ 96159243Sobrien# ifdef VREPRINT 96259243Sobrien n->c_cc[VREPRINT] = s[C_REPRINT]; 96359243Sobrien# endif /* WREPRINT */ 96459243Sobrien# ifdef VDISCARD 96559243Sobrien n->c_cc[VDISCARD] = s[C_DISCARD]; 96659243Sobrien# endif /* VDISCARD */ 96759243Sobrien# ifdef VLNEXT 96859243Sobrien n->c_cc[VLNEXT] = s[C_LNEXT]; 96959243Sobrien# endif /* VLNEXT */ 97059243Sobrien# ifdef VSTATUS 97159243Sobrien n->c_cc[VSTATUS] = s[C_STATUS]; 97259243Sobrien# endif /* VSTATUS */ 97359243Sobrien# ifdef VPAGE 97459243Sobrien n->c_cc[VPAGE] = s[C_PAGE]; 97559243Sobrien# endif /* VPAGE */ 97659243Sobrien# ifdef VPGOFF 97759243Sobrien n->c_cc[VPGOFF] = s[C_PGOFF]; 97859243Sobrien# endif /* VPGOFF */ 97959243Sobrien# ifdef VKILL2 98059243Sobrien n->c_cc[VKILL2] = s[C_KILL2]; 98159243Sobrien# endif /* VKILL2 */ 98259243Sobrien# ifdef VMIN 98359243Sobrien n->c_cc[VMIN] = s[C_MIN]; 98459243Sobrien# endif /* VMIN */ 98559243Sobrien# ifdef VTIME 98659243Sobrien n->c_cc[VTIME] = s[C_TIME]; 98759243Sobrien# endif /* VTIME */ 98859243Sobrien } 98959243Sobrien 99059243Sobrien#else /* GSTTY */ 99159243Sobrien 99259243Sobrien# ifdef TIOCGPAGE 99359243Sobrien { 99459243Sobrien struct ttypagestat *n = &td->d_pc; 99559243Sobrien 99659243Sobrien n->tps_length = 0; 99759243Sobrien n->tps_lpos = 0; 99859243Sobrien n->tps_statc = s[C_STATUS]; 99959243Sobrien n->tps_pagec = s[C_PAGE]; 100059243Sobrien n->tps_pgoffc = s[C_PGOFF]; 100159243Sobrien n->tps_flag = 0; 100259243Sobrien } 100359243Sobrien# endif /* TIOCGPAGE */ 100459243Sobrien 100559243Sobrien# ifdef TIOCGETC 100659243Sobrien { 100759243Sobrien struct tchars *n = &td->d_tc; 100859243Sobrien n->t_intrc = s[C_INTR]; 100959243Sobrien n->t_quitc = s[C_QUIT]; 101059243Sobrien n->t_startc = s[C_START]; 101159243Sobrien n->t_stopc = s[C_STOP]; 101259243Sobrien n->t_eofc = s[C_EOF]; 101359243Sobrien n->t_brkc = s[C_BRK]; 101459243Sobrien } 101559243Sobrien# endif /* TIOCGETC */ 101659243Sobrien 101759243Sobrien# ifdef TIOCGETP 101859243Sobrien { 101959243Sobrien struct sgttyb *n = &td->d_t; 102059243Sobrien 102159243Sobrien n->sg_erase = s[C_ERASE]; 102259243Sobrien n->sg_kill = s[C_KILL]; 102359243Sobrien } 102459243Sobrien# endif /* TIOCGETP */ 102559243Sobrien#endif /* !POSIX || TERMIO */ 102659243Sobrien 102759243Sobrien} /* tty_setchar */ 102859243Sobrien 102959243Sobrienspeed_t 1030167465Smptty_getspeed(ttydata_t *td) 103159243Sobrien{ 103259243Sobrien speed_t spd; 103359243Sobrien 103459243Sobrien#ifdef POSIX 103559243Sobrien if ((spd = cfgetispeed(&td->d_t)) == 0) 103659243Sobrien spd = cfgetospeed(&td->d_t); 103759243Sobrien#else /* ! POSIX */ 103859243Sobrien# ifdef TERMIO 103959243Sobrien# ifdef CBAUD 104059243Sobrien spd = td->d_t.c_cflag & CBAUD; 104159243Sobrien# else 104259243Sobrien spd = 0; 104359243Sobrien# endif 104459243Sobrien# else /* SGTTY */ 104559243Sobrien spd = td->d_t.sg_ispeed; 104659243Sobrien# endif /* TERMIO */ 104759243Sobrien#endif /* POSIX */ 104859243Sobrien 104959243Sobrien return spd; 105059243Sobrien} /* end tty_getspeed */ 105159243Sobrien 105259243Sobrienint 1053167465Smptty_gettabs(ttydata_t *td) 105459243Sobrien{ 105559243Sobrien#if defined(POSIX) || defined(TERMIO) 105659243Sobrien return ((td->d_t.c_oflag & TAB3) == TAB3) ? 0 : 1; 105759243Sobrien#else /* SGTTY */ 105859243Sobrien return (td->d_t.sg_flags & XTABS) == XTABS ? 0 : 1; 105959243Sobrien#endif /* POSIX || TERMIO */ 106059243Sobrien} /* end tty_gettabs */ 106159243Sobrien 106259243Sobrienint 1063167465Smptty_geteightbit(ttydata_t *td) 106459243Sobrien{ 106559243Sobrien#if defined(POSIX) || defined(TERMIO) 106659243Sobrien return (td->d_t.c_cflag & CSIZE) == CS8; 106759243Sobrien#else /* SGTTY */ 106859243Sobrien return td->d_lb & (LPASS8 | LLITOUT); 106959243Sobrien#endif /* POSIX || TERMIO */ 107059243Sobrien} /* end tty_geteightbit */ 107159243Sobrien 107259243Sobrienint 1073167465Smptty_cooked_mode(ttydata_t *td) 107459243Sobrien{ 107559243Sobrien#if defined(POSIX) || defined(TERMIO) 107659243Sobrien return (td->d_t.c_lflag & ICANON); 107759243Sobrien#else /* SGTTY */ 107859243Sobrien return !(td->d_t.sg_flags & (RAW | CBREAK)); 107959243Sobrien#endif /* POSIX || TERMIO */ 108059243Sobrien} /* end tty_cooked_mode */ 108159243Sobrien 108259243Sobrien#ifdef _IBMR2 108359243Sobrienvoid 1084167465Smptty_setdisc(int fd, int dis) 108559243Sobrien{ 1086145479Smp static int edit_discipline = 0; 108759243Sobrien static union txname tx_disc; 108859243Sobrien extern char strPOSIX[]; 108959243Sobrien 109059243Sobrien switch (dis) { 109159243Sobrien case EX_IO: 109259243Sobrien if (edit_discipline) { 109359243Sobrien if (ioctl(fd, TXSETLD, (ioctl_t) & tx_disc) == -1) 109459243Sobrien return; 109559243Sobrien edit_discipline = 0; 109659243Sobrien } 109759243Sobrien return; 109859243Sobrien 109959243Sobrien case ED_IO: 110059243Sobrien tx_disc.tx_which = 0; 110159243Sobrien if (ioctl(fd, TXGETLD, (ioctl_t) & tx_disc) == -1) 110259243Sobrien return; 110359243Sobrien if (strcmp(tx_disc.tx_name, strPOSIX) != 0) { 110459243Sobrien edit_discipline = 1; 110559243Sobrien if (ioctl(fd, TXSETLD, (ioctl_t) strPOSIX) == -1) 110659243Sobrien return; 110759243Sobrien } 110859243Sobrien return; 110959243Sobrien 111059243Sobrien default: 111159243Sobrien return; 111259243Sobrien } 111359243Sobrien} /* end tty_setdisc */ 111459243Sobrien#endif /* _IBMR2 */ 111559243Sobrien 111659243Sobrien#ifdef DEBUG_TTY 111759243Sobrienstatic void 1118167465Smptty_printchar(unsigned char *s) 111959243Sobrien{ 112059243Sobrien struct tcshmodes *m; 112159243Sobrien int i; 112259243Sobrien 112359243Sobrien for (i = 0; i < C_NCC; i++) { 112459243Sobrien for (m = modelist; m->m_name; m++) 112559243Sobrien if (m->m_type == M_CHAR && C_SH(i) == m->m_value) 112659243Sobrien break; 112759243Sobrien if (m->m_name) 112859243Sobrien xprintf("%s ^%c ", m->m_name, s[i] + 'A' - 1); 112959243Sobrien if (i % 5 == 0) 113059243Sobrien xputchar('\n'); 113159243Sobrien } 113259243Sobrien xputchar('\n'); 113359243Sobrien} 113459243Sobrien#endif /* DEBUG_TTY */ 113569408Sache#else /* WINNT_NATIVE */ 113659243Sobrienint 1137167465Smptty_cooked_mode(void *td) 113859243Sobrien{ 113959243Sobrien return do_nt_check_cooked_mode(); 114059243Sobrien} 114169408Sache#endif /* !WINNT_NATIVE */ 1142