BSD 4_4 release
[unix-history] / usr / src / sys / kern / tty_compat.c
index 8eeb327..a6a39d9 100644 (file)
@@ -1,53 +1,74 @@
-/*
- * Copyright (c) 1982, 1986 Regents of the University of California.
- * All rights reserved.  The Berkeley software License Agreement
- * specifies the terms and conditions for redistribution.
+/*-
+ * Copyright (c) 1982, 1986, 1991, 1993
+ *     The Regents of the University of California.  All rights reserved.
  *
  *
- *     @(#)tty_compat.c        7.6 (Berkeley) 6/14/90
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)tty_compat.c        8.1 (Berkeley) 6/10/93
  */
 
 /* 
  * mapping routines for old line discipline (yuck)
  */
  */
 
 /* 
  * mapping routines for old line discipline (yuck)
  */
-#ifdef COMPAT_43
+#if defined(COMPAT_43) || defined(COMPAT_SUNOS)
 
 
-#include "param.h"
-#include "systm.h"
-#include "user.h"
-#include "ioctl.h"
-#include "tty.h"
-#include "termios.h"
-#include "proc.h"
-#include "file.h"
-#include "conf.h"
-#include "dkstat.h"
-#include "uio.h"
-#include "kernel.h"
-#include "syslog.h"
-
-#include "machine/reg.h"
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/ioctl.h>
+#include <sys/proc.h>
+#include <sys/tty.h>
+#include <sys/termios.h>
+#include <sys/file.h>
+#include <sys/conf.h>
+#include <sys/kernel.h>
+#include <sys/syslog.h>
 
 int ttydebug = 0;
 
 
 int ttydebug = 0;
 
