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