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