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