Home | History | Annotate | Line # | Download | only in kern
tty.c revision 1.259
      1 /*	$NetBSD: tty.c,v 1.259 2014/02/25 18:30:11 pooka Exp $	*/
      2 
      3 /*-
      4  * Copyright (c) 2008 The NetBSD Foundation, Inc.
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  * 1. Redistributions of source code must retain the above copyright
     11  *    notice, this list of conditions and the following disclaimer.
     12  * 2. Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in the
     14  *    documentation and/or other materials provided with the distribution.
     15  *
     16  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     17  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     18  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     19  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     20  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     26  * POSSIBILITY OF SUCH DAMAGE.
     27  */
     28 
     29 /*-
     30  * Copyright (c) 1982, 1986, 1990, 1991, 1993
     31  *	The Regents of the University of California.  All rights reserved.
     32  * (c) UNIX System Laboratories, Inc.
     33  * All or some portions of this file are derived from material licensed
     34  * to the University of California by American Telephone and Telegraph
     35  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
     36  * the permission of UNIX System Laboratories, Inc.
     37  *
     38  * Redistribution and use in source and binary forms, with or without
     39  * modification, are permitted provided that the following conditions
     40  * are met:
     41  * 1. Redistributions of source code must retain the above copyright
     42  *    notice, this list of conditions and the following disclaimer.
     43  * 2. Redistributions in binary form must reproduce the above copyright
     44  *    notice, this list of conditions and the following disclaimer in the
     45  *    documentation and/or other materials provided with the distribution.
     46  * 3. Neither the name of the University nor the names of its contributors
     47  *    may be used to endorse or promote products derived from this software
     48  *    without specific prior written permission.
     49  *
     50  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     51  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     52  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     53  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     54  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     55  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     56  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     57  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     58  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     59  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     60  * SUCH DAMAGE.
     61  *
     62  *	@(#)tty.c	8.13 (Berkeley) 1/9/95
     63  */
     64 
     65 #include <sys/cdefs.h>
     66 __KERNEL_RCSID(0, "$NetBSD: tty.c,v 1.259 2014/02/25 18:30:11 pooka Exp $");
     67 
     68 #include "opt_compat_netbsd.h"
     69 
     70 #include <sys/param.h>
     71 #include <sys/systm.h>
     72 #include <sys/ioctl.h>
     73 #include <sys/proc.h>
     74 #define	TTYDEFCHARS
     75 #include <sys/tty.h>
     76 #undef	TTYDEFCHARS
     77 #include <sys/file.h>
     78 #include <sys/conf.h>
     79 #include <sys/cpu.h>
     80 #include <sys/dkstat.h>
     81 #include <sys/uio.h>
     82 #include <sys/kernel.h>
     83 #include <sys/vnode.h>
     84 #include <sys/syslog.h>
     85 #include <sys/kmem.h>
     86 #include <sys/signalvar.h>
     87 #include <sys/resourcevar.h>
     88 #include <sys/poll.h>
     89 #include <sys/kprintf.h>
     90 #include <sys/namei.h>
     91 #include <sys/sysctl.h>
     92 #include <sys/kauth.h>
     93 #include <sys/intr.h>
     94 #include <sys/ioctl_compat.h>
     95 #include <sys/module.h>
     96 #include <sys/bitops.h>
     97 
     98 #ifdef COMPAT_60
     99 #include <compat/sys/ttycom.h>
    100 #endif /* COMPAT_60 */
    101 
    102 static int	ttnread(struct tty *);
    103 static void	ttyblock(struct tty *);
    104 static void	ttyecho(int, struct tty *);
    105 static void	ttyrubo(struct tty *, int);
    106 static void	ttyprintf_nolock(struct tty *, const char *fmt, ...)
    107     __printflike(2, 3);
    108 static int	proc_compare_wrapper(struct proc *, struct proc *);
    109 static void	ttysigintr(void *);
    110 
    111 /* Symbolic sleep message strings. */
    112 const char	ttclos[] = "ttycls";
    113 const char	ttopen[] = "ttyopn";
    114 const char	ttybg[] = "ttybg";
    115 const char	ttyin[] = "ttyin";
    116 const char	ttyout[] = "ttyout";
    117 
    118 /*
    119  * Used to determine whether we still have a connection.  This is true in
    120  * one of 3 cases:
    121  * 1) We have carrier.
    122  * 2) It's a locally attached terminal, and we are therefore ignoring carrier.
    123  * 3) We're using a flow control mechanism that overloads the carrier signal.
    124  */
    125 #define	CONNECTED(tp)	(ISSET(tp->t_state, TS_CARR_ON) ||	\
    126 			 ISSET(tp->t_cflag, CLOCAL | MDMBUF))
    127 
    128 /*
    129  * Table with character classes and parity. The 8th bit indicates parity,
    130  * the 7th bit indicates the character is an alphameric or underscore (for
    131  * ALTWERASE), and the low 6 bits indicate delay type.  If the low 6 bits
    132  * are 0 then the character needs no special processing on output; classes
    133  * other than 0 might be translated or (not currently) require delays.
    134  */
    135 #define	E	0x00	/* Even parity. */
    136 #define	O	0x80	/* Odd parity. */
    137 #define	PARITY(c)	(char_type[c] & O)
    138 
    139 #define	ALPHA	0x40	/* Alpha or underscore. */
    140 #define	ISALPHA(c)	(char_type[(c) & TTY_CHARMASK] & ALPHA)
    141 
    142 #define	CCLASSMASK	0x3f
    143 #define	CCLASS(c)	(char_type[c] & CCLASSMASK)
    144 
    145 #define	BS	BACKSPACE
    146 #define	CC	CONTROL
    147 #define	CR	RETURN
    148 #define	NA	ORDINARY | ALPHA
    149 #define	NL	NEWLINE
    150 #define	NO	ORDINARY
    151 #define	TB	TAB
    152 #define	VT	VTAB
    153 
    154 unsigned char const char_type[] = {
    155 	E|CC, O|CC, O|CC, E|CC, O|CC, E|CC, E|CC, O|CC,	/* nul - bel */
    156 	O|BS, E|TB, E|NL, O|CC, E|VT, O|CR, O|CC, E|CC,	/* bs - si */
    157 	O|CC, E|CC, E|CC, O|CC, E|CC, O|CC, O|CC, E|CC,	/* dle - etb */
    158 	E|CC, O|CC, O|CC, E|CC, O|CC, E|CC, E|CC, O|CC,	/* can - us */
    159 	O|NO, E|NO, E|NO, O|NO, E|NO, O|NO, O|NO, E|NO,	/* sp - ' */
    160 	E|NO, O|NO, O|NO, E|NO, O|NO, E|NO, E|NO, O|NO,	/* ( - / */
    161 	E|NA, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA,	/* 0 - 7 */
    162 	O|NA, E|NA, E|NO, O|NO, E|NO, O|NO, O|NO, E|NO,	/* 8 - ? */
    163 	O|NO, E|NA, E|NA, O|NA, E|NA, O|NA, O|NA, E|NA,	/* @ - G */
    164 	E|NA, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA,	/* H - O */
    165 	E|NA, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA,	/* P - W */
    166 	O|NA, E|NA, E|NA, O|NO, E|NO, O|NO, O|NO, O|NA,	/* X - _ */
    167 	E|NO, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA,	/* ` - g */
    168 	O|NA, E|NA, E|NA, O|NA, E|NA, O|NA, O|NA, E|NA,	/* h - o */
    169 	O|NA, E|NA, E|NA, O|NA, E|NA, O|NA, O|NA, E|NA,	/* p - w */
    170 	E|NA, O|NA, O|NA, E|NO, O|NO, E|NO, E|NO, O|CC,	/* x - del */
    171 	/*
    172 	 * Meta chars; should be settable per character set;
    173 	 * for now, treat them all as normal characters.
    174 	 */
    175 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    176 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    177 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    178 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    179 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    180 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    181 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    182 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    183 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    184 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    185 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    186 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    187 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    188 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    189 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    190 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    191 };
    192 #undef	BS
    193 #undef	CC
    194 #undef	CR
    195 #undef	NA
    196 #undef	NL
    197 #undef	NO
    198 #undef	TB
    199 #undef	VT
    200 
    201 static struct ttylist_head tty_sigqueue = TAILQ_HEAD_INITIALIZER(tty_sigqueue);
    202 static void *tty_sigsih;
    203 
    204 struct ttylist_head ttylist = TAILQ_HEAD_INITIALIZER(ttylist);
    205 int tty_count;
    206 kmutex_t tty_lock;
    207 krwlock_t ttcompat_lock;
    208 int (*ttcompatvec)(struct tty *, u_long, void *, int, struct lwp *);
    209 
    210 uint64_t tk_cancc;
    211 uint64_t tk_nin;
    212 uint64_t tk_nout;
    213 uint64_t tk_rawcc;
    214 
    215 static kauth_listener_t tty_listener;
    216 
    217 #define	TTY_MINQSIZE	0x00400
    218 #define	TTY_MAXQSIZE	0x10000
    219 int tty_qsize = TTY_MINQSIZE;
    220 
    221 static int
    222 tty_get_qsize(int *qsize, int newsize)
    223 {
    224 	newsize = 1 << ilog2(newsize);	/* Make it a power of two */
    225 
    226 	if (newsize < TTY_MINQSIZE || newsize > TTY_MAXQSIZE)
    227 		return EINVAL;
    228 
    229 	*qsize = newsize;
    230 	return 0;
    231 }
    232 
    233 static int
    234 tty_set_qsize(struct tty *tp, int newsize)
    235 {
    236 	struct clist rawq, canq, outq;
    237 	struct clist orawq, ocanq, ooutq;
    238 
    239 	clalloc(&rawq, newsize, 1);
    240 	clalloc(&canq, newsize, 1);
    241 	clalloc(&outq, newsize, 0);
    242 
    243 	mutex_spin_enter(&tty_lock);
    244 
    245 	if (tp->t_outq.c_cc != 0) {
    246 		mutex_spin_exit(&tty_lock);
    247 		clfree(&rawq);
    248 		clfree(&canq);
    249 		clfree(&outq);
    250 		return EBUSY;
    251 	}
    252 
    253 	orawq = tp->t_rawq;
    254 	ocanq = tp->t_canq;
    255 	ooutq = tp->t_outq;
    256 
    257 	tp->t_qsize = newsize;
    258 	tp->t_rawq = rawq;
    259 	tp->t_canq = canq;
    260 	tp->t_outq = outq;
    261 
    262 	ttsetwater(tp);
    263 
    264 	mutex_spin_exit(&tty_lock);
    265 
    266 	clfree(&orawq);
    267 	clfree(&ocanq);
    268 	clfree(&ooutq);
    269 
    270 	return 0;
    271 }
    272 
    273 static int
    274 sysctl_kern_tty_qsize(SYSCTLFN_ARGS)
    275 {
    276 	int newsize;
    277 	int error;
    278 	struct sysctlnode node;
    279 	node = *rnode;
    280 	node.sysctl_data = &newsize;
    281 
    282 	newsize = tty_qsize;
    283 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
    284 	if (error || newp == NULL)
    285 		return error;
    286 
    287 
    288 	return tty_get_qsize(&tty_qsize, newsize);
    289 }
    290 
    291 static void
    292 sysctl_kern_tty_setup(void)
    293 {
    294 	const struct sysctlnode *rnode, *cnode;
    295 	struct sysctllog *kern_tkstat_sysctllog, *kern_tty_sysctllog;
    296 
    297 	kern_tkstat_sysctllog = NULL;
    298 	sysctl_createv(&kern_tkstat_sysctllog, 0, NULL, NULL,
    299 		       CTLFLAG_PERMANENT,
    300 		       CTLTYPE_NODE, "tkstat",
    301 		       SYSCTL_DESCR("Number of characters sent and and "
    302 				    "received on ttys"),
    303 		       NULL, 0, NULL, 0,
    304 		       CTL_KERN, KERN_TKSTAT, CTL_EOL);
    305 
    306 	sysctl_createv(&kern_tkstat_sysctllog, 0, NULL, NULL,
    307 		       CTLFLAG_PERMANENT,
    308 		       CTLTYPE_QUAD, "nin",
    309 		       SYSCTL_DESCR("Total number of tty input characters"),
    310 		       NULL, 0, &tk_nin, 0,
    311 		       CTL_KERN, KERN_TKSTAT, KERN_TKSTAT_NIN, CTL_EOL);
    312 	sysctl_createv(&kern_tkstat_sysctllog, 0, NULL, NULL,
    313 		       CTLFLAG_PERMANENT,
    314 		       CTLTYPE_QUAD, "nout",
    315 		       SYSCTL_DESCR("Total number of tty output characters"),
    316 		       NULL, 0, &tk_nout, 0,
    317 		       CTL_KERN, KERN_TKSTAT, KERN_TKSTAT_NOUT, CTL_EOL);
    318 	sysctl_createv(&kern_tkstat_sysctllog, 0, NULL, NULL,
    319 		       CTLFLAG_PERMANENT,
    320 		       CTLTYPE_QUAD, "cancc",
    321 		       SYSCTL_DESCR("Number of canonical tty input characters"),
    322 		       NULL, 0, &tk_cancc, 0,
    323 		       CTL_KERN, KERN_TKSTAT, KERN_TKSTAT_CANCC, CTL_EOL);
    324 	sysctl_createv(&kern_tkstat_sysctllog, 0, NULL, NULL,
    325 		       CTLFLAG_PERMANENT,
    326 		       CTLTYPE_QUAD, "rawcc",
    327 		       SYSCTL_DESCR("Number of raw tty input characters"),
    328 		       NULL, 0, &tk_rawcc, 0,
    329 		       CTL_KERN, KERN_TKSTAT, KERN_TKSTAT_RAWCC, CTL_EOL);
    330 
    331 	kern_tty_sysctllog = NULL;
    332 	sysctl_createv(&kern_tty_sysctllog, 0, NULL, &rnode,
    333 		       CTLFLAG_PERMANENT,
    334 		       CTLTYPE_NODE, "tty", NULL,
    335 		       NULL, 0, NULL, 0,
    336 		       CTL_KERN, CTL_CREATE, CTL_EOL);
    337 	sysctl_createv(&kern_tty_sysctllog, 0, &rnode, &cnode,
    338 		       CTLFLAG_PERMANENT | CTLFLAG_READWRITE,
    339 		       CTLTYPE_INT, "qsize",
    340 		       SYSCTL_DESCR("TTY input and output queue size"),
    341 		       sysctl_kern_tty_qsize, 0, &tty_qsize, 0,
    342 		       CTL_CREATE, CTL_EOL);
    343 }
    344 
    345 int
    346 ttyopen(struct tty *tp, int dialout, int nonblock)
    347 {
    348 	int	error;
    349 
    350 	error = 0;
    351 
    352 	mutex_spin_enter(&tty_lock);
    353 
    354 	if (dialout) {
    355 		/*
    356 		 * If the device is already open for non-dialout, fail.
    357 		 * Otherwise, set TS_DIALOUT to block any pending non-dialout
    358 		 * opens.
    359 		 */
    360 		if (ISSET(tp->t_state, TS_ISOPEN) &&
    361 		    !ISSET(tp->t_state, TS_DIALOUT)) {
    362 			error = EBUSY;
    363 			goto out;
    364 		}
    365 		SET(tp->t_state, TS_DIALOUT);
    366 	} else {
    367 		if (!nonblock) {
    368 			/*
    369 			 * Wait for carrier.  Also wait for any dialout
    370 			 * processes to close the tty first.
    371 			 */
    372 			while (ISSET(tp->t_state, TS_DIALOUT) ||
    373 			       !CONNECTED(tp)) {
    374 				tp->t_wopen++;
    375 				error = ttysleep(tp, &tp->t_rawcv, true, 0);
    376 				tp->t_wopen--;
    377 				if (error)
    378 					goto out;
    379 			}
    380 		} else {
    381 			/*
    382 			 * Don't allow a non-blocking non-dialout open if the
    383 			 * device is already open for dialout.
    384 			 */
    385 			if (ISSET(tp->t_state, TS_DIALOUT)) {
    386 				error = EBUSY;
    387 				goto out;
    388 			}
    389 		}
    390 	}
    391 
    392 out:
    393 	mutex_spin_exit(&tty_lock);
    394 	return (error);
    395 }
    396 
    397 /*
    398  * Initial open of tty, or (re)entry to standard tty line discipline.
    399  */
    400 int
    401 ttylopen(dev_t device, struct tty *tp)
    402 {
    403 
    404 	mutex_spin_enter(&tty_lock);
    405 	tp->t_dev = device;
    406 	if (!ISSET(tp->t_state, TS_ISOPEN)) {
    407 		SET(tp->t_state, TS_ISOPEN);
    408 		memset(&tp->t_winsize, 0, sizeof(tp->t_winsize));
    409 		tp->t_flags = 0;
    410 	}
    411 	mutex_spin_exit(&tty_lock);
    412 	if (tp->t_qsize != tty_qsize)
    413 		tty_set_qsize(tp, tty_qsize);
    414 	return (0);
    415 }
    416 
    417 /*
    418  * Handle close() on a tty line: flush and set to initial state,
    419  * bumping generation number so that pending read/write calls
    420  * can detect recycling of the tty.
    421  */
    422 int
    423 ttyclose(struct tty *tp)
    424 {
    425 	extern struct tty *constty;	/* Temporary virtual console. */
    426 	struct session *sess;
    427 
    428 	mutex_spin_enter(&tty_lock);
    429 
    430 	if (constty == tp)
    431 		constty = NULL;
    432 
    433 	ttyflush(tp, FREAD | FWRITE);
    434 
    435 	tp->t_gen++;
    436 	tp->t_pgrp = NULL;
    437 	tp->t_state = 0;
    438 	sess = tp->t_session;
    439 	tp->t_session = NULL;
    440 
    441 	mutex_spin_exit(&tty_lock);
    442 
    443 	if (sess != NULL) {
    444 		mutex_enter(proc_lock);
    445 		/* Releases proc_lock. */
    446 		proc_sessrele(sess);
    447 	}
    448 	return (0);
    449 }
    450 
    451 #define	FLUSHQ(q) {							\
    452 	if ((q)->c_cc)							\
    453 		ndflush(q, (q)->c_cc);					\
    454 }
    455 
    456 /*
    457  * This macro is used in canonical mode input processing, where a read
    458  * request shall not return unless a 'line delimiter' ('\n') or 'break'
    459  * (EOF, EOL, EOL2) character (or a signal) has been received. As EOL2
    460  * is an extension to the POSIX.1 defined set of special characters,
    461  * recognize it only if IEXTEN is set in the set of local flags.
    462  */
    463 #define	TTBREAKC(c, lflg)						\
    464 	((c) == '\n' || (((c) == cc[VEOF] || (c) == cc[VEOL] ||		\
    465 	((c) == cc[VEOL2] && ISSET(lflg, IEXTEN))) && (c) != _POSIX_VDISABLE))
    466 
    467 
    468 
    469 /*
    470  * ttyinput() helper.
    471  * Call with the tty lock held.
    472  */
    473 /* XXX static */ int
    474 ttyinput_wlock(int c, struct tty *tp)
    475 {
    476 	int	iflag, lflag, i, error;
    477 	u_char	*cc;
    478 
    479 	KASSERT(mutex_owned(&tty_lock));
    480 
    481 	/*
    482 	 * If input is pending take it first.
    483 	 */
    484 	lflag = tp->t_lflag;
    485 	if (ISSET(lflag, PENDIN))
    486 		ttypend(tp);
    487 	/*
    488 	 * Gather stats.
    489 	 */
    490 	if (ISSET(lflag, ICANON)) {
    491 		++tk_cancc;
    492 		++tp->t_cancc;
    493 	} else {
    494 		++tk_rawcc;
    495 		++tp->t_rawcc;
    496 	}
    497 	++tk_nin;
    498 
    499 	cc = tp->t_cc;
    500 
    501 	/*
    502 	 * Handle exceptional conditions (break, parity, framing).
    503 	 */
    504 	iflag = tp->t_iflag;
    505 	if ((error = (ISSET(c, TTY_ERRORMASK))) != 0) {
    506 		CLR(c, TTY_ERRORMASK);
    507 		if (ISSET(error, TTY_FE) && c == 0) {		/* Break. */
    508 			if (ISSET(iflag, IGNBRK))
    509 				return (0);
    510 			else if (ISSET(iflag, BRKINT)) {
    511 				ttyflush(tp, FREAD | FWRITE);
    512 				ttysig(tp, TTYSIG_PG1, SIGINT);
    513 				return (0);
    514 			} else if (ISSET(iflag, PARMRK))
    515 				goto parmrk;
    516 		} else if ((ISSET(error, TTY_PE) && ISSET(iflag, INPCK)) ||
    517 		    ISSET(error, TTY_FE)) {
    518 			if (ISSET(iflag, IGNPAR))
    519 				return (0);
    520 			else if (ISSET(iflag, PARMRK)) {
    521  parmrk:			(void)putc(0377 | TTY_QUOTE, &tp->t_rawq);
    522 				(void)putc(0    | TTY_QUOTE, &tp->t_rawq);
    523 				(void)putc(c    | TTY_QUOTE, &tp->t_rawq);
    524 				return (0);
    525 			} else
    526 				c = 0;
    527 		}
    528 	} else if (c == 0377 &&
    529 	    ISSET(iflag, ISTRIP|IGNPAR|INPCK|PARMRK) == (INPCK|PARMRK)) {
    530 		/* "Escape" a valid character of '\377'. */
    531 		(void)putc(0377 | TTY_QUOTE, &tp->t_rawq);
    532 		(void)putc(0377 | TTY_QUOTE, &tp->t_rawq);
    533 		goto endcase;
    534 	}
    535 
    536 	/*
    537 	 * In tandem mode, check high water mark.
    538 	 */
    539 	if (ISSET(iflag, IXOFF) || ISSET(tp->t_cflag, CHWFLOW))
    540 		ttyblock(tp);
    541 	if (!ISSET(tp->t_state, TS_TYPEN) && ISSET(iflag, ISTRIP))
    542 		CLR(c, 0x80);
    543 	if (!ISSET(lflag, EXTPROC)) {
    544 		/*
    545 		 * Check for literal nexting very first
    546 		 */
    547 		if (ISSET(tp->t_state, TS_LNCH)) {
    548 			SET(c, TTY_QUOTE);
    549 			CLR(tp->t_state, TS_LNCH);
    550 		}
    551 		/*
    552 		 * Scan for special characters.  This code
    553 		 * is really just a big case statement with
    554 		 * non-constant cases.  The bottom of the
    555 		 * case statement is labeled ``endcase'', so goto
    556 		 * it after a case match, or similar.
    557 		 */
    558 
    559 		/*
    560 		 * Control chars which aren't controlled
    561 		 * by ICANON, ISIG, or IXON.
    562 		 */
    563 		if (ISSET(lflag, IEXTEN)) {
    564 			if (CCEQ(cc[VLNEXT], c)) {
    565 				if (ISSET(lflag, ECHO)) {
    566 					if (ISSET(lflag, ECHOE)) {
    567 						(void)ttyoutput('^', tp);
    568 						(void)ttyoutput('\b', tp);
    569 					} else
    570 						ttyecho(c, tp);
    571 				}
    572 				SET(tp->t_state, TS_LNCH);
    573 				goto endcase;
    574 			}
    575 			if (CCEQ(cc[VDISCARD], c)) {
    576 				if (ISSET(lflag, FLUSHO))
    577 					CLR(tp->t_lflag, FLUSHO);
    578 				else {
    579 					ttyflush(tp, FWRITE);
    580 					ttyecho(c, tp);
    581 					if (tp->t_rawq.c_cc + tp->t_canq.c_cc)
    582 						ttyretype(tp);
    583 					SET(tp->t_lflag, FLUSHO);
    584 				}
    585 				goto startoutput;
    586 			}
    587 		}
    588 		/*
    589 		 * Signals.
    590 		 */
    591 		if (ISSET(lflag, ISIG)) {
    592 			if (CCEQ(cc[VINTR], c) || CCEQ(cc[VQUIT], c)) {
    593 				if (!ISSET(lflag, NOFLSH))
    594 					ttyflush(tp, FREAD | FWRITE);
    595 				ttyecho(c, tp);
    596 				ttysig(tp, TTYSIG_PG1, CCEQ(cc[VINTR], c) ?
    597 				    SIGINT : SIGQUIT);
    598 				goto endcase;
    599 			}
    600 			if (CCEQ(cc[VSUSP], c)) {
    601 				if (!ISSET(lflag, NOFLSH))
    602 					ttyflush(tp, FREAD);
    603 				ttyecho(c, tp);
    604 				ttysig(tp, TTYSIG_PG1, SIGTSTP);
    605 				goto endcase;
    606 			}
    607 		}
    608 		/*
    609 		 * Handle start/stop characters.
    610 		 */
    611 		if (ISSET(iflag, IXON)) {
    612 			if (CCEQ(cc[VSTOP], c)) {
    613 				if (!ISSET(tp->t_state, TS_TTSTOP)) {
    614 					SET(tp->t_state, TS_TTSTOP);
    615 					cdev_stop(tp, 0);
    616 					return (0);
    617 				}
    618 				if (!CCEQ(cc[VSTART], c))
    619 					return (0);
    620 				/*
    621 				 * if VSTART == VSTOP then toggle
    622 				 */
    623 				goto endcase;
    624 			}
    625 			if (CCEQ(cc[VSTART], c))
    626 				goto restartoutput;
    627 		}
    628 		/*
    629 		 * IGNCR, ICRNL, & INLCR
    630 		 */
    631 		if (c == '\r') {
    632 			if (ISSET(iflag, IGNCR))
    633 				goto endcase;
    634 			else if (ISSET(iflag, ICRNL))
    635 				c = '\n';
    636 		} else if (c == '\n' && ISSET(iflag, INLCR))
    637 			c = '\r';
    638 	}
    639 	if (!ISSET(lflag, EXTPROC) && ISSET(lflag, ICANON)) {
    640 		/*
    641 		 * From here on down canonical mode character
    642 		 * processing takes place.
    643 		 */
    644 		/*
    645 		 * erase (^H / ^?)
    646 		 */
    647 		if (CCEQ(cc[VERASE], c)) {
    648 			if (tp->t_rawq.c_cc)
    649 				ttyrub(unputc(&tp->t_rawq), tp);
    650 			goto endcase;
    651 		}
    652 		/*
    653 		 * kill (^U)
    654 		 */
    655 		if (CCEQ(cc[VKILL], c)) {
    656 			if (ISSET(lflag, ECHOKE) &&
    657 			    tp->t_rawq.c_cc == tp->t_rocount &&
    658 			    !ISSET(lflag, ECHOPRT))
    659 				while (tp->t_rawq.c_cc)
    660 					ttyrub(unputc(&tp->t_rawq), tp);
    661 			else {
    662 				ttyecho(c, tp);
    663 				if (ISSET(lflag, ECHOK) ||
    664 				    ISSET(lflag, ECHOKE))
    665 					ttyecho('\n', tp);
    666 				FLUSHQ(&tp->t_rawq);
    667 				tp->t_rocount = 0;
    668 			}
    669 			CLR(tp->t_state, TS_LOCAL);
    670 			goto endcase;
    671 		}
    672 		/*
    673 		 * Extensions to the POSIX.1 GTI set of functions.
    674 		 */
    675 		if (ISSET(lflag, IEXTEN)) {
    676 			/*
    677 			 * word erase (^W)
    678 			 */
    679 			if (CCEQ(cc[VWERASE], c)) {
    680 				int alt = ISSET(lflag, ALTWERASE);
    681 				int ctype;
    682 
    683 				/*
    684 				 * erase whitespace
    685 				 */
    686 				while ((c = unputc(&tp->t_rawq)) == ' ' ||
    687 				    c == '\t')
    688 					ttyrub(c, tp);
    689 				if (c == -1)
    690 					goto endcase;
    691 				/*
    692 				 * erase last char of word and remember the
    693 				 * next chars type (for ALTWERASE)
    694 				 */
    695 				ttyrub(c, tp);
    696 				c = unputc(&tp->t_rawq);
    697 				if (c == -1)
    698 					goto endcase;
    699 				if (c == ' ' || c == '\t') {
    700 					(void)putc(c, &tp->t_rawq);
    701 					goto endcase;
    702 				}
    703 				ctype = ISALPHA(c);
    704 				/*
    705 				 * erase rest of word
    706 				 */
    707 				do {
    708 					ttyrub(c, tp);
    709 					c = unputc(&tp->t_rawq);
    710 					if (c == -1)
    711 						goto endcase;
    712 				} while (c != ' ' && c != '\t' &&
    713 				    (alt == 0 || ISALPHA(c) == ctype));
    714 				(void)putc(c, &tp->t_rawq);
    715 				goto endcase;
    716 			}
    717 			/*
    718 			 * reprint line (^R)
    719 			 */
    720 			if (CCEQ(cc[VREPRINT], c)) {
    721 				ttyretype(tp);
    722 				goto endcase;
    723 			}
    724 			/*
    725 			 * ^T - kernel info and generate SIGINFO
    726 			 */
    727 			if (CCEQ(cc[VSTATUS], c)) {
    728 				ttysig(tp, TTYSIG_PG1, SIGINFO);
    729 				goto endcase;
    730 			}
    731 		}
    732 	}
    733 	/*
    734 	 * Check for input buffer overflow
    735 	 */
    736 	if (tp->t_rawq.c_cc + tp->t_canq.c_cc >= TTYHOG) {
    737 		if (ISSET(iflag, IMAXBEL)) {
    738 			if (tp->t_outq.c_cc < tp->t_hiwat)
    739 				(void)ttyoutput(CTRL('g'), tp);
    740 		} else
    741 			ttyflush(tp, FREAD | FWRITE);
    742 		goto endcase;
    743 	}
    744 	/*
    745 	 * Put data char in q for user and
    746 	 * wakeup on seeing a line delimiter.
    747 	 */
    748 	if (putc(c, &tp->t_rawq) >= 0) {
    749 		if (!ISSET(lflag, ICANON)) {
    750 			ttwakeup(tp);
    751 			ttyecho(c, tp);
    752 			goto endcase;
    753 		}
    754 		if (TTBREAKC(c, lflag)) {
    755 			tp->t_rocount = 0;
    756 			catq(&tp->t_rawq, &tp->t_canq);
    757 			ttwakeup(tp);
    758 		} else if (tp->t_rocount++ == 0)
    759 			tp->t_rocol = tp->t_column;
    760 		if (ISSET(tp->t_state, TS_ERASE)) {
    761 			/*
    762 			 * end of prterase \.../
    763 			 */
    764 			CLR(tp->t_state, TS_ERASE);
    765 			(void)ttyoutput('/', tp);
    766 		}
    767 		i = tp->t_column;
    768 		ttyecho(c, tp);
    769 		if (CCEQ(cc[VEOF], c) && ISSET(lflag, ECHO)) {
    770 			/*
    771 			 * Place the cursor over the '^' of the ^D.
    772 			 */
    773 			i = min(2, tp->t_column - i);
    774 			while (i > 0) {
    775 				(void)ttyoutput('\b', tp);
    776 				i--;
    777 			}
    778 		}
    779 	}
    780  endcase:
    781 	/*
    782 	 * IXANY means allow any character to restart output.
    783 	 */
    784 	if (ISSET(tp->t_state, TS_TTSTOP) &&
    785 	    !ISSET(iflag, IXANY) && cc[VSTART] != cc[VSTOP]) {
    786 		return (0);
    787 	}
    788  restartoutput:
    789 	CLR(tp->t_lflag, FLUSHO);
    790 	CLR(tp->t_state, TS_TTSTOP);
    791  startoutput:
    792 	return (ttstart(tp));
    793 }
    794 
    795 /*
    796  * Process input of a single character received on a tty.
    797  *
    798  * XXX - this is a hack, all drivers must changed to acquire the
    799  *	 lock before calling linesw->l_rint()
    800  */
    801 int
    802 ttyinput(int c, struct tty *tp)
    803 {
    804 	int error;
    805 
    806 	/*
    807 	 * Unless the receiver is enabled, drop incoming data.
    808 	 */
    809 	if (!ISSET(tp->t_cflag, CREAD))
    810 		return (0);
    811 
    812 	mutex_spin_enter(&tty_lock);
    813 	error = ttyinput_wlock(c, tp);
    814 	mutex_spin_exit(&tty_lock);
    815 
    816 	return (error);
    817 }
    818 
    819 /*
    820  * Output a single character on a tty, doing output processing
    821  * as needed (expanding tabs, newline processing, etc.).
    822  * Returns < 0 if succeeds, otherwise returns char to resend.
    823  * Must be recursive.
    824  *
    825  * Call with tty lock held.
    826  */
    827 int
    828 ttyoutput(int c, struct tty *tp)
    829 {
    830 	long	oflag;
    831 	int	col, notout;
    832 
    833 	KASSERT(mutex_owned(&tty_lock));
    834 
    835 	oflag = tp->t_oflag;
    836 	if (!ISSET(oflag, OPOST)) {
    837 		tk_nout++;
    838 		tp->t_outcc++;
    839 		if (!ISSET(tp->t_lflag, FLUSHO) && putc(c, &tp->t_outq))
    840 			return (c);
    841 		return (-1);
    842 	}
    843 	/*
    844 	 * Do tab expansion if OXTABS is set.  Special case if we do external
    845 	 * processing, we don't do the tab expansion because we'll probably
    846 	 * get it wrong.  If tab expansion needs to be done, let it happen
    847 	 * externally.
    848 	 */
    849 	CLR(c, ~TTY_CHARMASK);
    850 	if (c == '\t' &&
    851 	    ISSET(oflag, OXTABS) && !ISSET(tp->t_lflag, EXTPROC)) {
    852 		c = 8 - (tp->t_column & 7);
    853 		if (ISSET(tp->t_lflag, FLUSHO)) {
    854 			notout = 0;
    855 		} else {
    856 			notout = b_to_q("        ", c, &tp->t_outq);
    857 			c -= notout;
    858 			tk_nout += c;
    859 			tp->t_outcc += c;
    860 		}
    861 		tp->t_column += c;
    862 		return (notout ? '\t' : -1);
    863 	}
    864 	if (c == CEOT && ISSET(oflag, ONOEOT))
    865 		return (-1);
    866 
    867 	/*
    868 	 * Newline translation: if ONLCR is set,
    869 	 * translate newline into "\r\n".
    870 	 */
    871 	if (c == '\n' && ISSET(tp->t_oflag, ONLCR)) {
    872 		tk_nout++;
    873 		tp->t_outcc++;
    874 		if (!ISSET(tp->t_lflag, FLUSHO) && putc('\r', &tp->t_outq))
    875 			return (c);
    876 	}
    877 	/* If OCRNL is set, translate "\r" into "\n". */
    878 	else if (c == '\r' && ISSET(tp->t_oflag, OCRNL))
    879 		c = '\n';
    880 	/* If ONOCR is set, don't transmit CRs when on column 0. */
    881 	else if (c == '\r' && ISSET(tp->t_oflag, ONOCR) && tp->t_column == 0)
    882 		return (-1);
    883 
    884 	tk_nout++;
    885 	tp->t_outcc++;
    886 	if (!ISSET(tp->t_lflag, FLUSHO) && putc(c, &tp->t_outq))
    887 		return (c);
    888 
    889 	col = tp->t_column;
    890 	switch (CCLASS(c)) {
    891 	case BACKSPACE:
    892 		if (col > 0)
    893 			--col;
    894 		break;
    895 	case CONTROL:
    896 		break;
    897 	case NEWLINE:
    898 		if (ISSET(tp->t_oflag, ONLCR | ONLRET))
    899 			col = 0;
    900 		break;
    901 	case RETURN:
    902 		col = 0;
    903 		break;
    904 	case ORDINARY:
    905 		++col;
    906 		break;
    907 	case TAB:
    908 		col = (col + 8) & ~7;
    909 		break;
    910 	}
    911 	tp->t_column = col;
    912 	return (-1);
    913 }
    914 
    915 /*
    916  * Ioctls for all tty devices.  Called after line-discipline specific ioctl
    917  * has been called to do discipline-specific functions and/or reject any
    918  * of these ioctl commands.
    919  */
    920 /* ARGSUSED */
    921 int
    922 ttioctl(struct tty *tp, u_long cmd, void *data, int flag, struct lwp *l)
    923 {
    924 	extern struct tty *constty;	/* Temporary virtual console. */
    925 	struct proc *p;
    926 	struct linesw	*lp;
    927 	int		s, error;
    928 	struct pathbuf *pb;
    929 	struct nameidata nd;
    930 	char		infobuf[200];
    931 
    932 	KASSERT(l != NULL);
    933 	p = l->l_proc;
    934 
    935 	/* If the ioctl involves modification, hang if in the background. */
    936 	switch (cmd) {
    937 	case  TIOCFLUSH:
    938 	case  TIOCDRAIN:
    939 	case  TIOCSBRK:
    940 	case  TIOCCBRK:
    941 	case  TIOCSTART:
    942 	case  TIOCSETA:
    943 	case  TIOCSETD:
    944 	case  TIOCSLINED:
    945 	case  TIOCSETAF:
    946 	case  TIOCSETAW:
    947 #ifdef notdef
    948 	case  TIOCSPGRP:
    949 	case  FIOSETOWN:
    950 #endif
    951 	case  TIOCSTAT:
    952 	case  TIOCSTI:
    953 	case  TIOCSWINSZ:
    954 	case  TIOCSQSIZE:
    955 	case  TIOCLBIC:
    956 	case  TIOCLBIS:
    957 	case  TIOCLSET:
    958 	case  TIOCSETC:
    959 	case OTIOCSETD:
    960 	case  TIOCSETN:
    961 	case  TIOCSETP:
    962 	case  TIOCSLTC:
    963 		mutex_spin_enter(&tty_lock);
    964 		while (isbackground(curproc, tp) &&
    965 		    p->p_pgrp->pg_jobc && (p->p_lflag & PL_PPWAIT) == 0 &&
    966 		    !sigismasked(l, SIGTTOU)) {
    967 			mutex_spin_exit(&tty_lock);
    968 
    969 			mutex_enter(proc_lock);
    970 			pgsignal(p->p_pgrp, SIGTTOU, 1);
    971 			mutex_exit(proc_lock);
    972 
    973 			mutex_spin_enter(&tty_lock);
    974 			error = ttypause(tp, hz);
    975 			if (error) {
    976 				mutex_spin_exit(&tty_lock);
    977 				return (error);
    978 			}
    979 		}
    980 		mutex_spin_exit(&tty_lock);
    981 		break;
    982 	}
    983 
    984 	switch (cmd) {			/* Process the ioctl. */
    985 	case FIOASYNC:			/* set/clear async i/o */
    986 		mutex_spin_enter(&tty_lock);
    987 		if (*(int *)data)
    988 			SET(tp->t_state, TS_ASYNC);
    989 		else
    990 			CLR(tp->t_state, TS_ASYNC);
    991 		mutex_spin_exit(&tty_lock);
    992 		break;
    993 	case FIONBIO:			/* set/clear non-blocking i/o */
    994 		break;			/* XXX: delete. */
    995 	case FIONREAD:			/* get # bytes to read */
    996 		mutex_spin_enter(&tty_lock);
    997 		*(int *)data = ttnread(tp);
    998 		mutex_spin_exit(&tty_lock);
    999 		break;
   1000 	case FIONWRITE:			/* get # bytes to written & unsent */
   1001 		mutex_spin_enter(&tty_lock);
   1002 		*(int *)data = tp->t_outq.c_cc;
   1003 		mutex_spin_exit(&tty_lock);
   1004 		break;
   1005 	case FIONSPACE:			/* get # bytes to written & unsent */
   1006 		mutex_spin_enter(&tty_lock);
   1007 		*(int *)data = tp->t_outq.c_cn - tp->t_outq.c_cc;
   1008 		mutex_spin_exit(&tty_lock);
   1009 		break;
   1010 	case TIOCEXCL:			/* set exclusive use of tty */
   1011 		mutex_spin_enter(&tty_lock);
   1012 		SET(tp->t_state, TS_XCLUDE);
   1013 		mutex_spin_exit(&tty_lock);
   1014 		break;
   1015 	case TIOCFLUSH: {		/* flush buffers */
   1016 		int flags = *(int *)data;
   1017 
   1018 		if (flags == 0)
   1019 			flags = FREAD | FWRITE;
   1020 		else
   1021 			flags &= FREAD | FWRITE;
   1022 		mutex_spin_enter(&tty_lock);
   1023 		ttyflush(tp, flags);
   1024 		mutex_spin_exit(&tty_lock);
   1025 		break;
   1026 	}
   1027 	case TIOCCONS:			/* become virtual console */
   1028 		if (*(int *)data) {
   1029 			if (constty && constty != tp &&
   1030 			    ISSET(constty->t_state, TS_CARR_ON | TS_ISOPEN) ==
   1031 			    (TS_CARR_ON | TS_ISOPEN))
   1032 				return EBUSY;
   1033 
   1034 			pb = pathbuf_create("/dev/console");
   1035 			if (pb == NULL) {
   1036 				return ENOMEM;
   1037 			}
   1038 			NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, pb);
   1039 			if ((error = namei(&nd)) != 0) {
   1040 				pathbuf_destroy(pb);
   1041 				return error;
   1042 			}
   1043 			error = VOP_ACCESS(nd.ni_vp, VREAD, l->l_cred);
   1044 			vput(nd.ni_vp);
   1045 			pathbuf_destroy(pb);
   1046 			if (error)
   1047 				return error;
   1048 
   1049 			constty = tp;
   1050 		} else if (tp == constty)
   1051 			constty = NULL;
   1052 		break;
   1053 	case TIOCDRAIN:			/* wait till output drained */
   1054 		if ((error = ttywait(tp)) != 0)
   1055 			return (error);
   1056 		break;
   1057 	case TIOCGETA: {		/* get termios struct */
   1058 		struct termios *t = (struct termios *)data;
   1059 
   1060 		memcpy(t, &tp->t_termios, sizeof(struct termios));
   1061 		break;
   1062 	}
   1063 	case TIOCGETD:			/* get line discipline (old) */
   1064 		*(int *)data = tp->t_linesw->l_no;
   1065 		break;
   1066 	case TIOCGLINED:		/* get line discipline (new) */
   1067 		(void)strncpy((char *)data, tp->t_linesw->l_name,
   1068 		    TTLINEDNAMELEN - 1);
   1069 		break;
   1070 	case TIOCGWINSZ:		/* get window size */
   1071 		*(struct winsize *)data = tp->t_winsize;
   1072 		break;
   1073 	case TIOCGQSIZE:
   1074 		*(int *)data = tp->t_qsize;
   1075 		break;
   1076 	case FIOGETOWN:
   1077 		mutex_enter(proc_lock);
   1078 		if (tp->t_session != NULL && !isctty(p, tp)) {
   1079 			mutex_exit(proc_lock);
   1080 			return (ENOTTY);
   1081 		}
   1082 		*(int *)data = tp->t_pgrp ? -tp->t_pgrp->pg_id : 0;
   1083 		mutex_exit(proc_lock);
   1084 		break;
   1085 	case TIOCGPGRP:			/* get pgrp of tty */
   1086 		mutex_enter(proc_lock);
   1087 		if (!isctty(p, tp)) {
   1088 			mutex_exit(proc_lock);
   1089 			return (ENOTTY);
   1090 		}
   1091 		*(int *)data = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PGID;
   1092 		mutex_exit(proc_lock);
   1093 		break;
   1094 	case TIOCGSID:			/* get sid of tty */
   1095 		mutex_enter(proc_lock);
   1096 		if (!isctty(p, tp)) {
   1097 			mutex_exit(proc_lock);
   1098 			return (ENOTTY);
   1099 		}
   1100 		*(int *)data = tp->t_session->s_sid;
   1101 		mutex_exit(proc_lock);
   1102 		break;
   1103 #ifdef TIOCHPCL
   1104 	case TIOCHPCL:			/* hang up on last close */
   1105 		mutex_spin_enter(&tty_lock);
   1106 		SET(tp->t_cflag, HUPCL);
   1107 		mutex_spin_exit(&tty_lock);
   1108 		break;
   1109 #endif
   1110 	case TIOCNXCL:			/* reset exclusive use of tty */
   1111 		mutex_spin_enter(&tty_lock);
   1112 		CLR(tp->t_state, TS_XCLUDE);
   1113 		mutex_spin_exit(&tty_lock);
   1114 		break;
   1115 	case TIOCOUTQ:			/* output queue size */
   1116 		*(int *)data = tp->t_outq.c_cc;
   1117 		break;
   1118 	case TIOCSETA:			/* set termios struct */
   1119 	case TIOCSETAW:			/* drain output, set */
   1120 	case TIOCSETAF: {		/* drn out, fls in, set */
   1121 		struct termios *t = (struct termios *)data;
   1122 
   1123 		if (cmd == TIOCSETAW || cmd == TIOCSETAF) {
   1124 			if ((error = ttywait(tp)) != 0)
   1125 				return (error);
   1126 
   1127 			if (cmd == TIOCSETAF) {
   1128 				mutex_spin_enter(&tty_lock);
   1129 				ttyflush(tp, FREAD);
   1130 				mutex_spin_exit(&tty_lock);
   1131 			}
   1132 		}
   1133 
   1134 		s = spltty();
   1135 		/*
   1136 		 * XXXSMP - some drivers call back on us from t_param(), so
   1137 		 *	    don't take the tty spin lock here.
   1138 		 *	    require t_param() to unlock upon callback?
   1139 		 */
   1140 		/* wanted here: mutex_spin_enter(&tty_lock); */
   1141 		if (!ISSET(t->c_cflag, CIGNORE)) {
   1142 			/*
   1143 			 * Set device hardware.
   1144 			 */
   1145 			if (tp->t_param && (error = (*tp->t_param)(tp, t))) {
   1146 				/* wanted here: mutex_spin_exit(&tty_lock); */
   1147 				splx(s);
   1148 				return (error);
   1149 			} else {
   1150 				tp->t_cflag = t->c_cflag;
   1151 				tp->t_ispeed = t->c_ispeed;
   1152 				tp->t_ospeed = t->c_ospeed;
   1153 				if (t->c_ospeed == 0)
   1154 					ttysig(tp, TTYSIG_LEADER, SIGHUP);
   1155 			}
   1156 			ttsetwater(tp);
   1157 		}
   1158 
   1159 		/* delayed lock acquiring */
   1160 		mutex_spin_enter(&tty_lock);
   1161 		if (cmd != TIOCSETAF) {
   1162 			if (ISSET(t->c_lflag, ICANON) !=
   1163 			    ISSET(tp->t_lflag, ICANON)) {
   1164 				if (ISSET(t->c_lflag, ICANON)) {
   1165 					SET(tp->t_lflag, PENDIN);
   1166 					ttwakeup(tp);
   1167 				} else {
   1168 					struct clist tq;
   1169 
   1170 					catq(&tp->t_rawq, &tp->t_canq);
   1171 					tq = tp->t_rawq;
   1172 					tp->t_rawq = tp->t_canq;
   1173 					tp->t_canq = tq;
   1174 					CLR(tp->t_lflag, PENDIN);
   1175 				}
   1176 			}
   1177 		}
   1178 		tp->t_iflag = t->c_iflag;
   1179 		tp->t_oflag = t->c_oflag;
   1180 		/*
   1181 		 * Make the EXTPROC bit read only.
   1182 		 */
   1183 		if (ISSET(tp->t_lflag, EXTPROC))
   1184 			SET(t->c_lflag, EXTPROC);
   1185 		else
   1186 			CLR(t->c_lflag, EXTPROC);
   1187 		tp->t_lflag = t->c_lflag | ISSET(tp->t_lflag, PENDIN);
   1188 		memcpy(tp->t_cc, t->c_cc, sizeof(t->c_cc));
   1189 		mutex_spin_exit(&tty_lock);
   1190 		splx(s);
   1191 		break;
   1192 	}
   1193 	case TIOCSETD:			/* set line discipline (old) */
   1194 		lp = ttyldisc_lookup_bynum(*(int *)data);
   1195 		goto setldisc;
   1196 
   1197 	case TIOCSLINED: {		/* set line discipline (new) */
   1198 		char *name = (char *)data;
   1199 		dev_t device;
   1200 
   1201 		/* Null terminate to prevent buffer overflow */
   1202 		name[TTLINEDNAMELEN - 1] = '\0';
   1203 		lp = ttyldisc_lookup(name);
   1204  setldisc:
   1205 		if (lp == NULL)
   1206 			return (ENXIO);
   1207 
   1208 		if (lp != tp->t_linesw) {
   1209 			device = tp->t_dev;
   1210 			s = spltty();
   1211 			(*tp->t_linesw->l_close)(tp, flag);
   1212 			error = (*lp->l_open)(device, tp);
   1213 			if (error) {
   1214 				(void)(*tp->t_linesw->l_open)(device, tp);
   1215 				splx(s);
   1216 				ttyldisc_release(lp);
   1217 				return (error);
   1218 			}
   1219 			ttyldisc_release(tp->t_linesw);
   1220 			tp->t_linesw = lp;
   1221 			splx(s);
   1222 		} else {
   1223 			/* Drop extra reference. */
   1224 			ttyldisc_release(lp);
   1225 		}
   1226 		break;
   1227 	}
   1228 	case TIOCSTART:			/* start output, like ^Q */
   1229 		mutex_spin_enter(&tty_lock);
   1230 		if (ISSET(tp->t_state, TS_TTSTOP) ||
   1231 		    ISSET(tp->t_lflag, FLUSHO)) {
   1232 			CLR(tp->t_lflag, FLUSHO);
   1233 			CLR(tp->t_state, TS_TTSTOP);
   1234 			ttstart(tp);
   1235 		}
   1236 		mutex_spin_exit(&tty_lock);
   1237 		break;
   1238 	case TIOCSTI:			/* simulate terminal input */
   1239 		if (kauth_authorize_device_tty(l->l_cred, KAUTH_DEVICE_TTY_STI,
   1240 		    tp) != 0) {
   1241 			if (!ISSET(flag, FREAD))
   1242 				return (EPERM);
   1243 			if (!isctty(p, tp))
   1244 				return (EACCES);
   1245 		}
   1246 		(*tp->t_linesw->l_rint)(*(u_char *)data, tp);
   1247 		break;
   1248 	case TIOCSTOP:			/* stop output, like ^S */
   1249 	{
   1250 		mutex_spin_enter(&tty_lock);
   1251 		if (!ISSET(tp->t_state, TS_TTSTOP)) {
   1252 			SET(tp->t_state, TS_TTSTOP);
   1253 			cdev_stop(tp, 0);
   1254 		}
   1255 		mutex_spin_exit(&tty_lock);
   1256 		break;
   1257 	}
   1258 	case TIOCSCTTY:			/* become controlling tty */
   1259 		mutex_enter(proc_lock);
   1260 		mutex_spin_enter(&tty_lock);
   1261 
   1262 		/* Session ctty vnode pointer set in vnode layer. */
   1263 		if (!SESS_LEADER(p) ||
   1264 		    ((p->p_session->s_ttyvp || tp->t_session) &&
   1265 		    (tp->t_session != p->p_session))) {
   1266 			mutex_spin_exit(&tty_lock);
   1267 			mutex_exit(proc_lock);
   1268 			return (EPERM);
   1269 		}
   1270 
   1271 		/*
   1272 		 * `p_session' acquires a reference.
   1273 		 * But note that if `t_session' is set at this point,
   1274 		 * it must equal `p_session', in which case the session
   1275 		 * already has the correct reference count.
   1276 		 */
   1277 		if (tp->t_session == NULL) {
   1278 			proc_sesshold(p->p_session);
   1279 		}
   1280 		tp->t_session = p->p_session;
   1281 		tp->t_pgrp = p->p_pgrp;
   1282 		p->p_session->s_ttyp = tp;
   1283 		p->p_lflag |= PL_CONTROLT;
   1284 		mutex_spin_exit(&tty_lock);
   1285 		mutex_exit(proc_lock);
   1286 		break;
   1287 	case FIOSETOWN: {		/* set pgrp of tty */
   1288 		pid_t pgid = *(pid_t *)data;
   1289 		struct pgrp *pgrp;
   1290 
   1291 		mutex_enter(proc_lock);
   1292 		if (tp->t_session != NULL && !isctty(p, tp)) {
   1293 			mutex_exit(proc_lock);
   1294 			return (ENOTTY);
   1295 		}
   1296 
   1297 		if (pgid < 0) {
   1298 			pgrp = pgrp_find(-pgid);
   1299 			if (pgrp == NULL) {
   1300 				mutex_exit(proc_lock);
   1301 				return (EINVAL);
   1302 			}
   1303 		} else {
   1304 			struct proc *p1;
   1305 			p1 = proc_find(pgid);
   1306 			if (!p1) {
   1307 				mutex_exit(proc_lock);
   1308 				return (ESRCH);
   1309 			}
   1310 			pgrp = p1->p_pgrp;
   1311 		}
   1312 
   1313 		if (pgrp->pg_session != p->p_session) {
   1314 			mutex_exit(proc_lock);
   1315 			return (EPERM);
   1316 		}
   1317 		mutex_spin_enter(&tty_lock);
   1318 		tp->t_pgrp = pgrp;
   1319 		mutex_spin_exit(&tty_lock);
   1320 		mutex_exit(proc_lock);
   1321 		break;
   1322 	}
   1323 	case TIOCSPGRP: {		/* set pgrp of tty */
   1324 		struct pgrp *pgrp;
   1325 		pid_t pgid = *(pid_t *)data;
   1326 
   1327 		if (pgid == NO_PGID)
   1328 			return EINVAL;
   1329 
   1330 		mutex_enter(proc_lock);
   1331 		if (!isctty(p, tp)) {
   1332 			mutex_exit(proc_lock);
   1333 			return (ENOTTY);
   1334 		}
   1335 		pgrp = pgrp_find(pgid);
   1336 		if (pgrp == NULL || pgrp->pg_session != p->p_session) {
   1337 			mutex_exit(proc_lock);
   1338 			return (EPERM);
   1339 		}
   1340 		mutex_spin_enter(&tty_lock);
   1341 		tp->t_pgrp = pgrp;
   1342 		mutex_spin_exit(&tty_lock);
   1343 		mutex_exit(proc_lock);
   1344 		break;
   1345 	}
   1346 	case TIOCSTAT:			/* get load avg stats */
   1347 		mutex_enter(proc_lock);
   1348 		ttygetinfo(tp, 0, infobuf, sizeof(infobuf));
   1349 		mutex_exit(proc_lock);
   1350 
   1351 		mutex_spin_enter(&tty_lock);
   1352 		ttyputinfo(tp, infobuf);
   1353 		mutex_spin_exit(&tty_lock);
   1354 		break;
   1355 	case TIOCSWINSZ:		/* set window size */
   1356 		mutex_spin_enter(&tty_lock);
   1357 		if (memcmp((void *)&tp->t_winsize, data,
   1358 		    sizeof(struct winsize))) {
   1359 			tp->t_winsize = *(struct winsize *)data;
   1360 			ttysig(tp, TTYSIG_PG1, SIGWINCH);
   1361 		}
   1362 		mutex_spin_exit(&tty_lock);
   1363 		break;
   1364 	case TIOCSQSIZE:
   1365 		if ((error = tty_get_qsize(&s, *(int *)data)) == 0 &&
   1366 		    s != tp->t_qsize)
   1367 			error = tty_set_qsize(tp, s);
   1368 		return error;
   1369 	default:
   1370 #ifdef COMPAT_60
   1371 		error = compat_60_ttioctl(tp, cmd, data, flag, l);
   1372 		if (error != EPASSTHROUGH)
   1373 			return error;
   1374 #endif /* COMPAT_60 */
   1375 		/* We may have to load the compat module for this. */
   1376 		for (;;) {
   1377 			rw_enter(&ttcompat_lock, RW_READER);
   1378 			if (ttcompatvec != NULL) {
   1379 				break;
   1380 			}
   1381 			rw_exit(&ttcompat_lock);
   1382 			(void)module_autoload("compat", MODULE_CLASS_ANY);
   1383 			if (ttcompatvec == NULL) {
   1384 				return EPASSTHROUGH;
   1385 			}
   1386 		}
   1387 		error = (*ttcompatvec)(tp, cmd, data, flag, l);
   1388 		rw_exit(&ttcompat_lock);
   1389 		return error;
   1390 	}
   1391 	return (0);
   1392 }
   1393 
   1394 int
   1395 ttpoll(struct tty *tp, int events, struct lwp *l)
   1396 {
   1397 	int	revents;
   1398 
   1399 	revents = 0;
   1400 	mutex_spin_enter(&tty_lock);
   1401 	if (events & (POLLIN | POLLRDNORM))
   1402 		if (ttnread(tp) > 0)
   1403 			revents |= events & (POLLIN | POLLRDNORM);
   1404 
   1405 	if (events & (POLLOUT | POLLWRNORM))
   1406 		if (tp->t_outq.c_cc <= tp->t_lowat)
   1407 			revents |= events & (POLLOUT | POLLWRNORM);
   1408 
   1409 	if (events & POLLHUP)
   1410 		if (!CONNECTED(tp))
   1411 			revents |= POLLHUP;
   1412 
   1413 	if (revents == 0) {
   1414 		if (events & (POLLIN | POLLHUP | POLLRDNORM))
   1415 			selrecord(l, &tp->t_rsel);
   1416 
   1417 		if (events & (POLLOUT | POLLWRNORM))
   1418 			selrecord(l, &tp->t_wsel);
   1419 	}
   1420 
   1421 	mutex_spin_exit(&tty_lock);
   1422 
   1423 	return (revents);
   1424 }
   1425 
   1426 static void
   1427 filt_ttyrdetach(struct knote *kn)
   1428 {
   1429 	struct tty	*tp;
   1430 
   1431 	tp = kn->kn_hook;
   1432 	mutex_spin_enter(&tty_lock);
   1433 	SLIST_REMOVE(&tp->t_rsel.sel_klist, kn, knote, kn_selnext);
   1434 	mutex_spin_exit(&tty_lock);
   1435 }
   1436 
   1437 static int
   1438 filt_ttyread(struct knote *kn, long hint)
   1439 {
   1440 	struct tty	*tp;
   1441 
   1442 	tp = kn->kn_hook;
   1443 	if ((hint & NOTE_SUBMIT) == 0)
   1444 		mutex_spin_enter(&tty_lock);
   1445 	kn->kn_data = ttnread(tp);
   1446 	if ((hint & NOTE_SUBMIT) == 0)
   1447 		mutex_spin_exit(&tty_lock);
   1448 	return (kn->kn_data > 0);
   1449 }
   1450 
   1451 static void
   1452 filt_ttywdetach(struct knote *kn)
   1453 {
   1454 	struct tty	*tp;
   1455 
   1456 	tp = kn->kn_hook;
   1457 	mutex_spin_enter(&tty_lock);
   1458 	SLIST_REMOVE(&tp->t_wsel.sel_klist, kn, knote, kn_selnext);
   1459 	mutex_spin_exit(&tty_lock);
   1460 }
   1461 
   1462 static int
   1463 filt_ttywrite(struct knote *kn, long hint)
   1464 {
   1465 	struct tty	*tp;
   1466 	int		canwrite;
   1467 
   1468 	tp = kn->kn_hook;
   1469 	if ((hint & NOTE_SUBMIT) == 0)
   1470 		mutex_spin_enter(&tty_lock);
   1471 	kn->kn_data = tp->t_outq.c_cn - tp->t_outq.c_cc;
   1472 	canwrite = (tp->t_outq.c_cc <= tp->t_lowat) && CONNECTED(tp);
   1473 	if ((hint & NOTE_SUBMIT) == 0)
   1474 		mutex_spin_exit(&tty_lock);
   1475 	return (canwrite);
   1476 }
   1477 
   1478 static const struct filterops ttyread_filtops =
   1479 	{ 1, NULL, filt_ttyrdetach, filt_ttyread };
   1480 static const struct filterops ttywrite_filtops =
   1481 	{ 1, NULL, filt_ttywdetach, filt_ttywrite };
   1482 
   1483 int
   1484 ttykqfilter(dev_t dev, struct knote *kn)
   1485 {
   1486 	struct tty	*tp;
   1487 	struct klist	*klist;
   1488 
   1489 	if ((tp = cdev_tty(dev)) == NULL)
   1490 		return (ENXIO);
   1491 
   1492 	switch (kn->kn_filter) {
   1493 	case EVFILT_READ:
   1494 		klist = &tp->t_rsel.sel_klist;
   1495 		kn->kn_fop = &ttyread_filtops;
   1496 		break;
   1497 	case EVFILT_WRITE:
   1498 		klist = &tp->t_wsel.sel_klist;
   1499 		kn->kn_fop = &ttywrite_filtops;
   1500 		break;
   1501 	default:
   1502 		return EINVAL;
   1503 	}
   1504 
   1505 	kn->kn_hook = tp;
   1506 
   1507 	mutex_spin_enter(&tty_lock);
   1508 	SLIST_INSERT_HEAD(klist, kn, kn_selnext);
   1509 	mutex_spin_exit(&tty_lock);
   1510 
   1511 	return (0);
   1512 }
   1513 
   1514 /*
   1515  * Find the number of chars ready to be read from this tty.
   1516  * Call with the tty lock held.
   1517  */
   1518 static int
   1519 ttnread(struct tty *tp)
   1520 {
   1521 	int	nread;
   1522 
   1523 	KASSERT(mutex_owned(&tty_lock));
   1524 
   1525 	if (ISSET(tp->t_lflag, PENDIN))
   1526 		ttypend(tp);
   1527 	nread = tp->t_canq.c_cc;
   1528 	if (!ISSET(tp->t_lflag, ICANON)) {
   1529 		nread += tp->t_rawq.c_cc;
   1530 		if (nread < tp->t_cc[VMIN] && !tp->t_cc[VTIME])
   1531 			nread = 0;
   1532 	}
   1533 	return (nread);
   1534 }
   1535 
   1536 /*
   1537  * Wait for output to drain.
   1538  */
   1539 int
   1540 ttywait(struct tty *tp)
   1541 {
   1542 	int	error;
   1543 
   1544 	error = 0;
   1545 
   1546 	mutex_spin_enter(&tty_lock);
   1547 	while ((tp->t_outq.c_cc || ISSET(tp->t_state, TS_BUSY)) &&
   1548 	    CONNECTED(tp) && tp->t_oproc) {
   1549 		(*tp->t_oproc)(tp);
   1550 		error = ttysleep(tp, &tp->t_outcv, true, 0);
   1551 		if (error)
   1552 			break;
   1553 	}
   1554 	mutex_spin_exit(&tty_lock);
   1555 
   1556 	return (error);
   1557 }
   1558 
   1559 /*
   1560  * Flush if successfully wait.
   1561  */
   1562 int
   1563 ttywflush(struct tty *tp)
   1564 {
   1565 	int	error;
   1566 
   1567 	if ((error = ttywait(tp)) == 0) {
   1568 		mutex_spin_enter(&tty_lock);
   1569 		ttyflush(tp, FREAD);
   1570 		mutex_spin_exit(&tty_lock);
   1571 	}
   1572 	return (error);
   1573 }
   1574 
   1575 /*
   1576  * Flush tty read and/or write queues, notifying anyone waiting.
   1577  * Call with the tty lock held.
   1578  */
   1579 void
   1580 ttyflush(struct tty *tp, int rw)
   1581 {
   1582 
   1583 	KASSERT(mutex_owned(&tty_lock));
   1584 
   1585 	if (rw & FREAD) {
   1586 		FLUSHQ(&tp->t_canq);
   1587 		FLUSHQ(&tp->t_rawq);
   1588 		tp->t_rocount = 0;
   1589 		tp->t_rocol = 0;
   1590 		CLR(tp->t_state, TS_LOCAL);
   1591 		ttwakeup(tp);
   1592 	}
   1593 	if (rw & FWRITE) {
   1594 		CLR(tp->t_state, TS_TTSTOP);
   1595 		cdev_stop(tp, rw);
   1596 		FLUSHQ(&tp->t_outq);
   1597 		cv_broadcast(&tp->t_outcv);
   1598 		selnotify(&tp->t_wsel, 0, NOTE_SUBMIT);
   1599 	}
   1600 }
   1601 
   1602 /*
   1603  * Copy in the default termios characters.
   1604  */
   1605 void
   1606 ttychars(struct tty *tp)
   1607 {
   1608 
   1609 	memcpy(tp->t_cc, ttydefchars, sizeof(ttydefchars));
   1610 }
   1611 
   1612 /*
   1613  * Send stop character on input overflow.
   1614  * Call with the tty lock held.
   1615  */
   1616 static void
   1617 ttyblock(struct tty *tp)
   1618 {
   1619 	int	total;
   1620 
   1621 	KASSERT(mutex_owned(&tty_lock));
   1622 
   1623 	total = tp->t_rawq.c_cc + tp->t_canq.c_cc;
   1624 	if (tp->t_rawq.c_cc > TTYHOG) {
   1625 		ttyflush(tp, FREAD | FWRITE);
   1626 		CLR(tp->t_state, TS_TBLOCK);
   1627 	}
   1628 	/*
   1629 	 * Block further input iff: current input > threshold
   1630 	 * AND input is available to user program.
   1631 	 */
   1632 	if (total >= TTYHOG / 2 &&
   1633 	    !ISSET(tp->t_state, TS_TBLOCK) &&
   1634 	    (!ISSET(tp->t_lflag, ICANON) || tp->t_canq.c_cc > 0)) {
   1635 		if (ISSET(tp->t_iflag, IXOFF) &&
   1636 		    tp->t_cc[VSTOP] != _POSIX_VDISABLE &&
   1637 		    putc(tp->t_cc[VSTOP], &tp->t_outq) == 0) {
   1638 			SET(tp->t_state, TS_TBLOCK);
   1639 			ttstart(tp);
   1640 		}
   1641 		/* Try to block remote output via hardware flow control. */
   1642 		if (ISSET(tp->t_cflag, CHWFLOW) && tp->t_hwiflow &&
   1643 		    (*tp->t_hwiflow)(tp, 1) != 0)
   1644 			SET(tp->t_state, TS_TBLOCK);
   1645 	}
   1646 }
   1647 
   1648 /*
   1649  * Delayed line discipline output
   1650  */
   1651 void
   1652 ttrstrt(void *tp_arg)
   1653 {
   1654 	struct tty	*tp;
   1655 
   1656 #ifdef DIAGNOSTIC
   1657 	if (tp_arg == NULL)
   1658 		panic("ttrstrt");
   1659 #endif
   1660 	tp = tp_arg;
   1661 	mutex_spin_enter(&tty_lock);
   1662 
   1663 	CLR(tp->t_state, TS_TIMEOUT);
   1664 	ttstart(tp); /* XXX - Shouldn't this be tp->l_start(tp)? */
   1665 
   1666 	mutex_spin_exit(&tty_lock);
   1667 }
   1668 
   1669 /*
   1670  * start a line discipline
   1671  * Always call with tty lock held?
   1672  */
   1673 int
   1674 ttstart(struct tty *tp)
   1675 {
   1676 
   1677 	if (tp->t_oproc != NULL)	/* XXX: Kludge for pty. */
   1678 		(*tp->t_oproc)(tp);
   1679 	return (0);
   1680 }
   1681 
   1682 /*
   1683  * "close" a line discipline
   1684  */
   1685 int
   1686 ttylclose(struct tty *tp, int flag)
   1687 {
   1688 
   1689 	if (flag & FNONBLOCK) {
   1690 		mutex_spin_enter(&tty_lock);
   1691 		ttyflush(tp, FREAD | FWRITE);
   1692 		mutex_spin_exit(&tty_lock);
   1693 	} else
   1694 		ttywflush(tp);
   1695 	return (0);
   1696 }
   1697 
   1698 /*
   1699  * Handle modem control transition on a tty.
   1700  * Flag indicates new state of carrier.
   1701  * Returns 0 if the line should be turned off, otherwise 1.
   1702  */
   1703 int
   1704 ttymodem(struct tty *tp, int flag)
   1705 {
   1706 
   1707 	mutex_spin_enter(&tty_lock);
   1708 	if (flag == 0) {
   1709 		if (ISSET(tp->t_state, TS_CARR_ON)) {
   1710 			/*
   1711 			 * Lost carrier.
   1712 			 */
   1713 			CLR(tp->t_state, TS_CARR_ON);
   1714 			if (ISSET(tp->t_state, TS_ISOPEN) && !CONNECTED(tp)) {
   1715 				ttysig(tp, TTYSIG_LEADER, SIGHUP);
   1716 				ttyflush(tp, FREAD | FWRITE);
   1717 				mutex_spin_exit(&tty_lock);
   1718 				return (0);
   1719 			}
   1720 		}
   1721 	} else {
   1722 		if (!ISSET(tp->t_state, TS_CARR_ON)) {
   1723 			/*
   1724 			 * Carrier now on.
   1725 			 */
   1726 			SET(tp->t_state, TS_CARR_ON);
   1727 			ttwakeup(tp);
   1728 		}
   1729 	}
   1730 	mutex_spin_exit(&tty_lock);
   1731 
   1732 	return (1);
   1733 }
   1734 
   1735 /*
   1736  * Default modem control routine (for other line disciplines).
   1737  * Return argument flag, to turn off device on carrier drop.
   1738  */
   1739 int
   1740 nullmodem(struct tty *tp, int flag)
   1741 {
   1742 
   1743 	mutex_spin_enter(&tty_lock);
   1744 	if (flag)
   1745 		SET(tp->t_state, TS_CARR_ON);
   1746 	else {
   1747 		CLR(tp->t_state, TS_CARR_ON);
   1748 		if (!CONNECTED(tp)) {
   1749 			ttysig(tp, TTYSIG_LEADER, SIGHUP);
   1750 			mutex_spin_exit(&tty_lock);
   1751 			return (0);
   1752 		}
   1753 	}
   1754 	mutex_spin_exit(&tty_lock);
   1755 
   1756 	return (1);
   1757 }
   1758 
   1759 /*
   1760  * Reinput pending characters after state switch.
   1761  */
   1762 void
   1763 ttypend(struct tty *tp)
   1764 {
   1765 	struct clist	tq;
   1766 	int		c;
   1767 
   1768 	KASSERT(mutex_owned(&tty_lock));
   1769 
   1770 	CLR(tp->t_lflag, PENDIN);
   1771 	SET(tp->t_state, TS_TYPEN);
   1772 	tq = tp->t_rawq;
   1773 	tp->t_rawq.c_cc = 0;
   1774 	tp->t_rawq.c_cf = tp->t_rawq.c_cl = 0;
   1775 	while ((c = getc(&tq)) >= 0)
   1776 		ttyinput_wlock(c, tp);
   1777 	CLR(tp->t_state, TS_TYPEN);
   1778 }
   1779 
   1780 /*
   1781  * Process a read call on a tty device.
   1782  */
   1783 int
   1784 ttread(struct tty *tp, struct uio *uio, int flag)
   1785 {
   1786 	struct clist	*qp;
   1787 	u_char		*cc;
   1788 	struct proc	*p;
   1789 	int		c, first, error, has_stime, last_cc;
   1790 	long		lflag, slp;
   1791 	struct timeval	now, stime;
   1792 
   1793 	if (uio->uio_resid == 0)
   1794 		return 0;
   1795 
   1796 	stime.tv_usec = 0;	/* XXX gcc */
   1797 	stime.tv_sec = 0;	/* XXX gcc */
   1798 
   1799 	cc = tp->t_cc;
   1800 	p = curproc;
   1801 	error = 0;
   1802 	has_stime = 0;
   1803 	last_cc = 0;
   1804 	slp = 0;
   1805 
   1806  loop:
   1807 	mutex_spin_enter(&tty_lock);
   1808 	lflag = tp->t_lflag;
   1809 	/*
   1810 	 * take pending input first
   1811 	 */
   1812 	if (ISSET(lflag, PENDIN))
   1813 		ttypend(tp);
   1814 
   1815 	/*
   1816 	 * Hang process if it's in the background.
   1817 	 */
   1818 	if (isbackground(p, tp)) {
   1819 		if (sigismasked(curlwp, SIGTTIN) ||
   1820 		    p->p_lflag & PL_PPWAIT || p->p_pgrp->pg_jobc == 0) {
   1821 			mutex_spin_exit(&tty_lock);
   1822 			return (EIO);
   1823 		}
   1824 		mutex_spin_exit(&tty_lock);
   1825 
   1826 		mutex_enter(proc_lock);
   1827 		pgsignal(p->p_pgrp, SIGTTIN, 1);
   1828 		mutex_exit(proc_lock);
   1829 
   1830 		mutex_spin_enter(&tty_lock);
   1831 		error = ttypause(tp, hz);
   1832 		mutex_spin_exit(&tty_lock);
   1833 		if (error)
   1834 			return (error);
   1835 		goto loop;
   1836 	}
   1837 
   1838 	if (!ISSET(lflag, ICANON)) {
   1839 		int m = cc[VMIN];
   1840 		long t = cc[VTIME];
   1841 
   1842 		qp = &tp->t_rawq;
   1843 		/*
   1844 		 * Check each of the four combinations.
   1845 		 * (m > 0 && t == 0) is the normal read case.
   1846 		 * It should be fairly efficient, so we check that and its
   1847 		 * companion case (m == 0 && t == 0) first.
   1848 		 * For the other two cases, we compute the target sleep time
   1849 		 * into slp.
   1850 		 */
   1851 		if (t == 0) {
   1852 			if (qp->c_cc < m)
   1853 				goto sleep;
   1854 			goto read;
   1855 		}
   1856 		t *= hz;		/* time in deca-ticks */
   1857 /*
   1858  * Time difference in deca-ticks, split division to avoid numeric overflow.
   1859  * Ok for hz < ~200kHz
   1860  */
   1861 #define	diff(t1, t2) (((t1).tv_sec - (t2).tv_sec) * 10 * hz + \
   1862 			 ((t1).tv_usec - (t2).tv_usec) / 100 * hz / 1000)
   1863 		if (m > 0) {
   1864 			if (qp->c_cc <= 0)
   1865 				goto sleep;
   1866 			if (qp->c_cc >= m)
   1867 				goto read;
   1868 			if (!has_stime) {
   1869 				/* first character, start timer */
   1870 				has_stime = 1;
   1871 				getmicrotime(&stime);
   1872 				slp = t;
   1873 			} else if (qp->c_cc > last_cc) {
   1874 				/* got a character, restart timer */
   1875 				getmicrotime(&stime);
   1876 				slp = t;
   1877 			} else {
   1878 				/* nothing, check expiration */
   1879 				getmicrotime(&now);
   1880 				slp = t - diff(now, stime);
   1881 			}
   1882 		} else {	/* m == 0 */
   1883 			if (qp->c_cc > 0)
   1884 				goto read;
   1885 			if (!has_stime) {
   1886 				has_stime = 1;
   1887 				getmicrotime(&stime);
   1888 				slp = t;
   1889 			} else {
   1890 				getmicrotime(&now);
   1891 				slp = t - diff(now, stime);
   1892 			}
   1893 		}
   1894 		last_cc = qp->c_cc;
   1895 #undef diff
   1896 		if (slp > 0) {
   1897 			/*
   1898 			 * Convert deca-ticks back to ticks.
   1899 			 * Rounding down may make us wake up just short
   1900 			 * of the target, so we round up.
   1901 			 * Maybe we should do 'slp/10 + 1' because the
   1902 			 * first tick maybe almost immediate.
   1903 			 * However it is more useful for a program that sets
   1904 			 * VTIME=10 to wakeup every second not every 1.01
   1905 			 * seconds (if hz=100).
   1906 			 */
   1907 			slp = (slp + 9)/ 10;
   1908 			goto sleep;
   1909 		}
   1910 	} else if ((qp = &tp->t_canq)->c_cc <= 0) {
   1911 		int	carrier;
   1912 
   1913  sleep:
   1914 		/*
   1915 		 * If there is no input, sleep on rawq
   1916 		 * awaiting hardware receipt and notification.
   1917 		 * If we have data, we don't need to check for carrier.
   1918 		 */
   1919 		carrier = CONNECTED(tp);
   1920 		if (!carrier && ISSET(tp->t_state, TS_ISOPEN)) {
   1921 			mutex_spin_exit(&tty_lock);
   1922 			return (0);	/* EOF */
   1923 		}
   1924 		if (!has_stime || slp <= 0) {
   1925 			if (flag & IO_NDELAY) {
   1926 				mutex_spin_exit(&tty_lock);
   1927 				return (EWOULDBLOCK);
   1928 			}
   1929 		}
   1930 		error = ttysleep(tp, &tp->t_rawcv, true, slp);
   1931 		mutex_spin_exit(&tty_lock);
   1932 		/* VMIN == 0: any quantity read satisfies */
   1933 		if (cc[VMIN] == 0 && error == EWOULDBLOCK)
   1934 			return (0);
   1935 		if (error && error != EWOULDBLOCK)
   1936 			return (error);
   1937 		goto loop;
   1938 	}
   1939  read:
   1940 
   1941 	/*
   1942 	 * Input present, check for input mapping and processing.
   1943 	 */
   1944 	first = 1;
   1945 	while ((c = getc(qp)) >= 0) {
   1946 		/*
   1947 		 * delayed suspend (^Y)
   1948 		 */
   1949 		if (CCEQ(cc[VDSUSP], c) &&
   1950 		    ISSET(lflag, IEXTEN|ISIG) == (IEXTEN|ISIG)) {
   1951 			ttysig(tp, TTYSIG_PG1, SIGTSTP);
   1952 			if (first) {
   1953 				error = ttypause(tp, hz);
   1954 				if (error)
   1955 					break;
   1956 				mutex_spin_exit(&tty_lock);
   1957 				goto loop;
   1958 			}
   1959 			break;
   1960 		}
   1961 		/*
   1962 		 * Interpret EOF only in canonical mode.
   1963 		 */
   1964 		if (CCEQ(cc[VEOF], c) && ISSET(lflag, ICANON))
   1965 			break;
   1966 		/*
   1967 		 * Give user character.
   1968 		 */
   1969 		mutex_spin_exit(&tty_lock);
   1970  		error = ureadc(c, uio);
   1971 		mutex_spin_enter(&tty_lock);
   1972 		if (error)
   1973 			break;
   1974  		if (uio->uio_resid == 0)
   1975 			break;
   1976 		/*
   1977 		 * In canonical mode check for a "break character"
   1978 		 * marking the end of a "line of input".
   1979 		 */
   1980 		if (ISSET(lflag, ICANON) && TTBREAKC(c, lflag))
   1981 			break;
   1982 		first = 0;
   1983 	}
   1984 
   1985 	/*
   1986 	 * Look to unblock output now that (presumably)
   1987 	 * the input queue has gone down.
   1988 	 */
   1989 	if (ISSET(tp->t_state, TS_TBLOCK) && tp->t_rawq.c_cc < TTYHOG / 5) {
   1990 		if (ISSET(tp->t_iflag, IXOFF) &&
   1991 		    cc[VSTART] != _POSIX_VDISABLE &&
   1992 		    putc(cc[VSTART], &tp->t_outq) == 0) {
   1993 			CLR(tp->t_state, TS_TBLOCK);
   1994 			ttstart(tp);
   1995 		}
   1996 		/* Try to unblock remote output via hardware flow control. */
   1997 		if (ISSET(tp->t_cflag, CHWFLOW) && tp->t_hwiflow &&
   1998 		    (*tp->t_hwiflow)(tp, 0) != 0)
   1999 			CLR(tp->t_state, TS_TBLOCK);
   2000 	}
   2001 	mutex_spin_exit(&tty_lock);
   2002 
   2003 	return (error);
   2004 }
   2005 
   2006 /*
   2007  * Check the output queue on tp for space for a kernel message (from uprintf
   2008  * or tprintf).  Allow some space over the normal hiwater mark so we don't
   2009  * lose messages due to normal flow control, but don't let the tty run amok.
   2010  * Sleeps here are not interruptible, but we return prematurely if new signals
   2011  * arrive.
   2012  * Call with tty lock held.
   2013  */
   2014 static int
   2015 ttycheckoutq_wlock(struct tty *tp, int wait)
   2016 {
   2017 	int	hiwat, error;
   2018 
   2019 	KASSERT(mutex_owned(&tty_lock));
   2020 
   2021 	hiwat = tp->t_hiwat;
   2022 	if (tp->t_outq.c_cc > hiwat + 200)
   2023 		while (tp->t_outq.c_cc > hiwat) {
   2024 			ttstart(tp);
   2025 			if (wait == 0)
   2026 				return (0);
   2027 			error = ttysleep(tp, &tp->t_outcv, true, hz);
   2028 			if (error == EINTR)
   2029 				wait = 0;
   2030 		}
   2031 
   2032 	return (1);
   2033 }
   2034 
   2035 int
   2036 ttycheckoutq(struct tty *tp, int wait)
   2037 {
   2038 	int	r;
   2039 
   2040 	mutex_spin_enter(&tty_lock);
   2041 	r = ttycheckoutq_wlock(tp, wait);
   2042 	mutex_spin_exit(&tty_lock);
   2043 
   2044 	return (r);
   2045 }
   2046 
   2047 /*
   2048  * Process a write call on a tty device.
   2049  */
   2050 int
   2051 ttwrite(struct tty *tp, struct uio *uio, int flag)
   2052 {
   2053 	u_char		*cp;
   2054 	struct proc	*p;
   2055 	int		cc, ce, i, hiwat, error;
   2056 	u_char		obuf[OBUFSIZ];
   2057 
   2058 	cp = NULL;
   2059 	hiwat = tp->t_hiwat;
   2060 	error = 0;
   2061 	cc = 0;
   2062  loop:
   2063 	mutex_spin_enter(&tty_lock);
   2064 	if (!CONNECTED(tp)) {
   2065 		if (ISSET(tp->t_state, TS_ISOPEN)) {
   2066 			mutex_spin_exit(&tty_lock);
   2067 			return (EIO);
   2068 		} else if (flag & IO_NDELAY) {
   2069 			mutex_spin_exit(&tty_lock);
   2070 			error = EWOULDBLOCK;
   2071 			goto out;
   2072 		} else {
   2073 			/* Sleep awaiting carrier. */
   2074 			error = ttysleep(tp, &tp->t_rawcv, true, 0);
   2075 			mutex_spin_exit(&tty_lock);
   2076 			if (error)
   2077 				goto out;
   2078 			goto loop;
   2079 		}
   2080 	}
   2081 
   2082 	/*
   2083 	 * Hang the process if it's in the background.
   2084 	 */
   2085 	p = curproc;
   2086 	if (isbackground(p, tp) &&
   2087 	    ISSET(tp->t_lflag, TOSTOP) && (p->p_lflag & PL_PPWAIT) == 0 &&
   2088 	    !sigismasked(curlwp, SIGTTOU)) {
   2089 		if (p->p_pgrp->pg_jobc == 0) {
   2090 			error = EIO;
   2091 			mutex_spin_exit(&tty_lock);
   2092 			goto out;
   2093 		}
   2094 		mutex_spin_exit(&tty_lock);
   2095 
   2096 		mutex_enter(proc_lock);
   2097 		pgsignal(p->p_pgrp, SIGTTOU, 1);
   2098 		mutex_exit(proc_lock);
   2099 
   2100 		mutex_spin_enter(&tty_lock);
   2101 		error = ttypause(tp, hz);
   2102 		mutex_spin_exit(&tty_lock);
   2103 		if (error)
   2104 			goto out;
   2105 		goto loop;
   2106 	}
   2107 	mutex_spin_exit(&tty_lock);
   2108 
   2109 	/*
   2110 	 * Process the user's data in at most OBUFSIZ chunks.  Perform any
   2111 	 * output translation.  Keep track of high water mark, sleep on
   2112 	 * overflow awaiting device aid in acquiring new space.
   2113 	 */
   2114 	while (uio->uio_resid > 0 || cc > 0) {
   2115 		if (ISSET(tp->t_lflag, FLUSHO)) {
   2116 			uio->uio_resid = 0;
   2117 			return (0);
   2118 		}
   2119 		if (tp->t_outq.c_cc > hiwat)
   2120 			goto ovhiwat;
   2121 		/*
   2122 		 * Grab a hunk of data from the user, unless we have some
   2123 		 * leftover from last time.
   2124 		 */
   2125 		if (cc == 0) {
   2126 			cc = min(uio->uio_resid, OBUFSIZ);
   2127 			cp = obuf;
   2128 			error = uiomove(cp, cc, uio);
   2129 			if (error) {
   2130 				cc = 0;
   2131 				goto out;
   2132 			}
   2133 		}
   2134 		/*
   2135 		 * If nothing fancy need be done, grab those characters we
   2136 		 * can handle without any of ttyoutput's processing and
   2137 		 * just transfer them to the output q.  For those chars
   2138 		 * which require special processing (as indicated by the
   2139 		 * bits in char_type), call ttyoutput.  After processing
   2140 		 * a hunk of data, look for FLUSHO so ^O's will take effect
   2141 		 * immediately.
   2142 		 */
   2143 		mutex_spin_enter(&tty_lock);
   2144 		while (cc > 0) {
   2145 			if (!ISSET(tp->t_oflag, OPOST))
   2146 				ce = cc;
   2147 			else {
   2148 				ce = cc - scanc((u_int)cc, cp, char_type,
   2149 				    CCLASSMASK);
   2150 				/*
   2151 				 * If ce is zero, then we're processing
   2152 				 * a special character through ttyoutput.
   2153 				 */
   2154 				if (ce == 0) {
   2155 					tp->t_rocount = 0;
   2156 					if (ttyoutput(*cp, tp) >= 0) {
   2157 						/* out of space */
   2158 						mutex_spin_exit(&tty_lock);
   2159 						goto overfull;
   2160 					}
   2161 					cp++;
   2162 					cc--;
   2163 					if (ISSET(tp->t_lflag, FLUSHO) ||
   2164 					    tp->t_outq.c_cc > hiwat) {
   2165 						mutex_spin_exit(&tty_lock);
   2166 						goto ovhiwat;
   2167 					}
   2168 					continue;
   2169 				}
   2170 			}
   2171 			/*
   2172 			 * A bunch of normal characters have been found.
   2173 			 * Transfer them en masse to the output queue and
   2174 			 * continue processing at the top of the loop.
   2175 			 * If there are any further characters in this
   2176 			 * <= OBUFSIZ chunk, the first should be a character
   2177 			 * requiring special handling by ttyoutput.
   2178 			 */
   2179 			tp->t_rocount = 0;
   2180 			i = b_to_q(cp, ce, &tp->t_outq);
   2181 			ce -= i;
   2182 			tp->t_column += ce;
   2183 			cp += ce, cc -= ce, tk_nout += ce;
   2184 			tp->t_outcc += ce;
   2185 			if (i > 0) {
   2186 				/* out of space */
   2187 				mutex_spin_exit(&tty_lock);
   2188 				goto overfull;
   2189 			}
   2190 			if (ISSET(tp->t_lflag, FLUSHO) ||
   2191 			    tp->t_outq.c_cc > hiwat)
   2192 				break;
   2193 		}
   2194 		ttstart(tp);
   2195 		mutex_spin_exit(&tty_lock);
   2196 	}
   2197 
   2198  out:
   2199 	/*
   2200 	 * If cc is nonzero, we leave the uio structure inconsistent, as the
   2201 	 * offset and iov pointers have moved forward, but it doesn't matter
   2202 	 * (the call will either return short or restart with a new uio).
   2203 	 */
   2204 	uio->uio_resid += cc;
   2205 	return (error);
   2206 
   2207  overfull:
   2208 	/*
   2209 	 * Since we are using ring buffers, if we can't insert any more into
   2210 	 * the output queue, we can assume the ring is full and that someone
   2211 	 * forgot to set the high water mark correctly.  We set it and then
   2212 	 * proceed as normal.
   2213 	 */
   2214 	hiwat = tp->t_outq.c_cc - 1;
   2215 
   2216  ovhiwat:
   2217 	mutex_spin_enter(&tty_lock);
   2218 	ttstart(tp);
   2219 	/*
   2220 	 * This can only occur if FLUSHO is set in t_lflag,
   2221 	 * or if ttstart/oproc is synchronous (or very fast).
   2222 	 */
   2223 	if (tp->t_outq.c_cc <= hiwat) {
   2224 		mutex_spin_exit(&tty_lock);
   2225 		goto loop;
   2226 	}
   2227 	if (flag & IO_NDELAY) {
   2228 		mutex_spin_exit(&tty_lock);
   2229 		error = EWOULDBLOCK;
   2230 		goto out;
   2231 	}
   2232 	error = ttysleep(tp, &tp->t_outcv, true, 0);
   2233 	mutex_spin_exit(&tty_lock);
   2234 	if (error)
   2235 		goto out;
   2236 	goto loop;
   2237 }
   2238 
   2239 /*
   2240  * Try to pull more output from the producer.  Return non-zero if
   2241  * there is output ready to be sent.
   2242  */
   2243 bool
   2244 ttypull(struct tty *tp)
   2245 {
   2246 
   2247 	/* XXXSMP not yet KASSERT(mutex_owned(&tty_lock)); */
   2248 
   2249 	if (tp->t_outq.c_cc <= tp->t_lowat) {
   2250 		cv_broadcast(&tp->t_outcv);
   2251 		selnotify(&tp->t_wsel, 0, NOTE_SUBMIT);
   2252 	}
   2253 	return tp->t_outq.c_cc != 0;
   2254 }
   2255 
   2256 /*
   2257  * Rubout one character from the rawq of tp
   2258  * as cleanly as possible.
   2259  * Called with tty lock held.
   2260  */
   2261 void
   2262 ttyrub(int c, struct tty *tp)
   2263 {
   2264 	u_char	*cp;
   2265 	int	savecol, tabc;
   2266 
   2267 	KASSERT(mutex_owned(&tty_lock));
   2268 
   2269 	if (!ISSET(tp->t_lflag, ECHO) || ISSET(tp->t_lflag, EXTPROC))
   2270 		return;
   2271 	CLR(tp->t_lflag, FLUSHO);
   2272 	if (ISSET(tp->t_lflag, ECHOE)) {
   2273 		if (tp->t_rocount == 0) {
   2274 			/*
   2275 			 * Screwed by ttwrite; retype
   2276 			 */
   2277 			ttyretype(tp);
   2278 			return;
   2279 		}
   2280 		if (c == ('\t' | TTY_QUOTE) || c == ('\n' | TTY_QUOTE))
   2281 			ttyrubo(tp, 2);
   2282 		else {
   2283 			CLR(c, ~TTY_CHARMASK);
   2284 			switch (CCLASS(c)) {
   2285 			case ORDINARY:
   2286 				ttyrubo(tp, 1);
   2287 				break;
   2288 			case BACKSPACE:
   2289 			case CONTROL:
   2290 			case NEWLINE:
   2291 			case RETURN:
   2292 			case VTAB:
   2293 				if (ISSET(tp->t_lflag, ECHOCTL))
   2294 					ttyrubo(tp, 2);
   2295 				break;
   2296 			case TAB:
   2297 				if (tp->t_rocount < tp->t_rawq.c_cc) {
   2298 					ttyretype(tp);
   2299 					return;
   2300 				}
   2301 				savecol = tp->t_column;
   2302 				SET(tp->t_state, TS_CNTTB);
   2303 				SET(tp->t_lflag, FLUSHO);
   2304 				tp->t_column = tp->t_rocol;
   2305 				for (cp = firstc(&tp->t_rawq, &tabc); cp;
   2306 				    cp = nextc(&tp->t_rawq, cp, &tabc))
   2307 					ttyecho(tabc, tp);
   2308 				CLR(tp->t_lflag, FLUSHO);
   2309 				CLR(tp->t_state, TS_CNTTB);
   2310 
   2311 				/* savecol will now be length of the tab. */
   2312 				savecol -= tp->t_column;
   2313 				tp->t_column += savecol;
   2314 				if (savecol > 8)
   2315 					savecol = 8;	/* overflow screw */
   2316 				while (--savecol >= 0)
   2317 					(void)ttyoutput('\b', tp);
   2318 				break;
   2319 			default:			/* XXX */
   2320 				(void)printf("ttyrub: would panic c = %d, "
   2321 				    "val = %d\n", c, CCLASS(c));
   2322 			}
   2323 		}
   2324 	} else if (ISSET(tp->t_lflag, ECHOPRT)) {
   2325 		if (!ISSET(tp->t_state, TS_ERASE)) {
   2326 			SET(tp->t_state, TS_ERASE);
   2327 			(void)ttyoutput('\\', tp);
   2328 		}
   2329 		ttyecho(c, tp);
   2330 	} else
   2331 		ttyecho(tp->t_cc[VERASE], tp);
   2332 	--tp->t_rocount;
   2333 }
   2334 
   2335 /*
   2336  * Back over cnt characters, erasing them.
   2337  * Called with tty lock held.
   2338  */
   2339 static void
   2340 ttyrubo(struct tty *tp, int cnt)
   2341 {
   2342 
   2343 	KASSERT(mutex_owned(&tty_lock));
   2344 
   2345 	while (cnt-- > 0) {
   2346 		(void)ttyoutput('\b', tp);
   2347 		(void)ttyoutput(' ', tp);
   2348 		(void)ttyoutput('\b', tp);
   2349 	}
   2350 }
   2351 
   2352 /*
   2353  * ttyretype --
   2354  *	Reprint the rawq line.  Note, it is assumed that c_cc has already
   2355  *	been checked.
   2356  *
   2357  * Called with tty lock held.
   2358  */
   2359 void
   2360 ttyretype(struct tty *tp)
   2361 {
   2362 	u_char	*cp;
   2363 	int	c;
   2364 
   2365 	KASSERT(mutex_owned(&tty_lock));
   2366 
   2367 	/* Echo the reprint character. */
   2368 	if (tp->t_cc[VREPRINT] != _POSIX_VDISABLE)
   2369 		ttyecho(tp->t_cc[VREPRINT], tp);
   2370 
   2371 	(void)ttyoutput('\n', tp);
   2372 
   2373 	for (cp = firstc(&tp->t_canq, &c); cp; cp = nextc(&tp->t_canq, cp, &c))
   2374 		ttyecho(c, tp);
   2375 	for (cp = firstc(&tp->t_rawq, &c); cp; cp = nextc(&tp->t_rawq, cp, &c))
   2376 		ttyecho(c, tp);
   2377 	CLR(tp->t_state, TS_ERASE);
   2378 
   2379 	tp->t_rocount = tp->t_rawq.c_cc;
   2380 	tp->t_rocol = 0;
   2381 }
   2382 
   2383 /*
   2384  * Echo a typed character to the terminal.
   2385  * Called with tty lock held.
   2386  */
   2387 static void
   2388 ttyecho(int c, struct tty *tp)
   2389 {
   2390 
   2391 	KASSERT(mutex_owned(&tty_lock));
   2392 
   2393 	if (!ISSET(tp->t_state, TS_CNTTB))
   2394 		CLR(tp->t_lflag, FLUSHO);
   2395 	if ((!ISSET(tp->t_lflag, ECHO) &&
   2396 	    (!ISSET(tp->t_lflag, ECHONL) || c != '\n')) ||
   2397 	    ISSET(tp->t_lflag, EXTPROC))
   2398 		return;
   2399 	if (((ISSET(tp->t_lflag, ECHOCTL) &&
   2400 	    (ISSET(c, TTY_CHARMASK) <= 037 && c != '\t' && c != '\n')) ||
   2401 	    ISSET(c, TTY_CHARMASK) == 0177)) {
   2402 		(void)ttyoutput('^', tp);
   2403 		CLR(c, ~TTY_CHARMASK);
   2404 		if (c == 0177)
   2405 			c = '?';
   2406 		else
   2407 			c += 'A' - 1;
   2408 	}
   2409 	(void)ttyoutput(c, tp);
   2410 }
   2411 
   2412 /*
   2413  * Wake up any readers on a tty.
   2414  * Called with tty lock held.
   2415  */
   2416 void
   2417 ttwakeup(struct tty *tp)
   2418 {
   2419 
   2420 	KASSERT(mutex_owned(&tty_lock));
   2421 
   2422 	selnotify(&tp->t_rsel, 0, NOTE_SUBMIT);
   2423 	if (ISSET(tp->t_state, TS_ASYNC))
   2424 		ttysig(tp, TTYSIG_PG2, SIGIO);
   2425 	cv_broadcast(&tp->t_rawcv);
   2426 }
   2427 
   2428 /*
   2429  * Look up a code for a specified speed in a conversion table;
   2430  * used by drivers to map software speed values to hardware parameters.
   2431  */
   2432 int
   2433 ttspeedtab(int speed, const struct speedtab *table)
   2434 {
   2435 
   2436 	for (; table->sp_speed != -1; table++)
   2437 		if (table->sp_speed == speed)
   2438 			return (table->sp_code);
   2439 	return (-1);
   2440 }
   2441 
   2442 /*
   2443  * Set tty hi and low water marks.
   2444  *
   2445  * Try to arrange the dynamics so there's about one second
   2446  * from hi to low water.
   2447  */
   2448 void
   2449 ttsetwater(struct tty *tp)
   2450 {
   2451 	int	cps, x;
   2452 
   2453 	/* XXX not yet KASSERT(mutex_owned(&tty_lock)); */
   2454 
   2455 #define	CLAMP(x, h, l)	((x) > h ? h : ((x) < l) ? l : (x))
   2456 
   2457 	cps = tp->t_ospeed / 10;
   2458 	tp->t_lowat = x = CLAMP(cps / 2, TTMAXLOWAT, TTMINLOWAT);
   2459 	x += cps;
   2460 	x = CLAMP(x, TTMAXHIWAT, TTMINHIWAT);
   2461 	tp->t_hiwat = roundup(x, TTROUND);
   2462 #undef	CLAMP
   2463 }
   2464 
   2465 /*
   2466  * Prepare report on state of foreground process group.
   2467  * Call with proc_lock held.
   2468  */
   2469 void
   2470 ttygetinfo(struct tty *tp, int fromsig, char *buf, size_t bufsz)
   2471 {
   2472 	struct lwp	*l;
   2473 	struct proc	*p, *pick = NULL;
   2474 	struct timeval	utime, stime;
   2475 	int		tmp;
   2476 	fixpt_t		pctcpu = 0;
   2477 	const char	*msg;
   2478 	char		lmsg[100];
   2479 	long		rss;
   2480 
   2481 	KASSERT(mutex_owned(proc_lock));
   2482 
   2483 	*buf = '\0';
   2484 
   2485 	if (tp->t_session == NULL)
   2486 		msg = "not a controlling terminal\n";
   2487 	else if (tp->t_pgrp == NULL)
   2488 		msg = "no foreground process group\n";
   2489 	else if ((p = LIST_FIRST(&tp->t_pgrp->pg_members)) == NULL)
   2490 		msg = "empty foreground process group\n";
   2491 	else {
   2492 		/* Pick interesting process. */
   2493 		for (; p != NULL; p = LIST_NEXT(p, p_pglist)) {
   2494 			struct proc *oldpick;
   2495 
   2496 			if (pick == NULL) {
   2497 				pick = p;
   2498 				continue;
   2499 			}
   2500 			if (pick->p_lock < p->p_lock) {
   2501 				mutex_enter(pick->p_lock);
   2502 				mutex_enter(p->p_lock);
   2503 			} else if (pick->p_lock > p->p_lock) {
   2504 				mutex_enter(p->p_lock);
   2505 				mutex_enter(pick->p_lock);
   2506 			} else
   2507 				mutex_enter(p->p_lock);
   2508 			oldpick = pick;
   2509 			if (proc_compare_wrapper(pick, p))
   2510 				pick = p;
   2511 			mutex_exit(p->p_lock);
   2512 			if (p->p_lock != oldpick->p_lock)
   2513 				mutex_exit(oldpick->p_lock);
   2514 		}
   2515 		if (fromsig &&
   2516 		    (SIGACTION_PS(pick->p_sigacts, SIGINFO).sa_flags &
   2517 		    SA_NOKERNINFO))
   2518 			return;
   2519 		msg = NULL;
   2520 	}
   2521 
   2522 	/* Print load average. */
   2523 	tmp = (averunnable.ldavg[0] * 100 + FSCALE / 2) >> FSHIFT;
   2524 	snprintf(lmsg, sizeof(lmsg), "load: %d.%02d ", tmp / 100, tmp % 100);
   2525 	strlcat(buf, lmsg, bufsz);
   2526 
   2527 	if (pick == NULL) {
   2528 		strlcat(buf, msg, bufsz);
   2529 		return;
   2530 	}
   2531 
   2532 	snprintf(lmsg, sizeof(lmsg), " cmd: %s %d [", pick->p_comm,
   2533 	    pick->p_pid);
   2534 	strlcat(buf, lmsg, bufsz);
   2535 
   2536 	mutex_enter(pick->p_lock);
   2537 	LIST_FOREACH(l, &pick->p_lwps, l_sibling) {
   2538 		const char *lp;
   2539 		lwp_lock(l);
   2540 #ifdef LWP_PC
   2541 #define FMT_RUN "%#"PRIxVADDR
   2542 #define VAL_RUNNING (vaddr_t)LWP_PC(l)
   2543 #define VAL_RUNABLE (vaddr_t)LWP_PC(l)
   2544 #else
   2545 #define FMT_RUN "%s"
   2546 #define VAL_RUNNING "running"
   2547 #define VAL_RUNABLE "runnable"
   2548 #endif
   2549 		switch (l->l_stat) {
   2550 		case LSONPROC:
   2551 			snprintf(lmsg, sizeof(lmsg), FMT_RUN"/%d", VAL_RUNNING,
   2552 			    cpu_index(l->l_cpu));
   2553 			lp = lmsg;
   2554 			break;
   2555 		case LSRUN:
   2556 			snprintf(lmsg, sizeof(lmsg), FMT_RUN, VAL_RUNABLE);
   2557 			lp = lmsg;
   2558 			break;
   2559 		default:
   2560 			lp = l->l_wchan ? l->l_wmesg : "iowait";
   2561 			break;
   2562 		}
   2563 		strlcat(buf, lp, bufsz);
   2564 		strlcat(buf, LIST_NEXT(l, l_sibling) != NULL ? " " : "] ",
   2565 		    bufsz);
   2566 		pctcpu += l->l_pctcpu;
   2567 		lwp_unlock(l);
   2568 	}
   2569 	pctcpu += pick->p_pctcpu;
   2570 	calcru(pick, &utime, &stime, NULL, NULL);
   2571 	mutex_exit(pick->p_lock);
   2572 
   2573 	/* Round up and print user+system time, %CPU and RSS. */
   2574 	utime.tv_usec += 5000;
   2575 	if (utime.tv_usec >= 1000000) {
   2576 		utime.tv_sec += 1;
   2577 		utime.tv_usec -= 1000000;
   2578 	}
   2579 	stime.tv_usec += 5000;
   2580 	if (stime.tv_usec >= 1000000) {
   2581 		stime.tv_sec += 1;
   2582 		stime.tv_usec -= 1000000;
   2583 	}
   2584 #define	pgtok(a)	(((u_long) ((a) * PAGE_SIZE) / 1024))
   2585 	tmp = (pctcpu * 10000 + FSCALE / 2) >> FSHIFT;
   2586 	if (pick->p_stat == SIDL || P_ZOMBIE(pick))
   2587 		rss = 0;
   2588 	else
   2589 		rss = pgtok(vm_resident_count(pick->p_vmspace));
   2590 
   2591 	snprintf(lmsg, sizeof(lmsg), "%ld.%02ldu %ld.%02lds %d%% %ldk",
   2592 	    (long)utime.tv_sec, (long)utime.tv_usec / 10000,
   2593 	    (long)stime.tv_sec, (long)stime.tv_usec / 10000,
   2594 	    tmp / 100, rss);
   2595 	strlcat(buf, lmsg, bufsz);
   2596 }
   2597 
   2598 /*
   2599  * Print report on state of foreground process group.
   2600  * Call with tty_lock held.
   2601  */
   2602 void
   2603 ttyputinfo(struct tty *tp, char *buf)
   2604 {
   2605 
   2606 	KASSERT(mutex_owned(&tty_lock));
   2607 
   2608 	if (ttycheckoutq_wlock(tp, 0) == 0)
   2609 		return;
   2610 	ttyprintf_nolock(tp, "%s\n", buf);
   2611 	tp->t_rocount = 0;	/* so pending input will be retyped if BS */
   2612 }
   2613 
   2614 /*
   2615  * Returns 1 if p2 has a better chance being the active foreground process
   2616  * in a terminal instead of p1.
   2617  */
   2618 static int
   2619 proc_compare_wrapper(struct proc *p1, struct proc *p2)
   2620 {
   2621 	lwp_t *l1, *l2;
   2622 
   2623 	KASSERT(mutex_owned(p1->p_lock));
   2624 	KASSERT(mutex_owned(p2->p_lock));
   2625 
   2626 	if ((l1 = LIST_FIRST(&p1->p_lwps)) == NULL)
   2627 		return 1;
   2628 
   2629 	if ((l2 = LIST_FIRST(&p2->p_lwps)) == NULL)
   2630 		return 0;
   2631 
   2632 	return proc_compare(p1, l1, p2, l2);
   2633 }
   2634 
   2635 /*
   2636  * Output char to tty; console putchar style.
   2637  * Can be called with tty lock held through kprintf() machinery..
   2638  */
   2639 int
   2640 tputchar(int c, int flags, struct tty *tp)
   2641 {
   2642 	int r = 0;
   2643 
   2644 	if ((flags & NOLOCK) == 0)
   2645 		mutex_spin_enter(&tty_lock);
   2646 	if (!CONNECTED(tp)) {
   2647 		r = -1;
   2648 		goto out;
   2649 	}
   2650 	if (c == '\n')
   2651 		(void)ttyoutput('\r', tp);
   2652 	(void)ttyoutput(c, tp);
   2653 	ttstart(tp);
   2654 out:
   2655 	if ((flags & NOLOCK) == 0)
   2656 		mutex_spin_exit(&tty_lock);
   2657 	return (r);
   2658 }
   2659 
   2660 /*
   2661  * Sleep on chan, returning ERESTART if tty changed while we napped and
   2662  * returning any errors (e.g. EINTR/EWOULDBLOCK) reported by
   2663  * cv_timedwait(_sig).
   2664  * If the tty is revoked, restarting a pending call will redo validation done
   2665  * at the start of the call.
   2666  *
   2667  * Must be called with the tty lock held.
   2668  */
   2669 int
   2670 ttysleep(struct tty *tp, kcondvar_t *cv, bool catch, int timo)
   2671 {
   2672 	int	error;
   2673 	short	gen;
   2674 
   2675 	KASSERT(mutex_owned(&tty_lock));
   2676 
   2677 	gen = tp->t_gen;
   2678 	if (cv == NULL)
   2679 		error = kpause("ttypause", catch, timo, &tty_lock);
   2680 	else if (catch)
   2681 		error = cv_timedwait_sig(cv, &tty_lock, timo);
   2682 	else
   2683 		error = cv_timedwait(cv, &tty_lock, timo);
   2684 	if (error != 0)
   2685 		return (error);
   2686 	return (tp->t_gen == gen ? 0 : ERESTART);
   2687 }
   2688 
   2689 int
   2690 ttypause(struct tty *tp, int timo)
   2691 {
   2692 	int error;
   2693 
   2694 	error = ttysleep(tp, NULL, true, timo);
   2695 	if (error == EWOULDBLOCK)
   2696 		error = 0;
   2697 	return error;
   2698 }
   2699 
   2700 /*
   2701  * Attach a tty to the tty list.
   2702  *
   2703  * This should be called ONLY once per real tty (including pty's).
   2704  * eg, on the sparc, the keyboard and mouse have struct tty's that are
   2705  * distinctly NOT usable as tty's, and thus should not be attached to
   2706  * the ttylist.  This is why this call is not done from tty_alloc().
   2707  *
   2708  * Device drivers should attach tty's at a similar time that they are
   2709  * allocated, or, for the case of statically allocated struct tty's
   2710  * either in the attach or (first) open routine.
   2711  */
   2712 void
   2713 tty_attach(struct tty *tp)
   2714 {
   2715 
   2716 	mutex_spin_enter(&tty_lock);
   2717 	TAILQ_INSERT_TAIL(&ttylist, tp, tty_link);
   2718 	++tty_count;
   2719 	mutex_spin_exit(&tty_lock);
   2720 }
   2721 
   2722 /*
   2723  * Remove a tty from the tty list.
   2724  */
   2725 void
   2726 tty_detach(struct tty *tp)
   2727 {
   2728 
   2729 	mutex_spin_enter(&tty_lock);
   2730 	--tty_count;
   2731 #ifdef DIAGNOSTIC
   2732 	if (tty_count < 0)
   2733 		panic("tty_detach: tty_count < 0");
   2734 #endif
   2735 	TAILQ_REMOVE(&ttylist, tp, tty_link);
   2736 	mutex_spin_exit(&tty_lock);
   2737 }
   2738 
   2739 /*
   2740  * Allocate a tty structure and its associated buffers.
   2741  */
   2742 struct tty *
   2743 tty_alloc(void)
   2744 {
   2745 	struct tty *tp;
   2746 	int i;
   2747 
   2748 	tp = kmem_zalloc(sizeof(*tp), KM_SLEEP);
   2749 	callout_init(&tp->t_rstrt_ch, 0);
   2750 	callout_setfunc(&tp->t_rstrt_ch, ttrstrt, tp);
   2751 	tp->t_qsize = tty_qsize;
   2752 	clalloc(&tp->t_rawq, tp->t_qsize, 1);
   2753 	cv_init(&tp->t_rawcv, "ttyraw");
   2754 	cv_init(&tp->t_rawcvf, "ttyrawf");
   2755 	clalloc(&tp->t_canq, tp->t_qsize, 1);
   2756 	cv_init(&tp->t_cancv, "ttycan");
   2757 	cv_init(&tp->t_cancvf, "ttycanf");
   2758 	/* output queue doesn't need quoting */
   2759 	clalloc(&tp->t_outq, tp->t_qsize, 0);
   2760 	cv_init(&tp->t_outcv, "ttyout");
   2761 	cv_init(&tp->t_outcvf, "ttyoutf");
   2762 	/* Set default line discipline. */
   2763 	tp->t_linesw = ttyldisc_default();
   2764 	tp->t_dev = NODEV;
   2765 	selinit(&tp->t_rsel);
   2766 	selinit(&tp->t_wsel);
   2767 	for (i = 0; i < TTYSIG_COUNT; i++)  {
   2768 		sigemptyset(&tp->t_sigs[i]);
   2769 	}
   2770 
   2771 	return tp;
   2772 }
   2773 
   2774 /*
   2775  * Free a tty structure and its buffers.
   2776  *
   2777  * Be sure to call tty_detach() for any tty that has been
   2778  * tty_attach()ed.
   2779  */
   2780 void
   2781 tty_free(struct tty *tp)
   2782 {
   2783 	int i;
   2784 
   2785 	mutex_enter(proc_lock);
   2786 	mutex_enter(&tty_lock);
   2787 	for (i = 0; i < TTYSIG_COUNT; i++)
   2788 		sigemptyset(&tp->t_sigs[i]);
   2789 	if (tp->t_sigcount != 0)
   2790 		TAILQ_REMOVE(&tty_sigqueue, tp, t_sigqueue);
   2791 	mutex_exit(&tty_lock);
   2792 	mutex_exit(proc_lock);
   2793 
   2794 	callout_halt(&tp->t_rstrt_ch, NULL);
   2795 	callout_destroy(&tp->t_rstrt_ch);
   2796 	ttyldisc_release(tp->t_linesw);
   2797 	clfree(&tp->t_rawq);
   2798 	clfree(&tp->t_canq);
   2799 	clfree(&tp->t_outq);
   2800 	cv_destroy(&tp->t_rawcv);
   2801 	cv_destroy(&tp->t_rawcvf);
   2802 	cv_destroy(&tp->t_cancv);
   2803 	cv_destroy(&tp->t_cancvf);
   2804 	cv_destroy(&tp->t_outcv);
   2805 	cv_destroy(&tp->t_outcvf);
   2806 	seldestroy(&tp->t_rsel);
   2807 	seldestroy(&tp->t_wsel);
   2808 	kmem_free(tp, sizeof(*tp));
   2809 }
   2810 
   2811 /*
   2812  * ttyprintf_nolock: send a message to a specific tty, without locking.
   2813  *
   2814  * => should be used only by tty driver or anything that knows the
   2815  *    underlying tty will not be revoked(2)'d away.  [otherwise,
   2816  *    use tprintf]
   2817  */
   2818 static void
   2819 ttyprintf_nolock(struct tty *tp, const char *fmt, ...)
   2820 {
   2821 	va_list ap;
   2822 
   2823 	/* No mutex needed; going to process TTY. */
   2824 	va_start(ap, fmt);
   2825 	kprintf(fmt, TOTTY|NOLOCK, tp, NULL, ap);
   2826 	va_end(ap);
   2827 }
   2828 
   2829 static int
   2830 tty_listener_cb(kauth_cred_t cred, kauth_action_t action, void *cookie,
   2831     void *arg0, void *arg1, void *arg2, void *arg3)
   2832 {
   2833 	struct tty *tty;
   2834 	int result;
   2835 
   2836 	result = KAUTH_RESULT_DEFER;
   2837 
   2838 	if (action != KAUTH_DEVICE_TTY_OPEN)
   2839 		return result;
   2840 
   2841 	tty = arg0;
   2842 
   2843 	/* If it's not opened, we allow. */
   2844 	if ((tty->t_state & TS_ISOPEN) == 0)
   2845 		result = KAUTH_RESULT_ALLOW;
   2846 	else {
   2847 		/*
   2848 		 * If it's opened, we can only allow if it's not exclusively
   2849 		 * opened; otherwise, that's a privileged operation and we
   2850 		 * let the secmodel handle it.
   2851 		 */
   2852 		if ((tty->t_state & TS_XCLUDE) == 0)
   2853 			result = KAUTH_RESULT_ALLOW;
   2854 	}
   2855 
   2856 	return result;
   2857 }
   2858 
   2859 /*
   2860  * Initialize the tty subsystem.
   2861  */
   2862 void
   2863 tty_init(void)
   2864 {
   2865 
   2866 	mutex_init(&tty_lock, MUTEX_DEFAULT, IPL_VM);
   2867 	rw_init(&ttcompat_lock);
   2868 	tty_sigsih = softint_establish(SOFTINT_CLOCK, ttysigintr, NULL);
   2869 	KASSERT(tty_sigsih != NULL);
   2870 
   2871 	tty_listener = kauth_listen_scope(KAUTH_SCOPE_DEVICE,
   2872 	    tty_listener_cb, NULL);
   2873 
   2874 	sysctl_kern_tty_setup();
   2875 }
   2876 
   2877 /*
   2878  * Send a signal from a tty to its process group or session leader.
   2879  * Handoff to the target is deferred to a soft interrupt.
   2880  */
   2881 void
   2882 ttysig(struct tty *tp, enum ttysigtype st, int sig)
   2883 {
   2884 	sigset_t *sp;
   2885 
   2886 	/* XXXSMP not yet KASSERT(mutex_owned(&tty_lock)); */
   2887 
   2888 	sp = &tp->t_sigs[st];
   2889 	if (sigismember(sp, sig))
   2890 		return;
   2891 	sigaddset(sp, sig);
   2892 	if (tp->t_sigcount++ == 0)
   2893 		TAILQ_INSERT_TAIL(&tty_sigqueue, tp, t_sigqueue);
   2894 	softint_schedule(tty_sigsih);
   2895 }
   2896 
   2897 /*
   2898  * Deliver deferred signals from ttys.  Note that the process groups
   2899  * and sessions associated with the ttys may have changed from when
   2900  * the signal was originally sent, but in practice it should not matter.
   2901  * For signals produced as a result of a syscall, the soft interrupt
   2902  * will fire before the syscall returns to the user.
   2903  */
   2904 static void
   2905 ttysigintr(void *cookie)
   2906 {
   2907 	struct tty *tp;
   2908 	enum ttysigtype st;
   2909 	struct pgrp *pgrp;
   2910 	struct session *sess;
   2911 	int sig, lflag;
   2912 	char infobuf[200];
   2913 
   2914 	mutex_enter(proc_lock);
   2915 	mutex_spin_enter(&tty_lock);
   2916 	while ((tp = TAILQ_FIRST(&tty_sigqueue)) != NULL) {
   2917 		KASSERT(tp->t_sigcount > 0);
   2918 		for (st = 0; st < TTYSIG_COUNT; st++) {
   2919 			if ((sig = firstsig(&tp->t_sigs[st])) != 0)
   2920 				break;
   2921 		}
   2922 		KASSERT(st < TTYSIG_COUNT);
   2923 		sigdelset(&tp->t_sigs[st], sig);
   2924 		if (--tp->t_sigcount == 0)
   2925 			TAILQ_REMOVE(&tty_sigqueue, tp, t_sigqueue);
   2926 		pgrp = tp->t_pgrp;
   2927 		sess = tp->t_session;
   2928 		lflag = tp->t_lflag;
   2929 		if  (sig == SIGINFO) {
   2930 			if (ISSET(tp->t_state, TS_SIGINFO)) {
   2931 				/* Via ioctl: ignore tty option. */
   2932 				tp->t_state &= ~TS_SIGINFO;
   2933 				lflag |= ISIG;
   2934 			}
   2935 			if (!ISSET(lflag, NOKERNINFO)) {
   2936 				mutex_spin_exit(&tty_lock);
   2937 				ttygetinfo(tp, 1, infobuf, sizeof(infobuf));
   2938 				mutex_spin_enter(&tty_lock);
   2939 				ttyputinfo(tp, infobuf);
   2940 			}
   2941 			if (!ISSET(lflag, ISIG))
   2942 				continue;
   2943 		}
   2944 		mutex_spin_exit(&tty_lock);
   2945 		KASSERT(sig != 0);
   2946 		switch (st) {
   2947 		case TTYSIG_PG1:
   2948 			if (pgrp != NULL)
   2949 				pgsignal(pgrp, sig, 1);
   2950 			break;
   2951 		case TTYSIG_PG2:
   2952 			if (pgrp != NULL)
   2953 				pgsignal(pgrp, sig, sess != NULL);
   2954 			break;
   2955 		case TTYSIG_LEADER:
   2956 			if (sess != NULL && sess->s_leader != NULL)
   2957 				psignal(sess->s_leader, sig);
   2958 			break;
   2959 		default:
   2960 			/* NOTREACHED */
   2961 			break;
   2962 		}
   2963 		mutex_spin_enter(&tty_lock);
   2964 	}
   2965 	mutex_spin_exit(&tty_lock);
   2966 	mutex_exit(proc_lock);
   2967 }
   2968