summaryrefslogtreecommitdiffstats
path: root/sys/kern/tty_compat.c
diff options
context:
space:
mode:
authorache <ache@FreeBSD.org>1994-10-11 20:04:49 +0000
committerache <ache@FreeBSD.org>1994-10-11 20:04:49 +0000
commit7d96472389b5d0a7516235c5ffb7bd5c0d74fe80 (patch)
treea92c6f9ae62b5a8706c7809226e333d84679c8f2 /sys/kern/tty_compat.c
parent5f991c5831c9a221aa4fd8e08c1cc4ee54e8e503 (diff)
downloadFreeBSD-src-7d96472389b5d0a7516235c5ffb7bd5c0d74fe80.zip
FreeBSD-src-7d96472389b5d0a7516235c5ffb7bd5c0d74fe80.tar.gz
Fix old cs8->cs7 bug, bringed by rlogin.
Obtained from: FreeBSD 1.x
Diffstat (limited to 'sys/kern/tty_compat.c')
-rw-r--r--sys/kern/tty_compat.c70
1 files changed, 45 insertions, 25 deletions
diff --git a/sys/kern/tty_compat.c b/sys/kern/tty_compat.c
index a0752c8..8b6f70f 100644
--- a/sys/kern/tty_compat.c
+++ b/sys/kern/tty_compat.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)tty_compat.c 8.1 (Berkeley) 6/10/93
- * $Id: tty_compat.c,v 1.4 1994/08/25 10:01:00 bde Exp $
+ * $Id: tty_compat.c,v 1.5 1994/10/08 22:33:40 phk Exp $
*/
/*
@@ -108,7 +108,7 @@ ttcompat(tp, com, data, flag)
}
sg->sg_erase = cc[VERASE];
sg->sg_kill = cc[VKILL];
- sg->sg_flags = ttcompatgetflags(tp);
+ sg->sg_flags = tp->t_flags = ttcompatgetflags(tp);
break;
}
@@ -205,7 +205,10 @@ ttcompat(tp, com, data, flag)
return (ttioctl(tp, TIOCSETA, &term, flag));
}
case TIOCLGET:
- *(int *)data = ttcompatgetflags(tp)>>16;
+ tp->t_flags =
+ (ttcompatgetflags(tp) & 0xffff0000UL)
+ | (tp->t_flags & 0xffff);
+ *(int *)data = tp->t_flags>>16;
if (ttydebug)
printf("CLGET: returning %x\n", *(int *)data);
break;
@@ -245,7 +248,12 @@ ttcompatgetflags(tp)
flags |= TANDEM;
if (iflag&ICRNL || oflag&ONLCR)
flags |= CRMOD;
- if (cflag&PARENB) {
+ if ((cflag&CSIZE) == CS8) {
+ flags |= PASS8;
+ if (iflag&ISTRIP)
+ flags |= ANYP;
+ }
+ else if (cflag&PARENB) {
if (iflag&INPCK) {
if (cflag&PARODD)
flags |= ODDP;
@@ -253,20 +261,18 @@ ttcompatgetflags(tp)
flags |= EVENP;
} else
flags |= EVENP | ODDP;
- } else {
- if ((tp->t_flags&LITOUT) && !(oflag&OPOST))
- flags |= LITOUT;
- if (tp->t_flags&PASS8)
- flags |= PASS8;
}
if ((lflag&ICANON) == 0) {
/* fudge */
- if (iflag&IXON || lflag&ISIG || lflag&IEXTEN || cflag&PARENB)
+ if (iflag&(INPCK|ISTRIP|IXON) || lflag&(IEXTEN|ISIG)
+ || cflag&(CSIZE|PARENB) != CS8)
flags |= CBREAK;
else
flags |= RAW;
}
+ if (!(flags&RAW) && !(oflag&OPOST) && cflag&(CSIZE|PARENB) == CS8)
+ flags |= LITOUT;
if (cflag&MDMBUF)
flags |= MDMBUF;
if ((cflag&HUPCL) == 0)
@@ -301,12 +307,10 @@ ttcompatsetflags(tp, t)
register long cflag = t->c_cflag;
if (flags & RAW) {
- iflag &= IXOFF;
- oflag &= ~OPOST;
+ iflag &= IXOFF|IXANY;
lflag &= ~(ECHOCTL|ISIG|ICANON|IEXTEN);
} else {
iflag |= BRKINT|IXON|IMAXBEL;
- oflag |= OPOST;
lflag |= ISIG|IEXTEN|ECHOCTL; /* XXX was echoctl on ? */
if (flags & XTABS)
oflag |= OXTABS;
@@ -329,17 +333,22 @@ ttcompatsetflags(tp, t)
else
lflag &= ~ECHO;
- if (flags&(RAW|LITOUT|PASS8)) {
cflag &= ~(CSIZE|PARENB);
+ if (flags&(RAW|LITOUT|PASS8)) {
cflag |= CS8;
- if ((flags&(RAW|PASS8)) == 0)
+ if (!(flags&(RAW|PASS8))
+ || (flags&(RAW|PASS8|ANYP)) == (PASS8|ANYP))
iflag |= ISTRIP;
else
iflag &= ~ISTRIP;
+ if (flags&(RAW|LITOUT))
+ oflag &= ~OPOST;
+ else
+ oflag |= OPOST;
} else {
- cflag &= ~CSIZE;
cflag |= CS7|PARENB;
iflag |= ISTRIP;
+ oflag |= OPOST;
}
if ((flags&(EVENP|ODDP)) == EVENP) {
iflag |= INPCK;
@@ -349,8 +358,6 @@ ttcompatsetflags(tp, t)
cflag |= PARODD;
} else
iflag &= ~INPCK;
- if (flags&LITOUT)
- oflag &= ~OPOST; /* move earlier ? */
if (flags&TANDEM)
iflag |= IXOFF;
else
@@ -402,17 +409,30 @@ ttcompatsetlflags(tp, t)
cflag |= HUPCL;
lflag &= ~(TOSTOP|FLUSHO|PENDIN|NOFLSH);
lflag |= flags&(TOSTOP|FLUSHO|PENDIN|NOFLSH);
- if (flags&(LITOUT|PASS8)) {
- iflag &= ~ISTRIP;
+
+ /*
+ * The next if-else statement is copied from above so don't bother
+ * checking it separately. We could avoid fiddlling with the
+ * character size if the mode is already RAW or if neither the
+ * LITOUT bit or the PASS8 bit is being changed, but the delta of
+ * the change is not available here and skipping the RAW case would
+ * make the code different from above.
+ */
cflag &= ~(CSIZE|PARENB);
+ if (flags&(RAW|LITOUT|PASS8)) {
cflag |= CS8;
- if (flags&LITOUT)
- oflag &= ~OPOST;
- if ((flags&(PASS8|RAW)) == 0)
+ if (!(flags&(RAW|PASS8))
+ || (flags&(RAW|PASS8|ANYP)) == (PASS8|ANYP))
iflag |= ISTRIP;
- } else if ((flags&RAW) == 0) {
- cflag &= ~CSIZE;
+ else
+ iflag &= ~ISTRIP;
+ if (flags&(RAW|LITOUT))
+ oflag &= ~OPOST;
+ else
+ oflag |= OPOST;
+ } else {
cflag |= CS7|PARENB;
+ iflag |= ISTRIP;
oflag |= OPOST;
}
t->c_iflag = iflag;
OpenPOWER on IntegriCloud