Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 18 Oct 2009 19:45:44 +0000 (UTC)
From:      Ed Schouten <ed@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r198213 - head/sys/kern
Message-ID:  <200910181945.n9IJjijt077186@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ed
Date: Sun Oct 18 19:45:44 2009
New Revision: 198213
URL: http://svn.freebsd.org/changeset/base/198213

Log:
  Make lock devices work properly.
  
  It turned out I did add the code to use the init state devices to set
  the termios structure when opening the device, but it seems I totally
  forgot to add the bits required to force the actual locking of flags
  through the lock state devices.
  
  Reported by:	ru
  MFC after:	1 week (to be discussed)

Modified:
  head/sys/kern/tty.c

Modified: head/sys/kern/tty.c
==============================================================================
--- head/sys/kern/tty.c	Sun Oct 18 17:22:08 2009	(r198212)
+++ head/sys/kern/tty.c	Sun Oct 18 19:45:44 2009	(r198213)
@@ -523,6 +523,34 @@ ttydev_ioctl(struct cdev *dev, u_long cm
 			goto done;
 	}
 
+	if (cmd == TIOCSETA || cmd == TIOCSETAW || cmd == TIOCSETAF) {
+		struct termios *old = &tp->t_termios;
+		struct termios *new = (struct termios *)data;
+		struct termios *lock = TTY_CALLOUT(tp, dev) ?
+		    &tp->t_termios_lock_out : &tp->t_termios_lock_in;
+		int cc;
+
+		/*
+		 * Lock state devices.  Just overwrite the values of the
+		 * commands that are currently in use.
+		 */
+		new->c_iflag = (old->c_iflag & lock->c_iflag) |
+		    (new->c_iflag & ~lock->c_iflag);
+		new->c_oflag = (old->c_oflag & lock->c_oflag) |
+		    (new->c_oflag & ~lock->c_oflag);
+		new->c_cflag = (old->c_cflag & lock->c_cflag) |
+		    (new->c_cflag & ~lock->c_cflag);
+		new->c_lflag = (old->c_lflag & lock->c_lflag) |
+		    (new->c_lflag & ~lock->c_lflag);
+		for (cc = 0; cc < NCCS; ++cc)
+			if (lock->c_cc[cc])
+				new->c_cc[cc] = old->c_cc[cc];
+		if (lock->c_ispeed)
+			new->c_ispeed = old->c_ispeed;
+		if (lock->c_ospeed)
+			new->c_ospeed = old->c_ospeed;
+	}
+
 	error = tty_ioctl(tp, cmd, data, td);
 done:	tty_unlock(tp);
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200910181945.n9IJjijt077186>