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