diff options
author | ed <ed@FreeBSD.org> | 2009-10-18 19:45:44 +0000 |
---|---|---|
committer | ed <ed@FreeBSD.org> | 2009-10-18 19:45:44 +0000 |
commit | 48d5bb8030211449f7101bf25732efdfd98c5929 (patch) | |
tree | 759b70ca7082727ef2289f526d88b6097a344142 /sys/kern/tty.c | |
parent | 0297b355f62af3acb1970515907b40def4ae755d (diff) | |
download | FreeBSD-src-48d5bb8030211449f7101bf25732efdfd98c5929.zip FreeBSD-src-48d5bb8030211449f7101bf25732efdfd98c5929.tar.gz |
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)
Diffstat (limited to 'sys/kern/tty.c')
-rw-r--r-- | sys/kern/tty.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/sys/kern/tty.c b/sys/kern/tty.c index 6990b8f..25908df 100644 --- a/sys/kern/tty.c +++ b/sys/kern/tty.c @@ -523,6 +523,34 @@ ttydev_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, 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); |