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