xref: /netbsd-src/sys/kern/tty.c (revision 1ca5c1b28139779176bd5c13ad7c5f25c0bcd5f8)
1 /*	$NetBSD: tty.c,v 1.129 2001/11/12 15:25:27 lukem Exp $	*/
2 
3 /*-
4  * Copyright (c) 1982, 1986, 1990, 1991, 1993
5  *	The Regents of the University of California.  All rights reserved.
6  * (c) UNIX System Laboratories, Inc.
7  * All or some portions of this file are derived from material licensed
8  * to the University of California by American Telephone and Telegraph
9  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
10  * the permission of UNIX System Laboratories, Inc.
11  *
12  * Redistribution and use in source and binary forms, with or without
13  * modification, are permitted provided that the following conditions
14  * are met:
15  * 1. Redistributions of source code must retain the above copyright
16  *    notice, this list of conditions and the following disclaimer.
17  * 2. Redistributions in binary form must reproduce the above copyright
18  *    notice, this list of conditions and the following disclaimer in the
19  *    documentation and/or other materials provided with the distribution.
20  * 3. All advertising materials mentioning features or use of this software
21  *    must display the following acknowledgement:
22  *	This product includes software developed by the University of
23  *	California, Berkeley and its contributors.
24  * 4. Neither the name of the University nor the names of its contributors
25  *    may be used to endorse or promote products derived from this software
26  *    without specific prior written permission.
27  *
28  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
29  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
30  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
31  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
32  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
34  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
35  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
36  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
37  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
38  * SUCH DAMAGE.
39  *
40  *	@(#)tty.c	8.13 (Berkeley) 1/9/95
41  */
42 
43 #include <sys/cdefs.h>
44 __KERNEL_RCSID(0, "$NetBSD: tty.c,v 1.129 2001/11/12 15:25:27 lukem Exp $");
45 
46 #include "opt_uconsole.h"
47 
48 #include <sys/param.h>
49 #include <sys/systm.h>
50 #include <sys/ioctl.h>
51 #include <sys/proc.h>
52 #define	TTYDEFCHARS
53 #include <sys/tty.h>
54 #undef	TTYDEFCHARS
55 #include <sys/file.h>
56 #include <sys/conf.h>
57 #include <sys/dkstat.h>
58 #include <sys/uio.h>
59 #include <sys/kernel.h>
60 #include <sys/vnode.h>
61 #include <sys/syslog.h>
62 #include <sys/malloc.h>
63 #include <sys/pool.h>
64 #include <sys/signalvar.h>
65 #include <sys/resourcevar.h>
66 #include <sys/poll.h>
67 
68 static int	ttnread(struct tty *);
69 static void	ttyblock(struct tty *);
70 static void	ttyecho(int, struct tty *);
71 static void	ttyrubo(struct tty *, int);
72 static int	proc_compare(struct proc *, struct proc *);
73 
74 /* Symbolic sleep message strings. */
75 const char	ttclos[] = "ttycls";
76 const char	ttopen[] = "ttyopn";
77 const char	ttybg[] = "ttybg";
78 const char	ttyin[] = "ttyin";
79 const char	ttyout[] = "ttyout";
80 
81 /*
82  * Used to determine whether we still have a connection.  This is true in
83  * one of 3 cases:
84  * 1) We have carrier.
85  * 2) It's a locally attached terminal, and we are therefore ignoring carrier.
86  * 3) We're using a flow control mechanism that overloads the carrier signal.
87  */
88 #define	CONNECTED(tp)	(ISSET(tp->t_state, TS_CARR_ON) ||	\
89 			 ISSET(tp->t_cflag, CLOCAL | MDMBUF))
90 
91 /*
92  * Table with character classes and parity. The 8th bit indicates parity,
93  * the 7th bit indicates the character is an alphameric or underscore (for
94  * ALTWERASE), and the low 6 bits indicate delay type.  If the low 6 bits
95  * are 0 then the character needs no special processing on output; classes
96  * other than 0 might be translated or (not currently) require delays.
97  */
98 #define	E	0x00	/* Even parity. */
99 #define	O	0x80	/* Odd parity. */
100 #define	PARITY(c)	(char_type[c] & O)
101 
102 #define	ALPHA	0x40	/* Alpha or underscore. */
103 #define	ISALPHA(c)	(char_type[(c) & TTY_CHARMASK] & ALPHA)
104 
105 #define	CCLASSMASK	0x3f
106 #define	CCLASS(c)	(char_type[c] & CCLASSMASK)
107 
108 #define	BS	BACKSPACE
109 #define	CC	CONTROL
110 #define	CR	RETURN
111 #define	NA	ORDINARY | ALPHA
112 #define	NL	NEWLINE
113 #define	NO	ORDINARY
114 #define	TB	TAB
115 #define	VT	VTAB
116 
117 char const char_type[] = {
118 	E|CC, O|CC, O|CC, E|CC, O|CC, E|CC, E|CC, O|CC,	/* nul - bel */
119 	O|BS, E|TB, E|NL, O|CC, E|VT, O|CR, O|CC, E|CC, /* bs - si */
120 	O|CC, E|CC, E|CC, O|CC, E|CC, O|CC, O|CC, E|CC, /* dle - etb */
121 	E|CC, O|CC, O|CC, E|CC, O|CC, E|CC, E|CC, O|CC, /* can - us */
122 	O|NO, E|NO, E|NO, O|NO, E|NO, O|NO, O|NO, E|NO, /* sp - ' */
123 	E|NO, O|NO, O|NO, E|NO, O|NO, E|NO, E|NO, O|NO, /* ( - / */
124 	E|NA, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA, /* 0 - 7 */
125 	O|NA, E|NA, E|NO, O|NO, E|NO, O|NO, O|NO, E|NO, /* 8 - ? */
126 	O|NO, E|NA, E|NA, O|NA, E|NA, O|NA, O|NA, E|NA, /* @ - G */
127 	E|NA, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA, /* H - O */
128 	E|NA, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA, /* P - W */
129 	O|NA, E|NA, E|NA, O|NO, E|NO, O|NO, O|NO, O|NA, /* X - _ */
130 	E|NO, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA, /* ` - g */
131 	O|NA, E|NA, E|NA, O|NA, E|NA, O|NA, O|NA, E|NA, /* h - o */
132 	O|NA, E|NA, E|NA, O|NA, E|NA, O|NA, O|NA, E|NA, /* p - w */
133 	E|NA, O|NA, O|NA, E|NO, O|NO, E|NO, E|NO, O|CC, /* x - del */
134 	/*
135 	 * Meta chars; should be settable per character set;
136 	 * for now, treat them all as normal characters.
137 	 */
138 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
139 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
140 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
141 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
142 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
143 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
144 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
145 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
146 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
147 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
148 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
149 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
150 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
151 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
152 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
153 	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
154 };
155 #undef	BS
156 #undef	CC
157 #undef	CR
158 #undef	NA
159 #undef	NL
160 #undef	NO
161 #undef	TB
162 #undef	VT
163 
164 /* Macros to clear/set/test flags. */
165 #define	SET(t, f)	(t) |= (f)
166 #define	CLR(t, f)	(t) &= ~((unsigned)(f))
167 #define	ISSET(t, f)	((t) & (f))
168 
169 struct ttylist_head ttylist;	/* TAILQ_HEAD */
170 int tty_count;
171 
172 struct pool tty_pool;
173 
174 int
175 ttyopen(struct tty *tp, int dialout, int nonblock)
176 {
177 	int	s, error;
178 
179 	s = spltty();
180 
181 	if (dialout) {
182 		/*
183 		 * If the device is already open for non-dialout, fail.
184 		 * Otherwise, set TS_DIALOUT to block any pending non-dialout
185 		 * opens.
186 		 */
187 		if (ISSET(tp->t_state, TS_ISOPEN) &&
188 		    !ISSET(tp->t_state, TS_DIALOUT)) {
189 			splx(s);
190 			return (EBUSY);
191 		}
192 		SET(tp->t_state, TS_DIALOUT);
193 	} else {
194 		if (!nonblock) {
195 			/*
196 			 * Wait for carrier.  Also wait for any dialout
197 			 * processes to close the tty first.
198 			 */
199 			while (ISSET(tp->t_state, TS_DIALOUT) ||
200 			       (!ISSET(tp->t_state, TS_CARR_ON) &&
201 				!ISSET(tp->t_cflag, CLOCAL | MDMBUF))) {
202 				tp->t_wopen++;
203 				error = ttysleep(tp, &tp->t_rawq,
204 				    TTIPRI | PCATCH, ttopen, 0);
205 				tp->t_wopen--;
206 				if (error) {
207 					splx(s);
208 					return (error);
209 				}
210 			}
211 		} else {
212 			/*
213 			 * Don't allow a non-blocking non-dialout open if the
214 			 * device is already open for dialout.
215 			 */
216 		        if (ISSET(tp->t_state, TS_DIALOUT)) {
217 				splx(s);
218 				return (EBUSY);
219 			}
220 		}
221 	}
222 
223 	splx(s);
224 	return (0);
225 }
226 
227 /*
228  * Initial open of tty, or (re)entry to standard tty line discipline.
229  */
230 int
231 ttylopen(dev_t device, struct tty *tp)
232 {
233 	int	s;
234 
235 	s = spltty();
236 	tp->t_dev = device;
237 	if (!ISSET(tp->t_state, TS_ISOPEN)) {
238 		SET(tp->t_state, TS_ISOPEN);
239 		memset(&tp->t_winsize, 0, sizeof(tp->t_winsize));
240 #ifdef COMPAT_OLDTTY
241 		tp->t_flags = 0;
242 #endif
243 	}
244 	splx(s);
245 	return (0);
246 }
247 
248 /*
249  * Handle close() on a tty line: flush and set to initial state,
250  * bumping generation number so that pending read/write calls
251  * can detect recycling of the tty.
252  */
253 int
254 ttyclose(struct tty *tp)
255 {
256 	extern struct tty *constty;	/* Temporary virtual console. */
257 
258 	if (constty == tp)
259 		constty = NULL;
260 
261 	ttyflush(tp, FREAD | FWRITE);
262 
263 	tp->t_gen++;
264 	tp->t_pgrp = NULL;
265 	tp->t_session = NULL;
266 	tp->t_state = 0;
267 	return (0);
268 }
269 
270 #define	FLUSHQ(q) {							\
271 	if ((q)->c_cc)							\
272 		ndflush(q, (q)->c_cc);					\
273 }
274 
275 /*
276  * This macro is used in canonical mode input processing, where a read
277  * request shall not return unless a 'line delimiter' ('\n') or 'break'
278  * (EOF, EOL, EOL2) character (or a signal) has been received. As EOL2
279  * is an extension to the POSIX.1 defined set of special characters,
280  * recognize it only if IEXTEN is set in the set of local flags.
281  */
282 #define	TTBREAKC(c, lflg)						\
283 	((c) == '\n' || (((c) == cc[VEOF] || (c) == cc[VEOL] ||		\
284 	((c) == cc[VEOL2] && ISSET(lflg, IEXTEN))) && (c) != _POSIX_VDISABLE))
285 
286 
287 /*
288  * Process input of a single character received on a tty.
289  */
290 int
291 ttyinput(int c, struct tty *tp)
292 {
293 	int	iflag, lflag, i, error;
294 	u_char	*cc;
295 
296 	/*
297 	 * Unless the receiver is enabled, drop incoming data.
298 	 */
299 	if (!ISSET(tp->t_cflag, CREAD))
300 		return (0);
301 
302 	/*
303 	 * If input is pending take it first.
304 	 */
305 	lflag = tp->t_lflag;
306 	if (ISSET(lflag, PENDIN))
307 		ttypend(tp);
308 	/*
309 	 * Gather stats.
310 	 */
311 	if (ISSET(lflag, ICANON)) {
312 		++tk_cancc;
313 		++tp->t_cancc;
314 	} else {
315 		++tk_rawcc;
316 		++tp->t_rawcc;
317 	}
318 	++tk_nin;
319 
320 	cc = tp->t_cc;
321 
322 	/*
323 	 * Handle exceptional conditions (break, parity, framing).
324 	 */
325 	iflag = tp->t_iflag;
326 	if ((error = (ISSET(c, TTY_ERRORMASK))) != 0) {
327 		CLR(c, TTY_ERRORMASK);
328 		if (ISSET(error, TTY_FE) && c == 0) {		/* Break. */
329 			if (ISSET(iflag, IGNBRK))
330 				return (0);
331 			else if (ISSET(iflag, BRKINT)) {
332 				ttyflush(tp, FREAD | FWRITE);
333 				pgsignal(tp->t_pgrp, SIGINT, 1);
334 				return (0);
335 			}
336 			else if (ISSET(iflag, PARMRK))
337 				goto parmrk;
338 		}
339 		else if ((ISSET(error, TTY_PE) && ISSET(iflag, INPCK)) ||
340 		    ISSET(error, TTY_FE)) {
341 			if (ISSET(iflag, IGNPAR))
342 				return (0);
343 			else if (ISSET(iflag, PARMRK)) {
344  parmrk:			(void)putc(0377 | TTY_QUOTE, &tp->t_rawq);
345 				(void)putc(0    | TTY_QUOTE, &tp->t_rawq);
346 				(void)putc(c    | TTY_QUOTE, &tp->t_rawq);
347 				return (0);
348 			}
349 			else
350 				c = 0;
351 		}
352 	}
353 	else if (c == 0377 &&
354 	    ISSET(iflag, ISTRIP|IGNPAR|INPCK|PARMRK) == (INPCK|PARMRK)) {
355 		/* "Escape" a valid character of '\377'. */
356 		(void)putc(0377 | TTY_QUOTE, &tp->t_rawq);
357 		(void)putc(0377 | TTY_QUOTE, &tp->t_rawq);
358 		goto endcase;
359 	}
360 
361 	/*
362 	 * In tandem mode, check high water mark.
363 	 */
364 	if (ISSET(iflag, IXOFF) || ISSET(tp->t_cflag, CHWFLOW))
365 		ttyblock(tp);
366 	if (!ISSET(tp->t_state, TS_TYPEN) && ISSET(iflag, ISTRIP))
367 		CLR(c, 0x80);
368 	if (!ISSET(lflag, EXTPROC)) {
369 		/*
370 		 * Check for literal nexting very first
371 		 */
372 		if (ISSET(tp->t_state, TS_LNCH)) {
373 			SET(c, TTY_QUOTE);
374 			CLR(tp->t_state, TS_LNCH);
375 		}
376 		/*
377 		 * Scan for special characters.  This code
378 		 * is really just a big case statement with
379 		 * non-constant cases.  The bottom of the
380 		 * case statement is labeled ``endcase'', so goto
381 		 * it after a case match, or similar.
382 		 */
383 
384 		/*
385 		 * Control chars which aren't controlled
386 		 * by ICANON, ISIG, or IXON.
387 		 */
388 		if (ISSET(lflag, IEXTEN)) {
389 			if (CCEQ(cc[VLNEXT], c)) {
390 				if (ISSET(lflag, ECHO)) {
391 					if (ISSET(lflag, ECHOE)) {
392 						(void)ttyoutput('^', tp);
393 						(void)ttyoutput('\b', tp);
394 					} else
395 						ttyecho(c, tp);
396 				}
397 				SET(tp->t_state, TS_LNCH);
398 				goto endcase;
399 			}
400 			if (CCEQ(cc[VDISCARD], c)) {
401 				if (ISSET(lflag, FLUSHO))
402 					CLR(tp->t_lflag, FLUSHO);
403 				else {
404 					ttyflush(tp, FWRITE);
405 					ttyecho(c, tp);
406 					if (tp->t_rawq.c_cc + tp->t_canq.c_cc)
407 						ttyretype(tp);
408 					SET(tp->t_lflag, FLUSHO);
409 				}
410 				goto startoutput;
411 			}
412 		}
413 		/*
414 		 * Signals.
415 		 */
416 		if (ISSET(lflag, ISIG)) {
417 			if (CCEQ(cc[VINTR], c) || CCEQ(cc[VQUIT], c)) {
418 				if (!ISSET(lflag, NOFLSH))
419 					ttyflush(tp, FREAD | FWRITE);
420 				ttyecho(c, tp);
421 				pgsignal(tp->t_pgrp,
422 				    CCEQ(cc[VINTR], c) ? SIGINT : SIGQUIT, 1);
423 				goto endcase;
424 			}
425 			if (CCEQ(cc[VSUSP], c)) {
426 				if (!ISSET(lflag, NOFLSH))
427 					ttyflush(tp, FREAD);
428 				ttyecho(c, tp);
429 				pgsignal(tp->t_pgrp, SIGTSTP, 1);
430 				goto endcase;
431 			}
432 		}
433 		/*
434 		 * Handle start/stop characters.
435 		 */
436 		if (ISSET(iflag, IXON)) {
437 			if (CCEQ(cc[VSTOP], c)) {
438 				if (!ISSET(tp->t_state, TS_TTSTOP)) {
439 					SET(tp->t_state, TS_TTSTOP);
440 					(*cdevsw[major(tp->t_dev)].d_stop)(tp,
441 					   0);
442 					return (0);
443 				}
444 				if (!CCEQ(cc[VSTART], c))
445 					return (0);
446 				/*
447 				 * if VSTART == VSTOP then toggle
448 				 */
449 				goto endcase;
450 			}
451 			if (CCEQ(cc[VSTART], c))
452 				goto restartoutput;
453 		}
454 		/*
455 		 * IGNCR, ICRNL, & INLCR
456 		 */
457 		if (c == '\r') {
458 			if (ISSET(iflag, IGNCR))
459 				goto endcase;
460 			else if (ISSET(iflag, ICRNL))
461 				c = '\n';
462 		} else if (c == '\n' && ISSET(iflag, INLCR))
463 			c = '\r';
464 	}
465 	if (!ISSET(tp->t_lflag, EXTPROC) && ISSET(lflag, ICANON)) {
466 		/*
467 		 * From here on down canonical mode character
468 		 * processing takes place.
469 		 */
470 		/*
471 		 * erase (^H / ^?)
472 		 */
473 		if (CCEQ(cc[VERASE], c)) {
474 			if (tp->t_rawq.c_cc)
475 				ttyrub(unputc(&tp->t_rawq), tp);
476 			goto endcase;
477 		}
478 		/*
479 		 * kill (^U)
480 		 */
481 		if (CCEQ(cc[VKILL], c)) {
482 			if (ISSET(lflag, ECHOKE) &&
483 			    tp->t_rawq.c_cc == tp->t_rocount &&
484 			    !ISSET(lflag, ECHOPRT))
485 				while (tp->t_rawq.c_cc)
486 					ttyrub(unputc(&tp->t_rawq), tp);
487 			else {
488 				ttyecho(c, tp);
489 				if (ISSET(lflag, ECHOK) ||
490 				    ISSET(lflag, ECHOKE))
491 					ttyecho('\n', tp);
492 				FLUSHQ(&tp->t_rawq);
493 				tp->t_rocount = 0;
494 			}
495 			CLR(tp->t_state, TS_LOCAL);
496 			goto endcase;
497 		}
498 		/*
499 		 * Extensions to the POSIX.1 GTI set of functions.
500 		 */
501 		if (ISSET(lflag, IEXTEN)) {
502 			/*
503 			 * word erase (^W)
504 			 */
505 			if (CCEQ(cc[VWERASE], c)) {
506 				int alt = ISSET(lflag, ALTWERASE);
507 				int ctype;
508 
509 				/*
510 				 * erase whitespace
511 				 */
512 				while ((c = unputc(&tp->t_rawq)) == ' ' ||
513 				       c == '\t')
514 					ttyrub(c, tp);
515 				if (c == -1)
516 					goto endcase;
517 				/*
518 				 * erase last char of word and remember the
519 				 * next chars type (for ALTWERASE)
520 				 */
521 				ttyrub(c, tp);
522 				c = unputc(&tp->t_rawq);
523 				if (c == -1)
524 					goto endcase;
525 				if (c == ' ' || c == '\t') {
526 					(void)putc(c, &tp->t_rawq);
527 					goto endcase;
528 				}
529 				ctype = ISALPHA(c);
530 				/*
531 				 * erase rest of word
532 				 */
533 				do {
534 					ttyrub(c, tp);
535 					c = unputc(&tp->t_rawq);
536 					if (c == -1)
537 						goto endcase;
538 				} while (c != ' ' && c != '\t' &&
539 				         (alt == 0 || ISALPHA(c) == ctype));
540 				(void)putc(c, &tp->t_rawq);
541 				goto endcase;
542 			}
543 			/*
544 			 * reprint line (^R)
545 			 */
546 			if (CCEQ(cc[VREPRINT], c)) {
547 				ttyretype(tp);
548 				goto endcase;
549 			}
550 			/*
551 			 * ^T - kernel info and generate SIGINFO
552 			 */
553 			if (CCEQ(cc[VSTATUS], c)) {
554 				if (ISSET(lflag, ISIG))
555 					pgsignal(tp->t_pgrp, SIGINFO, 1);
556 				if (!ISSET(lflag, NOKERNINFO))
557 					ttyinfo(tp);
558 				goto endcase;
559 			}
560 		}
561 	}
562 	/*
563 	 * Check for input buffer overflow
564 	 */
565 	if (tp->t_rawq.c_cc + tp->t_canq.c_cc >= TTYHOG) {
566 		if (ISSET(iflag, IMAXBEL)) {
567 			if (tp->t_outq.c_cc < tp->t_hiwat)
568 				(void)ttyoutput(CTRL('g'), tp);
569 		} else
570 			ttyflush(tp, FREAD | FWRITE);
571 		goto endcase;
572 	}
573 	/*
574 	 * Put data char in q for user and
575 	 * wakeup on seeing a line delimiter.
576 	 */
577 	if (putc(c, &tp->t_rawq) >= 0) {
578 		if (!ISSET(lflag, ICANON)) {
579 			ttwakeup(tp);
580 			ttyecho(c, tp);
581 			goto endcase;
582 		}
583 		if (TTBREAKC(c, lflag)) {
584 			tp->t_rocount = 0;
585 			catq(&tp->t_rawq, &tp->t_canq);
586 			ttwakeup(tp);
587 		} else if (tp->t_rocount++ == 0)
588 			tp->t_rocol = tp->t_column;
589 		if (ISSET(tp->t_state, TS_ERASE)) {
590 			/*
591 			 * end of prterase \.../
592 			 */
593 			CLR(tp->t_state, TS_ERASE);
594 			(void)ttyoutput('/', tp);
595 		}
596 		i = tp->t_column;
597 		ttyecho(c, tp);
598 		if (CCEQ(cc[VEOF], c) && ISSET(lflag, ECHO)) {
599 			/*
600 			 * Place the cursor over the '^' of the ^D.
601 			 */
602 			i = min(2, tp->t_column - i);
603 			while (i > 0) {
604 				(void)ttyoutput('\b', tp);
605 				i--;
606 			}
607 		}
608 	}
609  endcase:
610 	/*
611 	 * IXANY means allow any character to restart output.
612 	 */
613 	if (ISSET(tp->t_state, TS_TTSTOP) &&
614 	    !ISSET(iflag, IXANY) && cc[VSTART] != cc[VSTOP])
615 		return (0);
616  restartoutput:
617 	CLR(tp->t_lflag, FLUSHO);
618 	CLR(tp->t_state, TS_TTSTOP);
619  startoutput:
620 	return (ttstart(tp));
621 }
622 
623 /*
624  * Output a single character on a tty, doing output processing
625  * as needed (expanding tabs, newline processing, etc.).
626  * Returns < 0 if succeeds, otherwise returns char to resend.
627  * Must be recursive.
628  */
629 int
630 ttyoutput(int c, struct tty *tp)
631 {
632 	long	oflag;
633 	int	col, notout, s;
634 
635 	oflag = tp->t_oflag;
636 	if (!ISSET(oflag, OPOST)) {
637 		tk_nout++;
638 		tp->t_outcc++;
639 		if (!ISSET(tp->t_lflag, FLUSHO) && putc(c, &tp->t_outq))
640 			return (c);
641 		return (-1);
642 	}
643 	/*
644 	 * Do tab expansion if OXTABS is set.  Special case if we do external
645 	 * processing, we don't do the tab expansion because we'll probably
646 	 * get it wrong.  If tab expansion needs to be done, let it happen
647 	 * externally.
648 	 */
649 	CLR(c, ~TTY_CHARMASK);
650 	if (c == '\t' &&
651 	    ISSET(oflag, OXTABS) && !ISSET(tp->t_lflag, EXTPROC)) {
652 		c = 8 - (tp->t_column & 7);
653 		if (ISSET(tp->t_lflag, FLUSHO)) {
654 			notout = 0;
655 		} else {
656 			s = spltty();		/* Don't interrupt tabs. */
657 			notout = b_to_q("        ", c, &tp->t_outq);
658 			c -= notout;
659 			tk_nout += c;
660 			tp->t_outcc += c;
661 			splx(s);
662 		}
663 		tp->t_column += c;
664 		return (notout ? '\t' : -1);
665 	}
666 	if (c == CEOT && ISSET(oflag, ONOEOT))
667 		return (-1);
668 
669 	/*
670 	 * Newline translation: if ONLCR is set,
671 	 * translate newline into "\r\n".
672 	 */
673 	if (c == '\n' && ISSET(tp->t_oflag, ONLCR)) {
674 		tk_nout++;
675 		tp->t_outcc++;
676 		if (!ISSET(tp->t_lflag, FLUSHO) && putc('\r', &tp->t_outq))
677 			return (c);
678 	}
679 	/* If OCRNL is set, translate "\r" into "\n". */
680 	else if (c == '\r' && ISSET(tp->t_oflag, OCRNL))
681 		c = '\n';
682 	/* If ONOCR is set, don't transmit CRs when on column 0. */
683 	else if (c == '\r' && ISSET(tp->t_oflag, ONOCR) && tp->t_column == 0)
684 		return (-1);
685 
686 	tk_nout++;
687 	tp->t_outcc++;
688 	if (!ISSET(tp->t_lflag, FLUSHO) && putc(c, &tp->t_outq))
689 		return (c);
690 
691 	col = tp->t_column;
692 	switch (CCLASS(c)) {
693 	case BACKSPACE:
694 		if (col > 0)
695 			--col;
696 		break;
697 	case CONTROL:
698 		break;
699 	case NEWLINE:
700 		if (ISSET(tp->t_oflag, ONLCR | ONLRET))
701 			col = 0;
702 		break;
703 	case RETURN:
704 		col = 0;
705 		break;
706 	case ORDINARY:
707 		++col;
708 		break;
709 	case TAB:
710 		col = (col + 8) & ~7;
711 		break;
712 	}
713 	tp->t_column = col;
714 	return (-1);
715 }
716 
717 /*
718  * Ioctls for all tty devices.  Called after line-discipline specific ioctl
719  * has been called to do discipline-specific functions and/or reject any
720  * of these ioctl commands.
721  */
722 /* ARGSUSED */
723 int
724 ttioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
725 {
726 	extern struct tty *constty;	/* Temporary virtual console. */
727 	extern int	nlinesw;
728 	struct linesw	*lp;
729 	int		s, error;
730 
731 	/* If the ioctl involves modification, hang if in the background. */
732 	switch (cmd) {
733 	case  TIOCFLUSH:
734 	case  TIOCDRAIN:
735 	case  TIOCSBRK:
736 	case  TIOCCBRK:
737 	case  TIOCSTART:
738 	case  TIOCSETA:
739 	case  TIOCSETD:
740 	case  TIOCSLINED:
741 	case  TIOCSETAF:
742 	case  TIOCSETAW:
743 #ifdef notdef
744 	case  TIOCSPGRP:
745 #endif
746 	case  TIOCSTAT:
747 	case  TIOCSTI:
748 	case  TIOCSWINSZ:
749 #ifdef COMPAT_OLDTTY
750 	case  TIOCLBIC:
751 	case  TIOCLBIS:
752 	case  TIOCLSET:
753 	case  TIOCSETC:
754 	case OTIOCSETD:
755 	case  TIOCSETN:
756 	case  TIOCSETP:
757 	case  TIOCSLTC:
758 #endif
759 		while (isbackground(curproc, tp) &&
760 		    p->p_pgrp->pg_jobc && (p->p_flag & P_PPWAIT) == 0 &&
761 		    !sigismasked(p, SIGTTOU)) {
762 			pgsignal(p->p_pgrp, SIGTTOU, 1);
763 			error = ttysleep(tp, &lbolt, TTOPRI | PCATCH, ttybg, 0);
764 			if (error)
765 				return (error);
766 		}
767 		break;
768 	}
769 
770 	switch (cmd) {			/* Process the ioctl. */
771 	case FIOASYNC:			/* set/clear async i/o */
772 		s = spltty();
773 		if (*(int *)data)
774 			SET(tp->t_state, TS_ASYNC);
775 		else
776 			CLR(tp->t_state, TS_ASYNC);
777 		splx(s);
778 		break;
779 	case FIONBIO:			/* set/clear non-blocking i/o */
780 		break;			/* XXX: delete. */
781 	case FIONREAD:			/* get # bytes to read */
782 		*(int *)data = ttnread(tp);
783 		break;
784 	case TIOCEXCL:			/* set exclusive use of tty */
785 		s = spltty();
786 		SET(tp->t_state, TS_XCLUDE);
787 		splx(s);
788 		break;
789 	case TIOCFLUSH: {		/* flush buffers */
790 		int flags = *(int *)data;
791 
792 		if (flags == 0)
793 			flags = FREAD | FWRITE;
794 		else
795 			flags &= FREAD | FWRITE;
796 		ttyflush(tp, flags);
797 		break;
798 	}
799 	case TIOCCONS:			/* become virtual console */
800 		if (*(int *)data) {
801 			if (constty && constty != tp &&
802 			    ISSET(constty->t_state, TS_CARR_ON | TS_ISOPEN) ==
803 			    (TS_CARR_ON | TS_ISOPEN))
804 				return (EBUSY);
805 #ifndef	UCONSOLE
806 			if ((error = suser(p->p_ucred, &p->p_acflag)) != 0)
807 				return (error);
808 #endif
809 			constty = tp;
810 		} else if (tp == constty)
811 			constty = NULL;
812 		break;
813 	case TIOCDRAIN:			/* wait till output drained */
814 		if ((error = ttywait(tp)) != 0)
815 			return (error);
816 		break;
817 	case TIOCGETA: {		/* get termios struct */
818 		struct termios *t = (struct termios *)data;
819 
820 		memcpy(t, &tp->t_termios, sizeof(struct termios));
821 		break;
822 	}
823 	case TIOCGETD:			/* get line discipline */
824 		*(int *)data = tp->t_linesw->l_no;
825 		break;
826 	case TIOCGLINED:
827 		strncpy((char *)data, tp->t_linesw->l_name,
828 			TTLINEDNAMELEN);
829 		break;
830 	case TIOCGWINSZ:		/* get window size */
831 		*(struct winsize *)data = tp->t_winsize;
832 		break;
833 	case TIOCGPGRP:			/* get pgrp of tty */
834 		if (!isctty(p, tp))
835 			return (ENOTTY);
836 		*(int *)data = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PID;
837 		break;
838 	case TIOCGSID:			/* get sid of tty */
839 		if (!isctty(p, tp))
840 			return (ENOTTY);
841 		*(int *)data = tp->t_session->s_sid;
842 		break;
843 #ifdef TIOCHPCL
844 	case TIOCHPCL:			/* hang up on last close */
845 		s = spltty();
846 		SET(tp->t_cflag, HUPCL);
847 		splx(s);
848 		break;
849 #endif
850 	case TIOCNXCL:			/* reset exclusive use of tty */
851 		s = spltty();
852 		CLR(tp->t_state, TS_XCLUDE);
853 		splx(s);
854 		break;
855 	case TIOCOUTQ:			/* output queue size */
856 		*(int *)data = tp->t_outq.c_cc;
857 		break;
858 	case TIOCSETA:			/* set termios struct */
859 	case TIOCSETAW:			/* drain output, set */
860 	case TIOCSETAF: {		/* drn out, fls in, set */
861 		struct termios *t = (struct termios *)data;
862 
863 		s = spltty();
864 		if (cmd == TIOCSETAW || cmd == TIOCSETAF) {
865 			if ((error = ttywait(tp)) != 0) {
866 				splx(s);
867 				return (error);
868 			}
869 			if (cmd == TIOCSETAF)
870 				ttyflush(tp, FREAD);
871 		}
872 		if (!ISSET(t->c_cflag, CIGNORE)) {
873 			/*
874 			 * Set device hardware.
875 			 */
876 			if (tp->t_param && (error = (*tp->t_param)(tp, t))) {
877 				splx(s);
878 				return (error);
879 			} else {
880 				tp->t_cflag = t->c_cflag;
881 				tp->t_ispeed = t->c_ispeed;
882 				tp->t_ospeed = t->c_ospeed;
883 				if (t->c_ospeed == 0 && tp->t_session &&
884 				    tp->t_session->s_leader)
885 					psignal(tp->t_session->s_leader,
886 					    SIGHUP);
887 			}
888 			ttsetwater(tp);
889 		}
890 		if (cmd != TIOCSETAF) {
891 			if (ISSET(t->c_lflag, ICANON) !=
892 			    ISSET(tp->t_lflag, ICANON)) {
893 				if (ISSET(t->c_lflag, ICANON)) {
894 					SET(tp->t_lflag, PENDIN);
895 					ttwakeup(tp);
896 				} else {
897 					struct clist tq;
898 
899 					catq(&tp->t_rawq, &tp->t_canq);
900 					tq = tp->t_rawq;
901 					tp->t_rawq = tp->t_canq;
902 					tp->t_canq = tq;
903 					CLR(tp->t_lflag, PENDIN);
904 				}
905 			}
906 		}
907 		tp->t_iflag = t->c_iflag;
908 		tp->t_oflag = t->c_oflag;
909 		/*
910 		 * Make the EXTPROC bit read only.
911 		 */
912 		if (ISSET(tp->t_lflag, EXTPROC))
913 			SET(t->c_lflag, EXTPROC);
914 		else
915 			CLR(t->c_lflag, EXTPROC);
916 		tp->t_lflag = t->c_lflag | ISSET(tp->t_lflag, PENDIN);
917 		memcpy(tp->t_cc, t->c_cc, sizeof(t->c_cc));
918 		splx(s);
919 		break;
920 	}
921 	case TIOCSETD: {		/* set line discipline */
922 		int t = *(int *)data;
923 
924 		if ((u_int)t >= nlinesw)
925 			return (ENXIO);
926 		lp = linesw[t];
927 		goto setldisc;
928 	}
929 	case TIOCSLINED: {		/* set line discipline */
930 		char *name = (char *)data;
931 		dev_t device;
932 
933 		/* Null terminate to prevent buffer overflow */
934 		name[TTLINEDNAMELEN] = 0;
935 		lp = ttyldisc_lookup(name);
936 
937  setldisc:
938 		if (lp == NULL)
939 			return (ENXIO);
940 
941 		if (lp != tp->t_linesw) {
942 			device = tp->t_dev;
943 			s = spltty();
944 			(*tp->t_linesw->l_close)(tp, flag);
945 			error = (*lp->l_open)(device, tp);
946 			if (error) {
947 				(void)(*tp->t_linesw->l_open)(device, tp);
948 				splx(s);
949 				return (error);
950 			}
951 			tp->t_linesw = lp;
952 			splx(s);
953 		}
954 		break;
955 	}
956 	case TIOCSTART:			/* start output, like ^Q */
957 		s = spltty();
958 		if (ISSET(tp->t_state, TS_TTSTOP) ||
959 		    ISSET(tp->t_lflag, FLUSHO)) {
960 			CLR(tp->t_lflag, FLUSHO);
961 			CLR(tp->t_state, TS_TTSTOP);
962 			ttstart(tp);
963 		}
964 		splx(s);
965 		break;
966 	case TIOCSTI:			/* simulate terminal input */
967 		if (p->p_ucred->cr_uid && (flag & FREAD) == 0)
968 			return (EPERM);
969 		if (p->p_ucred->cr_uid && !isctty(p, tp))
970 			return (EACCES);
971 		(*tp->t_linesw->l_rint)(*(u_char *)data, tp);
972 		break;
973 	case TIOCSTOP:			/* stop output, like ^S */
974 		s = spltty();
975 		if (!ISSET(tp->t_state, TS_TTSTOP)) {
976 			SET(tp->t_state, TS_TTSTOP);
977 			(*cdevsw[major(tp->t_dev)].d_stop)(tp, 0);
978 		}
979 		splx(s);
980 		break;
981 	case TIOCSCTTY:			/* become controlling tty */
982 		/* Session ctty vnode pointer set in vnode layer. */
983 		if (!SESS_LEADER(p) ||
984 		    ((p->p_session->s_ttyvp || tp->t_session) &&
985 		     (tp->t_session != p->p_session)))
986 			return (EPERM);
987 		tp->t_session = p->p_session;
988 		tp->t_pgrp = p->p_pgrp;
989 		p->p_session->s_ttyp = tp;
990 		p->p_flag |= P_CONTROLT;
991 		break;
992 	case TIOCSPGRP: {		/* set pgrp of tty */
993 		struct pgrp *pgrp = pgfind(*(int *)data);
994 
995 		if (!isctty(p, tp))
996 			return (ENOTTY);
997 		else if (pgrp == NULL)
998 			return (EINVAL);
999 		else if (pgrp->pg_session != p->p_session)
1000 			return (EPERM);
1001 		tp->t_pgrp = pgrp;
1002 		break;
1003 	}
1004 	case TIOCSTAT:			/* get load avg stats */
1005 		ttyinfo(tp);
1006 		break;
1007 	case TIOCSWINSZ:		/* set window size */
1008 		if (memcmp((caddr_t)&tp->t_winsize, data,
1009 		    sizeof(struct winsize))) {
1010 			tp->t_winsize = *(struct winsize *)data;
1011 			pgsignal(tp->t_pgrp, SIGWINCH, 1);
1012 		}
1013 		break;
1014 	default:
1015 #ifdef COMPAT_OLDTTY
1016 		return (ttcompat(tp, cmd, data, flag, p));
1017 #else
1018 		return (-1);
1019 #endif
1020 	}
1021 	return (0);
1022 }
1023 
1024 int
1025 ttpoll(struct tty *tp, int events, struct proc *p)
1026 {
1027 	int	revents, s;
1028 
1029 	revents = 0;
1030 	s = spltty();
1031 	if (events & (POLLIN | POLLRDNORM))
1032 		if (ttnread(tp) > 0)
1033 			revents |= events & (POLLIN | POLLRDNORM);
1034 
1035 	if (events & (POLLOUT | POLLWRNORM))
1036 		if (tp->t_outq.c_cc <= tp->t_lowat)
1037 			revents |= events & (POLLOUT | POLLWRNORM);
1038 
1039 	if (events & POLLHUP)
1040 		if (!CONNECTED(tp))
1041 			revents |= POLLHUP;
1042 
1043 	if (revents == 0) {
1044 		if (events & (POLLIN | POLLHUP | POLLRDNORM))
1045 			selrecord(p, &tp->t_rsel);
1046 
1047 		if (events & (POLLOUT | POLLWRNORM))
1048 			selrecord(p, &tp->t_wsel);
1049 	}
1050 
1051 	splx(s);
1052 	return (revents);
1053 }
1054 
1055 static int
1056 ttnread(struct tty *tp)
1057 {
1058 	int	nread;
1059 
1060 	if (ISSET(tp->t_lflag, PENDIN))
1061 		ttypend(tp);
1062 	nread = tp->t_canq.c_cc;
1063 	if (!ISSET(tp->t_lflag, ICANON)) {
1064 		nread += tp->t_rawq.c_cc;
1065 		if (nread < tp->t_cc[VMIN] && !tp->t_cc[VTIME])
1066 			nread = 0;
1067 	}
1068 	return (nread);
1069 }
1070 
1071 /*
1072  * Wait for output to drain.
1073  */
1074 int
1075 ttywait(tp)
1076 	struct tty *tp;
1077 {
1078 	int	error, s;
1079 
1080 	error = 0;
1081 	s = spltty();
1082 	while ((tp->t_outq.c_cc || ISSET(tp->t_state, TS_BUSY)) &&
1083 	    CONNECTED(tp) && tp->t_oproc) {
1084 		(*tp->t_oproc)(tp);
1085 		SET(tp->t_state, TS_ASLEEP);
1086 		error = ttysleep(tp, &tp->t_outq, TTOPRI | PCATCH, ttyout, 0);
1087 		if (error)
1088 			break;
1089 	}
1090 	splx(s);
1091 	return (error);
1092 }
1093 
1094 /*
1095  * Flush if successfully wait.
1096  */
1097 int
1098 ttywflush(struct tty *tp)
1099 {
1100 	int	error;
1101 
1102 	if ((error = ttywait(tp)) == 0)
1103 		ttyflush(tp, FREAD);
1104 	return (error);
1105 }
1106 
1107 /*
1108  * Flush tty read and/or write queues, notifying anyone waiting.
1109  */
1110 void
1111 ttyflush(struct tty *tp, int rw)
1112 {
1113 	int	s;
1114 
1115 	s = spltty();
1116 	if (rw & FREAD) {
1117 		FLUSHQ(&tp->t_canq);
1118 		FLUSHQ(&tp->t_rawq);
1119 		tp->t_rocount = 0;
1120 		tp->t_rocol = 0;
1121 		CLR(tp->t_state, TS_LOCAL);
1122 		ttwakeup(tp);
1123 	}
1124 	if (rw & FWRITE) {
1125 		CLR(tp->t_state, TS_TTSTOP);
1126 		(*cdevsw[major(tp->t_dev)].d_stop)(tp, rw);
1127 		FLUSHQ(&tp->t_outq);
1128 		wakeup((caddr_t)&tp->t_outq);
1129 		selwakeup(&tp->t_wsel);
1130 	}
1131 	splx(s);
1132 }
1133 
1134 /*
1135  * Copy in the default termios characters.
1136  */
1137 void
1138 ttychars(struct tty *tp)
1139 {
1140 
1141 	memcpy(tp->t_cc, ttydefchars, sizeof(ttydefchars));
1142 }
1143 
1144 /*
1145  * Send stop character on input overflow.
1146  */
1147 static void
1148 ttyblock(struct tty *tp)
1149 {
1150 	int	total;
1151 
1152 	total = tp->t_rawq.c_cc + tp->t_canq.c_cc;
1153 	if (tp->t_rawq.c_cc > TTYHOG) {
1154 		ttyflush(tp, FREAD | FWRITE);
1155 		CLR(tp->t_state, TS_TBLOCK);
1156 	}
1157 	/*
1158 	 * Block further input iff: current input > threshold
1159 	 * AND input is available to user program.
1160 	 */
1161 	if (total >= TTYHOG / 2 &&
1162 	    !ISSET(tp->t_state, TS_TBLOCK) &&
1163 	    (!ISSET(tp->t_lflag, ICANON) || tp->t_canq.c_cc > 0)) {
1164 		if (ISSET(tp->t_iflag, IXOFF) &&
1165 		    tp->t_cc[VSTOP] != _POSIX_VDISABLE &&
1166 		    putc(tp->t_cc[VSTOP], &tp->t_outq) == 0) {
1167 			SET(tp->t_state, TS_TBLOCK);
1168 			ttstart(tp);
1169 		}
1170 		/* Try to block remote output via hardware flow control. */
1171 		if (ISSET(tp->t_cflag, CHWFLOW) && tp->t_hwiflow &&
1172 		    (*tp->t_hwiflow)(tp, 1) != 0)
1173 			SET(tp->t_state, TS_TBLOCK);
1174 	}
1175 }
1176 
1177 void
1178 ttrstrt(void *tp_arg)
1179 {
1180 	struct tty	*tp;
1181 	int		s;
1182 
1183 #ifdef DIAGNOSTIC
1184 	if (tp_arg == NULL)
1185 		panic("ttrstrt");
1186 #endif
1187 	tp = tp_arg;
1188 	s = spltty();
1189 
1190 	CLR(tp->t_state, TS_TIMEOUT);
1191 	ttstart(tp);
1192 
1193 	splx(s);
1194 }
1195 
1196 int
1197 ttstart(struct tty *tp)
1198 {
1199 
1200 	if (tp->t_oproc != NULL)	/* XXX: Kludge for pty. */
1201 		(*tp->t_oproc)(tp);
1202 	return (0);
1203 }
1204 
1205 /*
1206  * "close" a line discipline
1207  */
1208 int
1209 ttylclose(struct tty *tp, int flag)
1210 {
1211 
1212 	if (flag & FNONBLOCK)
1213 		ttyflush(tp, FREAD | FWRITE);
1214 	else
1215 		ttywflush(tp);
1216 	return (0);
1217 }
1218 
1219 /*
1220  * Handle modem control transition on a tty.
1221  * Flag indicates new state of carrier.
1222  * Returns 0 if the line should be turned off, otherwise 1.
1223  */
1224 int
1225 ttymodem(struct tty *tp, int flag)
1226 {
1227 
1228 	if (flag == 0) {
1229 		if (ISSET(tp->t_state, TS_CARR_ON)) {
1230 			/*
1231 			 * Lost carrier.
1232 			 */
1233 			CLR(tp->t_state, TS_CARR_ON);
1234 			if (ISSET(tp->t_state, TS_ISOPEN) && !CONNECTED(tp)) {
1235 				if (tp->t_session && tp->t_session->s_leader)
1236 					psignal(tp->t_session->s_leader, SIGHUP);
1237 				ttyflush(tp, FREAD | FWRITE);
1238 				return (0);
1239 			}
1240 		}
1241 	} else {
1242 		if (!ISSET(tp->t_state, TS_CARR_ON)) {
1243 			/*
1244 			 * Carrier now on.
1245 			 */
1246 			SET(tp->t_state, TS_CARR_ON);
1247 			ttwakeup(tp);
1248 		}
1249 	}
1250 	return (1);
1251 }
1252 
1253 /*
1254  * Default modem control routine (for other line disciplines).
1255  * Return argument flag, to turn off device on carrier drop.
1256  */
1257 int
1258 nullmodem(struct tty *tp, int flag)
1259 {
1260 
1261 	if (flag)
1262 		SET(tp->t_state, TS_CARR_ON);
1263 	else {
1264 		CLR(tp->t_state, TS_CARR_ON);
1265 		if (!CONNECTED(tp)) {
1266 			if (tp->t_session && tp->t_session->s_leader)
1267 				psignal(tp->t_session->s_leader, SIGHUP);
1268 			return (0);
1269 		}
1270 	}
1271 	return (1);
1272 }
1273 
1274 /*
1275  * Reinput pending characters after state switch
1276  * call at spltty().
1277  */
1278 void
1279 ttypend(struct tty *tp)
1280 {
1281 	struct clist	tq;
1282 	int		c;
1283 
1284 	CLR(tp->t_lflag, PENDIN);
1285 	SET(tp->t_state, TS_TYPEN);
1286 	tq = tp->t_rawq;
1287 	tp->t_rawq.c_cc = 0;
1288 	tp->t_rawq.c_cf = tp->t_rawq.c_cl = 0;
1289 	while ((c = getc(&tq)) >= 0)
1290 		ttyinput(c, tp);
1291 	CLR(tp->t_state, TS_TYPEN);
1292 }
1293 
1294 /*
1295  * Process a read call on a tty device.
1296  */
1297 int
1298 ttread(struct tty *tp, struct uio *uio, int flag)
1299 {
1300 	struct clist	*qp;
1301 	u_char		*cc;
1302 	struct proc	*p;
1303 	int		c, s, first, error, has_stime, last_cc;
1304 	long		lflag, slp;
1305 	struct timeval	stime;
1306 
1307 	cc = tp->t_cc;
1308 	p = curproc;
1309 	error = 0;
1310 	has_stime = 0;
1311 	last_cc = 0;
1312 	slp = 0;
1313 
1314  loop:
1315 	lflag = tp->t_lflag;
1316 	s = spltty();
1317 	/*
1318 	 * take pending input first
1319 	 */
1320 	if (ISSET(lflag, PENDIN))
1321 		ttypend(tp);
1322 	splx(s);
1323 
1324 	/*
1325 	 * Hang process if it's in the background.
1326 	 */
1327 	if (isbackground(p, tp)) {
1328 		if (sigismember(&p->p_sigctx.ps_sigignore, SIGTTIN) ||
1329 		    sigismember(&p->p_sigctx.ps_sigmask, SIGTTIN) ||
1330 		    p->p_flag & P_PPWAIT || p->p_pgrp->pg_jobc == 0)
1331 			return (EIO);
1332 		pgsignal(p->p_pgrp, SIGTTIN, 1);
1333 		error = ttysleep(tp, &lbolt, TTIPRI | PCATCH, ttybg, 0);
1334 		if (error)
1335 			return (error);
1336 		goto loop;
1337 	}
1338 
1339 	s = spltty();
1340 	if (!ISSET(lflag, ICANON)) {
1341 		int m = cc[VMIN];
1342 		long t = cc[VTIME];
1343 
1344 		qp = &tp->t_rawq;
1345 		/*
1346 		 * Check each of the four combinations.
1347 		 * (m > 0 && t == 0) is the normal read case.
1348 		 * It should be fairly efficient, so we check that and its
1349 		 * companion case (m == 0 && t == 0) first.
1350 		 * For the other two cases, we compute the target sleep time
1351 		 * into slp.
1352 		 */
1353 		if (t == 0) {
1354 			if (qp->c_cc < m)
1355 				goto sleep;
1356 			goto read;
1357 		}
1358 		t *= 100000;		/* time in us */
1359 #define	diff(t1, t2) (((t1).tv_sec - (t2).tv_sec) * 1000000 + \
1360 			 ((t1).tv_usec - (t2).tv_usec))
1361 		if (m > 0) {
1362 			if (qp->c_cc <= 0)
1363 				goto sleep;
1364 			if (qp->c_cc >= m)
1365 				goto read;
1366 			if (!has_stime) {
1367 				/* first character, start timer */
1368 				has_stime = 1;
1369 				stime = time;
1370 				slp = t;
1371 			} else if (qp->c_cc > last_cc) {
1372 				/* got a character, restart timer */
1373 				stime = time;
1374 				slp = t;
1375 			} else {
1376 				/* nothing, check expiration */
1377 				slp = t - diff(time, stime);
1378 			}
1379 		} else {	/* m == 0 */
1380 			if (qp->c_cc > 0)
1381 				goto read;
1382 			if (!has_stime) {
1383 				has_stime = 1;
1384 				stime = time;
1385 				slp = t;
1386 			} else
1387 				slp = t - diff(time, stime);
1388 		}
1389 		last_cc = qp->c_cc;
1390 #undef diff
1391 		if (slp > 0) {
1392 			/*
1393 			 * Rounding down may make us wake up just short
1394 			 * of the target, so we round up.
1395 			 * The formula is ceiling(slp * hz/1000000).
1396 			 * 32-bit arithmetic is enough for hz < 169.
1397 			 *
1398 			 * Also, use plain wakeup() not ttwakeup().
1399 			 */
1400 			slp = (long) (((u_long)slp * hz) + 999999) / 1000000;
1401 			goto sleep;
1402 		}
1403 	} else if ((qp = &tp->t_canq)->c_cc <= 0) {
1404 		int	carrier;
1405 
1406  sleep:
1407 		/*
1408 		 * If there is no input, sleep on rawq
1409 		 * awaiting hardware receipt and notification.
1410 		 * If we have data, we don't need to check for carrier.
1411 		 */
1412 		carrier = CONNECTED(tp);
1413 		if (!carrier && ISSET(tp->t_state, TS_ISOPEN)) {
1414 			splx(s);
1415 			return (0);	/* EOF */
1416 		}
1417 		if (flag & IO_NDELAY) {
1418 			splx(s);
1419 			return (EWOULDBLOCK);
1420 		}
1421 		error = ttysleep(tp, &tp->t_rawq, TTIPRI | PCATCH,
1422 		    carrier ? ttyin : ttopen, slp);
1423 		splx(s);
1424 		/* VMIN == 0: any quantity read satisfies */
1425 		if (cc[VMIN] == 0 && error == EWOULDBLOCK)
1426 			return (0);
1427 		if (error && error != EWOULDBLOCK)
1428 			return (error);
1429 		goto loop;
1430 	}
1431  read:
1432 	splx(s);
1433 
1434 	/*
1435 	 * Input present, check for input mapping and processing.
1436 	 */
1437 	first = 1;
1438 	while ((c = getc(qp)) >= 0) {
1439 		/*
1440 		 * delayed suspend (^Y)
1441 		 */
1442 		if (CCEQ(cc[VDSUSP], c) &&
1443 		    ISSET(lflag, IEXTEN|ISIG) == (IEXTEN|ISIG)) {
1444 			pgsignal(tp->t_pgrp, SIGTSTP, 1);
1445 			if (first) {
1446 				error = ttysleep(tp, &lbolt,
1447 						 TTIPRI | PCATCH, ttybg, 0);
1448 				if (error)
1449 					break;
1450 				goto loop;
1451 			}
1452 			break;
1453 		}
1454 		/*
1455 		 * Interpret EOF only in canonical mode.
1456 		 */
1457 		if (CCEQ(cc[VEOF], c) && ISSET(lflag, ICANON))
1458 			break;
1459 		/*
1460 		 * Give user character.
1461 		 */
1462  		error = ureadc(c, uio);
1463 		if (error)
1464 			break;
1465  		if (uio->uio_resid == 0)
1466 			break;
1467 		/*
1468 		 * In canonical mode check for a "break character"
1469 		 * marking the end of a "line of input".
1470 		 */
1471 		if (ISSET(lflag, ICANON) && TTBREAKC(c, lflag))
1472 			break;
1473 		first = 0;
1474 	}
1475 	/*
1476 	 * Look to unblock output now that (presumably)
1477 	 * the input queue has gone down.
1478 	 */
1479 	s = spltty();
1480 	if (ISSET(tp->t_state, TS_TBLOCK) && tp->t_rawq.c_cc < TTYHOG/5) {
1481 		if (ISSET(tp->t_iflag, IXOFF) &&
1482 		    cc[VSTART] != _POSIX_VDISABLE &&
1483 		    putc(cc[VSTART], &tp->t_outq) == 0) {
1484 			CLR(tp->t_state, TS_TBLOCK);
1485 			ttstart(tp);
1486 		}
1487 		/* Try to unblock remote output via hardware flow control. */
1488 		if (ISSET(tp->t_cflag, CHWFLOW) && tp->t_hwiflow &&
1489 		    (*tp->t_hwiflow)(tp, 0) != 0)
1490 			CLR(tp->t_state, TS_TBLOCK);
1491 	}
1492 	splx(s);
1493 	return (error);
1494 }
1495 
1496 /*
1497  * Check the output queue on tp for space for a kernel message (from uprintf
1498  * or tprintf).  Allow some space over the normal hiwater mark so we don't
1499  * lose messages due to normal flow control, but don't let the tty run amok.
1500  * Sleeps here are not interruptible, but we return prematurely if new signals
1501  * arrive.
1502  */
1503 int
1504 ttycheckoutq(struct tty *tp, int wait)
1505 {
1506 	int	hiwat, s, error;
1507 
1508 	hiwat = tp->t_hiwat;
1509 	s = spltty();
1510 	if (tp->t_outq.c_cc > hiwat + 200)
1511 		while (tp->t_outq.c_cc > hiwat) {
1512 			ttstart(tp);
1513 			if (wait == 0) {
1514 				splx(s);
1515 				return (0);
1516 			}
1517 			callout_reset(&tp->t_outq_ch, hz,
1518 			    (void (*)__P((void *)))wakeup, &tp->t_outq);
1519 			SET(tp->t_state, TS_ASLEEP);
1520 			error = tsleep(&tp->t_outq, (PZERO - 1) | PCATCH,
1521 			    "ttckoutq", 0);
1522 			if (error == EINTR)
1523 				wait = 0;
1524 		}
1525 	splx(s);
1526 	return (1);
1527 }
1528 
1529 /*
1530  * Process a write call on a tty device.
1531  */
1532 int
1533 ttwrite(struct tty *tp, struct uio *uio, int flag)
1534 {
1535 	u_char		*cp;
1536 	struct proc	*p;
1537 	int		cc, ce, i, hiwat, cnt, error, s;
1538 	u_char		obuf[OBUFSIZ];
1539 
1540 	cp = NULL;
1541 	hiwat = tp->t_hiwat;
1542 	cnt = uio->uio_resid;
1543 	error = 0;
1544 	cc = 0;
1545  loop:
1546 	s = spltty();
1547 	if (!CONNECTED(tp)) {
1548 		if (ISSET(tp->t_state, TS_ISOPEN)) {
1549 			splx(s);
1550 			return (EIO);
1551 		} else if (flag & IO_NDELAY) {
1552 			splx(s);
1553 			error = EWOULDBLOCK;
1554 			goto out;
1555 		} else {
1556 			/* Sleep awaiting carrier. */
1557 			error = ttysleep(tp,
1558 			    &tp->t_rawq, TTIPRI | PCATCH, ttopen, 0);
1559 			splx(s);
1560 			if (error)
1561 				goto out;
1562 			goto loop;
1563 		}
1564 	}
1565 	splx(s);
1566 	/*
1567 	 * Hang the process if it's in the background.
1568 	 */
1569 	p = curproc;
1570 	if (isbackground(p, tp) &&
1571 	    ISSET(tp->t_lflag, TOSTOP) && (p->p_flag & P_PPWAIT) == 0 &&
1572 	    !sigismember(&p->p_sigctx.ps_sigignore, SIGTTOU) &&
1573 	    !sigismember(&p->p_sigctx.ps_sigmask, SIGTTOU)) {
1574 		if (p->p_pgrp->pg_jobc == 0) {
1575 			error = EIO;
1576 			goto out;
1577 		}
1578 		pgsignal(p->p_pgrp, SIGTTOU, 1);
1579 		error = ttysleep(tp, &lbolt, TTIPRI | PCATCH, ttybg, 0);
1580 		if (error)
1581 			goto out;
1582 		goto loop;
1583 	}
1584 	/*
1585 	 * Process the user's data in at most OBUFSIZ chunks.  Perform any
1586 	 * output translation.  Keep track of high water mark, sleep on
1587 	 * overflow awaiting device aid in acquiring new space.
1588 	 */
1589 	while (uio->uio_resid > 0 || cc > 0) {
1590 		if (ISSET(tp->t_lflag, FLUSHO)) {
1591 			uio->uio_resid = 0;
1592 			return (0);
1593 		}
1594 		if (tp->t_outq.c_cc > hiwat)
1595 			goto ovhiwat;
1596 		/*
1597 		 * Grab a hunk of data from the user, unless we have some
1598 		 * leftover from last time.
1599 		 */
1600 		if (cc == 0) {
1601 			cc = min(uio->uio_resid, OBUFSIZ);
1602 			cp = obuf;
1603 			error = uiomove(cp, cc, uio);
1604 			if (error) {
1605 				cc = 0;
1606 				break;
1607 			}
1608 		}
1609 		/*
1610 		 * If nothing fancy need be done, grab those characters we
1611 		 * can handle without any of ttyoutput's processing and
1612 		 * just transfer them to the output q.  For those chars
1613 		 * which require special processing (as indicated by the
1614 		 * bits in char_type), call ttyoutput.  After processing
1615 		 * a hunk of data, look for FLUSHO so ^O's will take effect
1616 		 * immediately.
1617 		 */
1618 		while (cc > 0) {
1619 			if (!ISSET(tp->t_oflag, OPOST))
1620 				ce = cc;
1621 			else {
1622 				ce = cc - scanc((u_int)cc, cp, char_type,
1623 				    CCLASSMASK);
1624 				/*
1625 				 * If ce is zero, then we're processing
1626 				 * a special character through ttyoutput.
1627 				 */
1628 				if (ce == 0) {
1629 					tp->t_rocount = 0;
1630 					if (ttyoutput(*cp, tp) >= 0) {
1631 						/* out of space */
1632 						goto overfull;
1633 					}
1634 					cp++;
1635 					cc--;
1636 					if (ISSET(tp->t_lflag, FLUSHO) ||
1637 					    tp->t_outq.c_cc > hiwat)
1638 						goto ovhiwat;
1639 					continue;
1640 				}
1641 			}
1642 			/*
1643 			 * A bunch of normal characters have been found.
1644 			 * Transfer them en masse to the output queue and
1645 			 * continue processing at the top of the loop.
1646 			 * If there are any further characters in this
1647 			 * <= OBUFSIZ chunk, the first should be a character
1648 			 * requiring special handling by ttyoutput.
1649 			 */
1650 			tp->t_rocount = 0;
1651 			i = b_to_q(cp, ce, &tp->t_outq);
1652 			ce -= i;
1653 			tp->t_column += ce;
1654 			cp += ce, cc -= ce, tk_nout += ce;
1655 			tp->t_outcc += ce;
1656 			if (i > 0) {
1657 				/* out of space */
1658 				goto overfull;
1659 			}
1660 			if (ISSET(tp->t_lflag, FLUSHO) ||
1661 			    tp->t_outq.c_cc > hiwat)
1662 				break;
1663 		}
1664 		ttstart(tp);
1665 	}
1666  out:
1667 	/*
1668 	 * If cc is nonzero, we leave the uio structure inconsistent, as the
1669 	 * offset and iov pointers have moved forward, but it doesn't matter
1670 	 * (the call will either return short or restart with a new uio).
1671 	 */
1672 	uio->uio_resid += cc;
1673 	return (error);
1674 
1675  overfull:
1676 	/*
1677 	 * Since we are using ring buffers, if we can't insert any more into
1678 	 * the output queue, we can assume the ring is full and that someone
1679 	 * forgot to set the high water mark correctly.  We set it and then
1680 	 * proceed as normal.
1681 	 */
1682 	hiwat = tp->t_outq.c_cc - 1;
1683 
1684  ovhiwat:
1685 	ttstart(tp);
1686 	s = spltty();
1687 	/*
1688 	 * This can only occur if FLUSHO is set in t_lflag,
1689 	 * or if ttstart/oproc is synchronous (or very fast).
1690 	 */
1691 	if (tp->t_outq.c_cc <= hiwat) {
1692 		splx(s);
1693 		goto loop;
1694 	}
1695 	if (flag & IO_NDELAY) {
1696 		splx(s);
1697 		uio->uio_resid += cc;
1698 		return (uio->uio_resid == cnt ? EWOULDBLOCK : 0);
1699 	}
1700 	SET(tp->t_state, TS_ASLEEP);
1701 	error = ttysleep(tp, &tp->t_outq, TTOPRI | PCATCH, ttyout, 0);
1702 	splx(s);
1703 	if (error)
1704 		goto out;
1705 	goto loop;
1706 }
1707 
1708 /*
1709  * Rubout one character from the rawq of tp
1710  * as cleanly as possible.
1711  */
1712 void
1713 ttyrub(int c, struct tty *tp)
1714 {
1715 	u_char	*cp;
1716 	int	savecol, tabc, s;
1717 
1718 	if (!ISSET(tp->t_lflag, ECHO) || ISSET(tp->t_lflag, EXTPROC))
1719 		return;
1720 	CLR(tp->t_lflag, FLUSHO);
1721 	if (ISSET(tp->t_lflag, ECHOE)) {
1722 		if (tp->t_rocount == 0) {
1723 			/*
1724 			 * Screwed by ttwrite; retype
1725 			 */
1726 			ttyretype(tp);
1727 			return;
1728 		}
1729 		if (c == ('\t' | TTY_QUOTE) || c == ('\n' | TTY_QUOTE))
1730 			ttyrubo(tp, 2);
1731 		else {
1732 			CLR(c, ~TTY_CHARMASK);
1733 			switch (CCLASS(c)) {
1734 			case ORDINARY:
1735 				ttyrubo(tp, 1);
1736 				break;
1737 			case BACKSPACE:
1738 			case CONTROL:
1739 			case NEWLINE:
1740 			case RETURN:
1741 			case VTAB:
1742 				if (ISSET(tp->t_lflag, ECHOCTL))
1743 					ttyrubo(tp, 2);
1744 				break;
1745 			case TAB:
1746 				if (tp->t_rocount < tp->t_rawq.c_cc) {
1747 					ttyretype(tp);
1748 					return;
1749 				}
1750 				s = spltty();
1751 				savecol = tp->t_column;
1752 				SET(tp->t_state, TS_CNTTB);
1753 				SET(tp->t_lflag, FLUSHO);
1754 				tp->t_column = tp->t_rocol;
1755 				for (cp = firstc(&tp->t_rawq, &tabc); cp;
1756 				    cp = nextc(&tp->t_rawq, cp, &tabc))
1757 					ttyecho(tabc, tp);
1758 				CLR(tp->t_lflag, FLUSHO);
1759 				CLR(tp->t_state, TS_CNTTB);
1760 				splx(s);
1761 
1762 				/* savecol will now be length of the tab. */
1763 				savecol -= tp->t_column;
1764 				tp->t_column += savecol;
1765 				if (savecol > 8)
1766 					savecol = 8;	/* overflow screw */
1767 				while (--savecol >= 0)
1768 					(void)ttyoutput('\b', tp);
1769 				break;
1770 			default:			/* XXX */
1771 #define	PANICSTR	"ttyrub: would panic c = %d, val = %d\n"
1772 				(void)printf(PANICSTR, c, CCLASS(c));
1773 #ifdef notdef
1774 				panic(PANICSTR, c, CCLASS(c));
1775 #endif
1776 			}
1777 		}
1778 	} else if (ISSET(tp->t_lflag, ECHOPRT)) {
1779 		if (!ISSET(tp->t_state, TS_ERASE)) {
1780 			SET(tp->t_state, TS_ERASE);
1781 			(void)ttyoutput('\\', tp);
1782 		}
1783 		ttyecho(c, tp);
1784 	} else
1785 		ttyecho(tp->t_cc[VERASE], tp);
1786 	--tp->t_rocount;
1787 }
1788 
1789 /*
1790  * Back over cnt characters, erasing them.
1791  */
1792 static void
1793 ttyrubo(struct tty *tp, int cnt)
1794 {
1795 
1796 	while (cnt-- > 0) {
1797 		(void)ttyoutput('\b', tp);
1798 		(void)ttyoutput(' ', tp);
1799 		(void)ttyoutput('\b', tp);
1800 	}
1801 }
1802 
1803 /*
1804  * ttyretype --
1805  *	Reprint the rawq line.  Note, it is assumed that c_cc has already
1806  *	been checked.
1807  */
1808 void
1809 ttyretype(struct tty *tp)
1810 {
1811 	u_char	*cp;
1812 	int	s, c;
1813 
1814 	/* Echo the reprint character. */
1815 	if (tp->t_cc[VREPRINT] != _POSIX_VDISABLE)
1816 		ttyecho(tp->t_cc[VREPRINT], tp);
1817 
1818 	(void)ttyoutput('\n', tp);
1819 
1820 	s = spltty();
1821 	for (cp = firstc(&tp->t_canq, &c); cp; cp = nextc(&tp->t_canq, cp, &c))
1822 		ttyecho(c, tp);
1823 	for (cp = firstc(&tp->t_rawq, &c); cp; cp = nextc(&tp->t_rawq, cp, &c))
1824 		ttyecho(c, tp);
1825 	CLR(tp->t_state, TS_ERASE);
1826 	splx(s);
1827 
1828 	tp->t_rocount = tp->t_rawq.c_cc;
1829 	tp->t_rocol = 0;
1830 }
1831 
1832 /*
1833  * Echo a typed character to the terminal.
1834  */
1835 static void
1836 ttyecho(int c, struct tty *tp)
1837 {
1838 
1839 	if (!ISSET(tp->t_state, TS_CNTTB))
1840 		CLR(tp->t_lflag, FLUSHO);
1841 	if ((!ISSET(tp->t_lflag, ECHO) &&
1842 	    (!ISSET(tp->t_lflag, ECHONL) || c != '\n')) ||
1843 	    ISSET(tp->t_lflag, EXTPROC))
1844 		return;
1845 	if (((ISSET(tp->t_lflag, ECHOCTL) &&
1846 	     (ISSET(c, TTY_CHARMASK) <= 037 && c != '\t' && c != '\n')) ||
1847 	    ISSET(c, TTY_CHARMASK) == 0177)) {
1848 		(void)ttyoutput('^', tp);
1849 		CLR(c, ~TTY_CHARMASK);
1850 		if (c == 0177)
1851 			c = '?';
1852 		else
1853 			c += 'A' - 1;
1854 	}
1855 	(void)ttyoutput(c, tp);
1856 }
1857 
1858 /*
1859  * Wake up any readers on a tty.
1860  */
1861 void
1862 ttwakeup(struct tty *tp)
1863 {
1864 
1865 	selwakeup(&tp->t_rsel);
1866 	if (ISSET(tp->t_state, TS_ASYNC))
1867 		pgsignal(tp->t_pgrp, SIGIO, 1);
1868 	wakeup((caddr_t)&tp->t_rawq);
1869 }
1870 
1871 /*
1872  * Look up a code for a specified speed in a conversion table;
1873  * used by drivers to map software speed values to hardware parameters.
1874  */
1875 int
1876 ttspeedtab(int speed, struct speedtab *table)
1877 {
1878 
1879 	for ( ; table->sp_speed != -1; table++)
1880 		if (table->sp_speed == speed)
1881 			return (table->sp_code);
1882 	return (-1);
1883 }
1884 
1885 /*
1886  * Set tty hi and low water marks.
1887  *
1888  * Try to arrange the dynamics so there's about one second
1889  * from hi to low water.
1890  */
1891 void
1892 ttsetwater(struct tty *tp)
1893 {
1894 	int	cps, x;
1895 
1896 #define	CLAMP(x, h, l)	((x) > h ? h : ((x) < l) ? l : (x))
1897 
1898 	cps = tp->t_ospeed / 10;
1899 	tp->t_lowat = x = CLAMP(cps / 2, TTMAXLOWAT, TTMINLOWAT);
1900 	x += cps;
1901 	x = CLAMP(x, TTMAXHIWAT, TTMINHIWAT);
1902 	tp->t_hiwat = roundup(x, CBSIZE);
1903 #undef	CLAMP
1904 }
1905 
1906 /*
1907  * Report on state of foreground process group.
1908  */
1909 void
1910 ttyinfo(struct tty *tp)
1911 {
1912 	struct proc	*p, *pick;
1913 	struct timeval	utime, stime;
1914 	int		tmp;
1915 
1916 	if (ttycheckoutq(tp,0) == 0)
1917 		return;
1918 
1919 	/* Print load average. */
1920 	tmp = (averunnable.ldavg[0] * 100 + FSCALE / 2) >> FSHIFT;
1921 	ttyprintf(tp, "load: %d.%02d ", tmp / 100, tmp % 100);
1922 
1923 	if (tp->t_session == NULL)
1924 		ttyprintf(tp, "not a controlling terminal\n");
1925 	else if (tp->t_pgrp == NULL)
1926 		ttyprintf(tp, "no foreground process group\n");
1927 	else if ((p = tp->t_pgrp->pg_members.lh_first) == 0)
1928 		ttyprintf(tp, "empty foreground process group\n");
1929 	else {
1930 		/* Pick interesting process. */
1931 		for (pick = NULL; p != NULL; p = p->p_pglist.le_next)
1932 			if (proc_compare(pick, p))
1933 				pick = p;
1934 
1935 		ttyprintf(tp, " cmd: %s %d [%s] ", pick->p_comm, pick->p_pid,
1936 		    pick->p_stat == SONPROC ? "running" :
1937 		    pick->p_stat == SRUN ? "runnable" :
1938 		    pick->p_wmesg ? pick->p_wmesg : "iowait");
1939 
1940 		calcru(pick, &utime, &stime, NULL);
1941 
1942 		/* Round up and print user time. */
1943 		utime.tv_usec += 5000;
1944 		if (utime.tv_usec >= 1000000) {
1945 			utime.tv_sec += 1;
1946 			utime.tv_usec -= 1000000;
1947 		}
1948 		ttyprintf(tp, "%ld.%02ldu ", (long int)utime.tv_sec,
1949 		    (long int)utime.tv_usec / 10000);
1950 
1951 		/* Round up and print system time. */
1952 		stime.tv_usec += 5000;
1953 		if (stime.tv_usec >= 1000000) {
1954 			stime.tv_sec += 1;
1955 			stime.tv_usec -= 1000000;
1956 		}
1957 		ttyprintf(tp, "%ld.%02lds ", (long int)stime.tv_sec,
1958 		    (long int)stime.tv_usec / 10000);
1959 
1960 #define	pgtok(a)	(((u_long) ((a) * PAGE_SIZE) / 1024))
1961 		/* Print percentage cpu. */
1962 		tmp = (pick->p_pctcpu * 10000 + FSCALE / 2) >> FSHIFT;
1963 		ttyprintf(tp, "%d%% ", tmp / 100);
1964 
1965 		/* Print resident set size. */
1966 		if (pick->p_stat == SIDL || P_ZOMBIE(pick))
1967 			tmp = 0;
1968 		else {
1969 			struct vmspace *vm = pick->p_vmspace;
1970 			tmp = pgtok(vm_resident_count(vm));
1971 		}
1972 		ttyprintf(tp, "%dk\n", tmp);
1973 	}
1974 	tp->t_rocount = 0;	/* so pending input will be retyped if BS */
1975 }
1976 
1977 /*
1978  * Returns 1 if p2 is "better" than p1
1979  *
1980  * The algorithm for picking the "interesting" process is thus:
1981  *
1982  *	1) Only foreground processes are eligible - implied.
1983  *	2) Runnable processes are favored over anything else.  The runner
1984  *	   with the highest cpu utilization is picked (p_estcpu).  Ties are
1985  *	   broken by picking the highest pid.
1986  *	3) The sleeper with the shortest sleep time is next.  With ties,
1987  *	   we pick out just "short-term" sleepers (P_SINTR == 0).
1988  *	4) Further ties are broken by picking the highest pid.
1989  */
1990 #define	ISRUN(p)	(((p)->p_stat == SRUN) || ((p)->p_stat == SIDL) || \
1991 			 ((p)->p_stat == SONPROC))
1992 #define	TESTAB(a, b)    ((a)<<1 | (b))
1993 #define	ONLYA   2
1994 #define	ONLYB   1
1995 #define	BOTH    3
1996 
1997 static int
1998 proc_compare(struct proc *p1, struct proc *p2)
1999 {
2000 
2001 	if (p1 == NULL)
2002 		return (1);
2003 	/*
2004 	 * see if at least one of them is runnable
2005 	 */
2006 	switch (TESTAB(ISRUN(p1), ISRUN(p2))) {
2007 	case ONLYA:
2008 		return (0);
2009 	case ONLYB:
2010 		return (1);
2011 	case BOTH:
2012 		/*
2013 		 * tie - favor one with highest recent cpu utilization
2014 		 */
2015 		if (p2->p_estcpu > p1->p_estcpu)
2016 			return (1);
2017 		if (p1->p_estcpu > p2->p_estcpu)
2018 			return (0);
2019 		return (p2->p_pid > p1->p_pid);	/* tie - return highest pid */
2020 	}
2021 	/*
2022  	 * weed out zombies
2023 	 */
2024 	switch (TESTAB(P_ZOMBIE(p1), P_ZOMBIE(p2))) {
2025 	case ONLYA:
2026 		return (1);
2027 	case ONLYB:
2028 		return (0);
2029 	case BOTH:
2030 		return (p2->p_pid > p1->p_pid); /* tie - return highest pid */
2031 	}
2032 	/*
2033 	 * pick the one with the smallest sleep time
2034 	 */
2035 	if (p2->p_slptime > p1->p_slptime)
2036 		return (0);
2037 	if (p1->p_slptime > p2->p_slptime)
2038 		return (1);
2039 	/*
2040 	 * favor one sleeping in a non-interruptible sleep
2041 	 */
2042 	if (p1->p_flag & P_SINTR && (p2->p_flag & P_SINTR) == 0)
2043 		return (1);
2044 	if (p2->p_flag & P_SINTR && (p1->p_flag & P_SINTR) == 0)
2045 		return (0);
2046 	return (p2->p_pid > p1->p_pid);		/* tie - return highest pid */
2047 }
2048 
2049 /*
2050  * Output char to tty; console putchar style.
2051  */
2052 int
2053 tputchar(int c, struct tty *tp)
2054 {
2055 	int	s;
2056 
2057 	s = spltty();
2058 	if (ISSET(tp->t_state,
2059 	    TS_CARR_ON | TS_ISOPEN) != (TS_CARR_ON | TS_ISOPEN)) {
2060 		splx(s);
2061 		return (-1);
2062 	}
2063 	if (c == '\n')
2064 		(void)ttyoutput('\r', tp);
2065 	(void)ttyoutput(c, tp);
2066 	ttstart(tp);
2067 	splx(s);
2068 	return (0);
2069 }
2070 
2071 /*
2072  * Sleep on chan, returning ERESTART if tty changed while we napped and
2073  * returning any errors (e.g. EINTR/ETIMEDOUT) reported by tsleep.  If
2074  * the tty is revoked, restarting a pending call will redo validation done
2075  * at the start of the call.
2076  */
2077 int
2078 ttysleep(struct tty *tp, void *chan, int pri, const char *wmesg, int timo)
2079 {
2080 	int	error;
2081 	short	gen;
2082 
2083 	gen = tp->t_gen;
2084 	if ((error = tsleep(chan, pri, wmesg, timo)) != 0)
2085 		return (error);
2086 	return (tp->t_gen == gen ? 0 : ERESTART);
2087 }
2088 
2089 /*
2090  * Initialise the global tty list.
2091  */
2092 void
2093 tty_init(void)
2094 {
2095 	ttyldisc_init();
2096 
2097 	TAILQ_INIT(&ttylist);
2098 	tty_count = 0;
2099 
2100 	pool_init(&tty_pool, sizeof(struct tty), 0, 0, 0, "ttypl",
2101 	    0, pool_page_alloc_nointr, pool_page_free_nointr, M_TTYS);
2102 }
2103 
2104 /*
2105  * Attach a tty to the tty list.
2106  *
2107  * This should be called ONLY once per real tty (including pty's).
2108  * eg, on the sparc, the keyboard and mouse have struct tty's that are
2109  * distinctly NOT usable as tty's, and thus should not be attached to
2110  * the ttylist.  This is why this call is not done from ttymalloc().
2111  *
2112  * Device drivers should attach tty's at a similar time that they are
2113  * ttymalloc()'ed, or, for the case of statically allocated struct tty's
2114  * either in the attach or (first) open routine.
2115  */
2116 void
2117 tty_attach(struct tty *tp)
2118 {
2119 
2120 	TAILQ_INSERT_TAIL(&ttylist, tp, tty_link);
2121 	++tty_count;
2122 }
2123 
2124 /*
2125  * Remove a tty from the tty list.
2126  */
2127 void
2128 tty_detach(struct tty *tp)
2129 {
2130 
2131 	--tty_count;
2132 #ifdef DIAGNOSTIC
2133 	if (tty_count < 0)
2134 		panic("tty_detach: tty_count < 0");
2135 #endif
2136 	TAILQ_REMOVE(&ttylist, tp, tty_link);
2137 }
2138 
2139 /*
2140  * Allocate a tty structure and its associated buffers.
2141  */
2142 struct tty *
2143 ttymalloc(void)
2144 {
2145 	struct tty	*tp;
2146 
2147 	tp = pool_get(&tty_pool, PR_WAITOK);
2148 	memset(tp, 0, sizeof(*tp));
2149 	callout_init(&tp->t_outq_ch);
2150 	callout_init(&tp->t_rstrt_ch);
2151 	/* XXX: default to 1024 chars for now */
2152 	clalloc(&tp->t_rawq, 1024, 1);
2153 	clalloc(&tp->t_canq, 1024, 1);
2154 	/* output queue doesn't need quoting */
2155 	clalloc(&tp->t_outq, 1024, 0);
2156 	/* Set default line discipline. */
2157 	tp->t_linesw = linesw[0];
2158 	return(tp);
2159 }
2160 
2161 /*
2162  * Free a tty structure and its buffers.
2163  *
2164  * Be sure to call tty_detach() for any tty that has been
2165  * tty_attach()ed.
2166  */
2167 void
2168 ttyfree(struct tty *tp)
2169 {
2170 
2171 	callout_stop(&tp->t_outq_ch);
2172 	callout_stop(&tp->t_rstrt_ch);
2173 	clfree(&tp->t_rawq);
2174 	clfree(&tp->t_canq);
2175 	clfree(&tp->t_outq);
2176 	pool_put(&tty_pool, tp);
2177 }
2178