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