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