tty.c revision 17876
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.82 1996/06/12 05:07:33 gpalmer 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();
1154#if 0
1155again:
1156#endif
1157	if (rw & FWRITE)
1158		CLR(tp->t_state, TS_TTSTOP);
1159#ifdef sun4c						/* XXX */
1160	(*tp->t_stop)(tp, rw);
1161#else
1162	(*cdevsw[major(tp->t_dev)]->d_stop)(tp, rw);
1163#endif
1164	if (rw & FREAD) {
1165		FLUSHQ(&tp->t_canq);
1166		FLUSHQ(&tp->t_rawq);
1167		CLR(tp->t_lflag, PENDIN);
1168		tp->t_rocount = 0;
1169		tp->t_rocol = 0;
1170		CLR(tp->t_state, TS_LOCAL);
1171		ttwakeup(tp);
1172		if (ISSET(tp->t_state, TS_TBLOCK)) {
1173			if (rw & FWRITE)
1174				FLUSHQ(&tp->t_outq);
1175			ttyunblock(tp);
1176
1177			/*
1178			 * Don't let leave any state that might clobber the
1179			 * next line discipline (although we should do more
1180			 * to send the START char).  Not clearing the state
1181			 * may have caused the "putc to a clist with no
1182			 * reserved cblocks" panic/printf.
1183			 */
1184			CLR(tp->t_state, TS_TBLOCK);
1185
1186#if 0 /* forget it, sleeping isn't always safe and we don't know when it is */
1187			if (ISSET(tp->t_iflag, IXOFF)) {
1188				/*
1189				 * XXX wait a bit in the hope that the stop
1190				 * character (if any) will go out.  Waiting
1191				 * isn't good since it allows races.  This
1192				 * will be fixed when the stop character is
1193				 * put in a special queue.  Don't bother with
1194				 * the checks in ttywait() since the timeout
1195				 * will save us.
1196				 */
1197				SET(tp->t_state, TS_SO_OCOMPLETE);
1198				ttysleep(tp, TSA_OCOMPLETE(tp), TTOPRI,
1199					 "ttyfls", hz / 10);
1200				/*
1201				 * Don't try sending the stop character again.
1202				 */
1203				CLR(tp->t_state, TS_TBLOCK);
1204				goto again;
1205			}
1206#endif
1207		}
1208	}
1209	if (rw & FWRITE) {
1210		FLUSHQ(&tp->t_outq);
1211		ttwwakeup(tp);
1212	}
1213	splx(s);
1214}
1215
1216/*
1217 * Copy in the default termios characters.
1218 */
1219void
1220termioschars(t)
1221	struct termios *t;
1222{
1223
1224	bcopy(ttydefchars, t->c_cc, sizeof t->c_cc);
1225}
1226
1227/*
1228 * Old interface.
1229 */
1230void
1231ttychars(tp)
1232	struct tty *tp;
1233{
1234
1235	termioschars(&tp->t_termios);
1236}
1237
1238/*
1239 * Handle input high water.  Send stop character for the IXOFF case.  Turn
1240 * on our input flow control bit and propagate the changes to the driver.
1241 * XXX the stop character should be put in a special high priority queue.
1242 */
1243void
1244ttyblock(tp)
1245	struct tty *tp;
1246{
1247
1248	SET(tp->t_state, TS_TBLOCK);
1249	if (ISSET(tp->t_iflag, IXOFF) && tp->t_cc[VSTOP] != _POSIX_VDISABLE &&
1250	    putc(tp->t_cc[VSTOP], &tp->t_outq) != 0)
1251		CLR(tp->t_state, TS_TBLOCK);	/* try again later */
1252	ttstart(tp);
1253}
1254
1255/*
1256 * Handle input low water.  Send start character for the IXOFF case.  Turn
1257 * off our input flow control bit and propagate the changes to the driver.
1258 * XXX the start character should be put in a special high priority queue.
1259 */
1260static void
1261ttyunblock(tp)
1262	struct tty *tp;
1263{
1264
1265	CLR(tp->t_state, TS_TBLOCK);
1266	if (ISSET(tp->t_iflag, IXOFF) && tp->t_cc[VSTART] != _POSIX_VDISABLE &&
1267	    putc(tp->t_cc[VSTART], &tp->t_outq) != 0)
1268		SET(tp->t_state, TS_TBLOCK);	/* try again later */
1269	ttstart(tp);
1270}
1271
1272#ifdef notyet
1273/* Not used by any current (i386) drivers. */
1274/*
1275 * Restart after an inter-char delay.
1276 */
1277void
1278ttrstrt(tp_arg)
1279	void *tp_arg;
1280{
1281	struct tty *tp;
1282	int s;
1283
1284#ifdef DIAGNOSTIC
1285	if (tp_arg == NULL)
1286		panic("ttrstrt");
1287#endif
1288	tp = tp_arg;
1289	s = spltty();
1290
1291	CLR(tp->t_state, TS_TIMEOUT);
1292	ttstart(tp);
1293
1294	splx(s);
1295}
1296#endif
1297
1298int
1299ttstart(tp)
1300	struct tty *tp;
1301{
1302
1303	if (tp->t_oproc != NULL)	/* XXX: Kludge for pty. */
1304		(*tp->t_oproc)(tp);
1305	return (0);
1306}
1307
1308/*
1309 * "close" a line discipline
1310 */
1311int
1312ttylclose(tp, flag)
1313	struct tty *tp;
1314	int flag;
1315{
1316
1317	if (flag & FNONBLOCK || ttywflush(tp))
1318		ttyflush(tp, FREAD | FWRITE);
1319	return (0);
1320}
1321
1322/*
1323 * Handle modem control transition on a tty.
1324 * Flag indicates new state of carrier.
1325 * Returns 0 if the line should be turned off, otherwise 1.
1326 */
1327int
1328ttymodem(tp, flag)
1329	register struct tty *tp;
1330	int flag;
1331{
1332
1333	if (ISSET(tp->t_state, TS_CARR_ON) && ISSET(tp->t_cflag, MDMBUF)) {
1334		/*
1335		 * MDMBUF: do flow control according to carrier flag
1336		 * XXX TS_CAR_OFLOW doesn't do anything yet.  TS_TTSTOP
1337		 * works if IXON and IXANY are clear.
1338		 */
1339		if (flag) {
1340			CLR(tp->t_state, TS_CAR_OFLOW);
1341			CLR(tp->t_state, TS_TTSTOP);
1342			ttstart(tp);
1343		} else if (!ISSET(tp->t_state, TS_CAR_OFLOW)) {
1344			SET(tp->t_state, TS_CAR_OFLOW);
1345			SET(tp->t_state, TS_TTSTOP);
1346#ifdef sun4c						/* XXX */
1347			(*tp->t_stop)(tp, 0);
1348#else
1349			(*cdevsw[major(tp->t_dev)]->d_stop)(tp, 0);
1350#endif
1351		}
1352	} else if (flag == 0) {
1353		/*
1354		 * Lost carrier.
1355		 */
1356		CLR(tp->t_state, TS_CARR_ON);
1357		if (ISSET(tp->t_state, TS_ISOPEN) &&
1358		    !ISSET(tp->t_cflag, CLOCAL)) {
1359			SET(tp->t_state, TS_ZOMBIE);
1360			CLR(tp->t_state, TS_CONNECTED);
1361			if (tp->t_session && tp->t_session->s_leader)
1362				psignal(tp->t_session->s_leader, SIGHUP);
1363			ttyflush(tp, FREAD | FWRITE);
1364			return (0);
1365		}
1366	} else {
1367		/*
1368		 * Carrier now on.
1369		 */
1370		SET(tp->t_state, TS_CARR_ON);
1371		if (!ISSET(tp->t_state, TS_ZOMBIE))
1372			SET(tp->t_state, TS_CONNECTED);
1373		wakeup(TSA_CARR_ON(tp));
1374		ttwakeup(tp);
1375		ttwwakeup(tp);
1376	}
1377	return (1);
1378}
1379
1380/*
1381 * Reinput pending characters after state switch
1382 * call at spltty().
1383 */
1384static void
1385ttypend(tp)
1386	register struct tty *tp;
1387{
1388	struct clist tq;
1389	register int c;
1390
1391	CLR(tp->t_lflag, PENDIN);
1392	SET(tp->t_state, TS_TYPEN);
1393	/*
1394	 * XXX this assumes too much about clist internals.  It may even
1395	 * fail if the cblock slush pool is empty.  We can't allocate more
1396	 * cblocks here because we are called from an interrupt handler
1397	 * and clist_alloc_cblocks() can wait.
1398	 */
1399	tq = tp->t_rawq;
1400	bzero(&tp->t_rawq, sizeof tp->t_rawq);
1401	tp->t_rawq.c_cbmax = tq.c_cbmax;
1402	tp->t_rawq.c_cbreserved = tq.c_cbreserved;
1403	while ((c = getc(&tq)) >= 0)
1404		ttyinput(c, tp);
1405	CLR(tp->t_state, TS_TYPEN);
1406}
1407
1408/*
1409 * Process a read call on a tty device.
1410 */
1411int
1412ttread(tp, uio, flag)
1413	register struct tty *tp;
1414	struct uio *uio;
1415	int flag;
1416{
1417	register struct clist *qp;
1418	register int c;
1419	register tcflag_t lflag;
1420	register cc_t *cc = tp->t_cc;
1421	register struct proc *p = curproc;
1422	int s, first, error = 0;
1423	int has_stime = 0, last_cc = 0;
1424	long slp = 0;		/* XXX this should be renamed `timo'. */
1425
1426loop:
1427	s = spltty();
1428	lflag = tp->t_lflag;
1429	/*
1430	 * take pending input first
1431	 */
1432	if (ISSET(lflag, PENDIN)) {
1433		ttypend(tp);
1434		splx(s);	/* reduce latency */
1435		s = spltty();
1436		lflag = tp->t_lflag;	/* XXX ttypend() clobbers it */
1437	}
1438
1439	/*
1440	 * Hang process if it's in the background.
1441	 */
1442	if (isbackground(p, tp)) {
1443		splx(s);
1444		if ((p->p_sigignore & sigmask(SIGTTIN)) ||
1445		   (p->p_sigmask & sigmask(SIGTTIN)) ||
1446		    p->p_flag & P_PPWAIT || p->p_pgrp->pg_jobc == 0)
1447			return (EIO);
1448		pgsignal(p->p_pgrp, SIGTTIN, 1);
1449		error = ttysleep(tp, &lbolt, TTIPRI | PCATCH, "ttybg2", 0);
1450		if (error)
1451			return (error);
1452		goto loop;
1453	}
1454
1455	if (ISSET(tp->t_state, TS_ZOMBIE)) {
1456		splx(s);
1457		return (0);	/* EOF */
1458	}
1459
1460	/*
1461	 * If canonical, use the canonical queue,
1462	 * else use the raw queue.
1463	 *
1464	 * (should get rid of clists...)
1465	 */
1466	qp = ISSET(lflag, ICANON) ? &tp->t_canq : &tp->t_rawq;
1467
1468	if (flag & IO_NDELAY) {
1469		if (qp->c_cc > 0)
1470			goto read;
1471		if (!ISSET(lflag, ICANON) && cc[VMIN] == 0) {
1472			splx(s);
1473			return (0);
1474		}
1475		splx(s);
1476		return (EWOULDBLOCK);
1477	}
1478	if (!ISSET(lflag, ICANON)) {
1479		int m = cc[VMIN];
1480		long t = cc[VTIME];
1481		struct timeval stime, timecopy;
1482		int x;
1483
1484		/*
1485		 * Check each of the four combinations.
1486		 * (m > 0 && t == 0) is the normal read case.
1487		 * It should be fairly efficient, so we check that and its
1488		 * companion case (m == 0 && t == 0) first.
1489		 * For the other two cases, we compute the target sleep time
1490		 * into slp.
1491		 */
1492		if (t == 0) {
1493			if (qp->c_cc < m)
1494				goto sleep;
1495			if (qp->c_cc > 0)
1496				goto read;
1497
1498			/* m, t and qp->c_cc are all 0.  0 is enough input. */
1499			splx(s);
1500			return (0);
1501		}
1502		t *= 100000;		/* time in us */
1503#define diff(t1, t2) (((t1).tv_sec - (t2).tv_sec) * 1000000 + \
1504			 ((t1).tv_usec - (t2).tv_usec))
1505		if (m > 0) {
1506			if (qp->c_cc <= 0)
1507				goto sleep;
1508			if (qp->c_cc >= m)
1509				goto read;
1510			x = splclock();
1511			timecopy = time;
1512			splx(x);
1513			if (!has_stime) {
1514				/* first character, start timer */
1515				has_stime = 1;
1516				stime = timecopy;
1517				slp = t;
1518			} else if (qp->c_cc > last_cc) {
1519				/* got a character, restart timer */
1520				stime = timecopy;
1521				slp = t;
1522			} else {
1523				/* nothing, check expiration */
1524				slp = t - diff(timecopy, stime);
1525				if (slp <= 0)
1526					goto read;
1527			}
1528			last_cc = qp->c_cc;
1529		} else {	/* m == 0 */
1530			if (qp->c_cc > 0)
1531				goto read;
1532			x = splclock();
1533			timecopy = time;
1534			splx(x);
1535			if (!has_stime) {
1536				has_stime = 1;
1537				stime = timecopy;
1538				slp = t;
1539			} else {
1540				slp = t - diff(timecopy, stime);
1541				if (slp <= 0) {
1542					/* Timed out, but 0 is enough input. */
1543					splx(s);
1544					return (0);
1545				}
1546			}
1547		}
1548#undef diff
1549		/*
1550		 * Rounding down may make us wake up just short
1551		 * of the target, so we round up.
1552		 * The formula is ceiling(slp * hz/1000000).
1553		 * 32-bit arithmetic is enough for hz < 169.
1554		 * XXX see hzto() for how to avoid overflow if hz
1555		 * is large (divide by `tick' and/or arrange to
1556		 * use hzto() if hz is large).
1557		 */
1558		slp = (long) (((u_long)slp * hz) + 999999) / 1000000;
1559		goto sleep;
1560	}
1561	if (qp->c_cc <= 0) {
1562sleep:
1563		/*
1564		 * There is no input, or not enough input and we can block.
1565		 */
1566		error = ttysleep(tp, TSA_HUP_OR_INPUT(tp), TTIPRI | PCATCH,
1567				 ISSET(tp->t_state, TS_CONNECTED) ?
1568				 "ttyin" : "ttyhup", (int)slp);
1569		splx(s);
1570		if (error == EWOULDBLOCK)
1571			error = 0;
1572		else if (error)
1573			return (error);
1574		/*
1575		 * XXX what happens if another process eats some input
1576		 * while we are asleep (not just here)?  It would be
1577		 * safest to detect changes and reset our state variables
1578		 * (has_stime and last_cc).
1579		 */
1580		slp = 0;
1581		goto loop;
1582	}
1583read:
1584	splx(s);
1585	/*
1586	 * Input present, check for input mapping and processing.
1587	 */
1588	first = 1;
1589	if (ISSET(lflag, ICANON | ISIG))
1590		goto slowcase;
1591	for (;;) {
1592		char ibuf[IBUFSIZ];
1593		int icc;
1594
1595		icc = imin(uio->uio_resid, IBUFSIZ);
1596		icc = q_to_b(qp, ibuf, icc);
1597		if (icc <= 0) {
1598			if (first)
1599				goto loop;
1600			break;
1601		}
1602		error = uiomove(ibuf, icc, uio);
1603		/*
1604		 * XXX if there was an error then we should ungetc() the
1605		 * unmoved chars and reduce icc here.
1606		 */
1607#if NSNP > 0
1608		if (ISSET(tp->t_lflag, ECHO) &&
1609		    ISSET(tp->t_state, TS_SNOOP) && tp->t_sc != NULL)
1610			snpin((struct snoop *)tp->t_sc, ibuf, icc);
1611#endif
1612		if (error)
1613			break;
1614 		if (uio->uio_resid == 0)
1615			break;
1616		first = 0;
1617	}
1618	goto out;
1619slowcase:
1620	for (;;) {
1621		c = getc(qp);
1622		if (c < 0) {
1623			if (first)
1624				goto loop;
1625			break;
1626		}
1627		/*
1628		 * delayed suspend (^Y)
1629		 */
1630		if (CCEQ(cc[VDSUSP], c) && ISSET(lflag, ISIG)) {
1631			pgsignal(tp->t_pgrp, SIGTSTP, 1);
1632			if (first) {
1633				error = ttysleep(tp, &lbolt, TTIPRI | PCATCH,
1634						 "ttybg3", 0);
1635				if (error)
1636					break;
1637				goto loop;
1638			}
1639			break;
1640		}
1641		/*
1642		 * Interpret EOF only in canonical mode.
1643		 */
1644		if (CCEQ(cc[VEOF], c) && ISSET(lflag, ICANON))
1645			break;
1646		/*
1647		 * Give user character.
1648		 */
1649 		error = ureadc(c, uio);
1650		if (error)
1651			/* XXX should ungetc(c, qp). */
1652			break;
1653#if NSNP > 0
1654		/*
1655		 * Only snoop directly on input in echo mode.  Non-echoed
1656		 * input will be snooped later iff the application echoes it.
1657		 */
1658		if (ISSET(tp->t_lflag, ECHO) &&
1659		    ISSET(tp->t_state, TS_SNOOP) && tp->t_sc != NULL)
1660			snpinc((struct snoop *)tp->t_sc, (char)c);
1661#endif
1662 		if (uio->uio_resid == 0)
1663			break;
1664		/*
1665		 * In canonical mode check for a "break character"
1666		 * marking the end of a "line of input".
1667		 */
1668		if (ISSET(lflag, ICANON) && TTBREAKC(c))
1669			break;
1670		first = 0;
1671	}
1672
1673out:
1674	/*
1675	 * Look to unblock input now that (presumably)
1676	 * the input queue has gone down.
1677	 */
1678	s = spltty();
1679	if (ISSET(tp->t_state, TS_TBLOCK) &&
1680	    tp->t_rawq.c_cc + tp->t_canq.c_cc <= I_LOW_WATER)
1681		ttyunblock(tp);
1682	splx(s);
1683
1684	return (error);
1685}
1686
1687/*
1688 * Check the output queue on tp for space for a kernel message (from uprintf
1689 * or tprintf).  Allow some space over the normal hiwater mark so we don't
1690 * lose messages due to normal flow control, but don't let the tty run amok.
1691 * Sleeps here are not interruptible, but we return prematurely if new signals
1692 * arrive.
1693 */
1694int
1695ttycheckoutq(tp, wait)
1696	register struct tty *tp;
1697	int wait;
1698{
1699	int hiwat, s, oldsig;
1700
1701	hiwat = tp->t_hiwat;
1702	s = spltty();
1703	oldsig = wait ? curproc->p_siglist : 0;
1704	if (tp->t_outq.c_cc > hiwat + OBUFSIZ + 100)
1705		while (tp->t_outq.c_cc > hiwat) {
1706			ttstart(tp);
1707			if (tp->t_outq.c_cc <= hiwat)
1708				break;
1709			if (wait == 0 || curproc->p_siglist != oldsig) {
1710				splx(s);
1711				return (0);
1712			}
1713			SET(tp->t_state, TS_SO_OLOWAT);
1714			tsleep(TSA_OLOWAT(tp), PZERO - 1, "ttoutq", hz);
1715		}
1716	splx(s);
1717	return (1);
1718}
1719
1720/*
1721 * Process a write call on a tty device.
1722 */
1723int
1724ttwrite(tp, uio, flag)
1725	register struct tty *tp;
1726	register struct uio *uio;
1727	int flag;
1728{
1729	register char *cp = NULL;
1730	register int cc, ce;
1731	register struct proc *p;
1732	int i, hiwat, cnt, error, s;
1733	char obuf[OBUFSIZ];
1734
1735	hiwat = tp->t_hiwat;
1736	cnt = uio->uio_resid;
1737	error = 0;
1738	cc = 0;
1739loop:
1740	s = spltty();
1741	if (ISSET(tp->t_state, TS_ZOMBIE)) {
1742		splx(s);
1743		if (uio->uio_resid == cnt)
1744			error = EIO;
1745		goto out;
1746	}
1747	if (!ISSET(tp->t_state, TS_CONNECTED)) {
1748		if (flag & IO_NDELAY) {
1749			splx(s);
1750			error = EWOULDBLOCK;
1751			goto out;
1752		}
1753		error = ttysleep(tp, TSA_CARR_ON(tp), TTIPRI | PCATCH,
1754				 "ttydcd", 0);
1755		splx(s);
1756		if (error)
1757			goto out;
1758		goto loop;
1759	}
1760	splx(s);
1761	/*
1762	 * Hang the process if it's in the background.
1763	 */
1764	p = curproc;
1765	if (isbackground(p, tp) &&
1766	    ISSET(tp->t_lflag, TOSTOP) && (p->p_flag & P_PPWAIT) == 0 &&
1767	    (p->p_sigignore & sigmask(SIGTTOU)) == 0 &&
1768	    (p->p_sigmask & sigmask(SIGTTOU)) == 0 &&
1769	     p->p_pgrp->pg_jobc) {
1770		pgsignal(p->p_pgrp, SIGTTOU, 1);
1771		error = ttysleep(tp, &lbolt, TTIPRI | PCATCH, "ttybg4", 0);
1772		if (error)
1773			goto out;
1774		goto loop;
1775	}
1776	/*
1777	 * Process the user's data in at most OBUFSIZ chunks.  Perform any
1778	 * output translation.  Keep track of high water mark, sleep on
1779	 * overflow awaiting device aid in acquiring new space.
1780	 */
1781	while (uio->uio_resid > 0 || cc > 0) {
1782		if (ISSET(tp->t_lflag, FLUSHO)) {
1783			uio->uio_resid = 0;
1784			return (0);
1785		}
1786		if (tp->t_outq.c_cc > hiwat)
1787			goto ovhiwat;
1788		/*
1789		 * Grab a hunk of data from the user, unless we have some
1790		 * leftover from last time.
1791		 */
1792		if (cc == 0) {
1793			cc = imin(uio->uio_resid, OBUFSIZ);
1794			cp = obuf;
1795			error = uiomove(cp, cc, uio);
1796			if (error) {
1797				cc = 0;
1798				break;
1799			}
1800#if NSNP > 0
1801			if (ISSET(tp->t_state, TS_SNOOP) && tp->t_sc != NULL)
1802				snpin((struct snoop *)tp->t_sc, cp, cc);
1803#endif
1804		}
1805		/*
1806		 * If nothing fancy need be done, grab those characters we
1807		 * can handle without any of ttyoutput's processing and
1808		 * just transfer them to the output q.  For those chars
1809		 * which require special processing (as indicated by the
1810		 * bits in char_type), call ttyoutput.  After processing
1811		 * a hunk of data, look for FLUSHO so ^O's will take effect
1812		 * immediately.
1813		 */
1814		while (cc > 0) {
1815			if (!ISSET(tp->t_oflag, OPOST))
1816				ce = cc;
1817			else {
1818				ce = cc - scanc((u_int)cc, (u_char *)cp,
1819				   (u_char *)char_type, CCLASSMASK);
1820				/*
1821				 * If ce is zero, then we're processing
1822				 * a special character through ttyoutput.
1823				 */
1824				if (ce == 0) {
1825					tp->t_rocount = 0;
1826					if (ttyoutput(*cp, tp) >= 0) {
1827						/* No Clists, wait a bit. */
1828						ttstart(tp);
1829						if (flag & IO_NDELAY) {
1830							error = EWOULDBLOCK;
1831							goto out;
1832						}
1833						error = ttysleep(tp, &lbolt,
1834								 TTOPRI|PCATCH,
1835								 "ttybf1", 0);
1836						if (error)
1837							goto out;
1838						goto loop;
1839					}
1840					cp++;
1841					cc--;
1842					if (ISSET(tp->t_lflag, FLUSHO) ||
1843					    tp->t_outq.c_cc > hiwat)
1844						goto ovhiwat;
1845					continue;
1846				}
1847			}
1848			/*
1849			 * A bunch of normal characters have been found.
1850			 * Transfer them en masse to the output queue and
1851			 * continue processing at the top of the loop.
1852			 * If there are any further characters in this
1853			 * <= OBUFSIZ chunk, the first should be a character
1854			 * requiring special handling by ttyoutput.
1855			 */
1856			tp->t_rocount = 0;
1857			i = b_to_q(cp, ce, &tp->t_outq);
1858			ce -= i;
1859			tp->t_column += ce;
1860			cp += ce, cc -= ce, tk_nout += ce;
1861			tp->t_outcc += ce;
1862			if (i > 0) {
1863				/* No Clists, wait a bit. */
1864				ttstart(tp);
1865				if (flag & IO_NDELAY) {
1866					error = EWOULDBLOCK;
1867					goto out;
1868				}
1869				error = ttysleep(tp, &lbolt, TTOPRI | PCATCH,
1870						 "ttybf2", 0);
1871				if (error)
1872					goto out;
1873				goto loop;
1874			}
1875			if (ISSET(tp->t_lflag, FLUSHO) ||
1876			    tp->t_outq.c_cc > hiwat)
1877				break;
1878		}
1879		ttstart(tp);
1880	}
1881out:
1882	/*
1883	 * If cc is nonzero, we leave the uio structure inconsistent, as the
1884	 * offset and iov pointers have moved forward, but it doesn't matter
1885	 * (the call will either return short or restart with a new uio).
1886	 */
1887	uio->uio_resid += cc;
1888	return (error);
1889
1890ovhiwat:
1891	ttstart(tp);
1892	s = spltty();
1893	/*
1894	 * This can only occur if FLUSHO is set in t_lflag,
1895	 * or if ttstart/oproc is synchronous (or very fast).
1896	 */
1897	if (tp->t_outq.c_cc <= hiwat) {
1898		splx(s);
1899		goto loop;
1900	}
1901	if (flag & IO_NDELAY) {
1902		splx(s);
1903		uio->uio_resid += cc;
1904		return (uio->uio_resid == cnt ? EWOULDBLOCK : 0);
1905	}
1906	SET(tp->t_state, TS_SO_OLOWAT);
1907	error = ttysleep(tp, TSA_OLOWAT(tp), TTOPRI | PCATCH, "ttywri",
1908			 tp->t_timeout);
1909	splx(s);
1910	if (error == EWOULDBLOCK)
1911		error = EIO;
1912	if (error)
1913		goto out;
1914	goto loop;
1915}
1916
1917/*
1918 * Rubout one character from the rawq of tp
1919 * as cleanly as possible.
1920 */
1921static void
1922ttyrub(c, tp)
1923	register int c;
1924	register struct tty *tp;
1925{
1926	register char *cp;
1927	register int savecol;
1928	int tabc, s;
1929
1930	if (!ISSET(tp->t_lflag, ECHO) || ISSET(tp->t_lflag, EXTPROC))
1931		return;
1932	CLR(tp->t_lflag, FLUSHO);
1933	if (ISSET(tp->t_lflag, ECHOE)) {
1934		if (tp->t_rocount == 0) {
1935			/*
1936			 * Screwed by ttwrite; retype
1937			 */
1938			ttyretype(tp);
1939			return;
1940		}
1941		if (c == ('\t' | TTY_QUOTE) || c == ('\n' | TTY_QUOTE))
1942			ttyrubo(tp, 2);
1943		else {
1944			CLR(c, ~TTY_CHARMASK);
1945			switch (CCLASS(c)) {
1946			case ORDINARY:
1947				ttyrubo(tp, 1);
1948				break;
1949			case BACKSPACE:
1950			case CONTROL:
1951			case NEWLINE:
1952			case RETURN:
1953			case VTAB:
1954				if (ISSET(tp->t_lflag, ECHOCTL))
1955					ttyrubo(tp, 2);
1956				break;
1957			case TAB:
1958				if (tp->t_rocount < tp->t_rawq.c_cc) {
1959					ttyretype(tp);
1960					return;
1961				}
1962				s = spltty();
1963				savecol = tp->t_column;
1964				SET(tp->t_state, TS_CNTTB);
1965				SET(tp->t_lflag, FLUSHO);
1966				tp->t_column = tp->t_rocol;
1967				cp = tp->t_rawq.c_cf;
1968				if (cp)
1969					tabc = *cp;	/* XXX FIX NEXTC */
1970				for (; cp; cp = nextc(&tp->t_rawq, cp, &tabc))
1971					ttyecho(tabc, tp);
1972				CLR(tp->t_lflag, FLUSHO);
1973				CLR(tp->t_state, TS_CNTTB);
1974				splx(s);
1975
1976				/* savecol will now be length of the tab. */
1977				savecol -= tp->t_column;
1978				tp->t_column += savecol;
1979				if (savecol > 8)
1980					savecol = 8;	/* overflow screw */
1981				while (--savecol >= 0)
1982					(void)ttyoutput('\b', tp);
1983				break;
1984			default:			/* XXX */
1985#define	PANICSTR	"ttyrub: would panic c = %d, val = %d\n"
1986				(void)printf(PANICSTR, c, CCLASS(c));
1987#ifdef notdef
1988				panic(PANICSTR, c, CCLASS(c));
1989#endif
1990			}
1991		}
1992	} else if (ISSET(tp->t_lflag, ECHOPRT)) {
1993		if (!ISSET(tp->t_state, TS_ERASE)) {
1994			SET(tp->t_state, TS_ERASE);
1995			(void)ttyoutput('\\', tp);
1996		}
1997		ttyecho(c, tp);
1998	} else
1999		ttyecho(tp->t_cc[VERASE], tp);
2000	--tp->t_rocount;
2001}
2002
2003/*
2004 * Back over cnt characters, erasing them.
2005 */
2006static void
2007ttyrubo(tp, cnt)
2008	register struct tty *tp;
2009	int cnt;
2010{
2011
2012	while (cnt-- > 0) {
2013		(void)ttyoutput('\b', tp);
2014		(void)ttyoutput(' ', tp);
2015		(void)ttyoutput('\b', tp);
2016	}
2017}
2018
2019/*
2020 * ttyretype --
2021 *	Reprint the rawq line.  Note, it is assumed that c_cc has already
2022 *	been checked.
2023 */
2024static void
2025ttyretype(tp)
2026	register struct tty *tp;
2027{
2028	register char *cp;
2029	int s, c;
2030
2031	/* Echo the reprint character. */
2032	if (tp->t_cc[VREPRINT] != _POSIX_VDISABLE)
2033		ttyecho(tp->t_cc[VREPRINT], tp);
2034
2035	(void)ttyoutput('\n', tp);
2036
2037	/*
2038	 * XXX
2039	 * FIX: NEXTC IS BROKEN - DOESN'T CHECK QUOTE
2040	 * BIT OF FIRST CHAR.
2041	 */
2042	s = spltty();
2043	for (cp = tp->t_canq.c_cf, c = (cp != NULL ? *cp : 0);
2044	    cp != NULL; cp = nextc(&tp->t_canq, cp, &c))
2045		ttyecho(c, tp);
2046	for (cp = tp->t_rawq.c_cf, c = (cp != NULL ? *cp : 0);
2047	    cp != NULL; cp = nextc(&tp->t_rawq, cp, &c))
2048		ttyecho(c, tp);
2049	CLR(tp->t_state, TS_ERASE);
2050	splx(s);
2051
2052	tp->t_rocount = tp->t_rawq.c_cc;
2053	tp->t_rocol = 0;
2054}
2055
2056/*
2057 * Echo a typed character to the terminal.
2058 */
2059static void
2060ttyecho(c, tp)
2061	register int c;
2062	register struct tty *tp;
2063{
2064
2065	if (!ISSET(tp->t_state, TS_CNTTB))
2066		CLR(tp->t_lflag, FLUSHO);
2067	if ((!ISSET(tp->t_lflag, ECHO) &&
2068	     (c != '\n' || !ISSET(tp->t_lflag, ECHONL))) ||
2069	    ISSET(tp->t_lflag, EXTPROC))
2070		return;
2071	if (ISSET(tp->t_lflag, ECHOCTL) &&
2072	    ((ISSET(c, TTY_CHARMASK) <= 037 && c != '\t' && c != '\n') ||
2073	    ISSET(c, TTY_CHARMASK) == 0177)) {
2074		(void)ttyoutput('^', tp);
2075		CLR(c, ~TTY_CHARMASK);
2076		if (c == 0177)
2077			c = '?';
2078		else
2079			c += 'A' - 1;
2080	}
2081	(void)ttyoutput(c, tp);
2082}
2083
2084/*
2085 * Wake up any readers on a tty.
2086 */
2087void
2088ttwakeup(tp)
2089	register struct tty *tp;
2090{
2091
2092	if (tp->t_rsel.si_pid != 0)
2093		selwakeup(&tp->t_rsel);
2094	if (ISSET(tp->t_state, TS_ASYNC))
2095		pgsignal(tp->t_pgrp, SIGIO, 1);
2096	wakeup(TSA_HUP_OR_INPUT(tp));
2097}
2098
2099/*
2100 * Wake up any writers on a tty.
2101 */
2102void
2103ttwwakeup(tp)
2104	register struct tty *tp;
2105{
2106
2107	if (tp->t_wsel.si_pid != 0 && tp->t_outq.c_cc <= tp->t_lowat)
2108		selwakeup(&tp->t_wsel);
2109	if (ISSET(tp->t_state, TS_BUSY | TS_SO_OCOMPLETE) ==
2110	    TS_SO_OCOMPLETE && tp->t_outq.c_cc == 0) {
2111		CLR(tp->t_state, TS_SO_OCOMPLETE);
2112		wakeup(TSA_OCOMPLETE(tp));
2113	}
2114	if (ISSET(tp->t_state, TS_SO_OLOWAT) &&
2115	    tp->t_outq.c_cc <= tp->t_lowat) {
2116		CLR(tp->t_state, TS_SO_OLOWAT);
2117		wakeup(TSA_OLOWAT(tp));
2118	}
2119}
2120
2121/*
2122 * Look up a code for a specified speed in a conversion table;
2123 * used by drivers to map software speed values to hardware parameters.
2124 */
2125int
2126ttspeedtab(speed, table)
2127	int speed;
2128	register struct speedtab *table;
2129{
2130
2131	for ( ; table->sp_speed != -1; table++)
2132		if (table->sp_speed == speed)
2133			return (table->sp_code);
2134	return (-1);
2135}
2136
2137/*
2138 * Set tty hi and low water marks.
2139 *
2140 * Try to arrange the dynamics so there's about one second
2141 * from hi to low water.
2142 *
2143 */
2144void
2145ttsetwater(tp)
2146	struct tty *tp;
2147{
2148	register int cps, x;
2149
2150#define CLAMP(x, h, l)	((x) > h ? h : ((x) < l) ? l : (x))
2151
2152	cps = tp->t_ospeed / 10;
2153	tp->t_lowat = x = CLAMP(cps / 2, TTMAXLOWAT, TTMINLOWAT);
2154	x += cps;
2155	x = CLAMP(x, TTMAXHIWAT, TTMINHIWAT);
2156	tp->t_hiwat = roundup(x, CBSIZE);
2157#undef	CLAMP
2158}
2159
2160/*
2161 * Report on state of foreground process group.
2162 */
2163void
2164ttyinfo(tp)
2165	register struct tty *tp;
2166{
2167	register struct proc *p, *pick;
2168	struct timeval utime, stime;
2169	int tmp;
2170
2171	if (ttycheckoutq(tp,0) == 0)
2172		return;
2173
2174	/* Print load average. */
2175	tmp = (averunnable.ldavg[0] * 100 + FSCALE / 2) >> FSHIFT;
2176	ttyprintf(tp, "load: %d.%02d ", tmp / 100, tmp % 100);
2177
2178	if (tp->t_session == NULL)
2179		ttyprintf(tp, "not a controlling terminal\n");
2180	else if (tp->t_pgrp == NULL)
2181		ttyprintf(tp, "no foreground process group\n");
2182	else if ((p = tp->t_pgrp->pg_members.lh_first) == 0)
2183		ttyprintf(tp, "empty foreground process group\n");
2184	else {
2185		/* Pick interesting process. */
2186		for (pick = NULL; p != 0; p = p->p_pglist.le_next)
2187			if (proc_compare(pick, p))
2188				pick = p;
2189
2190		ttyprintf(tp, " cmd: %s %d [%s] ", pick->p_comm, pick->p_pid,
2191		    pick->p_stat == SRUN ? "running" :
2192		    pick->p_wmesg ? pick->p_wmesg : "iowait");
2193
2194		calcru(pick, &utime, &stime, NULL);
2195
2196		/* Print user time. */
2197		ttyprintf(tp, "%d.%02du ",
2198		    utime.tv_sec, utime.tv_usec / 10000);
2199
2200		/* Print system time. */
2201		ttyprintf(tp, "%d.%02ds ",
2202		    stime.tv_sec, stime.tv_usec / 10000);
2203
2204#define	pgtok(a)	(((a) * PAGE_SIZE) / 1024)
2205		/* Print percentage cpu, resident set size. */
2206		tmp = (pick->p_pctcpu * 10000 + FSCALE / 2) >> FSHIFT;
2207		ttyprintf(tp, "%d%% %dk\n",
2208		    tmp / 100,
2209		    pick->p_stat == SIDL || pick->p_stat == SZOMB ? 0 :
2210#ifdef pmap_resident_count
2211			pgtok(pmap_resident_count(&pick->p_vmspace->vm_pmap))
2212#else
2213			pgtok(pick->p_vmspace->vm_rssize)
2214#endif
2215			);
2216	}
2217	tp->t_rocount = 0;	/* so pending input will be retyped if BS */
2218}
2219
2220/*
2221 * Returns 1 if p2 is "better" than p1
2222 *
2223 * The algorithm for picking the "interesting" process is thus:
2224 *
2225 *	1) Only foreground processes are eligible - implied.
2226 *	2) Runnable processes are favored over anything else.  The runner
2227 *	   with the highest cpu utilization is picked (p_estcpu).  Ties are
2228 *	   broken by picking the highest pid.
2229 *	3) The sleeper with the shortest sleep time is next.  With ties,
2230 *	   we pick out just "short-term" sleepers (P_SINTR == 0).
2231 *	4) Further ties are broken by picking the highest pid.
2232 */
2233#define ISRUN(p)	(((p)->p_stat == SRUN) || ((p)->p_stat == SIDL))
2234#define TESTAB(a, b)    ((a)<<1 | (b))
2235#define ONLYA   2
2236#define ONLYB   1
2237#define BOTH    3
2238
2239static int
2240proc_compare(p1, p2)
2241	register struct proc *p1, *p2;
2242{
2243
2244	if (p1 == NULL)
2245		return (1);
2246	/*
2247	 * see if at least one of them is runnable
2248	 */
2249	switch (TESTAB(ISRUN(p1), ISRUN(p2))) {
2250	case ONLYA:
2251		return (0);
2252	case ONLYB:
2253		return (1);
2254	case BOTH:
2255		/*
2256		 * tie - favor one with highest recent cpu utilization
2257		 */
2258		if (p2->p_estcpu > p1->p_estcpu)
2259			return (1);
2260		if (p1->p_estcpu > p2->p_estcpu)
2261			return (0);
2262		return (p2->p_pid > p1->p_pid);	/* tie - return highest pid */
2263	}
2264	/*
2265 	 * weed out zombies
2266	 */
2267	switch (TESTAB(p1->p_stat == SZOMB, p2->p_stat == SZOMB)) {
2268	case ONLYA:
2269		return (1);
2270	case ONLYB:
2271		return (0);
2272	case BOTH:
2273		return (p2->p_pid > p1->p_pid); /* tie - return highest pid */
2274	}
2275	/*
2276	 * pick the one with the smallest sleep time
2277	 */
2278	if (p2->p_slptime > p1->p_slptime)
2279		return (0);
2280	if (p1->p_slptime > p2->p_slptime)
2281		return (1);
2282	/*
2283	 * favor one sleeping in a non-interruptible sleep
2284	 */
2285	if (p1->p_flag & P_SINTR && (p2->p_flag & P_SINTR) == 0)
2286		return (1);
2287	if (p2->p_flag & P_SINTR && (p1->p_flag & P_SINTR) == 0)
2288		return (0);
2289	return (p2->p_pid > p1->p_pid);		/* tie - return highest pid */
2290}
2291
2292/*
2293 * Output char to tty; console putchar style.
2294 */
2295int
2296tputchar(c, tp)
2297	int c;
2298	struct tty *tp;
2299{
2300	register int s;
2301
2302	s = spltty();
2303	if (!ISSET(tp->t_state, TS_CONNECTED)) {
2304		splx(s);
2305		return (-1);
2306	}
2307	if (c == '\n')
2308		(void)ttyoutput('\r', tp);
2309	(void)ttyoutput(c, tp);
2310	ttstart(tp);
2311	splx(s);
2312	return (0);
2313}
2314
2315/*
2316 * Sleep on chan, returning ERESTART if tty changed while we napped and
2317 * returning any errors (e.g. EINTR/EWOULDBLOCK) reported by tsleep.  If
2318 * the tty is revoked, restarting a pending call will redo validation done
2319 * at the start of the call.
2320 */
2321int
2322ttysleep(tp, chan, pri, wmesg, timo)
2323	struct tty *tp;
2324	void *chan;
2325	int pri, timo;
2326	char *wmesg;
2327{
2328	int error;
2329	int gen;
2330
2331	gen = tp->t_gen;
2332	error = tsleep(chan, pri, wmesg, timo);
2333	if (error)
2334		return (error);
2335	return (tp->t_gen == gen ? 0 : ERESTART);
2336}
2337
2338#ifdef notyet
2339/*
2340 * XXX this is usable not useful or used.  Most tty drivers have
2341 * ifdefs for using ttymalloc() but assume a different interface.
2342 */
2343/*
2344 * Allocate a tty struct.  Clists in the struct will be allocated by
2345 * ttyopen().
2346 */
2347struct tty *
2348ttymalloc()
2349{
2350        struct tty *tp;
2351
2352        tp = malloc(sizeof *tp, M_TTYS, M_WAITOK);
2353        bzero(tp, sizeof *tp);
2354        return (tp);
2355}
2356#endif
2357
2358#if 0 /* XXX not yet usable: session leader holds a ref (see kern_exit.c). */
2359/*
2360 * Free a tty struct.  Clists in the struct should have been freed by
2361 * ttyclose().
2362 */
2363void
2364ttyfree(tp)
2365	struct tty *tp;
2366{
2367        free(tp, M_TTYS);
2368}
2369#endif /* 0 */
2370