*BSD News Article 8179


Return to BSD News archive

Path: sserve!manuel.anu.edu.au!munnari.oz.au!news.hawaii.edu!ames!sun-barr!cs.utexas.edu!uunet!mcsun!fuug!kiae!demos!newsserv
From: "Andrew A. Chernov, Black Mage" <ache@astral.msk.su>
Newsgroups: comp.unix.bsd
Subject: Patch tty driver for correct handle COMPAT_43 tty modes
Date: Fri, 27 Nov 92 00:33:59 +0300
Distribution: world
Organization: Ha-oh-lahm Yetzirah
Message-ID: <hF7BK5hiH1@astral.msk.su>
Sender: news-service@newcom.kiae.su
Reply-To: ache@astral.msk.su
Keywords: COMPAT_43 386bsd tty driver
Lines: 153

Hi,
I found this bug in following situation:
my current tty modes: -parity cs8 -istrip
When I call any program that use CBREAK (COMPAT_43) mode,
tty modes resets to: cs7 parenb istrip,
so, I lost my 8-bit characters.

I produce this patch to fix this and some more situations.
I made COMPAT_43 modes and POSIX modes as close as
possible.

*** tty_compat.c.was	Wed Dec 25 01:24:09 1991
--- tty_compat.c	Thu Nov 26 22:38:06 1992
***************
*** 119,125 ****
  			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;
  		ttcompatsetflags(tp, &term);
  		return (ttioctl(tp, com == TIOCSETP ? TIOCSETAF : TIOCSETA, 
  			&term, flag));
--- 119,125 ----
  			term.c_ospeed = compatspcodes[speed];
  		term.c_cc[VERASE] = sg->sg_erase;
  		term.c_cc[VKILL] = sg->sg_kill;
! 		tp->t_flags = ttcompatgetflags(tp)&0xffff0000 | sg->sg_flags&0xffff;
  		ttcompatsetflags(tp, &term);
  		return (ttioctl(tp, com == TIOCSETP ? TIOCSETAF : TIOCSETA, 
  			&term, flag));
***************
*** 182,191 ****
  
  		term = tp->t_termios;
  		if (com == TIOCLSET)
! 			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 |= *(int *)data<<16;
  			else
--- 182,190 ----
  
  		term = tp->t_termios;
  		if (com == TIOCLSET)
! 			tp->t_flags = (ttcompatgetflags(tp)&0xffff) | *(int *)data<<16;
  		else {
! 			tp->t_flags = ttcompatgetflags(tp);
  			if (com == TIOCLBIS)
  				tp->t_flags |= *(int *)data<<16;
  			else
***************
*** 242,257 ****
  				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)
  			flags |= CBREAK;
  		else
  			flags |= RAW;
--- 241,255 ----
  				flags |= EVENP;
  		} else
  			flags |= EVENP | ODDP;
  	}
+ 	if (!(oflag&OPOST) && (!(cflag&PARENB) || (cflag&CSIZE) == CS8))
+ 		flags |= LITOUT;
+ 	if ((cflag&CSIZE) == CS8 && !(iflag&ISTRIP))
+ 		flags |= PASS8;
  	
  	if ((lflag&ICANON) == 0) {	
  		/* fudge */
! 		if (oflag&OPOST || iflag&ISTRIP || iflag&IXON || lflag&ISIG || lflag&IEXTEN || (cflag&PARENB) && (cflag&CSIZE) != CS8)
  			flags |= CBREAK;
  		else
  			flags |= RAW;
***************
*** 322,328 ****
  			iflag &= ~ISTRIP;
  	} else {
  		cflag &= ~CSIZE;
! 		cflag |= CS7|PARENB;
  		iflag |= ISTRIP;
  	}
  	if ((flags&(EVENP|ODDP)) == EVENP) {
--- 320,328 ----
  			iflag &= ~ISTRIP;
  	} else {
  		cflag &= ~CSIZE;
! 		cflag |= CS7;
! 		if (flags&(ODDP|EVENP))
! 			cflag |= PARENB;
  		iflag |= ISTRIP;
  	}
  	if ((flags&(EVENP|ODDP)) == EVENP) {
***************
*** 387,393 ****
  			iflag |= ISTRIP;
  	} else if ((flags&RAW) == 0) {
  		cflag &= ~CSIZE;
! 		cflag |= CS7|PARENB;
  		oflag |= OPOST;
  	}
  	t->c_iflag = iflag;
--- 387,395 ----
  			iflag |= ISTRIP;
  	} else if ((flags&RAW) == 0) {
  		cflag &= ~CSIZE;
! 		cflag |= CS7;
! 		if (flags&(ODDP|EVENP))
! 			cflag |= PARENB;
  		oflag |= OPOST;
  	}
  	t->c_iflag = iflag;
*** tty_tb.c.was	Thu Nov 26 21:21:46 1992
--- tty_tb.c	Thu Nov 26 21:29:48 1992
***************
*** 117,123 ****
  	tp->t_inbuf = 0;
  	bzero((caddr_t)&tbp->rets, sizeof (tbp->rets));
  	tp->T_LINEP = (caddr_t)tbp;
! 	tp->t_flags |= LITOUT;
  	return (0);
  }
  
--- 117,127 ----
  	tp->t_inbuf = 0;
  	bzero((caddr_t)&tbp->rets, sizeof (tbp->rets));
  	tp->T_LINEP = (caddr_t)tbp;
! 	tp->t_flags = ttcompatgetflags(tp);
! 	if (!(tp->t_flags&(LITOUT|RAW))) {
! 		tp->t_flags |= LITOUT;
! 		ttcompatsetlflags(tp, &(tp->t_termios));
! 	}
  	return (0);
  }
  
-- 
In-This-Life:  Andrew A. Chernov    |  "Hay mas dicha, mas contento
Internet:      ache@astral.msk.su   |  "Que adorar una hermosura
Organization:  The RELCOM Corp.,    |  "Brujuleada entre los lejos
               Moscow, Russia       |  "De lo imposible?!"  (Calderon)