tty.c revision 1.239 1 /* $NetBSD: tty.c,v 1.239 2010/11/19 06:44:43 dholland Exp $ */
2
3 /*-
4 * Copyright (c) 2008 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 /*-
30 * Copyright (c) 1982, 1986, 1990, 1991, 1993
31 * The Regents of the University of California. All rights reserved.
32 * (c) UNIX System Laboratories, Inc.
33 * All or some portions of this file are derived from material licensed
34 * to the University of California by American Telephone and Telegraph
35 * Co. or Unix System Laboratories, Inc. and are reproduced herein with
36 * the permission of UNIX System Laboratories, Inc.
37 *
38 * Redistribution and use in source and binary forms, with or without
39 * modification, are permitted provided that the following conditions
40 * are met:
41 * 1. Redistributions of source code must retain the above copyright
42 * notice, this list of conditions and the following disclaimer.
43 * 2. Redistributions in binary form must reproduce the above copyright
44 * notice, this list of conditions and the following disclaimer in the
45 * documentation and/or other materials provided with the distribution.
46 * 3. Neither the name of the University nor the names of its contributors
47 * may be used to endorse or promote products derived from this software
48 * without specific prior written permission.
49 *
50 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
51 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
52 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
53 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
54 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
55 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
56 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
57 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
58 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
59 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
60 * SUCH DAMAGE.
61 *
62 * @(#)tty.c 8.13 (Berkeley) 1/9/95
63 */
64
65 #include <sys/cdefs.h>
66 __KERNEL_RCSID(0, "$NetBSD: tty.c,v 1.239 2010/11/19 06:44:43 dholland Exp $");
67
68 #include <sys/param.h>
69 #include <sys/systm.h>
70 #include <sys/ioctl.h>
71 #include <sys/proc.h>
72 #define TTYDEFCHARS
73 #include <sys/tty.h>
74 #undef TTYDEFCHARS
75 #include <sys/file.h>
76 #include <sys/conf.h>
77 #include <sys/dkstat.h>
78 #include <sys/uio.h>
79 #include <sys/kernel.h>
80 #include <sys/vnode.h>
81 #include <sys/syslog.h>
82 #include <sys/kmem.h>
83 #include <sys/signalvar.h>
84 #include <sys/resourcevar.h>
85 #include <sys/poll.h>
86 #include <sys/kprintf.h>
87 #include <sys/namei.h>
88 #include <sys/sysctl.h>
89 #include <sys/kauth.h>
90 #include <sys/intr.h>
91 #include <sys/ioctl_compat.h>
92 #include <sys/module.h>
93
94 #include <machine/stdarg.h>
95
96 static int ttnread(struct tty *);
97 static void ttyblock(struct tty *);
98 static void ttyecho(int, struct tty *);
99 static void ttyrubo(struct tty *, int);
100 static void ttyprintf_nolock(struct tty *, const char *fmt, ...)
101 __attribute__((__format__(__printf__,2,3)));
102 static int proc_compare(struct proc *, struct proc *);
103 static void ttysigintr(void *);
104
105 /* Symbolic sleep message strings. */
106 const char ttclos[] = "ttycls";
107 const char ttopen[] = "ttyopn";
108 const char ttybg[] = "ttybg";
109 const char ttyin[] = "ttyin";
110 const char ttyout[] = "ttyout";
111
112 /*
113 * Used to determine whether we still have a connection. This is true in
114 * one of 3 cases:
115 * 1) We have carrier.
116 * 2) It's a locally attached terminal, and we are therefore ignoring carrier.
117 * 3) We're using a flow control mechanism that overloads the carrier signal.
118 */
119 #define CONNECTED(tp) (ISSET(tp->t_state, TS_CARR_ON) || \
120 ISSET(tp->t_cflag, CLOCAL | MDMBUF))
121
122 /*
123 * Table with character classes and parity. The 8th bit indicates parity,
124 * the 7th bit indicates the character is an alphameric or underscore (for
125 * ALTWERASE), and the low 6 bits indicate delay type. If the low 6 bits
126 * are 0 then the character needs no special processing on output; classes
127 * other than 0 might be translated or (not currently) require delays.
128 */
129 #define E 0x00 /* Even parity. */
130 #define O 0x80 /* Odd parity. */
131 #define PARITY(c) (char_type[c] & O)
132
133 #define ALPHA 0x40 /* Alpha or underscore. */
134 #define ISALPHA(c) (char_type[(c) & TTY_CHARMASK] & ALPHA)
135
136 #define CCLASSMASK 0x3f
137 #define CCLASS(c) (char_type[c] & CCLASSMASK)
138
139 #define BS BACKSPACE
140 #define CC CONTROL
141 #define CR RETURN
142 #define NA ORDINARY | ALPHA
143 #define NL NEWLINE
144 #define NO ORDINARY
145 #define TB TAB
146 #define VT VTAB
147
148 unsigned char const char_type[] = {
149 E|CC, O|CC, O|CC, E|CC, O|CC, E|CC, E|CC, O|CC, /* nul - bel */
150 O|BS, E|TB, E|NL, O|CC, E|VT, O|CR, O|CC, E|CC, /* bs - si */
151 O|CC, E|CC, E|CC, O|CC, E|CC, O|CC, O|CC, E|CC, /* dle - etb */
152 E|CC, O|CC, O|CC, E|CC, O|CC, E|CC, E|CC, O|CC, /* can - us */
153 O|NO, E|NO, E|NO, O|NO, E|NO, O|NO, O|NO, E|NO, /* sp - ' */
154 E|NO, O|NO, O|NO, E|NO, O|NO, E|NO, E|NO, O|NO, /* ( - / */
155 E|NA, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA, /* 0 - 7 */
156 O|NA, E|NA, E|NO, O|NO, E|NO, O|NO, O|NO, E|NO, /* 8 - ? */
157 O|NO, E|NA, E|NA, O|NA, E|NA, O|NA, O|NA, E|NA, /* @ - G */
158 E|NA, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA, /* H - O */
159 E|NA, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA, /* P - W */
160 O|NA, E|NA, E|NA, O|NO, E|NO, O|NO, O|NO, O|NA, /* X - _ */
161 E|NO, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA, /* ` - g */
162 O|NA, E|NA, E|NA, O|NA, E|NA, O|NA, O|NA, E|NA, /* h - o */
163 O|NA, E|NA, E|NA, O|NA, E|NA, O|NA, O|NA, E|NA, /* p - w */
164 E|NA, O|NA, O|NA, E|NO, O|NO, E|NO, E|NO, O|CC, /* x - del */
165 /*
166 * Meta chars; should be settable per character set;
167 * for now, treat them all as normal characters.
168 */
169 NA, NA, NA, NA, NA, NA, NA, NA,
170 NA, NA, NA, NA, NA, NA, NA, NA,
171 NA, NA, NA, NA, NA, NA, NA, NA,
172 NA, NA, NA, NA, NA, NA, NA, NA,
173 NA, NA, NA, NA, NA, NA, NA, NA,
174 NA, NA, NA, NA, NA, NA, NA, NA,
175 NA, NA, NA, NA, NA, NA, NA, NA,
176 NA, NA, NA, NA, NA, NA, NA, NA,
177 NA, NA, NA, NA, NA, NA, NA, NA,
178 NA, NA, NA, NA, NA, NA, NA, NA,
179 NA, NA, NA, NA, NA, NA, NA, NA,
180 NA, NA, NA, NA, NA, NA, NA, NA,
181 NA, NA, NA, NA, NA, NA, NA, NA,
182 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 };
186 #undef BS
187 #undef CC
188 #undef CR
189 #undef NA
190 #undef NL
191 #undef NO
192 #undef TB
193 #undef VT
194
195 static struct ttylist_head tty_sigqueue = TAILQ_HEAD_INITIALIZER(tty_sigqueue);
196 static void *tty_sigsih;
197
198 struct ttylist_head ttylist = TAILQ_HEAD_INITIALIZER(ttylist);
199 int tty_count;
200 kmutex_t tty_lock;
201 krwlock_t ttcompat_lock;
202 int (*ttcompatvec)(struct tty *, u_long, void *, int, struct lwp *);
203
204 uint64_t tk_cancc;
205 uint64_t tk_nin;
206 uint64_t tk_nout;
207 uint64_t tk_rawcc;
208
209 static kauth_listener_t tty_listener;
210
211 static struct sysctllog *kern_tkstat_sysctllog;
212
213 static void
214 sysctl_kern_tkstat_setup(void)
215 {
216
217 sysctl_createv(&kern_tkstat_sysctllog, 0, NULL, NULL,
218 CTLFLAG_PERMANENT,
219 CTLTYPE_NODE, "kern", NULL,
220 NULL, 0, NULL, 0,
221 CTL_KERN, CTL_EOL);
222 sysctl_createv(&kern_tkstat_sysctllog, 0, NULL, NULL,
223 CTLFLAG_PERMANENT,
224 CTLTYPE_NODE, "tkstat",
225 SYSCTL_DESCR("Number of characters sent and and "
226 "received on ttys"),
227 NULL, 0, NULL, 0,
228 CTL_KERN, KERN_TKSTAT, CTL_EOL);
229
230 sysctl_createv(&kern_tkstat_sysctllog, 0, NULL, NULL,
231 CTLFLAG_PERMANENT,
232 CTLTYPE_QUAD, "nin",
233 SYSCTL_DESCR("Total number of tty input characters"),
234 NULL, 0, &tk_nin, 0,
235 CTL_KERN, KERN_TKSTAT, KERN_TKSTAT_NIN, CTL_EOL);
236 sysctl_createv(&kern_tkstat_sysctllog, 0, NULL, NULL,
237 CTLFLAG_PERMANENT,
238 CTLTYPE_QUAD, "nout",
239 SYSCTL_DESCR("Total number of tty output characters"),
240 NULL, 0, &tk_nout, 0,
241 CTL_KERN, KERN_TKSTAT, KERN_TKSTAT_NOUT, CTL_EOL);
242 sysctl_createv(&kern_tkstat_sysctllog, 0, NULL, NULL,
243 CTLFLAG_PERMANENT,
244 CTLTYPE_QUAD, "cancc",
245 SYSCTL_DESCR("Number of canonical tty input characters"),
246 NULL, 0, &tk_cancc, 0,
247 CTL_KERN, KERN_TKSTAT, KERN_TKSTAT_CANCC, CTL_EOL);
248 sysctl_createv(&kern_tkstat_sysctllog, 0, NULL, NULL,
249 CTLFLAG_PERMANENT,
250 CTLTYPE_QUAD, "rawcc",
251 SYSCTL_DESCR("Number of raw tty input characters"),
252 NULL, 0, &tk_rawcc, 0,
253 CTL_KERN, KERN_TKSTAT, KERN_TKSTAT_RAWCC, CTL_EOL);
254 }
255
256 int
257 ttyopen(struct tty *tp, int dialout, int nonblock)
258 {
259 int error;
260
261 error = 0;
262
263 mutex_spin_enter(&tty_lock);
264
265 if (dialout) {
266 /*
267 * If the device is already open for non-dialout, fail.
268 * Otherwise, set TS_DIALOUT to block any pending non-dialout
269 * opens.
270 */
271 if (ISSET(tp->t_state, TS_ISOPEN) &&
272 !ISSET(tp->t_state, TS_DIALOUT)) {
273 error = EBUSY;
274 goto out;
275 }
276 SET(tp->t_state, TS_DIALOUT);
277 } else {
278 if (!nonblock) {
279 /*
280 * Wait for carrier. Also wait for any dialout
281 * processes to close the tty first.
282 */
283 while (ISSET(tp->t_state, TS_DIALOUT) ||
284 !CONNECTED(tp)) {
285 tp->t_wopen++;
286 error = ttysleep(tp, &tp->t_rawcv, true, 0);
287 tp->t_wopen--;
288 if (error)
289 goto out;
290 }
291 } else {
292 /*
293 * Don't allow a non-blocking non-dialout open if the
294 * device is already open for dialout.
295 */
296 if (ISSET(tp->t_state, TS_DIALOUT)) {
297 error = EBUSY;
298 goto out;
299 }
300 }
301 }
302
303 out:
304 mutex_spin_exit(&tty_lock);
305 return (error);
306 }
307
308 /*
309 * Initial open of tty, or (re)entry to standard tty line discipline.
310 */
311 int
312 ttylopen(dev_t device, struct tty *tp)
313 {
314
315 mutex_spin_enter(&tty_lock);
316 tp->t_dev = device;
317 if (!ISSET(tp->t_state, TS_ISOPEN)) {
318 SET(tp->t_state, TS_ISOPEN);
319 memset(&tp->t_winsize, 0, sizeof(tp->t_winsize));
320 tp->t_flags = 0;
321 }
322 mutex_spin_exit(&tty_lock);
323 return (0);
324 }
325
326 /*
327 * Handle close() on a tty line: flush and set to initial state,
328 * bumping generation number so that pending read/write calls
329 * can detect recycling of the tty.
330 */
331 int
332 ttyclose(struct tty *tp)
333 {
334 extern struct tty *constty; /* Temporary virtual console. */
335 struct session *sess;
336
337 mutex_spin_enter(&tty_lock);
338
339 if (constty == tp)
340 constty = NULL;
341
342 ttyflush(tp, FREAD | FWRITE);
343
344 tp->t_gen++;
345 tp->t_pgrp = NULL;
346 tp->t_state = 0;
347 sess = tp->t_session;
348 tp->t_session = NULL;
349
350 mutex_spin_exit(&tty_lock);
351
352 if (sess != NULL) {
353 mutex_enter(proc_lock);
354 /* Releases proc_lock. */
355 proc_sessrele(sess);
356 }
357 return (0);
358 }
359
360 #define FLUSHQ(q) { \
361 if ((q)->c_cc) \
362 ndflush(q, (q)->c_cc); \
363 }
364
365 /*
366 * This macro is used in canonical mode input processing, where a read
367 * request shall not return unless a 'line delimiter' ('\n') or 'break'
368 * (EOF, EOL, EOL2) character (or a signal) has been received. As EOL2
369 * is an extension to the POSIX.1 defined set of special characters,
370 * recognize it only if IEXTEN is set in the set of local flags.
371 */
372 #define TTBREAKC(c, lflg) \
373 ((c) == '\n' || (((c) == cc[VEOF] || (c) == cc[VEOL] || \
374 ((c) == cc[VEOL2] && ISSET(lflg, IEXTEN))) && (c) != _POSIX_VDISABLE))
375
376
377
378 /*
379 * ttyinput() helper.
380 * Call with the tty lock held.
381 */
382 /* XXX static */ int
383 ttyinput_wlock(int c, struct tty *tp)
384 {
385 int iflag, lflag, i, error;
386 u_char *cc;
387
388 KASSERT(mutex_owned(&tty_lock));
389
390 /*
391 * If input is pending take it first.
392 */
393 lflag = tp->t_lflag;
394 if (ISSET(lflag, PENDIN))
395 ttypend(tp);
396 /*
397 * Gather stats.
398 */
399 if (ISSET(lflag, ICANON)) {
400 ++tk_cancc;
401 ++tp->t_cancc;
402 } else {
403 ++tk_rawcc;
404 ++tp->t_rawcc;
405 }
406 ++tk_nin;
407
408 cc = tp->t_cc;
409
410 /*
411 * Handle exceptional conditions (break, parity, framing).
412 */
413 iflag = tp->t_iflag;
414 if ((error = (ISSET(c, TTY_ERRORMASK))) != 0) {
415 CLR(c, TTY_ERRORMASK);
416 if (ISSET(error, TTY_FE) && c == 0) { /* Break. */
417 if (ISSET(iflag, IGNBRK))
418 return (0);
419 else if (ISSET(iflag, BRKINT)) {
420 ttyflush(tp, FREAD | FWRITE);
421 ttysig(tp, TTYSIG_PG1, SIGINT);
422 return (0);
423 } else if (ISSET(iflag, PARMRK))
424 goto parmrk;
425 } else if ((ISSET(error, TTY_PE) && ISSET(iflag, INPCK)) ||
426 ISSET(error, TTY_FE)) {
427 if (ISSET(iflag, IGNPAR))
428 return (0);
429 else if (ISSET(iflag, PARMRK)) {
430 parmrk: (void)putc(0377 | TTY_QUOTE, &tp->t_rawq);
431 (void)putc(0 | TTY_QUOTE, &tp->t_rawq);
432 (void)putc(c | TTY_QUOTE, &tp->t_rawq);
433 return (0);
434 } else
435 c = 0;
436 }
437 } else if (c == 0377 &&
438 ISSET(iflag, ISTRIP|IGNPAR|INPCK|PARMRK) == (INPCK|PARMRK)) {
439 /* "Escape" a valid character of '\377'. */
440 (void)putc(0377 | TTY_QUOTE, &tp->t_rawq);
441 (void)putc(0377 | TTY_QUOTE, &tp->t_rawq);
442 goto endcase;
443 }
444
445 /*
446 * In tandem mode, check high water mark.
447 */
448 if (ISSET(iflag, IXOFF) || ISSET(tp->t_cflag, CHWFLOW))
449 ttyblock(tp);
450 if (!ISSET(tp->t_state, TS_TYPEN) && ISSET(iflag, ISTRIP))
451 CLR(c, 0x80);
452 if (!ISSET(lflag, EXTPROC)) {
453 /*
454 * Check for literal nexting very first
455 */
456 if (ISSET(tp->t_state, TS_LNCH)) {
457 SET(c, TTY_QUOTE);
458 CLR(tp->t_state, TS_LNCH);
459 }
460 /*
461 * Scan for special characters. This code
462 * is really just a big case statement with
463 * non-constant cases. The bottom of the
464 * case statement is labeled ``endcase'', so goto
465 * it after a case match, or similar.
466 */
467
468 /*
469 * Control chars which aren't controlled
470 * by ICANON, ISIG, or IXON.
471 */
472 if (ISSET(lflag, IEXTEN)) {
473 if (CCEQ(cc[VLNEXT], c)) {
474 if (ISSET(lflag, ECHO)) {
475 if (ISSET(lflag, ECHOE)) {
476 (void)ttyoutput('^', tp);
477 (void)ttyoutput('\b', tp);
478 } else
479 ttyecho(c, tp);
480 }
481 SET(tp->t_state, TS_LNCH);
482 goto endcase;
483 }
484 if (CCEQ(cc[VDISCARD], c)) {
485 if (ISSET(lflag, FLUSHO))
486 CLR(tp->t_lflag, FLUSHO);
487 else {
488 ttyflush(tp, FWRITE);
489 ttyecho(c, tp);
490 if (tp->t_rawq.c_cc + tp->t_canq.c_cc)
491 ttyretype(tp);
492 SET(tp->t_lflag, FLUSHO);
493 }
494 goto startoutput;
495 }
496 }
497 /*
498 * Signals.
499 */
500 if (ISSET(lflag, ISIG)) {
501 if (CCEQ(cc[VINTR], c) || CCEQ(cc[VQUIT], c)) {
502 if (!ISSET(lflag, NOFLSH))
503 ttyflush(tp, FREAD | FWRITE);
504 ttyecho(c, tp);
505 ttysig(tp, TTYSIG_PG1, CCEQ(cc[VINTR], c) ?
506 SIGINT : SIGQUIT);
507 goto endcase;
508 }
509 if (CCEQ(cc[VSUSP], c)) {
510 if (!ISSET(lflag, NOFLSH))
511 ttyflush(tp, FREAD);
512 ttyecho(c, tp);
513 ttysig(tp, TTYSIG_PG1, SIGTSTP);
514 goto endcase;
515 }
516 }
517 /*
518 * Handle start/stop characters.
519 */
520 if (ISSET(iflag, IXON)) {
521 if (CCEQ(cc[VSTOP], c)) {
522 if (!ISSET(tp->t_state, TS_TTSTOP)) {
523 SET(tp->t_state, TS_TTSTOP);
524 cdev_stop(tp, 0);
525 return (0);
526 }
527 if (!CCEQ(cc[VSTART], c))
528 return (0);
529 /*
530 * if VSTART == VSTOP then toggle
531 */
532 goto endcase;
533 }
534 if (CCEQ(cc[VSTART], c))
535 goto restartoutput;
536 }
537 /*
538 * IGNCR, ICRNL, & INLCR
539 */
540 if (c == '\r') {
541 if (ISSET(iflag, IGNCR))
542 goto endcase;
543 else if (ISSET(iflag, ICRNL))
544 c = '\n';
545 } else if (c == '\n' && ISSET(iflag, INLCR))
546 c = '\r';
547 }
548 if (!ISSET(lflag, EXTPROC) && ISSET(lflag, ICANON)) {
549 /*
550 * From here on down canonical mode character
551 * processing takes place.
552 */
553 /*
554 * erase (^H / ^?)
555 */
556 if (CCEQ(cc[VERASE], c)) {
557 if (tp->t_rawq.c_cc)
558 ttyrub(unputc(&tp->t_rawq), tp);
559 goto endcase;
560 }
561 /*
562 * kill (^U)
563 */
564 if (CCEQ(cc[VKILL], c)) {
565 if (ISSET(lflag, ECHOKE) &&
566 tp->t_rawq.c_cc == tp->t_rocount &&
567 !ISSET(lflag, ECHOPRT))
568 while (tp->t_rawq.c_cc)
569 ttyrub(unputc(&tp->t_rawq), tp);
570 else {
571 ttyecho(c, tp);
572 if (ISSET(lflag, ECHOK) ||
573 ISSET(lflag, ECHOKE))
574 ttyecho('\n', tp);
575 FLUSHQ(&tp->t_rawq);
576 tp->t_rocount = 0;
577 }
578 CLR(tp->t_state, TS_LOCAL);
579 goto endcase;
580 }
581 /*
582 * Extensions to the POSIX.1 GTI set of functions.
583 */
584 if (ISSET(lflag, IEXTEN)) {
585 /*
586 * word erase (^W)
587 */
588 if (CCEQ(cc[VWERASE], c)) {
589 int alt = ISSET(lflag, ALTWERASE);
590 int ctype;
591
592 /*
593 * erase whitespace
594 */
595 while ((c = unputc(&tp->t_rawq)) == ' ' ||
596 c == '\t')
597 ttyrub(c, tp);
598 if (c == -1)
599 goto endcase;
600 /*
601 * erase last char of word and remember the
602 * next chars type (for ALTWERASE)
603 */
604 ttyrub(c, tp);
605 c = unputc(&tp->t_rawq);
606 if (c == -1)
607 goto endcase;
608 if (c == ' ' || c == '\t') {
609 (void)putc(c, &tp->t_rawq);
610 goto endcase;
611 }
612 ctype = ISALPHA(c);
613 /*
614 * erase rest of word
615 */
616 do {
617 ttyrub(c, tp);
618 c = unputc(&tp->t_rawq);
619 if (c == -1)
620 goto endcase;
621 } while (c != ' ' && c != '\t' &&
622 (alt == 0 || ISALPHA(c) == ctype));
623 (void)putc(c, &tp->t_rawq);
624 goto endcase;
625 }
626 /*
627 * reprint line (^R)
628 */
629 if (CCEQ(cc[VREPRINT], c)) {
630 ttyretype(tp);
631 goto endcase;
632 }
633 /*
634 * ^T - kernel info and generate SIGINFO
635 */
636 if (CCEQ(cc[VSTATUS], c)) {
637 ttysig(tp, TTYSIG_PG1, SIGINFO);
638 goto endcase;
639 }
640 }
641 }
642 /*
643 * Check for input buffer overflow
644 */
645 if (tp->t_rawq.c_cc + tp->t_canq.c_cc >= TTYHOG) {
646 if (ISSET(iflag, IMAXBEL)) {
647 if (tp->t_outq.c_cc < tp->t_hiwat)
648 (void)ttyoutput(CTRL('g'), tp);
649 } else
650 ttyflush(tp, FREAD | FWRITE);
651 goto endcase;
652 }
653 /*
654 * Put data char in q for user and
655 * wakeup on seeing a line delimiter.
656 */
657 if (putc(c, &tp->t_rawq) >= 0) {
658 if (!ISSET(lflag, ICANON)) {
659 ttwakeup(tp);
660 ttyecho(c, tp);
661 goto endcase;
662 }
663 if (TTBREAKC(c, lflag)) {
664 tp->t_rocount = 0;
665 catq(&tp->t_rawq, &tp->t_canq);
666 ttwakeup(tp);
667 } else if (tp->t_rocount++ == 0)
668 tp->t_rocol = tp->t_column;
669 if (ISSET(tp->t_state, TS_ERASE)) {
670 /*
671 * end of prterase \.../
672 */
673 CLR(tp->t_state, TS_ERASE);
674 (void)ttyoutput('/', tp);
675 }
676 i = tp->t_column;
677 ttyecho(c, tp);
678 if (CCEQ(cc[VEOF], c) && ISSET(lflag, ECHO)) {
679 /*
680 * Place the cursor over the '^' of the ^D.
681 */
682 i = min(2, tp->t_column - i);
683 while (i > 0) {
684 (void)ttyoutput('\b', tp);
685 i--;
686 }
687 }
688 }
689 endcase:
690 /*
691 * IXANY means allow any character to restart output.
692 */
693 if (ISSET(tp->t_state, TS_TTSTOP) &&
694 !ISSET(iflag, IXANY) && cc[VSTART] != cc[VSTOP]) {
695 return (0);
696 }
697 restartoutput:
698 CLR(tp->t_lflag, FLUSHO);
699 CLR(tp->t_state, TS_TTSTOP);
700 startoutput:
701 return (ttstart(tp));
702 }
703
704 /*
705 * Process input of a single character received on a tty.
706 *
707 * XXX - this is a hack, all drivers must changed to acquire the
708 * lock before calling linesw->l_rint()
709 */
710 int
711 ttyinput(int c, struct tty *tp)
712 {
713 int error;
714
715 /*
716 * Unless the receiver is enabled, drop incoming data.
717 */
718 if (!ISSET(tp->t_cflag, CREAD))
719 return (0);
720
721 mutex_spin_enter(&tty_lock);
722 error = ttyinput_wlock(c, tp);
723 mutex_spin_exit(&tty_lock);
724
725 return (error);
726 }
727
728 /*
729 * Output a single character on a tty, doing output processing
730 * as needed (expanding tabs, newline processing, etc.).
731 * Returns < 0 if succeeds, otherwise returns char to resend.
732 * Must be recursive.
733 *
734 * Call with tty lock held.
735 */
736 int
737 ttyoutput(int c, struct tty *tp)
738 {
739 long oflag;
740 int col, notout;
741
742 KASSERT(mutex_owned(&tty_lock));
743
744 oflag = tp->t_oflag;
745 if (!ISSET(oflag, OPOST)) {
746 tk_nout++;
747 tp->t_outcc++;
748 if (!ISSET(tp->t_lflag, FLUSHO) && putc(c, &tp->t_outq))
749 return (c);
750 return (-1);
751 }
752 /*
753 * Do tab expansion if OXTABS is set. Special case if we do external
754 * processing, we don't do the tab expansion because we'll probably
755 * get it wrong. If tab expansion needs to be done, let it happen
756 * externally.
757 */
758 CLR(c, ~TTY_CHARMASK);
759 if (c == '\t' &&
760 ISSET(oflag, OXTABS) && !ISSET(tp->t_lflag, EXTPROC)) {
761 c = 8 - (tp->t_column & 7);
762 if (ISSET(tp->t_lflag, FLUSHO)) {
763 notout = 0;
764 } else {
765 notout = b_to_q(" ", c, &tp->t_outq);
766 c -= notout;
767 tk_nout += c;
768 tp->t_outcc += c;
769 }
770 tp->t_column += c;
771 return (notout ? '\t' : -1);
772 }
773 if (c == CEOT && ISSET(oflag, ONOEOT))
774 return (-1);
775
776 /*
777 * Newline translation: if ONLCR is set,
778 * translate newline into "\r\n".
779 */
780 if (c == '\n' && ISSET(tp->t_oflag, ONLCR)) {
781 tk_nout++;
782 tp->t_outcc++;
783 if (!ISSET(tp->t_lflag, FLUSHO) && putc('\r', &tp->t_outq))
784 return (c);
785 }
786 /* If OCRNL is set, translate "\r" into "\n". */
787 else if (c == '\r' && ISSET(tp->t_oflag, OCRNL))
788 c = '\n';
789 /* If ONOCR is set, don't transmit CRs when on column 0. */
790 else if (c == '\r' && ISSET(tp->t_oflag, ONOCR) && tp->t_column == 0)
791 return (-1);
792
793 tk_nout++;
794 tp->t_outcc++;
795 if (!ISSET(tp->t_lflag, FLUSHO) && putc(c, &tp->t_outq))
796 return (c);
797
798 col = tp->t_column;
799 switch (CCLASS(c)) {
800 case BACKSPACE:
801 if (col > 0)
802 --col;
803 break;
804 case CONTROL:
805 break;
806 case NEWLINE:
807 if (ISSET(tp->t_oflag, ONLCR | ONLRET))
808 col = 0;
809 break;
810 case RETURN:
811 col = 0;
812 break;
813 case ORDINARY:
814 ++col;
815 break;
816 case TAB:
817 col = (col + 8) & ~7;
818 break;
819 }
820 tp->t_column = col;
821 return (-1);
822 }
823
824 /*
825 * Ioctls for all tty devices. Called after line-discipline specific ioctl
826 * has been called to do discipline-specific functions and/or reject any
827 * of these ioctl commands.
828 */
829 /* ARGSUSED */
830 int
831 ttioctl(struct tty *tp, u_long cmd, void *data, int flag, struct lwp *l)
832 {
833 extern struct tty *constty; /* Temporary virtual console. */
834 struct proc *p = l ? l->l_proc : NULL;
835 struct linesw *lp;
836 int s, error;
837 struct pathbuf *pb;
838 struct nameidata nd;
839 char infobuf[200];
840
841 /* If the ioctl involves modification, hang if in the background. */
842 switch (cmd) {
843 case TIOCFLUSH:
844 case TIOCDRAIN:
845 case TIOCSBRK:
846 case TIOCCBRK:
847 case TIOCSTART:
848 case TIOCSETA:
849 case TIOCSETD:
850 case TIOCSLINED:
851 case TIOCSETAF:
852 case TIOCSETAW:
853 #ifdef notdef
854 case TIOCSPGRP:
855 case FIOSETOWN:
856 #endif
857 case TIOCSTAT:
858 case TIOCSTI:
859 case TIOCSWINSZ:
860 case TIOCLBIC:
861 case TIOCLBIS:
862 case TIOCLSET:
863 case TIOCSETC:
864 case OTIOCSETD:
865 case TIOCSETN:
866 case TIOCSETP:
867 case TIOCSLTC:
868 mutex_spin_enter(&tty_lock);
869 while (isbackground(curproc, tp) &&
870 p->p_pgrp->pg_jobc && (p->p_lflag & PL_PPWAIT) == 0 &&
871 !sigismasked(l, SIGTTOU)) {
872 mutex_spin_exit(&tty_lock);
873
874 mutex_enter(proc_lock);
875 pgsignal(p->p_pgrp, SIGTTOU, 1);
876 mutex_exit(proc_lock);
877
878 mutex_spin_enter(&tty_lock);
879 error = ttysleep(tp, &lbolt, true, 0);
880 if (error) {
881 mutex_spin_exit(&tty_lock);
882 return (error);
883 }
884 }
885 mutex_spin_exit(&tty_lock);
886 break;
887 }
888
889 switch (cmd) { /* Process the ioctl. */
890 case FIOASYNC: /* set/clear async i/o */
891 mutex_spin_enter(&tty_lock);
892 if (*(int *)data)
893 SET(tp->t_state, TS_ASYNC);
894 else
895 CLR(tp->t_state, TS_ASYNC);
896 mutex_spin_exit(&tty_lock);
897 break;
898 case FIONBIO: /* set/clear non-blocking i/o */
899 break; /* XXX: delete. */
900 case FIONREAD: /* get # bytes to read */
901 mutex_spin_enter(&tty_lock);
902 *(int *)data = ttnread(tp);
903 mutex_spin_exit(&tty_lock);
904 break;
905 case FIONWRITE: /* get # bytes to written & unsent */
906 mutex_spin_enter(&tty_lock);
907 *(int *)data = tp->t_outq.c_cc;
908 mutex_spin_exit(&tty_lock);
909 break;
910 case FIONSPACE: /* get # bytes to written & unsent */
911 mutex_spin_enter(&tty_lock);
912 *(int *)data = tp->t_outq.c_cn - tp->t_outq.c_cc;
913 mutex_spin_exit(&tty_lock);
914 break;
915 case TIOCEXCL: /* set exclusive use of tty */
916 mutex_spin_enter(&tty_lock);
917 SET(tp->t_state, TS_XCLUDE);
918 mutex_spin_exit(&tty_lock);
919 break;
920 case TIOCFLUSH: { /* flush buffers */
921 int flags = *(int *)data;
922
923 if (flags == 0)
924 flags = FREAD | FWRITE;
925 else
926 flags &= FREAD | FWRITE;
927 mutex_spin_enter(&tty_lock);
928 ttyflush(tp, flags);
929 mutex_spin_exit(&tty_lock);
930 break;
931 }
932 case TIOCCONS: /* become virtual console */
933 if (*(int *)data) {
934 if (constty && constty != tp &&
935 ISSET(constty->t_state, TS_CARR_ON | TS_ISOPEN) ==
936 (TS_CARR_ON | TS_ISOPEN))
937 return EBUSY;
938
939 pb = pathbuf_create("/dev/console");
940 if (pb == NULL) {
941 return ENOMEM;
942 }
943 NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, pb);
944 if ((error = namei(&nd)) != 0) {
945 pathbuf_destroy(pb);
946 return error;
947 }
948 error = VOP_ACCESS(nd.ni_vp, VREAD, l->l_cred);
949 vput(nd.ni_vp);
950 pathbuf_destroy(pb);
951 if (error)
952 return error;
953
954 constty = tp;
955 } else if (tp == constty)
956 constty = NULL;
957 break;
958 case TIOCDRAIN: /* wait till output drained */
959 if ((error = ttywait(tp)) != 0)
960 return (error);
961 break;
962 case TIOCGETA: { /* get termios struct */
963 struct termios *t = (struct termios *)data;
964
965 memcpy(t, &tp->t_termios, sizeof(struct termios));
966 break;
967 }
968 case TIOCGETD: /* get line discipline (old) */
969 *(int *)data = tp->t_linesw->l_no;
970 break;
971 case TIOCGLINED: /* get line discipline (new) */
972 (void)strncpy((char *)data, tp->t_linesw->l_name,
973 TTLINEDNAMELEN - 1);
974 break;
975 case TIOCGWINSZ: /* get window size */
976 *(struct winsize *)data = tp->t_winsize;
977 break;
978 case FIOGETOWN:
979 mutex_enter(proc_lock);
980 if (tp->t_session != NULL && !isctty(p, tp)) {
981 mutex_exit(proc_lock);
982 return (ENOTTY);
983 }
984 *(int *)data = tp->t_pgrp ? -tp->t_pgrp->pg_id : 0;
985 mutex_exit(proc_lock);
986 break;
987 case TIOCGPGRP: /* get pgrp of tty */
988 mutex_enter(proc_lock);
989 if (!isctty(p, tp)) {
990 mutex_exit(proc_lock);
991 return (ENOTTY);
992 }
993 *(int *)data = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PGID;
994 mutex_exit(proc_lock);
995 break;
996 case TIOCGSID: /* get sid of tty */
997 mutex_enter(proc_lock);
998 if (!isctty(p, tp)) {
999 mutex_exit(proc_lock);
1000 return (ENOTTY);
1001 }
1002 *(int *)data = tp->t_session->s_sid;
1003 mutex_exit(proc_lock);
1004 break;
1005 #ifdef TIOCHPCL
1006 case TIOCHPCL: /* hang up on last close */
1007 mutex_spin_enter(&tty_lock);
1008 SET(tp->t_cflag, HUPCL);
1009 mutex_spin_exit(&tty_lock);
1010 break;
1011 #endif
1012 case TIOCNXCL: /* reset exclusive use of tty */
1013 mutex_spin_enter(&tty_lock);
1014 CLR(tp->t_state, TS_XCLUDE);
1015 mutex_spin_exit(&tty_lock);
1016 break;
1017 case TIOCOUTQ: /* output queue size */
1018 *(int *)data = tp->t_outq.c_cc;
1019 break;
1020 case TIOCSETA: /* set termios struct */
1021 case TIOCSETAW: /* drain output, set */
1022 case TIOCSETAF: { /* drn out, fls in, set */
1023 struct termios *t = (struct termios *)data;
1024
1025 if (cmd == TIOCSETAW || cmd == TIOCSETAF) {
1026 if ((error = ttywait(tp)) != 0)
1027 return (error);
1028
1029 if (cmd == TIOCSETAF) {
1030 mutex_spin_enter(&tty_lock);
1031 ttyflush(tp, FREAD);
1032 mutex_spin_exit(&tty_lock);
1033 }
1034 }
1035
1036 s = spltty();
1037 /*
1038 * XXXSMP - some drivers call back on us from t_param(), so
1039 * don't take the tty spin lock here.
1040 * require t_param() to unlock upon callback?
1041 */
1042 /* wanted here: mutex_spin_enter(&tty_lock); */
1043 if (!ISSET(t->c_cflag, CIGNORE)) {
1044 /*
1045 * Set device hardware.
1046 */
1047 if (tp->t_param && (error = (*tp->t_param)(tp, t))) {
1048 /* wanted here: mutex_spin_exit(&tty_lock); */
1049 splx(s);
1050 return (error);
1051 } else {
1052 tp->t_cflag = t->c_cflag;
1053 tp->t_ispeed = t->c_ispeed;
1054 tp->t_ospeed = t->c_ospeed;
1055 if (t->c_ospeed == 0)
1056 ttysig(tp, TTYSIG_LEADER, SIGHUP);
1057 }
1058 ttsetwater(tp);
1059 }
1060
1061 /* delayed lock acquiring */
1062 mutex_spin_enter(&tty_lock);
1063 if (cmd != TIOCSETAF) {
1064 if (ISSET(t->c_lflag, ICANON) !=
1065 ISSET(tp->t_lflag, ICANON)) {
1066 if (ISSET(t->c_lflag, ICANON)) {
1067 SET(tp->t_lflag, PENDIN);
1068 ttwakeup(tp);
1069 } else {
1070 struct clist tq;
1071
1072 catq(&tp->t_rawq, &tp->t_canq);
1073 tq = tp->t_rawq;
1074 tp->t_rawq = tp->t_canq;
1075 tp->t_canq = tq;
1076 CLR(tp->t_lflag, PENDIN);
1077 }
1078 }
1079 }
1080 tp->t_iflag = t->c_iflag;
1081 tp->t_oflag = t->c_oflag;
1082 /*
1083 * Make the EXTPROC bit read only.
1084 */
1085 if (ISSET(tp->t_lflag, EXTPROC))
1086 SET(t->c_lflag, EXTPROC);
1087 else
1088 CLR(t->c_lflag, EXTPROC);
1089 tp->t_lflag = t->c_lflag | ISSET(tp->t_lflag, PENDIN);
1090 memcpy(tp->t_cc, t->c_cc, sizeof(t->c_cc));
1091 mutex_spin_exit(&tty_lock);
1092 splx(s);
1093 break;
1094 }
1095 case TIOCSETD: /* set line discipline (old) */
1096 lp = ttyldisc_lookup_bynum(*(int *)data);
1097 goto setldisc;
1098
1099 case TIOCSLINED: { /* set line discipline (new) */
1100 char *name = (char *)data;
1101 dev_t device;
1102
1103 /* Null terminate to prevent buffer overflow */
1104 name[TTLINEDNAMELEN - 1] = '\0';
1105 lp = ttyldisc_lookup(name);
1106 setldisc:
1107 if (lp == NULL)
1108 return (ENXIO);
1109
1110 if (lp != tp->t_linesw) {
1111 device = tp->t_dev;
1112 s = spltty();
1113 (*tp->t_linesw->l_close)(tp, flag);
1114 error = (*lp->l_open)(device, tp);
1115 if (error) {
1116 (void)(*tp->t_linesw->l_open)(device, tp);
1117 splx(s);
1118 ttyldisc_release(lp);
1119 return (error);
1120 }
1121 ttyldisc_release(tp->t_linesw);
1122 tp->t_linesw = lp;
1123 splx(s);
1124 } else {
1125 /* Drop extra reference. */
1126 ttyldisc_release(lp);
1127 }
1128 break;
1129 }
1130 case TIOCSTART: /* start output, like ^Q */
1131 mutex_spin_enter(&tty_lock);
1132 if (ISSET(tp->t_state, TS_TTSTOP) ||
1133 ISSET(tp->t_lflag, FLUSHO)) {
1134 CLR(tp->t_lflag, FLUSHO);
1135 CLR(tp->t_state, TS_TTSTOP);
1136 ttstart(tp);
1137 }
1138 mutex_spin_exit(&tty_lock);
1139 break;
1140 case TIOCSTI: /* simulate terminal input */
1141 if (kauth_authorize_device_tty(l->l_cred, KAUTH_DEVICE_TTY_STI,
1142 tp) != 0) {
1143 if (!ISSET(flag, FREAD))
1144 return (EPERM);
1145 if (!isctty(p, tp))
1146 return (EACCES);
1147 }
1148 (*tp->t_linesw->l_rint)(*(u_char *)data, tp);
1149 break;
1150 case TIOCSTOP: /* stop output, like ^S */
1151 {
1152 mutex_spin_enter(&tty_lock);
1153 if (!ISSET(tp->t_state, TS_TTSTOP)) {
1154 SET(tp->t_state, TS_TTSTOP);
1155 cdev_stop(tp, 0);
1156 }
1157 mutex_spin_exit(&tty_lock);
1158 break;
1159 }
1160 case TIOCSCTTY: /* become controlling tty */
1161 mutex_enter(proc_lock);
1162 mutex_spin_enter(&tty_lock);
1163
1164 /* Session ctty vnode pointer set in vnode layer. */
1165 if (!SESS_LEADER(p) ||
1166 ((p->p_session->s_ttyvp || tp->t_session) &&
1167 (tp->t_session != p->p_session))) {
1168 mutex_spin_exit(&tty_lock);
1169 mutex_exit(proc_lock);
1170 return (EPERM);
1171 }
1172
1173 /*
1174 * `p_session' acquires a reference.
1175 * But note that if `t_session' is set at this point,
1176 * it must equal `p_session', in which case the session
1177 * already has the correct reference count.
1178 */
1179 if (tp->t_session == NULL) {
1180 proc_sesshold(p->p_session);
1181 }
1182 tp->t_session = p->p_session;
1183 tp->t_pgrp = p->p_pgrp;
1184 p->p_session->s_ttyp = tp;
1185 p->p_lflag |= PL_CONTROLT;
1186 mutex_spin_exit(&tty_lock);
1187 mutex_exit(proc_lock);
1188 break;
1189 case FIOSETOWN: { /* set pgrp of tty */
1190 pid_t pgid = *(int *)data;
1191 struct pgrp *pgrp;
1192
1193 mutex_enter(proc_lock);
1194 if (tp->t_session != NULL && !isctty(p, tp)) {
1195 mutex_exit(proc_lock);
1196 return (ENOTTY);
1197 }
1198
1199 if (pgid < 0) {
1200 pgrp = pgrp_find(-pgid);
1201 if (pgrp == NULL) {
1202 mutex_exit(proc_lock);
1203 return (EINVAL);
1204 }
1205 } else {
1206 struct proc *p1;
1207 p1 = proc_find(pgid);
1208 if (!p1) {
1209 mutex_exit(proc_lock);
1210 return (ESRCH);
1211 }
1212 pgrp = p1->p_pgrp;
1213 }
1214
1215 if (pgrp->pg_session != p->p_session) {
1216 mutex_exit(proc_lock);
1217 return (EPERM);
1218 }
1219 mutex_spin_enter(&tty_lock);
1220 tp->t_pgrp = pgrp;
1221 mutex_spin_exit(&tty_lock);
1222 mutex_exit(proc_lock);
1223 break;
1224 }
1225 case TIOCSPGRP: { /* set pgrp of tty */
1226 struct pgrp *pgrp;
1227
1228 mutex_enter(proc_lock);
1229 if (!isctty(p, tp)) {
1230 mutex_exit(proc_lock);
1231 return (ENOTTY);
1232 }
1233 pgrp = pgrp_find(*(pid_t *)data);
1234 if (pgrp == NULL) {
1235 mutex_exit(proc_lock);
1236 return (EINVAL);
1237 }
1238 if (pgrp->pg_session != p->p_session) {
1239 mutex_exit(proc_lock);
1240 return (EPERM);
1241 }
1242 mutex_spin_enter(&tty_lock);
1243 tp->t_pgrp = pgrp;
1244 mutex_spin_exit(&tty_lock);
1245 mutex_exit(proc_lock);
1246 break;
1247 }
1248 case TIOCSTAT: /* get load avg stats */
1249 mutex_enter(proc_lock);
1250 ttygetinfo(tp, 0, infobuf, sizeof(infobuf));
1251 mutex_exit(proc_lock);
1252
1253 mutex_spin_enter(&tty_lock);
1254 ttyputinfo(tp, infobuf);
1255 mutex_spin_exit(&tty_lock);
1256 break;
1257 case TIOCSWINSZ: /* set window size */
1258 mutex_spin_enter(&tty_lock);
1259 if (memcmp((void *)&tp->t_winsize, data,
1260 sizeof(struct winsize))) {
1261 tp->t_winsize = *(struct winsize *)data;
1262 ttysig(tp, TTYSIG_PG1, SIGWINCH);
1263 }
1264 mutex_spin_exit(&tty_lock);
1265 break;
1266 default:
1267 /* We may have to load the compat module for this. */
1268 for (;;) {
1269 rw_enter(&ttcompat_lock, RW_READER);
1270 if (ttcompatvec != NULL) {
1271 break;
1272 }
1273 rw_exit(&ttcompat_lock);
1274 (void)module_autoload("compat", MODULE_CLASS_ANY);
1275 if (ttcompatvec == NULL) {
1276 return EPASSTHROUGH;
1277 }
1278 }
1279 error = (*ttcompatvec)(tp, cmd, data, flag, l);
1280 rw_exit(&ttcompat_lock);
1281 return error;
1282 }
1283 return (0);
1284 }
1285
1286 int
1287 ttpoll(struct tty *tp, int events, struct lwp *l)
1288 {
1289 int revents;
1290
1291 revents = 0;
1292 mutex_spin_enter(&tty_lock);
1293 if (events & (POLLIN | POLLRDNORM))
1294 if (ttnread(tp) > 0)
1295 revents |= events & (POLLIN | POLLRDNORM);
1296
1297 if (events & (POLLOUT | POLLWRNORM))
1298 if (tp->t_outq.c_cc <= tp->t_lowat)
1299 revents |= events & (POLLOUT | POLLWRNORM);
1300
1301 if (events & POLLHUP)
1302 if (!CONNECTED(tp))
1303 revents |= POLLHUP;
1304
1305 if (revents == 0) {
1306 if (events & (POLLIN | POLLHUP | POLLRDNORM))
1307 selrecord(l, &tp->t_rsel);
1308
1309 if (events & (POLLOUT | POLLWRNORM))
1310 selrecord(l, &tp->t_wsel);
1311 }
1312
1313 mutex_spin_exit(&tty_lock);
1314
1315 return (revents);
1316 }
1317
1318 static void
1319 filt_ttyrdetach(struct knote *kn)
1320 {
1321 struct tty *tp;
1322
1323 tp = kn->kn_hook;
1324 mutex_spin_enter(&tty_lock);
1325 SLIST_REMOVE(&tp->t_rsel.sel_klist, kn, knote, kn_selnext);
1326 mutex_spin_exit(&tty_lock);
1327 }
1328
1329 static int
1330 filt_ttyread(struct knote *kn, long hint)
1331 {
1332 struct tty *tp;
1333
1334 tp = kn->kn_hook;
1335 if ((hint & NOTE_SUBMIT) == 0)
1336 mutex_spin_enter(&tty_lock);
1337 kn->kn_data = ttnread(tp);
1338 if ((hint & NOTE_SUBMIT) == 0)
1339 mutex_spin_exit(&tty_lock);
1340 return (kn->kn_data > 0);
1341 }
1342
1343 static void
1344 filt_ttywdetach(struct knote *kn)
1345 {
1346 struct tty *tp;
1347
1348 tp = kn->kn_hook;
1349 mutex_spin_enter(&tty_lock);
1350 SLIST_REMOVE(&tp->t_wsel.sel_klist, kn, knote, kn_selnext);
1351 mutex_spin_exit(&tty_lock);
1352 }
1353
1354 static int
1355 filt_ttywrite(struct knote *kn, long hint)
1356 {
1357 struct tty *tp;
1358 int canwrite;
1359
1360 tp = kn->kn_hook;
1361 if ((hint & NOTE_SUBMIT) == 0)
1362 mutex_spin_enter(&tty_lock);
1363 kn->kn_data = tp->t_outq.c_cn - tp->t_outq.c_cc;
1364 canwrite = (tp->t_outq.c_cc <= tp->t_lowat) && CONNECTED(tp);
1365 if ((hint & NOTE_SUBMIT) == 0)
1366 mutex_spin_exit(&tty_lock);
1367 return (canwrite);
1368 }
1369
1370 static const struct filterops ttyread_filtops =
1371 { 1, NULL, filt_ttyrdetach, filt_ttyread };
1372 static const struct filterops ttywrite_filtops =
1373 { 1, NULL, filt_ttywdetach, filt_ttywrite };
1374
1375 int
1376 ttykqfilter(dev_t dev, struct knote *kn)
1377 {
1378 struct tty *tp;
1379 struct klist *klist;
1380
1381 if ((tp = cdev_tty(dev)) == NULL)
1382 return (ENXIO);
1383
1384 switch (kn->kn_filter) {
1385 case EVFILT_READ:
1386 klist = &tp->t_rsel.sel_klist;
1387 kn->kn_fop = &ttyread_filtops;
1388 break;
1389 case EVFILT_WRITE:
1390 klist = &tp->t_wsel.sel_klist;
1391 kn->kn_fop = &ttywrite_filtops;
1392 break;
1393 default:
1394 return EINVAL;
1395 }
1396
1397 kn->kn_hook = tp;
1398
1399 mutex_spin_enter(&tty_lock);
1400 SLIST_INSERT_HEAD(klist, kn, kn_selnext);
1401 mutex_spin_exit(&tty_lock);
1402
1403 return (0);
1404 }
1405
1406 /*
1407 * Find the number of chars ready to be read from this tty.
1408 * Call with the tty lock held.
1409 */
1410 static int
1411 ttnread(struct tty *tp)
1412 {
1413 int nread;
1414
1415 KASSERT(mutex_owned(&tty_lock));
1416
1417 if (ISSET(tp->t_lflag, PENDIN))
1418 ttypend(tp);
1419 nread = tp->t_canq.c_cc;
1420 if (!ISSET(tp->t_lflag, ICANON)) {
1421 nread += tp->t_rawq.c_cc;
1422 if (nread < tp->t_cc[VMIN] && !tp->t_cc[VTIME])
1423 nread = 0;
1424 }
1425 return (nread);
1426 }
1427
1428 /*
1429 * Wait for output to drain.
1430 */
1431 int
1432 ttywait(struct tty *tp)
1433 {
1434 int error;
1435
1436 error = 0;
1437
1438 mutex_spin_enter(&tty_lock);
1439 while ((tp->t_outq.c_cc || ISSET(tp->t_state, TS_BUSY)) &&
1440 CONNECTED(tp) && tp->t_oproc) {
1441 (*tp->t_oproc)(tp);
1442 error = ttysleep(tp, &tp->t_outcv, true, 0);
1443 if (error)
1444 break;
1445 }
1446 mutex_spin_exit(&tty_lock);
1447
1448 return (error);
1449 }
1450
1451 /*
1452 * Flush if successfully wait.
1453 */
1454 int
1455 ttywflush(struct tty *tp)
1456 {
1457 int error;
1458
1459 if ((error = ttywait(tp)) == 0) {
1460 mutex_spin_enter(&tty_lock);
1461 ttyflush(tp, FREAD);
1462 mutex_spin_exit(&tty_lock);
1463 }
1464 return (error);
1465 }
1466
1467 /*
1468 * Flush tty read and/or write queues, notifying anyone waiting.
1469 * Call with the tty lock held.
1470 */
1471 void
1472 ttyflush(struct tty *tp, int rw)
1473 {
1474
1475 KASSERT(mutex_owned(&tty_lock));
1476
1477 if (rw & FREAD) {
1478 FLUSHQ(&tp->t_canq);
1479 FLUSHQ(&tp->t_rawq);
1480 tp->t_rocount = 0;
1481 tp->t_rocol = 0;
1482 CLR(tp->t_state, TS_LOCAL);
1483 ttwakeup(tp);
1484 }
1485 if (rw & FWRITE) {
1486 CLR(tp->t_state, TS_TTSTOP);
1487 cdev_stop(tp, rw);
1488 FLUSHQ(&tp->t_outq);
1489 cv_broadcast(&tp->t_outcv);
1490 selnotify(&tp->t_wsel, 0, NOTE_SUBMIT);
1491 }
1492 }
1493
1494 /*
1495 * Copy in the default termios characters.
1496 */
1497 void
1498 ttychars(struct tty *tp)
1499 {
1500
1501 memcpy(tp->t_cc, ttydefchars, sizeof(ttydefchars));
1502 }
1503
1504 /*
1505 * Send stop character on input overflow.
1506 * Call with the tty lock held.
1507 */
1508 static void
1509 ttyblock(struct tty *tp)
1510 {
1511 int total;
1512
1513 KASSERT(mutex_owned(&tty_lock));
1514
1515 total = tp->t_rawq.c_cc + tp->t_canq.c_cc;
1516 if (tp->t_rawq.c_cc > TTYHOG) {
1517 ttyflush(tp, FREAD | FWRITE);
1518 CLR(tp->t_state, TS_TBLOCK);
1519 }
1520 /*
1521 * Block further input iff: current input > threshold
1522 * AND input is available to user program.
1523 */
1524 if (total >= TTYHOG / 2 &&
1525 !ISSET(tp->t_state, TS_TBLOCK) &&
1526 (!ISSET(tp->t_lflag, ICANON) || tp->t_canq.c_cc > 0)) {
1527 if (ISSET(tp->t_iflag, IXOFF) &&
1528 tp->t_cc[VSTOP] != _POSIX_VDISABLE &&
1529 putc(tp->t_cc[VSTOP], &tp->t_outq) == 0) {
1530 SET(tp->t_state, TS_TBLOCK);
1531 ttstart(tp);
1532 }
1533 /* Try to block remote output via hardware flow control. */
1534 if (ISSET(tp->t_cflag, CHWFLOW) && tp->t_hwiflow &&
1535 (*tp->t_hwiflow)(tp, 1) != 0)
1536 SET(tp->t_state, TS_TBLOCK);
1537 }
1538 }
1539
1540 /*
1541 * Delayed line discipline output
1542 */
1543 void
1544 ttrstrt(void *tp_arg)
1545 {
1546 struct tty *tp;
1547
1548 #ifdef DIAGNOSTIC
1549 if (tp_arg == NULL)
1550 panic("ttrstrt");
1551 #endif
1552 tp = tp_arg;
1553 mutex_spin_enter(&tty_lock);
1554
1555 CLR(tp->t_state, TS_TIMEOUT);
1556 ttstart(tp); /* XXX - Shouldn't this be tp->l_start(tp)? */
1557
1558 mutex_spin_exit(&tty_lock);
1559 }
1560
1561 /*
1562 * start a line discipline
1563 * Always call with tty lock held?
1564 */
1565 int
1566 ttstart(struct tty *tp)
1567 {
1568
1569 if (tp->t_oproc != NULL) /* XXX: Kludge for pty. */
1570 (*tp->t_oproc)(tp);
1571 return (0);
1572 }
1573
1574 /*
1575 * "close" a line discipline
1576 */
1577 int
1578 ttylclose(struct tty *tp, int flag)
1579 {
1580
1581 if (flag & FNONBLOCK) {
1582 mutex_spin_enter(&tty_lock);
1583 ttyflush(tp, FREAD | FWRITE);
1584 mutex_spin_exit(&tty_lock);
1585 } else
1586 ttywflush(tp);
1587 return (0);
1588 }
1589
1590 /*
1591 * Handle modem control transition on a tty.
1592 * Flag indicates new state of carrier.
1593 * Returns 0 if the line should be turned off, otherwise 1.
1594 */
1595 int
1596 ttymodem(struct tty *tp, int flag)
1597 {
1598
1599 mutex_spin_enter(&tty_lock);
1600 if (flag == 0) {
1601 if (ISSET(tp->t_state, TS_CARR_ON)) {
1602 /*
1603 * Lost carrier.
1604 */
1605 CLR(tp->t_state, TS_CARR_ON);
1606 if (ISSET(tp->t_state, TS_ISOPEN) && !CONNECTED(tp)) {
1607 ttysig(tp, TTYSIG_LEADER, SIGHUP);
1608 ttyflush(tp, FREAD | FWRITE);
1609 mutex_spin_exit(&tty_lock);
1610 return (0);
1611 }
1612 }
1613 } else {
1614 if (!ISSET(tp->t_state, TS_CARR_ON)) {
1615 /*
1616 * Carrier now on.
1617 */
1618 SET(tp->t_state, TS_CARR_ON);
1619 ttwakeup(tp);
1620 }
1621 }
1622 mutex_spin_exit(&tty_lock);
1623
1624 return (1);
1625 }
1626
1627 /*
1628 * Default modem control routine (for other line disciplines).
1629 * Return argument flag, to turn off device on carrier drop.
1630 */
1631 int
1632 nullmodem(struct tty *tp, int flag)
1633 {
1634
1635 mutex_spin_enter(&tty_lock);
1636 if (flag)
1637 SET(tp->t_state, TS_CARR_ON);
1638 else {
1639 CLR(tp->t_state, TS_CARR_ON);
1640 if (!CONNECTED(tp)) {
1641 ttysig(tp, TTYSIG_LEADER, SIGHUP);
1642 mutex_spin_exit(&tty_lock);
1643 return (0);
1644 }
1645 }
1646 mutex_spin_exit(&tty_lock);
1647
1648 return (1);
1649 }
1650
1651 /*
1652 * Reinput pending characters after state switch.
1653 */
1654 void
1655 ttypend(struct tty *tp)
1656 {
1657 struct clist tq;
1658 int c;
1659
1660 KASSERT(mutex_owned(&tty_lock));
1661
1662 CLR(tp->t_lflag, PENDIN);
1663 SET(tp->t_state, TS_TYPEN);
1664 tq = tp->t_rawq;
1665 tp->t_rawq.c_cc = 0;
1666 tp->t_rawq.c_cf = tp->t_rawq.c_cl = 0;
1667 while ((c = getc(&tq)) >= 0)
1668 ttyinput_wlock(c, tp);
1669 CLR(tp->t_state, TS_TYPEN);
1670 }
1671
1672 /*
1673 * Process a read call on a tty device.
1674 */
1675 int
1676 ttread(struct tty *tp, struct uio *uio, int flag)
1677 {
1678 struct clist *qp;
1679 u_char *cc;
1680 struct proc *p;
1681 int c, first, error, has_stime, last_cc;
1682 long lflag, slp;
1683 struct timeval now, stime;
1684
1685 if (uio->uio_resid == 0)
1686 return 0;
1687
1688 stime.tv_usec = 0; /* XXX gcc */
1689 stime.tv_sec = 0; /* XXX gcc */
1690
1691 cc = tp->t_cc;
1692 p = curproc;
1693 error = 0;
1694 has_stime = 0;
1695 last_cc = 0;
1696 slp = 0;
1697
1698 loop:
1699 mutex_spin_enter(&tty_lock);
1700 lflag = tp->t_lflag;
1701 /*
1702 * take pending input first
1703 */
1704 if (ISSET(lflag, PENDIN))
1705 ttypend(tp);
1706
1707 /*
1708 * Hang process if it's in the background.
1709 */
1710 if (isbackground(p, tp)) {
1711 if (sigismasked(curlwp, SIGTTIN) ||
1712 p->p_lflag & PL_PPWAIT || p->p_pgrp->pg_jobc == 0) {
1713 mutex_spin_exit(&tty_lock);
1714 return (EIO);
1715 }
1716 mutex_spin_exit(&tty_lock);
1717
1718 mutex_enter(proc_lock);
1719 pgsignal(p->p_pgrp, SIGTTIN, 1);
1720 mutex_exit(proc_lock);
1721
1722 mutex_spin_enter(&tty_lock);
1723 error = ttysleep(tp, &lbolt, true, 0);
1724 mutex_spin_exit(&tty_lock);
1725 if (error)
1726 return (error);
1727 goto loop;
1728 }
1729
1730 if (!ISSET(lflag, ICANON)) {
1731 int m = cc[VMIN];
1732 long t = cc[VTIME];
1733
1734 qp = &tp->t_rawq;
1735 /*
1736 * Check each of the four combinations.
1737 * (m > 0 && t == 0) is the normal read case.
1738 * It should be fairly efficient, so we check that and its
1739 * companion case (m == 0 && t == 0) first.
1740 * For the other two cases, we compute the target sleep time
1741 * into slp.
1742 */
1743 if (t == 0) {
1744 if (qp->c_cc < m)
1745 goto sleep;
1746 goto read;
1747 }
1748 t *= hz; /* time in deca-ticks */
1749 /*
1750 * Time difference in deca-ticks, split division to avoid numeric overflow.
1751 * Ok for hz < ~200kHz
1752 */
1753 #define diff(t1, t2) (((t1).tv_sec - (t2).tv_sec) * 10 * hz + \
1754 ((t1).tv_usec - (t2).tv_usec) / 100 * hz / 1000)
1755 if (m > 0) {
1756 if (qp->c_cc <= 0)
1757 goto sleep;
1758 if (qp->c_cc >= m)
1759 goto read;
1760 if (!has_stime) {
1761 /* first character, start timer */
1762 has_stime = 1;
1763 getmicrotime(&stime);
1764 slp = t;
1765 } else if (qp->c_cc > last_cc) {
1766 /* got a character, restart timer */
1767 getmicrotime(&stime);
1768 slp = t;
1769 } else {
1770 /* nothing, check expiration */
1771 getmicrotime(&now);
1772 slp = t - diff(now, stime);
1773 }
1774 } else { /* m == 0 */
1775 if (qp->c_cc > 0)
1776 goto read;
1777 if (!has_stime) {
1778 has_stime = 1;
1779 getmicrotime(&stime);
1780 slp = t;
1781 } else {
1782 getmicrotime(&now);
1783 slp = t - diff(now, stime);
1784 }
1785 }
1786 last_cc = qp->c_cc;
1787 #undef diff
1788 if (slp > 0) {
1789 /*
1790 * Convert deca-ticks back to ticks.
1791 * Rounding down may make us wake up just short
1792 * of the target, so we round up.
1793 * Maybe we should do 'slp/10 + 1' because the
1794 * first tick maybe almost immediate.
1795 * However it is more useful for a program that sets
1796 * VTIME=10 to wakeup every second not every 1.01
1797 * seconds (if hz=100).
1798 */
1799 slp = (slp + 9)/ 10;
1800 goto sleep;
1801 }
1802 } else if ((qp = &tp->t_canq)->c_cc <= 0) {
1803 int carrier;
1804
1805 sleep:
1806 /*
1807 * If there is no input, sleep on rawq
1808 * awaiting hardware receipt and notification.
1809 * If we have data, we don't need to check for carrier.
1810 */
1811 carrier = CONNECTED(tp);
1812 if (!carrier && ISSET(tp->t_state, TS_ISOPEN)) {
1813 mutex_spin_exit(&tty_lock);
1814 return (0); /* EOF */
1815 }
1816 if (!has_stime || slp <= 0) {
1817 if (flag & IO_NDELAY) {
1818 mutex_spin_exit(&tty_lock);
1819 return (EWOULDBLOCK);
1820 }
1821 }
1822 error = ttysleep(tp, &tp->t_rawcv, true, slp);
1823 mutex_spin_exit(&tty_lock);
1824 /* VMIN == 0: any quantity read satisfies */
1825 if (cc[VMIN] == 0 && error == EWOULDBLOCK)
1826 return (0);
1827 if (error && error != EWOULDBLOCK)
1828 return (error);
1829 goto loop;
1830 }
1831 read:
1832 mutex_spin_exit(&tty_lock);
1833
1834 /*
1835 * Input present, check for input mapping and processing.
1836 */
1837 first = 1;
1838 while ((c = getc(qp)) >= 0) {
1839 /*
1840 * delayed suspend (^Y)
1841 */
1842 if (CCEQ(cc[VDSUSP], c) &&
1843 ISSET(lflag, IEXTEN|ISIG) == (IEXTEN|ISIG)) {
1844 mutex_spin_enter(&tty_lock);
1845 ttysig(tp, TTYSIG_PG1, SIGTSTP);
1846 if (first) {
1847 error = ttysleep(tp, &lbolt, true, 0);
1848 mutex_spin_exit(&tty_lock);
1849 if (error)
1850 break;
1851 goto loop;
1852 } else
1853 mutex_spin_exit(&tty_lock);
1854 break;
1855 }
1856 /*
1857 * Interpret EOF only in canonical mode.
1858 */
1859 if (CCEQ(cc[VEOF], c) && ISSET(lflag, ICANON))
1860 break;
1861 /*
1862 * Give user character.
1863 */
1864 error = ureadc(c, uio);
1865 if (error)
1866 break;
1867 if (uio->uio_resid == 0)
1868 break;
1869 /*
1870 * In canonical mode check for a "break character"
1871 * marking the end of a "line of input".
1872 */
1873 if (ISSET(lflag, ICANON) && TTBREAKC(c, lflag))
1874 break;
1875 first = 0;
1876 }
1877 /*
1878 * Look to unblock output now that (presumably)
1879 * the input queue has gone down.
1880 */
1881 mutex_spin_enter(&tty_lock);
1882 if (ISSET(tp->t_state, TS_TBLOCK) && tp->t_rawq.c_cc < TTYHOG / 5) {
1883 if (ISSET(tp->t_iflag, IXOFF) &&
1884 cc[VSTART] != _POSIX_VDISABLE &&
1885 putc(cc[VSTART], &tp->t_outq) == 0) {
1886 CLR(tp->t_state, TS_TBLOCK);
1887 ttstart(tp);
1888 }
1889 /* Try to unblock remote output via hardware flow control. */
1890 if (ISSET(tp->t_cflag, CHWFLOW) && tp->t_hwiflow &&
1891 (*tp->t_hwiflow)(tp, 0) != 0)
1892 CLR(tp->t_state, TS_TBLOCK);
1893 }
1894 mutex_spin_exit(&tty_lock);
1895
1896 return (error);
1897 }
1898
1899 /*
1900 * Check the output queue on tp for space for a kernel message (from uprintf
1901 * or tprintf). Allow some space over the normal hiwater mark so we don't
1902 * lose messages due to normal flow control, but don't let the tty run amok.
1903 * Sleeps here are not interruptible, but we return prematurely if new signals
1904 * arrive.
1905 * Call with tty lock held.
1906 */
1907 static int
1908 ttycheckoutq_wlock(struct tty *tp, int wait)
1909 {
1910 int hiwat, error;
1911
1912 KASSERT(mutex_owned(&tty_lock));
1913
1914 hiwat = tp->t_hiwat;
1915 if (tp->t_outq.c_cc > hiwat + 200)
1916 while (tp->t_outq.c_cc > hiwat) {
1917 ttstart(tp);
1918 if (wait == 0)
1919 return (0);
1920 error = ttysleep(tp, &tp->t_outcv, true, hz);
1921 if (error == EINTR)
1922 wait = 0;
1923 }
1924
1925 return (1);
1926 }
1927
1928 int
1929 ttycheckoutq(struct tty *tp, int wait)
1930 {
1931 int r;
1932
1933 mutex_spin_enter(&tty_lock);
1934 r = ttycheckoutq_wlock(tp, wait);
1935 mutex_spin_exit(&tty_lock);
1936
1937 return (r);
1938 }
1939
1940 /*
1941 * Process a write call on a tty device.
1942 */
1943 int
1944 ttwrite(struct tty *tp, struct uio *uio, int flag)
1945 {
1946 u_char *cp;
1947 struct proc *p;
1948 int cc, ce, i, hiwat, error;
1949 u_char obuf[OBUFSIZ];
1950
1951 cp = NULL;
1952 hiwat = tp->t_hiwat;
1953 error = 0;
1954 cc = 0;
1955 loop:
1956 mutex_spin_enter(&tty_lock);
1957 if (!CONNECTED(tp)) {
1958 if (ISSET(tp->t_state, TS_ISOPEN)) {
1959 mutex_spin_exit(&tty_lock);
1960 return (EIO);
1961 } else if (flag & IO_NDELAY) {
1962 mutex_spin_exit(&tty_lock);
1963 error = EWOULDBLOCK;
1964 goto out;
1965 } else {
1966 /* Sleep awaiting carrier. */
1967 error = ttysleep(tp, &tp->t_rawcv, true, 0);
1968 mutex_spin_exit(&tty_lock);
1969 if (error)
1970 goto out;
1971 goto loop;
1972 }
1973 }
1974
1975 /*
1976 * Hang the process if it's in the background.
1977 */
1978 p = curproc;
1979 if (isbackground(p, tp) &&
1980 ISSET(tp->t_lflag, TOSTOP) && (p->p_lflag & PL_PPWAIT) == 0 &&
1981 !sigismasked(curlwp, SIGTTOU)) {
1982 if (p->p_pgrp->pg_jobc == 0) {
1983 error = EIO;
1984 mutex_spin_exit(&tty_lock);
1985 goto out;
1986 }
1987 mutex_spin_exit(&tty_lock);
1988
1989 mutex_enter(proc_lock);
1990 pgsignal(p->p_pgrp, SIGTTOU, 1);
1991 mutex_exit(proc_lock);
1992
1993 mutex_spin_enter(&tty_lock);
1994 error = ttysleep(tp, &lbolt, true, 0);
1995 mutex_spin_exit(&tty_lock);
1996 if (error)
1997 goto out;
1998 goto loop;
1999 }
2000 mutex_spin_exit(&tty_lock);
2001
2002 /*
2003 * Process the user's data in at most OBUFSIZ chunks. Perform any
2004 * output translation. Keep track of high water mark, sleep on
2005 * overflow awaiting device aid in acquiring new space.
2006 */
2007 while (uio->uio_resid > 0 || cc > 0) {
2008 if (ISSET(tp->t_lflag, FLUSHO)) {
2009 uio->uio_resid = 0;
2010 return (0);
2011 }
2012 if (tp->t_outq.c_cc > hiwat)
2013 goto ovhiwat;
2014 /*
2015 * Grab a hunk of data from the user, unless we have some
2016 * leftover from last time.
2017 */
2018 if (cc == 0) {
2019 cc = min(uio->uio_resid, OBUFSIZ);
2020 cp = obuf;
2021 error = uiomove(cp, cc, uio);
2022 if (error) {
2023 cc = 0;
2024 goto out;
2025 }
2026 }
2027 /*
2028 * If nothing fancy need be done, grab those characters we
2029 * can handle without any of ttyoutput's processing and
2030 * just transfer them to the output q. For those chars
2031 * which require special processing (as indicated by the
2032 * bits in char_type), call ttyoutput. After processing
2033 * a hunk of data, look for FLUSHO so ^O's will take effect
2034 * immediately.
2035 */
2036 mutex_spin_enter(&tty_lock);
2037 while (cc > 0) {
2038 if (!ISSET(tp->t_oflag, OPOST))
2039 ce = cc;
2040 else {
2041 ce = cc - scanc((u_int)cc, cp, char_type,
2042 CCLASSMASK);
2043 /*
2044 * If ce is zero, then we're processing
2045 * a special character through ttyoutput.
2046 */
2047 if (ce == 0) {
2048 tp->t_rocount = 0;
2049 if (ttyoutput(*cp, tp) >= 0) {
2050 /* out of space */
2051 mutex_spin_exit(&tty_lock);
2052 goto overfull;
2053 }
2054 cp++;
2055 cc--;
2056 if (ISSET(tp->t_lflag, FLUSHO) ||
2057 tp->t_outq.c_cc > hiwat) {
2058 mutex_spin_exit(&tty_lock);
2059 goto ovhiwat;
2060 }
2061 continue;
2062 }
2063 }
2064 /*
2065 * A bunch of normal characters have been found.
2066 * Transfer them en masse to the output queue and
2067 * continue processing at the top of the loop.
2068 * If there are any further characters in this
2069 * <= OBUFSIZ chunk, the first should be a character
2070 * requiring special handling by ttyoutput.
2071 */
2072 tp->t_rocount = 0;
2073 i = b_to_q(cp, ce, &tp->t_outq);
2074 ce -= i;
2075 tp->t_column += ce;
2076 cp += ce, cc -= ce, tk_nout += ce;
2077 tp->t_outcc += ce;
2078 if (i > 0) {
2079 /* out of space */
2080 mutex_spin_exit(&tty_lock);
2081 goto overfull;
2082 }
2083 if (ISSET(tp->t_lflag, FLUSHO) ||
2084 tp->t_outq.c_cc > hiwat)
2085 break;
2086 }
2087 ttstart(tp);
2088 mutex_spin_exit(&tty_lock);
2089 }
2090
2091 out:
2092 /*
2093 * If cc is nonzero, we leave the uio structure inconsistent, as the
2094 * offset and iov pointers have moved forward, but it doesn't matter
2095 * (the call will either return short or restart with a new uio).
2096 */
2097 uio->uio_resid += cc;
2098 return (error);
2099
2100 overfull:
2101 /*
2102 * Since we are using ring buffers, if we can't insert any more into
2103 * the output queue, we can assume the ring is full and that someone
2104 * forgot to set the high water mark correctly. We set it and then
2105 * proceed as normal.
2106 */
2107 hiwat = tp->t_outq.c_cc - 1;
2108
2109 ovhiwat:
2110 mutex_spin_enter(&tty_lock);
2111 ttstart(tp);
2112 /*
2113 * This can only occur if FLUSHO is set in t_lflag,
2114 * or if ttstart/oproc is synchronous (or very fast).
2115 */
2116 if (tp->t_outq.c_cc <= hiwat) {
2117 mutex_spin_exit(&tty_lock);
2118 goto loop;
2119 }
2120 if (flag & IO_NDELAY) {
2121 mutex_spin_exit(&tty_lock);
2122 error = EWOULDBLOCK;
2123 goto out;
2124 }
2125 error = ttysleep(tp, &tp->t_outcv, true, 0);
2126 mutex_spin_exit(&tty_lock);
2127 if (error)
2128 goto out;
2129 goto loop;
2130 }
2131
2132 /*
2133 * Try to pull more output from the producer. Return non-zero if
2134 * there is output ready to be sent.
2135 */
2136 bool
2137 ttypull(struct tty *tp)
2138 {
2139
2140 /* XXXSMP not yet KASSERT(mutex_owned(&tty_lock)); */
2141
2142 if (tp->t_outq.c_cc <= tp->t_lowat) {
2143 cv_broadcast(&tp->t_outcv);
2144 selnotify(&tp->t_wsel, 0, NOTE_SUBMIT);
2145 }
2146 return tp->t_outq.c_cc != 0;
2147 }
2148
2149 /*
2150 * Rubout one character from the rawq of tp
2151 * as cleanly as possible.
2152 * Called with tty lock held.
2153 */
2154 void
2155 ttyrub(int c, struct tty *tp)
2156 {
2157 u_char *cp;
2158 int savecol, tabc;
2159
2160 KASSERT(mutex_owned(&tty_lock));
2161
2162 if (!ISSET(tp->t_lflag, ECHO) || ISSET(tp->t_lflag, EXTPROC))
2163 return;
2164 CLR(tp->t_lflag, FLUSHO);
2165 if (ISSET(tp->t_lflag, ECHOE)) {
2166 if (tp->t_rocount == 0) {
2167 /*
2168 * Screwed by ttwrite; retype
2169 */
2170 ttyretype(tp);
2171 return;
2172 }
2173 if (c == ('\t' | TTY_QUOTE) || c == ('\n' | TTY_QUOTE))
2174 ttyrubo(tp, 2);
2175 else {
2176 CLR(c, ~TTY_CHARMASK);
2177 switch (CCLASS(c)) {
2178 case ORDINARY:
2179 ttyrubo(tp, 1);
2180 break;
2181 case BACKSPACE:
2182 case CONTROL:
2183 case NEWLINE:
2184 case RETURN:
2185 case VTAB:
2186 if (ISSET(tp->t_lflag, ECHOCTL))
2187 ttyrubo(tp, 2);
2188 break;
2189 case TAB:
2190 if (tp->t_rocount < tp->t_rawq.c_cc) {
2191 ttyretype(tp);
2192 return;
2193 }
2194 savecol = tp->t_column;
2195 SET(tp->t_state, TS_CNTTB);
2196 SET(tp->t_lflag, FLUSHO);
2197 tp->t_column = tp->t_rocol;
2198 for (cp = firstc(&tp->t_rawq, &tabc); cp;
2199 cp = nextc(&tp->t_rawq, cp, &tabc))
2200 ttyecho(tabc, tp);
2201 CLR(tp->t_lflag, FLUSHO);
2202 CLR(tp->t_state, TS_CNTTB);
2203
2204 /* savecol will now be length of the tab. */
2205 savecol -= tp->t_column;
2206 tp->t_column += savecol;
2207 if (savecol > 8)
2208 savecol = 8; /* overflow screw */
2209 while (--savecol >= 0)
2210 (void)ttyoutput('\b', tp);
2211 break;
2212 default: /* XXX */
2213 (void)printf("ttyrub: would panic c = %d, "
2214 "val = %d\n", c, CCLASS(c));
2215 }
2216 }
2217 } else if (ISSET(tp->t_lflag, ECHOPRT)) {
2218 if (!ISSET(tp->t_state, TS_ERASE)) {
2219 SET(tp->t_state, TS_ERASE);
2220 (void)ttyoutput('\\', tp);
2221 }
2222 ttyecho(c, tp);
2223 } else
2224 ttyecho(tp->t_cc[VERASE], tp);
2225 --tp->t_rocount;
2226 }
2227
2228 /*
2229 * Back over cnt characters, erasing them.
2230 * Called with tty lock held.
2231 */
2232 static void
2233 ttyrubo(struct tty *tp, int cnt)
2234 {
2235
2236 KASSERT(mutex_owned(&tty_lock));
2237
2238 while (cnt-- > 0) {
2239 (void)ttyoutput('\b', tp);
2240 (void)ttyoutput(' ', tp);
2241 (void)ttyoutput('\b', tp);
2242 }
2243 }
2244
2245 /*
2246 * ttyretype --
2247 * Reprint the rawq line. Note, it is assumed that c_cc has already
2248 * been checked.
2249 *
2250 * Called with tty lock held.
2251 */
2252 void
2253 ttyretype(struct tty *tp)
2254 {
2255 u_char *cp;
2256 int c;
2257
2258 KASSERT(mutex_owned(&tty_lock));
2259
2260 /* Echo the reprint character. */
2261 if (tp->t_cc[VREPRINT] != _POSIX_VDISABLE)
2262 ttyecho(tp->t_cc[VREPRINT], tp);
2263
2264 (void)ttyoutput('\n', tp);
2265
2266 for (cp = firstc(&tp->t_canq, &c); cp; cp = nextc(&tp->t_canq, cp, &c))
2267 ttyecho(c, tp);
2268 for (cp = firstc(&tp->t_rawq, &c); cp; cp = nextc(&tp->t_rawq, cp, &c))
2269 ttyecho(c, tp);
2270 CLR(tp->t_state, TS_ERASE);
2271
2272 tp->t_rocount = tp->t_rawq.c_cc;
2273 tp->t_rocol = 0;
2274 }
2275
2276 /*
2277 * Echo a typed character to the terminal.
2278 * Called with tty lock held.
2279 */
2280 static void
2281 ttyecho(int c, struct tty *tp)
2282 {
2283
2284 KASSERT(mutex_owned(&tty_lock));
2285
2286 if (!ISSET(tp->t_state, TS_CNTTB))
2287 CLR(tp->t_lflag, FLUSHO);
2288 if ((!ISSET(tp->t_lflag, ECHO) &&
2289 (!ISSET(tp->t_lflag, ECHONL) || c != '\n')) ||
2290 ISSET(tp->t_lflag, EXTPROC))
2291 return;
2292 if (((ISSET(tp->t_lflag, ECHOCTL) &&
2293 (ISSET(c, TTY_CHARMASK) <= 037 && c != '\t' && c != '\n')) ||
2294 ISSET(c, TTY_CHARMASK) == 0177)) {
2295 (void)ttyoutput('^', tp);
2296 CLR(c, ~TTY_CHARMASK);
2297 if (c == 0177)
2298 c = '?';
2299 else
2300 c += 'A' - 1;
2301 }
2302 (void)ttyoutput(c, tp);
2303 }
2304
2305 /*
2306 * Wake up any readers on a tty.
2307 * Called with tty lock held.
2308 */
2309 void
2310 ttwakeup(struct tty *tp)
2311 {
2312
2313 KASSERT(mutex_owned(&tty_lock));
2314
2315 selnotify(&tp->t_rsel, 0, NOTE_SUBMIT);
2316 if (ISSET(tp->t_state, TS_ASYNC))
2317 ttysig(tp, TTYSIG_PG2, SIGIO);
2318 cv_broadcast(&tp->t_rawcv);
2319 }
2320
2321 /*
2322 * Look up a code for a specified speed in a conversion table;
2323 * used by drivers to map software speed values to hardware parameters.
2324 */
2325 int
2326 ttspeedtab(int speed, const struct speedtab *table)
2327 {
2328
2329 for (; table->sp_speed != -1; table++)
2330 if (table->sp_speed == speed)
2331 return (table->sp_code);
2332 return (-1);
2333 }
2334
2335 /*
2336 * Set tty hi and low water marks.
2337 *
2338 * Try to arrange the dynamics so there's about one second
2339 * from hi to low water.
2340 */
2341 void
2342 ttsetwater(struct tty *tp)
2343 {
2344 int cps, x;
2345
2346 /* XXX not yet KASSERT(mutex_owned(&tty_lock)); */
2347
2348 #define CLAMP(x, h, l) ((x) > h ? h : ((x) < l) ? l : (x))
2349
2350 cps = tp->t_ospeed / 10;
2351 tp->t_lowat = x = CLAMP(cps / 2, TTMAXLOWAT, TTMINLOWAT);
2352 x += cps;
2353 x = CLAMP(x, TTMAXHIWAT, TTMINHIWAT);
2354 tp->t_hiwat = roundup(x, CBSIZE);
2355 #undef CLAMP
2356 }
2357
2358 /*
2359 * Prepare report on state of foreground process group.
2360 * Call with proc_lock held.
2361 */
2362 void
2363 ttygetinfo(struct tty *tp, int fromsig, char *buf, size_t bufsz)
2364 {
2365 struct lwp *l;
2366 struct proc *p, *pick = NULL;
2367 struct timeval utime, stime;
2368 int tmp;
2369 fixpt_t pctcpu = 0;
2370 const char *msg;
2371 char lmsg[100];
2372 long rss;
2373
2374 KASSERT(mutex_owned(proc_lock));
2375
2376 *buf = '\0';
2377
2378 if (tp->t_session == NULL)
2379 msg = "not a controlling terminal\n";
2380 else if (tp->t_pgrp == NULL)
2381 msg = "no foreground process group\n";
2382 else if ((p = LIST_FIRST(&tp->t_pgrp->pg_members)) == NULL)
2383 msg = "empty foreground process group\n";
2384 else {
2385 /* Pick interesting process. */
2386 for (; p != NULL; p = LIST_NEXT(p, p_pglist)) {
2387 struct proc *oldpick;
2388
2389 if (pick == NULL) {
2390 pick = p;
2391 continue;
2392 }
2393 if (pick->p_lock < p->p_lock) {
2394 mutex_enter(pick->p_lock);
2395 mutex_enter(p->p_lock);
2396 } else if (pick->p_lock > p->p_lock) {
2397 mutex_enter(p->p_lock);
2398 mutex_enter(pick->p_lock);
2399 } else
2400 mutex_enter(p->p_lock);
2401 oldpick = pick;
2402 if (proc_compare(pick, p))
2403 pick = p;
2404 mutex_exit(p->p_lock);
2405 if (p->p_lock != oldpick->p_lock)
2406 mutex_exit(oldpick->p_lock);
2407 }
2408 if (fromsig &&
2409 (SIGACTION_PS(pick->p_sigacts, SIGINFO).sa_flags &
2410 SA_NOKERNINFO))
2411 return;
2412 msg = NULL;
2413 }
2414
2415 /* Print load average. */
2416 tmp = (averunnable.ldavg[0] * 100 + FSCALE / 2) >> FSHIFT;
2417 snprintf(lmsg, sizeof(lmsg), "load: %d.%02d ", tmp / 100, tmp % 100);
2418 strlcat(buf, lmsg, bufsz);
2419
2420 if (pick == NULL) {
2421 strlcat(buf, msg, bufsz);
2422 return;
2423 }
2424
2425 snprintf(lmsg, sizeof(lmsg), " cmd: %s %d [", pick->p_comm,
2426 pick->p_pid);
2427 strlcat(buf, lmsg, bufsz);
2428
2429 mutex_enter(pick->p_lock);
2430 LIST_FOREACH(l, &pick->p_lwps, l_sibling) {
2431 lwp_lock(l);
2432 snprintf(lmsg, sizeof(lmsg), "%s%s",
2433 l->l_stat == LSONPROC ? "running" :
2434 l->l_stat == LSRUN ? "runnable" :
2435 l->l_wchan ? l->l_wmesg : "iowait",
2436 (LIST_NEXT(l, l_sibling) != NULL) ? " " : "] ");
2437 lwp_unlock(l);
2438 strlcat(buf, lmsg, bufsz);
2439 pctcpu += l->l_pctcpu;
2440 }
2441 pctcpu += pick->p_pctcpu;
2442 calcru(pick, &utime, &stime, NULL, NULL);
2443 mutex_exit(pick->p_lock);
2444
2445 /* Round up and print user+system time, %CPU and RSS. */
2446 utime.tv_usec += 5000;
2447 if (utime.tv_usec >= 1000000) {
2448 utime.tv_sec += 1;
2449 utime.tv_usec -= 1000000;
2450 }
2451 stime.tv_usec += 5000;
2452 if (stime.tv_usec >= 1000000) {
2453 stime.tv_sec += 1;
2454 stime.tv_usec -= 1000000;
2455 }
2456 #define pgtok(a) (((u_long) ((a) * PAGE_SIZE) / 1024))
2457 tmp = (pctcpu * 10000 + FSCALE / 2) >> FSHIFT;
2458 if (pick->p_stat == SIDL || P_ZOMBIE(pick))
2459 rss = 0;
2460 else
2461 rss = pgtok(vm_resident_count(pick->p_vmspace));
2462
2463 snprintf(lmsg, sizeof(lmsg), "%ld.%02ldu %ld.%02lds %d%% %ldk",
2464 (long)utime.tv_sec, (long)utime.tv_usec / 10000,
2465 (long)stime.tv_sec, (long)stime.tv_usec / 10000,
2466 tmp / 100, rss);
2467 strlcat(buf, lmsg, bufsz);
2468 }
2469
2470 /*
2471 * Print report on state of foreground process group.
2472 * Call with tty_lock held.
2473 */
2474 void
2475 ttyputinfo(struct tty *tp, char *buf)
2476 {
2477
2478 KASSERT(mutex_owned(&tty_lock));
2479
2480 if (ttycheckoutq_wlock(tp, 0) == 0)
2481 return;
2482 ttyprintf_nolock(tp, "%s\n", buf);
2483 tp->t_rocount = 0; /* so pending input will be retyped if BS */
2484 }
2485
2486 /*
2487 * Returns 1 if p2 is "better" than p1
2488 *
2489 * The algorithm for picking the "interesting" process is thus:
2490 *
2491 * 1) Only foreground processes are eligible - implied.
2492 * 2) Runnable processes are favored over anything else. The runner
2493 * with the highest CPU utilization is picked (l_pctcpu). Ties are
2494 * broken by picking the highest pid.
2495 * 3) The sleeper with the shortest sleep time is next. With ties,
2496 * we pick out just "short-term" sleepers (P_SINTR == 0).
2497 * 4) Further ties are broken by picking the highest pid.
2498 */
2499 #define ISRUN(p) ((p)->p_nrlwps > 0)
2500 #define TESTAB(a, b) ((a)<<1 | (b))
2501 #define ONLYA 2
2502 #define ONLYB 1
2503 #define BOTH 3
2504
2505 static int
2506 proc_compare(struct proc *p1, struct proc *p2)
2507 {
2508 lwp_t *l1, *l2;
2509
2510 KASSERT(mutex_owned(p1->p_lock));
2511 KASSERT(mutex_owned(p2->p_lock));
2512
2513 if ((l1 = LIST_FIRST(&p1->p_lwps)) == NULL)
2514 return (1);
2515 if ((l2 = LIST_FIRST(&p2->p_lwps)) == NULL)
2516 return (0);
2517 /*
2518 * see if at least one of them is runnable
2519 */
2520 switch (TESTAB(ISRUN(p1), ISRUN(p2))) {
2521 case ONLYA:
2522 return (0);
2523 case ONLYB:
2524 return (1);
2525 case BOTH:
2526 /*
2527 * tie - favor one with highest recent CPU utilization
2528 */
2529 if (l2->l_pctcpu > l1->l_pctcpu)
2530 return (1);
2531 return (p2->p_pid > p1->p_pid); /* tie - return highest pid */
2532 }
2533 /*
2534 * weed out zombies
2535 */
2536 switch (TESTAB(P_ZOMBIE(p1), P_ZOMBIE(p2))) {
2537 case ONLYA:
2538 return (1);
2539 case ONLYB:
2540 return (0);
2541 case BOTH:
2542 return (p2->p_pid > p1->p_pid); /* tie - return highest pid */
2543 }
2544 /*
2545 * pick the one with the smallest sleep time
2546 */
2547 if (l2->l_slptime > l2->l_slptime)
2548 return (0);
2549 if (l2->l_slptime > l2->l_slptime)
2550 return (1);
2551 /*
2552 * favor one sleeping in a non-interruptible sleep
2553 */
2554 if (l2->l_flag & LW_SINTR && (l2->l_flag & LW_SINTR) == 0)
2555 return (1);
2556 if (l2->l_flag & LW_SINTR && (l2->l_flag & LW_SINTR) == 0)
2557 return (0);
2558 return (p2->p_pid > p1->p_pid); /* tie - return highest pid */
2559 }
2560
2561 /*
2562 * Output char to tty; console putchar style.
2563 * Can be called with tty lock held through kprintf() machinery..
2564 */
2565 int
2566 tputchar(int c, int flags, struct tty *tp)
2567 {
2568 int r = 0;
2569
2570 if ((flags & NOLOCK) == 0)
2571 mutex_spin_enter(&tty_lock);
2572 if (!CONNECTED(tp)) {
2573 r = -1;
2574 goto out;
2575 }
2576 if (c == '\n')
2577 (void)ttyoutput('\r', tp);
2578 (void)ttyoutput(c, tp);
2579 ttstart(tp);
2580 out:
2581 if ((flags & NOLOCK) == 0)
2582 mutex_spin_exit(&tty_lock);
2583 return (r);
2584 }
2585
2586 /*
2587 * Sleep on chan, returning ERESTART if tty changed while we napped and
2588 * returning any errors (e.g. EINTR/ETIMEDOUT) reported by cv_timedwait(_sig).
2589 * If the tty is revoked, restarting a pending call will redo validation done
2590 * at the start of the call.
2591 *
2592 * Must be called with the tty lock held.
2593 */
2594 int
2595 ttysleep(struct tty *tp, kcondvar_t *cv, bool catch, int timo)
2596 {
2597 int error;
2598 short gen;
2599
2600 KASSERT(mutex_owned(&tty_lock));
2601
2602 gen = tp->t_gen;
2603 if (catch)
2604 error = cv_timedwait_sig(cv, &tty_lock, timo);
2605 else
2606 error = cv_timedwait(cv, &tty_lock, timo);
2607 if (error != 0)
2608 return (error);
2609 return (tp->t_gen == gen ? 0 : ERESTART);
2610 }
2611
2612 /*
2613 * Attach a tty to the tty list.
2614 *
2615 * This should be called ONLY once per real tty (including pty's).
2616 * eg, on the sparc, the keyboard and mouse have struct tty's that are
2617 * distinctly NOT usable as tty's, and thus should not be attached to
2618 * the ttylist. This is why this call is not done from ttymalloc().
2619 *
2620 * Device drivers should attach tty's at a similar time that they are
2621 * ttymalloc()'ed, or, for the case of statically allocated struct tty's
2622 * either in the attach or (first) open routine.
2623 */
2624 void
2625 tty_attach(struct tty *tp)
2626 {
2627
2628 mutex_spin_enter(&tty_lock);
2629 TAILQ_INSERT_TAIL(&ttylist, tp, tty_link);
2630 ++tty_count;
2631 mutex_spin_exit(&tty_lock);
2632 }
2633
2634 /*
2635 * Remove a tty from the tty list.
2636 */
2637 void
2638 tty_detach(struct tty *tp)
2639 {
2640
2641 mutex_spin_enter(&tty_lock);
2642 --tty_count;
2643 #ifdef DIAGNOSTIC
2644 if (tty_count < 0)
2645 panic("tty_detach: tty_count < 0");
2646 #endif
2647 TAILQ_REMOVE(&ttylist, tp, tty_link);
2648 mutex_spin_exit(&tty_lock);
2649 }
2650
2651 /*
2652 * Allocate a tty structure and its associated buffers.
2653 */
2654 struct tty *
2655 ttymalloc(void)
2656 {
2657 struct tty *tp;
2658 int i;
2659
2660 tp = kmem_zalloc(sizeof(*tp), KM_SLEEP);
2661 callout_init(&tp->t_rstrt_ch, 0);
2662 callout_setfunc(&tp->t_rstrt_ch, ttrstrt, tp);
2663 /* XXX: default to 1024 chars for now */
2664 clalloc(&tp->t_rawq, 1024, 1);
2665 cv_init(&tp->t_rawcv, "ttyraw");
2666 cv_init(&tp->t_rawcvf, "ttyrawf");
2667 clalloc(&tp->t_canq, 1024, 1);
2668 cv_init(&tp->t_cancv, "ttycan");
2669 cv_init(&tp->t_cancvf, "ttycanf");
2670 /* output queue doesn't need quoting */
2671 clalloc(&tp->t_outq, 1024, 0);
2672 cv_init(&tp->t_outcv, "ttyout");
2673 cv_init(&tp->t_outcvf, "ttyoutf");
2674 /* Set default line discipline. */
2675 tp->t_linesw = ttyldisc_default();
2676 selinit(&tp->t_rsel);
2677 selinit(&tp->t_wsel);
2678 for (i = 0; i < TTYSIG_COUNT; i++)
2679 sigemptyset(&tp->t_sigs[i]);
2680 return (tp);
2681 }
2682
2683 /*
2684 * Free a tty structure and its buffers.
2685 *
2686 * Be sure to call tty_detach() for any tty that has been
2687 * tty_attach()ed.
2688 */
2689 void
2690 ttyfree(struct tty *tp)
2691 {
2692 int i;
2693
2694 mutex_enter(proc_lock);
2695 mutex_enter(&tty_lock);
2696 for (i = 0; i < TTYSIG_COUNT; i++)
2697 sigemptyset(&tp->t_sigs[i]);
2698 if (tp->t_sigcount != 0)
2699 TAILQ_REMOVE(&tty_sigqueue, tp, t_sigqueue);
2700 mutex_exit(&tty_lock);
2701 mutex_exit(proc_lock);
2702
2703 callout_halt(&tp->t_rstrt_ch, NULL);
2704 callout_destroy(&tp->t_rstrt_ch);
2705 ttyldisc_release(tp->t_linesw);
2706 clfree(&tp->t_rawq);
2707 clfree(&tp->t_canq);
2708 clfree(&tp->t_outq);
2709 cv_destroy(&tp->t_rawcv);
2710 cv_destroy(&tp->t_rawcvf);
2711 cv_destroy(&tp->t_cancv);
2712 cv_destroy(&tp->t_cancvf);
2713 cv_destroy(&tp->t_outcv);
2714 cv_destroy(&tp->t_outcvf);
2715 seldestroy(&tp->t_rsel);
2716 seldestroy(&tp->t_wsel);
2717 kmem_free(tp, sizeof(*tp));
2718 }
2719
2720 /*
2721 * ttyprintf_nolock: send a message to a specific tty, without locking.
2722 *
2723 * => should be used only by tty driver or anything that knows the
2724 * underlying tty will not be revoked(2)'d away. [otherwise,
2725 * use tprintf]
2726 */
2727 static void
2728 ttyprintf_nolock(struct tty *tp, const char *fmt, ...)
2729 {
2730 va_list ap;
2731
2732 /* No mutex needed; going to process TTY. */
2733 va_start(ap, fmt);
2734 kprintf(fmt, TOTTY|NOLOCK, tp, NULL, ap);
2735 va_end(ap);
2736 }
2737
2738 static int
2739 tty_listener_cb(kauth_cred_t cred, kauth_action_t action, void *cookie,
2740 void *arg0, void *arg1, void *arg2, void *arg3)
2741 {
2742 struct tty *tty;
2743 int result;
2744
2745 result = KAUTH_RESULT_DEFER;
2746
2747 if (action != KAUTH_DEVICE_TTY_OPEN)
2748 return result;
2749
2750 tty = arg0;
2751
2752 /* If it's not opened, we allow. */
2753 if ((tty->t_state & TS_ISOPEN) == 0)
2754 result = KAUTH_RESULT_ALLOW;
2755 else {
2756 /*
2757 * If it's opened, we can only allow if it's not exclusively
2758 * opened; otherwise, that's a privileged operation and we
2759 * let the secmodel handle it.
2760 */
2761 if ((tty->t_state & TS_XCLUDE) == 0)
2762 result = KAUTH_RESULT_ALLOW;
2763 }
2764
2765 return result;
2766 }
2767
2768 /*
2769 * Initialize the tty subsystem.
2770 */
2771 void
2772 tty_init(void)
2773 {
2774
2775 mutex_init(&tty_lock, MUTEX_DEFAULT, IPL_VM);
2776 rw_init(&ttcompat_lock);
2777 tty_sigsih = softint_establish(SOFTINT_CLOCK, ttysigintr, NULL);
2778 KASSERT(tty_sigsih != NULL);
2779
2780 tty_listener = kauth_listen_scope(KAUTH_SCOPE_DEVICE,
2781 tty_listener_cb, NULL);
2782
2783 sysctl_kern_tkstat_setup();
2784 }
2785
2786 /*
2787 * Send a signal from a tty to its process group or session leader.
2788 * Handoff to the target is deferred to a soft interrupt.
2789 */
2790 void
2791 ttysig(struct tty *tp, enum ttysigtype st, int sig)
2792 {
2793 sigset_t *sp;
2794
2795 /* XXXSMP not yet KASSERT(mutex_owned(&tty_lock)); */
2796
2797 sp = &tp->t_sigs[st];
2798 if (sigismember(sp, sig))
2799 return;
2800 sigaddset(sp, sig);
2801 if (tp->t_sigcount++ == 0)
2802 TAILQ_INSERT_TAIL(&tty_sigqueue, tp, t_sigqueue);
2803 softint_schedule(tty_sigsih);
2804 }
2805
2806 /*
2807 * Deliver deferred signals from ttys. Note that the process groups
2808 * and sessions associated with the ttys may have changed from when
2809 * the signal was originally sent, but in practice it should not matter.
2810 * For signals produced as a result of a syscall, the soft interrupt
2811 * will fire before the syscall returns to the user.
2812 */
2813 static void
2814 ttysigintr(void *cookie)
2815 {
2816 struct tty *tp;
2817 enum ttysigtype st;
2818 struct pgrp *pgrp;
2819 struct session *sess;
2820 int sig, lflag;
2821 char infobuf[200];
2822
2823 mutex_enter(proc_lock);
2824 mutex_spin_enter(&tty_lock);
2825 while ((tp = TAILQ_FIRST(&tty_sigqueue)) != NULL) {
2826 KASSERT(tp->t_sigcount > 0);
2827 for (st = 0; st < TTYSIG_COUNT; st++) {
2828 if ((sig = firstsig(&tp->t_sigs[st])) != 0)
2829 break;
2830 }
2831 KASSERT(st < TTYSIG_COUNT);
2832 sigdelset(&tp->t_sigs[st], sig);
2833 if (--tp->t_sigcount == 0)
2834 TAILQ_REMOVE(&tty_sigqueue, tp, t_sigqueue);
2835 pgrp = tp->t_pgrp;
2836 sess = tp->t_session;
2837 lflag = tp->t_lflag;
2838 if (sig == SIGINFO) {
2839 if (ISSET(tp->t_state, TS_SIGINFO)) {
2840 /* Via ioctl: ignore tty option. */
2841 tp->t_state &= ~TS_SIGINFO;
2842 lflag |= ISIG;
2843 }
2844 if (!ISSET(lflag, NOKERNINFO)) {
2845 mutex_spin_exit(&tty_lock);
2846 ttygetinfo(tp, 1, infobuf, sizeof(infobuf));
2847 mutex_spin_enter(&tty_lock);
2848 ttyputinfo(tp, infobuf);
2849 }
2850 if (!ISSET(lflag, ISIG))
2851 continue;
2852 }
2853 mutex_spin_exit(&tty_lock);
2854 KASSERT(sig != 0);
2855 switch (st) {
2856 case TTYSIG_PG1:
2857 if (pgrp != NULL)
2858 pgsignal(pgrp, sig, 1);
2859 break;
2860 case TTYSIG_PG2:
2861 if (pgrp != NULL)
2862 pgsignal(pgrp, sig, sess != NULL);
2863 break;
2864 case TTYSIG_LEADER:
2865 if (sess != NULL && sess->s_leader != NULL)
2866 psignal(sess->s_leader, sig);
2867 break;
2868 default:
2869 /* NOTREACHED */
2870 break;
2871 }
2872 mutex_spin_enter(&tty_lock);
2873 }
2874 mutex_spin_exit(&tty_lock);
2875 mutex_exit(proc_lock);
2876 }
2877