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