tty.c revision 164054
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 * Copyright (c) 2002 Networks Associates Technologies, Inc.
11 * All rights reserved.
12 *
13 * Portions of this software were developed for the FreeBSD Project by
14 * ThinkSec AS and NAI Labs, the Security Research Division of Network
15 * Associates, Inc.  under DARPA/SPAWAR contract N66001-01-C-8035
16 * ("CBOSS"), as part of the DARPA CHATS research program.
17 *
18 * Redistribution and use in source and binary forms, with or without
19 * modification, are permitted provided that the following conditions
20 * are met:
21 * 1. Redistributions of source code must retain the above copyright
22 *    notice, this list of conditions and the following disclaimer.
23 * 2. Redistributions in binary form must reproduce the above copyright
24 *    notice, this list of conditions and the following disclaimer in the
25 *    documentation and/or other materials provided with the distribution.
26 * 4. Neither the name of the University nor the names of its contributors
27 *    may be used to endorse or promote products derived from this software
28 *    without specific prior written permission.
29 *
30 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
31 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
32 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
33 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
34 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
35 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
36 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
37 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
38 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
39 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
40 * SUCH DAMAGE.
41 *
42 *	@(#)tty.c	8.8 (Berkeley) 1/21/94
43 */
44
45/*-
46 * TODO:
47 *	o Fix races for sending the start char in ttyflush().
48 *	o Handle inter-byte timeout for "MIN > 0, TIME > 0" in ttyselect().
49 *	  With luck, there will be MIN chars before select() returns().
50 *	o Handle CLOCAL consistently for ptys.  Perhaps disallow setting it.
51 *	o Don't allow input in TS_ZOMBIE case.  It would be visible through
52 *	  FIONREAD.
53 *	o Do the new sio locking stuff here and use it to avoid special
54 *	  case for EXTPROC?
55 *	o Lock PENDIN too?
56 *	o Move EXTPROC and/or PENDIN to t_state?
57 *	o Wrap most of ttioctl in spltty/splx.
58 *	o Implement TIOCNOTTY or remove it from <sys/ioctl.h>.
59 *	o Send STOP if IXOFF is toggled off while TS_TBLOCK is set.
60 *	o Don't allow certain termios flags to affect disciplines other
61 *	  than TTYDISC.  Cancel their effects before switch disciplines
62 *	  and ignore them if they are set while we are in another
63 *	  discipline.
64 *	o Now that historical speed conversions are handled here, don't
65 *	  do them in drivers.
66 *	o Check for TS_CARR_ON being set while everything is closed and not
67 *	  waiting for carrier.  TS_CARR_ON isn't cleared if nothing is open,
68 *	  so it would live until the next open even if carrier drops.
69 *	o Restore TS_WOPEN since it is useful in pstat.  It must be cleared
70 *	  only when _all_ openers leave open().
71 */
72
73#include <sys/cdefs.h>
74__FBSDID("$FreeBSD: head/sys/kern/tty.c 164054 2006-11-06 22:12:43Z tegge $");
75
76#include "opt_compat.h"
77#include "opt_tty.h"
78
79#include <sys/param.h>
80#include <sys/systm.h>
81#include <sys/filio.h>
82#include <sys/lock.h>
83#include <sys/mutex.h>
84#include <sys/namei.h>
85#include <sys/sx.h>
86#if defined(COMPAT_43TTY)
87#include <sys/ioctl_compat.h>
88#endif
89#include <sys/priv.h>
90#include <sys/proc.h>
91#define	TTYDEFCHARS
92#include <sys/tty.h>
93#undef	TTYDEFCHARS
94#include <sys/fcntl.h>
95#include <sys/conf.h>
96#include <sys/poll.h>
97#include <sys/kernel.h>
98#include <sys/vnode.h>
99#include <sys/serial.h>
100#include <sys/signalvar.h>
101#include <sys/resourcevar.h>
102#include <sys/malloc.h>
103#include <sys/filedesc.h>
104#include <sys/sched.h>
105#include <sys/sysctl.h>
106#include <sys/timepps.h>
107
108#include <machine/stdarg.h>
109
110#include <vm/vm.h>
111#include <vm/pmap.h>
112#include <vm/vm_map.h>
113
114MALLOC_DEFINE(M_TTYS, "ttys", "tty data structures");
115
116long tk_cancc;
117long tk_nin;
118long tk_nout;
119long tk_rawcc;
120
121static	d_open_t	ttysopen;
122static	d_close_t	ttysclose;
123static	d_read_t	ttysrdwr;
124static	d_ioctl_t	ttysioctl;
125static	d_purge_t	ttypurge;
126
127/* Default cdevsw for common tty devices */
128static struct cdevsw tty_cdevsw = {
129	.d_version =	D_VERSION,
130	.d_open =	ttyopen,
131	.d_close =	ttyclose,
132	.d_ioctl =	ttyioctl,
133	.d_purge =	ttypurge,
134	.d_name =	"ttydrv",
135	.d_flags =	D_TTY | D_NEEDGIANT,
136};
137
138/* Cdevsw for slave tty devices */
139static struct cdevsw ttys_cdevsw = {
140	.d_version =	D_VERSION,
141	.d_open =	ttysopen,
142	.d_close =	ttysclose,
143	.d_read =	ttysrdwr,
144	.d_write =	ttysrdwr,
145	.d_ioctl =	ttysioctl,
146	.d_name =	"TTYS",
147	.d_flags =	D_TTY | D_NEEDGIANT,
148};
149
150static int	proc_compare(struct proc *p1, struct proc *p2);
151static int	ttnread(struct tty *tp);
152static void	ttyecho(int c, struct tty *tp);
153static int	ttyoutput(int c, struct tty *tp);
154static void	ttypend(struct tty *tp);
155static void	ttyretype(struct tty *tp);
156static void	ttyrub(int c, struct tty *tp);
157static void	ttyrubo(struct tty *tp, int cnt);
158static void	ttyunblock(struct tty *tp);
159static int	ttywflush(struct tty *tp);
160static int	filt_ttyread(struct knote *kn, long hint);
161static void	filt_ttyrdetach(struct knote *kn);
162static int	filt_ttywrite(struct knote *kn, long hint);
163static void	filt_ttywdetach(struct knote *kn);
164
165/*
166 * Table with character classes and parity. The 8th bit indicates parity,
167 * the 7th bit indicates the character is an alphameric or underscore (for
168 * ALTWERASE), and the low 6 bits indicate delay type.  If the low 6 bits
169 * are 0 then the character needs no special processing on output; classes
170 * other than 0 might be translated or (not currently) require delays.
171 */
172#define	E	0x00	/* Even parity. */
173#define	O	0x80	/* Odd parity. */
174#define	PARITY(c)	(char_type[c] & O)
175
176#define	ALPHA	0x40	/* Alpha or underscore. */
177#define	ISALPHA(c)	(char_type[(c) & TTY_CHARMASK] & ALPHA)
178
179#define	CCLASSMASK	0x3f
180#define	CCLASS(c)	(char_type[c] & CCLASSMASK)
181
182#define	BS	BACKSPACE
183#define	CC	CONTROL
184#define	CR	RETURN
185#define	NA	ORDINARY | ALPHA
186#define	NL	NEWLINE
187#define	NO	ORDINARY
188#define	TB	TAB
189#define	VT	VTAB
190
191static u_char const char_type[] = {
192	E|CC, O|CC, O|CC, E|CC, O|CC, E|CC, E|CC, O|CC,	/* nul - bel */
193	O|BS, E|TB, E|NL, O|CC, E|VT, O|CR, O|CC, E|CC, /* bs - si */
194	O|CC, E|CC, E|CC, O|CC, E|CC, O|CC, O|CC, E|CC, /* dle - etb */
195	E|CC, O|CC, O|CC, E|CC, O|CC, E|CC, E|CC, O|CC, /* can - us */
196	O|NO, E|NO, E|NO, O|NO, E|NO, O|NO, O|NO, E|NO, /* sp - ' */
197	E|NO, O|NO, O|NO, E|NO, O|NO, E|NO, E|NO, O|NO, /* ( - / */
198	E|NA, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA, /* 0 - 7 */
199	O|NA, E|NA, E|NO, O|NO, E|NO, O|NO, O|NO, E|NO, /* 8 - ? */
200	O|NO, E|NA, E|NA, O|NA, E|NA, O|NA, O|NA, E|NA, /* @ - G */
201	E|NA, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA, /* H - O */
202	E|NA, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA, /* P - W */
203	O|NA, E|NA, E|NA, O|NO, E|NO, O|NO, O|NO, O|NA, /* X - _ */
204	E|NO, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA, /* ` - g */
205	O|NA, E|NA, E|NA, O|NA, E|NA, O|NA, O|NA, E|NA, /* h - o */
206	O|NA, E|NA, E|NA, O|NA, E|NA, O|NA, O|NA, E|NA, /* p - w */
207	E|NA, O|NA, O|NA, E|NO, O|NO, E|NO, E|NO, O|CC, /* x - del */
208	/*
209	 * Meta chars; should be settable per character set;
210	 * for now, treat them all as normal characters.
211	 */
212	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
213	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
214	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
215	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
216	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
217	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
218	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
219	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
220	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
221	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
222	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
223	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
224	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
225	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
226	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
227	NA,   NA,   NA,   NA,   NA,   NA,   NA,   NA,
228};
229#undef	BS
230#undef	CC
231#undef	CR
232#undef	NA
233#undef	NL
234#undef	NO
235#undef	TB
236#undef	VT
237
238/* Macros to clear/set/test flags. */
239#define	SET(t, f)	(t) |= (f)
240#define	CLR(t, f)	(t) &= ~(f)
241#define	ISSET(t, f)	((t) & (f))
242
243#undef MAX_INPUT		/* XXX wrong in <sys/syslimits.h> */
244#define	MAX_INPUT	TTYHOG	/* XXX limit is usually larger for !ICANON */
245
246/*
247 * list of struct tty where pstat(8) can pick it up with sysctl
248 *
249 * The lock order is to grab the list mutex before the tty mutex.
250 * Together with additions going on the tail of the list, this allows
251 * the sysctl to avoid doing retries.
252 */
253static	TAILQ_HEAD(, tty) tty_list = TAILQ_HEAD_INITIALIZER(tty_list);
254static struct mtx tty_list_mutex;
255MTX_SYSINIT(tty_list, &tty_list_mutex, "ttylist", MTX_DEF);
256
257static struct unrhdr *tty_unit;
258
259static int  drainwait = 5*60;
260SYSCTL_INT(_kern, OID_AUTO, drainwait, CTLFLAG_RW, &drainwait,
261	0, "Output drain timeout in seconds");
262
263static struct tty *
264tty_gettp(struct cdev *dev)
265{
266	struct tty *tp;
267	struct cdevsw *csw;
268
269	csw = dev_refthread(dev);
270	KASSERT(csw != NULL, ("No cdevsw in ttycode (%s)", devtoname(dev)));
271	KASSERT(csw->d_flags & D_TTY,
272	    ("non D_TTY (%s) in tty code", devtoname(dev)));
273	dev_relthread(dev);
274	tp = dev->si_tty;
275	KASSERT(tp != NULL,
276	    ("no tty pointer on (%s) in tty code", devtoname(dev)));
277	return (tp);
278}
279
280/*
281 * Initial open of tty, or (re)entry to standard tty line discipline.
282 */
283int
284tty_open(struct cdev *device, struct tty *tp)
285{
286	int s;
287
288	s = spltty();
289	tp->t_dev = device;
290	tp->t_hotchar = 0;
291	if (!ISSET(tp->t_state, TS_ISOPEN)) {
292		ttyref(tp);
293		SET(tp->t_state, TS_ISOPEN);
294		if (ISSET(tp->t_cflag, CLOCAL))
295			SET(tp->t_state, TS_CONNECTED);
296		bzero(&tp->t_winsize, sizeof(tp->t_winsize));
297	}
298	/* XXX don't hang forever on output */
299	if (tp->t_timeout < 0)
300		tp->t_timeout = drainwait*hz;
301	ttsetwater(tp);
302	splx(s);
303	return (0);
304}
305
306/*
307 * Handle close() on a tty line: flush and set to initial state,
308 * bumping generation number so that pending read/write calls
309 * can detect recycling of the tty.
310 * XXX our caller should have done `spltty(); l_close(); tty_close();'
311 * and l_close() should have flushed, but we repeat the spltty() and
312 * the flush in case there are buggy callers.
313 */
314int
315tty_close(struct tty *tp)
316{
317	int ostate, s;
318
319	funsetown(&tp->t_sigio);
320	s = spltty();
321	if (constty == tp)
322		constty_clear();
323
324	ttyflush(tp, FREAD | FWRITE);
325	clist_free_cblocks(&tp->t_canq);
326	clist_free_cblocks(&tp->t_outq);
327	clist_free_cblocks(&tp->t_rawq);
328
329	tp->t_gen++;
330	tp->t_line = TTYDISC;
331	tp->t_hotchar = 0;
332	tp->t_pgrp = NULL;
333	tp->t_session = NULL;
334	ostate = tp->t_state;
335	tp->t_state = 0;
336	knlist_clear(&tp->t_rsel.si_note, 0);
337	knlist_clear(&tp->t_wsel.si_note, 0);
338	/*
339	 * Both final close and revocation close might end up calling
340	 * this method.  Only the thread clearing TS_ISOPEN should
341	 * release the reference to the tty.
342	 */
343	if (ISSET(ostate, TS_ISOPEN))
344		ttyrel(tp);
345	splx(s);
346	return (0);
347}
348
349#define	FLUSHQ(q) {							\
350	if ((q)->c_cc)							\
351		ndflush(q, (q)->c_cc);					\
352}
353
354/* Is 'c' a line delimiter ("break" character)? */
355#define	TTBREAKC(c, lflag)							\
356	((c) == '\n' || (((c) == cc[VEOF] ||				\
357	  (c) == cc[VEOL] || ((c) == cc[VEOL2] && lflag & IEXTEN)) &&	\
358	 (c) != _POSIX_VDISABLE))
359
360/*
361 * Process input of a single character received on a tty.
362 */
363int
364ttyinput(int c, struct tty *tp)
365{
366	tcflag_t iflag, lflag;
367	cc_t *cc;
368	int i, err;
369
370	/*
371	 * If input is pending take it first.
372	 */
373	lflag = tp->t_lflag;
374	if (ISSET(lflag, PENDIN))
375		ttypend(tp);
376	/*
377	 * Gather stats.
378	 */
379	if (ISSET(lflag, ICANON)) {
380		++tk_cancc;
381		++tp->t_cancc;
382	} else {
383		++tk_rawcc;
384		++tp->t_rawcc;
385	}
386	++tk_nin;
387
388	/*
389	 * Block further input iff:
390	 * current input > threshold AND input is available to user program
391	 * AND input flow control is enabled and not yet invoked.
392	 * The 3 is slop for PARMRK.
393	 */
394	iflag = tp->t_iflag;
395	if (tp->t_rawq.c_cc + tp->t_canq.c_cc > tp->t_ihiwat - 3 &&
396	    (!ISSET(lflag, ICANON) || tp->t_canq.c_cc != 0) &&
397	    (ISSET(tp->t_cflag, CRTS_IFLOW) || ISSET(iflag, IXOFF)) &&
398	    !ISSET(tp->t_state, TS_TBLOCK))
399		ttyblock(tp);
400
401	/* Handle exceptional conditions (break, parity, framing). */
402	cc = tp->t_cc;
403	err = (ISSET(c, TTY_ERRORMASK));
404	if (err) {
405		CLR(c, TTY_ERRORMASK);
406		if (ISSET(err, TTY_BI)) {
407			if (ISSET(iflag, IGNBRK))
408				return (0);
409			if (ISSET(iflag, BRKINT)) {
410				ttyflush(tp, FREAD | FWRITE);
411				if (tp->t_pgrp != NULL) {
412					PGRP_LOCK(tp->t_pgrp);
413					pgsignal(tp->t_pgrp, SIGINT, 1);
414					PGRP_UNLOCK(tp->t_pgrp);
415				}
416				goto endcase;
417			}
418			if (ISSET(iflag, PARMRK))
419				goto parmrk;
420		} else if ((ISSET(err, TTY_PE) && ISSET(iflag, INPCK))
421			|| ISSET(err, TTY_FE)) {
422			if (ISSET(iflag, IGNPAR))
423				return (0);
424			else if (ISSET(iflag, PARMRK)) {
425parmrk:
426				if (tp->t_rawq.c_cc + tp->t_canq.c_cc >
427				    MAX_INPUT - 3)
428					goto input_overflow;
429				(void)putc(0377 | TTY_QUOTE, &tp->t_rawq);
430				(void)putc(0 | TTY_QUOTE, &tp->t_rawq);
431				(void)putc(c | TTY_QUOTE, &tp->t_rawq);
432				goto endcase;
433			} else
434				c = 0;
435		}
436	}
437
438	if (!ISSET(tp->t_state, TS_TYPEN) && ISSET(iflag, ISTRIP))
439		CLR(c, 0x80);
440	if (!ISSET(lflag, EXTPROC)) {
441		/*
442		 * Check for literal nexting very first
443		 */
444		if (ISSET(tp->t_state, TS_LNCH)) {
445			SET(c, TTY_QUOTE);
446			CLR(tp->t_state, TS_LNCH);
447		}
448		/*
449		 * Scan for special characters.  This code
450		 * is really just a big case statement with
451		 * non-constant cases.  The bottom of the
452		 * case statement is labeled ``endcase'', so goto
453		 * it after a case match, or similar.
454		 */
455
456		/*
457		 * Control chars which aren't controlled
458		 * by ICANON, ISIG, or IXON.
459		 */
460		if (ISSET(lflag, IEXTEN)) {
461			if (CCEQ(cc[VLNEXT], c)) {
462				if (ISSET(lflag, ECHO)) {
463					if (ISSET(lflag, ECHOE)) {
464						(void)ttyoutput('^', tp);
465						(void)ttyoutput('\b', tp);
466					} else
467						ttyecho(c, tp);
468				}
469				SET(tp->t_state, TS_LNCH);
470				goto endcase;
471			}
472			if (CCEQ(cc[VDISCARD], c)) {
473				if (ISSET(lflag, FLUSHO))
474					CLR(tp->t_lflag, FLUSHO);
475				else {
476					ttyflush(tp, FWRITE);
477					ttyecho(c, tp);
478					if (tp->t_rawq.c_cc + tp->t_canq.c_cc)
479						ttyretype(tp);
480					SET(tp->t_lflag, FLUSHO);
481				}
482				goto startoutput;
483			}
484		}
485		/*
486		 * Signals.
487		 */
488		if (ISSET(lflag, ISIG)) {
489			if (CCEQ(cc[VINTR], c) || CCEQ(cc[VQUIT], c)) {
490				if (!ISSET(lflag, NOFLSH))
491					ttyflush(tp, FREAD | FWRITE);
492				ttyecho(c, tp);
493				if (tp->t_pgrp != NULL) {
494					PGRP_LOCK(tp->t_pgrp);
495					pgsignal(tp->t_pgrp,
496					    CCEQ(cc[VINTR], c) ? SIGINT : SIGQUIT, 1);
497					PGRP_UNLOCK(tp->t_pgrp);
498				}
499				goto endcase;
500			}
501			if (CCEQ(cc[VSUSP], c)) {
502				if (!ISSET(lflag, NOFLSH))
503					ttyflush(tp, FREAD);
504				ttyecho(c, tp);
505				if (tp->t_pgrp != NULL) {
506					PGRP_LOCK(tp->t_pgrp);
507					pgsignal(tp->t_pgrp, SIGTSTP, 1);
508					PGRP_UNLOCK(tp->t_pgrp);
509				}
510				goto endcase;
511			}
512		}
513		/*
514		 * Handle start/stop characters.
515		 */
516		if (ISSET(iflag, IXON)) {
517			if (CCEQ(cc[VSTOP], c)) {
518				if (!ISSET(tp->t_state, TS_TTSTOP)) {
519					SET(tp->t_state, TS_TTSTOP);
520					tt_stop(tp, 0);
521					return (0);
522				}
523				if (!CCEQ(cc[VSTART], c))
524					return (0);
525				/*
526				 * if VSTART == VSTOP then toggle
527				 */
528				goto endcase;
529			}
530			if (CCEQ(cc[VSTART], c))
531				goto restartoutput;
532		}
533		/*
534		 * IGNCR, ICRNL, & INLCR
535		 */
536		if (c == '\r') {
537			if (ISSET(iflag, IGNCR))
538				return (0);
539			else if (ISSET(iflag, ICRNL))
540				c = '\n';
541		} else if (c == '\n' && ISSET(iflag, INLCR))
542			c = '\r';
543	}
544	if (!ISSET(tp->t_lflag, EXTPROC) && ISSET(lflag, ICANON)) {
545		/*
546		 * From here on down canonical mode character
547		 * processing takes place.
548		 */
549		/*
550		 * erase or erase2 (^H / ^?)
551		 */
552		if (CCEQ(cc[VERASE], c) || CCEQ(cc[VERASE2], c) ) {
553			if (tp->t_rawq.c_cc)
554				ttyrub(unputc(&tp->t_rawq), tp);
555			goto endcase;
556		}
557		/*
558		 * kill (^U)
559		 */
560		if (CCEQ(cc[VKILL], c)) {
561			if (ISSET(lflag, ECHOKE) &&
562			    tp->t_rawq.c_cc == tp->t_rocount &&
563			    !ISSET(lflag, ECHOPRT))
564				while (tp->t_rawq.c_cc)
565					ttyrub(unputc(&tp->t_rawq), tp);
566			else {
567				ttyecho(c, tp);
568				if (ISSET(lflag, ECHOK) ||
569				    ISSET(lflag, ECHOKE))
570					ttyecho('\n', tp);
571				FLUSHQ(&tp->t_rawq);
572				tp->t_rocount = 0;
573			}
574			CLR(tp->t_state, TS_LOCAL);
575			goto endcase;
576		}
577		/*
578		 * word erase (^W)
579		 */
580		if (CCEQ(cc[VWERASE], c) && ISSET(lflag, IEXTEN)) {
581			int ctype;
582
583			/*
584			 * erase whitespace
585			 */
586			while ((c = unputc(&tp->t_rawq)) == ' ' || c == '\t')
587				ttyrub(c, tp);
588			if (c == -1)
589				goto endcase;
590			/*
591			 * erase last char of word and remember the
592			 * next chars type (for ALTWERASE)
593			 */
594			ttyrub(c, tp);
595			c = unputc(&tp->t_rawq);
596			if (c == -1)
597				goto endcase;
598			if (c == ' ' || c == '\t') {
599				(void)putc(c, &tp->t_rawq);
600				goto endcase;
601			}
602			ctype = ISALPHA(c);
603			/*
604			 * erase rest of word
605			 */
606			do {
607				ttyrub(c, tp);
608				c = unputc(&tp->t_rawq);
609				if (c == -1)
610					goto endcase;
611			} while (c != ' ' && c != '\t' &&
612			    (!ISSET(lflag, ALTWERASE) || ISALPHA(c) == ctype));
613			(void)putc(c, &tp->t_rawq);
614			goto endcase;
615		}
616		/*
617		 * reprint line (^R)
618		 */
619		if (CCEQ(cc[VREPRINT], c) && ISSET(lflag, IEXTEN)) {
620			ttyretype(tp);
621			goto endcase;
622		}
623		/*
624		 * ^T - kernel info and generate SIGINFO
625		 */
626		if (CCEQ(cc[VSTATUS], c) && ISSET(lflag, IEXTEN)) {
627			if (ISSET(lflag, ISIG) && tp->t_pgrp != NULL) {
628				PGRP_LOCK(tp->t_pgrp);
629				pgsignal(tp->t_pgrp, SIGINFO, 1);
630				PGRP_UNLOCK(tp->t_pgrp);
631			}
632			if (!ISSET(lflag, NOKERNINFO))
633				ttyinfo(tp);
634			goto endcase;
635		}
636	}
637	/*
638	 * Check for input buffer overflow
639	 */
640	if (tp->t_rawq.c_cc + tp->t_canq.c_cc >= MAX_INPUT) {
641input_overflow:
642		if (ISSET(iflag, IMAXBEL)) {
643			if (tp->t_outq.c_cc < tp->t_ohiwat)
644				(void)ttyoutput(CTRL('g'), tp);
645		}
646		goto endcase;
647	}
648
649	if (   c == 0377 && ISSET(iflag, PARMRK) && !ISSET(iflag, ISTRIP)
650	     && ISSET(iflag, IGNBRK|IGNPAR) != (IGNBRK|IGNPAR))
651		(void)putc(0377 | TTY_QUOTE, &tp->t_rawq);
652
653	/*
654	 * Put data char in q for user and
655	 * wakeup on seeing a line delimiter.
656	 */
657	if (putc(c, &tp->t_rawq) >= 0) {
658		if (!ISSET(lflag, ICANON)) {
659			ttwakeup(tp);
660			ttyecho(c, tp);
661			goto endcase;
662		}
663		if (TTBREAKC(c, lflag)) {
664			tp->t_rocount = 0;
665			catq(&tp->t_rawq, &tp->t_canq);
666			ttwakeup(tp);
667		} else if (tp->t_rocount++ == 0)
668			tp->t_rocol = tp->t_column;
669		if (ISSET(tp->t_state, TS_ERASE)) {
670			/*
671			 * end of prterase \.../
672			 */
673			CLR(tp->t_state, TS_ERASE);
674			(void)ttyoutput('/', tp);
675		}
676		i = tp->t_column;
677		ttyecho(c, tp);
678		if (CCEQ(cc[VEOF], c) && ISSET(lflag, ECHO)) {
679			/*
680			 * Place the cursor over the '^' of the ^D.
681			 */
682			i = imin(2, tp->t_column - i);
683			while (i > 0) {
684				(void)ttyoutput('\b', tp);
685				i--;
686			}
687		}
688	}
689endcase:
690	/*
691	 * IXANY means allow any character to restart output.
692	 */
693	if (ISSET(tp->t_state, TS_TTSTOP) &&
694	    !ISSET(iflag, IXANY) && cc[VSTART] != cc[VSTOP])
695		return (0);
696restartoutput:
697	CLR(tp->t_lflag, FLUSHO);
698	CLR(tp->t_state, TS_TTSTOP);
699startoutput:
700	return (ttstart(tp));
701}
702
703/*
704 * Output a single character on a tty, doing output processing
705 * as needed (expanding tabs, newline processing, etc.).
706 * Returns < 0 if succeeds, otherwise returns char to resend.
707 * Must be recursive.
708 */
709static int
710ttyoutput(int c, struct tty *tp)
711{
712	tcflag_t oflag;
713	int col, s;
714
715	oflag = tp->t_oflag;
716	if (!ISSET(oflag, OPOST)) {
717		if (ISSET(tp->t_lflag, FLUSHO))
718			return (-1);
719		if (putc(c, &tp->t_outq))
720			return (c);
721		tk_nout++;
722		tp->t_outcc++;
723		return (-1);
724	}
725	/*
726	 * Do tab expansion if OXTABS is set.  Special case if we external
727	 * processing, we don't do the tab expansion because we'll probably
728	 * get it wrong.  If tab expansion needs to be done, let it happen
729	 * externally.
730	 */
731	CLR(c, ~TTY_CHARMASK);
732	if (c == '\t' &&
733	    ISSET(oflag, OXTABS) && !ISSET(tp->t_lflag, EXTPROC)) {
734		c = 8 - (tp->t_column & 7);
735		if (!ISSET(tp->t_lflag, FLUSHO)) {
736			s = spltty();		/* Don't interrupt tabs. */
737			c -= b_to_q("        ", c, &tp->t_outq);
738			tk_nout += c;
739			tp->t_outcc += c;
740			splx(s);
741		}
742		tp->t_column += c;
743		return (c ? -1 : '\t');
744	}
745	if (c == CEOT && ISSET(oflag, ONOEOT))
746		return (-1);
747
748	/*
749	 * Newline translation: if ONLCR is set,
750	 * translate newline into "\r\n".
751	 */
752	if (c == '\n' && ISSET(tp->t_oflag, ONLCR)) {
753		tk_nout++;
754		tp->t_outcc++;
755		if (!ISSET(tp->t_lflag, FLUSHO) && putc('\r', &tp->t_outq))
756			return (c);
757	}
758	/* If OCRNL is set, translate "\r" into "\n". */
759	else if (c == '\r' && ISSET(tp->t_oflag, OCRNL))
760		c = '\n';
761	/* If ONOCR is set, don't transmit CRs when on column 0. */
762	else if (c == '\r' && ISSET(tp->t_oflag, ONOCR) && tp->t_column == 0)
763		return (-1);
764
765	tk_nout++;
766	tp->t_outcc++;
767	if (!ISSET(tp->t_lflag, FLUSHO) && putc(c, &tp->t_outq))
768		return (c);
769
770	col = tp->t_column;
771	switch (CCLASS(c)) {
772	case BACKSPACE:
773		if (col > 0)
774			--col;
775		break;
776	case CONTROL:
777		break;
778	case NEWLINE:
779		if (ISSET(tp->t_oflag, ONLCR | ONLRET))
780			col = 0;
781		break;
782	case RETURN:
783		col = 0;
784		break;
785	case ORDINARY:
786		++col;
787		break;
788	case TAB:
789		col = (col + 8) & ~7;
790		break;
791	}
792	tp->t_column = col;
793	return (-1);
794}
795
796/*
797 * Ioctls for all tty devices.  Called after line-discipline specific ioctl
798 * has been called to do discipline-specific functions and/or reject any
799 * of these ioctl commands.
800 */
801/* ARGSUSED */
802int
803ttioctl(struct tty *tp, u_long cmd, void *data, int flag)
804{
805	struct proc *p;
806	struct thread *td;
807	struct pgrp *pgrp;
808	int s, error, bits, sig, sig2;
809
810	td = curthread;			/* XXX */
811	p = td->td_proc;
812
813	/* If the ioctl involves modification, hang if in the background. */
814	switch (cmd) {
815	case  TIOCCBRK:
816	case  TIOCCONS:
817	case  TIOCDRAIN:
818	case  TIOCEXCL:
819	case  TIOCFLUSH:
820#ifdef TIOCHPCL
821	case  TIOCHPCL:
822#endif
823	case  TIOCNXCL:
824	case  TIOCSBRK:
825	case  TIOCSCTTY:
826	case  TIOCSDRAINWAIT:
827	case  TIOCSETA:
828	case  TIOCSETAF:
829	case  TIOCSETAW:
830	case  TIOCSETD:
831	case  TIOCSPGRP:
832	case  TIOCSTART:
833	case  TIOCSTAT:
834	case  TIOCSTI:
835	case  TIOCSTOP:
836	case  TIOCSWINSZ:
837#if defined(COMPAT_43TTY)
838	case  TIOCLBIC:
839	case  TIOCLBIS:
840	case  TIOCLSET:
841	case  TIOCSETC:
842	case OTIOCSETD:
843	case  TIOCSETN:
844	case  TIOCSETP:
845	case  TIOCSLTC:
846#endif
847		sx_slock(&proctree_lock);
848		PROC_LOCK(p);
849		while (isbackground(p, tp) && !(p->p_flag & P_PPWAIT) &&
850		    !SIGISMEMBER(p->p_sigacts->ps_sigignore, SIGTTOU) &&
851		    !SIGISMEMBER(td->td_sigmask, SIGTTOU)) {
852			pgrp = p->p_pgrp;
853			PROC_UNLOCK(p);
854			if (pgrp->pg_jobc == 0) {
855				sx_sunlock(&proctree_lock);
856				return (EIO);
857			}
858			PGRP_LOCK(pgrp);
859			sx_sunlock(&proctree_lock);
860			pgsignal(pgrp, SIGTTOU, 1);
861			PGRP_UNLOCK(pgrp);
862			error = ttysleep(tp, &lbolt, TTOPRI | PCATCH, "ttybg1",
863					 0);
864			if (error)
865				return (error);
866			sx_slock(&proctree_lock);
867			PROC_LOCK(p);
868		}
869		PROC_UNLOCK(p);
870		sx_sunlock(&proctree_lock);
871		break;
872	}
873
874
875	if (tp->t_modem != NULL) {
876		switch (cmd) {
877		case TIOCSDTR:
878			tt_modem(tp, SER_DTR, 0);
879			return (0);
880		case TIOCCDTR:
881			tt_modem(tp, 0, SER_DTR);
882			return (0);
883		case TIOCMSET:
884			bits = *(int *)data;
885			sig = (bits & (TIOCM_DTR | TIOCM_RTS)) >> 1;
886			sig2 = ((~bits) & (TIOCM_DTR | TIOCM_RTS)) >> 1;
887			tt_modem(tp, sig, sig2);
888			return (0);
889		case TIOCMBIS:
890			bits = *(int *)data;
891			sig = (bits & (TIOCM_DTR | TIOCM_RTS)) >> 1;
892			tt_modem(tp, sig, 0);
893			return (0);
894		case TIOCMBIC:
895			bits = *(int *)data;
896			sig = (bits & (TIOCM_DTR | TIOCM_RTS)) >> 1;
897			tt_modem(tp, 0, sig);
898			return (0);
899		case TIOCMGET:
900			sig = tt_modem(tp, 0, 0);
901			/* See <sys/serial.h. for the "<< 1" stuff */
902			bits = TIOCM_LE + (sig << 1);
903			*(int *)data = bits;
904			return (0);
905		default:
906			break;
907		}
908	}
909
910	if (tp->t_pps != NULL) {
911		error = pps_ioctl(cmd, data, tp->t_pps);
912		if (error != ENOIOCTL)
913			return (error);
914	}
915
916	switch (cmd) {			/* Process the ioctl. */
917	case FIOASYNC:			/* set/clear async i/o */
918		s = spltty();
919		if (*(int *)data)
920			SET(tp->t_state, TS_ASYNC);
921		else
922			CLR(tp->t_state, TS_ASYNC);
923		splx(s);
924		break;
925	case FIONBIO:			/* set/clear non-blocking i/o */
926		break;			/* XXX: delete. */
927	case FIONREAD:			/* get # bytes to read */
928		s = spltty();
929		*(int *)data = ttnread(tp);
930		splx(s);
931		break;
932
933	case FIOSETOWN:
934		/*
935		 * Policy -- Don't allow FIOSETOWN on someone else's
936		 *           controlling tty
937		 */
938		if (tp->t_session != NULL && !isctty(p, tp))
939			return (ENOTTY);
940
941		error = fsetown(*(int *)data, &tp->t_sigio);
942		if (error)
943			return (error);
944		break;
945	case FIOGETOWN:
946		if (tp->t_session != NULL && !isctty(p, tp))
947			return (ENOTTY);
948		*(int *)data = fgetown(&tp->t_sigio);
949		break;
950
951	case TIOCEXCL:			/* set exclusive use of tty */
952		s = spltty();
953		SET(tp->t_state, TS_XCLUDE);
954		splx(s);
955		break;
956	case TIOCFLUSH: {		/* flush buffers */
957		int flags = *(int *)data;
958
959		if (flags == 0)
960			flags = FREAD | FWRITE;
961		else
962			flags &= FREAD | FWRITE;
963		ttyflush(tp, flags);
964		break;
965	}
966	case TIOCCONS:			/* become virtual console */
967		if (*(int *)data) {
968			struct nameidata nid;
969
970			if (constty && constty != tp &&
971			    ISSET(constty->t_state, TS_CONNECTED))
972				return (EBUSY);
973
974			/* Ensure user can open the real console. */
975			NDINIT(&nid, LOOKUP, LOCKLEAF | FOLLOW, UIO_SYSSPACE,
976			    "/dev/console", td);
977			if ((error = namei(&nid)) != 0)
978				return (error);
979			NDFREE(&nid, NDF_ONLY_PNBUF);
980			error = VOP_ACCESS(nid.ni_vp, VREAD, td->td_ucred, td);
981			vput(nid.ni_vp);
982			if (error)
983				return (error);
984
985			constty_set(tp);
986		} else if (tp == constty)
987			constty_clear();
988		break;
989	case TIOCDRAIN:			/* wait till output drained */
990		error = ttywait(tp);
991		if (error)
992			return (error);
993		break;
994	case TIOCGETA: {		/* get termios struct */
995		struct termios *t = (struct termios *)data;
996
997		bcopy(&tp->t_termios, t, sizeof(struct termios));
998		break;
999	}
1000	case TIOCGETD:			/* get line discipline */
1001		*(int *)data = tp->t_line;
1002		break;
1003	case TIOCGWINSZ:		/* get window size */
1004		*(struct winsize *)data = tp->t_winsize;
1005		break;
1006	case TIOCGPGRP:			/* get pgrp of tty */
1007		if (!isctty(p, tp))
1008			return (ENOTTY);
1009		*(int *)data = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PID;
1010		break;
1011#ifdef TIOCHPCL
1012	case TIOCHPCL:			/* hang up on last close */
1013		s = spltty();
1014		SET(tp->t_cflag, HUPCL);
1015		splx(s);
1016		break;
1017#endif
1018	case TIOCMGDTRWAIT:
1019		*(int *)data = tp->t_dtr_wait * 100 / hz;
1020		break;
1021	case TIOCMSDTRWAIT:
1022		/* must be root since the wait applies to following logins */
1023		error = priv_check(td, PRIV_TTY_DTRWAIT);
1024		if (error)
1025			return (error);
1026		tp->t_dtr_wait = *(int *)data * hz / 100;
1027		break;
1028	case TIOCNXCL:			/* reset exclusive use of tty */
1029		s = spltty();
1030		CLR(tp->t_state, TS_XCLUDE);
1031		splx(s);
1032		break;
1033	case TIOCOUTQ:			/* output queue size */
1034		*(int *)data = tp->t_outq.c_cc;
1035		break;
1036	case TIOCSETA:			/* set termios struct */
1037	case TIOCSETAW:			/* drain output, set */
1038	case TIOCSETAF: {		/* drn out, fls in, set */
1039		struct termios *t = (struct termios *)data;
1040
1041		if (t->c_ispeed == 0)
1042			t->c_ispeed = t->c_ospeed;
1043		if (t->c_ispeed == 0)
1044			t->c_ispeed = tp->t_ospeed;
1045		if (t->c_ispeed == 0)
1046			return (EINVAL);
1047		s = spltty();
1048		if (cmd == TIOCSETAW || cmd == TIOCSETAF) {
1049			error = ttywait(tp);
1050			if (error) {
1051				splx(s);
1052				return (error);
1053			}
1054			if (cmd == TIOCSETAF)
1055				ttyflush(tp, FREAD);
1056		}
1057		if (!ISSET(t->c_cflag, CIGNORE)) {
1058			/*
1059			 * Set device hardware.
1060			 */
1061			error = tt_param(tp, t);
1062			if (error) {
1063				splx(s);
1064				return (error);
1065			}
1066			if (ISSET(t->c_cflag, CLOCAL) &&
1067			    !ISSET(tp->t_cflag, CLOCAL)) {
1068				/*
1069				 * XXX disconnections would be too hard to
1070				 * get rid of without this kludge.  The only
1071				 * way to get rid of controlling terminals
1072				 * is to exit from the session leader.
1073				 */
1074				CLR(tp->t_state, TS_ZOMBIE);
1075
1076				wakeup(TSA_CARR_ON(tp));
1077				ttwakeup(tp);
1078				ttwwakeup(tp);
1079			}
1080			if ((ISSET(tp->t_state, TS_CARR_ON) ||
1081			     ISSET(t->c_cflag, CLOCAL)) &&
1082			    !ISSET(tp->t_state, TS_ZOMBIE))
1083				SET(tp->t_state, TS_CONNECTED);
1084			else
1085				CLR(tp->t_state, TS_CONNECTED);
1086			tp->t_cflag = t->c_cflag;
1087			tp->t_ispeed = t->c_ispeed;
1088			if (t->c_ospeed != 0)
1089				tp->t_ospeed = t->c_ospeed;
1090			ttsetwater(tp);
1091		}
1092		if (ISSET(t->c_lflag, ICANON) != ISSET(tp->t_lflag, ICANON) &&
1093		    cmd != TIOCSETAF) {
1094			if (ISSET(t->c_lflag, ICANON))
1095				SET(tp->t_lflag, PENDIN);
1096			else {
1097				/*
1098				 * XXX we really shouldn't allow toggling
1099				 * ICANON while we're in a non-termios line
1100				 * discipline.  Now we have to worry about
1101				 * panicing for a null queue.
1102				 */
1103				if (tp->t_canq.c_cbreserved > 0 &&
1104				    tp->t_rawq.c_cbreserved > 0) {
1105					catq(&tp->t_rawq, &tp->t_canq);
1106					/*
1107					 * XXX the queue limits may be
1108					 * different, so the old queue
1109					 * swapping method no longer works.
1110					 */
1111					catq(&tp->t_canq, &tp->t_rawq);
1112				}
1113				CLR(tp->t_lflag, PENDIN);
1114			}
1115			ttwakeup(tp);
1116		}
1117		tp->t_iflag = t->c_iflag;
1118		tp->t_oflag = t->c_oflag;
1119		/*
1120		 * Make the EXTPROC bit read only.
1121		 */
1122		if (ISSET(tp->t_lflag, EXTPROC))
1123			SET(t->c_lflag, EXTPROC);
1124		else
1125			CLR(t->c_lflag, EXTPROC);
1126		tp->t_lflag = t->c_lflag | ISSET(tp->t_lflag, PENDIN);
1127		if (t->c_cc[VMIN] != tp->t_cc[VMIN] ||
1128		    t->c_cc[VTIME] != tp->t_cc[VTIME])
1129			ttwakeup(tp);
1130		bcopy(t->c_cc, tp->t_cc, sizeof(t->c_cc));
1131		splx(s);
1132		break;
1133	}
1134	case TIOCSETD: {		/* set line discipline */
1135		int t = *(int *)data;
1136
1137		if ((u_int)t >= nlinesw)
1138			return (ENXIO);
1139		if (t == tp->t_line)
1140			return (0);
1141		s = spltty();
1142		ttyld_close(tp, flag);
1143		tp->t_line = t;
1144		/* XXX: we should use the correct cdev here */
1145		error = ttyld_open(tp, tp->t_dev);
1146		if (error) {
1147			/*
1148			 * If we fail to switch line discipline we cannot
1149			 * fall back to the previous, because we can not
1150			 * trust that ldisc to open successfully either.
1151			 * Fall back to the default ldisc which we know
1152			 * will allways succeed.
1153			 */
1154			tp->t_line = TTYDISC;
1155			(void)ttyld_open(tp, tp->t_dev);
1156		}
1157		splx(s);
1158		return (error);
1159		break;
1160	}
1161	case TIOCSTART:			/* start output, like ^Q */
1162		s = spltty();
1163		if (ISSET(tp->t_state, TS_TTSTOP) ||
1164		    ISSET(tp->t_lflag, FLUSHO)) {
1165			CLR(tp->t_lflag, FLUSHO);
1166			CLR(tp->t_state, TS_TTSTOP);
1167			ttstart(tp);
1168		}
1169		splx(s);
1170		break;
1171	case TIOCSTI:			/* simulate terminal input */
1172		if ((flag & FREAD) == 0 && priv_check(td, PRIV_TTY_STI))
1173			return (EPERM);
1174		if (!isctty(p, tp) && priv_check(td, PRIV_TTY_STI))
1175			return (EACCES);
1176		s = spltty();
1177		ttyld_rint(tp, *(u_char *)data);
1178		splx(s);
1179		break;
1180	case TIOCSTOP:			/* stop output, like ^S */
1181		s = spltty();
1182		if (!ISSET(tp->t_state, TS_TTSTOP)) {
1183			SET(tp->t_state, TS_TTSTOP);
1184			tt_stop(tp, 0);
1185		}
1186		splx(s);
1187		break;
1188	case TIOCSCTTY:			/* become controlling tty */
1189		/* Session ctty vnode pointer set in vnode layer. */
1190		sx_slock(&proctree_lock);
1191		if (!SESS_LEADER(p) ||
1192		    ((p->p_session->s_ttyvp || tp->t_session) &&
1193		     (tp->t_session != p->p_session))) {
1194			sx_sunlock(&proctree_lock);
1195			return (EPERM);
1196		}
1197		tp->t_session = p->p_session;
1198		tp->t_pgrp = p->p_pgrp;
1199		SESS_LOCK(p->p_session);
1200		ttyref(tp);		/* ttyrel(): kern_proc.c:pgdelete() */
1201		p->p_session->s_ttyp = tp;
1202		SESS_UNLOCK(p->p_session);
1203		PROC_LOCK(p);
1204		p->p_flag |= P_CONTROLT;
1205		PROC_UNLOCK(p);
1206		sx_sunlock(&proctree_lock);
1207		break;
1208	case TIOCSPGRP: {		/* set pgrp of tty */
1209		sx_slock(&proctree_lock);
1210		pgrp = pgfind(*(int *)data);
1211		if (!isctty(p, tp)) {
1212			if (pgrp != NULL)
1213				PGRP_UNLOCK(pgrp);
1214			sx_sunlock(&proctree_lock);
1215			return (ENOTTY);
1216		}
1217		if (pgrp == NULL) {
1218			sx_sunlock(&proctree_lock);
1219			return (EPERM);
1220		}
1221		PGRP_UNLOCK(pgrp);
1222		if (pgrp->pg_session != p->p_session) {
1223			sx_sunlock(&proctree_lock);
1224			return (EPERM);
1225		}
1226		sx_sunlock(&proctree_lock);
1227		tp->t_pgrp = pgrp;
1228		break;
1229	}
1230	case TIOCSTAT:			/* simulate control-T */
1231		s = spltty();
1232		ttyinfo(tp);
1233		splx(s);
1234		break;
1235	case TIOCSWINSZ:		/* set window size */
1236		if (bcmp((caddr_t)&tp->t_winsize, data,
1237		    sizeof (struct winsize))) {
1238			tp->t_winsize = *(struct winsize *)data;
1239			if (tp->t_pgrp != NULL) {
1240				PGRP_LOCK(tp->t_pgrp);
1241				pgsignal(tp->t_pgrp, SIGWINCH, 1);
1242				PGRP_UNLOCK(tp->t_pgrp);
1243			}
1244		}
1245		break;
1246	case TIOCSDRAINWAIT:
1247		error = priv_check(td, PRIV_TTY_DRAINWAIT);
1248		if (error)
1249			return (error);
1250		tp->t_timeout = *(int *)data * hz;
1251		wakeup(TSA_OCOMPLETE(tp));
1252		wakeup(TSA_OLOWAT(tp));
1253		break;
1254	case TIOCGDRAINWAIT:
1255		*(int *)data = tp->t_timeout / hz;
1256		break;
1257	case TIOCSBRK:
1258		return (tt_break(tp, 1));
1259	case TIOCCBRK:
1260		return (tt_break(tp, 0));
1261	default:
1262#if defined(COMPAT_43TTY)
1263		return (ttcompat(tp, cmd, data, flag));
1264#else
1265		return (ENOIOCTL);
1266#endif
1267	}
1268	return (0);
1269}
1270
1271int
1272ttypoll(struct cdev *dev, int events, struct thread *td)
1273{
1274	int s;
1275	int revents = 0;
1276	struct tty *tp;
1277
1278	tp = tty_gettp(dev);
1279
1280	if (tp == NULL)	/* XXX used to return ENXIO, but that means true! */
1281		return ((events & (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM))
1282			| POLLHUP);
1283
1284	s = spltty();
1285	if (events & (POLLIN | POLLRDNORM)) {
1286		if (ISSET(tp->t_state, TS_ZOMBIE))
1287			revents |= (events & (POLLIN | POLLRDNORM)) |
1288			    POLLHUP;
1289		else if (ttnread(tp) > 0)
1290			revents |= events & (POLLIN | POLLRDNORM);
1291		else
1292			selrecord(td, &tp->t_rsel);
1293	}
1294	if (events & POLLOUT) {
1295		if (ISSET(tp->t_state, TS_ZOMBIE))
1296			revents |= POLLHUP;
1297		else if (tp->t_outq.c_cc <= tp->t_olowat &&
1298		    ISSET(tp->t_state, TS_CONNECTED))
1299			revents |= events & POLLOUT;
1300		else
1301			selrecord(td, &tp->t_wsel);
1302	}
1303	splx(s);
1304	return (revents);
1305}
1306
1307static struct filterops ttyread_filtops =
1308	{ 1, NULL, filt_ttyrdetach, filt_ttyread };
1309static struct filterops ttywrite_filtops =
1310	{ 1, NULL, filt_ttywdetach, filt_ttywrite };
1311
1312int
1313ttykqfilter(struct cdev *dev, struct knote *kn)
1314{
1315	struct tty *tp;
1316	struct knlist *klist;
1317	int s;
1318
1319	tp = tty_gettp(dev);
1320
1321	switch (kn->kn_filter) {
1322	case EVFILT_READ:
1323		klist = &tp->t_rsel.si_note;
1324		kn->kn_fop = &ttyread_filtops;
1325		break;
1326	case EVFILT_WRITE:
1327		klist = &tp->t_wsel.si_note;
1328		kn->kn_fop = &ttywrite_filtops;
1329		break;
1330	default:
1331		return (EINVAL);
1332	}
1333
1334	kn->kn_hook = (caddr_t)dev;
1335
1336	s = spltty();
1337	knlist_add(klist, kn, 0);
1338	splx(s);
1339
1340	return (0);
1341}
1342
1343static void
1344filt_ttyrdetach(struct knote *kn)
1345{
1346	struct tty *tp = ((struct cdev *)kn->kn_hook)->si_tty;
1347	int s = spltty();
1348
1349	knlist_remove(&tp->t_rsel.si_note, kn, 0);
1350	splx(s);
1351}
1352
1353static int
1354filt_ttyread(struct knote *kn, long hint)
1355{
1356	struct tty *tp = ((struct cdev *)kn->kn_hook)->si_tty;
1357
1358	kn->kn_data = ttnread(tp);
1359	if (ISSET(tp->t_state, TS_ZOMBIE)) {
1360		kn->kn_flags |= EV_EOF;
1361		return (1);
1362	}
1363	return (kn->kn_data > 0);
1364}
1365
1366static void
1367filt_ttywdetach(struct knote *kn)
1368{
1369	struct tty *tp = ((struct cdev *)kn->kn_hook)->si_tty;
1370	int s = spltty();
1371
1372	knlist_remove(&tp->t_wsel.si_note, kn, 0);
1373	splx(s);
1374}
1375
1376static int
1377filt_ttywrite(struct knote *kn, long hint)
1378{
1379	struct tty *tp = ((struct cdev *)kn->kn_hook)->si_tty;
1380
1381	kn->kn_data = tp->t_outq.c_cc;
1382	if (ISSET(tp->t_state, TS_ZOMBIE))
1383		return (1);
1384	return (kn->kn_data <= tp->t_olowat &&
1385	    ISSET(tp->t_state, TS_CONNECTED));
1386}
1387
1388/*
1389 * Must be called at spltty().
1390 */
1391static int
1392ttnread(struct tty *tp)
1393{
1394	int nread;
1395
1396	if (ISSET(tp->t_lflag, PENDIN))
1397		ttypend(tp);
1398	nread = tp->t_canq.c_cc;
1399	if (!ISSET(tp->t_lflag, ICANON)) {
1400		nread += tp->t_rawq.c_cc;
1401		if (nread < tp->t_cc[VMIN] && tp->t_cc[VTIME] == 0)
1402			nread = 0;
1403	}
1404	return (nread);
1405}
1406
1407/*
1408 * Wait for output to drain.
1409 */
1410int
1411ttywait(struct tty *tp)
1412{
1413	int error, s;
1414
1415	error = 0;
1416	s = spltty();
1417	while ((tp->t_outq.c_cc || ISSET(tp->t_state, TS_BUSY)) &&
1418	       ISSET(tp->t_state, TS_CONNECTED) && tp->t_oproc) {
1419		tt_oproc(tp);
1420		if ((tp->t_outq.c_cc || ISSET(tp->t_state, TS_BUSY)) &&
1421		    ISSET(tp->t_state, TS_CONNECTED)) {
1422			SET(tp->t_state, TS_SO_OCOMPLETE);
1423			error = ttysleep(tp, TSA_OCOMPLETE(tp),
1424					 TTOPRI | PCATCH, "ttywai",
1425					 tp->t_timeout);
1426			if (error) {
1427				if (error == EWOULDBLOCK)
1428					error = EIO;
1429				break;
1430			}
1431		} else
1432			break;
1433	}
1434	if (!error && (tp->t_outq.c_cc || ISSET(tp->t_state, TS_BUSY)))
1435		error = EIO;
1436	splx(s);
1437	return (error);
1438}
1439
1440/*
1441 * Flush if successfully wait.
1442 */
1443static int
1444ttywflush(struct tty *tp)
1445{
1446	int error;
1447
1448	if ((error = ttywait(tp)) == 0)
1449		ttyflush(tp, FREAD);
1450	return (error);
1451}
1452
1453/*
1454 * Flush tty read and/or write queues, notifying anyone waiting.
1455 */
1456void
1457ttyflush(struct tty *tp, int rw)
1458{
1459	int s;
1460
1461	s = spltty();
1462#if 0
1463again:
1464#endif
1465	if (rw & FWRITE) {
1466		FLUSHQ(&tp->t_outq);
1467		CLR(tp->t_state, TS_TTSTOP);
1468	}
1469	tt_stop(tp, rw);
1470	if (rw & FREAD) {
1471		FLUSHQ(&tp->t_canq);
1472		FLUSHQ(&tp->t_rawq);
1473		CLR(tp->t_lflag, PENDIN);
1474		tp->t_rocount = 0;
1475		tp->t_rocol = 0;
1476		CLR(tp->t_state, TS_LOCAL);
1477		ttwakeup(tp);
1478		if (ISSET(tp->t_state, TS_TBLOCK)) {
1479			if (rw & FWRITE)
1480				FLUSHQ(&tp->t_outq);
1481			ttyunblock(tp);
1482
1483			/*
1484			 * Don't let leave any state that might clobber the
1485			 * next line discipline (although we should do more
1486			 * to send the START char).  Not clearing the state
1487			 * may have caused the "putc to a clist with no
1488			 * reserved cblocks" panic/printf.
1489			 */
1490			CLR(tp->t_state, TS_TBLOCK);
1491
1492#if 0 /* forget it, sleeping isn't always safe and we don't know when it is */
1493			if (ISSET(tp->t_iflag, IXOFF)) {
1494				/*
1495				 * XXX wait a bit in the hope that the stop
1496				 * character (if any) will go out.  Waiting
1497				 * isn't good since it allows races.  This
1498				 * will be fixed when the stop character is
1499				 * put in a special queue.  Don't bother with
1500				 * the checks in ttywait() since the timeout
1501				 * will save us.
1502				 */
1503				SET(tp->t_state, TS_SO_OCOMPLETE);
1504				ttysleep(tp, TSA_OCOMPLETE(tp), TTOPRI,
1505					 "ttyfls", hz / 10);
1506				/*
1507				 * Don't try sending the stop character again.
1508				 */
1509				CLR(tp->t_state, TS_TBLOCK);
1510				goto again;
1511			}
1512#endif
1513		}
1514	}
1515	if (rw & FWRITE) {
1516		FLUSHQ(&tp->t_outq);
1517		ttwwakeup(tp);
1518	}
1519	splx(s);
1520}
1521
1522/*
1523 * Copy in the default termios characters.
1524 */
1525void
1526termioschars(struct termios *t)
1527{
1528
1529	bcopy(ttydefchars, t->c_cc, sizeof t->c_cc);
1530}
1531
1532/*
1533 * Old interface.
1534 */
1535void
1536ttychars(struct tty *tp)
1537{
1538
1539	termioschars(&tp->t_termios);
1540}
1541
1542/*
1543 * Handle input high water.  Send stop character for the IXOFF case.  Turn
1544 * on our input flow control bit and propagate the changes to the driver.
1545 * XXX the stop character should be put in a special high priority queue.
1546 */
1547void
1548ttyblock(struct tty *tp)
1549{
1550
1551	SET(tp->t_state, TS_TBLOCK);
1552	if (ISSET(tp->t_iflag, IXOFF) && tp->t_cc[VSTOP] != _POSIX_VDISABLE &&
1553	    putc(tp->t_cc[VSTOP], &tp->t_outq) != 0)
1554		CLR(tp->t_state, TS_TBLOCK);	/* try again later */
1555	ttstart(tp);
1556}
1557
1558/*
1559 * Handle input low water.  Send start character for the IXOFF case.  Turn
1560 * off our input flow control bit and propagate the changes to the driver.
1561 * XXX the start character should be put in a special high priority queue.
1562 */
1563static void
1564ttyunblock(struct tty *tp)
1565{
1566
1567	CLR(tp->t_state, TS_TBLOCK);
1568	if (ISSET(tp->t_iflag, IXOFF) && tp->t_cc[VSTART] != _POSIX_VDISABLE &&
1569	    putc(tp->t_cc[VSTART], &tp->t_outq) != 0)
1570		SET(tp->t_state, TS_TBLOCK);	/* try again later */
1571	ttstart(tp);
1572}
1573
1574#ifdef notyet
1575/* Not used by any current (i386) drivers. */
1576/*
1577 * Restart after an inter-char delay.
1578 */
1579void
1580ttrstrt(void *tp_arg)
1581{
1582	struct tty *tp;
1583	int s;
1584
1585	KASSERT(tp_arg != NULL, ("ttrstrt"));
1586
1587	tp = tp_arg;
1588	s = spltty();
1589
1590	CLR(tp->t_state, TS_TIMEOUT);
1591	ttstart(tp);
1592
1593	splx(s);
1594}
1595#endif
1596
1597int
1598ttstart(struct tty *tp)
1599{
1600
1601	tt_oproc(tp);
1602	return (0);
1603}
1604
1605/*
1606 * "close" a line discipline
1607 */
1608int
1609ttylclose(struct tty *tp, int flag)
1610{
1611
1612	if (flag & FNONBLOCK || ttywflush(tp))
1613		ttyflush(tp, FREAD | FWRITE);
1614	return (0);
1615}
1616
1617/*
1618 * Handle modem control transition on a tty.
1619 * Flag indicates new state of carrier.
1620 * Returns 0 if the line should be turned off, otherwise 1.
1621 */
1622int
1623ttymodem(struct tty *tp, int flag)
1624{
1625
1626	if (ISSET(tp->t_state, TS_CARR_ON) && ISSET(tp->t_cflag, MDMBUF)) {
1627		/*
1628		 * MDMBUF: do flow control according to carrier flag
1629		 * XXX TS_CAR_OFLOW doesn't do anything yet.  TS_TTSTOP
1630		 * works if IXON and IXANY are clear.
1631		 */
1632		if (flag) {
1633			CLR(tp->t_state, TS_CAR_OFLOW);
1634			CLR(tp->t_state, TS_TTSTOP);
1635			ttstart(tp);
1636		} else if (!ISSET(tp->t_state, TS_CAR_OFLOW)) {
1637			SET(tp->t_state, TS_CAR_OFLOW);
1638			SET(tp->t_state, TS_TTSTOP);
1639			tt_stop(tp, 0);
1640		}
1641	} else if (flag == 0) {
1642		/*
1643		 * Lost carrier.
1644		 */
1645		CLR(tp->t_state, TS_CARR_ON);
1646		if (ISSET(tp->t_state, TS_ISOPEN) &&
1647		    !ISSET(tp->t_cflag, CLOCAL)) {
1648			SET(tp->t_state, TS_ZOMBIE);
1649			CLR(tp->t_state, TS_CONNECTED);
1650			if (tp->t_session) {
1651				sx_slock(&proctree_lock);
1652				if (tp->t_session->s_leader) {
1653					struct proc *p;
1654
1655					p = tp->t_session->s_leader;
1656					PROC_LOCK(p);
1657					psignal(p, SIGHUP);
1658					PROC_UNLOCK(p);
1659				}
1660				sx_sunlock(&proctree_lock);
1661			}
1662			ttyflush(tp, FREAD | FWRITE);
1663			return (0);
1664		}
1665	} else {
1666		/*
1667		 * Carrier now on.
1668		 */
1669		SET(tp->t_state, TS_CARR_ON);
1670		if (!ISSET(tp->t_state, TS_ZOMBIE))
1671			SET(tp->t_state, TS_CONNECTED);
1672		wakeup(TSA_CARR_ON(tp));
1673		ttwakeup(tp);
1674		ttwwakeup(tp);
1675	}
1676	return (1);
1677}
1678
1679/*
1680 * Reinput pending characters after state switch
1681 * call at spltty().
1682 */
1683static void
1684ttypend(struct tty *tp)
1685{
1686	struct clist tq;
1687	int c;
1688
1689	CLR(tp->t_lflag, PENDIN);
1690	SET(tp->t_state, TS_TYPEN);
1691	/*
1692	 * XXX this assumes too much about clist internals.  It may even
1693	 * fail if the cblock slush pool is empty.  We can't allocate more
1694	 * cblocks here because we are called from an interrupt handler
1695	 * and clist_alloc_cblocks() can wait.
1696	 */
1697	tq = tp->t_rawq;
1698	bzero(&tp->t_rawq, sizeof tp->t_rawq);
1699	tp->t_rawq.c_cbmax = tq.c_cbmax;
1700	tp->t_rawq.c_cbreserved = tq.c_cbreserved;
1701	while ((c = getc(&tq)) >= 0)
1702		ttyinput(c, tp);
1703	CLR(tp->t_state, TS_TYPEN);
1704}
1705
1706/*
1707 * Process a read call on a tty device.
1708 */
1709int
1710ttread(struct tty *tp, struct uio *uio, int flag)
1711{
1712	struct clist *qp;
1713	int c;
1714	tcflag_t lflag;
1715	cc_t *cc = tp->t_cc;
1716	struct thread *td;
1717	struct proc *p;
1718	int s, first, error = 0;
1719	int has_stime = 0, last_cc = 0;
1720	long slp = 0;		/* XXX this should be renamed `timo'. */
1721	struct timeval stime;
1722	struct pgrp *pg;
1723
1724	td = curthread;
1725	p = td->td_proc;
1726loop:
1727	s = spltty();
1728	lflag = tp->t_lflag;
1729	/*
1730	 * take pending input first
1731	 */
1732	if (ISSET(lflag, PENDIN)) {
1733		ttypend(tp);
1734		splx(s);	/* reduce latency */
1735		s = spltty();
1736		lflag = tp->t_lflag;	/* XXX ttypend() clobbers it */
1737	}
1738
1739	/*
1740	 * Hang process if it's in the background.
1741	 */
1742	if (isbackground(p, tp)) {
1743		splx(s);
1744		sx_slock(&proctree_lock);
1745		PROC_LOCK(p);
1746		if (SIGISMEMBER(p->p_sigacts->ps_sigignore, SIGTTIN) ||
1747		    SIGISMEMBER(td->td_sigmask, SIGTTIN) ||
1748		    (p->p_flag & P_PPWAIT) || p->p_pgrp->pg_jobc == 0) {
1749			PROC_UNLOCK(p);
1750			sx_sunlock(&proctree_lock);
1751			return (EIO);
1752		}
1753		pg = p->p_pgrp;
1754		PROC_UNLOCK(p);
1755		PGRP_LOCK(pg);
1756		sx_sunlock(&proctree_lock);
1757		pgsignal(pg, SIGTTIN, 1);
1758		PGRP_UNLOCK(pg);
1759		error = ttysleep(tp, &lbolt, TTIPRI | PCATCH, "ttybg2", 0);
1760		if (error)
1761			return (error);
1762		goto loop;
1763	}
1764
1765	if (ISSET(tp->t_state, TS_ZOMBIE)) {
1766		splx(s);
1767		return (0);	/* EOF */
1768	}
1769
1770	/*
1771	 * If canonical, use the canonical queue,
1772	 * else use the raw queue.
1773	 *
1774	 * (should get rid of clists...)
1775	 */
1776	qp = ISSET(lflag, ICANON) ? &tp->t_canq : &tp->t_rawq;
1777
1778	if (flag & IO_NDELAY) {
1779		if (qp->c_cc > 0)
1780			goto read;
1781		if (!ISSET(lflag, ICANON) && cc[VMIN] == 0) {
1782			splx(s);
1783			return (0);
1784		}
1785		splx(s);
1786		return (EWOULDBLOCK);
1787	}
1788	if (!ISSET(lflag, ICANON)) {
1789		int m = cc[VMIN];
1790		long t = cc[VTIME];
1791		struct timeval timecopy;
1792
1793		/*
1794		 * Check each of the four combinations.
1795		 * (m > 0 && t == 0) is the normal read case.
1796		 * It should be fairly efficient, so we check that and its
1797		 * companion case (m == 0 && t == 0) first.
1798		 * For the other two cases, we compute the target sleep time
1799		 * into slp.
1800		 */
1801		if (t == 0) {
1802			if (qp->c_cc < m)
1803				goto sleep;
1804			if (qp->c_cc > 0)
1805				goto read;
1806
1807			/* m, t and qp->c_cc are all 0.  0 is enough input. */
1808			splx(s);
1809			return (0);
1810		}
1811		t *= 100000;		/* time in us */
1812#define diff(t1, t2) (((t1).tv_sec - (t2).tv_sec) * 1000000 + \
1813			 ((t1).tv_usec - (t2).tv_usec))
1814		if (m > 0) {
1815			if (qp->c_cc <= 0)
1816				goto sleep;
1817			if (qp->c_cc >= m)
1818				goto read;
1819			getmicrotime(&timecopy);
1820			if (!has_stime) {
1821				/* first character, start timer */
1822				has_stime = 1;
1823				stime = timecopy;
1824				slp = t;
1825			} else if (qp->c_cc > last_cc) {
1826				/* got a character, restart timer */
1827				stime = timecopy;
1828				slp = t;
1829			} else {
1830				/* nothing, check expiration */
1831				slp = t - diff(timecopy, stime);
1832				if (slp <= 0)
1833					goto read;
1834			}
1835			last_cc = qp->c_cc;
1836		} else {	/* m == 0 */
1837			if (qp->c_cc > 0)
1838				goto read;
1839			getmicrotime(&timecopy);
1840			if (!has_stime) {
1841				has_stime = 1;
1842				stime = timecopy;
1843				slp = t;
1844			} else {
1845				slp = t - diff(timecopy, stime);
1846				if (slp <= 0) {
1847					/* Timed out, but 0 is enough input. */
1848					splx(s);
1849					return (0);
1850				}
1851			}
1852		}
1853#undef diff
1854		if (slp != 0) {
1855			struct timeval tv;	/* XXX style bug. */
1856
1857			tv.tv_sec = slp / 1000000;
1858			tv.tv_usec = slp % 1000000;
1859			slp = tvtohz(&tv);
1860			/*
1861			 * XXX bad variable names.  slp was the timeout in
1862			 * usec.  Now it is the timeout in ticks.
1863			 */
1864		}
1865		goto sleep;
1866	}
1867	if (qp->c_cc <= 0) {
1868sleep:
1869		/*
1870		 * There is no input, or not enough input and we can block.
1871		 */
1872		error = ttysleep(tp, TSA_HUP_OR_INPUT(tp), TTIPRI | PCATCH,
1873				 ISSET(tp->t_state, TS_CONNECTED) ?
1874				 "ttyin" : "ttyhup", (int)slp);
1875		splx(s);
1876		if (error == EWOULDBLOCK)
1877			error = 0;
1878		else if (error)
1879			return (error);
1880		/*
1881		 * XXX what happens if another process eats some input
1882		 * while we are asleep (not just here)?  It would be
1883		 * safest to detect changes and reset our state variables
1884		 * (has_stime and last_cc).
1885		 */
1886		slp = 0;
1887		goto loop;
1888	}
1889read:
1890	splx(s);
1891	/*
1892	 * Input present, check for input mapping and processing.
1893	 */
1894	first = 1;
1895	if (ISSET(lflag, ICANON | ISIG))
1896		goto slowcase;
1897	for (;;) {
1898		char ibuf[IBUFSIZ];
1899		int icc;
1900
1901		icc = imin(uio->uio_resid, IBUFSIZ);
1902		icc = q_to_b(qp, ibuf, icc);
1903		if (icc <= 0) {
1904			if (first)
1905				goto loop;
1906			break;
1907		}
1908		error = uiomove(ibuf, icc, uio);
1909		/*
1910		 * XXX if there was an error then we should ungetc() the
1911		 * unmoved chars and reduce icc here.
1912		 */
1913		if (error)
1914			break;
1915		if (uio->uio_resid == 0)
1916			break;
1917		first = 0;
1918	}
1919	goto out;
1920slowcase:
1921	for (;;) {
1922		c = getc(qp);
1923		if (c < 0) {
1924			if (first)
1925				goto loop;
1926			break;
1927		}
1928		/*
1929		 * delayed suspend (^Y)
1930		 */
1931		if (CCEQ(cc[VDSUSP], c) &&
1932		    ISSET(lflag, IEXTEN | ISIG) == (IEXTEN | ISIG)) {
1933			if (tp->t_pgrp != NULL) {
1934				PGRP_LOCK(tp->t_pgrp);
1935				pgsignal(tp->t_pgrp, SIGTSTP, 1);
1936				PGRP_UNLOCK(tp->t_pgrp);
1937			}
1938			if (first) {
1939				error = ttysleep(tp, &lbolt, TTIPRI | PCATCH,
1940						 "ttybg3", 0);
1941				if (error)
1942					break;
1943				goto loop;
1944			}
1945			break;
1946		}
1947		/*
1948		 * Interpret EOF only in canonical mode.
1949		 */
1950		if (CCEQ(cc[VEOF], c) && ISSET(lflag, ICANON))
1951			break;
1952		/*
1953		 * Give user character.
1954		 */
1955		error = ureadc(c, uio);
1956		if (error)
1957			/* XXX should ungetc(c, qp). */
1958			break;
1959		if (uio->uio_resid == 0)
1960			break;
1961		/*
1962		 * In canonical mode check for a "break character"
1963		 * marking the end of a "line of input".
1964		 */
1965		if (ISSET(lflag, ICANON) && TTBREAKC(c, lflag))
1966			break;
1967		first = 0;
1968	}
1969
1970out:
1971	/*
1972	 * Look to unblock input now that (presumably)
1973	 * the input queue has gone down.
1974	 */
1975	s = spltty();
1976	if (ISSET(tp->t_state, TS_TBLOCK) &&
1977	    tp->t_rawq.c_cc + tp->t_canq.c_cc <= tp->t_ilowat)
1978		ttyunblock(tp);
1979	splx(s);
1980
1981	return (error);
1982}
1983
1984/*
1985 * Check the output queue on tp for space for a kernel message (from uprintf
1986 * or tprintf).  Allow some space over the normal hiwater mark so we don't
1987 * lose messages due to normal flow control, but don't let the tty run amok.
1988 * Sleeps here are not interruptible, but we return prematurely if new signals
1989 * arrive.
1990 */
1991int
1992ttycheckoutq(struct tty *tp, int wait)
1993{
1994	int hiwat, s;
1995	sigset_t oldmask;
1996	struct thread *td;
1997	struct proc *p;
1998
1999	td = curthread;
2000	p = td->td_proc;
2001	hiwat = tp->t_ohiwat;
2002	SIGEMPTYSET(oldmask);
2003	s = spltty();
2004	if (wait) {
2005		PROC_LOCK(p);
2006		oldmask = td->td_siglist;
2007		PROC_UNLOCK(p);
2008	}
2009	if (tp->t_outq.c_cc > hiwat + OBUFSIZ + 100)
2010		while (tp->t_outq.c_cc > hiwat) {
2011			ttstart(tp);
2012			if (tp->t_outq.c_cc <= hiwat)
2013				break;
2014			if (!wait) {
2015				splx(s);
2016				return (0);
2017			}
2018			PROC_LOCK(p);
2019			if (!SIGSETEQ(td->td_siglist, oldmask)) {
2020				PROC_UNLOCK(p);
2021				splx(s);
2022				return (0);
2023			}
2024			PROC_UNLOCK(p);
2025			SET(tp->t_state, TS_SO_OLOWAT);
2026			tsleep(TSA_OLOWAT(tp), PZERO - 1, "ttoutq", hz);
2027		}
2028	splx(s);
2029	return (1);
2030}
2031
2032/*
2033 * Process a write call on a tty device.
2034 */
2035int
2036ttwrite(struct tty *tp, struct uio *uio, int flag)
2037{
2038	char *cp = NULL;
2039	int cc, ce;
2040	struct thread *td;
2041	struct proc *p;
2042	int i, hiwat, cnt, error, s;
2043	char obuf[OBUFSIZ];
2044
2045	hiwat = tp->t_ohiwat;
2046	cnt = uio->uio_resid;
2047	error = 0;
2048	cc = 0;
2049	td = curthread;
2050	p = td->td_proc;
2051loop:
2052	s = spltty();
2053	if (ISSET(tp->t_state, TS_ZOMBIE)) {
2054		splx(s);
2055		if (uio->uio_resid == cnt)
2056			error = EIO;
2057		goto out;
2058	}
2059	if (!ISSET(tp->t_state, TS_CONNECTED)) {
2060		if (flag & IO_NDELAY) {
2061			splx(s);
2062			error = EWOULDBLOCK;
2063			goto out;
2064		}
2065		error = ttysleep(tp, TSA_CARR_ON(tp), TTIPRI | PCATCH,
2066				 "ttywdcd", 0);
2067		splx(s);
2068		if (error)
2069			goto out;
2070		goto loop;
2071	}
2072	splx(s);
2073	/*
2074	 * Hang the process if it's in the background.
2075	 */
2076	sx_slock(&proctree_lock);
2077	PROC_LOCK(p);
2078	if (isbackground(p, tp) &&
2079	    ISSET(tp->t_lflag, TOSTOP) && !(p->p_flag & P_PPWAIT) &&
2080	    !SIGISMEMBER(p->p_sigacts->ps_sigignore, SIGTTOU) &&
2081	    !SIGISMEMBER(td->td_sigmask, SIGTTOU)) {
2082		if (p->p_pgrp->pg_jobc == 0) {
2083			PROC_UNLOCK(p);
2084			sx_sunlock(&proctree_lock);
2085			error = EIO;
2086			goto out;
2087		}
2088		PROC_UNLOCK(p);
2089		PGRP_LOCK(p->p_pgrp);
2090		sx_sunlock(&proctree_lock);
2091		pgsignal(p->p_pgrp, SIGTTOU, 1);
2092		PGRP_UNLOCK(p->p_pgrp);
2093		error = ttysleep(tp, &lbolt, TTIPRI | PCATCH, "ttybg4", 0);
2094		if (error)
2095			goto out;
2096		goto loop;
2097	} else {
2098		PROC_UNLOCK(p);
2099		sx_sunlock(&proctree_lock);
2100	}
2101	/*
2102	 * Process the user's data in at most OBUFSIZ chunks.  Perform any
2103	 * output translation.  Keep track of high water mark, sleep on
2104	 * overflow awaiting device aid in acquiring new space.
2105	 */
2106	while (uio->uio_resid > 0 || cc > 0) {
2107		if (ISSET(tp->t_lflag, FLUSHO)) {
2108			uio->uio_resid = 0;
2109			return (0);
2110		}
2111		if (tp->t_outq.c_cc > hiwat)
2112			goto ovhiwat;
2113		/*
2114		 * Grab a hunk of data from the user, unless we have some
2115		 * leftover from last time.
2116		 */
2117		if (cc == 0) {
2118			cc = imin(uio->uio_resid, OBUFSIZ);
2119			cp = obuf;
2120			error = uiomove(cp, cc, uio);
2121			if (error) {
2122				cc = 0;
2123				break;
2124			}
2125		}
2126		/*
2127		 * If nothing fancy need be done, grab those characters we
2128		 * can handle without any of ttyoutput's processing and
2129		 * just transfer them to the output q.  For those chars
2130		 * which require special processing (as indicated by the
2131		 * bits in char_type), call ttyoutput.  After processing
2132		 * a hunk of data, look for FLUSHO so ^O's will take effect
2133		 * immediately.
2134		 */
2135		while (cc > 0) {
2136			if (!ISSET(tp->t_oflag, OPOST))
2137				ce = cc;
2138			else {
2139				ce = cc - scanc((u_int)cc, (u_char *)cp,
2140						char_type, CCLASSMASK);
2141				/*
2142				 * If ce is zero, then we're processing
2143				 * a special character through ttyoutput.
2144				 */
2145				if (ce == 0) {
2146					tp->t_rocount = 0;
2147					if (ttyoutput(*cp, tp) >= 0) {
2148						/* No Clists, wait a bit. */
2149						ttstart(tp);
2150						if (flag & IO_NDELAY) {
2151							error = EWOULDBLOCK;
2152							goto out;
2153						}
2154						error = ttysleep(tp, &lbolt,
2155								 TTOPRI|PCATCH,
2156								 "ttybf1", 0);
2157						if (error)
2158							goto out;
2159						goto loop;
2160					}
2161					cp++;
2162					cc--;
2163					if (ISSET(tp->t_lflag, FLUSHO) ||
2164					    tp->t_outq.c_cc > hiwat)
2165						goto ovhiwat;
2166					continue;
2167				}
2168			}
2169			/*
2170			 * A bunch of normal characters have been found.
2171			 * Transfer them en masse to the output queue and
2172			 * continue processing at the top of the loop.
2173			 * If there are any further characters in this
2174			 * <= OBUFSIZ chunk, the first should be a character
2175			 * requiring special handling by ttyoutput.
2176			 */
2177			tp->t_rocount = 0;
2178			i = b_to_q(cp, ce, &tp->t_outq);
2179			ce -= i;
2180			tp->t_column += ce;
2181			cp += ce, cc -= ce, tk_nout += ce;
2182			tp->t_outcc += ce;
2183			if (i > 0) {
2184				/* No Clists, wait a bit. */
2185				ttstart(tp);
2186				if (flag & IO_NDELAY) {
2187					error = EWOULDBLOCK;
2188					goto out;
2189				}
2190				error = ttysleep(tp, &lbolt, TTOPRI | PCATCH,
2191						 "ttybf2", 0);
2192				if (error)
2193					goto out;
2194				goto loop;
2195			}
2196			if (ISSET(tp->t_lflag, FLUSHO) ||
2197			    tp->t_outq.c_cc > hiwat)
2198				break;
2199		}
2200		ttstart(tp);
2201	}
2202out:
2203	/*
2204	 * If cc is nonzero, we leave the uio structure inconsistent, as the
2205	 * offset and iov pointers have moved forward, but it doesn't matter
2206	 * (the call will either return short or restart with a new uio).
2207	 */
2208	uio->uio_resid += cc;
2209	return (error);
2210
2211ovhiwat:
2212	ttstart(tp);
2213	s = spltty();
2214	/*
2215	 * This can only occur if FLUSHO is set in t_lflag,
2216	 * or if ttstart/oproc is synchronous (or very fast).
2217	 */
2218	if (tp->t_outq.c_cc <= hiwat) {
2219		splx(s);
2220		goto loop;
2221	}
2222	if (flag & IO_NDELAY) {
2223		splx(s);
2224		uio->uio_resid += cc;
2225		return (uio->uio_resid == cnt ? EWOULDBLOCK : 0);
2226	}
2227	SET(tp->t_state, TS_SO_OLOWAT);
2228	error = ttysleep(tp, TSA_OLOWAT(tp), TTOPRI | PCATCH, "ttywri",
2229			 tp->t_timeout);
2230	splx(s);
2231	if (error == EWOULDBLOCK)
2232		error = EIO;
2233	if (error)
2234		goto out;
2235	goto loop;
2236}
2237
2238/*
2239 * Rubout one character from the rawq of tp
2240 * as cleanly as possible.
2241 */
2242static void
2243ttyrub(int c, struct tty *tp)
2244{
2245	char *cp;
2246	int savecol;
2247	int tabc, s;
2248
2249	if (!ISSET(tp->t_lflag, ECHO) || ISSET(tp->t_lflag, EXTPROC))
2250		return;
2251	CLR(tp->t_lflag, FLUSHO);
2252	if (ISSET(tp->t_lflag, ECHOE)) {
2253		if (tp->t_rocount == 0) {
2254			/*
2255			 * Screwed by ttwrite; retype
2256			 */
2257			ttyretype(tp);
2258			return;
2259		}
2260		if (c == ('\t' | TTY_QUOTE) || c == ('\n' | TTY_QUOTE))
2261			ttyrubo(tp, 2);
2262		else {
2263			CLR(c, ~TTY_CHARMASK);
2264			switch (CCLASS(c)) {
2265			case ORDINARY:
2266				ttyrubo(tp, 1);
2267				break;
2268			case BACKSPACE:
2269			case CONTROL:
2270			case NEWLINE:
2271			case RETURN:
2272			case VTAB:
2273				if (ISSET(tp->t_lflag, ECHOCTL))
2274					ttyrubo(tp, 2);
2275				break;
2276			case TAB:
2277				if (tp->t_rocount < tp->t_rawq.c_cc) {
2278					ttyretype(tp);
2279					return;
2280				}
2281				s = spltty();
2282				savecol = tp->t_column;
2283				SET(tp->t_state, TS_CNTTB);
2284				SET(tp->t_lflag, FLUSHO);
2285				tp->t_column = tp->t_rocol;
2286				cp = tp->t_rawq.c_cf;
2287				if (cp)
2288					tabc = *cp;	/* XXX FIX NEXTC */
2289				for (; cp; cp = nextc(&tp->t_rawq, cp, &tabc))
2290					ttyecho(tabc, tp);
2291				CLR(tp->t_lflag, FLUSHO);
2292				CLR(tp->t_state, TS_CNTTB);
2293				splx(s);
2294
2295				/* savecol will now be length of the tab. */
2296				savecol -= tp->t_column;
2297				tp->t_column += savecol;
2298				if (savecol > 8)
2299					savecol = 8;	/* overflow screw */
2300				while (--savecol >= 0)
2301					(void)ttyoutput('\b', tp);
2302				break;
2303			default:			/* XXX */
2304#define	PANICSTR	"ttyrub: would panic c = %d, val = %d\n"
2305				(void)printf(PANICSTR, c, CCLASS(c));
2306#ifdef notdef
2307				panic(PANICSTR, c, CCLASS(c));
2308#endif
2309			}
2310		}
2311	} else if (ISSET(tp->t_lflag, ECHOPRT)) {
2312		if (!ISSET(tp->t_state, TS_ERASE)) {
2313			SET(tp->t_state, TS_ERASE);
2314			(void)ttyoutput('\\', tp);
2315		}
2316		ttyecho(c, tp);
2317	} else {
2318		ttyecho(tp->t_cc[VERASE], tp);
2319		/*
2320		 * This code may be executed not only when an ERASE key
2321		 * is pressed, but also when ^U (KILL) or ^W (WERASE) are.
2322		 * So, I didn't think it was worthwhile to pass the extra
2323		 * information (which would need an extra parameter,
2324		 * changing every call) needed to distinguish the ERASE2
2325		 * case from the ERASE.
2326		 */
2327	}
2328	--tp->t_rocount;
2329}
2330
2331/*
2332 * Back over cnt characters, erasing them.
2333 */
2334static void
2335ttyrubo(struct tty *tp, int cnt)
2336{
2337
2338	while (cnt-- > 0) {
2339		(void)ttyoutput('\b', tp);
2340		(void)ttyoutput(' ', tp);
2341		(void)ttyoutput('\b', tp);
2342	}
2343}
2344
2345/*
2346 * ttyretype --
2347 *	Reprint the rawq line.  Note, it is assumed that c_cc has already
2348 *	been checked.
2349 */
2350static void
2351ttyretype(struct tty *tp)
2352{
2353	char *cp;
2354	int s, c;
2355
2356	/* Echo the reprint character. */
2357	if (tp->t_cc[VREPRINT] != _POSIX_VDISABLE)
2358		ttyecho(tp->t_cc[VREPRINT], tp);
2359
2360	(void)ttyoutput('\n', tp);
2361
2362	/*
2363	 * XXX
2364	 * FIX: NEXTC IS BROKEN - DOESN'T CHECK QUOTE
2365	 * BIT OF FIRST CHAR.
2366	 */
2367	s = spltty();
2368	for (cp = tp->t_canq.c_cf, c = (cp != NULL ? *cp : 0);
2369	    cp != NULL; cp = nextc(&tp->t_canq, cp, &c))
2370		ttyecho(c, tp);
2371	for (cp = tp->t_rawq.c_cf, c = (cp != NULL ? *cp : 0);
2372	    cp != NULL; cp = nextc(&tp->t_rawq, cp, &c))
2373		ttyecho(c, tp);
2374	CLR(tp->t_state, TS_ERASE);
2375	splx(s);
2376
2377	tp->t_rocount = tp->t_rawq.c_cc;
2378	tp->t_rocol = 0;
2379}
2380
2381/*
2382 * Echo a typed character to the terminal.
2383 */
2384static void
2385ttyecho(int c, struct tty *tp)
2386{
2387
2388	if (!ISSET(tp->t_state, TS_CNTTB))
2389		CLR(tp->t_lflag, FLUSHO);
2390	if ((!ISSET(tp->t_lflag, ECHO) &&
2391	     (c != '\n' || !ISSET(tp->t_lflag, ECHONL))) ||
2392	    ISSET(tp->t_lflag, EXTPROC))
2393		return;
2394	if (ISSET(tp->t_lflag, ECHOCTL) &&
2395	    ((ISSET(c, TTY_CHARMASK) <= 037 && c != '\t' && c != '\n') ||
2396	    ISSET(c, TTY_CHARMASK) == 0177)) {
2397		(void)ttyoutput('^', tp);
2398		CLR(c, ~TTY_CHARMASK);
2399		if (c == 0177)
2400			c = '?';
2401		else
2402			c += 'A' - 1;
2403	}
2404	(void)ttyoutput(c, tp);
2405}
2406
2407/*
2408 * Wake up any readers on a tty.
2409 */
2410void
2411ttwakeup(struct tty *tp)
2412{
2413
2414	if (SEL_WAITING(&tp->t_rsel))
2415		selwakeuppri(&tp->t_rsel, TTIPRI);
2416	if (ISSET(tp->t_state, TS_ASYNC) && tp->t_sigio != NULL)
2417		pgsigio(&tp->t_sigio, SIGIO, (tp->t_session != NULL));
2418	wakeup(TSA_HUP_OR_INPUT(tp));
2419	KNOTE_UNLOCKED(&tp->t_rsel.si_note, 0);
2420}
2421
2422/*
2423 * Wake up any writers on a tty.
2424 */
2425void
2426ttwwakeup(struct tty *tp)
2427{
2428
2429	if (SEL_WAITING(&tp->t_wsel) && tp->t_outq.c_cc <= tp->t_olowat)
2430		selwakeuppri(&tp->t_wsel, TTOPRI);
2431	if (ISSET(tp->t_state, TS_ASYNC) && tp->t_sigio != NULL)
2432		pgsigio(&tp->t_sigio, SIGIO, (tp->t_session != NULL));
2433	if (ISSET(tp->t_state, TS_BUSY | TS_SO_OCOMPLETE) ==
2434	    TS_SO_OCOMPLETE && tp->t_outq.c_cc == 0) {
2435		CLR(tp->t_state, TS_SO_OCOMPLETE);
2436		wakeup(TSA_OCOMPLETE(tp));
2437	}
2438	if (ISSET(tp->t_state, TS_SO_OLOWAT) &&
2439	    tp->t_outq.c_cc <= tp->t_olowat) {
2440		CLR(tp->t_state, TS_SO_OLOWAT);
2441		wakeup(TSA_OLOWAT(tp));
2442	}
2443	KNOTE_UNLOCKED(&tp->t_wsel.si_note, 0);
2444}
2445
2446/*
2447 * Look up a code for a specified speed in a conversion table;
2448 * used by drivers to map software speed values to hardware parameters.
2449 */
2450int
2451ttspeedtab(int speed, struct speedtab *table)
2452{
2453
2454	for ( ; table->sp_speed != -1; table++)
2455		if (table->sp_speed == speed)
2456			return (table->sp_code);
2457	return (-1);
2458}
2459
2460/*
2461 * Set input and output watermarks and buffer sizes.  For input, the
2462 * high watermark is about one second's worth of input above empty, the
2463 * low watermark is slightly below high water, and the buffer size is a
2464 * driver-dependent amount above high water.  For output, the watermarks
2465 * are near the ends of the buffer, with about 1 second's worth of input
2466 * between them.  All this only applies to the standard line discipline.
2467 */
2468void
2469ttsetwater(struct tty *tp)
2470{
2471	int cps, ttmaxhiwat, x;
2472
2473	/* Input. */
2474	clist_alloc_cblocks(&tp->t_canq, TTYHOG, 512);
2475	switch (tp->t_ispeedwat) {
2476	case (speed_t)-1:
2477		cps = tp->t_ispeed / 10;
2478		break;
2479	case 0:
2480		/*
2481		 * This case is for old drivers that don't know about
2482		 * t_ispeedwat.  Arrange for them to get the old buffer
2483		 * sizes and watermarks.
2484		 */
2485		cps = TTYHOG - 2 * 256;
2486		tp->t_ififosize = 2 * 256;
2487		break;
2488	default:
2489		cps = tp->t_ispeedwat / 10;
2490		break;
2491	}
2492	tp->t_ihiwat = cps;
2493	tp->t_ilowat = 7 * cps / 8;
2494	x = cps + tp->t_ififosize;
2495	clist_alloc_cblocks(&tp->t_rawq, x, x);
2496
2497	/* Output. */
2498	switch (tp->t_ospeedwat) {
2499	case (speed_t)-1:
2500		cps = tp->t_ospeed / 10;
2501		ttmaxhiwat = 2 * TTMAXHIWAT;
2502		break;
2503	case 0:
2504		cps = tp->t_ospeed / 10;
2505		ttmaxhiwat = TTMAXHIWAT;
2506		break;
2507	default:
2508		cps = tp->t_ospeedwat / 10;
2509		ttmaxhiwat = 8 * TTMAXHIWAT;
2510		break;
2511	}
2512#define CLAMP(x, h, l)	((x) > h ? h : ((x) < l) ? l : (x))
2513	tp->t_olowat = x = CLAMP(cps / 2, TTMAXLOWAT, TTMINLOWAT);
2514	x += cps;
2515	x = CLAMP(x, ttmaxhiwat, TTMINHIWAT);	/* XXX clamps are too magic */
2516	tp->t_ohiwat = roundup(x, CBSIZE);	/* XXX for compat */
2517	x = imax(tp->t_ohiwat, TTMAXHIWAT);	/* XXX for compat/safety */
2518	x += OBUFSIZ + 100;
2519	clist_alloc_cblocks(&tp->t_outq, x, x);
2520#undef	CLAMP
2521}
2522
2523/*
2524 * Report on state of foreground process group.
2525 */
2526void
2527ttyinfo(struct tty *tp)
2528{
2529	struct timeval utime, stime;
2530	struct proc *p, *pick;
2531	struct thread *td;
2532	const char *stateprefix, *state;
2533	long rss;
2534	int load, pctcpu;
2535	pid_t pid;
2536	char comm[MAXCOMLEN + 1];
2537
2538	if (ttycheckoutq(tp,0) == 0)
2539		return;
2540
2541	/* Print load average. */
2542	load = (averunnable.ldavg[0] * 100 + FSCALE / 2) >> FSHIFT;
2543	ttyprintf(tp, "load: %d.%02d ", load / 100, load % 100);
2544
2545	/*
2546	 * On return following a ttyprintf(), we set tp->t_rocount to 0 so
2547	 * that pending input will be retyped on BS.
2548	 */
2549	if (tp->t_session == NULL) {
2550		ttyprintf(tp, "not a controlling terminal\n");
2551		tp->t_rocount = 0;
2552		return;
2553	}
2554	if (tp->t_pgrp == NULL) {
2555		ttyprintf(tp, "no foreground process group\n");
2556		tp->t_rocount = 0;
2557		return;
2558	}
2559	PGRP_LOCK(tp->t_pgrp);
2560	if (LIST_EMPTY(&tp->t_pgrp->pg_members)) {
2561		PGRP_UNLOCK(tp->t_pgrp);
2562		ttyprintf(tp, "empty foreground process group\n");
2563		tp->t_rocount = 0;
2564		return;
2565	}
2566
2567	/*
2568	 * Pick the most interesting process and copy some of its
2569	 * state for printing later.  sched_lock must be held for
2570	 * most parts of this.  Holding it throughout is simplest
2571	 * and prevents even unimportant inconsistencies in the
2572	 * copy of the state, but may increase interrupt latency
2573	 * too much.
2574	 */
2575	pick = NULL;
2576	mtx_lock_spin(&sched_lock);
2577	LIST_FOREACH(p, &tp->t_pgrp->pg_members, p_pglist)
2578		if (proc_compare(pick, p))
2579			pick = p;
2580
2581	td = FIRST_THREAD_IN_PROC(pick);	/* XXXKSE */
2582#if 0
2583	KASSERT(td != NULL, ("ttyinfo: no thread"));
2584#else
2585	if (td == NULL) {
2586		mtx_unlock_spin(&sched_lock);
2587		PGRP_UNLOCK(tp->t_pgrp);
2588		ttyprintf(tp, "foreground process without thread\n");
2589		tp->t_rocount = 0;
2590		return;
2591	}
2592#endif
2593	stateprefix = "";
2594	if (TD_IS_RUNNING(td))
2595		state = "running";
2596	else if (TD_ON_RUNQ(td) || TD_CAN_RUN(td))
2597		state = "runnable";
2598	else if (TD_IS_SLEEPING(td)) {
2599		/* XXX: If we're sleeping, are we ever not in a queue? */
2600		if (TD_ON_SLEEPQ(td))
2601			state = td->td_wmesg;
2602		else
2603			state = "sleeping without queue";
2604	} else if (TD_ON_LOCK(td)) {
2605		state = td->td_lockname;
2606		stateprefix = "*";
2607	} else if (TD_IS_SUSPENDED(td))
2608		state = "suspended";
2609	else if (TD_AWAITING_INTR(td))
2610		state = "intrwait";
2611	else
2612		state = "unknown";
2613	pctcpu = (sched_pctcpu(td) * 10000 + FSCALE / 2) >> FSHIFT;
2614	if (pick->p_state == PRS_NEW || pick->p_state == PRS_ZOMBIE)
2615		rss = 0;
2616	else
2617		rss = pgtok(vmspace_resident_count(pick->p_vmspace));
2618	mtx_unlock_spin(&sched_lock);
2619	PROC_LOCK(pick);
2620	PGRP_UNLOCK(tp->t_pgrp);
2621	calcru(pick, &utime, &stime);
2622	pid = pick->p_pid;
2623	bcopy(pick->p_comm, comm, sizeof(comm));
2624	PROC_UNLOCK(pick);
2625
2626	/* Print command, pid, state, utime, stime, %cpu, and rss. */
2627	ttyprintf(tp,
2628	    " cmd: %s %d [%s%s] %ld.%02ldu %ld.%02lds %d%% %ldk\n",
2629	    comm, pid, stateprefix, state,
2630	    (long)utime.tv_sec, utime.tv_usec / 10000,
2631	    (long)stime.tv_sec, stime.tv_usec / 10000,
2632	    pctcpu / 100, rss);
2633	tp->t_rocount = 0;
2634}
2635
2636/*
2637 * Returns 1 if p2 is "better" than p1
2638 *
2639 * The algorithm for picking the "interesting" process is thus:
2640 *
2641 *	1) Only foreground processes are eligible - implied.
2642 *	2) Runnable processes are favored over anything else.  The runner
2643 *	   with the highest cpu utilization is picked (p_estcpu).  Ties are
2644 *	   broken by picking the highest pid.
2645 *	3) The sleeper with the shortest sleep time is next.  With ties,
2646 *	   we pick out just "short-term" sleepers (P_SINTR == 0).
2647 *	4) Further ties are broken by picking the highest pid.
2648 */
2649#define ISRUN(p, val)						\
2650do {								\
2651	struct thread *td;					\
2652	val = 0;						\
2653	FOREACH_THREAD_IN_PROC(p, td) {				\
2654		if (TD_ON_RUNQ(td) ||				\
2655		    TD_IS_RUNNING(td)) {			\
2656			val = 1;				\
2657			break;					\
2658		}						\
2659	}							\
2660} while (0)
2661
2662#define TESTAB(a, b)    ((a)<<1 | (b))
2663#define ONLYA   2
2664#define ONLYB   1
2665#define BOTH    3
2666
2667static int
2668proc_compare(struct proc *p1, struct proc *p2)
2669{
2670
2671	int esta, estb;
2672#ifdef KSE
2673	struct ksegrp *kg;
2674#else
2675	struct thread *td;
2676#endif
2677	mtx_assert(&sched_lock, MA_OWNED);
2678	if (p1 == NULL)
2679		return (1);
2680
2681	ISRUN(p1, esta);
2682	ISRUN(p2, estb);
2683
2684	/*
2685	 * see if at least one of them is runnable
2686	 */
2687	switch (TESTAB(esta, estb)) {
2688	case ONLYA:
2689		return (0);
2690	case ONLYB:
2691		return (1);
2692	case BOTH:
2693		/*
2694		 * tie - favor one with highest recent cpu utilization
2695		 */
2696		esta = estb = 0;
2697#ifdef KSE
2698		FOREACH_KSEGRP_IN_PROC(p1,kg) {
2699			esta += kg->kg_estcpu;
2700		}
2701		FOREACH_KSEGRP_IN_PROC(p2,kg) {
2702			estb += kg->kg_estcpu;
2703		}
2704#else
2705		FOREACH_THREAD_IN_PROC(p1, td)
2706			esta += td->td_estcpu;
2707		FOREACH_THREAD_IN_PROC(p2, td)
2708			estb += td->td_estcpu;
2709#endif
2710		if (estb > esta)
2711			return (1);
2712		if (esta > estb)
2713			return (0);
2714		return (p2->p_pid > p1->p_pid);	/* tie - return highest pid */
2715	}
2716	/*
2717	 * weed out zombies
2718	 */
2719	switch (TESTAB(p1->p_state == PRS_ZOMBIE, p2->p_state == PRS_ZOMBIE)) {
2720	case ONLYA:
2721		return (1);
2722	case ONLYB:
2723		return (0);
2724	case BOTH:
2725		return (p2->p_pid > p1->p_pid); /* tie - return highest pid */
2726	}
2727
2728#if 0 /* XXXKSE */
2729	/*
2730	 * pick the one with the smallest sleep time
2731	 */
2732	if (p2->p_slptime > p1->p_slptime)
2733		return (0);
2734	if (p1->p_slptime > p2->p_slptime)
2735		return (1);
2736	/*
2737	 * favor one sleeping in a non-interruptible sleep
2738	 */
2739	if (p1->p_sflag & PS_SINTR && (p2->p_sflag & PS_SINTR) == 0)
2740		return (1);
2741	if (p2->p_sflag & PS_SINTR && (p1->p_sflag & PS_SINTR) == 0)
2742		return (0);
2743#endif
2744	return (p2->p_pid > p1->p_pid);		/* tie - return highest pid */
2745}
2746
2747/*
2748 * Output char to tty; console putchar style.
2749 */
2750int
2751tputchar(int c, struct tty *tp)
2752{
2753	int s;
2754
2755	s = spltty();
2756	if (!ISSET(tp->t_state, TS_CONNECTED)) {
2757		splx(s);
2758		return (-1);
2759	}
2760	if (c == '\n')
2761		(void)ttyoutput('\r', tp);
2762	(void)ttyoutput(c, tp);
2763	ttstart(tp);
2764	splx(s);
2765	return (0);
2766}
2767
2768/*
2769 * Sleep on chan, returning ERESTART if tty changed while we napped and
2770 * returning any errors (e.g. EINTR/EWOULDBLOCK) reported by tsleep.  If
2771 * the tty is revoked, restarting a pending call will redo validation done
2772 * at the start of the call.
2773 */
2774int
2775ttysleep(struct tty *tp, void *chan, int pri, char *wmesg, int timo)
2776{
2777	int error;
2778	int gen;
2779
2780	gen = tp->t_gen;
2781	error = tsleep(chan, pri, wmesg, timo);
2782	if (tp->t_state & TS_GONE)
2783		return (ENXIO);
2784	if (error)
2785		return (error);
2786	return (tp->t_gen == gen ? 0 : ERESTART);
2787}
2788
2789/*
2790 * Gain a reference to a TTY
2791 */
2792int
2793ttyref(struct tty *tp)
2794{
2795	int i;
2796
2797	mtx_lock(&tp->t_mtx);
2798	KASSERT(tp->t_refcnt > 0,
2799	    ("ttyref(): tty refcnt is %d (%s)",
2800	    tp->t_refcnt, tp->t_dev != NULL ? devtoname(tp->t_dev) : "??"));
2801	i = ++tp->t_refcnt;
2802	mtx_unlock(&tp->t_mtx);
2803	return (i);
2804}
2805
2806/*
2807 * Drop a reference to a TTY.
2808 * When reference count drops to zero, we free it.
2809 */
2810int
2811ttyrel(struct tty *tp)
2812{
2813	int i;
2814
2815	mtx_lock(&tty_list_mutex);
2816	mtx_lock(&tp->t_mtx);
2817	KASSERT(tp->t_refcnt > 0,
2818	    ("ttyrel(): tty refcnt is %d (%s)",
2819	    tp->t_refcnt, tp->t_dev != NULL ? devtoname(tp->t_dev) : "??"));
2820	i = --tp->t_refcnt;
2821	if (i != 0) {
2822		mtx_unlock(&tp->t_mtx);
2823		mtx_unlock(&tty_list_mutex);
2824		return (i);
2825	}
2826	TAILQ_REMOVE(&tty_list, tp, t_list);
2827	mtx_unlock(&tp->t_mtx);
2828	mtx_unlock(&tty_list_mutex);
2829	knlist_destroy(&tp->t_rsel.si_note);
2830	knlist_destroy(&tp->t_wsel.si_note);
2831	mtx_destroy(&tp->t_mtx);
2832	free(tp, M_TTYS);
2833	return (i);
2834}
2835
2836/*
2837 * Allocate a tty struct.  Clists in the struct will be allocated by
2838 * tty_open().
2839 */
2840struct tty *
2841ttyalloc()
2842{
2843	struct tty *tp;
2844
2845	tp = malloc(sizeof *tp, M_TTYS, M_WAITOK | M_ZERO);
2846	mtx_init(&tp->t_mtx, "tty", NULL, MTX_DEF);
2847
2848	/*
2849	 * Set up the initial state
2850	 */
2851	tp->t_refcnt = 1;
2852	tp->t_timeout = -1;
2853	tp->t_dtr_wait = 3 * hz;
2854
2855	ttyinitmode(tp, 0, 0);
2856	bcopy(ttydefchars, tp->t_init_in.c_cc, sizeof tp->t_init_in.c_cc);
2857
2858	/* Make callout the same as callin */
2859	tp->t_init_out = tp->t_init_in;
2860
2861	mtx_lock(&tty_list_mutex);
2862	TAILQ_INSERT_TAIL(&tty_list, tp, t_list);
2863	mtx_unlock(&tty_list_mutex);
2864	knlist_init(&tp->t_rsel.si_note, &tp->t_mtx, NULL, NULL, NULL);
2865	knlist_init(&tp->t_wsel.si_note, &tp->t_mtx, NULL, NULL, NULL);
2866	return (tp);
2867}
2868
2869static void
2870ttypurge(struct cdev *dev)
2871{
2872
2873	if (dev->si_tty == NULL)
2874		return;
2875	ttygone(dev->si_tty);
2876}
2877
2878/*
2879 * ttycreate()
2880 *
2881 * Create the device entries for this tty thereby opening it for business.
2882 *
2883 * The flags argument controls if "cua" units are created.
2884 *
2885 * The t_sc filed is copied to si_drv1 in the created cdevs.  This
2886 * is particularly important for ->t_cioctl() users.
2887 *
2888 * XXX: implement the init and lock devices by cloning.
2889 */
2890
2891int
2892ttycreate(struct tty *tp, int flags, const char *fmt, ...)
2893{
2894	char namebuf[SPECNAMELEN - 3];		/* XXX space for "tty" */
2895	struct cdevsw *csw = NULL;
2896	int unit = 0;
2897	va_list ap;
2898	struct cdev *cp;
2899	int i, minor, sminor, sunit;
2900
2901	mtx_assert(&Giant, MA_OWNED);
2902
2903	if (tty_unit == NULL)
2904		tty_unit = new_unrhdr(0, 0xffff, NULL);
2905
2906	sunit = alloc_unr(tty_unit);
2907	tp->t_devunit = sunit;
2908
2909	if (csw == NULL) {
2910		csw = &tty_cdevsw;
2911		unit = sunit;
2912	}
2913	KASSERT(csw->d_purge == NULL || csw->d_purge == ttypurge,
2914	    ("tty should not have d_purge"));
2915
2916	csw->d_purge = ttypurge;
2917
2918	minor = unit2minor(unit);
2919	sminor = unit2minor(sunit);
2920	va_start(ap, fmt);
2921	i = vsnrprintf(namebuf, sizeof namebuf, 32, fmt, ap);
2922	va_end(ap);
2923	KASSERT(i < sizeof namebuf, ("Too long tty name (%s)", namebuf));
2924
2925	cp = make_dev(csw, minor,
2926	    UID_ROOT, GID_WHEEL, 0600, "tty%s", namebuf);
2927	tp->t_dev = cp;
2928	tp->t_mdev = cp;
2929	cp->si_tty = tp;
2930	cp->si_drv1 = tp->t_sc;
2931
2932	cp = make_dev(&ttys_cdevsw, sminor | MINOR_INIT,
2933	    UID_ROOT, GID_WHEEL, 0600, "tty%s.init", namebuf);
2934	dev_depends(tp->t_dev, cp);
2935	cp->si_drv1 = tp->t_sc;
2936	cp->si_drv2 = &tp->t_init_in;
2937	cp->si_tty = tp;
2938
2939	cp = make_dev(&ttys_cdevsw, sminor | MINOR_LOCK,
2940	    UID_ROOT, GID_WHEEL, 0600, "tty%s.lock", namebuf);
2941	dev_depends(tp->t_dev, cp);
2942	cp->si_drv1 = tp->t_sc;
2943	cp->si_drv2 = &tp->t_lock_in;
2944	cp->si_tty = tp;
2945
2946	if (flags & TS_CALLOUT) {
2947		cp = make_dev(csw, minor | MINOR_CALLOUT,
2948		    UID_UUCP, GID_DIALER, 0660, "cua%s", namebuf);
2949		dev_depends(tp->t_dev, cp);
2950		cp->si_drv1 = tp->t_sc;
2951		cp->si_tty = tp;
2952
2953		cp = make_dev(&ttys_cdevsw, sminor | MINOR_CALLOUT | MINOR_INIT,
2954		    UID_UUCP, GID_DIALER, 0660, "cua%s.init", namebuf);
2955		dev_depends(tp->t_dev, cp);
2956		cp->si_drv1 = tp->t_sc;
2957		cp->si_drv2 = &tp->t_init_out;
2958		cp->si_tty = tp;
2959
2960		cp = make_dev(&ttys_cdevsw, sminor | MINOR_CALLOUT | MINOR_LOCK,
2961		    UID_UUCP, GID_DIALER, 0660, "cua%s.lock", namebuf);
2962		dev_depends(tp->t_dev, cp);
2963		cp->si_drv1 = tp->t_sc;
2964		cp->si_drv2 = &tp->t_lock_out;
2965		cp->si_tty = tp;
2966	}
2967
2968	return (0);
2969}
2970
2971/*
2972 * This function is called when the hardware disappears.  We set a flag
2973 * and wake up stuff so all sleeping threads will notice.
2974 */
2975void
2976ttygone(struct tty *tp)
2977{
2978
2979	tp->t_state |= TS_GONE;
2980	wakeup(&tp->t_dtr_wait);
2981	wakeup(TSA_CARR_ON(tp));
2982	wakeup(TSA_HUP_OR_INPUT(tp));
2983	wakeup(TSA_OCOMPLETE(tp));
2984	wakeup(TSA_OLOWAT(tp));
2985	tt_purge(tp);
2986}
2987
2988/*
2989 * ttyfree()
2990 *
2991 * Called when the driver is ready to free the tty structure.
2992 *
2993 * XXX: This shall sleep until all threads have left the driver.
2994 */
2995
2996void
2997ttyfree(struct tty *tp)
2998{
2999	u_int unit;
3000
3001	mtx_assert(&Giant, MA_OWNED);
3002	ttygone(tp);
3003	unit = tp->t_devunit;
3004	destroy_dev(tp->t_mdev);
3005	free_unr(tty_unit, unit);
3006}
3007
3008static int
3009sysctl_kern_ttys(SYSCTL_HANDLER_ARGS)
3010{
3011	struct tty *tp, *tp2;
3012	struct xtty xt;
3013	int error;
3014
3015	error = 0;
3016	mtx_lock(&tty_list_mutex);
3017	tp = TAILQ_FIRST(&tty_list);
3018	if (tp != NULL)
3019		ttyref(tp);
3020	mtx_unlock(&tty_list_mutex);
3021	while (tp != NULL) {
3022		bzero(&xt, sizeof xt);
3023		xt.xt_size = sizeof xt;
3024#define XT_COPY(field) xt.xt_##field = tp->t_##field
3025		xt.xt_rawcc = tp->t_rawq.c_cc;
3026		xt.xt_cancc = tp->t_canq.c_cc;
3027		xt.xt_outcc = tp->t_outq.c_cc;
3028		XT_COPY(line);
3029		if (tp->t_dev != NULL)
3030			xt.xt_dev = dev2udev(tp->t_dev);
3031		XT_COPY(state);
3032		XT_COPY(flags);
3033		XT_COPY(timeout);
3034		if (tp->t_pgrp != NULL)
3035			xt.xt_pgid = tp->t_pgrp->pg_id;
3036		if (tp->t_session != NULL)
3037			xt.xt_sid = tp->t_session->s_sid;
3038		XT_COPY(termios);
3039		XT_COPY(winsize);
3040		XT_COPY(column);
3041		XT_COPY(rocount);
3042		XT_COPY(rocol);
3043		XT_COPY(ififosize);
3044		XT_COPY(ihiwat);
3045		XT_COPY(ilowat);
3046		XT_COPY(ispeedwat);
3047		XT_COPY(ohiwat);
3048		XT_COPY(olowat);
3049		XT_COPY(ospeedwat);
3050#undef XT_COPY
3051		error = SYSCTL_OUT(req, &xt, sizeof xt);
3052		if (error != 0) {
3053			ttyrel(tp);
3054			return (error);
3055		}
3056		mtx_lock(&tty_list_mutex);
3057		tp2 = TAILQ_NEXT(tp, t_list);
3058		if (tp2 != NULL)
3059			ttyref(tp2);
3060		mtx_unlock(&tty_list_mutex);
3061		ttyrel(tp);
3062		tp = tp2;
3063	}
3064	return (0);
3065}
3066
3067SYSCTL_PROC(_kern, OID_AUTO, ttys, CTLTYPE_OPAQUE|CTLFLAG_RD,
3068	0, 0, sysctl_kern_ttys, "S,xtty", "All ttys");
3069SYSCTL_LONG(_kern, OID_AUTO, tty_nin, CTLFLAG_RD,
3070	&tk_nin, 0, "Total TTY in characters");
3071SYSCTL_LONG(_kern, OID_AUTO, tty_nout, CTLFLAG_RD,
3072	&tk_nout, 0, "Total TTY out characters");
3073
3074void
3075nottystop(struct tty *tp, int rw)
3076{
3077
3078	return;
3079}
3080
3081int
3082ttyopen(struct cdev *dev, int flag, int mode, struct thread *td)
3083{
3084	int		error;
3085	int		s;
3086	struct tty	*tp;
3087
3088	tp = dev->si_tty;
3089
3090	s = spltty();
3091	/*
3092	 * We jump to this label after all non-interrupted sleeps to pick
3093	 * up any changes of the device state.
3094	 */
3095open_top:
3096	if (tp->t_state & TS_GONE)
3097		return (ENXIO);
3098	error = ttydtrwaitsleep(tp);
3099	if (error)
3100		goto out;
3101	if (tp->t_state & TS_ISOPEN) {
3102		/*
3103		 * The device is open, so everything has been initialized.
3104		 * Handle conflicts.
3105		 */
3106		if (ISCALLOUT(dev) && !tp->t_actout)
3107			return (EBUSY);
3108		if (tp->t_actout && !ISCALLOUT(dev)) {
3109			if (flag & O_NONBLOCK)
3110				return (EBUSY);
3111			error =	tsleep(&tp->t_actout,
3112				       TTIPRI | PCATCH, "ttybi", 0);
3113			if (error != 0 || (tp->t_flags & TS_GONE))
3114				goto out;
3115			goto open_top;
3116		}
3117		if (tp->t_state & TS_XCLUDE && priv_check(td,
3118		    PRIV_TTY_EXCLUSIVE))
3119			return (EBUSY);
3120	} else {
3121		/*
3122		 * The device isn't open, so there are no conflicts.
3123		 * Initialize it.  Initialization is done twice in many
3124		 * cases: to preempt sleeping callin opens if we are
3125		 * callout, and to complete a callin open after DCD rises.
3126		 */
3127		tp->t_termios = ISCALLOUT(dev) ? tp->t_init_out : tp->t_init_in;
3128		tp->t_cflag = tp->t_termios.c_cflag;
3129		if (tp->t_modem != NULL)
3130			tt_modem(tp, SER_DTR | SER_RTS, 0);
3131		++tp->t_wopeners;
3132		error = tt_param(tp, &tp->t_termios);
3133		--tp->t_wopeners;
3134		if (error == 0)
3135			error = tt_open(tp, dev);
3136		if (error != 0)
3137			goto out;
3138		if (ISCALLOUT(dev) || (tt_modem(tp, 0, 0) & SER_DCD))
3139			ttyld_modem(tp, 1);
3140	}
3141	/*
3142	 * Wait for DCD if necessary.
3143	 */
3144	if (!(tp->t_state & TS_CARR_ON) && !ISCALLOUT(dev)
3145	    && !(tp->t_cflag & CLOCAL) && !(flag & O_NONBLOCK)) {
3146		++tp->t_wopeners;
3147		error = tsleep(TSA_CARR_ON(tp), TTIPRI | PCATCH, "ttydcd", 0);
3148		--tp->t_wopeners;
3149		if (error != 0 || (tp->t_state & TS_GONE))
3150			goto out;
3151		goto open_top;
3152	}
3153	error =	ttyld_open(tp, dev);
3154	ttyldoptim(tp);
3155	if (tp->t_state & TS_ISOPEN && ISCALLOUT(dev))
3156		tp->t_actout = TRUE;
3157out:
3158	splx(s);
3159	if (!(tp->t_state & TS_ISOPEN) && tp->t_wopeners == 0)
3160		tt_close(tp);
3161	return (error);
3162}
3163
3164int
3165ttyclose(struct cdev *dev, int flag, int mode, struct thread *td)
3166{
3167	struct tty *tp;
3168
3169	tp = dev->si_tty;
3170	ttyld_close(tp, flag);
3171	ttyldoptim(tp);
3172	tt_close(tp);
3173	tp->t_do_timestamp = 0;
3174	if (tp->t_pps != NULL)
3175		tp->t_pps->ppsparam.mode = 0;
3176	tty_close(tp);
3177	return (0);
3178}
3179
3180int
3181ttyread(struct cdev *dev, struct uio *uio, int flag)
3182{
3183	struct tty *tp;
3184
3185	tp = tty_gettp(dev);
3186
3187	if (tp->t_state & TS_GONE)
3188		return (ENODEV);
3189	return (ttyld_read(tp, uio, flag));
3190}
3191
3192int
3193ttywrite(struct cdev *dev, struct uio *uio, int flag)
3194{
3195	struct tty *tp;
3196
3197	tp = tty_gettp(dev);
3198
3199	if (tp->t_state & TS_GONE)
3200		return (ENODEV);
3201	return (ttyld_write(tp, uio, flag));
3202}
3203
3204int
3205ttyioctl(struct cdev *dev, u_long cmd, caddr_t data, int flag, struct thread *td)
3206{
3207	struct	tty *tp;
3208	int	error;
3209
3210	tp = dev->si_tty;
3211
3212	if (cmd == TIOCSETA || cmd == TIOCSETAW || cmd == TIOCSETAF) {
3213		int cc;
3214		struct termios *dt = (struct termios *)data;
3215		struct termios *lt =
3216		    ISCALLOUT(dev) ?  &tp->t_lock_out : &tp->t_lock_in;
3217
3218		dt->c_iflag = (tp->t_iflag & lt->c_iflag)
3219		    | (dt->c_iflag & ~lt->c_iflag);
3220		dt->c_oflag = (tp->t_oflag & lt->c_oflag)
3221		    | (dt->c_oflag & ~lt->c_oflag);
3222		dt->c_cflag = (tp->t_cflag & lt->c_cflag)
3223		    | (dt->c_cflag & ~lt->c_cflag);
3224		dt->c_lflag = (tp->t_lflag & lt->c_lflag)
3225		    | (dt->c_lflag & ~lt->c_lflag);
3226		for (cc = 0; cc < NCCS; ++cc)
3227		    if (lt->c_cc[cc] != 0)
3228		        dt->c_cc[cc] = tp->t_cc[cc];
3229		if (lt->c_ispeed != 0)
3230		    dt->c_ispeed = tp->t_ispeed;
3231		if (lt->c_ospeed != 0)
3232		    dt->c_ospeed = tp->t_ospeed;
3233	}
3234
3235	error = ttyld_ioctl(tp, cmd, data, flag, td);
3236	if (error == ENOIOCTL)
3237		error = ttioctl(tp, cmd, data, flag);
3238	ttyldoptim(tp);
3239	if (error != ENOIOCTL)
3240		return (error);
3241	return (ENOTTY);
3242}
3243
3244void
3245ttyldoptim(struct tty *tp)
3246{
3247	struct termios	*t;
3248
3249	t = &tp->t_termios;
3250	if (!(t->c_iflag & (ICRNL | IGNCR | IMAXBEL | INLCR | ISTRIP | IXON))
3251	    && (!(t->c_iflag & BRKINT) || (t->c_iflag & IGNBRK))
3252	    && (!(t->c_iflag & PARMRK)
3253		|| (t->c_iflag & (IGNPAR | IGNBRK)) == (IGNPAR | IGNBRK))
3254	    && !(t->c_lflag & (ECHO | ICANON | IEXTEN | ISIG | PENDIN))
3255	    && linesw[tp->t_line]->l_rint == ttyinput)
3256		tp->t_state |= TS_CAN_BYPASS_L_RINT;
3257	else
3258		tp->t_state &= ~TS_CAN_BYPASS_L_RINT;
3259}
3260
3261static void
3262ttydtrwaitwakeup(void *arg)
3263{
3264	struct tty *tp;
3265
3266	tp = arg;
3267	tp->t_state &= ~TS_DTR_WAIT;
3268	wakeup(&tp->t_dtr_wait);
3269}
3270
3271
3272void
3273ttydtrwaitstart(struct tty *tp)
3274{
3275
3276	if (tp->t_dtr_wait == 0)
3277		return;
3278	if (tp->t_state & TS_DTR_WAIT)
3279		return;
3280	timeout(ttydtrwaitwakeup, tp, tp->t_dtr_wait);
3281	tp->t_state |= TS_DTR_WAIT;
3282}
3283
3284int
3285ttydtrwaitsleep(struct tty *tp)
3286{
3287	int error;
3288
3289	error = 0;
3290	while (error == 0) {
3291		if (tp->t_state & TS_GONE)
3292			error = ENXIO;
3293		else if (!(tp->t_state & TS_DTR_WAIT))
3294			break;
3295		else
3296			error = tsleep(&tp->t_dtr_wait, TTIPRI | PCATCH,
3297			    "dtrwait", 0);
3298	}
3299	return (error);
3300}
3301
3302static int
3303ttysopen(struct cdev *dev, int flag, int mode, struct thread *td)
3304{
3305	struct tty *tp;
3306
3307	tp = dev->si_tty;
3308	KASSERT(tp != NULL,
3309	    ("ttysopen(): no tty pointer on device (%s)", devtoname(dev)));
3310	if (tp->t_state & TS_GONE)
3311		return (ENODEV);
3312	return (0);
3313}
3314
3315static int
3316ttysclose(struct cdev *dev, int flag, int mode, struct thread *td)
3317{
3318
3319	return (0);
3320}
3321
3322static int
3323ttysrdwr(struct cdev *dev, struct uio *uio, int flag)
3324{
3325
3326	return (ENODEV);
3327}
3328
3329static int
3330ttysioctl(struct cdev *dev, u_long cmd, caddr_t data, int flag, struct thread *td)
3331{
3332	struct tty	*tp;
3333	int		error;
3334	struct termios	*ct;
3335
3336	tp = dev->si_tty;
3337	KASSERT(tp != NULL,
3338	    ("ttysopen(): no tty pointer on device (%s)", devtoname(dev)));
3339	if (tp->t_state & TS_GONE)
3340		return (ENODEV);
3341	ct = dev->si_drv2;
3342	switch (cmd) {
3343	case TIOCSETA:
3344		error = priv_check(td, PRIV_TTY_SETA);
3345		if (error != 0)
3346			return (error);
3347		*ct = *(struct termios *)data;
3348		return (0);
3349	case TIOCGETA:
3350		*(struct termios *)data = *ct;
3351		return (0);
3352	case TIOCGETD:
3353		*(int *)data = TTYDISC;
3354		return (0);
3355	case TIOCGWINSZ:
3356		bzero(data, sizeof(struct winsize));
3357		return (0);
3358	default:
3359		if (tp->t_cioctl != NULL)
3360			return(tp->t_cioctl(dev, cmd, data, flag, td));
3361		return (ENOTTY);
3362	}
3363}
3364
3365/*
3366 * Initialize a tty to sane modes.
3367 */
3368void
3369ttyinitmode(struct tty *tp, int echo, int speed)
3370{
3371
3372	if (speed == 0)
3373		speed = TTYDEF_SPEED;
3374	tp->t_init_in.c_iflag = TTYDEF_IFLAG;
3375	tp->t_init_in.c_oflag = TTYDEF_OFLAG;
3376	tp->t_init_in.c_cflag = TTYDEF_CFLAG;
3377	if (echo)
3378		tp->t_init_in.c_lflag = TTYDEF_LFLAG_ECHO;
3379	else
3380		tp->t_init_in.c_lflag = TTYDEF_LFLAG_NOECHO;
3381
3382	tp->t_init_in.c_ispeed = tp->t_init_in.c_ospeed = speed;
3383	termioschars(&tp->t_init_in);
3384	tp->t_init_out = tp->t_init_in;
3385	tp->t_termios = tp->t_init_in;
3386}
3387
3388/*
3389 * Use more "normal" termios paramters for consoles.
3390 */
3391void
3392ttyconsolemode(struct tty *tp, int speed)
3393{
3394
3395	if (speed == 0)
3396		speed = TTYDEF_SPEED;
3397	ttyinitmode(tp, 1, speed);
3398	tp->t_init_in.c_cflag |= CLOCAL;
3399	tp->t_lock_out.c_cflag = tp->t_lock_in.c_cflag = CLOCAL;
3400	tp->t_lock_out.c_ispeed = tp->t_lock_out.c_ospeed =
3401	tp->t_lock_in.c_ispeed = tp->t_lock_in.c_ospeed = speed;
3402	tp->t_init_out = tp->t_init_in;
3403	tp->t_termios = tp->t_init_in;
3404	ttsetwater(tp);
3405}
3406
3407/*
3408 * Record the relationship between the serial ports notion of modem control
3409 * signals and the one used in certain ioctls in a way the compiler can enforce
3410 * XXX: We should define TIOCM_* in terms of SER_ if we can limit the
3411 * XXX: consequences of the #include work that would take.
3412 */
3413CTASSERT(SER_DTR == TIOCM_DTR / 2);
3414CTASSERT(SER_RTS == TIOCM_RTS / 2);
3415CTASSERT(SER_STX == TIOCM_ST / 2);
3416CTASSERT(SER_SRX == TIOCM_SR / 2);
3417CTASSERT(SER_CTS == TIOCM_CTS / 2);
3418CTASSERT(SER_DCD == TIOCM_DCD / 2);
3419CTASSERT(SER_RI == TIOCM_RI / 2);
3420CTASSERT(SER_DSR == TIOCM_DSR / 2);
3421
3422