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