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