From 5760558f801f30c7450b01ac6e788964f370cebe Mon Sep 17 00:00:00 2001 From: deraadt Date: Thu, 13 May 1993 20:58:26 +0000 Subject: [PATCH] various 8-bit patches from Andrew Chernov tty_compat.c is cleaned up, as is STOP+TIOCSTI in tty.c --- sys/kern/tty.c | 2 +- sys/kern/tty_compat.c | 62 ++++++++++++++++++++++++------------------- 2 files changed, 36 insertions(+), 28 deletions(-) diff --git a/sys/kern/tty.c b/sys/kern/tty.c index b513f38ec239..a6e3f2871612 100644 --- a/sys/kern/tty.c +++ b/sys/kern/tty.c @@ -1 +1 @@ -revision 1.6 intentionally removed +revision 1.7 intentionally removed diff --git a/sys/kern/tty_compat.c b/sys/kern/tty_compat.c index 9bfd6cd92fbb..9934af3a4c67 100644 --- a/sys/kern/tty_compat.c +++ b/sys/kern/tty_compat.c @@ -98,7 +98,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; } @@ -119,7 +119,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; - tp->t_flags = tp->t_flags&0xffff0000 | sg->sg_flags&0xffff; + tp->t_flags = ttcompatgetflags(tp)&0xffff0000 | sg->sg_flags&0xffff; ttcompatsetflags(tp, &term); return (ttioctl(tp, com == TIOCSETP ? TIOCSETAF : TIOCSETA, &term, flag)); @@ -182,10 +182,9 @@ ttcompat(tp, com, data, flag) term = tp->t_termios; if (com == TIOCLSET) - tp->t_flags = (tp->t_flags&0xffff) | *(int *)data<<16; + tp->t_flags = (ttcompatgetflags(tp)&0xffff) | *(int *)data<<16; else { - tp->t_flags = - (ttcompatgetflags(tp)&0xffff0000)|(tp->t_flags&0xffff); + tp->t_flags = ttcompatgetflags(tp); if (com == TIOCLBIS) tp->t_flags |= *(int *)data<<16; else @@ -195,7 +194,9 @@ ttcompat(tp, com, data, flag) return (ttioctl(tp, TIOCSETA, &term, flag)); } case TIOCLGET: - *(int *)data = ttcompatgetflags(tp)>>16; + tp->t_flags = + (ttcompatgetflags(tp)&0xffff0000)|(tp->t_flags&0xffff); + *(int *)data = tp->t_flags>>16; if (ttydebug) printf("CLGET: returning %x\n", *(int *)data); break; @@ -234,7 +235,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; @@ -242,20 +248,17 @@ 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 (oflag&OPOST || iflag&ISTRIP || iflag&IXON || lflag&ISIG || lflag&IEXTEN || cflag&PARENB || iflag&INPCK || (cflag&CSIZE) != CS8) flags |= CBREAK; else flags |= RAW; } + if (!(flags&RAW) && !(oflag&OPOST) && (!(cflag&PARENB) || (cflag&CSIZE) == CS8)) + flags |= LITOUT; if (oflag&OXTABS) flags |= XTABS; if (lflag&ECHOE) @@ -285,7 +288,7 @@ ttcompatsetflags(tp, t) register long cflag = t->c_cflag; if (flags & RAW) { - iflag &= IXOFF; + iflag &= (IXOFF|IXANY); oflag &= ~OPOST; lflag &= ~(ECHOCTL|ISIG|ICANON|IEXTEN); } else { @@ -313,16 +316,17 @@ ttcompatsetflags(tp, t) else lflag &= ~ECHO; + cflag &= ~(CSIZE|PARENB); if (flags&(RAW|LITOUT|PASS8)) { - cflag &= ~(CSIZE|PARENB); cflag |= CS8; - if ((flags&(RAW|PASS8)) == 0) + if (!(flags&(RAW|PASS8)) || (flags&(RAW|PASS8|ANYP)) == (PASS8|ANYP)) iflag |= ISTRIP; else iflag &= ~ISTRIP; } else { - cflag &= ~CSIZE; - cflag |= CS7|PARENB; + cflag |= CS7; + if ((flags&(EVENP|ODDP)) && (flags&ANYP) != ANYP) + cflag |= PARENB; iflag |= ISTRIP; } if ((flags&(EVENP|ODDP)) == EVENP) { @@ -377,18 +381,22 @@ ttcompatsetlflags(tp, t) lflag &= ~IXANY; lflag &= ~(MDMBUF|TOSTOP|FLUSHO|NOHANG|PENDIN|NOFLSH); lflag |= flags&(MDMBUF|TOSTOP|FLUSHO|NOHANG|PENDIN|NOFLSH); + cflag &= ~(CSIZE|PARENB); if (flags&(LITOUT|PASS8)) { - iflag &= ~ISTRIP; - cflag &= ~(CSIZE|PARENB); cflag |= CS8; - if (flags&LITOUT) + if (flags&(LITOUT|RAW)) oflag &= ~OPOST; - if ((flags&(PASS8|RAW)) == 0) - iflag |= ISTRIP; + else + oflag |= OPOST; + if (!(flags&(RAW|PASS8)) || (flags&(RAW|PASS8|ANYP)) == (PASS8|ANYP)) + iflag |= ISTRIP; + else + iflag &= ~ISTRIP; } else if ((flags&RAW) == 0) { - cflag &= ~CSIZE; - cflag |= CS7|PARENB; - oflag |= OPOST; + cflag |= CS7; + if ((flags&(EVENP|ODDP)) && (flags&ANYP) != ANYP) + cflag |= PARENB; + oflag |= ISTRIP|OPOST; } t->c_iflag = iflag; t->c_oflag = oflag;