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