X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/f73a43fc791280d75ccd399b114b209c56b8fcd0..063b2136e14f9cd49afb94850daf96846958ccde:/usr/src/sys/kern/tty_compat.c diff --git a/usr/src/sys/kern/tty_compat.c b/usr/src/sys/kern/tty_compat.c index 50625d31ef..283b4d9633 100644 --- a/usr/src/sys/kern/tty_compat.c +++ b/usr/src/sys/kern/tty_compat.c @@ -1,51 +1,31 @@ -/* - * 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 The Regents of the University of California. + * All rights reserved. * - * @(#)ttcompat.c 7.11 (Berkeley) 4/8/88 + * %sccs.include.redist.c% + * + * @(#)tty_compat.c 7.12 (Berkeley) %G% */ /* - * mapping routines for old line disciplines (yuck) + * mapping routines for old line discipline (yuck) */ -#ifdef COMPAT_43 - -#include "../machine/reg.h" +#if defined(COMPAT_43) || defined(COMPAT_SUNOS) #include "param.h" #include "systm.h" -#include "dir.h" -#include "user.h" #include "ioctl.h" +#include "proc.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" -/* begin XXX */ -#undef t_erase -#undef t_kill -#undef t_intrc -#undef t_quitc -#undef t_startc -#undef t_stopc -#undef t_eofc -#undef t_brkc -#undef t_suspc -#undef t_dsuspc -#undef t_rprntc -#undef t_flushc -#undef t_werasc -#undef t_lnextc -/* end XXX */ +int ttydebug = 0; -/* should fold these two tables into one */ static struct speedtab compatspeeds[] = { 38400, 15, 19200, 14, @@ -75,7 +55,8 @@ ttcompat(tp, com, data, flag) register struct tty *tp; caddr_t data; { - switch(com) { + + switch (com) { case TIOCGETP: { register struct sgttyb *sg = (struct sgttyb *)data; register u_char *cc = tp->t_cc; @@ -89,10 +70,9 @@ ttcompat(tp, com, data, flag) speed = ttspeedtab(tp->t_ispeed, compatspeeds); sg->sg_ispeed = (speed == -1) ? 15 : speed; } - sg->sg_erase = cc[VERASE]; sg->sg_kill = cc[VKILL]; - sg->sg_flags = ttcompatgetflags(tp) & 0xffff; + sg->sg_flags = ttcompatgetflags(tp); break; } @@ -103,7 +83,6 @@ ttcompat(tp, com, data, flag) int speed; term = tp->t_termios; - if ((speed = sg->sg_ispeed) > 15 || speed < 0) term.c_ispeed = speed; else @@ -112,14 +91,9 @@ ttcompat(tp, com, data, flag) term.c_ospeed = speed; else term.c_ospeed = compatspcodes[speed]; - term.c_cc[VERASE] = sg->sg_erase; term.c_cc[VKILL] = sg->sg_kill; - if (sg->sg_erase == -1) - term.c_cc[VERASE2] = POSIX_V_DISABLE; - - 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)); @@ -148,7 +122,7 @@ ttcompat(tp, com, data, flag) cc[VEOF] = tc->t_eofc; cc[VEOL] = tc->t_brkc; if (tc->t_brkc == -1) - cc[VEOL2] = POSIX_V_DISABLE; + cc[VEOL2] = _POSIX_VDISABLE; break; } case TIOCSLTC: { @@ -158,7 +132,7 @@ ttcompat(tp, com, data, flag) cc[VSUSP] = ltc->t_suspc; cc[VDSUSP] = ltc->t_dsuspc; cc[VREPRINT] = ltc->t_rprntc; - cc[VFLUSHO] = ltc->t_flushc; + cc[VDISCARD] = ltc->t_flushc; cc[VWERASE] = ltc->t_werasc; cc[VLNEXT] = ltc->t_lnextc; break; @@ -170,7 +144,7 @@ ttcompat(tp, com, data, flag) ltc->t_suspc = cc[VSUSP]; ltc->t_dsuspc = cc[VDSUSP]; ltc->t_rprntc = cc[VREPRINT]; - ltc->t_flushc = cc[VFLUSHO]; + ltc->t_flushc = cc[VDISCARD]; ltc->t_werasc = cc[VWERASE]; ltc->t_lnextc = cc[VLNEXT]; break; @@ -182,29 +156,45 @@ ttcompat(tp, com, data, flag) term = tp->t_termios; if (com == TIOCLSET) - tp->t_flags = (tp->t_flags&0xffff) | *(short *)data<<16; + tp->t_flags = (tp->t_flags&0xffff) | *(int *)data<<16; else { tp->t_flags = (ttcompatgetflags(tp)&0xffff0000)|(tp->t_flags&0xffff); if (com == TIOCLBIS) - tp->t_flags |= *(short *)data<<16; + tp->t_flags |= *(int *)data<<16; else - tp->t_flags &= ~(*(short *)data<<16); + tp->t_flags &= ~(*(int *)data<<16); } ttcompatsetlflags(tp, &term); return (ttioctl(tp, TIOCSETA, &term, flag)); } case TIOCLGET: - *(short *)data = ttcompatgetflags(tp)>>16; + *(int *)data = ttcompatgetflags(tp)>>16; + if (ttydebug) + printf("CLGET: returning %x\n", *(int *)data); + break; + + case OTIOCGETD: + *(int *)data = tp->t_line ? tp->t_line : 2; break; + + case OTIOCSETD: { + int ldisczero = 0; + + return (ttioctl(tp, TIOCSETD, + *(int *)data == 2 ? (caddr_t)&ldisczero : data, flag)); + } + + case OTIOCCONS: + *(int *)data = 1; + return (ttioctl(tp, TIOCCONS, data, flag)); + default: return (-1); } - return(0); + return (0); } - - ttcompatgetflags(tp) register struct tty *tp; { @@ -242,11 +232,10 @@ ttcompatgetflags(tp) } if (oflag&OXTABS) flags |= XTABS; - if (lflag&ECHOE) - flags |= CRTERA; + flags |= CRTERA|CRTBS; if (lflag&ECHOKE) - flags |= CRTKIL; + flags |= CRTKIL|CRTBS; if (lflag&ECHOPRT) flags |= PRTERA; if (lflag&ECHOCTL) @@ -254,7 +243,8 @@ ttcompatgetflags(tp) if ((iflag&IXANY) == 0) flags |= DECCTQ; flags |= lflag&(ECHO|MDMBUF|TOSTOP|FLUSHO|NOHANG|PENDIN|NOFLSH); - +if (ttydebug) + printf("getflags: %x\n", flags); return (flags); } @@ -271,11 +261,11 @@ ttcompatsetflags(tp, t) if (flags & RAW) { iflag &= IXOFF; oflag &= ~OPOST; - lflag &= ~(ECHOCTL|ISIG|ICANON); + lflag &= ~(ECHOCTL|ISIG|ICANON|IEXTEN); } else { - iflag |= BRKINT|IXON|IEXTEN|IMAXBEL; + iflag |= BRKINT|IXON|IMAXBEL; oflag |= OPOST; - lflag |= ISIG; + lflag |= ISIG|IEXTEN|ECHOCTL; /* XXX was echoctl on ? */ if (flags & XTABS) oflag |= OXTABS; else @@ -302,9 +292,12 @@ ttcompatsetflags(tp, t) cflag |= CS8; if ((flags&(RAW|PASS8)) == 0) iflag |= ISTRIP; + else + iflag &= ~ISTRIP; } else { cflag &= ~CSIZE; cflag |= CS7|PARENB; + iflag |= ISTRIP; } if ((flags&(EVENP|ODDP)) == EVENP) { iflag |= INPCK; @@ -326,7 +319,6 @@ ttcompatsetflags(tp, t) t->c_cflag = cflag; } -/* XXX - rethink this whole routine */ ttcompatsetlflags(tp, t) register struct tty *tp; register struct termios *t; @@ -336,10 +328,11 @@ ttcompatsetlflags(tp, t) register long oflag = t->c_oflag; register long lflag = t->c_lflag; register long cflag = t->c_cflag; + if (flags&CRTERA) lflag |= ECHOE; else - lflag &= ECHOE; + lflag &= ~ECHOE; if (flags&CRTKIL) lflag |= ECHOKE; else @@ -356,10 +349,8 @@ ttcompatsetlflags(tp, t) lflag |= IXANY; else lflag &= ~IXANY; - lflag &= ~(MDMBUF|TOSTOP|FLUSHO|NOHANG|PENDIN|NOFLSH); lflag |= flags&(MDMBUF|TOSTOP|FLUSHO|NOHANG|PENDIN|NOFLSH); - if (flags&(LITOUT|PASS8)) { iflag &= ~ISTRIP; cflag &= ~(CSIZE|PARENB); @@ -378,4 +369,4 @@ ttcompatsetlflags(tp, t) t->c_lflag = lflag; t->c_cflag = cflag; } -#endif /* COMPAT_43 */ +#endif /* COMPAT_43 || COMPAT_SUNOS */