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