-/* XXX - fold these two tables into one */
 static struct speedtab compatspeeds[] = {
 static struct speedtab compatspeeds[] = {
-       38400,  15,
-       19200,  14,
-       9600,   13,
-       4800,   12,
-       2400,   11,
-       1800,   10,
-       1200,   9,
-       600,    8,
-       300,    7,
-       200,    6,
-       150,    5,
-       134,    4,
-       110,    3,
-       75,     2,
-       50,     1,
-       0,      0,
-       -1,     -1,
+       { 38400, 15 },
+       { 19200, 14 },
+       { 9600, 13 },
+       { 4800, 12 },
+       { 2400, 11 },
+       { 1800, 10 },
+       { 1200, 9 },
+       { 600,  8 },
+       { 300,  7 },
+       { 200,  6 },
+       { 150,  5 },
+       { 134,  4 },
+       { 110,  3 },
+       { 75,   2 },
+       { 50,   1 },
+       { 0,    0 },
+       { -1,   -1 },
 };
 static int compatspcodes[16] = { 
        0, 50, 75, 110, 134, 150, 200, 300, 600, 1200,
 };
 static int compatspcodes[16] = { 
        0, 50, 75, 110, 134, 150, 200, 300, 600, 1200,
@@ -57,9 +78,12 @@ static int compatspcodes[16] = {
 /*ARGSUSED*/
 ttcompat(tp, com, data, flag)
        register struct tty *tp;
 /*ARGSUSED*/
 ttcompat(tp, com, data, flag)
        register struct tty *tp;
+       int com;
        caddr_t data;
        caddr_t data;
+       int flag;
 {
 {
-       switch(com) {
+
+       switch (com) {
        case TIOCGETP: {
                register struct sgttyb *sg = (struct sgttyb *)data;
                register u_char *cc = tp->t_cc;
        case TIOCGETP: {
                register struct sgttyb *sg = (struct sgttyb *)data;
                register u_char *cc = tp->t_cc;
@@ -96,7 +120,7 @@ ttcompat(tp, com, data, flag)
                        term.c_ospeed = compatspcodes[speed];
                term.c_cc[VERASE] = sg->sg_erase;
                term.c_cc[VKILL] = sg->sg_kill;
                        term.c_ospeed = compatspcodes[speed];
                term.c_cc[VERASE] = sg->sg_erase;
                term.c_cc[VKILL] = sg->sg_kill;
-               tp->t_flags = (tp->t_flags&0xffff0000) | sg->sg_flags;
+               tp->t_flags = tp->t_flags&0xffff0000 | sg->sg_flags&0xffff;
                ttcompatsetflags(tp, &term);
                return (ttioctl(tp, com == TIOCSETP ? TIOCSETAF : TIOCSETA, 
                        &term, flag));
                ttcompatsetflags(tp, &term);
                return (ttioctl(tp, com == TIOCSETP ? TIOCSETAF : TIOCSETA, 
                        &term, flag));
@@ -184,18 +208,18 @@ ttcompat(tp, com, data, flag)
        case OTIOCSETD: {
                int ldisczero = 0;
 
        case OTIOCSETD: {
                int ldisczero = 0;
 
-               return(ttioctl(tp, TIOCSETD, 
+               return (ttioctl(tp, TIOCSETD, 
                        *(int *)data == 2 ? (caddr_t)&ldisczero : data, flag));
                        *(int *)data == 2 ? (caddr_t)&ldisczero : data, flag));
+           }
 
        case OTIOCCONS:
                *(int *)data = 1;
 
        case OTIOCCONS:
                *(int *)data = 1;
-               return(ttioctl(tp, TIOCCONS, data, flag));
-       }
+               return (ttioctl(tp, TIOCCONS, data, flag));
 
        default:
                return (-1);
        }
 
        default:
                return (-1);
        }
-       return(0);
+       return (0);
 }
 
 ttcompatgetflags(tp)
 }
 
 ttcompatgetflags(tp)
@@ -233,6 +257,10 @@ ttcompatgetflags(tp)
                else
                        flags |= RAW;
        }
                else
                        flags |= RAW;
        }
+       if (cflag&MDMBUF)
+               flags |= MDMBUF;
+       if ((cflag&HUPCL) == 0)
+               flags |= NOHANG;
        if (oflag&OXTABS)
                flags |= XTABS;
        if (lflag&ECHOE)
        if (oflag&OXTABS)
                flags |= XTABS;
        if (lflag&ECHOE)
@@ -245,7 +273,7 @@ ttcompatgetflags(tp)
                flags |= CTLECH;
        if ((iflag&IXANY) == 0)
                flags |= DECCTQ;
                flags |= CTLECH;
        if ((iflag&IXANY) == 0)
                flags |= DECCTQ;
-       flags |= lflag&(ECHO|MDMBUF|TOSTOP|FLUSHO|NOHANG|PENDIN|NOFLSH);
+       flags |= lflag&(ECHO|TOSTOP|FLUSHO|PENDIN|NOFLSH);
 if (ttydebug)
        printf("getflags: %x\n", flags);
        return (flags);
 if (ttydebug)
        printf("getflags: %x\n", flags);
        return (flags);
@@ -268,7 +296,7 @@ ttcompatsetflags(tp, t)
        } else {
                iflag |= BRKINT|IXON|IMAXBEL;
                oflag |= OPOST;
        } else {
                iflag |= BRKINT|IXON|IMAXBEL;
                oflag |= OPOST;
-               lflag |= ISIG|IEXTEN;
+               lflag |= ISIG|IEXTEN|ECHOCTL;   /* XXX was echoctl on ? */
                if (flags & XTABS)
                        oflag |= OXTABS;
                else
                if (flags & XTABS)
                        oflag |= OXTABS;
                else
@@ -295,9 +323,12 @@ ttcompatsetflags(tp, t)
                cflag |= CS8;
                if ((flags&(RAW|PASS8)) == 0)
                        iflag |= ISTRIP;
                cflag |= CS8;
                if ((flags&(RAW|PASS8)) == 0)
                        iflag |= ISTRIP;
+               else
+                       iflag &= ~ISTRIP;
        } else {
                cflag &= ~CSIZE;
                cflag |= CS7|PARENB;
        } else {
                cflag &= ~CSIZE;
                cflag |= CS7|PARENB;
+               iflag |= ISTRIP;
        }
        if ((flags&(EVENP|ODDP)) == EVENP) {
                iflag |= INPCK;
        }
        if ((flags&(EVENP|ODDP)) == EVENP) {
                iflag |= INPCK;
@@ -346,11 +377,19 @@ ttcompatsetlflags(tp, t)
        else
                lflag &= ~ECHOCTL;
        if ((flags&DECCTQ) == 0)
        else
                lflag &= ~ECHOCTL;
        if ((flags&DECCTQ) == 0)
-               lflag |= IXANY;
+               iflag |= IXANY;
+       else
+               iflag &= ~IXANY;
+       if (flags & MDMBUF)
+               cflag |= MDMBUF;
+       else
+               cflag &= ~MDMBUF;
+       if (flags&NOHANG)
+               cflag &= ~HUPCL;
        else
        else
-               lflag &= ~IXANY;
-       lflag &= ~(MDMBUF|TOSTOP|FLUSHO|NOHANG|PENDIN|NOFLSH);
-       lflag |= flags&(MDMBUF|TOSTOP|FLUSHO|NOHANG|PENDIN|NOFLSH);
+               cflag |= HUPCL;
+       lflag &= ~(TOSTOP|FLUSHO|PENDIN|NOFLSH);
+       lflag |= flags&(TOSTOP|FLUSHO|PENDIN|NOFLSH);
        if (flags&(LITOUT|PASS8)) {
                iflag &= ~ISTRIP;
                cflag &= ~(CSIZE|PARENB);
        if (flags&(LITOUT|PASS8)) {
                iflag &= ~ISTRIP;
                cflag &= ~(CSIZE|PARENB);
@@ -369,4 +408,4 @@ ttcompatsetlflags(tp, t)
        t->c_lflag = lflag;
        t->c_cflag = cflag;
 }
        t->c_lflag = lflag;
        t->c_cflag = cflag;
 }
-#endif /* COMPAT_43 */
+#endif /* COMPAT_43 || COMPAT_SUNOS */