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