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