Home | History | Annotate | Line # | Download | only in kern
tty.c revision 1.139
      1 /*	$NetBSD: tty.c,v 1.139 2002/07/21 20:43:53 jdolecek Exp $	*/
      2 
      3 /*-
      4  * Copyright (c) 1982, 1986, 1990, 1991, 1993
      5  *	The Regents of the University of California.  All rights reserved.
      6  * (c) UNIX System Laboratories, Inc.
      7  * All or some portions of this file are derived from material licensed
      8  * to the University of California by American Telephone and Telegraph
      9  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
     10  * the permission of UNIX System Laboratories, Inc.
     11  *
     12  * Redistribution and use in source and binary forms, with or without
     13  * modification, are permitted provided that the following conditions
     14  * are met:
     15  * 1. Redistributions of source code must retain the above copyright
     16  *    notice, this list of conditions and the following disclaimer.
     17  * 2. Redistributions in binary form must reproduce the above copyright
     18  *    notice, this list of conditions and the following disclaimer in the
     19  *    documentation and/or other materials provided with the distribution.
     20  * 3. All advertising materials mentioning features or use of this software
     21  *    must display the following acknowledgement:
     22  *	This product includes software developed by the University of
     23  *	California, Berkeley and its contributors.
     24  * 4. Neither the name of the University nor the names of its contributors
     25  *    may be used to endorse or promote products derived from this software
     26  *    without specific prior written permission.
     27  *
     28  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     29  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     30  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     31  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     32  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     33  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     34  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     35  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     36  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     37  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     38  * SUCH DAMAGE.
     39  *
     40  *	@(#)tty.c	8.13 (Berkeley) 1/9/95
     41  */
     42 
     43 #include <sys/cdefs.h>
     44 __KERNEL_RCSID(0, "$NetBSD: tty.c,v 1.139 2002/07/21 20:43:53 jdolecek Exp $");
     45 
     46 #include "opt_uconsole.h"
     47 
     48 #include <sys/param.h>
     49 #include <sys/systm.h>
     50 #include <sys/ioctl.h>
     51 #include <sys/proc.h>
     52 #define	TTYDEFCHARS
     53 #include <sys/tty.h>
     54 #undef	TTYDEFCHARS
     55 #include <sys/file.h>
     56 #include <sys/conf.h>
     57 #include <sys/dkstat.h>
     58 #include <sys/uio.h>
     59 #include <sys/kernel.h>
     60 #include <sys/vnode.h>
     61 #include <sys/syslog.h>
     62 #include <sys/malloc.h>
     63 #include <sys/pool.h>
     64 #include <sys/signalvar.h>
     65 #include <sys/resourcevar.h>
     66 #include <sys/poll.h>
     67 
     68 static int	ttnread(struct tty *);
     69 static void	ttyblock(struct tty *);
     70 static void	ttyecho(int, struct tty *);
     71 static void	ttyrubo(struct tty *, int);
     72 static int	proc_compare(struct proc *, struct proc *);
     73 
     74 /* Symbolic sleep message strings. */
     75 const char	ttclos[] = "ttycls";
     76 const char	ttopen[] = "ttyopn";
     77 const char	ttybg[] = "ttybg";
     78 const char	ttyin[] = "ttyin";
     79 const char	ttyout[] = "ttyout";
     80 
     81 /*
     82  * Used to determine whether we still have a connection.  This is true in
     83  * one of 3 cases:
     84  * 1) We have carrier.
     85  * 2) It's a locally attached terminal, and we are therefore ignoring carrier.
     86  * 3) We're using a flow control mechanism that overloads the carrier signal.
     87  */
     88 #define	CONNECTED(tp)	(ISSET(tp->t_state, TS_CARR_ON) ||	\
     89 			 ISSET(tp->t_cflag, CLOCAL | MDMBUF))
     90 
     91 /*
     92  * Table with character classes and parity. The 8th bit indicates parity,
     93  * the 7th bit indicates the character is an alphameric or underscore (for
     94  * ALTWERASE), and the low 6 bits indicate delay type.  If the low 6 bits
     95  * are 0 then the character needs no special processing on output; classes
     96  * other than 0 might be translated or (not currently) require delays.
     97  */
     98 #define	E	0x00	/* Even parity. */
     99 #define	O	0x80	/* Odd parity. */
    100 #define	PARITY(c)	(char_type[c] & O)
    101 
    102 #define	ALPHA	0x40	/* Alpha or underscore. */
    103 #define	ISALPHA(c)	(char_type[(c) & TTY_CHARMASK] & ALPHA)
    104 
    105 #define	CCLASSMASK	0x3f
    106 #define	CCLASS(c)	(char_type[c] & CCLASSMASK)
    107 
    108 #define	BS	BACKSPACE
    109 #define	CC	CONTROL
    110 #define	CR	RETURN
    111 #define	NA	ORDINARY | ALPHA
    112 #define	NL	NEWLINE
    113 #define	NO	ORDINARY
    114 #define	TB	TAB
    115 #define	VT	VTAB
    116 
    117 char const char_type[] = {
    118 	E|CC, O|CC, O|CC, E|CC, O|CC, E|CC, E|CC, O|CC,	/* nul - bel */
    119 	O|BS, E|TB, E|NL, O|CC, E|VT, O|CR, O|CC, E|CC,	/* bs - si */
    120 	O|CC, E|CC, E|CC, O|CC, E|CC, O|CC, O|CC, E|CC,	/* dle - etb */
    121 	E|CC, O|CC, O|CC, E|CC, O|CC, E|CC, E|CC, O|CC,	/* can - us */
    122 	O|NO, E|NO, E|NO, O|NO, E|NO, O|NO, O|NO, E|NO,	/* sp - ' */
    123 	E|NO, O|NO, O|NO, E|NO, O|NO, E|NO, E|NO, O|NO,	/* ( - / */
    124 	E|NA, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA,	/* 0 - 7 */
    125 	O|NA, E|NA, E|NO, O|NO, E|NO, O|NO, O|NO, E|NO,	/* 8 - ? */
    126 	O|NO, E|NA, E|NA, O|NA, E|NA, O|NA, O|NA, E|NA,	/* @ - G */
    127 	E|NA, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA,	/* H - O */
    128 	E|NA, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA,	/* P - W */
    129 	O|NA, E|NA, E|NA, O|NO, E|NO, O|NO, O|NO, O|NA,	/* X - _ */
    130 	E|NO, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA,	/* ` - g */
    131 	O|NA, E|NA, E|NA, O|NA, E|NA, O|NA, O|NA, E|NA,	/* h - o */
    132 	O|NA, E|NA, E|NA, O|NA, E|NA, O|NA, O|NA, E|NA,	/* p - w */
    133 	E|NA, O|NA, O|NA, E|NO, O|NO, E|NO, E|NO, O|CC,	/* x - del */
    134 	/*
    135 	 * Meta chars; should be settable per character set;
    136 	 * for now, treat them all as normal characters.
    137 	 */
    138 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    139 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    140 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    141 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    142 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    143 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    144 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    145 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    146 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    147 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    148 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    149 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    150 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    151 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    152 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    153 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
    154 };
    155 #undef	BS
    156 #undef	CC
    157 #undef	CR
    158 #undef	NA
    159 #undef	NL
    160 #undef	NO
    161 #undef	TB
    162 #undef	VT
    163 
    164 /* Macros to clear/set/test flags. */
    165 #define	SET(t, f)	(t) |= (f)
    166 #define	CLR(t, f)	(t) &= ~((unsigned)(f))
    167 #define	ISSET(t, f)	((t) & (f))
    168 
    169 struct ttylist_head ttylist;	/* TAILQ_HEAD */
    170 int tty_count;
    171 
    172 struct pool tty_pool;
    173 
    174 u_int64_t tk_cancc;
    175 u_int64_t tk_nin;
    176 u_int64_t tk_nout;
    177 u_int64_t tk_rawcc;
    178 
    179 int
    180 ttyopen(struct tty *tp, int dialout, int nonblock)
    181 {
    182 	int	s, error;
    183 
    184 	s = spltty();
    185 
    186 	if (dialout) {
    187 		/*
    188 		 * If the device is already open for non-dialout, fail.
    189 		 * Otherwise, set TS_DIALOUT to block any pending non-dialout
    190 		 * opens.
    191 		 */
    192 		if (ISSET(tp->t_state, TS_ISOPEN) &&
    193 		    !ISSET(tp->t_state, TS_DIALOUT)) {
    194 			splx(s);
    195 			return (EBUSY);
    196 		}
    197 		SET(tp->t_state, TS_DIALOUT);
    198 	} else {
    199 		if (!nonblock) {
    200 			/*
    201 			 * Wait for carrier.  Also wait for any dialout
    202 			 * processes to close the tty first.
    203 			 */
    204 			while (ISSET(tp->t_state, TS_DIALOUT) ||
    205 			    (!ISSET(tp->t_state, TS_CARR_ON) &&
    206 			    !ISSET(tp->t_cflag, CLOCAL | MDMBUF))) {
    207 				tp->t_wopen++;
    208 				error = ttysleep(tp, &tp->t_rawq,
    209 				    TTIPRI | PCATCH, ttopen, 0);
    210 				tp->t_wopen--;
    211 				if (error) {
    212 					splx(s);
    213 					return (error);
    214 				}
    215 			}
    216 		} else {
    217 			/*
    218 			 * Don't allow a non-blocking non-dialout open if the
    219 			 * device is already open for dialout.
    220 			 */
    221 			if (ISSET(tp->t_state, TS_DIALOUT)) {
    222 				splx(s);
    223 				return (EBUSY);
    224 			}
    225 		}
    226 	}
    227 
    228 	splx(s);
    229 	return (0);
    230 }
    231 
    232 /*
    233  * Initial open of tty, or (re)entry to standard tty line discipline.
    234  */
    235 int
    236 ttylopen(dev_t device, struct tty *tp)
    237 {
    238 	int	s;
    239 
    240 	s = spltty();
    241 	tp->t_dev = device;
    242 	if (!ISSET(tp->t_state, TS_ISOPEN)) {
    243 		SET(tp->t_state, TS_ISOPEN);
    244 		memset(&tp->t_winsize, 0, sizeof(tp->t_winsize));
    245 #ifdef COMPAT_OLDTTY
    246 		tp->t_flags = 0;
    247 #endif
    248 	}
    249 	splx(s);
    250 	return (0);
    251 }
    252 
    253 /*
    254  * Handle close() on a tty line: flush and set to initial state,
    255  * bumping generation number so that pending read/write calls
    256  * can detect recycling of the tty.
    257  */
    258 int
    259 ttyclose(struct tty *tp)
    260 {
    261 	extern struct tty *constty;	/* Temporary virtual console. */
    262 
    263 	if (constty == tp)
    264 		constty = NULL;
    265 
    266 	ttyflush(tp, FREAD | FWRITE);
    267 
    268 	tp->t_gen++;
    269 	tp->t_pgrp = NULL;
    270 	if (tp->t_session != NULL) {
    271 		SESSRELE(tp->t_session);
    272 		tp->t_session = NULL;
    273 	}
    274 	tp->t_state = 0;
    275 	return (0);
    276 }
    277 
    278 #define	FLUSHQ(q) {							\
    279 	if ((q)->c_cc)							\
    280 		ndflush(q, (q)->c_cc);					\
    281 }
    282 
    283 /*
    284  * This macro is used in canonical mode input processing, where a read
    285  * request shall not return unless a 'line delimiter' ('\n') or 'break'
    286  * (EOF, EOL, EOL2) character (or a signal) has been received. As EOL2
    287  * is an extension to the POSIX.1 defined set of special characters,
    288  * recognize it only if IEXTEN is set in the set of local flags.
    289  */
    290 #define	TTBREAKC(c, lflg)						\
    291 	((c) == '\n' || (((c) == cc[VEOF] || (c) == cc[VEOL] ||		\
    292 	((c) == cc[VEOL2] && ISSET(lflg, IEXTEN))) && (c) != _POSIX_VDISABLE))
    293 
    294 
    295 /*
    296  * Process input of a single character received on a tty.
    297  */
    298 int
    299 ttyinput(int c, struct tty *tp)
    300 {
    301 	int	iflag, lflag, i, error;
    302 	u_char	*cc;
    303 
    304 	/*
    305 	 * Unless the receiver is enabled, drop incoming data.
    306 	 */
    307 	if (!ISSET(tp->t_cflag, CREAD))
    308 		return (0);
    309 
    310 	/*
    311 	 * If input is pending take it first.
    312 	 */
    313 	lflag = tp->t_lflag;
    314 	if (ISSET(lflag, PENDIN))
    315 		ttypend(tp);
    316 	/*
    317 	 * Gather stats.
    318 	 */
    319 	if (ISSET(lflag, ICANON)) {
    320 		++tk_cancc;
    321 		++tp->t_cancc;
    322 	} else {
    323 		++tk_rawcc;
    324 		++tp->t_rawcc;
    325 	}
    326 	++tk_nin;
    327 
    328 	cc = tp->t_cc;
    329 
    330 	/*
    331 	 * Handle exceptional conditions (break, parity, framing).
    332 	 */
    333 	iflag = tp->t_iflag;
    334 	if ((error = (ISSET(c, TTY_ERRORMASK))) != 0) {
    335 		CLR(c, TTY_ERRORMASK);
    336 		if (ISSET(error, TTY_FE) && c == 0) {		/* Break. */
    337 			if (ISSET(iflag, IGNBRK))
    338 				return (0);
    339 			else if (ISSET(iflag, BRKINT)) {
    340 				ttyflush(tp, FREAD | FWRITE);
    341 				pgsignal(tp->t_pgrp, SIGINT, 1);
    342 				return (0);
    343 			} else if (ISSET(iflag, PARMRK))
    344 				goto parmrk;
    345 		} else if ((ISSET(error, TTY_PE) && ISSET(iflag, INPCK)) ||
    346 		    ISSET(error, TTY_FE)) {
    347 			if (ISSET(iflag, IGNPAR))
    348 				return (0);
    349 			else if (ISSET(iflag, PARMRK)) {
    350  parmrk:			(void)putc(0377 | TTY_QUOTE, &tp->t_rawq);
    351 				(void)putc(0    | TTY_QUOTE, &tp->t_rawq);
    352 				(void)putc(c    | TTY_QUOTE, &tp->t_rawq);
    353 				return (0);
    354 			} else
    355 				c = 0;
    356 		}
    357 	} else if (c == 0377 &&
    358 	    ISSET(iflag, ISTRIP|IGNPAR|INPCK|PARMRK) == (INPCK|PARMRK)) {
    359 		/* "Escape" a valid character of '\377'. */
    360 		(void)putc(0377 | TTY_QUOTE, &tp->t_rawq);
    361 		(void)putc(0377 | TTY_QUOTE, &tp->t_rawq);
    362 		goto endcase;
    363 	}
    364 
    365 	/*
    366 	 * In tandem mode, check high water mark.
    367 	 */
    368 	if (ISSET(iflag, IXOFF) || ISSET(tp->t_cflag, CHWFLOW))
    369 		ttyblock(tp);
    370 	if (!ISSET(tp->t_state, TS_TYPEN) && ISSET(iflag, ISTRIP))
    371 		CLR(c, 0x80);
    372 	if (!ISSET(lflag, EXTPROC)) {
    373 		/*
    374 		 * Check for literal nexting very first
    375 		 */
    376 		if (ISSET(tp->t_state, TS_LNCH)) {
    377 			SET(c, TTY_QUOTE);
    378 			CLR(tp->t_state, TS_LNCH);
    379 		}
    380 		/*
    381 		 * Scan for special characters.  This code
    382 		 * is really just a big case statement with
    383 		 * non-constant cases.  The bottom of the
    384 		 * case statement is labeled ``endcase'', so goto
    385 		 * it after a case match, or similar.
    386 		 */
    387 
    388 		/*
    389 		 * Control chars which aren't controlled
    390 		 * by ICANON, ISIG, or IXON.
    391 		 */
    392 		if (ISSET(lflag, IEXTEN)) {
    393 			if (CCEQ(cc[VLNEXT], c)) {
    394 				if (ISSET(lflag, ECHO)) {
    395 					if (ISSET(lflag, ECHOE)) {
    396 						(void)ttyoutput('^', tp);
    397 						(void)ttyoutput('\b', tp);
    398 					} else
    399 						ttyecho(c, tp);
    400 				}
    401 				SET(tp->t_state, TS_LNCH);
    402 				goto endcase;
    403 			}
    404 			if (CCEQ(cc[VDISCARD], c)) {
    405 				if (ISSET(lflag, FLUSHO))
    406 					CLR(tp->t_lflag, FLUSHO);
    407 				else {
    408 					ttyflush(tp, FWRITE);
    409 					ttyecho(c, tp);
    410 					if (tp->t_rawq.c_cc + tp->t_canq.c_cc)
    411 						ttyretype(tp);
    412 					SET(tp->t_lflag, FLUSHO);
    413 				}
    414 				goto startoutput;
    415 			}
    416 		}
    417 		/*
    418 		 * Signals.
    419 		 */
    420 		if (ISSET(lflag, ISIG)) {
    421 			if (CCEQ(cc[VINTR], c) || CCEQ(cc[VQUIT], c)) {
    422 				if (!ISSET(lflag, NOFLSH))
    423 					ttyflush(tp, FREAD | FWRITE);
    424 				ttyecho(c, tp);
    425 				pgsignal(tp->t_pgrp,
    426 				    CCEQ(cc[VINTR], c) ? SIGINT : SIGQUIT, 1);
    427 				goto endcase;
    428 			}
    429 			if (CCEQ(cc[VSUSP], c)) {
    430 				if (!ISSET(lflag, NOFLSH))
    431 					ttyflush(tp, FREAD);
    432 				ttyecho(c, tp);
    433 				pgsignal(tp->t_pgrp, SIGTSTP, 1);
    434 				goto endcase;
    435 			}
    436 		}
    437 		/*
    438 		 * Handle start/stop characters.
    439 		 */
    440 		if (ISSET(iflag, IXON)) {
    441 			if (CCEQ(cc[VSTOP], c)) {
    442 				if (!ISSET(tp->t_state, TS_TTSTOP)) {
    443 					SET(tp->t_state, TS_TTSTOP);
    444 					(*cdevsw[major(tp->t_dev)].d_stop)(tp,
    445 					   0);
    446 					return (0);
    447 				}
    448 				if (!CCEQ(cc[VSTART], c))
    449 					return (0);
    450 				/*
    451 				 * if VSTART == VSTOP then toggle
    452 				 */
    453 				goto endcase;
    454 			}
    455 			if (CCEQ(cc[VSTART], c))
    456 				goto restartoutput;
    457 		}
    458 		/*
    459 		 * IGNCR, ICRNL, & INLCR
    460 		 */
    461 		if (c == '\r') {
    462 			if (ISSET(iflag, IGNCR))
    463 				goto endcase;
    464 			else if (ISSET(iflag, ICRNL))
    465 				c = '\n';
    466 		} else if (c == '\n' && ISSET(iflag, INLCR))
    467 			c = '\r';
    468 	}
    469 	if (!ISSET(tp->t_lflag, EXTPROC) && ISSET(lflag, ICANON)) {
    470 		/*
    471 		 * From here on down canonical mode character
    472 		 * processing takes place.
    473 		 */
    474 		/*
    475 		 * erase (^H / ^?)
    476 		 */
    477 		if (CCEQ(cc[VERASE], c)) {
    478 			if (tp->t_rawq.c_cc)
    479 				ttyrub(unputc(&tp->t_rawq), tp);
    480 			goto endcase;
    481 		}
    482 		/*
    483 		 * kill (^U)
    484 		 */
    485 		if (CCEQ(cc[VKILL], c)) {
    486 			if (ISSET(lflag, ECHOKE) &&
    487 			    tp->t_rawq.c_cc == tp->t_rocount &&
    488 			    !ISSET(lflag, ECHOPRT))
    489 				while (tp->t_rawq.c_cc)
    490 					ttyrub(unputc(&tp->t_rawq), tp);
    491 			else {
    492 				ttyecho(c, tp);
    493 				if (ISSET(lflag, ECHOK) ||
    494 				    ISSET(lflag, ECHOKE))
    495 					ttyecho('\n', tp);
    496 				FLUSHQ(&tp->t_rawq);
    497 				tp->t_rocount = 0;
    498 			}
    499 			CLR(tp->t_state, TS_LOCAL);
    500 			goto endcase;
    501 		}
    502 		/*
    503 		 * Extensions to the POSIX.1 GTI set of functions.
    504 		 */
    505 		if (ISSET(lflag, IEXTEN)) {
    506 			/*
    507 			 * word erase (^W)
    508 			 */
    509 			if (CCEQ(cc[VWERASE], c)) {
    510 				int alt = ISSET(lflag, ALTWERASE);
    511 				int ctype;
    512 
    513 				/*
    514 				 * erase whitespace
    515 				 */
    516 				while ((c = unputc(&tp->t_rawq)) == ' ' ||
    517 				    c == '\t')
    518 					ttyrub(c, tp);
    519 				if (c == -1)
    520 					goto endcase;
    521 				/*
    522 				 * erase last char of word and remember the
    523 				 * next chars type (for ALTWERASE)
    524 				 */
    525 				ttyrub(c, tp);
    526 				c = unputc(&tp->t_rawq);
    527 				if (c == -1)
    528 					goto endcase;
    529 				if (c == ' ' || c == '\t') {
    530 					(void)putc(c, &tp->t_rawq);
    531 					goto endcase;
    532 				}
    533 				ctype = ISALPHA(c);
    534 				/*
    535 				 * erase rest of word
    536 				 */
    537 				do {
    538 					ttyrub(c, tp);
    539 					c = unputc(&tp->t_rawq);
    540 					if (c == -1)
    541 						goto endcase;
    542 				} while (c != ' ' && c != '\t' &&
    543 				    (alt == 0 || ISALPHA(c) == ctype));
    544 				(void)putc(c, &tp->t_rawq);
    545 				goto endcase;
    546 			}
    547 			/*
    548 			 * reprint line (^R)
    549 			 */
    550 			if (CCEQ(cc[VREPRINT], c)) {
    551 				ttyretype(tp);
    552 				goto endcase;
    553 			}
    554 			/*
    555 			 * ^T - kernel info and generate SIGINFO
    556 			 */
    557 			if (CCEQ(cc[VSTATUS], c)) {
    558 				if (!ISSET(lflag, NOKERNINFO))
    559 					ttyinfo(tp);
    560 				if (ISSET(lflag, ISIG))
    561 					pgsignal(tp->t_pgrp, SIGINFO, 1);
    562 				goto endcase;
    563 			}
    564 		}
    565 	}
    566 	/*
    567 	 * Check for input buffer overflow
    568 	 */
    569 	if (tp->t_rawq.c_cc + tp->t_canq.c_cc >= TTYHOG) {
    570 		if (ISSET(iflag, IMAXBEL)) {
    571 			if (tp->t_outq.c_cc < tp->t_hiwat)
    572 				(void)ttyoutput(CTRL('g'), tp);
    573 		} else
    574 			ttyflush(tp, FREAD | FWRITE);
    575 		goto endcase;
    576 	}
    577 	/*
    578 	 * Put data char in q for user and
    579 	 * wakeup on seeing a line delimiter.
    580 	 */
    581 	if (putc(c, &tp->t_rawq) >= 0) {
    582 		if (!ISSET(lflag, ICANON)) {
    583 			ttwakeup(tp);
    584 			ttyecho(c, tp);
    585 			goto endcase;
    586 		}
    587 		if (TTBREAKC(c, lflag)) {
    588 			tp->t_rocount = 0;
    589 			catq(&tp->t_rawq, &tp->t_canq);
    590 			ttwakeup(tp);
    591 		} else if (tp->t_rocount++ == 0)
    592 			tp->t_rocol = tp->t_column;
    593 		if (ISSET(tp->t_state, TS_ERASE)) {
    594 			/*
    595 			 * end of prterase \.../
    596 			 */
    597 			CLR(tp->t_state, TS_ERASE);
    598 			(void)ttyoutput('/', tp);
    599 		}
    600 		i = tp->t_column;
    601 		ttyecho(c, tp);
    602 		if (CCEQ(cc[VEOF], c) && ISSET(lflag, ECHO)) {
    603 			/*
    604 			 * Place the cursor over the '^' of the ^D.
    605 			 */
    606 			i = min(2, tp->t_column - i);
    607 			while (i > 0) {
    608 				(void)ttyoutput('\b', tp);
    609 				i--;
    610 			}
    611 		}
    612 	}
    613  endcase:
    614 	/*
    615 	 * IXANY means allow any character to restart output.
    616 	 */
    617 	if (ISSET(tp->t_state, TS_TTSTOP) &&
    618 	    !ISSET(iflag, IXANY) && cc[VSTART] != cc[VSTOP])
    619 		return (0);
    620  restartoutput:
    621 	CLR(tp->t_lflag, FLUSHO);
    622 	CLR(tp->t_state, TS_TTSTOP);
    623  startoutput:
    624 	return (ttstart(tp));
    625 }
    626 
    627 /*
    628  * Output a single character on a tty, doing output processing
    629  * as needed (expanding tabs, newline processing, etc.).
    630  * Returns < 0 if succeeds, otherwise returns char to resend.
    631  * Must be recursive.
    632  */
    633 int
    634 ttyoutput(int c, struct tty *tp)
    635 {
    636 	long	oflag;
    637 	int	col, notout, s;
    638 
    639 	oflag = tp->t_oflag;
    640 	if (!ISSET(oflag, OPOST)) {
    641 		tk_nout++;
    642 		tp->t_outcc++;
    643 		if (!ISSET(tp->t_lflag, FLUSHO) && putc(c, &tp->t_outq))
    644 			return (c);
    645 		return (-1);
    646 	}
    647 	/*
    648 	 * Do tab expansion if OXTABS is set.  Special case if we do external
    649 	 * processing, we don't do the tab expansion because we'll probably
    650 	 * get it wrong.  If tab expansion needs to be done, let it happen
    651 	 * externally.
    652 	 */
    653 	CLR(c, ~TTY_CHARMASK);
    654 	if (c == '\t' &&
    655 	    ISSET(oflag, OXTABS) && !ISSET(tp->t_lflag, EXTPROC)) {
    656 		c = 8 - (tp->t_column & 7);
    657 		if (ISSET(tp->t_lflag, FLUSHO)) {
    658 			notout = 0;
    659 		} else {
    660 			s = spltty();		/* Don't interrupt tabs. */
    661 			notout = b_to_q("        ", c, &tp->t_outq);
    662 			c -= notout;
    663 			tk_nout += c;
    664 			tp->t_outcc += c;
    665 			splx(s);
    666 		}
    667 		tp->t_column += c;
    668 		return (notout ? '\t' : -1);
    669 	}
    670 	if (c == CEOT && ISSET(oflag, ONOEOT))
    671 		return (-1);
    672 
    673 	/*
    674 	 * Newline translation: if ONLCR is set,
    675 	 * translate newline into "\r\n".
    676 	 */
    677 	if (c == '\n' && ISSET(tp->t_oflag, ONLCR)) {
    678 		tk_nout++;
    679 		tp->t_outcc++;
    680 		if (!ISSET(tp->t_lflag, FLUSHO) && putc('\r', &tp->t_outq))
    681 			return (c);
    682 	}
    683 	/* If OCRNL is set, translate "\r" into "\n". */
    684 	else if (c == '\r' && ISSET(tp->t_oflag, OCRNL))
    685 		c = '\n';
    686 	/* If ONOCR is set, don't transmit CRs when on column 0. */
    687 	else if (c == '\r' && ISSET(tp->t_oflag, ONOCR) && tp->t_column == 0)
    688 		return (-1);
    689 
    690 	tk_nout++;
    691 	tp->t_outcc++;
    692 	if (!ISSET(tp->t_lflag, FLUSHO) && putc(c, &tp->t_outq))
    693 		return (c);
    694 
    695 	col = tp->t_column;
    696 	switch (CCLASS(c)) {
    697 	case BACKSPACE:
    698 		if (col > 0)
    699 			--col;
    700 		break;
    701 	case CONTROL:
    702 		break;
    703 	case NEWLINE:
    704 		if (ISSET(tp->t_oflag, ONLCR | ONLRET))
    705 			col = 0;
    706 		break;
    707 	case RETURN:
    708 		col = 0;
    709 		break;
    710 	case ORDINARY:
    711 		++col;
    712 		break;
    713 	case TAB:
    714 		col = (col + 8) & ~7;
    715 		break;
    716 	}
    717 	tp->t_column = col;
    718 	return (-1);
    719 }
    720 
    721 /*
    722  * Ioctls for all tty devices.  Called after line-discipline specific ioctl
    723  * has been called to do discipline-specific functions and/or reject any
    724  * of these ioctl commands.
    725  */
    726 /* ARGSUSED */
    727 int
    728 ttioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
    729 {
    730 	extern struct tty *constty;	/* Temporary virtual console. */
    731 	struct linesw	*lp;
    732 	int		s, error;
    733 
    734 	/* If the ioctl involves modification, hang if in the background. */
    735 	switch (cmd) {
    736 	case  TIOCFLUSH:
    737 	case  TIOCDRAIN:
    738 	case  TIOCSBRK:
    739 	case  TIOCCBRK:
    740 	case  TIOCSTART:
    741 	case  TIOCSETA:
    742 	case  TIOCSETD:
    743 	case  TIOCSLINED:
    744 	case  TIOCSETAF:
    745 	case  TIOCSETAW:
    746 #ifdef notdef
    747 	case  TIOCSPGRP:
    748 #endif
    749 	case  TIOCSTAT:
    750 	case  TIOCSTI:
    751 	case  TIOCSWINSZ:
    752 #ifdef COMPAT_OLDTTY
    753 	case  TIOCLBIC:
    754 	case  TIOCLBIS:
    755 	case  TIOCLSET:
    756 	case  TIOCSETC:
    757 	case OTIOCSETD:
    758 	case  TIOCSETN:
    759 	case  TIOCSETP:
    760 	case  TIOCSLTC:
    761 #endif
    762 		while (isbackground(curproc, tp) &&
    763 		    p->p_pgrp->pg_jobc && (p->p_flag & P_PPWAIT) == 0 &&
    764 		    !sigismasked(p, SIGTTOU)) {
    765 			pgsignal(p->p_pgrp, SIGTTOU, 1);
    766 			error = ttysleep(tp, &lbolt, TTOPRI | PCATCH, ttybg, 0);
    767 			if (error)
    768 				return (error);
    769 		}
    770 		break;
    771 	}
    772 
    773 	switch (cmd) {			/* Process the ioctl. */
    774 	case FIOASYNC:			/* set/clear async i/o */
    775 		s = spltty();
    776 		if (*(int *)data)
    777 			SET(tp->t_state, TS_ASYNC);
    778 		else
    779 			CLR(tp->t_state, TS_ASYNC);
    780 		splx(s);
    781 		break;
    782 	case FIONBIO:			/* set/clear non-blocking i/o */
    783 		break;			/* XXX: delete. */
    784 	case FIONREAD:			/* get # bytes to read */
    785 		*(int *)data = ttnread(tp);
    786 		break;
    787 	case TIOCEXCL:			/* set exclusive use of tty */
    788 		s = spltty();
    789 		SET(tp->t_state, TS_XCLUDE);
    790 		splx(s);
    791 		break;
    792 	case TIOCFLUSH: {		/* flush buffers */
    793 		int flags = *(int *)data;
    794 
    795 		if (flags == 0)
    796 			flags = FREAD | FWRITE;
    797 		else
    798 			flags &= FREAD | FWRITE;
    799 		ttyflush(tp, flags);
    800 		break;
    801 	}
    802 	case TIOCCONS:			/* become virtual console */
    803 		if (*(int *)data) {
    804 			if (constty && constty != tp &&
    805 			    ISSET(constty->t_state, TS_CARR_ON | TS_ISOPEN) ==
    806 			    (TS_CARR_ON | TS_ISOPEN))
    807 				return (EBUSY);
    808 #ifndef	UCONSOLE
    809 			if ((error = suser(p->p_ucred, &p->p_acflag)) != 0)
    810 				return (error);
    811 #endif
    812 			constty = tp;
    813 		} else if (tp == constty)
    814 			constty = NULL;
    815 		break;
    816 	case TIOCDRAIN:			/* wait till output drained */
    817 		if ((error = ttywait(tp)) != 0)
    818 			return (error);
    819 		break;
    820 	case TIOCGETA: {		/* get termios struct */
    821 		struct termios *t = (struct termios *)data;
    822 
    823 		memcpy(t, &tp->t_termios, sizeof(struct termios));
    824 		break;
    825 	}
    826 	case TIOCGETD:			/* get line discipline */
    827 		*(int *)data = tp->t_linesw->l_no;
    828 		break;
    829 	case TIOCGLINED:
    830 		(void)strncpy((char *)data, tp->t_linesw->l_name,
    831 		    TTLINEDNAMELEN - 1);
    832 		break;
    833 	case TIOCGWINSZ:		/* get window size */
    834 		*(struct winsize *)data = tp->t_winsize;
    835 		break;
    836 	case TIOCGPGRP:			/* get pgrp of tty */
    837 		if (!isctty(p, tp))
    838 			return (ENOTTY);
    839 		*(int *)data = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PID;
    840 		break;
    841 	case TIOCGSID:			/* get sid of tty */
    842 		if (!isctty(p, tp))
    843 			return (ENOTTY);
    844 		*(int *)data = tp->t_session->s_sid;
    845 		break;
    846 #ifdef TIOCHPCL
    847 	case TIOCHPCL:			/* hang up on last close */
    848 		s = spltty();
    849 		SET(tp->t_cflag, HUPCL);
    850 		splx(s);
    851 		break;
    852 #endif
    853 	case TIOCNXCL:			/* reset exclusive use of tty */
    854 		s = spltty();
    855 		CLR(tp->t_state, TS_XCLUDE);
    856 		splx(s);
    857 		break;
    858 	case TIOCOUTQ:			/* output queue size */
    859 		*(int *)data = tp->t_outq.c_cc;
    860 		break;
    861 	case TIOCSETA:			/* set termios struct */
    862 	case TIOCSETAW:			/* drain output, set */
    863 	case TIOCSETAF: {		/* drn out, fls in, set */
    864 		struct termios *t = (struct termios *)data;
    865 
    866 		s = spltty();
    867 		if (cmd == TIOCSETAW || cmd == TIOCSETAF) {
    868 			if ((error = ttywait(tp)) != 0) {
    869 				splx(s);
    870 				return (error);
    871 			}
    872 			if (cmd == TIOCSETAF)
    873 				ttyflush(tp, FREAD);
    874 		}
    875 		if (!ISSET(t->c_cflag, CIGNORE)) {
    876 			/*
    877 			 * Set device hardware.
    878 			 */
    879 			if (tp->t_param && (error = (*tp->t_param)(tp, t))) {
    880 				splx(s);
    881 				return (error);
    882 			} else {
    883 				tp->t_cflag = t->c_cflag;
    884 				tp->t_ispeed = t->c_ispeed;
    885 				tp->t_ospeed = t->c_ospeed;
    886 				if (t->c_ospeed == 0 && tp->t_session &&
    887 				    tp->t_session->s_leader)
    888 					psignal(tp->t_session->s_leader,
    889 					    SIGHUP);
    890 			}
    891 			ttsetwater(tp);
    892 		}
    893 		if (cmd != TIOCSETAF) {
    894 			if (ISSET(t->c_lflag, ICANON) !=
    895 			    ISSET(tp->t_lflag, ICANON)) {
    896 				if (ISSET(t->c_lflag, ICANON)) {
    897 					SET(tp->t_lflag, PENDIN);
    898 					ttwakeup(tp);
    899 				} else {
    900 					struct clist tq;
    901 
    902 					catq(&tp->t_rawq, &tp->t_canq);
    903 					tq = tp->t_rawq;
    904 					tp->t_rawq = tp->t_canq;
    905 					tp->t_canq = tq;
    906 					CLR(tp->t_lflag, PENDIN);
    907 				}
    908 			}
    909 		}
    910 		tp->t_iflag = t->c_iflag;
    911 		tp->t_oflag = t->c_oflag;
    912 		/*
    913 		 * Make the EXTPROC bit read only.
    914 		 */
    915 		if (ISSET(tp->t_lflag, EXTPROC))
    916 			SET(t->c_lflag, EXTPROC);
    917 		else
    918 			CLR(t->c_lflag, EXTPROC);
    919 		tp->t_lflag = t->c_lflag | ISSET(tp->t_lflag, PENDIN);
    920 		memcpy(tp->t_cc, t->c_cc, sizeof(t->c_cc));
    921 		splx(s);
    922 		break;
    923 	}
    924 	case TIOCSETD: {		/* set line discipline */
    925 		int t = *(int *)data;
    926 
    927 		if ((u_int)t >= nlinesw)
    928 			return (ENXIO);
    929 		lp = linesw[t];
    930 		goto setldisc;
    931 	}
    932 	case TIOCSLINED: {		/* set line discipline */
    933 		char *name = (char *)data;
    934 		dev_t device;
    935 
    936 		/* Null terminate to prevent buffer overflow */
    937 		name[TTLINEDNAMELEN - 1] = '\0';
    938 		lp = ttyldisc_lookup(name);
    939 
    940  setldisc:
    941 		if (lp == NULL)
    942 			return (ENXIO);
    943 
    944 		if (lp != tp->t_linesw) {
    945 			device = tp->t_dev;
    946 			s = spltty();
    947 			(*tp->t_linesw->l_close)(tp, flag);
    948 			error = (*lp->l_open)(device, tp);
    949 			if (error) {
    950 				(void)(*tp->t_linesw->l_open)(device, tp);
    951 				splx(s);
    952 				return (error);
    953 			}
    954 			tp->t_linesw = lp;
    955 			splx(s);
    956 		}
    957 		break;
    958 	}
    959 	case TIOCSTART:			/* start output, like ^Q */
    960 		s = spltty();
    961 		if (ISSET(tp->t_state, TS_TTSTOP) ||
    962 		    ISSET(tp->t_lflag, FLUSHO)) {
    963 			CLR(tp->t_lflag, FLUSHO);
    964 			CLR(tp->t_state, TS_TTSTOP);
    965 			ttstart(tp);
    966 		}
    967 		splx(s);
    968 		break;
    969 	case TIOCSTI:			/* simulate terminal input */
    970 		if (p->p_ucred->cr_uid && (flag & FREAD) == 0)
    971 			return (EPERM);
    972 		if (p->p_ucred->cr_uid && !isctty(p, tp))
    973 			return (EACCES);
    974 		(*tp->t_linesw->l_rint)(*(u_char *)data, tp);
    975 		break;
    976 	case TIOCSTOP:			/* stop output, like ^S */
    977 		s = spltty();
    978 		if (!ISSET(tp->t_state, TS_TTSTOP)) {
    979 			SET(tp->t_state, TS_TTSTOP);
    980 			(*cdevsw[major(tp->t_dev)].d_stop)(tp, 0);
    981 		}
    982 		splx(s);
    983 		break;
    984 	case TIOCSCTTY:			/* become controlling tty */
    985 		/* Session ctty vnode pointer set in vnode layer. */
    986 		if (!SESS_LEADER(p) ||
    987 		    ((p->p_session->s_ttyvp || tp->t_session) &&
    988 		    (tp->t_session != p->p_session)))
    989 			return (EPERM);
    990 
    991 		if (tp->t_session)
    992 			SESSRELE(tp->t_session);
    993 
    994 		SESSHOLD(p->p_session);
    995 		tp->t_session = p->p_session;
    996 		tp->t_pgrp = p->p_pgrp;
    997 		p->p_session->s_ttyp = tp;
    998 		p->p_flag |= P_CONTROLT;
    999 		break;
   1000 	case TIOCSPGRP: {		/* set pgrp of tty */
   1001 		struct pgrp *pgrp = pgfind(*(int *)data);
   1002 
   1003 		if (!isctty(p, tp))
   1004 			return (ENOTTY);
   1005 		else if (pgrp == NULL)
   1006 			return (EINVAL);
   1007 		else if (pgrp->pg_session != p->p_session)
   1008 			return (EPERM);
   1009 		tp->t_pgrp = pgrp;
   1010 		break;
   1011 	}
   1012 	case TIOCSTAT:			/* get load avg stats */
   1013 		ttyinfo(tp);
   1014 		break;
   1015 	case TIOCSWINSZ:		/* set window size */
   1016 		if (memcmp((caddr_t)&tp->t_winsize, data,
   1017 		    sizeof(struct winsize))) {
   1018 			tp->t_winsize = *(struct winsize *)data;
   1019 			pgsignal(tp->t_pgrp, SIGWINCH, 1);
   1020 		}
   1021 		break;
   1022 	default:
   1023 #ifdef COMPAT_OLDTTY
   1024 		return (ttcompat(tp, cmd, data, flag, p));
   1025 #else
   1026 		return (EPASSTHROUGH);
   1027 #endif
   1028 	}
   1029 	return (0);
   1030 }
   1031 
   1032 int
   1033 ttpoll(struct tty *tp, int events, struct proc *p)
   1034 {
   1035 	int	revents, s;
   1036 
   1037 	revents = 0;
   1038 	s = spltty();
   1039 	if (events & (POLLIN | POLLRDNORM))
   1040 		if (ttnread(tp) > 0)
   1041 			revents |= events & (POLLIN | POLLRDNORM);
   1042 
   1043 	if (events & (POLLOUT | POLLWRNORM))
   1044 		if (tp->t_outq.c_cc <= tp->t_lowat)
   1045 			revents |= events & (POLLOUT | POLLWRNORM);
   1046 
   1047 	if (events & POLLHUP)
   1048 		if (!CONNECTED(tp))
   1049 			revents |= POLLHUP;
   1050 
   1051 	if (revents == 0) {
   1052 		if (events & (POLLIN | POLLHUP | POLLRDNORM))
   1053 			selrecord(p, &tp->t_rsel);
   1054 
   1055 		if (events & (POLLOUT | POLLWRNORM))
   1056 			selrecord(p, &tp->t_wsel);
   1057 	}
   1058 
   1059 	splx(s);
   1060 	return (revents);
   1061 }
   1062 
   1063 static int
   1064 ttnread(struct tty *tp)
   1065 {
   1066 	int	nread;
   1067 
   1068 	if (ISSET(tp->t_lflag, PENDIN))
   1069 		ttypend(tp);
   1070 	nread = tp->t_canq.c_cc;
   1071 	if (!ISSET(tp->t_lflag, ICANON)) {
   1072 		nread += tp->t_rawq.c_cc;
   1073 		if (nread < tp->t_cc[VMIN] && !tp->t_cc[VTIME])
   1074 			nread = 0;
   1075 	}
   1076 	return (nread);
   1077 }
   1078 
   1079 /*
   1080  * Wait for output to drain.
   1081  */
   1082 int
   1083 ttywait(struct tty *tp)
   1084 {
   1085 	int	error, s;
   1086 
   1087 	error = 0;
   1088 	s = spltty();
   1089 	while ((tp->t_outq.c_cc || ISSET(tp->t_state, TS_BUSY)) &&
   1090 	    CONNECTED(tp) && tp->t_oproc) {
   1091 		(*tp->t_oproc)(tp);
   1092 		SET(tp->t_state, TS_ASLEEP);
   1093 		error = ttysleep(tp, &tp->t_outq, TTOPRI | PCATCH, ttyout, 0);
   1094 		if (error)
   1095 			break;
   1096 	}
   1097 	splx(s);
   1098 	return (error);
   1099 }
   1100 
   1101 /*
   1102  * Flush if successfully wait.
   1103  */
   1104 int
   1105 ttywflush(struct tty *tp)
   1106 {
   1107 	int	error;
   1108 
   1109 	if ((error = ttywait(tp)) == 0)
   1110 		ttyflush(tp, FREAD);
   1111 	return (error);
   1112 }
   1113 
   1114 /*
   1115  * Flush tty read and/or write queues, notifying anyone waiting.
   1116  */
   1117 void
   1118 ttyflush(struct tty *tp, int rw)
   1119 {
   1120 	int	s;
   1121 
   1122 	s = spltty();
   1123 	if (rw & FREAD) {
   1124 		FLUSHQ(&tp->t_canq);
   1125 		FLUSHQ(&tp->t_rawq);
   1126 		tp->t_rocount = 0;
   1127 		tp->t_rocol = 0;
   1128 		CLR(tp->t_state, TS_LOCAL);
   1129 		ttwakeup(tp);
   1130 	}
   1131 	if (rw & FWRITE) {
   1132 		CLR(tp->t_state, TS_TTSTOP);
   1133 		(*cdevsw[major(tp->t_dev)].d_stop)(tp, rw);
   1134 		FLUSHQ(&tp->t_outq);
   1135 		wakeup((caddr_t)&tp->t_outq);
   1136 		selwakeup(&tp->t_wsel);
   1137 	}
   1138 	splx(s);
   1139 }
   1140 
   1141 /*
   1142  * Copy in the default termios characters.
   1143  */
   1144 void
   1145 ttychars(struct tty *tp)
   1146 {
   1147 
   1148 	memcpy(tp->t_cc, ttydefchars, sizeof(ttydefchars));
   1149 }
   1150 
   1151 /*
   1152  * Send stop character on input overflow.
   1153  */
   1154 static void
   1155 ttyblock(struct tty *tp)
   1156 {
   1157 	int	total;
   1158 
   1159 	total = tp->t_rawq.c_cc + tp->t_canq.c_cc;
   1160 	if (tp->t_rawq.c_cc > TTYHOG) {
   1161 		ttyflush(tp, FREAD | FWRITE);
   1162 		CLR(tp->t_state, TS_TBLOCK);
   1163 	}
   1164 	/*
   1165 	 * Block further input iff: current input > threshold
   1166 	 * AND input is available to user program.
   1167 	 */
   1168 	if (total >= TTYHOG / 2 &&
   1169 	    !ISSET(tp->t_state, TS_TBLOCK) &&
   1170 	    (!ISSET(tp->t_lflag, ICANON) || tp->t_canq.c_cc > 0)) {
   1171 		if (ISSET(tp->t_iflag, IXOFF) &&
   1172 		    tp->t_cc[VSTOP] != _POSIX_VDISABLE &&
   1173 		    putc(tp->t_cc[VSTOP], &tp->t_outq) == 0) {
   1174 			SET(tp->t_state, TS_TBLOCK);
   1175 			ttstart(tp);
   1176 		}
   1177 		/* Try to block remote output via hardware flow control. */
   1178 		if (ISSET(tp->t_cflag, CHWFLOW) && tp->t_hwiflow &&
   1179 		    (*tp->t_hwiflow)(tp, 1) != 0)
   1180 			SET(tp->t_state, TS_TBLOCK);
   1181 	}
   1182 }
   1183 
   1184 void
   1185 ttrstrt(void *tp_arg)
   1186 {
   1187 	struct tty	*tp;
   1188 	int		s;
   1189 
   1190 #ifdef DIAGNOSTIC
   1191 	if (tp_arg == NULL)
   1192 		panic("ttrstrt");
   1193 #endif
   1194 	tp = tp_arg;
   1195 	s = spltty();
   1196 
   1197 	CLR(tp->t_state, TS_TIMEOUT);
   1198 	ttstart(tp);
   1199 
   1200 	splx(s);
   1201 }
   1202 
   1203 int
   1204 ttstart(struct tty *tp)
   1205 {
   1206 
   1207 	if (tp->t_oproc != NULL)	/* XXX: Kludge for pty. */
   1208 		(*tp->t_oproc)(tp);
   1209 	return (0);
   1210 }
   1211 
   1212 /*
   1213  * "close" a line discipline
   1214  */
   1215 int
   1216 ttylclose(struct tty *tp, int flag)
   1217 {
   1218 
   1219 	if (flag & FNONBLOCK)
   1220 		ttyflush(tp, FREAD | FWRITE);
   1221 	else
   1222 		ttywflush(tp);
   1223 	return (0);
   1224 }
   1225 
   1226 /*
   1227  * Handle modem control transition on a tty.
   1228  * Flag indicates new state of carrier.
   1229  * Returns 0 if the line should be turned off, otherwise 1.
   1230  */
   1231 int
   1232 ttymodem(struct tty *tp, int flag)
   1233 {
   1234 
   1235 	if (flag == 0) {
   1236 		if (ISSET(tp->t_state, TS_CARR_ON)) {
   1237 			/*
   1238 			 * Lost carrier.
   1239 			 */
   1240 			CLR(tp->t_state, TS_CARR_ON);
   1241 			if (ISSET(tp->t_state, TS_ISOPEN) && !CONNECTED(tp)) {
   1242 				if (tp->t_session && tp->t_session->s_leader)
   1243 					psignal(tp->t_session->s_leader,
   1244 					    SIGHUP);
   1245 				ttyflush(tp, FREAD | FWRITE);
   1246 				return (0);
   1247 			}
   1248 		}
   1249 	} else {
   1250 		if (!ISSET(tp->t_state, TS_CARR_ON)) {
   1251 			/*
   1252 			 * Carrier now on.
   1253 			 */
   1254 			SET(tp->t_state, TS_CARR_ON);
   1255 			ttwakeup(tp);
   1256 		}
   1257 	}
   1258 	return (1);
   1259 }
   1260 
   1261 /*
   1262  * Default modem control routine (for other line disciplines).
   1263  * Return argument flag, to turn off device on carrier drop.
   1264  */
   1265 int
   1266 nullmodem(struct tty *tp, int flag)
   1267 {
   1268 
   1269 	if (flag)
   1270 		SET(tp->t_state, TS_CARR_ON);
   1271 	else {
   1272 		CLR(tp->t_state, TS_CARR_ON);
   1273 		if (!CONNECTED(tp)) {
   1274 			if (tp->t_session && tp->t_session->s_leader)
   1275 				psignal(tp->t_session->s_leader, SIGHUP);
   1276 			return (0);
   1277 		}
   1278 	}
   1279 	return (1);
   1280 }
   1281 
   1282 /*
   1283  * Reinput pending characters after state switch
   1284  * call at spltty().
   1285  */
   1286 void
   1287 ttypend(struct tty *tp)
   1288 {
   1289 	struct clist	tq;
   1290 	int		c;
   1291 
   1292 	CLR(tp->t_lflag, PENDIN);
   1293 	SET(tp->t_state, TS_TYPEN);
   1294 	tq = tp->t_rawq;
   1295 	tp->t_rawq.c_cc = 0;
   1296 	tp->t_rawq.c_cf = tp->t_rawq.c_cl = 0;
   1297 	while ((c = getc(&tq)) >= 0)
   1298 		ttyinput(c, tp);
   1299 	CLR(tp->t_state, TS_TYPEN);
   1300 }
   1301 
   1302 /*
   1303  * Process a read call on a tty device.
   1304  */
   1305 int
   1306 ttread(struct tty *tp, struct uio *uio, int flag)
   1307 {
   1308 	struct clist	*qp;
   1309 	u_char		*cc;
   1310 	struct proc	*p;
   1311 	int		c, s, first, error, has_stime, last_cc;
   1312 	long		lflag, slp;
   1313 	struct timeval	stime;
   1314 
   1315 	cc = tp->t_cc;
   1316 	p = curproc;
   1317 	error = 0;
   1318 	has_stime = 0;
   1319 	last_cc = 0;
   1320 	slp = 0;
   1321 
   1322  loop:
   1323 	lflag = tp->t_lflag;
   1324 	s = spltty();
   1325 	/*
   1326 	 * take pending input first
   1327 	 */
   1328 	if (ISSET(lflag, PENDIN))
   1329 		ttypend(tp);
   1330 	splx(s);
   1331 
   1332 	/*
   1333 	 * Hang process if it's in the background.
   1334 	 */
   1335 	if (isbackground(p, tp)) {
   1336 		if (sigismember(&p->p_sigctx.ps_sigignore, SIGTTIN) ||
   1337 		    sigismember(&p->p_sigctx.ps_sigmask, SIGTTIN) ||
   1338 		    p->p_flag & P_PPWAIT || p->p_pgrp->pg_jobc == 0)
   1339 			return (EIO);
   1340 		pgsignal(p->p_pgrp, SIGTTIN, 1);
   1341 		error = ttysleep(tp, &lbolt, TTIPRI | PCATCH, ttybg, 0);
   1342 		if (error)
   1343 			return (error);
   1344 		goto loop;
   1345 	}
   1346 
   1347 	s = spltty();
   1348 	if (!ISSET(lflag, ICANON)) {
   1349 		int m = cc[VMIN];
   1350 		long t = cc[VTIME];
   1351 
   1352 		qp = &tp->t_rawq;
   1353 		/*
   1354 		 * Check each of the four combinations.
   1355 		 * (m > 0 && t == 0) is the normal read case.
   1356 		 * It should be fairly efficient, so we check that and its
   1357 		 * companion case (m == 0 && t == 0) first.
   1358 		 * For the other two cases, we compute the target sleep time
   1359 		 * into slp.
   1360 		 */
   1361 		if (t == 0) {
   1362 			if (qp->c_cc < m)
   1363 				goto sleep;
   1364 			goto read;
   1365 		}
   1366 		t *= 100000;		/* time in us */
   1367 #define	diff(t1, t2) (((t1).tv_sec - (t2).tv_sec) * 1000000 + \
   1368 			 ((t1).tv_usec - (t2).tv_usec))
   1369 		if (m > 0) {
   1370 			if (qp->c_cc <= 0)
   1371 				goto sleep;
   1372 			if (qp->c_cc >= m)
   1373 				goto read;
   1374 			if (!has_stime) {
   1375 				/* first character, start timer */
   1376 				has_stime = 1;
   1377 				stime = time;
   1378 				slp = t;
   1379 			} else if (qp->c_cc > last_cc) {
   1380 				/* got a character, restart timer */
   1381 				stime = time;
   1382 				slp = t;
   1383 			} else {
   1384 				/* nothing, check expiration */
   1385 				slp = t - diff(time, stime);
   1386 			}
   1387 		} else {	/* m == 0 */
   1388 			if (qp->c_cc > 0)
   1389 				goto read;
   1390 			if (!has_stime) {
   1391 				has_stime = 1;
   1392 				stime = time;
   1393 				slp = t;
   1394 			} else
   1395 				slp = t - diff(time, stime);
   1396 		}
   1397 		last_cc = qp->c_cc;
   1398 #undef diff
   1399 		if (slp > 0) {
   1400 			/*
   1401 			 * Rounding down may make us wake up just short
   1402 			 * of the target, so we round up.
   1403 			 * The formula is ceiling(slp * hz/1000000).
   1404 			 * 32-bit arithmetic is enough for hz < 169.
   1405 			 *
   1406 			 * Also, use plain wakeup() not ttwakeup().
   1407 			 */
   1408 			slp = (long) (((u_long)slp * hz) + 999999) / 1000000;
   1409 			goto sleep;
   1410 		}
   1411 	} else if ((qp = &tp->t_canq)->c_cc <= 0) {
   1412 		int	carrier;
   1413 
   1414  sleep:
   1415 		/*
   1416 		 * If there is no input, sleep on rawq
   1417 		 * awaiting hardware receipt and notification.
   1418 		 * If we have data, we don't need to check for carrier.
   1419 		 */
   1420 		carrier = CONNECTED(tp);
   1421 		if (!carrier && ISSET(tp->t_state, TS_ISOPEN)) {
   1422 			splx(s);
   1423 			return (0);	/* EOF */
   1424 		}
   1425 		if (flag & IO_NDELAY) {
   1426 			splx(s);
   1427 			return (EWOULDBLOCK);
   1428 		}
   1429 		error = ttysleep(tp, &tp->t_rawq, TTIPRI | PCATCH,
   1430 		    carrier ? ttyin : ttopen, slp);
   1431 		splx(s);
   1432 		/* VMIN == 0: any quantity read satisfies */
   1433 		if (cc[VMIN] == 0 && error == EWOULDBLOCK)
   1434 			return (0);
   1435 		if (error && error != EWOULDBLOCK)
   1436 			return (error);
   1437 		goto loop;
   1438 	}
   1439  read:
   1440 	splx(s);
   1441 
   1442 	/*
   1443 	 * Input present, check for input mapping and processing.
   1444 	 */
   1445 	first = 1;
   1446 	while ((c = getc(qp)) >= 0) {
   1447 		/*
   1448 		 * delayed suspend (^Y)
   1449 		 */
   1450 		if (CCEQ(cc[VDSUSP], c) &&
   1451 		    ISSET(lflag, IEXTEN|ISIG) == (IEXTEN|ISIG)) {
   1452 			pgsignal(tp->t_pgrp, SIGTSTP, 1);
   1453 			if (first) {
   1454 				error = ttysleep(tp, &lbolt,
   1455 				    TTIPRI | PCATCH, ttybg, 0);
   1456 				if (error)
   1457 					break;
   1458 				goto loop;
   1459 			}
   1460 			break;
   1461 		}
   1462 		/*
   1463 		 * Interpret EOF only in canonical mode.
   1464 		 */
   1465 		if (CCEQ(cc[VEOF], c) && ISSET(lflag, ICANON))
   1466 			break;
   1467 		/*
   1468 		 * Give user character.
   1469 		 */
   1470  		error = ureadc(c, uio);
   1471 		if (error)
   1472 			break;
   1473  		if (uio->uio_resid == 0)
   1474 			break;
   1475 		/*
   1476 		 * In canonical mode check for a "break character"
   1477 		 * marking the end of a "line of input".
   1478 		 */
   1479 		if (ISSET(lflag, ICANON) && TTBREAKC(c, lflag))
   1480 			break;
   1481 		first = 0;
   1482 	}
   1483 	/*
   1484 	 * Look to unblock output now that (presumably)
   1485 	 * the input queue has gone down.
   1486 	 */
   1487 	s = spltty();
   1488 	if (ISSET(tp->t_state, TS_TBLOCK) && tp->t_rawq.c_cc < TTYHOG / 5) {
   1489 		if (ISSET(tp->t_iflag, IXOFF) &&
   1490 		    cc[VSTART] != _POSIX_VDISABLE &&
   1491 		    putc(cc[VSTART], &tp->t_outq) == 0) {
   1492 			CLR(tp->t_state, TS_TBLOCK);
   1493 			ttstart(tp);
   1494 		}
   1495 		/* Try to unblock remote output via hardware flow control. */
   1496 		if (ISSET(tp->t_cflag, CHWFLOW) && tp->t_hwiflow &&
   1497 		    (*tp->t_hwiflow)(tp, 0) != 0)
   1498 			CLR(tp->t_state, TS_TBLOCK);
   1499 	}
   1500 	splx(s);
   1501 	return (error);
   1502 }
   1503 
   1504 /*
   1505  * Check the output queue on tp for space for a kernel message (from uprintf
   1506  * or tprintf).  Allow some space over the normal hiwater mark so we don't
   1507  * lose messages due to normal flow control, but don't let the tty run amok.
   1508  * Sleeps here are not interruptible, but we return prematurely if new signals
   1509  * arrive.
   1510  */
   1511 int
   1512 ttycheckoutq(struct tty *tp, int wait)
   1513 {
   1514 	int	hiwat, s, error;
   1515 
   1516 	hiwat = tp->t_hiwat;
   1517 	s = spltty();
   1518 	if (tp->t_outq.c_cc > hiwat + 200)
   1519 		while (tp->t_outq.c_cc > hiwat) {
   1520 			ttstart(tp);
   1521 			if (wait == 0) {
   1522 				splx(s);
   1523 				return (0);
   1524 			}
   1525 			callout_reset(&tp->t_outq_ch, hz,
   1526 			    (void (*)__P((void *)))wakeup, &tp->t_outq);
   1527 			SET(tp->t_state, TS_ASLEEP);
   1528 			error = tsleep(&tp->t_outq, (PZERO - 1) | PCATCH,
   1529 			    "ttckoutq", 0);
   1530 			if (error == EINTR)
   1531 				wait = 0;
   1532 		}
   1533 	splx(s);
   1534 	return (1);
   1535 }
   1536 
   1537 /*
   1538  * Process a write call on a tty device.
   1539  */
   1540 int
   1541 ttwrite(struct tty *tp, struct uio *uio, int flag)
   1542 {
   1543 	u_char		*cp;
   1544 	struct proc	*p;
   1545 	int		cc, ce, i, hiwat, cnt, error, s;
   1546 	u_char		obuf[OBUFSIZ];
   1547 
   1548 	cp = NULL;
   1549 	hiwat = tp->t_hiwat;
   1550 	cnt = uio->uio_resid;
   1551 	error = 0;
   1552 	cc = 0;
   1553  loop:
   1554 	s = spltty();
   1555 	if (!CONNECTED(tp)) {
   1556 		if (ISSET(tp->t_state, TS_ISOPEN)) {
   1557 			splx(s);
   1558 			return (EIO);
   1559 		} else if (flag & IO_NDELAY) {
   1560 			splx(s);
   1561 			error = EWOULDBLOCK;
   1562 			goto out;
   1563 		} else {
   1564 			/* Sleep awaiting carrier. */
   1565 			error = ttysleep(tp,
   1566 			    &tp->t_rawq, TTIPRI | PCATCH, ttopen, 0);
   1567 			splx(s);
   1568 			if (error)
   1569 				goto out;
   1570 			goto loop;
   1571 		}
   1572 	}
   1573 	splx(s);
   1574 	/*
   1575 	 * Hang the process if it's in the background.
   1576 	 */
   1577 	p = curproc;
   1578 	if (isbackground(p, tp) &&
   1579 	    ISSET(tp->t_lflag, TOSTOP) && (p->p_flag & P_PPWAIT) == 0 &&
   1580 	    !sigismember(&p->p_sigctx.ps_sigignore, SIGTTOU) &&
   1581 	    !sigismember(&p->p_sigctx.ps_sigmask, SIGTTOU)) {
   1582 		if (p->p_pgrp->pg_jobc == 0) {
   1583 			error = EIO;
   1584 			goto out;
   1585 		}
   1586 		pgsignal(p->p_pgrp, SIGTTOU, 1);
   1587 		error = ttysleep(tp, &lbolt, TTIPRI | PCATCH, ttybg, 0);
   1588 		if (error)
   1589 			goto out;
   1590 		goto loop;
   1591 	}
   1592 	/*
   1593 	 * Process the user's data in at most OBUFSIZ chunks.  Perform any
   1594 	 * output translation.  Keep track of high water mark, sleep on
   1595 	 * overflow awaiting device aid in acquiring new space.
   1596 	 */
   1597 	while (uio->uio_resid > 0 || cc > 0) {
   1598 		if (ISSET(tp->t_lflag, FLUSHO)) {
   1599 			uio->uio_resid = 0;
   1600 			return (0);
   1601 		}
   1602 		if (tp->t_outq.c_cc > hiwat)
   1603 			goto ovhiwat;
   1604 		/*
   1605 		 * Grab a hunk of data from the user, unless we have some
   1606 		 * leftover from last time.
   1607 		 */
   1608 		if (cc == 0) {
   1609 			cc = min(uio->uio_resid, OBUFSIZ);
   1610 			cp = obuf;
   1611 			error = uiomove(cp, cc, uio);
   1612 			if (error) {
   1613 				cc = 0;
   1614 				break;
   1615 			}
   1616 		}
   1617 		/*
   1618 		 * If nothing fancy need be done, grab those characters we
   1619 		 * can handle without any of ttyoutput's processing and
   1620 		 * just transfer them to the output q.  For those chars
   1621 		 * which require special processing (as indicated by the
   1622 		 * bits in char_type), call ttyoutput.  After processing
   1623 		 * a hunk of data, look for FLUSHO so ^O's will take effect
   1624 		 * immediately.
   1625 		 */
   1626 		while (cc > 0) {
   1627 			if (!ISSET(tp->t_oflag, OPOST))
   1628 				ce = cc;
   1629 			else {
   1630 				ce = cc - scanc((u_int)cc, cp, char_type,
   1631 				    CCLASSMASK);
   1632 				/*
   1633 				 * If ce is zero, then we're processing
   1634 				 * a special character through ttyoutput.
   1635 				 */
   1636 				if (ce == 0) {
   1637 					tp->t_rocount = 0;
   1638 					if (ttyoutput(*cp, tp) >= 0) {
   1639 						/* out of space */
   1640 						goto overfull;
   1641 					}
   1642 					cp++;
   1643 					cc--;
   1644 					if (ISSET(tp->t_lflag, FLUSHO) ||
   1645 					    tp->t_outq.c_cc > hiwat)
   1646 						goto ovhiwat;
   1647 					continue;
   1648 				}
   1649 			}
   1650 			/*
   1651 			 * A bunch of normal characters have been found.
   1652 			 * Transfer them en masse to the output queue and
   1653 			 * continue processing at the top of the loop.
   1654 			 * If there are any further characters in this
   1655 			 * <= OBUFSIZ chunk, the first should be a character
   1656 			 * requiring special handling by ttyoutput.
   1657 			 */
   1658 			tp->t_rocount = 0;
   1659 			i = b_to_q(cp, ce, &tp->t_outq);
   1660 			ce -= i;
   1661 			tp->t_column += ce;
   1662 			cp += ce, cc -= ce, tk_nout += ce;
   1663 			tp->t_outcc += ce;
   1664 			if (i > 0) {
   1665 				/* out of space */
   1666 				goto overfull;
   1667 			}
   1668 			if (ISSET(tp->t_lflag, FLUSHO) ||
   1669 			    tp->t_outq.c_cc > hiwat)
   1670 				break;
   1671 		}
   1672 		ttstart(tp);
   1673 	}
   1674  out:
   1675 	/*
   1676 	 * If cc is nonzero, we leave the uio structure inconsistent, as the
   1677 	 * offset and iov pointers have moved forward, but it doesn't matter
   1678 	 * (the call will either return short or restart with a new uio).
   1679 	 */
   1680 	uio->uio_resid += cc;
   1681 	return (error);
   1682 
   1683  overfull:
   1684 	/*
   1685 	 * Since we are using ring buffers, if we can't insert any more into
   1686 	 * the output queue, we can assume the ring is full and that someone
   1687 	 * forgot to set the high water mark correctly.  We set it and then
   1688 	 * proceed as normal.
   1689 	 */
   1690 	hiwat = tp->t_outq.c_cc - 1;
   1691 
   1692  ovhiwat:
   1693 	ttstart(tp);
   1694 	s = spltty();
   1695 	/*
   1696 	 * This can only occur if FLUSHO is set in t_lflag,
   1697 	 * or if ttstart/oproc is synchronous (or very fast).
   1698 	 */
   1699 	if (tp->t_outq.c_cc <= hiwat) {
   1700 		splx(s);
   1701 		goto loop;
   1702 	}
   1703 	if (flag & IO_NDELAY) {
   1704 		splx(s);
   1705 		uio->uio_resid += cc;
   1706 		return (uio->uio_resid == cnt ? EWOULDBLOCK : 0);
   1707 	}
   1708 	SET(tp->t_state, TS_ASLEEP);
   1709 	error = ttysleep(tp, &tp->t_outq, TTOPRI | PCATCH, ttyout, 0);
   1710 	splx(s);
   1711 	if (error)
   1712 		goto out;
   1713 	goto loop;
   1714 }
   1715 
   1716 /*
   1717  * Rubout one character from the rawq of tp
   1718  * as cleanly as possible.
   1719  */
   1720 void
   1721 ttyrub(int c, struct tty *tp)
   1722 {
   1723 	u_char	*cp;
   1724 	int	savecol, tabc, s;
   1725 
   1726 	if (!ISSET(tp->t_lflag, ECHO) || ISSET(tp->t_lflag, EXTPROC))
   1727 		return;
   1728 	CLR(tp->t_lflag, FLUSHO);
   1729 	if (ISSET(tp->t_lflag, ECHOE)) {
   1730 		if (tp->t_rocount == 0) {
   1731 			/*
   1732 			 * Screwed by ttwrite; retype
   1733 			 */
   1734 			ttyretype(tp);
   1735 			return;
   1736 		}
   1737 		if (c == ('\t' | TTY_QUOTE) || c == ('\n' | TTY_QUOTE))
   1738 			ttyrubo(tp, 2);
   1739 		else {
   1740 			CLR(c, ~TTY_CHARMASK);
   1741 			switch (CCLASS(c)) {
   1742 			case ORDINARY:
   1743 				ttyrubo(tp, 1);
   1744 				break;
   1745 			case BACKSPACE:
   1746 			case CONTROL:
   1747 			case NEWLINE:
   1748 			case RETURN:
   1749 			case VTAB:
   1750 				if (ISSET(tp->t_lflag, ECHOCTL))
   1751 					ttyrubo(tp, 2);
   1752 				break;
   1753 			case TAB:
   1754 				if (tp->t_rocount < tp->t_rawq.c_cc) {
   1755 					ttyretype(tp);
   1756 					return;
   1757 				}
   1758 				s = spltty();
   1759 				savecol = tp->t_column;
   1760 				SET(tp->t_state, TS_CNTTB);
   1761 				SET(tp->t_lflag, FLUSHO);
   1762 				tp->t_column = tp->t_rocol;
   1763 				for (cp = firstc(&tp->t_rawq, &tabc); cp;
   1764 				    cp = nextc(&tp->t_rawq, cp, &tabc))
   1765 					ttyecho(tabc, tp);
   1766 				CLR(tp->t_lflag, FLUSHO);
   1767 				CLR(tp->t_state, TS_CNTTB);
   1768 				splx(s);
   1769 
   1770 				/* savecol will now be length of the tab. */
   1771 				savecol -= tp->t_column;
   1772 				tp->t_column += savecol;
   1773 				if (savecol > 8)
   1774 					savecol = 8;	/* overflow screw */
   1775 				while (--savecol >= 0)
   1776 					(void)ttyoutput('\b', tp);
   1777 				break;
   1778 			default:			/* XXX */
   1779 #define	PANICSTR	"ttyrub: would panic c = %d, val = %d\n"
   1780 				(void)printf(PANICSTR, c, CCLASS(c));
   1781 #ifdef notdef
   1782 				panic(PANICSTR, c, CCLASS(c));
   1783 #endif
   1784 			}
   1785 		}
   1786 	} else if (ISSET(tp->t_lflag, ECHOPRT)) {
   1787 		if (!ISSET(tp->t_state, TS_ERASE)) {
   1788 			SET(tp->t_state, TS_ERASE);
   1789 			(void)ttyoutput('\\', tp);
   1790 		}
   1791 		ttyecho(c, tp);
   1792 	} else
   1793 		ttyecho(tp->t_cc[VERASE], tp);
   1794 	--tp->t_rocount;
   1795 }
   1796 
   1797 /*
   1798  * Back over cnt characters, erasing them.
   1799  */
   1800 static void
   1801 ttyrubo(struct tty *tp, int cnt)
   1802 {
   1803 
   1804 	while (cnt-- > 0) {
   1805 		(void)ttyoutput('\b', tp);
   1806 		(void)ttyoutput(' ', tp);
   1807 		(void)ttyoutput('\b', tp);
   1808 	}
   1809 }
   1810 
   1811 /*
   1812  * ttyretype --
   1813  *	Reprint the rawq line.  Note, it is assumed that c_cc has already
   1814  *	been checked.
   1815  */
   1816 void
   1817 ttyretype(struct tty *tp)
   1818 {
   1819 	u_char	*cp;
   1820 	int	s, c;
   1821 
   1822 	/* Echo the reprint character. */
   1823 	if (tp->t_cc[VREPRINT] != _POSIX_VDISABLE)
   1824 		ttyecho(tp->t_cc[VREPRINT], tp);
   1825 
   1826 	(void)ttyoutput('\n', tp);
   1827 
   1828 	s = spltty();
   1829 	for (cp = firstc(&tp->t_canq, &c); cp; cp = nextc(&tp->t_canq, cp, &c))
   1830 		ttyecho(c, tp);
   1831 	for (cp = firstc(&tp->t_rawq, &c); cp; cp = nextc(&tp->t_rawq, cp, &c))
   1832 		ttyecho(c, tp);
   1833 	CLR(tp->t_state, TS_ERASE);
   1834 	splx(s);
   1835 
   1836 	tp->t_rocount = tp->t_rawq.c_cc;
   1837 	tp->t_rocol = 0;
   1838 }
   1839 
   1840 /*
   1841  * Echo a typed character to the terminal.
   1842  */
   1843 static void
   1844 ttyecho(int c, struct tty *tp)
   1845 {
   1846 
   1847 	if (!ISSET(tp->t_state, TS_CNTTB))
   1848 		CLR(tp->t_lflag, FLUSHO);
   1849 	if ((!ISSET(tp->t_lflag, ECHO) &&
   1850 	    (!ISSET(tp->t_lflag, ECHONL) || c != '\n')) ||
   1851 	    ISSET(tp->t_lflag, EXTPROC))
   1852 		return;
   1853 	if (((ISSET(tp->t_lflag, ECHOCTL) &&
   1854 	    (ISSET(c, TTY_CHARMASK) <= 037 && c != '\t' && c != '\n')) ||
   1855 	    ISSET(c, TTY_CHARMASK) == 0177)) {
   1856 		(void)ttyoutput('^', tp);
   1857 		CLR(c, ~TTY_CHARMASK);
   1858 		if (c == 0177)
   1859 			c = '?';
   1860 		else
   1861 			c += 'A' - 1;
   1862 	}
   1863 	(void)ttyoutput(c, tp);
   1864 }
   1865 
   1866 /*
   1867  * Wake up any readers on a tty.
   1868  */
   1869 void
   1870 ttwakeup(struct tty *tp)
   1871 {
   1872 
   1873 	selwakeup(&tp->t_rsel);
   1874 	if (ISSET(tp->t_state, TS_ASYNC))
   1875 		pgsignal(tp->t_pgrp, SIGIO, 1);
   1876 	wakeup((caddr_t)&tp->t_rawq);
   1877 }
   1878 
   1879 /*
   1880  * Look up a code for a specified speed in a conversion table;
   1881  * used by drivers to map software speed values to hardware parameters.
   1882  */
   1883 int
   1884 ttspeedtab(int speed, struct speedtab *table)
   1885 {
   1886 
   1887 	for (; table->sp_speed != -1; table++)
   1888 		if (table->sp_speed == speed)
   1889 			return (table->sp_code);
   1890 	return (-1);
   1891 }
   1892 
   1893 /*
   1894  * Set tty hi and low water marks.
   1895  *
   1896  * Try to arrange the dynamics so there's about one second
   1897  * from hi to low water.
   1898  */
   1899 void
   1900 ttsetwater(struct tty *tp)
   1901 {
   1902 	int	cps, x;
   1903 
   1904 #define	CLAMP(x, h, l)	((x) > h ? h : ((x) < l) ? l : (x))
   1905 
   1906 	cps = tp->t_ospeed / 10;
   1907 	tp->t_lowat = x = CLAMP(cps / 2, TTMAXLOWAT, TTMINLOWAT);
   1908 	x += cps;
   1909 	x = CLAMP(x, TTMAXHIWAT, TTMINHIWAT);
   1910 	tp->t_hiwat = roundup(x, CBSIZE);
   1911 #undef	CLAMP
   1912 }
   1913 
   1914 /*
   1915  * Report on state of foreground process group.
   1916  */
   1917 void
   1918 ttyinfo(struct tty *tp)
   1919 {
   1920 	struct proc	*p, *pick;
   1921 	struct timeval	utime, stime;
   1922 	int		tmp;
   1923 
   1924 	if (ttycheckoutq(tp, 0) == 0)
   1925 		return;
   1926 
   1927 	/* Print load average. */
   1928 	tmp = (averunnable.ldavg[0] * 100 + FSCALE / 2) >> FSHIFT;
   1929 	ttyprintf(tp, "load: %d.%02d ", tmp / 100, tmp % 100);
   1930 
   1931 	if (tp->t_session == NULL)
   1932 		ttyprintf(tp, "not a controlling terminal\n");
   1933 	else if (tp->t_pgrp == NULL)
   1934 		ttyprintf(tp, "no foreground process group\n");
   1935 	else if ((p = tp->t_pgrp->pg_members.lh_first) == 0)
   1936 		ttyprintf(tp, "empty foreground process group\n");
   1937 	else {
   1938 		/* Pick interesting process. */
   1939 		for (pick = NULL; p != NULL; p = p->p_pglist.le_next)
   1940 			if (proc_compare(pick, p))
   1941 				pick = p;
   1942 
   1943 		ttyprintf(tp, " cmd: %s %d [%s] ", pick->p_comm, pick->p_pid,
   1944 		    pick->p_stat == SONPROC ? "running" :
   1945 		    pick->p_stat == SRUN ? "runnable" :
   1946 		    pick->p_wmesg ? pick->p_wmesg : "iowait");
   1947 
   1948 		calcru(pick, &utime, &stime, NULL);
   1949 
   1950 		/* Round up and print user time. */
   1951 		utime.tv_usec += 5000;
   1952 		if (utime.tv_usec >= 1000000) {
   1953 			utime.tv_sec += 1;
   1954 			utime.tv_usec -= 1000000;
   1955 		}
   1956 		ttyprintf(tp, "%ld.%02ldu ", (long int)utime.tv_sec,
   1957 		    (long int)utime.tv_usec / 10000);
   1958 
   1959 		/* Round up and print system time. */
   1960 		stime.tv_usec += 5000;
   1961 		if (stime.tv_usec >= 1000000) {
   1962 			stime.tv_sec += 1;
   1963 			stime.tv_usec -= 1000000;
   1964 		}
   1965 		ttyprintf(tp, "%ld.%02lds ", (long int)stime.tv_sec,
   1966 		    (long int)stime.tv_usec / 10000);
   1967 
   1968 #define	pgtok(a)	(((u_long) ((a) * PAGE_SIZE) / 1024))
   1969 		/* Print percentage cpu. */
   1970 		tmp = (pick->p_pctcpu * 10000 + FSCALE / 2) >> FSHIFT;
   1971 		ttyprintf(tp, "%d%% ", tmp / 100);
   1972 
   1973 		/* Print resident set size. */
   1974 		if (pick->p_stat == SIDL || P_ZOMBIE(pick))
   1975 			tmp = 0;
   1976 		else {
   1977 			struct vmspace *vm = pick->p_vmspace;
   1978 			tmp = pgtok(vm_resident_count(vm));
   1979 		}
   1980 		ttyprintf(tp, "%dk\n", tmp);
   1981 	}
   1982 	tp->t_rocount = 0;	/* so pending input will be retyped if BS */
   1983 }
   1984 
   1985 /*
   1986  * Returns 1 if p2 is "better" than p1
   1987  *
   1988  * The algorithm for picking the "interesting" process is thus:
   1989  *
   1990  *	1) Only foreground processes are eligible - implied.
   1991  *	2) Runnable processes are favored over anything else.  The runner
   1992  *	   with the highest cpu utilization is picked (p_estcpu).  Ties are
   1993  *	   broken by picking the highest pid.
   1994  *	3) The sleeper with the shortest sleep time is next.  With ties,
   1995  *	   we pick out just "short-term" sleepers (P_SINTR == 0).
   1996  *	4) Further ties are broken by picking the highest pid.
   1997  */
   1998 #define	ISRUN(p)	(((p)->p_stat == SRUN) || ((p)->p_stat == SIDL) || \
   1999 			 ((p)->p_stat == SONPROC))
   2000 #define	TESTAB(a, b)	((a)<<1 | (b))
   2001 #define	ONLYA	2
   2002 #define	ONLYB	1
   2003 #define	BOTH	3
   2004 
   2005 static int
   2006 proc_compare(struct proc *p1, struct proc *p2)
   2007 {
   2008 
   2009 	if (p1 == NULL)
   2010 		return (1);
   2011 	/*
   2012 	 * see if at least one of them is runnable
   2013 	 */
   2014 	switch (TESTAB(ISRUN(p1), ISRUN(p2))) {
   2015 	case ONLYA:
   2016 		return (0);
   2017 	case ONLYB:
   2018 		return (1);
   2019 	case BOTH:
   2020 		/*
   2021 		 * tie - favor one with highest recent cpu utilization
   2022 		 */
   2023 		if (p2->p_estcpu > p1->p_estcpu)
   2024 			return (1);
   2025 		if (p1->p_estcpu > p2->p_estcpu)
   2026 			return (0);
   2027 		return (p2->p_pid > p1->p_pid);	/* tie - return highest pid */
   2028 	}
   2029 	/*
   2030  	 * weed out zombies
   2031 	 */
   2032 	switch (TESTAB(P_ZOMBIE(p1), P_ZOMBIE(p2))) {
   2033 	case ONLYA:
   2034 		return (1);
   2035 	case ONLYB:
   2036 		return (0);
   2037 	case BOTH:
   2038 		return (p2->p_pid > p1->p_pid);	/* tie - return highest pid */
   2039 	}
   2040 	/*
   2041 	 * pick the one with the smallest sleep time
   2042 	 */
   2043 	if (p2->p_slptime > p1->p_slptime)
   2044 		return (0);
   2045 	if (p1->p_slptime > p2->p_slptime)
   2046 		return (1);
   2047 	/*
   2048 	 * favor one sleeping in a non-interruptible sleep
   2049 	 */
   2050 	if (p1->p_flag & P_SINTR && (p2->p_flag & P_SINTR) == 0)
   2051 		return (1);
   2052 	if (p2->p_flag & P_SINTR && (p1->p_flag & P_SINTR) == 0)
   2053 		return (0);
   2054 	return (p2->p_pid > p1->p_pid);		/* tie - return highest pid */
   2055 }
   2056 
   2057 /*
   2058  * Output char to tty; console putchar style.
   2059  */
   2060 int
   2061 tputchar(int c, struct tty *tp)
   2062 {
   2063 	int	s;
   2064 
   2065 	s = spltty();
   2066 	if (ISSET(tp->t_state,
   2067 	    TS_CARR_ON | TS_ISOPEN) != (TS_CARR_ON | TS_ISOPEN)) {
   2068 		splx(s);
   2069 		return (-1);
   2070 	}
   2071 	if (c == '\n')
   2072 		(void)ttyoutput('\r', tp);
   2073 	(void)ttyoutput(c, tp);
   2074 	ttstart(tp);
   2075 	splx(s);
   2076 	return (0);
   2077 }
   2078 
   2079 /*
   2080  * Sleep on chan, returning ERESTART if tty changed while we napped and
   2081  * returning any errors (e.g. EINTR/ETIMEDOUT) reported by tsleep.  If
   2082  * the tty is revoked, restarting a pending call will redo validation done
   2083  * at the start of the call.
   2084  */
   2085 int
   2086 ttysleep(struct tty *tp, void *chan, int pri, const char *wmesg, int timo)
   2087 {
   2088 	int	error;
   2089 	short	gen;
   2090 
   2091 	gen = tp->t_gen;
   2092 	if ((error = tsleep(chan, pri, wmesg, timo)) != 0)
   2093 		return (error);
   2094 	return (tp->t_gen == gen ? 0 : ERESTART);
   2095 }
   2096 
   2097 /*
   2098  * Initialise the global tty list.
   2099  */
   2100 void
   2101 tty_init(void)
   2102 {
   2103 
   2104 	ttyldisc_init();
   2105 
   2106 	TAILQ_INIT(&ttylist);
   2107 	tty_count = 0;
   2108 
   2109 	pool_init(&tty_pool, sizeof(struct tty), 0, 0, 0, "ttypl",
   2110 	    &pool_allocator_nointr);
   2111 }
   2112 
   2113 /*
   2114  * Attach a tty to the tty list.
   2115  *
   2116  * This should be called ONLY once per real tty (including pty's).
   2117  * eg, on the sparc, the keyboard and mouse have struct tty's that are
   2118  * distinctly NOT usable as tty's, and thus should not be attached to
   2119  * the ttylist.  This is why this call is not done from ttymalloc().
   2120  *
   2121  * Device drivers should attach tty's at a similar time that they are
   2122  * ttymalloc()'ed, or, for the case of statically allocated struct tty's
   2123  * either in the attach or (first) open routine.
   2124  */
   2125 void
   2126 tty_attach(struct tty *tp)
   2127 {
   2128 
   2129 	TAILQ_INSERT_TAIL(&ttylist, tp, tty_link);
   2130 	++tty_count;
   2131 }
   2132 
   2133 /*
   2134  * Remove a tty from the tty list.
   2135  */
   2136 void
   2137 tty_detach(struct tty *tp)
   2138 {
   2139 
   2140 	--tty_count;
   2141 #ifdef DIAGNOSTIC
   2142 	if (tty_count < 0)
   2143 		panic("tty_detach: tty_count < 0");
   2144 #endif
   2145 	TAILQ_REMOVE(&ttylist, tp, tty_link);
   2146 }
   2147 
   2148 /*
   2149  * Allocate a tty structure and its associated buffers.
   2150  */
   2151 struct tty *
   2152 ttymalloc(void)
   2153 {
   2154 	struct tty	*tp;
   2155 
   2156 	tp = pool_get(&tty_pool, PR_WAITOK);
   2157 	memset(tp, 0, sizeof(*tp));
   2158 	callout_init(&tp->t_outq_ch);
   2159 	callout_init(&tp->t_rstrt_ch);
   2160 	/* XXX: default to 1024 chars for now */
   2161 	clalloc(&tp->t_rawq, 1024, 1);
   2162 	clalloc(&tp->t_canq, 1024, 1);
   2163 	/* output queue doesn't need quoting */
   2164 	clalloc(&tp->t_outq, 1024, 0);
   2165 	/* Set default line discipline. */
   2166 	tp->t_linesw = linesw[0];
   2167 	return (tp);
   2168 }
   2169 
   2170 /*
   2171  * Free a tty structure and its buffers.
   2172  *
   2173  * Be sure to call tty_detach() for any tty that has been
   2174  * tty_attach()ed.
   2175  */
   2176 void
   2177 ttyfree(struct tty *tp)
   2178 {
   2179 
   2180 	callout_stop(&tp->t_outq_ch);
   2181 	callout_stop(&tp->t_rstrt_ch);
   2182 	clfree(&tp->t_rawq);
   2183 	clfree(&tp->t_canq);
   2184 	clfree(&tp->t_outq);
   2185 	pool_put(&tty_pool, tp);
   2186 }
   2187