123338178SMark Peek /* $Header: /src/pub/tcsh/tc.disc.c,v 3.15 2004/11/23 02:10:49 christos Exp $ */ 2c80476e4SDavid E. O'Brien /* 3c80476e4SDavid E. O'Brien * tc.disc.c: Functions to set/clear line disciplines 4c80476e4SDavid E. O'Brien * 5c80476e4SDavid E. O'Brien */ 6c80476e4SDavid E. O'Brien /*- 7c80476e4SDavid E. O'Brien * Copyright (c) 1980, 1991 The Regents of the University of California. 8c80476e4SDavid E. O'Brien * All rights reserved. 9c80476e4SDavid E. O'Brien * 10c80476e4SDavid E. O'Brien * Redistribution and use in source and binary forms, with or without 11c80476e4SDavid E. O'Brien * modification, are permitted provided that the following conditions 12c80476e4SDavid E. O'Brien * are met: 13c80476e4SDavid E. O'Brien * 1. Redistributions of source code must retain the above copyright 14c80476e4SDavid E. O'Brien * notice, this list of conditions and the following disclaimer. 15c80476e4SDavid E. O'Brien * 2. Redistributions in binary form must reproduce the above copyright 16c80476e4SDavid E. O'Brien * notice, this list of conditions and the following disclaimer in the 17c80476e4SDavid E. O'Brien * documentation and/or other materials provided with the distribution. 1829301572SMark Peek * 3. Neither the name of the University nor the names of its contributors 19c80476e4SDavid E. O'Brien * may be used to endorse or promote products derived from this software 20c80476e4SDavid E. O'Brien * without specific prior written permission. 21c80476e4SDavid E. O'Brien * 22c80476e4SDavid E. O'Brien * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23c80476e4SDavid E. O'Brien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24c80476e4SDavid E. O'Brien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25c80476e4SDavid E. O'Brien * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26c80476e4SDavid E. O'Brien * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27c80476e4SDavid E. O'Brien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28c80476e4SDavid E. O'Brien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29c80476e4SDavid E. O'Brien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30c80476e4SDavid E. O'Brien * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31c80476e4SDavid E. O'Brien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32c80476e4SDavid E. O'Brien * SUCH DAMAGE. 33c80476e4SDavid E. O'Brien */ 34c80476e4SDavid E. O'Brien #include "sh.h" 35c80476e4SDavid E. O'Brien 3623338178SMark Peek RCSID("$Id: tc.disc.c,v 3.15 2004/11/23 02:10:49 christos Exp $") 37c80476e4SDavid E. O'Brien 38c80476e4SDavid E. O'Brien #ifdef OREO 39c80476e4SDavid E. O'Brien #include <compat.h> 40c80476e4SDavid E. O'Brien #endif /* OREO */ 41c80476e4SDavid E. O'Brien 4229301572SMark Peek #include "ed.h" 43c80476e4SDavid E. O'Brien 4423338178SMark Peek static int add_discipline = 0; /* Did we add a line discipline */ 45c80476e4SDavid E. O'Brien 46c80476e4SDavid E. O'Brien #if defined(IRIS4D) || defined(OREO) || defined(sonyrisc) 47c80476e4SDavid E. O'Brien # define HAVE_DISC 48c80476e4SDavid E. O'Brien # ifndef POSIX 49c80476e4SDavid E. O'Brien static struct termio otermiob; 50c80476e4SDavid E. O'Brien # else 51c80476e4SDavid E. O'Brien static struct termios otermiob; 52c80476e4SDavid E. O'Brien # endif /* POSIX */ 53c80476e4SDavid E. O'Brien #endif /* IRIS4D || OREO */ 54c80476e4SDavid E. O'Brien 55c80476e4SDavid E. O'Brien #ifdef _IBMR2 56c80476e4SDavid E. O'Brien # define HAVE_DISC 57c80476e4SDavid E. O'Brien char strPOSIX[] = "posix"; 58c80476e4SDavid E. O'Brien #endif /* _IBMR2 */ 59c80476e4SDavid E. O'Brien 60c80476e4SDavid E. O'Brien #if !defined(HAVE_DISC) && defined(TIOCGETD) && defined(NTTYDISC) 61c80476e4SDavid E. O'Brien static int oldisc; 62c80476e4SDavid E. O'Brien #endif /* !HAVE_DISC && TIOCGETD && NTTYDISC */ 63c80476e4SDavid E. O'Brien 64c80476e4SDavid E. O'Brien int 65c80476e4SDavid E. O'Brien /*ARGSUSED*/ 66c80476e4SDavid E. O'Brien setdisc(f) 67c80476e4SDavid E. O'Brien int f; 68c80476e4SDavid E. O'Brien { 69c80476e4SDavid E. O'Brien #ifdef IRIS4D 70c80476e4SDavid E. O'Brien # ifndef POSIX 71c80476e4SDavid E. O'Brien struct termio termiob; 72c80476e4SDavid E. O'Brien # else 73c80476e4SDavid E. O'Brien struct termios termiob; 74c80476e4SDavid E. O'Brien # endif 75c80476e4SDavid E. O'Brien 76c80476e4SDavid E. O'Brien if (ioctl(f, TCGETA, (ioctl_t) & termiob) == 0) { 77c80476e4SDavid E. O'Brien otermiob = termiob; 78c80476e4SDavid E. O'Brien #if (SYSVREL < 4) || !defined(IRIS4D) 79c80476e4SDavid E. O'Brien if (termiob.c_line != NTTYDISC || termiob.c_cc[VSWTCH] == 0) { /*}*/ 80c80476e4SDavid E. O'Brien termiob.c_line = NTTYDISC; 81c80476e4SDavid E. O'Brien #else 82c80476e4SDavid E. O'Brien if (termiob.c_cc[VSWTCH] == 0) { 83c80476e4SDavid E. O'Brien #endif 84c80476e4SDavid E. O'Brien termiob.c_cc[VSWTCH] = CSWTCH; 85c80476e4SDavid E. O'Brien if (ioctl(f, TCSETA, (ioctl_t) & termiob) != 0) 86c80476e4SDavid E. O'Brien return (-1); 87c80476e4SDavid E. O'Brien } 88c80476e4SDavid E. O'Brien } 89c80476e4SDavid E. O'Brien else 90c80476e4SDavid E. O'Brien return (-1); 91c80476e4SDavid E. O'Brien add_discipline = 1; 92c80476e4SDavid E. O'Brien return (0); 93c80476e4SDavid E. O'Brien #endif /* IRIS4D */ 94c80476e4SDavid E. O'Brien 95c80476e4SDavid E. O'Brien 96c80476e4SDavid E. O'Brien #ifdef OREO 97c80476e4SDavid E. O'Brien # ifndef POSIX 98c80476e4SDavid E. O'Brien struct termio termiob; 99c80476e4SDavid E. O'Brien # else 100c80476e4SDavid E. O'Brien struct termios termiob; 101c80476e4SDavid E. O'Brien # endif 102c80476e4SDavid E. O'Brien 103c80476e4SDavid E. O'Brien struct ltchars ltcbuf; 104c80476e4SDavid E. O'Brien 105c80476e4SDavid E. O'Brien if (ioctl(f, TCGETA, (ioctl_t) & termiob) == 0) { 106c80476e4SDavid E. O'Brien int comp = getcompat(COMPAT_BSDTTY); 107c80476e4SDavid E. O'Brien otermiob = termiob; 108c80476e4SDavid E. O'Brien if ((comp & COMPAT_BSDTTY) != COMPAT_BSDTTY) { 109c80476e4SDavid E. O'Brien (void) setcompat(comp | COMPAT_BSDTTY); 110c80476e4SDavid E. O'Brien if (ioctl(f, TIOCGLTC, (ioctl_t) & ltcbuf) != 0) 111c80476e4SDavid E. O'Brien xprintf(CGETS(21, 1, "Couldn't get local chars.\n")); 112c80476e4SDavid E. O'Brien else { 113c80476e4SDavid E. O'Brien ltcbuf.t_suspc = CTL_ESC('\032'); /* ^Z */ 114c80476e4SDavid E. O'Brien ltcbuf.t_dsuspc = CTL_ESC('\031'); /* ^Y */ 115c80476e4SDavid E. O'Brien ltcbuf.t_rprntc = CTL_ESC('\022'); /* ^R */ 116c80476e4SDavid E. O'Brien ltcbuf.t_flushc = CTL_ESC('\017'); /* ^O */ 117c80476e4SDavid E. O'Brien ltcbuf.t_werasc = CTL_ESC('\027'); /* ^W */ 118c80476e4SDavid E. O'Brien ltcbuf.t_lnextc = CTL_ESC('\026'); /* ^V */ 119c80476e4SDavid E. O'Brien if (ioctl(f, TIOCSLTC, (ioctl_t) & ltcbuf) != 0) 120c80476e4SDavid E. O'Brien xprintf(CGETS(21, 2, "Couldn't set local chars.\n")); 121c80476e4SDavid E. O'Brien } 122c80476e4SDavid E. O'Brien termiob.c_cc[VSWTCH] = '\0'; 123c80476e4SDavid E. O'Brien if (ioctl(f, TCSETAF, (ioctl_t) & termiob) != 0) 124c80476e4SDavid E. O'Brien return (-1); 125c80476e4SDavid E. O'Brien } 126c80476e4SDavid E. O'Brien } 127c80476e4SDavid E. O'Brien else 128c80476e4SDavid E. O'Brien return (-1); 129c80476e4SDavid E. O'Brien add_discipline = 1; 130c80476e4SDavid E. O'Brien return (0); 131c80476e4SDavid E. O'Brien #endif /* OREO */ 132c80476e4SDavid E. O'Brien 133c80476e4SDavid E. O'Brien 134c80476e4SDavid E. O'Brien #ifdef _IBMR2 135c80476e4SDavid E. O'Brien union txname tx; 136c80476e4SDavid E. O'Brien 137c80476e4SDavid E. O'Brien tx.tx_which = 0; 138c80476e4SDavid E. O'Brien 139c80476e4SDavid E. O'Brien if (ioctl(f, TXGETLD, (ioctl_t) & tx) == 0) { 140c80476e4SDavid E. O'Brien if (strcmp(tx.tx_name, strPOSIX) != 0) 141c80476e4SDavid E. O'Brien if (ioctl(f, TXADDCD, (ioctl_t) strPOSIX) == 0) { 142c80476e4SDavid E. O'Brien add_discipline = 1; 143c80476e4SDavid E. O'Brien return (0); 144c80476e4SDavid E. O'Brien } 145c80476e4SDavid E. O'Brien return (0); 146c80476e4SDavid E. O'Brien } 147c80476e4SDavid E. O'Brien else 148c80476e4SDavid E. O'Brien return (-1); 149c80476e4SDavid E. O'Brien #endif /* _IBMR2 */ 150c80476e4SDavid E. O'Brien 151c80476e4SDavid E. O'Brien #ifndef HAVE_DISC 152c80476e4SDavid E. O'Brien # if defined(TIOCGETD) && defined(NTTYDISC) 153c80476e4SDavid E. O'Brien if (ioctl(f, TIOCGETD, (ioctl_t) & oldisc) == 0) { 154c80476e4SDavid E. O'Brien if (oldisc != NTTYDISC) { 155c80476e4SDavid E. O'Brien int ldisc = NTTYDISC; 156c80476e4SDavid E. O'Brien 157c80476e4SDavid E. O'Brien if (ioctl(f, TIOCSETD, (ioctl_t) & ldisc) != 0) 158c80476e4SDavid E. O'Brien return (-1); 159c80476e4SDavid E. O'Brien add_discipline = 1; 160c80476e4SDavid E. O'Brien } 161c80476e4SDavid E. O'Brien else 162c80476e4SDavid E. O'Brien oldisc = -1; 163c80476e4SDavid E. O'Brien return (0); 164c80476e4SDavid E. O'Brien } 165c80476e4SDavid E. O'Brien else 166c80476e4SDavid E. O'Brien return (-1); 167c80476e4SDavid E. O'Brien # else 16823338178SMark Peek USE(f); 169c80476e4SDavid E. O'Brien return (0); 170c80476e4SDavid E. O'Brien # endif /* TIOCGETD && NTTYDISC */ 171c80476e4SDavid E. O'Brien #endif /* !HAVE_DISC */ 172c80476e4SDavid E. O'Brien } /* end setdisc */ 173c80476e4SDavid E. O'Brien 174c80476e4SDavid E. O'Brien 175c80476e4SDavid E. O'Brien int 176c80476e4SDavid E. O'Brien /*ARGSUSED*/ 177c80476e4SDavid E. O'Brien resetdisc(f) 178c80476e4SDavid E. O'Brien int f; 179c80476e4SDavid E. O'Brien { 180c80476e4SDavid E. O'Brien if (add_discipline) { 181c80476e4SDavid E. O'Brien add_discipline = 0; 182c80476e4SDavid E. O'Brien #if defined(OREO) || defined(IRIS4D) 183c80476e4SDavid E. O'Brien return (ioctl(f, TCSETAF, (ioctl_t) & otermiob)); 184c80476e4SDavid E. O'Brien #endif /* OREO || IRIS4D */ 185c80476e4SDavid E. O'Brien 186c80476e4SDavid E. O'Brien #ifdef _IBMR2 187c80476e4SDavid E. O'Brien return (ioctl(f, TXDELCD, (ioctl_t) strPOSIX)); 188c80476e4SDavid E. O'Brien #endif /* _IBMR2 */ 189c80476e4SDavid E. O'Brien 190c80476e4SDavid E. O'Brien #ifndef HAVE_DISC 191c80476e4SDavid E. O'Brien # if defined(TIOCSETD) && defined(NTTYDISC) 192c80476e4SDavid E. O'Brien return (ioctl(f, TIOCSETD, (ioctl_t) & oldisc)); 193c80476e4SDavid E. O'Brien # endif /* TIOCSETD && NTTYDISC */ 194c80476e4SDavid E. O'Brien #endif /* !HAVE_DISC */ 195c80476e4SDavid E. O'Brien } 19623338178SMark Peek USE(f); 197c80476e4SDavid E. O'Brien return (0); 198c80476e4SDavid E. O'Brien } /* end resetdisc */ 199