Home | History | Annotate | Line # | Download | only in kern
tty.c revision 1.136
      1 /*	$NetBSD: tty.c,v 1.136 2002/04/12 17:02:33 christos 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.136 2002/04/12 17:02:33 christos 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 			}
    344 			else if (ISSET(iflag, PARMRK))
    345 				goto parmrk;
    346 		}
    347 		else if ((ISSET(error, TTY_PE) && ISSET(iflag, INPCK)) ||
    348 		    ISSET(error, TTY_FE)) {
    349 			if (ISSET(iflag, IGNPAR))
    350 				return (0);
    351 			else if (ISSET(iflag, PARMRK)) {
    352  parmrk:			(void)putc(0377 | TTY_QUOTE, &tp->t_rawq);
    353 				(void)putc(0    | TTY_QUOTE, &tp->t_rawq);
    354 				(void)putc(c    | TTY_QUOTE, &tp->t_rawq);
    355 				return (0);
    356 			}
    357 			else
    358 				c = 0;
    359 		}
    360 	}
    361 	else if (c == 0377 &&
    362 	    ISSET(iflag, ISTRIP|IGNPAR|INPCK|PARMRK) == (INPCK|PARMRK)) {
    363 		/* "Escape" a valid character of '\377'. */
    364 		(void)putc(0377 | TTY_QUOTE, &tp->t_rawq);
    365 		(void)putc(0377 | TTY_QUOTE, &tp->t_rawq);
    366 		goto endcase;
    367 	}
    368 
    369 	/*
    370 	 * In tandem mode, check high water mark.
    371 	 */
    372 	if (ISSET(iflag, IXOFF) || ISSET(tp->t_cflag, CHWFLOW))
    373 		ttyblock(tp);
    374 	if (!ISSET(tp->t_state, TS_TYPEN) && ISSET(iflag, ISTRIP))
    375 		CLR(c, 0x80);
    376 	if (!ISSET(lflag, EXTPROC)) {
    377 		/*
    378 		 * Check for literal nexting very first
    379 		 */
    380 		if (ISSET(tp->t_state, TS_LNCH)) {
    381 			SET(c, TTY_QUOTE);
    382 			CLR(tp->t_state, TS_LNCH);
    383 		}
    384 		/*
    385 		 * Scan for special characters.  This code
    386 		 * is really just a big case statement with
    387 		 * non-constant cases.  The bottom of the
    388 		 * case statement is labeled ``endcase'', so goto
    389 		 * it after a case match, or similar.
    390 		 */
    391 
    392 		/*
    393 		 * Control chars which aren't controlled
    394 		 * by ICANON, ISIG, or IXON.
    395 		 */
    396 		if (ISSET(lflag, IEXTEN)) {
    397 			if (CCEQ(cc[VLNEXT], c)) {
    398 				if (ISSET(lflag, ECHO)) {
    399 					if (ISSET(lflag, ECHOE)) {
    400 						(void)ttyoutput('^', tp);
    401 						(void)ttyoutput('\b', tp);
    402 					} else
    403 						ttyecho(c, tp);
    404 				}
    405 				SET(tp->t_state, TS_LNCH);
    406 				goto endcase;
    407 			}
    408 			if (CCEQ(cc[VDISCARD], c)) {
    409 				if (ISSET(lflag, FLUSHO))
    410 					CLR(tp->t_lflag, FLUSHO);
    411 				else {
    412 					ttyflush(tp, FWRITE);
    413 					ttyecho(c, tp);
    414 					if (tp->t_rawq.c_cc + tp->t_canq.c_cc)
    415 						ttyretype(tp);
    416 					SET(tp->t_lflag, FLUSHO);
    417 				}
    418 				goto startoutput;
    419 			}
    420 		}
    421 		/*
    422 		 * Signals.
    423 		 */
    424 		if (ISSET(lflag, ISIG)) {
    425 			if (CCEQ(cc[VINTR], c) || CCEQ(cc[VQUIT], c)) {
    426 				if (!ISSET(lflag, NOFLSH))
    427 					ttyflush(tp, FREAD | FWRITE);
    428 				ttyecho(c, tp);
    429 				pgsignal(tp->t_pgrp,
    430 				    CCEQ(cc[VINTR], c) ? SIGINT : SIGQUIT, 1);
    431 				goto endcase;
    432 			}
    433 			if (CCEQ(cc[VSUSP], c)) {
    434 				if (!ISSET(lflag, NOFLSH))
    435 					ttyflush(tp, FREAD);
    436 				ttyecho(c, tp);
    437 				pgsignal(tp->t_pgrp, SIGTSTP, 1);
    438 				goto endcase;
    439 			}
    440 		}
    441 		/*
    442 		 * Handle start/stop characters.
    443 		 */
    444 		if (ISSET(iflag, IXON)) {
    445 			if (CCEQ(cc[VSTOP], c)) {
    446 				if (!ISSET(tp->t_state, TS_TTSTOP)) {
    447 					SET(tp->t_state, TS_TTSTOP);
    448 					(*cdevsw[major(tp->t_dev)].d_stop)(tp,
    449 					   0);
    450 					return (0);
    451 				}
    452 				if (!CCEQ(cc[VSTART], c))
    453 					return (0);
    454 				/*
    455 				 * if VSTART == VSTOP then toggle
    456 				 */
    457 				goto endcase;
    458 			}
    459 			if (CCEQ(cc[VSTART], c))
    460 				goto restartoutput;
    461 		}
    462 		/*
    463 		 * IGNCR, ICRNL, & INLCR
    464 		 */
    465 		if (c == '\r') {
    466 			if (ISSET(iflag, IGNCR))
    467 				goto endcase;
    468 			else if (ISSET(iflag, ICRNL))
    469 				c = '\n';
    470 		} else if (c == '\n' && ISSET(iflag, INLCR))
    471 			c = '\r';
    472 	}
    473 	if (!ISSET(tp->t_lflag, EXTPROC) && ISSET(lflag, ICANON)) {
    474 		/*
    475 		 * From here on down canonical mode character
    476 		 * processing takes place.
    477 		 */
    478 		/*
    479 		 * erase (^H / ^?)
    480 		 */
    481 		if (CCEQ(cc[VERASE], c)) {
    482 			if (tp->t_rawq.c_cc)
    483 				ttyrub(unputc(&tp->t_rawq), tp);
    484 			goto endcase;
    485 		}
    486 		/*
    487 		 * kill (^U)
    488 		 */
    489 		if (CCEQ(cc[VKILL], c)) {
    490 			if (ISSET(lflag, ECHOKE) &&
    491 			    tp->t_rawq.c_cc == tp->t_rocount &&
    492 			    !ISSET(lflag, ECHOPRT))
    493 				while (tp->t_rawq.c_cc)
    494 					ttyrub(unputc(&tp->t_rawq), tp);
    495 			else {
    496 				ttyecho(c, tp);
    497 				if (ISSET(lflag, ECHOK) ||
    498 				    ISSET(lflag, ECHOKE))
    499 					ttyecho('\n', tp);
    500 				FLUSHQ(&tp->t_rawq);
    501 				tp->t_rocount = 0;
    502 			}
    503 			CLR(tp->t_state, TS_LOCAL);
    504 			goto endcase;
    505 		}
    506 		/*
    507 		 * Extensions to the POSIX.1 GTI set of functions.
    508 		 */
    509 		if (ISSET(lflag, IEXTEN)) {
    510 			/*
    511 			 * word erase (^W)
    512 			 */
    513 			if (CCEQ(cc[VWERASE], c)) {
    514 				int alt = ISSET(lflag, ALTWERASE);
    515 				int ctype;
    516 
    517 				/*
    518 				 * erase whitespace
    519 				 */
    520 				while ((c = unputc(&tp->t_rawq)) == ' ' ||
    521 				       c == '\t')
    522 					ttyrub(c, tp);
    523 				if (c == -1)
    524 					goto endcase;
    525 				/*
    526 				 * erase last char of word and remember the
    527 				 * next chars type (for ALTWERASE)
    528 				 */
    529 				ttyrub(c, tp);
    530 				c = unputc(&tp->t_rawq);
    531 				if (c == -1)
    532 					goto endcase;
    533 				if (c == ' ' || c == '\t') {
    534 					(void)putc(c, &tp->t_rawq);
    535 					goto endcase;
    536 				}
    537 				ctype = ISALPHA(c);
    538 				/*
    539 				 * erase rest of word
    540 				 */
    541 				do {
    542 					ttyrub(c, tp);
    543 					c = unputc(&tp->t_rawq);
    544 					if (c == -1)
    545 						goto endcase;
    546 				} while (c != ' ' && c != '\t' &&
    547 				         (alt == 0 || ISALPHA(c) == ctype));
    548 				(void)putc(c, &tp->t_rawq);
    549 				goto endcase;
    550 			}
    551 			/*
    552 			 * reprint line (^R)
    553 			 */
    554 			if (CCEQ(cc[VREPRINT], c)) {
    555 				ttyretype(tp);
    556 				goto endcase;
    557 			}
    558 			/*
    559 			 * ^T - kernel info and generate SIGINFO
    560 			 */
    561 			if (CCEQ(cc[VSTATUS], c)) {
    562 				if (!ISSET(lflag, NOKERNINFO))
    563 					ttyinfo(tp);
    564 				if (ISSET(lflag, ISIG))
    565 					pgsignal(tp->t_pgrp, SIGINFO, 1);
    566 				goto endcase;
    567 			}
    568 		}
    569 	}
    570 	/*
    571 	 * Check for input buffer overflow
    572 	 */
    573 	if (tp->t_rawq.c_cc + tp->t_canq.c_cc >= TTYHOG) {
    574 		if (ISSET(iflag, IMAXBEL)) {
    575 			if (tp->t_outq.c_cc < tp->t_hiwat)
    576 				(void)ttyoutput(CTRL('g'), tp);
    577 		} else
    578 			ttyflush(tp, FREAD | FWRITE);
    579 		goto endcase;
    580 	}
    581 	/*
    582 	 * Put data char in q for user and
    583 	 * wakeup on seeing a line delimiter.
    584 	 */
    585 	if (putc(c, &tp->t_rawq) >= 0) {
    586 		if (!ISSET(lflag, ICANON)) {
    587 			ttwakeup(tp);
    588 			ttyecho(c, tp);
    589 			goto endcase;
    590 		}
    591 		if (TTBREAKC(c, lflag)) {
    592 			tp->t_rocount = 0;
    593 			catq(&tp->t_rawq, &tp->t_canq);
    594 			ttwakeup(tp);
    595 		} else if (tp->t_rocount++ == 0)
    596 			tp->t_rocol = tp->t_column;
    597 		if (ISSET(tp->t_state, TS_ERASE)) {
    598 			/*
    599 			 * end of prterase \.../
    600 			 */
    601 			CLR(tp->t_state, TS_ERASE);
    602 			(void)ttyoutput('/', tp);
    603 		}
    604 		i = tp->t_column;
    605 		ttyecho(c, tp);
    606 		if (CCEQ(cc[VEOF], c) && ISSET(lflag, ECHO)) {
    607 			/*
    608 			 * Place the cursor over the '^' of the ^D.
    609 			 */
    610 			i = min(2, tp->t_column - i);
    611 			while (i > 0) {
    612 				(void)ttyoutput('\b', tp);
    613 				i--;
    614 			}
    615 		}
    616 	}
    617  endcase:
    618 	/*
    619 	 * IXANY means allow any character to restart output.
    620 	 */
    621 	if (ISSET(tp->t_state, TS_TTSTOP) &&
    622 	    !ISSET(iflag, IXANY) && cc[VSTART] != cc[VSTOP])
    623 		return (0);
    624  restartoutput:
    625 	CLR(tp->t_lflag, FLUSHO);
    626 	CLR(tp->t_state, TS_TTSTOP);
    627  startoutput:
    628 	return (ttstart(tp));
    629 }
    630 
    631 /*
    632  * Output a single character on a tty, doing output processing
    633  * as needed (expanding tabs, newline processing, etc.).
    634  * Returns < 0 if succeeds, otherwise returns char to resend.
    635  * Must be recursive.
    636  */
    637 int
    638 ttyoutput(int c, struct tty *tp)
    639 {
    640 	long	oflag;
    641 	int	col, notout, s;
    642 
    643 	oflag = tp->t_oflag;
    644 	if (!ISSET(oflag, OPOST)) {
    645 		tk_nout++;
    646 		tp->t_outcc++;
    647 		if (!ISSET(tp->t_lflag, FLUSHO) && putc(c, &tp->t_outq))
    648 			return (c);
    649 		return (-1);
    650 	}
    651 	/*
    652 	 * Do tab expansion if OXTABS is set.  Special case if we do external
    653 	 * processing, we don't do the tab expansion because we'll probably
    654 	 * get it wrong.  If tab expansion needs to be done, let it happen
    655 	 * externally.
    656 	 */
    657 	CLR(c, ~TTY_CHARMASK);
    658 	if (c == '\t' &&
    659 	    ISSET(oflag, OXTABS) && !ISSET(tp->t_lflag, EXTPROC)) {
    660 		c = 8 - (tp->t_column & 7);
    661 		if (ISSET(tp->t_lflag, FLUSHO)) {
    662 			notout = 0;
    663 		} else {
    664 			s = spltty();		/* Don't interrupt tabs. */
    665 			notout = b_to_q("        ", c, &tp->t_outq);
    666 			c -= notout;
    667 			tk_nout += c;
    668 			tp->t_outcc += c;
    669 			splx(s);
    670 		}
    671 		tp->t_column += c;
    672 		return (notout ? '\t' : -1);
    673 	}
    674 	if (c == CEOT && ISSET(oflag, ONOEOT))
    675 		return (-1);
    676 
    677 	/*
    678 	 * Newline translation: if ONLCR is set,
    679 	 * translate newline into "\r\n".
    680 	 */
    681 	if (c == '\n' && ISSET(tp->t_oflag, ONLCR)) {
    682 		tk_nout++;
    683 		tp->t_outcc++;
    684 		if (!ISSET(tp->t_lflag, FLUSHO) && putc('\r', &tp->t_outq))
    685 			return (c);
    686 	}
    687 	/* If OCRNL is set, translate "\r" into "\n". */
    688 	else if (c == '\r' && ISSET(tp->t_oflag, OCRNL))
    689 		c = '\n';
    690 	/* If ONOCR is set, don't transmit CRs when on column 0. */
    691 	else if (c == '\r' && ISSET(tp->t_oflag, ONOCR) && tp->t_column == 0)
    692 		return (-1);
    693 
    694 	tk_nout++;
    695 	tp->t_outcc++;
    696 	if (!ISSET(tp->t_lflag, FLUSHO) && putc(c, &tp->t_outq))
    697 		return (c);
    698 
    699 	col = tp->t_column;
    700 	switch (CCLASS(c)) {
    701 	case BACKSPACE:
    702 		if (col > 0)
    703 			--col;
    704 		break;
    705 	case CONTROL:
    706 		break;
    707 	case NEWLINE:
    708 		if (ISSET(tp->t_oflag, ONLCR | ONLRET))
    709 			col = 0;
    710 		break;
    711 	case RETURN:
    712 		col = 0;
    713 		break;
    714 	case ORDINARY:
    715 		++col;
    716 		break;
    717 	case TAB:
    718 		col = (col + 8) & ~7;
    719 		break;
    720 	}
    721 	tp->t_column = col;
    722 	return (-1);
    723 }
    724 
    725 /*
    726  * Ioctls for all tty devices.  Called after line-discipline specific ioctl
    727  * has been called to do discipline-specific functions and/or reject any
    728  * of these ioctl commands.
    729  */
    730 /* ARGSUSED */
    731 int
    732 ttioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
    733 {
    734 	extern struct tty *constty;	/* Temporary virtual console. */
    735 	struct linesw	*lp;
    736 	int		s, error;
    737 
    738 	/* If the ioctl involves modification, hang if in the background. */
    739 	switch (cmd) {
    740 	case  TIOCFLUSH:
    741 	case  TIOCDRAIN:
    742 	case  TIOCSBRK:
    743 	case  TIOCCBRK:
    744 	case  TIOCSTART:
    745 	case  TIOCSETA:
    746 	case  TIOCSETD:
    747 	case  TIOCSLINED:
    748 	case  TIOCSETAF:
    749 	case  TIOCSETAW:
    750 #ifdef notdef
    751 	case  TIOCSPGRP:
    752 #endif
    753 	case  TIOCSTAT:
    754 	case  TIOCSTI:
    755 	case  TIOCSWINSZ:
    756 #ifdef COMPAT_OLDTTY
    757 	case  TIOCLBIC:
    758 	case  TIOCLBIS:
    759 	case  TIOCLSET:
    760 	case  TIOCSETC:
    761 	case OTIOCSETD:
    762 	case  TIOCSETN:
    763 	case  TIOCSETP:
    764 	case  TIOCSLTC:
    765 #endif
    766 		while (isbackground(curproc, tp) &&
    767 		    p->p_pgrp->pg_jobc && (p->p_flag & P_PPWAIT) == 0 &&
    768 		    !sigismasked(p, SIGTTOU)) {
    769 			pgsignal(p->p_pgrp, SIGTTOU, 1);
    770 			error = ttysleep(tp, &lbolt, TTOPRI | PCATCH, ttybg, 0);
    771 			if (error)
    772 				return (error);
    773 		}
    774 		break;
    775 	}
    776 
    777 	switch (cmd) {			/* Process the ioctl. */
    778 	case FIOASYNC:			/* set/clear async i/o */
    779 		s = spltty();
    780 		if (*(int *)data)
    781 			SET(tp->t_state, TS_ASYNC);
    782 		else
    783 			CLR(tp->t_state, TS_ASYNC);
    784 		splx(s);
    785 		break;
    786 	case FIONBIO:			/* set/clear non-blocking i/o */
    787 		break;			/* XXX: delete. */
    788 	case FIONREAD:			/* get # bytes to read */
    789 		*(int *)data = ttnread(tp);
    790 		break;
    791 	case TIOCEXCL:			/* set exclusive use of tty */
    792 		s = spltty();
    793 		SET(tp->t_state, TS_XCLUDE);
    794 		splx(s);
    795 		break;
    796 	case TIOCFLUSH: {		/* flush buffers */
    797 		int flags = *(int *)data;
    798 
    799 		if (flags == 0)
    800 			flags = FREAD | FWRITE;
    801 		else
    802 			flags &= FREAD | FWRITE;
    803 		ttyflush(tp, flags);
    804 		break;
    805 	}
    806 	case TIOCCONS:			/* become virtual console */
    807 		if (*(int *)data) {
    808 			if (constty && constty != tp &&
    809 			    ISSET(constty->t_state, TS_CARR_ON | TS_ISOPEN) ==
    810 			    (TS_CARR_ON | TS_ISOPEN))
    811 				return (EBUSY);
    812 #ifndef	UCONSOLE
    813 			if ((error = suser(p->p_ucred, &p->p_acflag)) != 0)
    814 				return (error);
    815 #endif
    816 			constty = tp;
    817 		} else if (tp == constty)
    818 			constty = NULL;
    819 		break;
    820 	case TIOCDRAIN:			/* wait till output drained */
    821 		if ((error = ttywait(tp)) != 0)
    822 			return (error);
    823 		break;
    824 	case TIOCGETA: {		/* get termios struct */
    825 		struct termios *t = (struct termios *)data;
    826 
    827 		memcpy(t, &tp->t_termios, sizeof(struct termios));
    828 		break;
    829 	}
    830 	case TIOCGETD:			/* get line discipline */
    831 		*(int *)data = tp->t_linesw->l_no;
    832 		break;
    833 	case TIOCGLINED:
    834 		(void)strncpy((char *)data, tp->t_linesw->l_name,
    835 		    TTLINEDNAMELEN - 1);
    836 		break;
    837 	case TIOCGWINSZ:		/* get window size */
    838 		*(struct winsize *)data = tp->t_winsize;
    839 		break;
    840 	case TIOCGPGRP:			/* get pgrp of tty */
    841 		if (!isctty(p, tp))
    842 			return (ENOTTY);
    843 		*(int *)data = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PID;
    844 		break;
    845 	case TIOCGSID:			/* get sid of tty */
    846 		if (!isctty(p, tp))
    847 			return (ENOTTY);
    848 		*(int *)data = tp->t_session->s_sid;
    849 		break;
    850 #ifdef TIOCHPCL
    851 	case TIOCHPCL:			/* hang up on last close */
    852 		s = spltty();
    853 		SET(tp->t_cflag, HUPCL);
    854 		splx(s);
    855 		break;
    856 #endif
    857 	case TIOCNXCL:			/* reset exclusive use of tty */
    858 		s = spltty();
    859 		CLR(tp->t_state, TS_XCLUDE);
    860 		splx(s);
    861 		break;
    862 	case TIOCOUTQ:			/* output queue size */
    863 		*(int *)data = tp->t_outq.c_cc;
    864 		break;
    865 	case TIOCSETA:			/* set termios struct */
    866 	case TIOCSETAW:			/* drain output, set */
    867 	case TIOCSETAF: {		/* drn out, fls in, set */
    868 		struct termios *t = (struct termios *)data;
    869 
    870 		s = spltty();
    871 		if (cmd == TIOCSETAW || cmd == TIOCSETAF) {
    872 			if ((error = ttywait(tp)) != 0) {
    873 				splx(s);
    874 				return (error);
    875 			}
    876 			if (cmd == TIOCSETAF)
    877 				ttyflush(tp, FREAD);
    878 		}
    879 		if (!ISSET(t->c_cflag, CIGNORE)) {
    880 			/*
    881 			 * Set device hardware.
    882 			 */
    883 			if (tp->t_param && (error = (*tp->t_param)(tp, t))) {
    884 				splx(s);
    885 				return (error);
    886 			} else {
    887 				tp->t_cflag = t->c_cflag;
    888 				tp->t_ispeed = t->c_ispeed;
    889 				tp->t_ospeed = t->c_ospeed;
    890 				if (t->c_ospeed == 0 && tp->t_session &&
    891 				    tp->t_session->s_leader)
    892 					psignal(tp->t_session->s_leader,
    893 					    SIGHUP);
    894 			}
    895 			ttsetwater(tp);
    896 		}
    897 		if (cmd != TIOCSETAF) {
    898 			if (ISSET(t->c_lflag, ICANON) !=
    899 			    ISSET(tp->t_lflag, ICANON)) {
    900 				if (ISSET(t->c_lflag, ICANON)) {
    901 					SET(tp->t_lflag, PENDIN);
    902 					ttwakeup(tp);
    903 				} else {
    904 					struct clist tq;
    905 
    906 					catq(&tp->t_rawq, &tp->t_canq);
    907 					tq = tp->t_rawq;
    908 					tp->t_rawq = tp->t_canq;
    909 					tp->t_canq = tq;
    910 					CLR(tp->t_lflag, PENDIN);
    911 				}
    912 			}
    913 		}
    914 		tp->t_iflag = t->c_iflag;
    915 		tp->t_oflag = t->c_oflag;
    916 		/*
    917 		 * Make the EXTPROC bit read only.
    918 		 */
    919 		if (ISSET(tp->t_lflag, EXTPROC))
    920 			SET(t->c_lflag, EXTPROC);
    921 		else
    922 			CLR(t->c_lflag, EXTPROC);
    923 		tp->t_lflag = t->c_lflag | ISSET(tp->t_lflag, PENDIN);
    924 		memcpy(tp->t_cc, t->c_cc, sizeof(t->c_cc));
    925 		splx(s);
    926 		break;
    927 	}
    928 	case TIOCSETD: {		/* set line discipline */
    929 		int t = *(int *)data;
    930 
    931 		if ((u_int)t >= nlinesw)
    932 			return (ENXIO);
    933 		lp = linesw[t];
    934 		goto setldisc;
    935 	}
    936 	case TIOCSLINED: {		/* set line discipline */
    937 		char *name = (char *)data;
    938 		dev_t device;
    939 
    940 		/* Null terminate to prevent buffer overflow */
    941 		name[TTLINEDNAMELEN - 1] = '\0';
    942 		lp = ttyldisc_lookup(name);
    943 
    944  setldisc:
    945 		if (lp == NULL)
    946 			return (ENXIO);
    947 
    948 		if (lp != tp->t_linesw) {
    949 			device = tp->t_dev;
    950 			s = spltty();
    951 			(*tp->t_linesw->l_close)(tp, flag);
    952 			error = (*lp->l_open)(device, tp);
    953 			if (error) {
    954 				(void)(*tp->t_linesw->l_open)(device, tp);
    955 				splx(s);
    956 				return (error);
    957 			}
    958 			tp->t_linesw = lp;
    959 			splx(s);
    960 		}
    961 		break;
    962 	}
    963 	case TIOCSTART:			/* start output, like ^Q */
    964 		s = spltty();
    965 		if (ISSET(tp->t_state, TS_TTSTOP) ||
    966 		    ISSET(tp->t_lflag, FLUSHO)) {
    967 			CLR(tp->t_lflag, FLUSHO);
    968 			CLR(tp->t_state, TS_TTSTOP);
    969 			ttstart(tp);
    970 		}
    971 		splx(s);
    972 		break;
    973 	case TIOCSTI:			/* simulate terminal input */
    974 		if (p->p_ucred->cr_uid && (flag & FREAD) == 0)
    975 			return (EPERM);
    976 		if (p->p_ucred->cr_uid && !isctty(p, tp))
    977 			return (EACCES);
    978 		(*tp->t_linesw->l_rint)(*(u_char *)data, tp);
    979 		break;
    980 	case TIOCSTOP:			/* stop output, like ^S */
    981 		s = spltty();
    982 		if (!ISSET(tp->t_state, TS_TTSTOP)) {
    983 			SET(tp->t_state, TS_TTSTOP);
    984 			(*cdevsw[major(tp->t_dev)].d_stop)(tp, 0);
    985 		}
    986 		splx(s);
    987 		break;
    988 	case TIOCSCTTY:			/* become controlling tty */
    989 		/* Session ctty vnode pointer set in vnode layer. */
    990 		if (!SESS_LEADER(p) ||
    991 		    ((p->p_session->s_ttyvp || tp->t_session) &&
    992 		     (tp->t_session != p->p_session)))
    993 			return (EPERM);
    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(tp)
   1084 	struct tty *tp;
   1085 {
   1086 	int	error, s;
   1087 
   1088 	error = 0;
   1089 	s = spltty();
   1090 	while ((tp->t_outq.c_cc || ISSET(tp->t_state, TS_BUSY)) &&
   1091 	    CONNECTED(tp) && tp->t_oproc) {
   1092 		(*tp->t_oproc)(tp);
   1093 		SET(tp->t_state, TS_ASLEEP);
   1094 		error = ttysleep(tp, &tp->t_outq, TTOPRI | PCATCH, ttyout, 0);
   1095 		if (error)
   1096 			break;
   1097 	}
   1098 	splx(s);
   1099 	return (error);
   1100 }
   1101 
   1102 /*
   1103  * Flush if successfully wait.
   1104  */
   1105 int
   1106 ttywflush(struct tty *tp)
   1107 {
   1108 	int	error;
   1109 
   1110 	if ((error = ttywait(tp)) == 0)
   1111 		ttyflush(tp, FREAD);
   1112 	return (error);
   1113 }
   1114 
   1115 /*
   1116  * Flush tty read and/or write queues, notifying anyone waiting.
   1117  */
   1118 void
   1119 ttyflush(struct tty *tp, int rw)
   1120 {
   1121 	int	s;
   1122 
   1123 	s = spltty();
   1124 	if (rw & FREAD) {
   1125 		FLUSHQ(&tp->t_canq);
   1126 		FLUSHQ(&tp->t_rawq);
   1127 		tp->t_rocount = 0;
   1128 		tp->t_rocol = 0;
   1129 		CLR(tp->t_state, TS_LOCAL);
   1130 		ttwakeup(tp);
   1131 	}
   1132 	if (rw & FWRITE) {
   1133 		CLR(tp->t_state, TS_TTSTOP);
   1134 		(*cdevsw[major(tp->t_dev)].d_stop)(tp, rw);
   1135 		FLUSHQ(&tp->t_outq);
   1136 		wakeup((caddr_t)&tp->t_outq);
   1137 		selwakeup(&tp->t_wsel);
   1138 	}
   1139 	splx(s);
   1140 }
   1141 
   1142 /*
   1143  * Copy in the default termios characters.
   1144  */
   1145 void
   1146 ttychars(struct tty *tp)
   1147 {
   1148 
   1149 	memcpy(tp->t_cc, ttydefchars, sizeof(ttydefchars));
   1150 }
   1151 
   1152 /*
   1153  * Send stop character on input overflow.
   1154  */
   1155 static void
   1156 ttyblock(struct tty *tp)
   1157 {
   1158 	int	total;
   1159 
   1160 	total = tp->t_rawq.c_cc + tp->t_canq.c_cc;
   1161 	if (tp->t_rawq.c_cc > TTYHOG) {
   1162 		ttyflush(tp, FREAD | FWRITE);
   1163 		CLR(tp->t_state, TS_TBLOCK);
   1164 	}
   1165 	/*
   1166 	 * Block further input iff: current input > threshold
   1167 	 * AND input is available to user program.
   1168 	 */
   1169 	if (total >= TTYHOG / 2 &&
   1170 	    !ISSET(tp->t_state, TS_TBLOCK) &&
   1171 	    (!ISSET(tp->t_lflag, ICANON) || tp->t_canq.c_cc > 0)) {
   1172 		if (ISSET(tp->t_iflag, IXOFF) &&
   1173 		    tp->t_cc[VSTOP] != _POSIX_VDISABLE &&
   1174 		    putc(tp->t_cc[VSTOP], &tp->t_outq) == 0) {
   1175 			SET(tp->t_state, TS_TBLOCK);
   1176 			ttstart(tp);
   1177 		}
   1178 		/* Try to block remote output via hardware flow control. */
   1179 		if (ISSET(tp->t_cflag, CHWFLOW) && tp->t_hwiflow &&
   1180 		    (*tp->t_hwiflow)(tp, 1) != 0)
   1181 			SET(tp->t_state, TS_TBLOCK);
   1182 	}
   1183 }
   1184 
   1185 void
   1186 ttrstrt(void *tp_arg)
   1187 {
   1188 	struct tty	*tp;
   1189 	int		s;
   1190 
   1191 #ifdef DIAGNOSTIC
   1192 	if (tp_arg == NULL)
   1193 		panic("ttrstrt");
   1194 #endif
   1195 	tp = tp_arg;
   1196 	s = spltty();
   1197 
   1198 	CLR(tp->t_state, TS_TIMEOUT);
   1199 	ttstart(tp);
   1200 
   1201 	splx(s);
   1202 }
   1203 
   1204 int
   1205 ttstart(struct tty *tp)
   1206 {
   1207 
   1208 	if (tp->t_oproc != NULL)	/* XXX: Kludge for pty. */
   1209 		(*tp->t_oproc)(tp);
   1210 	return (0);
   1211 }
   1212 
   1213 /*
   1214  * "close" a line discipline
   1215  */
   1216 int
   1217 ttylclose(struct tty *tp, int flag)
   1218 {
   1219 
   1220 	if (flag & FNONBLOCK)
   1221 		ttyflush(tp, FREAD | FWRITE);
   1222 	else
   1223 		ttywflush(tp);
   1224 	return (0);
   1225 }
   1226 
   1227 /*
   1228  * Handle modem control transition on a tty.
   1229  * Flag indicates new state of carrier.
   1230  * Returns 0 if the line should be turned off, otherwise 1.
   1231  */
   1232 int
   1233 ttymodem(struct tty *tp, int flag)
   1234 {
   1235 
   1236 	if (flag == 0) {
   1237 		if (ISSET(tp->t_state, TS_CARR_ON)) {
   1238 			/*
   1239 			 * Lost carrier.
   1240 			 */
   1241 			CLR(tp->t_state, TS_CARR_ON);
   1242 			if (ISSET(tp->t_state, TS_ISOPEN) && !CONNECTED(tp)) {
   1243 				if (tp->t_session && tp->t_session->s_leader)
   1244 					psignal(tp->t_session->s_leader, 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 	ttyldisc_init();
   2104 
   2105 	TAILQ_INIT(&ttylist);
   2106 	tty_count = 0;
   2107 
   2108 	pool_init(&tty_pool, sizeof(struct tty), 0, 0, 0, "ttypl",
   2109 	    &pool_allocator_nointr);
   2110 }
   2111 
   2112 /*
   2113  * Attach a tty to the tty list.
   2114  *
   2115  * This should be called ONLY once per real tty (including pty's).
   2116  * eg, on the sparc, the keyboard and mouse have struct tty's that are
   2117  * distinctly NOT usable as tty's, and thus should not be attached to
   2118  * the ttylist.  This is why this call is not done from ttymalloc().
   2119  *
   2120  * Device drivers should attach tty's at a similar time that they are
   2121  * ttymalloc()'ed, or, for the case of statically allocated struct tty's
   2122  * either in the attach or (first) open routine.
   2123  */
   2124 void
   2125 tty_attach(struct tty *tp)
   2126 {
   2127 
   2128 	TAILQ_INSERT_TAIL(&ttylist, tp, tty_link);
   2129 	++tty_count;
   2130 }
   2131 
   2132 /*
   2133  * Remove a tty from the tty list.
   2134  */
   2135 void
   2136 tty_detach(struct tty *tp)
   2137 {
   2138 
   2139 	--tty_count;
   2140 #ifdef DIAGNOSTIC
   2141 	if (tty_count < 0)
   2142 		panic("tty_detach: tty_count < 0");
   2143 #endif
   2144 	TAILQ_REMOVE(&ttylist, tp, tty_link);
   2145 }
   2146 
   2147 /*
   2148  * Allocate a tty structure and its associated buffers.
   2149  */
   2150 struct tty *
   2151 ttymalloc(void)
   2152 {
   2153 	struct tty	*tp;
   2154 
   2155 	tp = pool_get(&tty_pool, PR_WAITOK);
   2156 	memset(tp, 0, sizeof(*tp));
   2157 	callout_init(&tp->t_outq_ch);
   2158 	callout_init(&tp->t_rstrt_ch);
   2159 	/* XXX: default to 1024 chars for now */
   2160 	clalloc(&tp->t_rawq, 1024, 1);
   2161 	clalloc(&tp->t_canq, 1024, 1);
   2162 	/* output queue doesn't need quoting */
   2163 	clalloc(&tp->t_outq, 1024, 0);
   2164 	/* Set default line discipline. */
   2165 	tp->t_linesw = linesw[0];
   2166 	return(tp);
   2167 }
   2168 
   2169 /*
   2170  * Free a tty structure and its buffers.
   2171  *
   2172  * Be sure to call tty_detach() for any tty that has been
   2173  * tty_attach()ed.
   2174  */
   2175 void
   2176 ttyfree(struct tty *tp)
   2177 {
   2178 
   2179 	callout_stop(&tp->t_outq_ch);
   2180 	callout_stop(&tp->t_rstrt_ch);
   2181 	clfree(&tp->t_rawq);
   2182 	clfree(&tp->t_canq);
   2183 	clfree(&tp->t_outq);
   2184 	pool_put(&tty_pool, tp);
   2185 }
   2186