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