xref: /dragonfly/sys/kern/tty.c (revision 3f625015)
1 /*-
2  * Copyright (c) 1982, 1986, 1990, 1991, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  * (c) UNIX System Laboratories, Inc.
5  * All or some portions of this file are derived from material licensed
6  * to the University of California by American Telephone and Telegraph
7  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
8  * the permission of UNIX System Laboratories, Inc.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. All advertising materials mentioning features or use of this software
19  *    must display the following acknowledgement:
20  *	This product includes software developed by the University of
21  *	California, Berkeley and its contributors.
22  * 4. Neither the name of the University nor the names of its contributors
23  *    may be used to endorse or promote products derived from this software
24  *    without specific prior written permission.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36  * SUCH DAMAGE.
37  *
38  *	@(#)tty.c	8.8 (Berkeley) 1/21/94
39  * $FreeBSD: src/sys/kern/tty.c,v 1.129.2.5 2002/03/11 01:32:31 dd Exp $
40  * $DragonFly: src/sys/kern/tty.c,v 1.41 2007/02/25 23:17:12 corecode Exp $
41  */
42 
43 /*-
44  * TODO:
45  *	o Fix races for sending the start char in ttyflush().
46  *	o Handle inter-byte timeout for "MIN > 0, TIME > 0" in ttyselect().
47  *	  With luck, there will be MIN chars before select() returns().
48  *	o Handle CLOCAL consistently for ptys.  Perhaps disallow setting it.
49  *	o Don't allow input in TS_ZOMBIE case.  It would be visible through
50  *	  FIONREAD.
51  *	o Do the new sio locking stuff here and use it to avoid special
52  *	  case for EXTPROC?
53  *	o Lock PENDIN too?
54  *	o Move EXTPROC and/or PENDIN to t_state?
55  *	o Wrap most of ttioctl in spltty/splx.
56  *	o Implement TIOCNOTTY or remove it from <sys/ioctl.h>.
57  *	o Send STOP if IXOFF is toggled off while TS_TBLOCK is set.
58  *	o Don't allow certain termios flags to affect disciplines other
59  *	  than TTYDISC.  Cancel their effects before switch disciplines
60  *	  and ignore them if they are set while we are in another
61  *	  discipline.
62  *	o Now that historical speed conversions are handled here, don't
63  *	  do them in drivers.
64  *	o Check for TS_CARR_ON being set while everything is closed and not
65  *	  waiting for carrier.  TS_CARR_ON isn't cleared if nothing is open,
66  *	  so it would live until the next open even if carrier drops.
67  *	o Restore TS_WOPEN since it is useful in pstat.  It must be cleared
68  *	  only when _all_ openers leave open().
69  */
70 
71 #include "opt_compat.h"
72 #include "opt_uconsole.h"
73 
74 #include <sys/param.h>
75 #include <sys/systm.h>
76 #include <sys/filio.h>
77 #if defined(COMPAT_43) || defined(COMPAT_SUNOS)
78 #include <sys/ioctl_compat.h>
79 #endif
80 #include <sys/proc.h>
81 #define	TTYDEFCHARS
82 #include <sys/tty.h>
83 #include <sys/clist.h>
84 #undef	TTYDEFCHARS
85 #include <sys/fcntl.h>
86 #include <sys/conf.h>
87 #include <sys/dkstat.h>
88 #include <sys/poll.h>
89 #include <sys/kernel.h>
90 #include <sys/vnode.h>
91 #include <sys/signalvar.h>
92 #include <sys/signal2.h>
93 #include <sys/resourcevar.h>
94 #include <sys/malloc.h>
95 #include <sys/filedesc.h>
96 #include <sys/sysctl.h>
97 #include <sys/thread2.h>
98 
99 #include <vm/vm.h>
100 #include <sys/lock.h>
101 #include <vm/pmap.h>
102 #include <vm/vm_map.h>
103 
104 MALLOC_DEFINE(M_TTYS, "ttys", "tty data structures");
105 
106 static int	proc_compare (struct proc *p1, struct proc *p2);
107 static int	ttnread (struct tty *tp);
108 static void	ttyecho (int c, struct tty *tp);
109 static int	ttyoutput (int c, struct tty *tp);
110 static void	ttypend (struct tty *tp);
111 static void	ttyretype (struct tty *tp);
112 static void	ttyrub (int c, struct tty *tp);
113 static void	ttyrubo (struct tty *tp, int cnt);
114 static void	ttyunblock (struct tty *tp);
115 static int	ttywflush (struct tty *tp);
116 static int	filt_ttyread (struct knote *kn, long hint);
117 static void 	filt_ttyrdetach (struct knote *kn);
118 static int	filt_ttywrite (struct knote *kn, long hint);
119 static void 	filt_ttywdetach (struct knote *kn);
120 
121 /*
122  * Table with character classes and parity. The 8th bit indicates parity,
123  * the 7th bit indicates the character is an alphameric or underscore (for
124  * ALTWERASE), and the low 6 bits indicate delay type.  If the low 6 bits
125  * are 0 then the character needs no special processing on output; classes
126  * other than 0 might be translated or (not currently) require delays.
127  */
128 #define	E	0x00	/* Even parity. */
129 #define	O	0x80	/* Odd parity. */
130 #define	PARITY(c)	(char_type[c] & O)
131 
132 #define	ALPHA	0x40	/* Alpha or underscore. */
133 #define	ISALPHA(c)	(char_type[(c) & TTY_CHARMASK] & ALPHA)
134 
135 #define	CCLASSMASK	0x3f
136 #define	CCLASS(c)	(char_type[c] & CCLASSMASK)
137 
138 #define	BS	BACKSPACE
139 #define	CC	CONTROL
140 #define	CR	RETURN
141 #define	NA	ORDINARY | ALPHA
142 #define	NL	NEWLINE
143 #define	NO	ORDINARY
144 #define	TB	TAB
145 #define	VT	VTAB
146 
147 static u_char const char_type[] = {
148 	E|CC, O|CC, O|CC, E|CC, O|CC, E|CC, E|CC, O|CC,	/* nul - bel */
149 	O|BS, E|TB, E|NL, O|CC, E|VT, O|CR, O|CC, E|CC, /* bs - si */
150 	O|CC, E|CC, E|CC, O|CC, E|CC, O|CC, O|CC, E|CC, /* dle - etb */
151 	E|CC, O|CC, O|CC, E|CC, O|CC, E|CC, E|CC, O|CC, /* can - us */
152 	O|NO, E|NO, E|NO, O|NO, E|NO, O|NO, O|NO, E|NO, /* sp - ' */
153 	E|NO, O|NO, O|NO, E|NO, O|NO, E|NO, E|NO, O|NO, /* ( - / */
154 	E|NA, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA, /* 0 - 7 */
155 	O|NA, E|NA, E|NO, O|NO, E|NO, O|NO, O|NO, E|NO, /* 8 - ? */
156 	O|NO, E|NA, E|NA, O|NA, E|NA, O|NA, O|NA, E|NA, /* @ - G */
157 	E|NA, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA, /* H - O */
158 	E|NA, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA, /* P - W */
159 	O|NA, E|NA, E|NA, O|NO, E|NO, O|NO, O|NO, O|NA, /* X - _ */
160 	E|NO, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA, /* ` - g */
161 	O|NA, E|NA, E|NA, O|NA, E|NA, O|NA, O|NA, E|NA, /* h - o */
162 	O|NA, E|NA, E|NA, O|NA, E|NA, O|NA, O|NA, E|NA, /* p - w */
163 	E|NA, O|NA, O|NA, E|NO, O|NO, E|NO, E|NO, O|CC, /* x - del */
164 	/*
165 	 * Meta chars; should be settable per character set;
166 	 * for now, treat them all as normal characters.
167 	 */
168 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
169 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
170 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
171 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
172 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
173 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
174 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
175 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
176 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
177 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
178 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
179 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
180 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
181 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
182 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
183 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
184 };
185 #undef	BS
186 #undef	CC
187 #undef	CR
188 #undef	NA
189 #undef	NL
190 #undef	NO
191 #undef	TB
192 #undef	VT
193 
194 /* Macros to clear/set/test flags. */
195 #define	SET(t, f)	(t) |= (f)
196 #define	CLR(t, f)	(t) &= ~(f)
197 #define	ISSET(t, f)	((t) & (f))
198 
199 #undef MAX_INPUT		/* XXX wrong in <sys/syslimits.h> */
200 #define	MAX_INPUT	TTYHOG	/* XXX limit is usually larger for !ICANON */
201 
202 uint64_t tk_nin;
203 SYSCTL_OPAQUE(_kern, OID_AUTO, tk_nin, CTLFLAG_RD, &tk_nin, sizeof(tk_nin),
204     "LU", "TTY input statistic");
205 uint64_t tk_nout;
206 SYSCTL_OPAQUE(_kern, OID_AUTO, tk_nout, CTLFLAG_RD, &tk_nout, sizeof(tk_nout),
207     "LU", "TTY output statistic");
208 uint64_t tk_rawcc;
209 
210 /*
211  * list of struct tty where pstat(8) can pick it up with sysctl
212  */
213 static SLIST_HEAD(, tty) tty_list;
214 
215 /*
216  * Initial open of tty, or (re)entry to standard tty line discipline.
217  */
218 int
219 ttyopen(cdev_t device, struct tty *tp)
220 {
221 	crit_enter();
222 	tp->t_dev = device;
223 	if (!ISSET(tp->t_state, TS_ISOPEN)) {
224 		SET(tp->t_state, TS_ISOPEN);
225 		if (ISSET(tp->t_cflag, CLOCAL))
226 			SET(tp->t_state, TS_CONNECTED);
227 		bzero(&tp->t_winsize, sizeof(tp->t_winsize));
228 	}
229 	ttsetwater(tp);
230 	crit_exit();
231 	return (0);
232 }
233 
234 /*
235  * Handle close() on a tty line: flush and set to initial state,
236  * bumping generation number so that pending read/write calls
237  * can detect recycling of the tty.
238  *
239  * XXX our caller should have done `spltty(); l_close(); ttyclose();'
240  * and l_close() should have flushed, but we repeat the spltty() and
241  * the flush in case there are buggy callers.
242  */
243 int
244 ttyclose(struct tty *tp)
245 {
246 	funsetown(tp->t_sigio);
247 	crit_enter();
248 	if (constty == tp)
249 		constty = NULL;
250 
251 	ttyflush(tp, FREAD | FWRITE);
252 	clist_free_cblocks(&tp->t_canq);
253 	clist_free_cblocks(&tp->t_outq);
254 	clist_free_cblocks(&tp->t_rawq);
255 
256 	tp->t_gen++;
257 	tp->t_line = TTYDISC;
258 	ttyclearsession(tp);
259 	tp->t_state = 0;
260 	crit_exit();
261 	return (0);
262 }
263 
264 /*
265  * Disassociate the tty from its session.  Traditionally this has only been
266  * a half-close, meaning that the session was still allowed to point at the
267  * tty (resulting in the tty in the ps command showing something like 'p0-'),
268  * even though the tty is no longer pointing at the session.
269  *
270  * The half close seems to be useful only for 'ps' output but there is as
271  * yet no reason to remove the feature.  The full-close code is currently
272  * #if 0'd out.  See also sess_rele() in kern/kern_proc.c.
273  */
274 void
275 ttyclearsession(struct tty *tp)
276 {
277 	struct session *sp;
278 
279 	tp->t_pgrp = NULL;
280 	if ((sp = tp->t_session) != NULL) {
281 		tp->t_session = NULL;
282 #ifdef TTY_DO_FULL_CLOSE
283 		/* FULL CLOSE (not yet) */
284 		if (sp->s_ttyp == tp) {
285 			sp->s_ttyp = NULL;
286 		} else {
287 			kprintf("ttyclearsession: warning: sp->s_ttyp != tp "
288 				"%p/%p\n", sp->s_ttyp, tp);
289 		}
290 #endif
291 	}
292 }
293 
294 /*
295  * Terminate the tty vnode association for a session.  This is the
296  * 'other half' of the close.  Because multiple opens of /dev/tty
297  * only generate a single open to the actual tty, the file modes
298  * are locked to FREAD|FWRITE.
299  */
300 void
301 ttyclosesession(struct session *sp, int dorele)
302 {
303 	struct vnode *vp;
304 
305 	if ((vp = sp->s_ttyvp) == NULL)
306 		return;
307 	sp->s_ttyvp = NULL;
308 	if (vp->v_flag & VCTTYISOPEN) {
309 		if (vn_lock(vp, LK_EXCLUSIVE|LK_RETRY) == 0) {
310 			vclrflags(vp, VCTTYISOPEN);
311 			VOP_CLOSE(vp, FREAD|FWRITE);
312 			vn_unlock(vp);
313 		}
314 	}
315 	if (dorele)
316 		vrele(vp);
317 }
318 
319 
320 #define	FLUSHQ(q) {							\
321 	if ((q)->c_cc)							\
322 		ndflush(q, (q)->c_cc);					\
323 }
324 
325 /* Is 'c' a line delimiter ("break" character)? */
326 #define	TTBREAKC(c, lflag)							\
327 	((c) == '\n' || (((c) == cc[VEOF] ||				\
328 	  (c) == cc[VEOL] || ((c) == cc[VEOL2] && lflag & IEXTEN)) &&	\
329 	 (c) != _POSIX_VDISABLE))
330 
331 /*
332  * Process input of a single character received on a tty.
333  */
334 int
335 ttyinput(int c, struct tty *tp)
336 {
337 	tcflag_t iflag, lflag;
338 	cc_t *cc;
339 	int i, err;
340 
341 	/*
342 	 * If input is pending take it first.
343 	 */
344 	lflag = tp->t_lflag;
345 	if (ISSET(lflag, PENDIN))
346 		ttypend(tp);
347 	/*
348 	 * Gather stats.
349 	 */
350 	if (ISSET(lflag, ICANON))
351 		++tp->t_cancc;
352 	else
353 		++tp->t_rawcc;
354 	++tk_nin;
355 
356 	/*
357 	 * Block further input iff:
358 	 * current input > threshold AND input is available to user program
359 	 * AND input flow control is enabled and not yet invoked.
360 	 * The 3 is slop for PARMRK.
361 	 */
362 	iflag = tp->t_iflag;
363 	if (tp->t_rawq.c_cc + tp->t_canq.c_cc > tp->t_ihiwat - 3 &&
364 	    (!ISSET(lflag, ICANON) || tp->t_canq.c_cc != 0) &&
365 	    (ISSET(tp->t_cflag, CRTS_IFLOW) || ISSET(iflag, IXOFF)) &&
366 	    !ISSET(tp->t_state, TS_TBLOCK))
367 		ttyblock(tp);
368 
369 	/* Handle exceptional conditions (break, parity, framing). */
370 	cc = tp->t_cc;
371 	err = (ISSET(c, TTY_ERRORMASK));
372 	if (err) {
373 		CLR(c, TTY_ERRORMASK);
374 		if (ISSET(err, TTY_BI)) {
375 			if (ISSET(iflag, IGNBRK))
376 				return (0);
377 			if (ISSET(iflag, BRKINT)) {
378 				ttyflush(tp, FREAD | FWRITE);
379 				pgsignal(tp->t_pgrp, SIGINT, 1);
380 				goto endcase;
381 			}
382 			if (ISSET(iflag, PARMRK))
383 				goto parmrk;
384 		} else if ((ISSET(err, TTY_PE) && ISSET(iflag, INPCK))
385 			|| ISSET(err, TTY_FE)) {
386 			if (ISSET(iflag, IGNPAR))
387 				return (0);
388 			else if (ISSET(iflag, PARMRK)) {
389 parmrk:
390 				if (tp->t_rawq.c_cc + tp->t_canq.c_cc >
391 				    MAX_INPUT - 3)
392 					goto input_overflow;
393 				clist_putc(0377 | TTY_QUOTE, &tp->t_rawq);
394 				clist_putc(0 | TTY_QUOTE, &tp->t_rawq);
395 				clist_putc(c | TTY_QUOTE, &tp->t_rawq);
396 				goto endcase;
397 			} else
398 				c = 0;
399 		}
400 	}
401 
402 	if (!ISSET(tp->t_state, TS_TYPEN) && ISSET(iflag, ISTRIP))
403 		CLR(c, 0x80);
404 	if (!ISSET(lflag, EXTPROC)) {
405 		/*
406 		 * Check for literal nexting very first
407 		 */
408 		if (ISSET(tp->t_state, TS_LNCH)) {
409 			SET(c, TTY_QUOTE);
410 			CLR(tp->t_state, TS_LNCH);
411 		}
412 		/*
413 		 * Scan for special characters.  This code
414 		 * is really just a big case statement with
415 		 * non-constant cases.  The bottom of the
416 		 * case statement is labeled ``endcase'', so goto
417 		 * it after a case match, or similar.
418 		 */
419 
420 		/*
421 		 * Control chars which aren't controlled
422 		 * by ICANON, ISIG, or IXON.
423 		 */
424 		if (ISSET(lflag, IEXTEN)) {
425 			if (CCEQ(cc[VLNEXT], c)) {
426 				if (ISSET(lflag, ECHO)) {
427 					if (ISSET(lflag, ECHOE)) {
428 						(void)ttyoutput('^', tp);
429 						(void)ttyoutput('\b', tp);
430 					} else
431 						ttyecho(c, tp);
432 				}
433 				SET(tp->t_state, TS_LNCH);
434 				goto endcase;
435 			}
436 			if (CCEQ(cc[VDISCARD], c)) {
437 				if (ISSET(lflag, FLUSHO))
438 					CLR(tp->t_lflag, FLUSHO);
439 				else {
440 					ttyflush(tp, FWRITE);
441 					ttyecho(c, tp);
442 					if (tp->t_rawq.c_cc + tp->t_canq.c_cc)
443 						ttyretype(tp);
444 					SET(tp->t_lflag, FLUSHO);
445 				}
446 				goto startoutput;
447 			}
448 		}
449 		/*
450 		 * Signals.
451 		 */
452 		if (ISSET(lflag, ISIG)) {
453 			if (CCEQ(cc[VINTR], c) || CCEQ(cc[VQUIT], c)) {
454 				if (!ISSET(lflag, NOFLSH))
455 					ttyflush(tp, FREAD | FWRITE);
456 				ttyecho(c, tp);
457 				pgsignal(tp->t_pgrp,
458 				    CCEQ(cc[VINTR], c) ? SIGINT : SIGQUIT, 1);
459 				goto endcase;
460 			}
461 			if (CCEQ(cc[VSUSP], c)) {
462 				if (!ISSET(lflag, NOFLSH))
463 					ttyflush(tp, FREAD);
464 				ttyecho(c, tp);
465 				pgsignal(tp->t_pgrp, SIGTSTP, 1);
466 				goto endcase;
467 			}
468 		}
469 		/*
470 		 * Handle start/stop characters.
471 		 */
472 		if (ISSET(iflag, IXON)) {
473 			if (CCEQ(cc[VSTOP], c)) {
474 				if (!ISSET(tp->t_state, TS_TTSTOP)) {
475 					SET(tp->t_state, TS_TTSTOP);
476 					(*tp->t_stop)(tp, 0);
477 					return (0);
478 				}
479 				if (!CCEQ(cc[VSTART], c))
480 					return (0);
481 				/*
482 				 * if VSTART == VSTOP then toggle
483 				 */
484 				goto endcase;
485 			}
486 			if (CCEQ(cc[VSTART], c))
487 				goto restartoutput;
488 		}
489 		/*
490 		 * IGNCR, ICRNL, & INLCR
491 		 */
492 		if (c == '\r') {
493 			if (ISSET(iflag, IGNCR))
494 				return (0);
495 			else if (ISSET(iflag, ICRNL))
496 				c = '\n';
497 		} else if (c == '\n' && ISSET(iflag, INLCR))
498 			c = '\r';
499 	}
500 	if (!ISSET(tp->t_lflag, EXTPROC) && ISSET(lflag, ICANON)) {
501 		/*
502 		 * From here on down canonical mode character
503 		 * processing takes place.
504 		 */
505 		/*
506 		 * erase or erase2 (^H / ^?)
507 		 */
508 		if (CCEQ(cc[VERASE], c) || CCEQ(cc[VERASE2], c) ) {
509 			if (tp->t_rawq.c_cc)
510 				ttyrub(clist_unputc(&tp->t_rawq), tp);
511 			goto endcase;
512 		}
513 		/*
514 		 * kill (^U)
515 		 */
516 		if (CCEQ(cc[VKILL], c)) {
517 			if (ISSET(lflag, ECHOKE) &&
518 			    tp->t_rawq.c_cc == tp->t_rocount &&
519 			    !ISSET(lflag, ECHOPRT))
520 				while (tp->t_rawq.c_cc)
521 					ttyrub(clist_unputc(&tp->t_rawq), tp);
522 			else {
523 				ttyecho(c, tp);
524 				if (ISSET(lflag, ECHOK) ||
525 				    ISSET(lflag, ECHOKE))
526 					ttyecho('\n', tp);
527 				FLUSHQ(&tp->t_rawq);
528 				tp->t_rocount = 0;
529 			}
530 			CLR(tp->t_state, TS_LOCAL);
531 			goto endcase;
532 		}
533 		/*
534 		 * word erase (^W)
535 		 */
536 		if (CCEQ(cc[VWERASE], c) && ISSET(lflag, IEXTEN)) {
537 			int ctype;
538 
539 			/*
540 			 * erase whitespace
541 			 */
542 			while ((c = clist_unputc(&tp->t_rawq)) == ' ' || c == '\t')
543 				ttyrub(c, tp);
544 			if (c == -1)
545 				goto endcase;
546 			/*
547 			 * erase last char of word and remember the
548 			 * next chars type (for ALTWERASE)
549 			 */
550 			ttyrub(c, tp);
551 			c = clist_unputc(&tp->t_rawq);
552 			if (c == -1)
553 				goto endcase;
554 			if (c == ' ' || c == '\t') {
555 				clist_putc(c, &tp->t_rawq);
556 				goto endcase;
557 			}
558 			ctype = ISALPHA(c);
559 			/*
560 			 * erase rest of word
561 			 */
562 			do {
563 				ttyrub(c, tp);
564 				c = clist_unputc(&tp->t_rawq);
565 				if (c == -1)
566 					goto endcase;
567 			} while (c != ' ' && c != '\t' &&
568 			    (!ISSET(lflag, ALTWERASE) || ISALPHA(c) == ctype));
569 			clist_putc(c, &tp->t_rawq);
570 			goto endcase;
571 		}
572 		/*
573 		 * reprint line (^R)
574 		 */
575 		if (CCEQ(cc[VREPRINT], c) && ISSET(lflag, IEXTEN)) {
576 			ttyretype(tp);
577 			goto endcase;
578 		}
579 		/*
580 		 * ^T - kernel info and generate SIGINFO
581 		 */
582 		if (CCEQ(cc[VSTATUS], c) && ISSET(lflag, IEXTEN)) {
583 			if (ISSET(lflag, ISIG))
584 				pgsignal(tp->t_pgrp, SIGINFO, 1);
585 			if (!ISSET(lflag, NOKERNINFO))
586 				ttyinfo(tp);
587 			goto endcase;
588 		}
589 		if (CCEQ(cc[VCHECKPT], c) && ISSET(lflag, IEXTEN)) {
590 			if (ISSET(lflag, ISIG))
591 				pgsignal(tp->t_pgrp, SIGCKPT, 1);
592 			goto endcase;
593 		}
594 	}
595 	/*
596 	 * Check for input buffer overflow
597 	 */
598 	if (tp->t_rawq.c_cc + tp->t_canq.c_cc >= MAX_INPUT) {
599 input_overflow:
600 		if (ISSET(iflag, IMAXBEL)) {
601 			if (tp->t_outq.c_cc < tp->t_ohiwat)
602 				(void)ttyoutput(CTRL('g'), tp);
603 		}
604 		goto endcase;
605 	}
606 
607 	if (   c == 0377 && ISSET(iflag, PARMRK) && !ISSET(iflag, ISTRIP)
608 	     && ISSET(iflag, IGNBRK|IGNPAR) != (IGNBRK|IGNPAR))
609 		clist_putc(0377 | TTY_QUOTE, &tp->t_rawq);
610 
611 	/*
612 	 * Put data char in q for user and
613 	 * wakeup on seeing a line delimiter.
614 	 */
615 	if (clist_putc(c, &tp->t_rawq) >= 0) {
616 		if (!ISSET(lflag, ICANON)) {
617 			ttwakeup(tp);
618 			ttyecho(c, tp);
619 			goto endcase;
620 		}
621 		if (TTBREAKC(c, lflag)) {
622 			tp->t_rocount = 0;
623 			catq(&tp->t_rawq, &tp->t_canq);
624 			ttwakeup(tp);
625 		} else if (tp->t_rocount++ == 0)
626 			tp->t_rocol = tp->t_column;
627 		if (ISSET(tp->t_state, TS_ERASE)) {
628 			/*
629 			 * end of prterase \.../
630 			 */
631 			CLR(tp->t_state, TS_ERASE);
632 			(void)ttyoutput('/', tp);
633 		}
634 		i = tp->t_column;
635 		ttyecho(c, tp);
636 		if (CCEQ(cc[VEOF], c) && ISSET(lflag, ECHO)) {
637 			/*
638 			 * Place the cursor over the '^' of the ^D.
639 			 */
640 			i = imin(2, tp->t_column - i);
641 			while (i > 0) {
642 				(void)ttyoutput('\b', tp);
643 				i--;
644 			}
645 		}
646 	}
647 endcase:
648 	/*
649 	 * IXANY means allow any character to restart output.
650 	 */
651 	if (ISSET(tp->t_state, TS_TTSTOP) &&
652 	    !ISSET(iflag, IXANY) && cc[VSTART] != cc[VSTOP])
653 		return (0);
654 restartoutput:
655 	CLR(tp->t_lflag, FLUSHO);
656 	CLR(tp->t_state, TS_TTSTOP);
657 startoutput:
658 	return (ttstart(tp));
659 }
660 
661 /*
662  * Output a single character on a tty, doing output processing
663  * as needed (expanding tabs, newline processing, etc.).
664  * Returns < 0 if succeeds, otherwise returns char to resend.
665  * Must be recursive.
666  */
667 static int
668 ttyoutput(int c, struct tty *tp)
669 {
670 	tcflag_t oflag;
671 	int col;
672 
673 	oflag = tp->t_oflag;
674 	if (!ISSET(oflag, OPOST)) {
675 		if (ISSET(tp->t_lflag, FLUSHO))
676 			return (-1);
677 		if (clist_putc(c, &tp->t_outq))
678 			return (c);
679 		tk_nout++;
680 		tp->t_outcc++;
681 		return (-1);
682 	}
683 	/*
684 	 * Do tab expansion if OXTABS is set.  Special case if we external
685 	 * processing, we don't do the tab expansion because we'll probably
686 	 * get it wrong.  If tab expansion needs to be done, let it happen
687 	 * externally.
688 	 */
689 	CLR(c, ~TTY_CHARMASK);
690 	if (c == '\t' &&
691 	    ISSET(oflag, OXTABS) && !ISSET(tp->t_lflag, EXTPROC)) {
692 		c = 8 - (tp->t_column & 7);
693 		if (!ISSET(tp->t_lflag, FLUSHO)) {
694 			crit_enter();		/* Don't interrupt tabs. */
695 			c -= b_to_q("        ", c, &tp->t_outq);
696 			tk_nout += c;
697 			tp->t_outcc += c;
698 			crit_exit();
699 		}
700 		tp->t_column += c;
701 		return (c ? -1 : '\t');
702 	}
703 	if (c == CEOT && ISSET(oflag, ONOEOT))
704 		return (-1);
705 
706 	/*
707 	 * Newline translation: if ONLCR is set,
708 	 * translate newline into "\r\n".
709 	 */
710 	if (c == '\n' && ISSET(tp->t_oflag, ONLCR)) {
711 		tk_nout++;
712 		tp->t_outcc++;
713 		if (!ISSET(tp->t_lflag, FLUSHO) && clist_putc('\r', &tp->t_outq))
714 			return (c);
715 	}
716 	/* If OCRNL is set, translate "\r" into "\n". */
717 	else if (c == '\r' && ISSET(tp->t_oflag, OCRNL))
718 		c = '\n';
719 	/* If ONOCR is set, don't transmit CRs when on column 0. */
720 	else if (c == '\r' && ISSET(tp->t_oflag, ONOCR) && tp->t_column == 0)
721 		return (-1);
722 
723 	tk_nout++;
724 	tp->t_outcc++;
725 	if (!ISSET(tp->t_lflag, FLUSHO) && clist_putc(c, &tp->t_outq))
726 		return (c);
727 
728 	col = tp->t_column;
729 	switch (CCLASS(c)) {
730 	case BACKSPACE:
731 		if (col > 0)
732 			--col;
733 		break;
734 	case CONTROL:
735 		break;
736 	case NEWLINE:
737 		if (ISSET(tp->t_oflag, ONLCR | ONLRET))
738 			col = 0;
739 		break;
740 	case RETURN:
741 		col = 0;
742 		break;
743 	case ORDINARY:
744 		++col;
745 		break;
746 	case TAB:
747 		col = (col + 8) & ~7;
748 		break;
749 	}
750 	tp->t_column = col;
751 	return (-1);
752 }
753 
754 /*
755  * Ioctls for all tty devices.  Called after line-discipline specific ioctl
756  * has been called to do discipline-specific functions and/or reject any
757  * of these ioctl commands.
758  */
759 /* ARGSUSED */
760 int
761 ttioctl(struct tty *tp, u_long cmd, void *data, int flag)
762 {
763 	struct thread *td = curthread;
764 	struct lwp *lp = td->td_lwp;
765 	struct proc *p = td->td_proc;
766 	int error;
767 
768 	KKASSERT(p);
769 
770 	/* If the ioctl involves modification, hang if in the background. */
771 	switch (cmd) {
772 	case  TIOCCBRK:
773 	case  TIOCCONS:
774 	case  TIOCDRAIN:
775 	case  TIOCEXCL:
776 	case  TIOCFLUSH:
777 #ifdef TIOCHPCL
778 	case  TIOCHPCL:
779 #endif
780 	case  TIOCNXCL:
781 	case  TIOCSBRK:
782 	case  TIOCSCTTY:
783 	case  TIOCSDRAINWAIT:
784 	case  TIOCSETA:
785 	case  TIOCSETAF:
786 	case  TIOCSETAW:
787 	case  TIOCSETD:
788 	case  TIOCSPGRP:
789 	case  TIOCSTART:
790 	case  TIOCSTAT:
791 	case  TIOCSTI:
792 	case  TIOCSTOP:
793 	case  TIOCSWINSZ:
794 #if defined(COMPAT_43) || defined(COMPAT_SUNOS)
795 	case  TIOCLBIC:
796 	case  TIOCLBIS:
797 	case  TIOCLSET:
798 	case  TIOCSETC:
799 	case OTIOCSETD:
800 	case  TIOCSETN:
801 	case  TIOCSETP:
802 	case  TIOCSLTC:
803 #endif
804 		while (isbackground(p, tp) && !(p->p_flag & P_PPWAIT) &&
805 		    !SIGISMEMBER(p->p_sigignore, SIGTTOU) &&
806 		    !SIGISMEMBER(lp->lwp_sigmask, SIGTTOU)) {
807 			if (p->p_pgrp->pg_jobc == 0)
808 				return (EIO);
809 			pgsignal(p->p_pgrp, SIGTTOU, 1);
810 			error = ttysleep(tp, &lbolt, PCATCH, "ttybg1",
811 					 0);
812 			if (error)
813 				return (error);
814 		}
815 		break;
816 	}
817 
818 	switch (cmd) {			/* Process the ioctl. */
819 	case FIOASYNC:			/* set/clear async i/o */
820 		crit_enter();
821 		if (*(int *)data)
822 			SET(tp->t_state, TS_ASYNC);
823 		else
824 			CLR(tp->t_state, TS_ASYNC);
825 		crit_exit();
826 		break;
827 	case FIONREAD:			/* get # bytes to read */
828 		crit_enter();
829 		*(int *)data = ttnread(tp);
830 		crit_exit();
831 		break;
832 
833 	case FIOSETOWN:
834 		/*
835 		 * Policy -- Don't allow FIOSETOWN on someone else's
836 		 *           controlling tty
837 		 */
838 		if (tp->t_session != NULL && !isctty(p, tp))
839 			return (ENOTTY);
840 
841 		error = fsetown(*(int *)data, &tp->t_sigio);
842 		if (error)
843 			return (error);
844 		break;
845 	case FIOGETOWN:
846 		if (tp->t_session != NULL && !isctty(p, tp))
847 			return (ENOTTY);
848 		*(int *)data = fgetown(tp->t_sigio);
849 		break;
850 
851 	case TIOCEXCL:			/* set exclusive use of tty */
852 		crit_enter();
853 		SET(tp->t_state, TS_XCLUDE);
854 		crit_exit();
855 		break;
856 	case TIOCFLUSH: {		/* flush buffers */
857 		int flags = *(int *)data;
858 
859 		if (flags == 0)
860 			flags = FREAD | FWRITE;
861 		else
862 			flags &= FREAD | FWRITE;
863 		ttyflush(tp, flags);
864 		break;
865 	}
866 	case TIOCCONS:			/* become virtual console */
867 		if (*(int *)data) {
868 			if (constty && constty != tp &&
869 			    ISSET(constty->t_state, TS_CONNECTED))
870 				return (EBUSY);
871 #ifndef	UCONSOLE
872 			if ((error = suser(td)) != 0)
873 				return (error);
874 #endif
875 			constty = tp;
876 		} else if (tp == constty)
877 			constty = NULL;
878 		break;
879 	case TIOCDRAIN:			/* wait till output drained */
880 		error = ttywait(tp);
881 		if (error)
882 			return (error);
883 		break;
884 	case TIOCGETA: {		/* get termios struct */
885 		struct termios *t = (struct termios *)data;
886 
887 		bcopy(&tp->t_termios, t, sizeof(struct termios));
888 		break;
889 	}
890 	case TIOCGETD:			/* get line discipline */
891 		*(int *)data = tp->t_line;
892 		break;
893 	case TIOCGWINSZ:		/* get window size */
894 		*(struct winsize *)data = tp->t_winsize;
895 		break;
896 	case TIOCGPGRP:			/* get pgrp of tty */
897 		if (!isctty(p, tp))
898 			return (ENOTTY);
899 		*(int *)data = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PID;
900 		break;
901 #ifdef TIOCHPCL
902 	case TIOCHPCL:			/* hang up on last close */
903 		crit_enter();
904 		SET(tp->t_cflag, HUPCL);
905 		crit_exit();
906 		break;
907 #endif
908 	case TIOCNXCL:			/* reset exclusive use of tty */
909 		crit_enter();
910 		CLR(tp->t_state, TS_XCLUDE);
911 		crit_exit();
912 		break;
913 	case TIOCOUTQ:			/* output queue size */
914 		*(int *)data = tp->t_outq.c_cc;
915 		break;
916 	case TIOCSETA:			/* set termios struct */
917 	case TIOCSETAW:			/* drain output, set */
918 	case TIOCSETAF: {		/* drn out, fls in, set */
919 		struct termios *t = (struct termios *)data;
920 
921 		if (t->c_ispeed == 0)
922 			t->c_ispeed = t->c_ospeed;
923 		if (t->c_ispeed == 0)
924 			t->c_ispeed = tp->t_ospeed;
925 		if (t->c_ispeed == 0)
926 			return (EINVAL);
927 		crit_enter();
928 		if (cmd == TIOCSETAW || cmd == TIOCSETAF) {
929 			error = ttywait(tp);
930 			if (error) {
931 				crit_exit();
932 				return (error);
933 			}
934 			if (cmd == TIOCSETAF)
935 				ttyflush(tp, FREAD);
936 		}
937 		if (!ISSET(t->c_cflag, CIGNORE)) {
938 			/*
939 			 * Set device hardware.
940 			 */
941 			if (tp->t_param && (error = (*tp->t_param)(tp, t))) {
942 				crit_exit();
943 				return (error);
944 			}
945 			if (ISSET(t->c_cflag, CLOCAL) &&
946 			    !ISSET(tp->t_cflag, CLOCAL)) {
947 				/*
948 				 * XXX disconnections would be too hard to
949 				 * get rid of without this kludge.  The only
950 				 * way to get rid of controlling terminals
951 				 * is to exit from the session leader.
952 				 */
953 				CLR(tp->t_state, TS_ZOMBIE);
954 
955 				wakeup(TSA_CARR_ON(tp));
956 				ttwakeup(tp);
957 				ttwwakeup(tp);
958 			}
959 			if ((ISSET(tp->t_state, TS_CARR_ON) ||
960 			     ISSET(t->c_cflag, CLOCAL)) &&
961 			    !ISSET(tp->t_state, TS_ZOMBIE))
962 				SET(tp->t_state, TS_CONNECTED);
963 			else
964 				CLR(tp->t_state, TS_CONNECTED);
965 			tp->t_cflag = t->c_cflag;
966 			tp->t_ispeed = t->c_ispeed;
967 			if (t->c_ospeed != 0)
968 				tp->t_ospeed = t->c_ospeed;
969 			ttsetwater(tp);
970 		}
971 		if (ISSET(t->c_lflag, ICANON) != ISSET(tp->t_lflag, ICANON) &&
972 		    cmd != TIOCSETAF) {
973 			if (ISSET(t->c_lflag, ICANON))
974 				SET(tp->t_lflag, PENDIN);
975 			else {
976 				/*
977 				 * XXX we really shouldn't allow toggling
978 				 * ICANON while we're in a non-termios line
979 				 * discipline.  Now we have to worry about
980 				 * panicing for a null queue.
981 				 */
982 				if (tp->t_canq.c_cbreserved > 0 &&
983 				    tp->t_rawq.c_cbreserved > 0) {
984 					catq(&tp->t_rawq, &tp->t_canq);
985 					/*
986 					 * XXX the queue limits may be
987 					 * different, so the old queue
988 					 * swapping method no longer works.
989 					 */
990 					catq(&tp->t_canq, &tp->t_rawq);
991 				}
992 				CLR(tp->t_lflag, PENDIN);
993 			}
994 			ttwakeup(tp);
995 		}
996 		tp->t_iflag = t->c_iflag;
997 		tp->t_oflag = t->c_oflag;
998 		/*
999 		 * Make the EXTPROC bit read only.
1000 		 */
1001 		if (ISSET(tp->t_lflag, EXTPROC))
1002 			SET(t->c_lflag, EXTPROC);
1003 		else
1004 			CLR(t->c_lflag, EXTPROC);
1005 		tp->t_lflag = t->c_lflag | ISSET(tp->t_lflag, PENDIN);
1006 		if (t->c_cc[VMIN] != tp->t_cc[VMIN] ||
1007 		    t->c_cc[VTIME] != tp->t_cc[VTIME])
1008 			ttwakeup(tp);
1009 		bcopy(t->c_cc, tp->t_cc, sizeof(t->c_cc));
1010 		crit_exit();
1011 		break;
1012 	}
1013 	case TIOCSETD: {		/* set line discipline */
1014 		int t = *(int *)data;
1015 		cdev_t device = tp->t_dev;
1016 
1017 		if ((u_int)t >= nlinesw)
1018 			return (ENXIO);
1019 		if (t != tp->t_line) {
1020 			crit_enter();
1021 			(*linesw[tp->t_line].l_close)(tp, flag);
1022 			error = (*linesw[t].l_open)(device, tp);
1023 			if (error) {
1024 				(void)(*linesw[tp->t_line].l_open)(device, tp);
1025 				crit_exit();
1026 				return (error);
1027 			}
1028 			tp->t_line = t;
1029 			crit_exit();
1030 		}
1031 		break;
1032 	}
1033 	case TIOCSTART:			/* start output, like ^Q */
1034 		crit_enter();
1035 		if (ISSET(tp->t_state, TS_TTSTOP) ||
1036 		    ISSET(tp->t_lflag, FLUSHO)) {
1037 			CLR(tp->t_lflag, FLUSHO);
1038 			CLR(tp->t_state, TS_TTSTOP);
1039 			ttstart(tp);
1040 		}
1041 		crit_exit();
1042 		break;
1043 	case TIOCSTI:			/* simulate terminal input */
1044 		if ((flag & FREAD) == 0 && suser(td))
1045 			return (EPERM);
1046 		if (!isctty(p, tp) && suser(td))
1047 			return (EACCES);
1048 		crit_enter();
1049 		(*linesw[tp->t_line].l_rint)(*(u_char *)data, tp);
1050 		crit_exit();
1051 		break;
1052 	case TIOCSTOP:			/* stop output, like ^S */
1053 		crit_enter();
1054 		if (!ISSET(tp->t_state, TS_TTSTOP)) {
1055 			SET(tp->t_state, TS_TTSTOP);
1056 			(*tp->t_stop)(tp, 0);
1057 		}
1058 		crit_exit();
1059 		break;
1060 	case TIOCSCTTY:			/* become controlling tty */
1061 		/* Session ctty vnode pointer set in vnode layer. */
1062 		if (!SESS_LEADER(p) ||
1063 		    ((p->p_session->s_ttyvp || tp->t_session) &&
1064 		    (tp->t_session != p->p_session)))
1065 			return (EPERM);
1066 		tp->t_session = p->p_session;
1067 		tp->t_pgrp = p->p_pgrp;
1068 		p->p_session->s_ttyp = tp;
1069 		p->p_flag |= P_CONTROLT;
1070 		break;
1071 	case TIOCSPGRP: {		/* set pgrp of tty */
1072 		struct pgrp *pgrp = pgfind(*(int *)data);
1073 
1074 		if (!isctty(p, tp))
1075 			return (ENOTTY);
1076 		else if (pgrp == NULL || pgrp->pg_session != p->p_session)
1077 			return (EPERM);
1078 		tp->t_pgrp = pgrp;
1079 		break;
1080 	}
1081 	case TIOCSTAT:			/* simulate control-T */
1082 		crit_enter();
1083 		ttyinfo(tp);
1084 		crit_exit();
1085 		break;
1086 	case TIOCSWINSZ:		/* set window size */
1087 		if (bcmp((caddr_t)&tp->t_winsize, data,
1088 		    sizeof (struct winsize))) {
1089 			tp->t_winsize = *(struct winsize *)data;
1090 			pgsignal(tp->t_pgrp, SIGWINCH, 1);
1091 		}
1092 		break;
1093 	case TIOCSDRAINWAIT:
1094 		error = suser(td);
1095 		if (error)
1096 			return (error);
1097 		tp->t_timeout = *(int *)data * hz;
1098 		wakeup(TSA_OCOMPLETE(tp));
1099 		wakeup(TSA_OLOWAT(tp));
1100 		break;
1101 	case TIOCGDRAINWAIT:
1102 		*(int *)data = tp->t_timeout / hz;
1103 		break;
1104 	default:
1105 #if defined(COMPAT_43) || defined(COMPAT_SUNOS)
1106 		return (ttcompat(tp, cmd, data, flag));
1107 #else
1108 		return (ENOIOCTL);
1109 #endif
1110 	}
1111 	return (0);
1112 }
1113 
1114 int
1115 ttypoll(struct dev_poll_args *ap)
1116 {
1117 	cdev_t dev = ap->a_head.a_dev;
1118 	int events = ap->a_events;
1119 	int revents = 0;
1120 	struct tty *tp;
1121 
1122 	tp = dev->si_tty;
1123 	/* XXX used to return ENXIO, but that means true! */
1124 	if (tp == NULL) {
1125 		ap->a_events = (events & (POLLIN | POLLOUT | POLLRDNORM |
1126 				POLLWRNORM)) | POLLHUP;
1127 		return(0);
1128 	}
1129 
1130 	crit_enter();
1131 	if (events & (POLLIN | POLLRDNORM)) {
1132 		if (ttnread(tp) > 0 || ISSET(tp->t_state, TS_ZOMBIE))
1133 			revents |= events & (POLLIN | POLLRDNORM);
1134 		else
1135 			selrecord(curthread, &tp->t_rsel);
1136 	}
1137 	if (events & (POLLOUT | POLLWRNORM)) {
1138 		if ((tp->t_outq.c_cc <= tp->t_olowat &&
1139 		     ISSET(tp->t_state, TS_CONNECTED))
1140 		    || ISSET(tp->t_state, TS_ZOMBIE))
1141 			revents |= events & (POLLOUT | POLLWRNORM);
1142 		else
1143 			selrecord(curthread, &tp->t_wsel);
1144 	}
1145 	crit_exit();
1146 	ap->a_events = revents;
1147 	return (0);
1148 }
1149 
1150 static struct filterops ttyread_filtops =
1151 	{ 1, NULL, filt_ttyrdetach, filt_ttyread };
1152 static struct filterops ttywrite_filtops =
1153 	{ 1, NULL, filt_ttywdetach, filt_ttywrite };
1154 
1155 int
1156 ttykqfilter(struct dev_kqfilter_args *ap)
1157 {
1158 	cdev_t dev = ap->a_head.a_dev;
1159 	struct knote *kn = ap->a_kn;
1160 	struct tty *tp = dev->si_tty;
1161 	struct klist *klist;
1162 
1163 	ap->a_result = 0;
1164 	switch (kn->kn_filter) {
1165 	case EVFILT_READ:
1166 		klist = &tp->t_rsel.si_note;
1167 		kn->kn_fop = &ttyread_filtops;
1168 		break;
1169 	case EVFILT_WRITE:
1170 		klist = &tp->t_wsel.si_note;
1171 		kn->kn_fop = &ttywrite_filtops;
1172 		break;
1173 	default:
1174 		ap->a_result = 1;
1175 		return (0);
1176 	}
1177 
1178 	kn->kn_hook = (caddr_t)dev;
1179 
1180 	crit_enter();
1181 	SLIST_INSERT_HEAD(klist, kn, kn_selnext);
1182 	crit_exit();
1183 
1184 	return (0);
1185 }
1186 
1187 static void
1188 filt_ttyrdetach(struct knote *kn)
1189 {
1190 	struct tty *tp = ((cdev_t)kn->kn_hook)->si_tty;
1191 
1192 	crit_enter();
1193 	SLIST_REMOVE(&tp->t_rsel.si_note, kn, knote, kn_selnext);
1194 	crit_exit();
1195 }
1196 
1197 static int
1198 filt_ttyread(struct knote *kn, long hint)
1199 {
1200 	struct tty *tp = ((cdev_t)kn->kn_hook)->si_tty;
1201 
1202 	kn->kn_data = ttnread(tp);
1203 	if (ISSET(tp->t_state, TS_ZOMBIE)) {
1204 		kn->kn_flags |= EV_EOF;
1205 		return (1);
1206 	}
1207 	return (kn->kn_data > 0);
1208 }
1209 
1210 static void
1211 filt_ttywdetach(struct knote *kn)
1212 {
1213 	struct tty *tp = ((cdev_t)kn->kn_hook)->si_tty;
1214 
1215 	crit_enter();
1216 	SLIST_REMOVE(&tp->t_wsel.si_note, kn, knote, kn_selnext);
1217 	crit_exit();
1218 }
1219 
1220 static int
1221 filt_ttywrite(struct knote *kn, long hint)
1222 {
1223 	struct tty *tp = ((cdev_t)kn->kn_hook)->si_tty;
1224 
1225 	kn->kn_data = tp->t_outq.c_cc;
1226 	if (ISSET(tp->t_state, TS_ZOMBIE))
1227 		return (1);
1228 	return (kn->kn_data <= tp->t_olowat &&
1229 	    ISSET(tp->t_state, TS_CONNECTED));
1230 }
1231 
1232 /*
1233  * Must be called while in a critical section.
1234  */
1235 static int
1236 ttnread(struct tty *tp)
1237 {
1238 	int nread;
1239 
1240 	if (ISSET(tp->t_lflag, PENDIN))
1241 		ttypend(tp);
1242 	nread = tp->t_canq.c_cc;
1243 	if (!ISSET(tp->t_lflag, ICANON)) {
1244 		nread += tp->t_rawq.c_cc;
1245 		if (nread < tp->t_cc[VMIN] && tp->t_cc[VTIME] == 0)
1246 			nread = 0;
1247 	}
1248 	return (nread);
1249 }
1250 
1251 /*
1252  * Wait for output to drain.
1253  */
1254 int
1255 ttywait(struct tty *tp)
1256 {
1257 	int error;
1258 
1259 	error = 0;
1260 	crit_enter();
1261 	while ((tp->t_outq.c_cc || ISSET(tp->t_state, TS_BUSY)) &&
1262 	       ISSET(tp->t_state, TS_CONNECTED) && tp->t_oproc) {
1263 		(*tp->t_oproc)(tp);
1264 		if ((tp->t_outq.c_cc || ISSET(tp->t_state, TS_BUSY)) &&
1265 		    ISSET(tp->t_state, TS_CONNECTED)) {
1266 			SET(tp->t_state, TS_SO_OCOMPLETE);
1267 			error = ttysleep(tp, TSA_OCOMPLETE(tp),
1268 					 PCATCH, "ttywai",
1269 					 tp->t_timeout);
1270 			if (error) {
1271 				if (error == EWOULDBLOCK)
1272 					error = EIO;
1273 				break;
1274 			}
1275 		} else
1276 			break;
1277 	}
1278 	if (!error && (tp->t_outq.c_cc || ISSET(tp->t_state, TS_BUSY)))
1279 		error = EIO;
1280 	crit_exit();
1281 	return (error);
1282 }
1283 
1284 /*
1285  * Flush if successfully wait.
1286  */
1287 static int
1288 ttywflush(struct tty *tp)
1289 {
1290 	int error;
1291 
1292 	if ((error = ttywait(tp)) == 0)
1293 		ttyflush(tp, FREAD);
1294 	return (error);
1295 }
1296 
1297 /*
1298  * Flush tty read and/or write queues, notifying anyone waiting.
1299  */
1300 void
1301 ttyflush(struct tty *tp, int rw)
1302 {
1303 	crit_enter();
1304 #if 0
1305 again:
1306 #endif
1307 	if (rw & FWRITE) {
1308 		FLUSHQ(&tp->t_outq);
1309 		CLR(tp->t_state, TS_TTSTOP);
1310 	}
1311 	(*tp->t_stop)(tp, rw);
1312 	if (rw & FREAD) {
1313 		FLUSHQ(&tp->t_canq);
1314 		FLUSHQ(&tp->t_rawq);
1315 		CLR(tp->t_lflag, PENDIN);
1316 		tp->t_rocount = 0;
1317 		tp->t_rocol = 0;
1318 		CLR(tp->t_state, TS_LOCAL);
1319 		ttwakeup(tp);
1320 		if (ISSET(tp->t_state, TS_TBLOCK)) {
1321 			if (rw & FWRITE)
1322 				FLUSHQ(&tp->t_outq);
1323 			ttyunblock(tp);
1324 
1325 			/*
1326 			 * Don't let leave any state that might clobber the
1327 			 * next line discipline (although we should do more
1328 			 * to send the START char).  Not clearing the state
1329 			 * may have caused the "putc to a clist with no
1330 			 * reserved cblocks" panic/kprintf.
1331 			 */
1332 			CLR(tp->t_state, TS_TBLOCK);
1333 
1334 #if 0 /* forget it, sleeping isn't always safe and we don't know when it is */
1335 			if (ISSET(tp->t_iflag, IXOFF)) {
1336 				/*
1337 				 * XXX wait a bit in the hope that the stop
1338 				 * character (if any) will go out.  Waiting
1339 				 * isn't good since it allows races.  This
1340 				 * will be fixed when the stop character is
1341 				 * put in a special queue.  Don't bother with
1342 				 * the checks in ttywait() since the timeout
1343 				 * will save us.
1344 				 */
1345 				SET(tp->t_state, TS_SO_OCOMPLETE);
1346 				ttysleep(tp, TSA_OCOMPLETE(tp), 0,
1347 					 "ttyfls", hz / 10);
1348 				/*
1349 				 * Don't try sending the stop character again.
1350 				 */
1351 				CLR(tp->t_state, TS_TBLOCK);
1352 				goto again;
1353 			}
1354 #endif
1355 		}
1356 	}
1357 	if (rw & FWRITE) {
1358 		FLUSHQ(&tp->t_outq);
1359 		ttwwakeup(tp);
1360 	}
1361 	crit_exit();
1362 }
1363 
1364 /*
1365  * Copy in the default termios characters.
1366  */
1367 void
1368 termioschars(struct termios *t)
1369 {
1370 
1371 	bcopy(ttydefchars, t->c_cc, sizeof t->c_cc);
1372 }
1373 
1374 /*
1375  * Old interface.
1376  */
1377 void
1378 ttychars(struct tty *tp)
1379 {
1380 
1381 	termioschars(&tp->t_termios);
1382 }
1383 
1384 /*
1385  * Handle input high water.  Send stop character for the IXOFF case.  Turn
1386  * on our input flow control bit and propagate the changes to the driver.
1387  * XXX the stop character should be put in a special high priority queue.
1388  */
1389 void
1390 ttyblock(struct tty *tp)
1391 {
1392 
1393 	SET(tp->t_state, TS_TBLOCK);
1394 	if (ISSET(tp->t_iflag, IXOFF) && tp->t_cc[VSTOP] != _POSIX_VDISABLE &&
1395 	    clist_putc(tp->t_cc[VSTOP], &tp->t_outq) != 0)
1396 		CLR(tp->t_state, TS_TBLOCK);	/* try again later */
1397 	ttstart(tp);
1398 }
1399 
1400 /*
1401  * Handle input low water.  Send start character for the IXOFF case.  Turn
1402  * off our input flow control bit and propagate the changes to the driver.
1403  * XXX the start character should be put in a special high priority queue.
1404  */
1405 static void
1406 ttyunblock(struct tty *tp)
1407 {
1408 
1409 	CLR(tp->t_state, TS_TBLOCK);
1410 	if (ISSET(tp->t_iflag, IXOFF) && tp->t_cc[VSTART] != _POSIX_VDISABLE &&
1411 	    clist_putc(tp->t_cc[VSTART], &tp->t_outq) != 0)
1412 		SET(tp->t_state, TS_TBLOCK);	/* try again later */
1413 	ttstart(tp);
1414 }
1415 
1416 #ifdef notyet
1417 /* Not used by any current (i386) drivers. */
1418 /*
1419  * Restart after an inter-char delay.
1420  */
1421 void
1422 ttrstrt(void *tp_arg)
1423 {
1424 	struct tty *tp;
1425 
1426 	KASSERT(tp_arg != NULL, ("ttrstrt"));
1427 
1428 	tp = tp_arg;
1429 	crit_enter();
1430 	CLR(tp->t_state, TS_TIMEOUT);
1431 	ttstart(tp);
1432 	crit_exit();
1433 }
1434 #endif
1435 
1436 int
1437 ttstart(struct tty *tp)
1438 {
1439 
1440 	if (tp->t_oproc != NULL)	/* XXX: Kludge for pty. */
1441 		(*tp->t_oproc)(tp);
1442 	return (0);
1443 }
1444 
1445 /*
1446  * "close" a line discipline
1447  */
1448 int
1449 ttylclose(struct tty *tp, int flag)
1450 {
1451 
1452 	if (flag & FNONBLOCK || ttywflush(tp))
1453 		ttyflush(tp, FREAD | FWRITE);
1454 	return (0);
1455 }
1456 
1457 /*
1458  * Handle modem control transition on a tty.
1459  * Flag indicates new state of carrier.
1460  * Returns 0 if the line should be turned off, otherwise 1.
1461  */
1462 int
1463 ttymodem(struct tty *tp, int flag)
1464 {
1465 
1466 	if (ISSET(tp->t_state, TS_CARR_ON) && ISSET(tp->t_cflag, MDMBUF)) {
1467 		/*
1468 		 * MDMBUF: do flow control according to carrier flag
1469 		 * XXX TS_CAR_OFLOW doesn't do anything yet.  TS_TTSTOP
1470 		 * works if IXON and IXANY are clear.
1471 		 */
1472 		if (flag) {
1473 			CLR(tp->t_state, TS_CAR_OFLOW);
1474 			CLR(tp->t_state, TS_TTSTOP);
1475 			ttstart(tp);
1476 		} else if (!ISSET(tp->t_state, TS_CAR_OFLOW)) {
1477 			SET(tp->t_state, TS_CAR_OFLOW);
1478 			SET(tp->t_state, TS_TTSTOP);
1479 			(*tp->t_stop)(tp, 0);
1480 		}
1481 	} else if (flag == 0) {
1482 		/*
1483 		 * Lost carrier.
1484 		 */
1485 		CLR(tp->t_state, TS_CARR_ON);
1486 		if (ISSET(tp->t_state, TS_ISOPEN) &&
1487 		    !ISSET(tp->t_cflag, CLOCAL)) {
1488 			SET(tp->t_state, TS_ZOMBIE);
1489 			CLR(tp->t_state, TS_CONNECTED);
1490 			if (tp->t_session && tp->t_session->s_leader)
1491 				ksignal(tp->t_session->s_leader, SIGHUP);
1492 			ttyflush(tp, FREAD | FWRITE);
1493 			return (0);
1494 		}
1495 	} else {
1496 		/*
1497 		 * Carrier now on.
1498 		 */
1499 		SET(tp->t_state, TS_CARR_ON);
1500 		if (!ISSET(tp->t_state, TS_ZOMBIE))
1501 			SET(tp->t_state, TS_CONNECTED);
1502 		wakeup(TSA_CARR_ON(tp));
1503 		ttwakeup(tp);
1504 		ttwwakeup(tp);
1505 	}
1506 	return (1);
1507 }
1508 
1509 /*
1510  * Reinput pending characters after state switch
1511  * call from a critical section.
1512  */
1513 static void
1514 ttypend(struct tty *tp)
1515 {
1516 	struct clist tq;
1517 	int c;
1518 
1519 	CLR(tp->t_lflag, PENDIN);
1520 	SET(tp->t_state, TS_TYPEN);
1521 	/*
1522 	 * XXX this assumes too much about clist internals.  It may even
1523 	 * fail if the cblock slush pool is empty.  We can't allocate more
1524 	 * cblocks here because we are called from an interrupt handler
1525 	 * and clist_alloc_cblocks() can wait.
1526 	 */
1527 	tq = tp->t_rawq;
1528 	bzero(&tp->t_rawq, sizeof tp->t_rawq);
1529 	tp->t_rawq.c_cbmax = tq.c_cbmax;
1530 	tp->t_rawq.c_cbreserved = tq.c_cbreserved;
1531 	while ((c = clist_getc(&tq)) >= 0)
1532 		ttyinput(c, tp);
1533 	CLR(tp->t_state, TS_TYPEN);
1534 }
1535 
1536 /*
1537  * Process a read call on a tty device.
1538  */
1539 int
1540 ttread(struct tty *tp, struct uio *uio, int flag)
1541 {
1542 	struct clist *qp;
1543 	int c;
1544 	tcflag_t lflag;
1545 	cc_t *cc = tp->t_cc;
1546 	struct proc *pp;
1547 	struct lwp *lp;
1548 	int first, error = 0;
1549 	int has_stime = 0, last_cc = 0;
1550 	long slp = 0;		/* XXX this should be renamed `timo'. */
1551 	struct timeval stime;
1552 
1553 	lp = curthread->td_lwp;
1554 
1555 loop:
1556 	crit_enter();
1557 	lflag = tp->t_lflag;
1558 	/*
1559 	 * take pending input first
1560 	 */
1561 	if (ISSET(lflag, PENDIN)) {
1562 		ttypend(tp);
1563 		splz();		/* reduce latency */
1564 		lflag = tp->t_lflag;	/* XXX ttypend() clobbers it */
1565 	}
1566 
1567 	/*
1568 	 * Hang process if it's in the background.
1569 	 */
1570 	if ((pp = curproc) && isbackground(pp, tp)) {
1571 		crit_exit();
1572 		if (SIGISMEMBER(pp->p_sigignore, SIGTTIN) ||
1573 		    SIGISMEMBER(lp->lwp_sigmask, SIGTTIN) ||
1574 		    (pp->p_flag & P_PPWAIT) || pp->p_pgrp->pg_jobc == 0)
1575 			return (EIO);
1576 		pgsignal(pp->p_pgrp, SIGTTIN, 1);
1577 		error = ttysleep(tp, &lbolt, PCATCH, "ttybg2", 0);
1578 		if (error)
1579 			return (error);
1580 		goto loop;
1581 	}
1582 
1583 	if (ISSET(tp->t_state, TS_ZOMBIE)) {
1584 		crit_exit();
1585 		return (0);	/* EOF */
1586 	}
1587 
1588 	/*
1589 	 * If canonical, use the canonical queue,
1590 	 * else use the raw queue.
1591 	 *
1592 	 * (should get rid of clists...)
1593 	 */
1594 	qp = ISSET(lflag, ICANON) ? &tp->t_canq : &tp->t_rawq;
1595 
1596 	if (flag & IO_NDELAY) {
1597 		if (qp->c_cc > 0)
1598 			goto read;
1599 		if (!ISSET(lflag, ICANON) && cc[VMIN] == 0) {
1600 			crit_exit();
1601 			return (0);
1602 		}
1603 		crit_exit();
1604 		return (EWOULDBLOCK);
1605 	}
1606 	if (!ISSET(lflag, ICANON)) {
1607 		int m = cc[VMIN];
1608 		long t = cc[VTIME];
1609 		struct timeval timecopy;
1610 
1611 		/*
1612 		 * Check each of the four combinations.
1613 		 * (m > 0 && t == 0) is the normal read case.
1614 		 * It should be fairly efficient, so we check that and its
1615 		 * companion case (m == 0 && t == 0) first.
1616 		 * For the other two cases, we compute the target sleep time
1617 		 * into slp.
1618 		 */
1619 		if (t == 0) {
1620 			if (qp->c_cc < m)
1621 				goto sleep;
1622 			if (qp->c_cc > 0)
1623 				goto read;
1624 
1625 			/* m, t and qp->c_cc are all 0.  0 is enough input. */
1626 			crit_exit();
1627 			return (0);
1628 		}
1629 		t *= 100000;		/* time in us */
1630 #define diff(t1, t2) (((t1).tv_sec - (t2).tv_sec) * 1000000 + \
1631 			 ((t1).tv_usec - (t2).tv_usec))
1632 		if (m > 0) {
1633 			if (qp->c_cc <= 0)
1634 				goto sleep;
1635 			if (qp->c_cc >= m)
1636 				goto read;
1637 			getmicrotime(&timecopy);
1638 			if (!has_stime) {
1639 				/* first character, start timer */
1640 				has_stime = 1;
1641 				stime = timecopy;
1642 				slp = t;
1643 			} else if (qp->c_cc > last_cc) {
1644 				/* got a character, restart timer */
1645 				stime = timecopy;
1646 				slp = t;
1647 			} else {
1648 				/* nothing, check expiration */
1649 				slp = t - diff(timecopy, stime);
1650 				if (slp <= 0)
1651 					goto read;
1652 			}
1653 			last_cc = qp->c_cc;
1654 		} else {	/* m == 0 */
1655 			if (qp->c_cc > 0)
1656 				goto read;
1657 			getmicrotime(&timecopy);
1658 			if (!has_stime) {
1659 				has_stime = 1;
1660 				stime = timecopy;
1661 				slp = t;
1662 			} else {
1663 				slp = t - diff(timecopy, stime);
1664 				if (slp <= 0) {
1665 					/* Timed out, but 0 is enough input. */
1666 					crit_exit();
1667 					return (0);
1668 				}
1669 			}
1670 		}
1671 #undef diff
1672 		/*
1673 		 * Rounding down may make us wake up just short
1674 		 * of the target, so we round up.
1675 		 * The formula is ceiling(slp * hz/1000000).
1676 		 * 32-bit arithmetic is enough for hz < 169.
1677 		 * XXX see tvtohz() for how to avoid overflow if hz
1678 		 * is large (divide by `tick' and/or arrange to
1679 		 * use tvtohz() if hz is large).
1680 		 */
1681 		slp = (long) (((u_long)slp * hz) + 999999) / 1000000;
1682 		goto sleep;
1683 	}
1684 	if (qp->c_cc <= 0) {
1685 sleep:
1686 		/*
1687 		 * There is no input, or not enough input and we can block.
1688 		 */
1689 		error = ttysleep(tp, TSA_HUP_OR_INPUT(tp), PCATCH,
1690 				 ISSET(tp->t_state, TS_CONNECTED) ?
1691 				 "ttyin" : "ttyhup", (int)slp);
1692 		crit_exit();
1693 		if (error == EWOULDBLOCK)
1694 			error = 0;
1695 		else if (error)
1696 			return (error);
1697 		/*
1698 		 * XXX what happens if another process eats some input
1699 		 * while we are asleep (not just here)?  It would be
1700 		 * safest to detect changes and reset our state variables
1701 		 * (has_stime and last_cc).
1702 		 */
1703 		slp = 0;
1704 		goto loop;
1705 	}
1706 read:
1707 	crit_exit();
1708 	/*
1709 	 * Input present, check for input mapping and processing.
1710 	 */
1711 	first = 1;
1712 	if (ISSET(lflag, ICANON | ISIG))
1713 		goto slowcase;
1714 	for (;;) {
1715 		char ibuf[IBUFSIZ];
1716 		int icc;
1717 
1718 		icc = imin(uio->uio_resid, IBUFSIZ);
1719 		icc = q_to_b(qp, ibuf, icc);
1720 		if (icc <= 0) {
1721 			if (first)
1722 				goto loop;
1723 			break;
1724 		}
1725 		error = uiomove(ibuf, icc, uio);
1726 		/*
1727 		 * XXX if there was an error then we should ungetc() the
1728 		 * unmoved chars and reduce icc here.
1729 		 */
1730 		if (error)
1731 			break;
1732  		if (uio->uio_resid == 0)
1733 			break;
1734 		first = 0;
1735 	}
1736 	goto out;
1737 slowcase:
1738 	for (;;) {
1739 		c = clist_getc(qp);
1740 		if (c < 0) {
1741 			if (first)
1742 				goto loop;
1743 			break;
1744 		}
1745 		/*
1746 		 * delayed suspend (^Y)
1747 		 */
1748 		if (CCEQ(cc[VDSUSP], c) &&
1749 		    ISSET(lflag, IEXTEN | ISIG) == (IEXTEN | ISIG)) {
1750 			pgsignal(tp->t_pgrp, SIGTSTP, 1);
1751 			if (first) {
1752 				error = ttysleep(tp, &lbolt, PCATCH,
1753 						 "ttybg3", 0);
1754 				if (error)
1755 					break;
1756 				goto loop;
1757 			}
1758 			break;
1759 		}
1760 		/*
1761 		 * Interpret EOF only in canonical mode.
1762 		 */
1763 		if (CCEQ(cc[VEOF], c) && ISSET(lflag, ICANON))
1764 			break;
1765 		/*
1766 		 * Give user character.
1767 		 */
1768  		error = ureadc(c, uio);
1769 		if (error)
1770 			/* XXX should ungetc(c, qp). */
1771 			break;
1772  		if (uio->uio_resid == 0)
1773 			break;
1774 		/*
1775 		 * In canonical mode check for a "break character"
1776 		 * marking the end of a "line of input".
1777 		 */
1778 		if (ISSET(lflag, ICANON) && TTBREAKC(c, lflag))
1779 			break;
1780 		first = 0;
1781 	}
1782 
1783 out:
1784 	/*
1785 	 * Look to unblock input now that (presumably)
1786 	 * the input queue has gone down.
1787 	 */
1788 	crit_enter();
1789 	if (ISSET(tp->t_state, TS_TBLOCK) &&
1790 	    tp->t_rawq.c_cc + tp->t_canq.c_cc <= tp->t_ilowat)
1791 		ttyunblock(tp);
1792 	crit_exit();
1793 
1794 	return (error);
1795 }
1796 
1797 /*
1798  * Check the output queue on tp for space for a kernel message (from uprintf
1799  * or tprintf).  Allow some space over the normal hiwater mark so we don't
1800  * lose messages due to normal flow control, but don't let the tty run amok.
1801  * Sleeps here are not interruptible, but we return prematurely if new signals
1802  * arrive.
1803  */
1804 int
1805 ttycheckoutq(struct tty *tp, int wait)
1806 {
1807 	struct lwp *lp = curthread->td_lwp;
1808 	int hiwat;
1809 	sigset_t oldset, newset;
1810 
1811 	hiwat = tp->t_ohiwat;
1812 	SIGEMPTYSET(oldset);
1813 	SIGEMPTYSET(newset);
1814 	crit_enter();
1815 	if (wait)
1816 		oldset = lwp_sigpend(lp);
1817 	if (tp->t_outq.c_cc > hiwat + OBUFSIZ + 100) {
1818 		while (tp->t_outq.c_cc > hiwat) {
1819 			ttstart(tp);
1820 			if (tp->t_outq.c_cc <= hiwat)
1821 				break;
1822 			if (wait)
1823 				newset = lwp_sigpend(lp);
1824 			if (!wait || SIGSETNEQ(oldset, newset)) {
1825 				crit_exit();
1826 				return (0);
1827 			}
1828 			SET(tp->t_state, TS_SO_OLOWAT);
1829 			tsleep(TSA_OLOWAT(tp), 0, "ttoutq", hz);
1830 		}
1831 	}
1832 	crit_exit();
1833 	return (1);
1834 }
1835 
1836 /*
1837  * Process a write call on a tty device.
1838  */
1839 int
1840 ttwrite(struct tty *tp, struct uio *uio, int flag)
1841 {
1842 	char *cp = NULL;
1843 	int cc, ce;
1844 	struct proc *pp;
1845 	struct lwp *lp;
1846 	int i, hiwat, cnt, error;
1847 	char obuf[OBUFSIZ];
1848 
1849 	lp = curthread->td_lwp;
1850 	hiwat = tp->t_ohiwat;
1851 	cnt = uio->uio_resid;
1852 	error = 0;
1853 	cc = 0;
1854 loop:
1855 	crit_enter();
1856 	if (ISSET(tp->t_state, TS_ZOMBIE)) {
1857 		crit_exit();
1858 		if (uio->uio_resid == cnt)
1859 			error = EIO;
1860 		goto out;
1861 	}
1862 	if (!ISSET(tp->t_state, TS_CONNECTED)) {
1863 		if (flag & IO_NDELAY) {
1864 			crit_exit();
1865 			error = EWOULDBLOCK;
1866 			goto out;
1867 		}
1868 		error = ttysleep(tp, TSA_CARR_ON(tp), PCATCH, "ttydcd", 0);
1869 		crit_exit();
1870 		if (error)
1871 			goto out;
1872 		goto loop;
1873 	}
1874 	crit_exit();
1875 
1876 	/*
1877 	 * Hang the process if it's in the background.
1878 	 */
1879 	if ((pp = curproc) && isbackground(pp, tp) &&
1880 	    ISSET(tp->t_lflag, TOSTOP) && !(pp->p_flag & P_PPWAIT) &&
1881 	    !SIGISMEMBER(pp->p_sigignore, SIGTTOU) &&
1882 	    !SIGISMEMBER(lp->lwp_sigmask, SIGTTOU)) {
1883 		if (pp->p_pgrp->pg_jobc == 0) {
1884 			error = EIO;
1885 			goto out;
1886 		}
1887 		pgsignal(pp->p_pgrp, SIGTTOU, 1);
1888 		error = ttysleep(tp, &lbolt, PCATCH, "ttybg4", 0);
1889 		if (error)
1890 			goto out;
1891 		goto loop;
1892 	}
1893 	/*
1894 	 * Process the user's data in at most OBUFSIZ chunks.  Perform any
1895 	 * output translation.  Keep track of high water mark, sleep on
1896 	 * overflow awaiting device aid in acquiring new space.
1897 	 */
1898 	while (uio->uio_resid > 0 || cc > 0) {
1899 		if (ISSET(tp->t_lflag, FLUSHO)) {
1900 			uio->uio_resid = 0;
1901 			return (0);
1902 		}
1903 		if (tp->t_outq.c_cc > hiwat)
1904 			goto ovhiwat;
1905 		/*
1906 		 * Grab a hunk of data from the user, unless we have some
1907 		 * leftover from last time.
1908 		 */
1909 		if (cc == 0) {
1910 			cc = imin(uio->uio_resid, OBUFSIZ);
1911 			cp = obuf;
1912 			error = uiomove(cp, cc, uio);
1913 			if (error) {
1914 				cc = 0;
1915 				break;
1916 			}
1917 		}
1918 		/*
1919 		 * If nothing fancy need be done, grab those characters we
1920 		 * can handle without any of ttyoutput's processing and
1921 		 * just transfer them to the output q.  For those chars
1922 		 * which require special processing (as indicated by the
1923 		 * bits in char_type), call ttyoutput.  After processing
1924 		 * a hunk of data, look for FLUSHO so ^O's will take effect
1925 		 * immediately.
1926 		 */
1927 		while (cc > 0) {
1928 			if (!ISSET(tp->t_oflag, OPOST))
1929 				ce = cc;
1930 			else {
1931 				ce = cc - scanc((u_int)cc, (u_char *)cp,
1932 						char_type, CCLASSMASK);
1933 				/*
1934 				 * If ce is zero, then we're processing
1935 				 * a special character through ttyoutput.
1936 				 */
1937 				if (ce == 0) {
1938 					tp->t_rocount = 0;
1939 					if (ttyoutput(*cp, tp) >= 0) {
1940 						/* No Clists, wait a bit. */
1941 						ttstart(tp);
1942 						if (flag & IO_NDELAY) {
1943 							error = EWOULDBLOCK;
1944 							goto out;
1945 						}
1946 						error = ttysleep(tp, &lbolt,
1947 								 PCATCH,
1948 								 "ttybf1", 0);
1949 						if (error)
1950 							goto out;
1951 						goto loop;
1952 					}
1953 					cp++;
1954 					cc--;
1955 					if (ISSET(tp->t_lflag, FLUSHO) ||
1956 					    tp->t_outq.c_cc > hiwat)
1957 						goto ovhiwat;
1958 					continue;
1959 				}
1960 			}
1961 			/*
1962 			 * A bunch of normal characters have been found.
1963 			 * Transfer them en masse to the output queue and
1964 			 * continue processing at the top of the loop.
1965 			 * If there are any further characters in this
1966 			 * <= OBUFSIZ chunk, the first should be a character
1967 			 * requiring special handling by ttyoutput.
1968 			 */
1969 			tp->t_rocount = 0;
1970 			i = b_to_q(cp, ce, &tp->t_outq);
1971 			ce -= i;
1972 			tp->t_column += ce;
1973 			cp += ce, cc -= ce, tk_nout += ce;
1974 			tp->t_outcc += ce;
1975 			if (i > 0) {
1976 				/* No Clists, wait a bit. */
1977 				ttstart(tp);
1978 				if (flag & IO_NDELAY) {
1979 					error = EWOULDBLOCK;
1980 					goto out;
1981 				}
1982 				error = ttysleep(tp, &lbolt, PCATCH,
1983 						 "ttybf2", 0);
1984 				if (error)
1985 					goto out;
1986 				goto loop;
1987 			}
1988 			if (ISSET(tp->t_lflag, FLUSHO) ||
1989 			    tp->t_outq.c_cc > hiwat)
1990 				break;
1991 		}
1992 		ttstart(tp);
1993 	}
1994 out:
1995 	/*
1996 	 * If cc is nonzero, we leave the uio structure inconsistent, as the
1997 	 * offset and iov pointers have moved forward, but it doesn't matter
1998 	 * (the call will either return short or restart with a new uio).
1999 	 */
2000 	uio->uio_resid += cc;
2001 	return (error);
2002 
2003 ovhiwat:
2004 	ttstart(tp);
2005 	crit_enter();
2006 	/*
2007 	 * This can only occur if FLUSHO is set in t_lflag,
2008 	 * or if ttstart/oproc is synchronous (or very fast).
2009 	 */
2010 	if (tp->t_outq.c_cc <= hiwat) {
2011 		crit_exit();
2012 		goto loop;
2013 	}
2014 	if (flag & IO_NDELAY) {
2015 		crit_exit();
2016 		uio->uio_resid += cc;
2017 		return (uio->uio_resid == cnt ? EWOULDBLOCK : 0);
2018 	}
2019 	SET(tp->t_state, TS_SO_OLOWAT);
2020 	error = ttysleep(tp, TSA_OLOWAT(tp), PCATCH, "ttywri", tp->t_timeout);
2021 	crit_exit();
2022 	if (error == EWOULDBLOCK)
2023 		error = EIO;
2024 	if (error)
2025 		goto out;
2026 	goto loop;
2027 }
2028 
2029 /*
2030  * Rubout one character from the rawq of tp
2031  * as cleanly as possible.
2032  */
2033 static void
2034 ttyrub(int c, struct tty *tp)
2035 {
2036 	char *cp;
2037 	int savecol;
2038 	int tabc;
2039 
2040 	if (!ISSET(tp->t_lflag, ECHO) || ISSET(tp->t_lflag, EXTPROC))
2041 		return;
2042 	CLR(tp->t_lflag, FLUSHO);
2043 	if (ISSET(tp->t_lflag, ECHOE)) {
2044 		if (tp->t_rocount == 0) {
2045 			/*
2046 			 * Screwed by ttwrite; retype
2047 			 */
2048 			ttyretype(tp);
2049 			return;
2050 		}
2051 		if (c == ('\t' | TTY_QUOTE) || c == ('\n' | TTY_QUOTE))
2052 			ttyrubo(tp, 2);
2053 		else {
2054 			CLR(c, ~TTY_CHARMASK);
2055 			switch (CCLASS(c)) {
2056 			case ORDINARY:
2057 				ttyrubo(tp, 1);
2058 				break;
2059 			case BACKSPACE:
2060 			case CONTROL:
2061 			case NEWLINE:
2062 			case RETURN:
2063 			case VTAB:
2064 				if (ISSET(tp->t_lflag, ECHOCTL))
2065 					ttyrubo(tp, 2);
2066 				break;
2067 			case TAB:
2068 				if (tp->t_rocount < tp->t_rawq.c_cc) {
2069 					ttyretype(tp);
2070 					return;
2071 				}
2072 				crit_enter();
2073 				savecol = tp->t_column;
2074 				SET(tp->t_state, TS_CNTTB);
2075 				SET(tp->t_lflag, FLUSHO);
2076 				tp->t_column = tp->t_rocol;
2077 				cp = tp->t_rawq.c_cf;
2078 				if (cp)
2079 					tabc = *cp;	/* XXX FIX NEXTC */
2080 				for (; cp; cp = nextc(&tp->t_rawq, cp, &tabc))
2081 					ttyecho(tabc, tp);
2082 				CLR(tp->t_lflag, FLUSHO);
2083 				CLR(tp->t_state, TS_CNTTB);
2084 				crit_exit();
2085 
2086 				/* savecol will now be length of the tab. */
2087 				savecol -= tp->t_column;
2088 				tp->t_column += savecol;
2089 				if (savecol > 8)
2090 					savecol = 8;	/* overflow screw */
2091 				while (--savecol >= 0)
2092 					(void)ttyoutput('\b', tp);
2093 				break;
2094 			default:			/* XXX */
2095 #define	PANICSTR	"ttyrub: would panic c = %d, val = %d\n"
2096 				(void)kprintf(PANICSTR, c, CCLASS(c));
2097 #ifdef notdef
2098 				panic(PANICSTR, c, CCLASS(c));
2099 #endif
2100 			}
2101 		}
2102 	} else if (ISSET(tp->t_lflag, ECHOPRT)) {
2103 		if (!ISSET(tp->t_state, TS_ERASE)) {
2104 			SET(tp->t_state, TS_ERASE);
2105 			(void)ttyoutput('\\', tp);
2106 		}
2107 		ttyecho(c, tp);
2108 	} else {
2109 		ttyecho(tp->t_cc[VERASE], tp);
2110 		/*
2111 		 * This code may be executed not only when an ERASE key
2112 		 * is pressed, but also when ^U (KILL) or ^W (WERASE) are.
2113 		 * So, I didn't think it was worthwhile to pass the extra
2114 		 * information (which would need an extra parameter,
2115 		 * changing every call) needed to distinguish the ERASE2
2116 		 * case from the ERASE.
2117 		 */
2118 	}
2119 	--tp->t_rocount;
2120 }
2121 
2122 /*
2123  * Back over cnt characters, erasing them.
2124  */
2125 static void
2126 ttyrubo(struct tty *tp, int cnt)
2127 {
2128 
2129 	while (cnt-- > 0) {
2130 		(void)ttyoutput('\b', tp);
2131 		(void)ttyoutput(' ', tp);
2132 		(void)ttyoutput('\b', tp);
2133 	}
2134 }
2135 
2136 /*
2137  * ttyretype --
2138  *	Reprint the rawq line.  Note, it is assumed that c_cc has already
2139  *	been checked.
2140  */
2141 static void
2142 ttyretype(struct tty *tp)
2143 {
2144 	char *cp;
2145 	int c;
2146 
2147 	/* Echo the reprint character. */
2148 	if (tp->t_cc[VREPRINT] != _POSIX_VDISABLE)
2149 		ttyecho(tp->t_cc[VREPRINT], tp);
2150 
2151 	(void)ttyoutput('\n', tp);
2152 
2153 	/*
2154 	 * XXX
2155 	 * FIX: NEXTC IS BROKEN - DOESN'T CHECK QUOTE
2156 	 * BIT OF FIRST CHAR.
2157 	 */
2158 	crit_enter();
2159 	for (cp = tp->t_canq.c_cf, c = (cp != NULL ? *cp : 0);
2160 	    cp != NULL; cp = nextc(&tp->t_canq, cp, &c))
2161 		ttyecho(c, tp);
2162 	for (cp = tp->t_rawq.c_cf, c = (cp != NULL ? *cp : 0);
2163 	    cp != NULL; cp = nextc(&tp->t_rawq, cp, &c))
2164 		ttyecho(c, tp);
2165 	CLR(tp->t_state, TS_ERASE);
2166 	crit_exit();
2167 
2168 	tp->t_rocount = tp->t_rawq.c_cc;
2169 	tp->t_rocol = 0;
2170 }
2171 
2172 /*
2173  * Echo a typed character to the terminal.
2174  */
2175 static void
2176 ttyecho(int c, struct tty *tp)
2177 {
2178 
2179 	if (!ISSET(tp->t_state, TS_CNTTB))
2180 		CLR(tp->t_lflag, FLUSHO);
2181 	if ((!ISSET(tp->t_lflag, ECHO) &&
2182 	     (c != '\n' || !ISSET(tp->t_lflag, ECHONL))) ||
2183 	    ISSET(tp->t_lflag, EXTPROC))
2184 		return;
2185 	if (ISSET(tp->t_lflag, ECHOCTL) &&
2186 	    ((ISSET(c, TTY_CHARMASK) <= 037 && c != '\t' && c != '\n') ||
2187 	    ISSET(c, TTY_CHARMASK) == 0177)) {
2188 		(void)ttyoutput('^', tp);
2189 		CLR(c, ~TTY_CHARMASK);
2190 		if (c == 0177)
2191 			c = '?';
2192 		else
2193 			c += 'A' - 1;
2194 	}
2195 	(void)ttyoutput(c, tp);
2196 }
2197 
2198 /*
2199  * Wake up any readers on a tty.
2200  */
2201 void
2202 ttwakeup(struct tty *tp)
2203 {
2204 
2205 	if (tp->t_rsel.si_pid != 0)
2206 		selwakeup(&tp->t_rsel);
2207 	if (ISSET(tp->t_state, TS_ASYNC) && tp->t_sigio != NULL)
2208 		pgsigio(tp->t_sigio, SIGIO, (tp->t_session != NULL));
2209 	wakeup(TSA_HUP_OR_INPUT(tp));
2210 	KNOTE(&tp->t_rsel.si_note, 0);
2211 }
2212 
2213 /*
2214  * Wake up any writers on a tty.
2215  */
2216 void
2217 ttwwakeup(struct tty *tp)
2218 {
2219 
2220 	if (tp->t_wsel.si_pid != 0 && tp->t_outq.c_cc <= tp->t_olowat)
2221 		selwakeup(&tp->t_wsel);
2222 	if (ISSET(tp->t_state, TS_ASYNC) && tp->t_sigio != NULL)
2223 		pgsigio(tp->t_sigio, SIGIO, (tp->t_session != NULL));
2224 	if (ISSET(tp->t_state, TS_BUSY | TS_SO_OCOMPLETE) ==
2225 	    TS_SO_OCOMPLETE && tp->t_outq.c_cc == 0) {
2226 		CLR(tp->t_state, TS_SO_OCOMPLETE);
2227 		wakeup(TSA_OCOMPLETE(tp));
2228 	}
2229 	if (ISSET(tp->t_state, TS_SO_OLOWAT) &&
2230 	    tp->t_outq.c_cc <= tp->t_olowat) {
2231 		CLR(tp->t_state, TS_SO_OLOWAT);
2232 		wakeup(TSA_OLOWAT(tp));
2233 	}
2234 	KNOTE(&tp->t_wsel.si_note, 0);
2235 }
2236 
2237 /*
2238  * Look up a code for a specified speed in a conversion table;
2239  * used by drivers to map software speed values to hardware parameters.
2240  */
2241 int
2242 ttspeedtab(int speed, struct speedtab *table)
2243 {
2244 
2245 	for ( ; table->sp_speed != -1; table++)
2246 		if (table->sp_speed == speed)
2247 			return (table->sp_code);
2248 	return (-1);
2249 }
2250 
2251 /*
2252  * Set input and output watermarks and buffer sizes.  For input, the
2253  * high watermark is about one second's worth of input above empty, the
2254  * low watermark is slightly below high water, and the buffer size is a
2255  * driver-dependent amount above high water.  For output, the watermarks
2256  * are near the ends of the buffer, with about 1 second's worth of input
2257  * between them.  All this only applies to the standard line discipline.
2258  */
2259 void
2260 ttsetwater(struct tty *tp)
2261 {
2262 	int cps, ttmaxhiwat, x;
2263 
2264 	/* Input. */
2265 	clist_alloc_cblocks(&tp->t_canq, TTYHOG, 512);
2266 	switch (tp->t_ispeedwat) {
2267 	case (speed_t)-1:
2268 		cps = tp->t_ispeed / 10;
2269 		break;
2270 	case 0:
2271 		/*
2272 		 * This case is for old drivers that don't know about
2273 		 * t_ispeedwat.  Arrange for them to get the old buffer
2274 		 * sizes and watermarks.
2275 		 */
2276 		cps = TTYHOG - 2 * 256;
2277 		tp->t_ififosize = 2 * 256;
2278 		break;
2279 	default:
2280 		cps = tp->t_ispeedwat / 10;
2281 		break;
2282 	}
2283 	tp->t_ihiwat = cps;
2284 	tp->t_ilowat = 7 * cps / 8;
2285 	x = cps + tp->t_ififosize;
2286 	clist_alloc_cblocks(&tp->t_rawq, x, x);
2287 
2288 	/* Output. */
2289 	switch (tp->t_ospeedwat) {
2290 	case (speed_t)-1:
2291 		cps = tp->t_ospeed / 10;
2292 		ttmaxhiwat = 2 * TTMAXHIWAT;
2293 		break;
2294 	case 0:
2295 		cps = tp->t_ospeed / 10;
2296 		ttmaxhiwat = TTMAXHIWAT;
2297 		break;
2298 	default:
2299 		cps = tp->t_ospeedwat / 10;
2300 		ttmaxhiwat = 8 * TTMAXHIWAT;
2301 		break;
2302 	}
2303 #define CLAMP(x, h, l)	((x) > h ? h : ((x) < l) ? l : (x))
2304 	tp->t_olowat = x = CLAMP(cps / 2, TTMAXLOWAT, TTMINLOWAT);
2305 	x += cps;
2306 	x = CLAMP(x, ttmaxhiwat, TTMINHIWAT);	/* XXX clamps are too magic */
2307 	tp->t_ohiwat = roundup(x, CBSIZE);	/* XXX for compat */
2308 	x = imax(tp->t_ohiwat, TTMAXHIWAT);	/* XXX for compat/safety */
2309 	x += OBUFSIZ + 100;
2310 	clist_alloc_cblocks(&tp->t_outq, x, x);
2311 #undef	CLAMP
2312 }
2313 
2314 /*
2315  * Report on state of foreground process group.
2316  */
2317 void
2318 ttyinfo(struct tty *tp)
2319 {
2320 	struct proc *p, *pick;
2321 	struct lwp *lp;
2322 	struct rusage ru;
2323 	int tmp;
2324 
2325 	if (ttycheckoutq(tp,0) == 0)
2326 		return;
2327 
2328 	/*
2329 	 * We always print the load average, then figure out what else to
2330 	 * print based on the state of the current process group.
2331 	 */
2332 	tmp = (averunnable.ldavg[0] * 100 + FSCALE / 2) >> FSHIFT;
2333 	ttyprintf(tp, "load: %d.%02d ", tmp / 100, tmp % 100);
2334 
2335 	if (tp->t_session == NULL) {
2336 		ttyprintf(tp, "not a controlling terminal\n");
2337 	} else if (tp->t_pgrp == NULL) {
2338 		ttyprintf(tp, "no foreground process group\n");
2339 	} else if ((p = LIST_FIRST(&tp->t_pgrp->pg_members)) == 0) {
2340 		ttyprintf(tp, "empty foreground process group\n");
2341 	} else {
2342 		/*
2343 		 * Pick an interesting process.  Note that certain elements,
2344 		 * in particular the wmesg, require a critical section for
2345 		 * safe access (YYY and we are still not MP safe).
2346 		 *
2347 		 * NOTE: lwp_wmesg is lwp_thread->td_wmesg.
2348 		 */
2349 		char buf[64];
2350 		const char *str;
2351 		int isinmem;
2352 		long vmsz;
2353 		int pctcpu;
2354 
2355 		crit_enter();
2356 
2357 		/* XXX lwp should compare lwps */
2358 
2359 		for (pick = NULL; p != 0; p = LIST_NEXT(p, p_pglist)) {
2360 			if (proc_compare(pick, p))
2361 				pick = p;
2362 		}
2363 
2364 		/* XXX lwp */
2365 		lp = FIRST_LWP_IN_PROC(pick);
2366 		if (lp == NULL) {
2367 			ttyprintf(tp, "foreground process without lwp\n");
2368 			tp->t_rocount = 0;
2369 			return;
2370 		}
2371 
2372 		/*
2373 		 * Figure out what wait/process-state message, and command
2374 		 * buffer to present
2375 		 */
2376 		/*
2377 		 * XXX lwp This is a horrible mixture.  We need to rework this
2378 		 * as soon as lwps have their own runnable status.
2379 		 */
2380 		if (pick->p_flag & P_WEXIT)
2381 			str = "exiting";
2382 		else if (lp->lwp_stat == LSRUN)
2383 			str = "running";
2384 		else if (pick->p_stat == SIDL)
2385 			str = "spawning";
2386 		else if (lp->lwp_wmesg)	/* lwp_thread must not be NULL */
2387 			str = lp->lwp_wmesg;
2388 		else
2389 			str = "iowait";
2390 
2391 		ksnprintf(buf, sizeof(buf), "cmd: %s %d [%s]",
2392 			pick->p_comm, pick->p_pid, str);
2393 
2394 		/*
2395 		 * Calculate cpu usage, percent cpu, and cmsz.  Note that
2396 		 * 'pick' becomes invalid the moment we exit the critical
2397 		 * section.
2398 		 */
2399 		if (lp->lwp_thread && (pick->p_flag & P_SWAPPEDOUT) == 0) {
2400 			calcru_proc(pick, &ru);
2401 			isinmem = 1;
2402 		} else {
2403 			isinmem = 0;
2404 		}
2405 
2406 		pctcpu = (lp->lwp_pctcpu * 10000 + FSCALE / 2) >> FSHIFT;
2407 
2408 		if (pick->p_stat == SIDL || pick->p_stat == SZOMB)
2409 		    vmsz = 0;
2410 		else
2411 		    vmsz = pgtok(vmspace_resident_count(pick->p_vmspace));
2412 
2413 		crit_exit();
2414 
2415 		/*
2416 		 * Dump the output
2417 		 */
2418 		ttyprintf(tp, " %s ", buf);
2419 		ttyprintf(tp, "%ld.%02ldu ",
2420 			ru.ru_utime.tv_sec, ru.ru_utime.tv_usec / 10000);
2421 		ttyprintf(tp, "%ld.%02lds ",
2422 			ru.ru_stime.tv_sec, ru.ru_stime.tv_usec / 10000);
2423 		ttyprintf(tp, "%d%% %ldk\n", pctcpu / 100, vmsz);
2424 	}
2425 	tp->t_rocount = 0;	/* so pending input will be retyped if BS */
2426 }
2427 
2428 /*
2429  * Returns 1 if p2 is "better" than p1
2430  *
2431  * The algorithm for picking the "interesting" process is thus:
2432  *
2433  *	1) Only foreground processes are eligible - implied.
2434  *	2) Runnable processes are favored over anything else.  The runner
2435  *	   with the highest cpu utilization is picked (p_cpticks).  Ties are
2436  *	   broken by picking the highest pid.
2437  *	3) The sleeper with the shortest sleep time is next.  With ties,
2438  *	   we pick out just "short-term" sleepers (LWP_SINTR == 0).
2439  *	4) Further ties are broken by picking the highest pid.
2440  */
2441 #define ISRUN(lp)	((lp)->lwp_stat == LSRUN)
2442 #define TESTAB(a, b)    ((a)<<1 | (b))
2443 #define ONLYA   2
2444 #define ONLYB   1
2445 #define BOTH    3
2446 
2447 static int
2448 proc_compare(struct proc *p1, struct proc *p2)
2449 {
2450 	struct lwp *lp1, *lp2;
2451 	if (p1 == NULL)
2452 		return (1);
2453 
2454 	/* XXX lwp */
2455 	lp1 = FIRST_LWP_IN_PROC(p1);
2456 	lp2 = FIRST_LWP_IN_PROC(p2);
2457 
2458 	/*
2459 	 * see if at least one of them is runnable
2460 	 */
2461 	switch (TESTAB(ISRUN(lp1), ISRUN(lp2))) {
2462 	case ONLYA:
2463 		return (0);
2464 	case ONLYB:
2465 		return (1);
2466 	case BOTH:
2467 		/*
2468 		 * tie - favor one with highest recent cpu utilization
2469 		 */
2470 		if (lp2->lwp_cpticks > lp1->lwp_cpticks)
2471 			return (1);
2472 		if (lp1->lwp_cpticks > lp2->lwp_cpticks)
2473 			return (0);
2474 		return (p2->p_pid > p1->p_pid);	/* tie - return highest pid */
2475 	}
2476 	/*
2477  	 * weed out zombies
2478 	 */
2479 	switch (TESTAB(p1->p_stat == SZOMB, p2->p_stat == SZOMB)) {
2480 	case ONLYA:
2481 		return (1);
2482 	case ONLYB:
2483 		return (0);
2484 	case BOTH:
2485 		return (p2->p_pid > p1->p_pid); /* tie - return highest pid */
2486 	}
2487 	/*
2488 	 * pick the one with the smallest sleep time
2489 	 */
2490 	if (lp2->lwp_slptime > lp1->lwp_slptime)
2491 		return (0);
2492 	if (lp1->lwp_slptime > lp2->lwp_slptime)
2493 		return (1);
2494 	/*
2495 	 * favor one sleeping in a non-interruptible sleep
2496 	 */
2497 	if (lp1->lwp_flag & LWP_SINTR && (lp2->lwp_flag & LWP_SINTR) == 0)
2498 		return (1);
2499 	if (lp2->lwp_flag & LWP_SINTR && (lp1->lwp_flag & LWP_SINTR) == 0)
2500 		return (0);
2501 	return (p2->p_pid > p1->p_pid);		/* tie - return highest pid */
2502 }
2503 
2504 /*
2505  * Output char to tty; console putchar style.
2506  */
2507 int
2508 tputchar(int c, struct tty *tp)
2509 {
2510 	crit_enter();
2511 	if (!ISSET(tp->t_state, TS_CONNECTED)) {
2512 		crit_exit();
2513 		return (-1);
2514 	}
2515 	if (c == '\n')
2516 		(void)ttyoutput('\r', tp);
2517 	(void)ttyoutput(c, tp);
2518 	ttstart(tp);
2519 	crit_exit();
2520 	return (0);
2521 }
2522 
2523 /*
2524  * Sleep on chan, returning ERESTART if tty changed while we napped and
2525  * returning any errors (e.g. EINTR/EWOULDBLOCK) reported by tsleep.  If
2526  * the tty is revoked, restarting a pending call will redo validation done
2527  * at the start of the call.
2528  */
2529 int
2530 ttysleep(struct tty *tp, void *chan, int slpflags, char *wmesg, int timo)
2531 {
2532 	int error;
2533 	int gen;
2534 
2535 	gen = tp->t_gen;
2536 	error = tsleep(chan, slpflags, wmesg, timo);
2537 	if (error)
2538 		return (error);
2539 	return (tp->t_gen == gen ? 0 : ERESTART);
2540 }
2541 
2542 /*
2543  * Allocate a tty struct.  Clists in the struct will be allocated by
2544  * ttyopen().
2545  */
2546 struct tty *
2547 ttymalloc(struct tty *tp)
2548 {
2549 
2550 	if (tp)
2551 		return(tp);
2552         tp = kmalloc(sizeof *tp, M_TTYS, M_WAITOK|M_ZERO);
2553 	ttyregister(tp);
2554         return (tp);
2555 }
2556 
2557 #if 0
2558 /*
2559  * Free a tty struct.  Clists in the struct should have been freed by
2560  * ttyclose().
2561  *
2562  * XXX not yet usable: since we support a half-closed state and do not
2563  * ref count the tty reference from the session, it is possible for a
2564  * session to hold a ref on the tty.  See TTY_DO_FULL_CLOSE.
2565  */
2566 void
2567 ttyfree(struct tty *tp)
2568 {
2569         kfree(tp, M_TTYS);
2570 }
2571 #endif /* 0 */
2572 
2573 void
2574 ttyregister(struct tty *tp)
2575 {
2576 	SLIST_INSERT_HEAD(&tty_list, tp, t_list);
2577 }
2578 
2579 static int
2580 sysctl_kern_ttys(SYSCTL_HANDLER_ARGS)
2581 {
2582 	int error;
2583 	struct tty *tp, t;
2584 	SLIST_FOREACH(tp, &tty_list, t_list) {
2585 		t = *tp;
2586 		if (t.t_dev)
2587 			t.t_dev = (cdev_t)dev2udev(t.t_dev);
2588 		error = SYSCTL_OUT(req, (caddr_t)&t, sizeof(t));
2589 		if (error)
2590 			return (error);
2591 	}
2592 	return (0);
2593 }
2594 
2595 SYSCTL_PROC(_kern, OID_AUTO, ttys, CTLTYPE_OPAQUE|CTLFLAG_RD,
2596 	0, 0, sysctl_kern_ttys, "S,tty", "All struct ttys");
2597 
2598 void
2599 nottystop(struct tty *tp, int rw)
2600 {
2601 
2602 	return;
2603 }
2604 
2605 int
2606 ttyread(struct dev_read_args *ap)
2607 {
2608 	struct tty *tp;
2609 
2610 	tp = ap->a_head.a_dev->si_tty;
2611 	if (tp == NULL)
2612 		return (ENODEV);
2613 	return ((*linesw[tp->t_line].l_read)(tp, ap->a_uio, ap->a_ioflag));
2614 }
2615 
2616 int
2617 ttywrite(struct dev_write_args *ap)
2618 {
2619 	struct tty *tp;
2620 
2621 	tp = ap->a_head.a_dev->si_tty;
2622 	if (tp == NULL)
2623 		return (ENODEV);
2624 	return ((*linesw[tp->t_line].l_write)(tp, ap->a_uio, ap->a_ioflag));
2625 }
2626