tty.c revision 1.221.2.6 1 /* $NetBSD: tty.c,v 1.221.2.6 2010/10/09 03:32:32 yamt 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.221.2.6 2010/10/09 03:32:32 yamt 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 nameidata nd;
838 char infobuf[200];
839
840 /* If the ioctl involves modification, hang if in the background. */
841 switch (cmd) {
842 case TIOCFLUSH:
843 case TIOCDRAIN:
844 case TIOCSBRK:
845 case TIOCCBRK:
846 case TIOCSTART:
847 case TIOCSETA:
848 case TIOCSETD:
849 case TIOCSLINED:
850 case TIOCSETAF:
851 case TIOCSETAW:
852 #ifdef notdef
853 case TIOCSPGRP:
854 case FIOSETOWN:
855 #endif
856 case TIOCSTAT:
857 case TIOCSTI:
858 case TIOCSWINSZ:
859 case TIOCLBIC:
860 case TIOCLBIS:
861 case TIOCLSET:
862 case TIOCSETC:
863 case OTIOCSETD:
864 case TIOCSETN:
865 case TIOCSETP:
866 case TIOCSLTC:
867 mutex_spin_enter(&tty_lock);
868 while (isbackground(curproc, tp) &&
869 p->p_pgrp->pg_jobc && (p->p_lflag & PL_PPWAIT) == 0 &&
870 !sigismasked(l, SIGTTOU)) {
871 mutex_spin_exit(&tty_lock);
872
873 mutex_enter(proc_lock);
874 pgsignal(p->p_pgrp, SIGTTOU, 1);
875 mutex_exit(proc_lock);
876
877 mutex_spin_enter(&tty_lock);
878 error = ttysleep(tp, &lbolt, true, 0);
879 if (error) {
880 mutex_spin_exit(&tty_lock);
881 return (error);
882 }
883 }
884 mutex_spin_exit(&tty_lock);
885 break;
886 }
887
888 switch (cmd) { /* Process the ioctl. */
889 case FIOASYNC: /* set/clear async i/o */
890 mutex_spin_enter(&tty_lock);
891 if (*(int *)data)
892 SET(tp->t_state, TS_ASYNC);
893 else
894 CLR(tp->t_state, TS_ASYNC);
895 mutex_spin_exit(&tty_lock);
896 break;
897 case FIONBIO: /* set/clear non-blocking i/o */
898 break; /* XXX: delete. */
899 case FIONREAD: /* get # bytes to read */
900 mutex_spin_enter(&tty_lock);
901 *(int *)data = ttnread(tp);
902 mutex_spin_exit(&tty_lock);
903 break;
904 case FIONWRITE: /* get # bytes to written & unsent */
905 mutex_spin_enter(&tty_lock);
906 *(int *)data = tp->t_outq.c_cc;
907 mutex_spin_exit(&tty_lock);
908 break;
909 case FIONSPACE: /* get # bytes to written & unsent */
910 mutex_spin_enter(&tty_lock);
911 *(int *)data = tp->t_outq.c_cn - tp->t_outq.c_cc;
912 mutex_spin_exit(&tty_lock);
913 break;
914 case TIOCEXCL: /* set exclusive use of tty */
915 mutex_spin_enter(&tty_lock);
916 SET(tp->t_state, TS_XCLUDE);
917 mutex_spin_exit(&tty_lock);
918 break;
919 case TIOCFLUSH: { /* flush buffers */
920 int flags = *(int *)data;
921
922 if (flags == 0)
923 flags = FREAD | FWRITE;
924 else
925 flags &= FREAD | FWRITE;
926 mutex_spin_enter(&tty_lock);
927 ttyflush(tp, flags);
928 mutex_spin_exit(&tty_lock);
929 break;
930 }
931 case TIOCCONS: /* become virtual console */
932 if (*(int *)data) {
933 if (constty && constty != tp &&
934 ISSET(constty->t_state, TS_CARR_ON | TS_ISOPEN) ==
935 (TS_CARR_ON | TS_ISOPEN))
936 return EBUSY;
937
938 NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_SYSSPACE,
939 "/dev/console");
940 if ((error = namei(&nd)) != 0)
941 return error;
942 error = VOP_ACCESS(nd.ni_vp, VREAD, l->l_cred);
943 vput(nd.ni_vp);
944 if (error)
945 return error;
946
947 constty = tp;
948 } else if (tp == constty)
949 constty = NULL;
950 break;
951 case TIOCDRAIN: /* wait till output drained */
952 if ((error = ttywait(tp)) != 0)
953 return (error);
954 break;
955 case TIOCGETA: { /* get termios struct */
956 struct termios *t = (struct termios *)data;
957
958 memcpy(t, &tp->t_termios, sizeof(struct termios));
959 break;
960 }
961 case TIOCGETD: /* get line discipline (old) */
962 *(int *)data = tp->t_linesw->l_no;
963 break;
964 case TIOCGLINED: /* get line discipline (new) */
965 (void)strncpy((char *)data, tp->t_linesw->l_name,
966 TTLINEDNAMELEN - 1);
967 break;
968 case TIOCGWINSZ: /* get window size */
969 *(struct winsize *)data = tp->t_winsize;
970 break;
971 case FIOGETOWN:
972 mutex_enter(proc_lock);
973 if (tp->t_session != NULL && !isctty(p, tp)) {
974 mutex_exit(proc_lock);
975 return (ENOTTY);
976 }
977 *(int *)data = tp->t_pgrp ? -tp->t_pgrp->pg_id : 0;
978 mutex_exit(proc_lock);
979 break;
980 case TIOCGPGRP: /* get pgrp of tty */
981 mutex_enter(proc_lock);
982 if (!isctty(p, tp)) {
983 mutex_exit(proc_lock);
984 return (ENOTTY);
985 }
986 *(int *)data = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PGID;
987 mutex_exit(proc_lock);
988 break;
989 case TIOCGSID: /* get sid of tty */
990 mutex_enter(proc_lock);
991 if (!isctty(p, tp)) {
992 mutex_exit(proc_lock);
993 return (ENOTTY);
994 }
995 *(int *)data = tp->t_session->s_sid;
996 mutex_exit(proc_lock);
997 break;
998 #ifdef TIOCHPCL
999 case TIOCHPCL: /* hang up on last close */
1000 mutex_spin_enter(&tty_lock);
1001 SET(tp->t_cflag, HUPCL);
1002 mutex_spin_exit(&tty_lock);
1003 break;
1004 #endif
1005 case TIOCNXCL: /* reset exclusive use of tty */
1006 mutex_spin_enter(&tty_lock);
1007 CLR(tp->t_state, TS_XCLUDE);
1008 mutex_spin_exit(&tty_lock);
1009 break;
1010 case TIOCOUTQ: /* output queue size */
1011 *(int *)data = tp->t_outq.c_cc;
1012 break;
1013 case TIOCSETA: /* set termios struct */
1014 case TIOCSETAW: /* drain output, set */
1015 case TIOCSETAF: { /* drn out, fls in, set */
1016 struct termios *t = (struct termios *)data;
1017
1018 if (cmd == TIOCSETAW || cmd == TIOCSETAF) {
1019 if ((error = ttywait(tp)) != 0)
1020 return (error);
1021
1022 if (cmd == TIOCSETAF) {
1023 mutex_spin_enter(&tty_lock);
1024 ttyflush(tp, FREAD);
1025 mutex_spin_exit(&tty_lock);
1026 }
1027 }
1028
1029 s = spltty();
1030 /*
1031 * XXXSMP - some drivers call back on us from t_param(), so
1032 * don't take the tty spin lock here.
1033 * require t_param() to unlock upon callback?
1034 */
1035 /* wanted here: mutex_spin_enter(&tty_lock); */
1036 if (!ISSET(t->c_cflag, CIGNORE)) {
1037 /*
1038 * Set device hardware.
1039 */
1040 if (tp->t_param && (error = (*tp->t_param)(tp, t))) {
1041 /* wanted here: mutex_spin_exit(&tty_lock); */
1042 splx(s);
1043 return (error);
1044 } else {
1045 tp->t_cflag = t->c_cflag;
1046 tp->t_ispeed = t->c_ispeed;
1047 tp->t_ospeed = t->c_ospeed;
1048 if (t->c_ospeed == 0)
1049 ttysig(tp, TTYSIG_LEADER, SIGHUP);
1050 }
1051 ttsetwater(tp);
1052 }
1053
1054 /* delayed lock acquiring */
1055 mutex_spin_enter(&tty_lock);
1056 if (cmd != TIOCSETAF) {
1057 if (ISSET(t->c_lflag, ICANON) !=
1058 ISSET(tp->t_lflag, ICANON)) {
1059 if (ISSET(t->c_lflag, ICANON)) {
1060 SET(tp->t_lflag, PENDIN);
1061 ttwakeup(tp);
1062 } else {
1063 struct clist tq;
1064
1065 catq(&tp->t_rawq, &tp->t_canq);
1066 tq = tp->t_rawq;
1067 tp->t_rawq = tp->t_canq;
1068 tp->t_canq = tq;
1069 CLR(tp->t_lflag, PENDIN);
1070 }
1071 }
1072 }
1073 tp->t_iflag = t->c_iflag;
1074 tp->t_oflag = t->c_oflag;
1075 /*
1076 * Make the EXTPROC bit read only.
1077 */
1078 if (ISSET(tp->t_lflag, EXTPROC))
1079 SET(t->c_lflag, EXTPROC);
1080 else
1081 CLR(t->c_lflag, EXTPROC);
1082 tp->t_lflag = t->c_lflag | ISSET(tp->t_lflag, PENDIN);
1083 memcpy(tp->t_cc, t->c_cc, sizeof(t->c_cc));
1084 mutex_spin_exit(&tty_lock);
1085 splx(s);
1086 break;
1087 }
1088 case TIOCSETD: /* set line discipline (old) */
1089 lp = ttyldisc_lookup_bynum(*(int *)data);
1090 goto setldisc;
1091
1092 case TIOCSLINED: { /* set line discipline (new) */
1093 char *name = (char *)data;
1094 dev_t device;
1095
1096 /* Null terminate to prevent buffer overflow */
1097 name[TTLINEDNAMELEN - 1] = '\0';
1098 lp = ttyldisc_lookup(name);
1099 setldisc:
1100 if (lp == NULL)
1101 return (ENXIO);
1102
1103 if (lp != tp->t_linesw) {
1104 device = tp->t_dev;
1105 s = spltty();
1106 (*tp->t_linesw->l_close)(tp, flag);
1107 error = (*lp->l_open)(device, tp);
1108 if (error) {
1109 (void)(*tp->t_linesw->l_open)(device, tp);
1110 splx(s);
1111 ttyldisc_release(lp);
1112 return (error);
1113 }
1114 ttyldisc_release(tp->t_linesw);
1115 tp->t_linesw = lp;
1116 splx(s);
1117 } else {
1118 /* Drop extra reference. */
1119 ttyldisc_release(lp);
1120 }
1121 break;
1122 }
1123 case TIOCSTART: /* start output, like ^Q */
1124 mutex_spin_enter(&tty_lock);
1125 if (ISSET(tp->t_state, TS_TTSTOP) ||
1126 ISSET(tp->t_lflag, FLUSHO)) {
1127 CLR(tp->t_lflag, FLUSHO);
1128 CLR(tp->t_state, TS_TTSTOP);
1129 ttstart(tp);
1130 }
1131 mutex_spin_exit(&tty_lock);
1132 break;
1133 case TIOCSTI: /* simulate terminal input */
1134 if (kauth_authorize_device_tty(l->l_cred, KAUTH_DEVICE_TTY_STI,
1135 tp) != 0) {
1136 if (!ISSET(flag, FREAD))
1137 return (EPERM);
1138 if (!isctty(p, tp))
1139 return (EACCES);
1140 }
1141 (*tp->t_linesw->l_rint)(*(u_char *)data, tp);
1142 break;
1143 case TIOCSTOP: /* stop output, like ^S */
1144 {
1145 mutex_spin_enter(&tty_lock);
1146 if (!ISSET(tp->t_state, TS_TTSTOP)) {
1147 SET(tp->t_state, TS_TTSTOP);
1148 cdev_stop(tp, 0);
1149 }
1150 mutex_spin_exit(&tty_lock);
1151 break;
1152 }
1153 case TIOCSCTTY: /* become controlling tty */
1154 mutex_enter(proc_lock);
1155 mutex_spin_enter(&tty_lock);
1156
1157 /* Session ctty vnode pointer set in vnode layer. */
1158 if (!SESS_LEADER(p) ||
1159 ((p->p_session->s_ttyvp || tp->t_session) &&
1160 (tp->t_session != p->p_session))) {
1161 mutex_spin_exit(&tty_lock);
1162 mutex_exit(proc_lock);
1163 return (EPERM);
1164 }
1165
1166 /*
1167 * `p_session' acquires a reference.
1168 * But note that if `t_session' is set at this point,
1169 * it must equal `p_session', in which case the session
1170 * already has the correct reference count.
1171 */
1172 if (tp->t_session == NULL) {
1173 proc_sesshold(p->p_session);
1174 }
1175 tp->t_session = p->p_session;
1176 tp->t_pgrp = p->p_pgrp;
1177 p->p_session->s_ttyp = tp;
1178 p->p_lflag |= PL_CONTROLT;
1179 mutex_spin_exit(&tty_lock);
1180 mutex_exit(proc_lock);
1181 break;
1182 case FIOSETOWN: { /* set pgrp of tty */
1183 pid_t pgid = *(int *)data;
1184 struct pgrp *pgrp;
1185
1186 mutex_enter(proc_lock);
1187 if (tp->t_session != NULL && !isctty(p, tp)) {
1188 mutex_exit(proc_lock);
1189 return (ENOTTY);
1190 }
1191
1192 if (pgid < 0) {
1193 pgrp = pgrp_find(-pgid);
1194 if (pgrp == NULL) {
1195 mutex_exit(proc_lock);
1196 return (EINVAL);
1197 }
1198 } else {
1199 struct proc *p1;
1200 p1 = proc_find(pgid);
1201 if (!p1) {
1202 mutex_exit(proc_lock);
1203 return (ESRCH);
1204 }
1205 pgrp = p1->p_pgrp;
1206 }
1207
1208 if (pgrp->pg_session != p->p_session) {
1209 mutex_exit(proc_lock);
1210 return (EPERM);
1211 }
1212 mutex_spin_enter(&tty_lock);
1213 tp->t_pgrp = pgrp;
1214 mutex_spin_exit(&tty_lock);
1215 mutex_exit(proc_lock);
1216 break;
1217 }
1218 case TIOCSPGRP: { /* set pgrp of tty */
1219 struct pgrp *pgrp;
1220
1221 mutex_enter(proc_lock);
1222 if (!isctty(p, tp)) {
1223 mutex_exit(proc_lock);
1224 return (ENOTTY);
1225 }
1226 pgrp = pgrp_find(*(pid_t *)data);
1227 if (pgrp == NULL) {
1228 mutex_exit(proc_lock);
1229 return (EINVAL);
1230 }
1231 if (pgrp->pg_session != p->p_session) {
1232 mutex_exit(proc_lock);
1233 return (EPERM);
1234 }
1235 mutex_spin_enter(&tty_lock);
1236 tp->t_pgrp = pgrp;
1237 mutex_spin_exit(&tty_lock);
1238 mutex_exit(proc_lock);
1239 break;
1240 }
1241 case TIOCSTAT: /* get load avg stats */
1242 mutex_enter(proc_lock);
1243 ttygetinfo(tp, 0, infobuf, sizeof(infobuf));
1244 mutex_exit(proc_lock);
1245
1246 mutex_spin_enter(&tty_lock);
1247 ttyputinfo(tp, infobuf);
1248 mutex_spin_exit(&tty_lock);
1249 break;
1250 case TIOCSWINSZ: /* set window size */
1251 mutex_spin_enter(&tty_lock);
1252 if (memcmp((void *)&tp->t_winsize, data,
1253 sizeof(struct winsize))) {
1254 tp->t_winsize = *(struct winsize *)data;
1255 ttysig(tp, TTYSIG_PG1, SIGWINCH);
1256 }
1257 mutex_spin_exit(&tty_lock);
1258 break;
1259 default:
1260 /* We may have to load the compat module for this. */
1261 for (;;) {
1262 rw_enter(&ttcompat_lock, RW_READER);
1263 if (ttcompatvec != NULL) {
1264 break;
1265 }
1266 rw_exit(&ttcompat_lock);
1267 (void)module_autoload("compat", MODULE_CLASS_ANY);
1268 if (ttcompatvec == NULL) {
1269 return EPASSTHROUGH;
1270 }
1271 }
1272 error = (*ttcompatvec)(tp, cmd, data, flag, l);
1273 rw_exit(&ttcompat_lock);
1274 return error;
1275 }
1276 return (0);
1277 }
1278
1279 int
1280 ttpoll(struct tty *tp, int events, struct lwp *l)
1281 {
1282 int revents;
1283
1284 revents = 0;
1285 mutex_spin_enter(&tty_lock);
1286 if (events & (POLLIN | POLLRDNORM))
1287 if (ttnread(tp) > 0)
1288 revents |= events & (POLLIN | POLLRDNORM);
1289
1290 if (events & (POLLOUT | POLLWRNORM))
1291 if (tp->t_outq.c_cc <= tp->t_lowat)
1292 revents |= events & (POLLOUT | POLLWRNORM);
1293
1294 if (events & POLLHUP)
1295 if (!CONNECTED(tp))
1296 revents |= POLLHUP;
1297
1298 if (revents == 0) {
1299 if (events & (POLLIN | POLLHUP | POLLRDNORM))
1300 selrecord(l, &tp->t_rsel);
1301
1302 if (events & (POLLOUT | POLLWRNORM))
1303 selrecord(l, &tp->t_wsel);
1304 }
1305
1306 mutex_spin_exit(&tty_lock);
1307
1308 return (revents);
1309 }
1310
1311 static void
1312 filt_ttyrdetach(struct knote *kn)
1313 {
1314 struct tty *tp;
1315
1316 tp = kn->kn_hook;
1317 mutex_spin_enter(&tty_lock);
1318 SLIST_REMOVE(&tp->t_rsel.sel_klist, kn, knote, kn_selnext);
1319 mutex_spin_exit(&tty_lock);
1320 }
1321
1322 static int
1323 filt_ttyread(struct knote *kn, long hint)
1324 {
1325 struct tty *tp;
1326
1327 tp = kn->kn_hook;
1328 if ((hint & NOTE_SUBMIT) == 0)
1329 mutex_spin_enter(&tty_lock);
1330 kn->kn_data = ttnread(tp);
1331 if ((hint & NOTE_SUBMIT) == 0)
1332 mutex_spin_exit(&tty_lock);
1333 return (kn->kn_data > 0);
1334 }
1335
1336 static void
1337 filt_ttywdetach(struct knote *kn)
1338 {
1339 struct tty *tp;
1340
1341 tp = kn->kn_hook;
1342 mutex_spin_enter(&tty_lock);
1343 SLIST_REMOVE(&tp->t_wsel.sel_klist, kn, knote, kn_selnext);
1344 mutex_spin_exit(&tty_lock);
1345 }
1346
1347 static int
1348 filt_ttywrite(struct knote *kn, long hint)
1349 {
1350 struct tty *tp;
1351 int canwrite;
1352
1353 tp = kn->kn_hook;
1354 if ((hint & NOTE_SUBMIT) == 0)
1355 mutex_spin_enter(&tty_lock);
1356 kn->kn_data = tp->t_outq.c_cn - tp->t_outq.c_cc;
1357 canwrite = (tp->t_outq.c_cc <= tp->t_lowat) && CONNECTED(tp);
1358 if ((hint & NOTE_SUBMIT) == 0)
1359 mutex_spin_exit(&tty_lock);
1360 return (canwrite);
1361 }
1362
1363 static const struct filterops ttyread_filtops =
1364 { 1, NULL, filt_ttyrdetach, filt_ttyread };
1365 static const struct filterops ttywrite_filtops =
1366 { 1, NULL, filt_ttywdetach, filt_ttywrite };
1367
1368 int
1369 ttykqfilter(dev_t dev, struct knote *kn)
1370 {
1371 struct tty *tp;
1372 struct klist *klist;
1373
1374 if ((tp = cdev_tty(dev)) == NULL)
1375 return (ENXIO);
1376
1377 switch (kn->kn_filter) {
1378 case EVFILT_READ:
1379 klist = &tp->t_rsel.sel_klist;
1380 kn->kn_fop = &ttyread_filtops;
1381 break;
1382 case EVFILT_WRITE:
1383 klist = &tp->t_wsel.sel_klist;
1384 kn->kn_fop = &ttywrite_filtops;
1385 break;
1386 default:
1387 return EINVAL;
1388 }
1389
1390 kn->kn_hook = tp;
1391
1392 mutex_spin_enter(&tty_lock);
1393 SLIST_INSERT_HEAD(klist, kn, kn_selnext);
1394 mutex_spin_exit(&tty_lock);
1395
1396 return (0);
1397 }
1398
1399 /*
1400 * Find the number of chars ready to be read from this tty.
1401 * Call with the tty lock held.
1402 */
1403 static int
1404 ttnread(struct tty *tp)
1405 {
1406 int nread;
1407
1408 KASSERT(mutex_owned(&tty_lock));
1409
1410 if (ISSET(tp->t_lflag, PENDIN))
1411 ttypend(tp);
1412 nread = tp->t_canq.c_cc;
1413 if (!ISSET(tp->t_lflag, ICANON)) {
1414 nread += tp->t_rawq.c_cc;
1415 if (nread < tp->t_cc[VMIN] && !tp->t_cc[VTIME])
1416 nread = 0;
1417 }
1418 return (nread);
1419 }
1420
1421 /*
1422 * Wait for output to drain.
1423 */
1424 int
1425 ttywait(struct tty *tp)
1426 {
1427 int error;
1428
1429 error = 0;
1430
1431 mutex_spin_enter(&tty_lock);
1432 while ((tp->t_outq.c_cc || ISSET(tp->t_state, TS_BUSY)) &&
1433 CONNECTED(tp) && tp->t_oproc) {
1434 (*tp->t_oproc)(tp);
1435 error = ttysleep(tp, &tp->t_outcv, true, 0);
1436 if (error)
1437 break;
1438 }
1439 mutex_spin_exit(&tty_lock);
1440
1441 return (error);
1442 }
1443
1444 /*
1445 * Flush if successfully wait.
1446 */
1447 int
1448 ttywflush(struct tty *tp)
1449 {
1450 int error;
1451
1452 if ((error = ttywait(tp)) == 0) {
1453 mutex_spin_enter(&tty_lock);
1454 ttyflush(tp, FREAD);
1455 mutex_spin_exit(&tty_lock);
1456 }
1457 return (error);
1458 }
1459
1460 /*
1461 * Flush tty read and/or write queues, notifying anyone waiting.
1462 * Call with the tty lock held.
1463 */
1464 void
1465 ttyflush(struct tty *tp, int rw)
1466 {
1467
1468 KASSERT(mutex_owned(&tty_lock));
1469
1470 if (rw & FREAD) {
1471 FLUSHQ(&tp->t_canq);
1472 FLUSHQ(&tp->t_rawq);
1473 tp->t_rocount = 0;
1474 tp->t_rocol = 0;
1475 CLR(tp->t_state, TS_LOCAL);
1476 ttwakeup(tp);
1477 }
1478 if (rw & FWRITE) {
1479 CLR(tp->t_state, TS_TTSTOP);
1480 cdev_stop(tp, rw);
1481 FLUSHQ(&tp->t_outq);
1482 cv_broadcast(&tp->t_outcv);
1483 selnotify(&tp->t_wsel, 0, NOTE_SUBMIT);
1484 }
1485 }
1486
1487 /*
1488 * Copy in the default termios characters.
1489 */
1490 void
1491 ttychars(struct tty *tp)
1492 {
1493
1494 memcpy(tp->t_cc, ttydefchars, sizeof(ttydefchars));
1495 }
1496
1497 /*
1498 * Send stop character on input overflow.
1499 * Call with the tty lock held.
1500 */
1501 static void
1502 ttyblock(struct tty *tp)
1503 {
1504 int total;
1505
1506 KASSERT(mutex_owned(&tty_lock));
1507
1508 total = tp->t_rawq.c_cc + tp->t_canq.c_cc;
1509 if (tp->t_rawq.c_cc > TTYHOG) {
1510 ttyflush(tp, FREAD | FWRITE);
1511 CLR(tp->t_state, TS_TBLOCK);
1512 }
1513 /*
1514 * Block further input iff: current input > threshold
1515 * AND input is available to user program.
1516 */
1517 if (total >= TTYHOG / 2 &&
1518 !ISSET(tp->t_state, TS_TBLOCK) &&
1519 (!ISSET(tp->t_lflag, ICANON) || tp->t_canq.c_cc > 0)) {
1520 if (ISSET(tp->t_iflag, IXOFF) &&
1521 tp->t_cc[VSTOP] != _POSIX_VDISABLE &&
1522 putc(tp->t_cc[VSTOP], &tp->t_outq) == 0) {
1523 SET(tp->t_state, TS_TBLOCK);
1524 ttstart(tp);
1525 }
1526 /* Try to block remote output via hardware flow control. */
1527 if (ISSET(tp->t_cflag, CHWFLOW) && tp->t_hwiflow &&
1528 (*tp->t_hwiflow)(tp, 1) != 0)
1529 SET(tp->t_state, TS_TBLOCK);
1530 }
1531 }
1532
1533 /*
1534 * Delayed line discipline output
1535 */
1536 void
1537 ttrstrt(void *tp_arg)
1538 {
1539 struct tty *tp;
1540
1541 #ifdef DIAGNOSTIC
1542 if (tp_arg == NULL)
1543 panic("ttrstrt");
1544 #endif
1545 tp = tp_arg;
1546 mutex_spin_enter(&tty_lock);
1547
1548 CLR(tp->t_state, TS_TIMEOUT);
1549 ttstart(tp); /* XXX - Shouldn't this be tp->l_start(tp)? */
1550
1551 mutex_spin_exit(&tty_lock);
1552 }
1553
1554 /*
1555 * start a line discipline
1556 * Always call with tty lock held?
1557 */
1558 int
1559 ttstart(struct tty *tp)
1560 {
1561
1562 if (tp->t_oproc != NULL) /* XXX: Kludge for pty. */
1563 (*tp->t_oproc)(tp);
1564 return (0);
1565 }
1566
1567 /*
1568 * "close" a line discipline
1569 */
1570 int
1571 ttylclose(struct tty *tp, int flag)
1572 {
1573
1574 if (flag & FNONBLOCK) {
1575 mutex_spin_enter(&tty_lock);
1576 ttyflush(tp, FREAD | FWRITE);
1577 mutex_spin_exit(&tty_lock);
1578 } else
1579 ttywflush(tp);
1580 return (0);
1581 }
1582
1583 /*
1584 * Handle modem control transition on a tty.
1585 * Flag indicates new state of carrier.
1586 * Returns 0 if the line should be turned off, otherwise 1.
1587 */
1588 int
1589 ttymodem(struct tty *tp, int flag)
1590 {
1591
1592 mutex_spin_enter(&tty_lock);
1593 if (flag == 0) {
1594 if (ISSET(tp->t_state, TS_CARR_ON)) {
1595 /*
1596 * Lost carrier.
1597 */
1598 CLR(tp->t_state, TS_CARR_ON);
1599 if (ISSET(tp->t_state, TS_ISOPEN) && !CONNECTED(tp)) {
1600 ttysig(tp, TTYSIG_LEADER, SIGHUP);
1601 ttyflush(tp, FREAD | FWRITE);
1602 mutex_spin_exit(&tty_lock);
1603 return (0);
1604 }
1605 }
1606 } else {
1607 if (!ISSET(tp->t_state, TS_CARR_ON)) {
1608 /*
1609 * Carrier now on.
1610 */
1611 SET(tp->t_state, TS_CARR_ON);
1612 ttwakeup(tp);
1613 }
1614 }
1615 mutex_spin_exit(&tty_lock);
1616
1617 return (1);
1618 }
1619
1620 /*
1621 * Default modem control routine (for other line disciplines).
1622 * Return argument flag, to turn off device on carrier drop.
1623 */
1624 int
1625 nullmodem(struct tty *tp, int flag)
1626 {
1627
1628 mutex_spin_enter(&tty_lock);
1629 if (flag)
1630 SET(tp->t_state, TS_CARR_ON);
1631 else {
1632 CLR(tp->t_state, TS_CARR_ON);
1633 if (!CONNECTED(tp)) {
1634 ttysig(tp, TTYSIG_LEADER, SIGHUP);
1635 mutex_spin_exit(&tty_lock);
1636 return (0);
1637 }
1638 }
1639 mutex_spin_exit(&tty_lock);
1640
1641 return (1);
1642 }
1643
1644 /*
1645 * Reinput pending characters after state switch.
1646 */
1647 void
1648 ttypend(struct tty *tp)
1649 {
1650 struct clist tq;
1651 int c;
1652
1653 KASSERT(mutex_owned(&tty_lock));
1654
1655 CLR(tp->t_lflag, PENDIN);
1656 SET(tp->t_state, TS_TYPEN);
1657 tq = tp->t_rawq;
1658 tp->t_rawq.c_cc = 0;
1659 tp->t_rawq.c_cf = tp->t_rawq.c_cl = 0;
1660 while ((c = getc(&tq)) >= 0)
1661 ttyinput_wlock(c, tp);
1662 CLR(tp->t_state, TS_TYPEN);
1663 }
1664
1665 /*
1666 * Process a read call on a tty device.
1667 */
1668 int
1669 ttread(struct tty *tp, struct uio *uio, int flag)
1670 {
1671 struct clist *qp;
1672 u_char *cc;
1673 struct proc *p;
1674 int c, first, error, has_stime, last_cc;
1675 long lflag, slp;
1676 struct timeval now, stime;
1677
1678 if (uio->uio_resid == 0)
1679 return 0;
1680
1681 stime.tv_usec = 0; /* XXX gcc */
1682 stime.tv_sec = 0; /* XXX gcc */
1683
1684 cc = tp->t_cc;
1685 p = curproc;
1686 error = 0;
1687 has_stime = 0;
1688 last_cc = 0;
1689 slp = 0;
1690
1691 loop:
1692 mutex_spin_enter(&tty_lock);
1693 lflag = tp->t_lflag;
1694 /*
1695 * take pending input first
1696 */
1697 if (ISSET(lflag, PENDIN))
1698 ttypend(tp);
1699
1700 /*
1701 * Hang process if it's in the background.
1702 */
1703 if (isbackground(p, tp)) {
1704 if (sigismasked(curlwp, SIGTTIN) ||
1705 p->p_lflag & PL_PPWAIT || p->p_pgrp->pg_jobc == 0) {
1706 mutex_spin_exit(&tty_lock);
1707 return (EIO);
1708 }
1709 mutex_spin_exit(&tty_lock);
1710
1711 mutex_enter(proc_lock);
1712 pgsignal(p->p_pgrp, SIGTTIN, 1);
1713 mutex_exit(proc_lock);
1714
1715 mutex_spin_enter(&tty_lock);
1716 error = ttysleep(tp, &lbolt, true, 0);
1717 mutex_spin_exit(&tty_lock);
1718 if (error)
1719 return (error);
1720 goto loop;
1721 }
1722
1723 if (!ISSET(lflag, ICANON)) {
1724 int m = cc[VMIN];
1725 long t = cc[VTIME];
1726
1727 qp = &tp->t_rawq;
1728 /*
1729 * Check each of the four combinations.
1730 * (m > 0 && t == 0) is the normal read case.
1731 * It should be fairly efficient, so we check that and its
1732 * companion case (m == 0 && t == 0) first.
1733 * For the other two cases, we compute the target sleep time
1734 * into slp.
1735 */
1736 if (t == 0) {
1737 if (qp->c_cc < m)
1738 goto sleep;
1739 goto read;
1740 }
1741 t *= hz; /* time in deca-ticks */
1742 /*
1743 * Time difference in deca-ticks, split division to avoid numeric overflow.
1744 * Ok for hz < ~200kHz
1745 */
1746 #define diff(t1, t2) (((t1).tv_sec - (t2).tv_sec) * 10 * hz + \
1747 ((t1).tv_usec - (t2).tv_usec) / 100 * hz / 1000)
1748 if (m > 0) {
1749 if (qp->c_cc <= 0)
1750 goto sleep;
1751 if (qp->c_cc >= m)
1752 goto read;
1753 if (!has_stime) {
1754 /* first character, start timer */
1755 has_stime = 1;
1756 getmicrotime(&stime);
1757 slp = t;
1758 } else if (qp->c_cc > last_cc) {
1759 /* got a character, restart timer */
1760 getmicrotime(&stime);
1761 slp = t;
1762 } else {
1763 /* nothing, check expiration */
1764 getmicrotime(&now);
1765 slp = t - diff(now, stime);
1766 }
1767 } else { /* m == 0 */
1768 if (qp->c_cc > 0)
1769 goto read;
1770 if (!has_stime) {
1771 has_stime = 1;
1772 getmicrotime(&stime);
1773 slp = t;
1774 } else {
1775 getmicrotime(&now);
1776 slp = t - diff(now, stime);
1777 }
1778 }
1779 last_cc = qp->c_cc;
1780 #undef diff
1781 if (slp > 0) {
1782 /*
1783 * Convert deca-ticks back to ticks.
1784 * Rounding down may make us wake up just short
1785 * of the target, so we round up.
1786 * Maybe we should do 'slp/10 + 1' because the
1787 * first tick maybe almost immediate.
1788 * However it is more useful for a program that sets
1789 * VTIME=10 to wakeup every second not every 1.01
1790 * seconds (if hz=100).
1791 */
1792 slp = (slp + 9)/ 10;
1793 goto sleep;
1794 }
1795 } else if ((qp = &tp->t_canq)->c_cc <= 0) {
1796 int carrier;
1797
1798 sleep:
1799 /*
1800 * If there is no input, sleep on rawq
1801 * awaiting hardware receipt and notification.
1802 * If we have data, we don't need to check for carrier.
1803 */
1804 carrier = CONNECTED(tp);
1805 if (!carrier && ISSET(tp->t_state, TS_ISOPEN)) {
1806 mutex_spin_exit(&tty_lock);
1807 return (0); /* EOF */
1808 }
1809 if (!has_stime || slp <= 0) {
1810 if (flag & IO_NDELAY) {
1811 mutex_spin_exit(&tty_lock);
1812 return (EWOULDBLOCK);
1813 }
1814 }
1815 error = ttysleep(tp, &tp->t_rawcv, true, slp);
1816 mutex_spin_exit(&tty_lock);
1817 /* VMIN == 0: any quantity read satisfies */
1818 if (cc[VMIN] == 0 && error == EWOULDBLOCK)
1819 return (0);
1820 if (error && error != EWOULDBLOCK)
1821 return (error);
1822 goto loop;
1823 }
1824 read:
1825 mutex_spin_exit(&tty_lock);
1826
1827 /*
1828 * Input present, check for input mapping and processing.
1829 */
1830 first = 1;
1831 while ((c = getc(qp)) >= 0) {
1832 /*
1833 * delayed suspend (^Y)
1834 */
1835 if (CCEQ(cc[VDSUSP], c) &&
1836 ISSET(lflag, IEXTEN|ISIG) == (IEXTEN|ISIG)) {
1837 mutex_spin_enter(&tty_lock);
1838 ttysig(tp, TTYSIG_PG1, SIGTSTP);
1839 if (first) {
1840 error = ttysleep(tp, &lbolt, true, 0);
1841 mutex_spin_exit(&tty_lock);
1842 if (error)
1843 break;
1844 goto loop;
1845 } else
1846 mutex_spin_exit(&tty_lock);
1847 break;
1848 }
1849 /*
1850 * Interpret EOF only in canonical mode.
1851 */
1852 if (CCEQ(cc[VEOF], c) && ISSET(lflag, ICANON))
1853 break;
1854 /*
1855 * Give user character.
1856 */
1857 error = ureadc(c, uio);
1858 if (error)
1859 break;
1860 if (uio->uio_resid == 0)
1861 break;
1862 /*
1863 * In canonical mode check for a "break character"
1864 * marking the end of a "line of input".
1865 */
1866 if (ISSET(lflag, ICANON) && TTBREAKC(c, lflag))
1867 break;
1868 first = 0;
1869 }
1870 /*
1871 * Look to unblock output now that (presumably)
1872 * the input queue has gone down.
1873 */
1874 mutex_spin_enter(&tty_lock);
1875 if (ISSET(tp->t_state, TS_TBLOCK) && tp->t_rawq.c_cc < TTYHOG / 5) {
1876 if (ISSET(tp->t_iflag, IXOFF) &&
1877 cc[VSTART] != _POSIX_VDISABLE &&
1878 putc(cc[VSTART], &tp->t_outq) == 0) {
1879 CLR(tp->t_state, TS_TBLOCK);
1880 ttstart(tp);
1881 }
1882 /* Try to unblock remote output via hardware flow control. */
1883 if (ISSET(tp->t_cflag, CHWFLOW) && tp->t_hwiflow &&
1884 (*tp->t_hwiflow)(tp, 0) != 0)
1885 CLR(tp->t_state, TS_TBLOCK);
1886 }
1887 mutex_spin_exit(&tty_lock);
1888
1889 return (error);
1890 }
1891
1892 /*
1893 * Check the output queue on tp for space for a kernel message (from uprintf
1894 * or tprintf). Allow some space over the normal hiwater mark so we don't
1895 * lose messages due to normal flow control, but don't let the tty run amok.
1896 * Sleeps here are not interruptible, but we return prematurely if new signals
1897 * arrive.
1898 * Call with tty lock held.
1899 */
1900 static int
1901 ttycheckoutq_wlock(struct tty *tp, int wait)
1902 {
1903 int hiwat, error;
1904
1905 KASSERT(mutex_owned(&tty_lock));
1906
1907 hiwat = tp->t_hiwat;
1908 if (tp->t_outq.c_cc > hiwat + 200)
1909 while (tp->t_outq.c_cc > hiwat) {
1910 ttstart(tp);
1911 if (wait == 0)
1912 return (0);
1913 error = ttysleep(tp, &tp->t_outcv, true, hz);
1914 if (error == EINTR)
1915 wait = 0;
1916 }
1917
1918 return (1);
1919 }
1920
1921 int
1922 ttycheckoutq(struct tty *tp, int wait)
1923 {
1924 int r;
1925
1926 mutex_spin_enter(&tty_lock);
1927 r = ttycheckoutq_wlock(tp, wait);
1928 mutex_spin_exit(&tty_lock);
1929
1930 return (r);
1931 }
1932
1933 /*
1934 * Process a write call on a tty device.
1935 */
1936 int
1937 ttwrite(struct tty *tp, struct uio *uio, int flag)
1938 {
1939 u_char *cp;
1940 struct proc *p;
1941 int cc, ce, i, hiwat, error;
1942 u_char obuf[OBUFSIZ];
1943
1944 cp = NULL;
1945 hiwat = tp->t_hiwat;
1946 error = 0;
1947 cc = 0;
1948 loop:
1949 mutex_spin_enter(&tty_lock);
1950 if (!CONNECTED(tp)) {
1951 if (ISSET(tp->t_state, TS_ISOPEN)) {
1952 mutex_spin_exit(&tty_lock);
1953 return (EIO);
1954 } else if (flag & IO_NDELAY) {
1955 mutex_spin_exit(&tty_lock);
1956 error = EWOULDBLOCK;
1957 goto out;
1958 } else {
1959 /* Sleep awaiting carrier. */
1960 error = ttysleep(tp, &tp->t_rawcv, true, 0);
1961 mutex_spin_exit(&tty_lock);
1962 if (error)
1963 goto out;
1964 goto loop;
1965 }
1966 }
1967
1968 /*
1969 * Hang the process if it's in the background.
1970 */
1971 p = curproc;
1972 if (isbackground(p, tp) &&
1973 ISSET(tp->t_lflag, TOSTOP) && (p->p_lflag & PL_PPWAIT) == 0 &&
1974 !sigismasked(curlwp, SIGTTOU)) {
1975 if (p->p_pgrp->pg_jobc == 0) {
1976 error = EIO;
1977 mutex_spin_exit(&tty_lock);
1978 goto out;
1979 }
1980 mutex_spin_exit(&tty_lock);
1981
1982 mutex_enter(proc_lock);
1983 pgsignal(p->p_pgrp, SIGTTOU, 1);
1984 mutex_exit(proc_lock);
1985
1986 mutex_spin_enter(&tty_lock);
1987 error = ttysleep(tp, &lbolt, true, 0);
1988 mutex_spin_exit(&tty_lock);
1989 if (error)
1990 goto out;
1991 goto loop;
1992 }
1993 mutex_spin_exit(&tty_lock);
1994
1995 /*
1996 * Process the user's data in at most OBUFSIZ chunks. Perform any
1997 * output translation. Keep track of high water mark, sleep on
1998 * overflow awaiting device aid in acquiring new space.
1999 */
2000 while (uio->uio_resid > 0 || cc > 0) {
2001 if (ISSET(tp->t_lflag, FLUSHO)) {
2002 uio->uio_resid = 0;
2003 return (0);
2004 }
2005 if (tp->t_outq.c_cc > hiwat)
2006 goto ovhiwat;
2007 /*
2008 * Grab a hunk of data from the user, unless we have some
2009 * leftover from last time.
2010 */
2011 if (cc == 0) {
2012 cc = min(uio->uio_resid, OBUFSIZ);
2013 cp = obuf;
2014 error = uiomove(cp, cc, uio);
2015 if (error) {
2016 cc = 0;
2017 goto out;
2018 }
2019 }
2020 /*
2021 * If nothing fancy need be done, grab those characters we
2022 * can handle without any of ttyoutput's processing and
2023 * just transfer them to the output q. For those chars
2024 * which require special processing (as indicated by the
2025 * bits in char_type), call ttyoutput. After processing
2026 * a hunk of data, look for FLUSHO so ^O's will take effect
2027 * immediately.
2028 */
2029 mutex_spin_enter(&tty_lock);
2030 while (cc > 0) {
2031 if (!ISSET(tp->t_oflag, OPOST))
2032 ce = cc;
2033 else {
2034 ce = cc - scanc((u_int)cc, cp, char_type,
2035 CCLASSMASK);
2036 /*
2037 * If ce is zero, then we're processing
2038 * a special character through ttyoutput.
2039 */
2040 if (ce == 0) {
2041 tp->t_rocount = 0;
2042 if (ttyoutput(*cp, tp) >= 0) {
2043 /* out of space */
2044 mutex_spin_exit(&tty_lock);
2045 goto overfull;
2046 }
2047 cp++;
2048 cc--;
2049 if (ISSET(tp->t_lflag, FLUSHO) ||
2050 tp->t_outq.c_cc > hiwat) {
2051 mutex_spin_exit(&tty_lock);
2052 goto ovhiwat;
2053 }
2054 continue;
2055 }
2056 }
2057 /*
2058 * A bunch of normal characters have been found.
2059 * Transfer them en masse to the output queue and
2060 * continue processing at the top of the loop.
2061 * If there are any further characters in this
2062 * <= OBUFSIZ chunk, the first should be a character
2063 * requiring special handling by ttyoutput.
2064 */
2065 tp->t_rocount = 0;
2066 i = b_to_q(cp, ce, &tp->t_outq);
2067 ce -= i;
2068 tp->t_column += ce;
2069 cp += ce, cc -= ce, tk_nout += ce;
2070 tp->t_outcc += ce;
2071 if (i > 0) {
2072 /* out of space */
2073 mutex_spin_exit(&tty_lock);
2074 goto overfull;
2075 }
2076 if (ISSET(tp->t_lflag, FLUSHO) ||
2077 tp->t_outq.c_cc > hiwat)
2078 break;
2079 }
2080 ttstart(tp);
2081 mutex_spin_exit(&tty_lock);
2082 }
2083
2084 out:
2085 /*
2086 * If cc is nonzero, we leave the uio structure inconsistent, as the
2087 * offset and iov pointers have moved forward, but it doesn't matter
2088 * (the call will either return short or restart with a new uio).
2089 */
2090 uio->uio_resid += cc;
2091 return (error);
2092
2093 overfull:
2094 /*
2095 * Since we are using ring buffers, if we can't insert any more into
2096 * the output queue, we can assume the ring is full and that someone
2097 * forgot to set the high water mark correctly. We set it and then
2098 * proceed as normal.
2099 */
2100 hiwat = tp->t_outq.c_cc - 1;
2101
2102 ovhiwat:
2103 mutex_spin_enter(&tty_lock);
2104 ttstart(tp);
2105 /*
2106 * This can only occur if FLUSHO is set in t_lflag,
2107 * or if ttstart/oproc is synchronous (or very fast).
2108 */
2109 if (tp->t_outq.c_cc <= hiwat) {
2110 mutex_spin_exit(&tty_lock);
2111 goto loop;
2112 }
2113 if (flag & IO_NDELAY) {
2114 mutex_spin_exit(&tty_lock);
2115 error = EWOULDBLOCK;
2116 goto out;
2117 }
2118 error = ttysleep(tp, &tp->t_outcv, true, 0);
2119 mutex_spin_exit(&tty_lock);
2120 if (error)
2121 goto out;
2122 goto loop;
2123 }
2124
2125 /*
2126 * Try to pull more output from the producer. Return non-zero if
2127 * there is output ready to be sent.
2128 */
2129 bool
2130 ttypull(struct tty *tp)
2131 {
2132
2133 /* XXXSMP not yet KASSERT(mutex_owned(&tty_lock)); */
2134
2135 if (tp->t_outq.c_cc <= tp->t_lowat) {
2136 cv_broadcast(&tp->t_outcv);
2137 selnotify(&tp->t_wsel, 0, NOTE_SUBMIT);
2138 }
2139 return tp->t_outq.c_cc != 0;
2140 }
2141
2142 /*
2143 * Rubout one character from the rawq of tp
2144 * as cleanly as possible.
2145 * Called with tty lock held.
2146 */
2147 void
2148 ttyrub(int c, struct tty *tp)
2149 {
2150 u_char *cp;
2151 int savecol, tabc;
2152
2153 KASSERT(mutex_owned(&tty_lock));
2154
2155 if (!ISSET(tp->t_lflag, ECHO) || ISSET(tp->t_lflag, EXTPROC))
2156 return;
2157 CLR(tp->t_lflag, FLUSHO);
2158 if (ISSET(tp->t_lflag, ECHOE)) {
2159 if (tp->t_rocount == 0) {
2160 /*
2161 * Screwed by ttwrite; retype
2162 */
2163 ttyretype(tp);
2164 return;
2165 }
2166 if (c == ('\t' | TTY_QUOTE) || c == ('\n' | TTY_QUOTE))
2167 ttyrubo(tp, 2);
2168 else {
2169 CLR(c, ~TTY_CHARMASK);
2170 switch (CCLASS(c)) {
2171 case ORDINARY:
2172 ttyrubo(tp, 1);
2173 break;
2174 case BACKSPACE:
2175 case CONTROL:
2176 case NEWLINE:
2177 case RETURN:
2178 case VTAB:
2179 if (ISSET(tp->t_lflag, ECHOCTL))
2180 ttyrubo(tp, 2);
2181 break;
2182 case TAB:
2183 if (tp->t_rocount < tp->t_rawq.c_cc) {
2184 ttyretype(tp);
2185 return;
2186 }
2187 savecol = tp->t_column;
2188 SET(tp->t_state, TS_CNTTB);
2189 SET(tp->t_lflag, FLUSHO);
2190 tp->t_column = tp->t_rocol;
2191 for (cp = firstc(&tp->t_rawq, &tabc); cp;
2192 cp = nextc(&tp->t_rawq, cp, &tabc))
2193 ttyecho(tabc, tp);
2194 CLR(tp->t_lflag, FLUSHO);
2195 CLR(tp->t_state, TS_CNTTB);
2196
2197 /* savecol will now be length of the tab. */
2198 savecol -= tp->t_column;
2199 tp->t_column += savecol;
2200 if (savecol > 8)
2201 savecol = 8; /* overflow screw */
2202 while (--savecol >= 0)
2203 (void)ttyoutput('\b', tp);
2204 break;
2205 default: /* XXX */
2206 (void)printf("ttyrub: would panic c = %d, "
2207 "val = %d\n", c, CCLASS(c));
2208 }
2209 }
2210 } else if (ISSET(tp->t_lflag, ECHOPRT)) {
2211 if (!ISSET(tp->t_state, TS_ERASE)) {
2212 SET(tp->t_state, TS_ERASE);
2213 (void)ttyoutput('\\', tp);
2214 }
2215 ttyecho(c, tp);
2216 } else
2217 ttyecho(tp->t_cc[VERASE], tp);
2218 --tp->t_rocount;
2219 }
2220
2221 /*
2222 * Back over cnt characters, erasing them.
2223 * Called with tty lock held.
2224 */
2225 static void
2226 ttyrubo(struct tty *tp, int cnt)
2227 {
2228
2229 KASSERT(mutex_owned(&tty_lock));
2230
2231 while (cnt-- > 0) {
2232 (void)ttyoutput('\b', tp);
2233 (void)ttyoutput(' ', tp);
2234 (void)ttyoutput('\b', tp);
2235 }
2236 }
2237
2238 /*
2239 * ttyretype --
2240 * Reprint the rawq line. Note, it is assumed that c_cc has already
2241 * been checked.
2242 *
2243 * Called with tty lock held.
2244 */
2245 void
2246 ttyretype(struct tty *tp)
2247 {
2248 u_char *cp;
2249 int c;
2250
2251 KASSERT(mutex_owned(&tty_lock));
2252
2253 /* Echo the reprint character. */
2254 if (tp->t_cc[VREPRINT] != _POSIX_VDISABLE)
2255 ttyecho(tp->t_cc[VREPRINT], tp);
2256
2257 (void)ttyoutput('\n', tp);
2258
2259 for (cp = firstc(&tp->t_canq, &c); cp; cp = nextc(&tp->t_canq, cp, &c))
2260 ttyecho(c, tp);
2261 for (cp = firstc(&tp->t_rawq, &c); cp; cp = nextc(&tp->t_rawq, cp, &c))
2262 ttyecho(c, tp);
2263 CLR(tp->t_state, TS_ERASE);
2264
2265 tp->t_rocount = tp->t_rawq.c_cc;
2266 tp->t_rocol = 0;
2267 }
2268
2269 /*
2270 * Echo a typed character to the terminal.
2271 * Called with tty lock held.
2272 */
2273 static void
2274 ttyecho(int c, struct tty *tp)
2275 {
2276
2277 KASSERT(mutex_owned(&tty_lock));
2278
2279 if (!ISSET(tp->t_state, TS_CNTTB))
2280 CLR(tp->t_lflag, FLUSHO);
2281 if ((!ISSET(tp->t_lflag, ECHO) &&
2282 (!ISSET(tp->t_lflag, ECHONL) || c != '\n')) ||
2283 ISSET(tp->t_lflag, EXTPROC))
2284 return;
2285 if (((ISSET(tp->t_lflag, ECHOCTL) &&
2286 (ISSET(c, TTY_CHARMASK) <= 037 && c != '\t' && c != '\n')) ||
2287 ISSET(c, TTY_CHARMASK) == 0177)) {
2288 (void)ttyoutput('^', tp);
2289 CLR(c, ~TTY_CHARMASK);
2290 if (c == 0177)
2291 c = '?';
2292 else
2293 c += 'A' - 1;
2294 }
2295 (void)ttyoutput(c, tp);
2296 }
2297
2298 /*
2299 * Wake up any readers on a tty.
2300 * Called with tty lock held.
2301 */
2302 void
2303 ttwakeup(struct tty *tp)
2304 {
2305
2306 KASSERT(mutex_owned(&tty_lock));
2307
2308 selnotify(&tp->t_rsel, 0, NOTE_SUBMIT);
2309 if (ISSET(tp->t_state, TS_ASYNC))
2310 ttysig(tp, TTYSIG_PG2, SIGIO);
2311 cv_broadcast(&tp->t_rawcv);
2312 }
2313
2314 /*
2315 * Look up a code for a specified speed in a conversion table;
2316 * used by drivers to map software speed values to hardware parameters.
2317 */
2318 int
2319 ttspeedtab(int speed, const struct speedtab *table)
2320 {
2321
2322 for (; table->sp_speed != -1; table++)
2323 if (table->sp_speed == speed)
2324 return (table->sp_code);
2325 return (-1);
2326 }
2327
2328 /*
2329 * Set tty hi and low water marks.
2330 *
2331 * Try to arrange the dynamics so there's about one second
2332 * from hi to low water.
2333 */
2334 void
2335 ttsetwater(struct tty *tp)
2336 {
2337 int cps, x;
2338
2339 /* XXX not yet KASSERT(mutex_owned(&tty_lock)); */
2340
2341 #define CLAMP(x, h, l) ((x) > h ? h : ((x) < l) ? l : (x))
2342
2343 cps = tp->t_ospeed / 10;
2344 tp->t_lowat = x = CLAMP(cps / 2, TTMAXLOWAT, TTMINLOWAT);
2345 x += cps;
2346 x = CLAMP(x, TTMAXHIWAT, TTMINHIWAT);
2347 tp->t_hiwat = roundup(x, CBSIZE);
2348 #undef CLAMP
2349 }
2350
2351 /*
2352 * Prepare report on state of foreground process group.
2353 * Call with proc_lock held.
2354 */
2355 void
2356 ttygetinfo(struct tty *tp, int fromsig, char *buf, size_t bufsz)
2357 {
2358 struct lwp *l;
2359 struct proc *p, *pick = NULL;
2360 struct timeval utime, stime;
2361 int tmp;
2362 fixpt_t pctcpu = 0;
2363 const char *msg;
2364 char lmsg[100];
2365 long rss;
2366
2367 KASSERT(mutex_owned(proc_lock));
2368
2369 *buf = '\0';
2370
2371 if (tp->t_session == NULL)
2372 msg = "not a controlling terminal\n";
2373 else if (tp->t_pgrp == NULL)
2374 msg = "no foreground process group\n";
2375 else if ((p = LIST_FIRST(&tp->t_pgrp->pg_members)) == NULL)
2376 msg = "empty foreground process group\n";
2377 else {
2378 /* Pick interesting process. */
2379 for (; p != NULL; p = LIST_NEXT(p, p_pglist)) {
2380 struct proc *oldpick;
2381
2382 if (pick == NULL) {
2383 pick = p;
2384 continue;
2385 }
2386 if (pick->p_lock < p->p_lock) {
2387 mutex_enter(pick->p_lock);
2388 mutex_enter(p->p_lock);
2389 } else if (pick->p_lock > p->p_lock) {
2390 mutex_enter(p->p_lock);
2391 mutex_enter(pick->p_lock);
2392 } else
2393 mutex_enter(p->p_lock);
2394 oldpick = pick;
2395 if (proc_compare(pick, p))
2396 pick = p;
2397 mutex_exit(p->p_lock);
2398 if (p->p_lock != oldpick->p_lock)
2399 mutex_exit(oldpick->p_lock);
2400 }
2401 if (fromsig &&
2402 (SIGACTION_PS(pick->p_sigacts, SIGINFO).sa_flags &
2403 SA_NOKERNINFO))
2404 return;
2405 msg = NULL;
2406 }
2407
2408 /* Print load average. */
2409 tmp = (averunnable.ldavg[0] * 100 + FSCALE / 2) >> FSHIFT;
2410 snprintf(lmsg, sizeof(lmsg), "load: %d.%02d ", tmp / 100, tmp % 100);
2411 strlcat(buf, lmsg, bufsz);
2412
2413 if (pick == NULL) {
2414 strlcat(buf, msg, bufsz);
2415 return;
2416 }
2417
2418 snprintf(lmsg, sizeof(lmsg), " cmd: %s %d [", pick->p_comm,
2419 pick->p_pid);
2420 strlcat(buf, lmsg, bufsz);
2421
2422 mutex_enter(pick->p_lock);
2423 LIST_FOREACH(l, &pick->p_lwps, l_sibling) {
2424 lwp_lock(l);
2425 snprintf(lmsg, sizeof(lmsg), "%s%s",
2426 l->l_stat == LSONPROC ? "running" :
2427 l->l_stat == LSRUN ? "runnable" :
2428 l->l_wchan ? l->l_wmesg : "iowait",
2429 (LIST_NEXT(l, l_sibling) != NULL) ? " " : "] ");
2430 lwp_unlock(l);
2431 strlcat(buf, lmsg, bufsz);
2432 pctcpu += l->l_pctcpu;
2433 }
2434 pctcpu += pick->p_pctcpu;
2435 calcru(pick, &utime, &stime, NULL, NULL);
2436 mutex_exit(pick->p_lock);
2437
2438 /* Round up and print user+system time, %CPU and RSS. */
2439 utime.tv_usec += 5000;
2440 if (utime.tv_usec >= 1000000) {
2441 utime.tv_sec += 1;
2442 utime.tv_usec -= 1000000;
2443 }
2444 stime.tv_usec += 5000;
2445 if (stime.tv_usec >= 1000000) {
2446 stime.tv_sec += 1;
2447 stime.tv_usec -= 1000000;
2448 }
2449 #define pgtok(a) (((u_long) ((a) * PAGE_SIZE) / 1024))
2450 tmp = (pctcpu * 10000 + FSCALE / 2) >> FSHIFT;
2451 if (pick->p_stat == SIDL || P_ZOMBIE(pick))
2452 rss = 0;
2453 else
2454 rss = pgtok(vm_resident_count(pick->p_vmspace));
2455
2456 snprintf(lmsg, sizeof(lmsg), "%ld.%02ldu %ld.%02lds %d%% %ldk",
2457 (long)utime.tv_sec, (long)utime.tv_usec / 10000,
2458 (long)stime.tv_sec, (long)stime.tv_usec / 10000,
2459 tmp / 100, rss);
2460 strlcat(buf, lmsg, bufsz);
2461 }
2462
2463 /*
2464 * Print report on state of foreground process group.
2465 * Call with tty_lock held.
2466 */
2467 void
2468 ttyputinfo(struct tty *tp, char *buf)
2469 {
2470
2471 KASSERT(mutex_owned(&tty_lock));
2472
2473 if (ttycheckoutq_wlock(tp, 0) == 0)
2474 return;
2475 ttyprintf_nolock(tp, "%s\n", buf);
2476 tp->t_rocount = 0; /* so pending input will be retyped if BS */
2477 }
2478
2479 /*
2480 * Returns 1 if p2 is "better" than p1
2481 *
2482 * The algorithm for picking the "interesting" process is thus:
2483 *
2484 * 1) Only foreground processes are eligible - implied.
2485 * 2) Runnable processes are favored over anything else. The runner
2486 * with the highest CPU utilization is picked (l_pctcpu). Ties are
2487 * broken by picking the highest pid.
2488 * 3) The sleeper with the shortest sleep time is next. With ties,
2489 * we pick out just "short-term" sleepers (P_SINTR == 0).
2490 * 4) Further ties are broken by picking the highest pid.
2491 */
2492 #define ISRUN(p) ((p)->p_nrlwps > 0)
2493 #define TESTAB(a, b) ((a)<<1 | (b))
2494 #define ONLYA 2
2495 #define ONLYB 1
2496 #define BOTH 3
2497
2498 static int
2499 proc_compare(struct proc *p1, struct proc *p2)
2500 {
2501 lwp_t *l1, *l2;
2502
2503 KASSERT(mutex_owned(p1->p_lock));
2504 KASSERT(mutex_owned(p2->p_lock));
2505
2506 if ((l1 = LIST_FIRST(&p1->p_lwps)) == NULL)
2507 return (1);
2508 if ((l2 = LIST_FIRST(&p2->p_lwps)) == NULL)
2509 return (0);
2510 /*
2511 * see if at least one of them is runnable
2512 */
2513 switch (TESTAB(ISRUN(p1), ISRUN(p2))) {
2514 case ONLYA:
2515 return (0);
2516 case ONLYB:
2517 return (1);
2518 case BOTH:
2519 /*
2520 * tie - favor one with highest recent CPU utilization
2521 */
2522 if (l2->l_pctcpu > l1->l_pctcpu)
2523 return (1);
2524 return (p2->p_pid > p1->p_pid); /* tie - return highest pid */
2525 }
2526 /*
2527 * weed out zombies
2528 */
2529 switch (TESTAB(P_ZOMBIE(p1), P_ZOMBIE(p2))) {
2530 case ONLYA:
2531 return (1);
2532 case ONLYB:
2533 return (0);
2534 case BOTH:
2535 return (p2->p_pid > p1->p_pid); /* tie - return highest pid */
2536 }
2537 /*
2538 * pick the one with the smallest sleep time
2539 */
2540 if (l2->l_slptime > l2->l_slptime)
2541 return (0);
2542 if (l2->l_slptime > l2->l_slptime)
2543 return (1);
2544 /*
2545 * favor one sleeping in a non-interruptible sleep
2546 */
2547 if (l2->l_flag & LW_SINTR && (l2->l_flag & LW_SINTR) == 0)
2548 return (1);
2549 if (l2->l_flag & LW_SINTR && (l2->l_flag & LW_SINTR) == 0)
2550 return (0);
2551 return (p2->p_pid > p1->p_pid); /* tie - return highest pid */
2552 }
2553
2554 /*
2555 * Output char to tty; console putchar style.
2556 * Can be called with tty lock held through kprintf() machinery..
2557 */
2558 int
2559 tputchar(int c, int flags, struct tty *tp)
2560 {
2561 int r = 0;
2562
2563 if ((flags & NOLOCK) == 0)
2564 mutex_spin_enter(&tty_lock);
2565 if (!CONNECTED(tp)) {
2566 r = -1;
2567 goto out;
2568 }
2569 if (c == '\n')
2570 (void)ttyoutput('\r', tp);
2571 (void)ttyoutput(c, tp);
2572 ttstart(tp);
2573 out:
2574 if ((flags & NOLOCK) == 0)
2575 mutex_spin_exit(&tty_lock);
2576 return (r);
2577 }
2578
2579 /*
2580 * Sleep on chan, returning ERESTART if tty changed while we napped and
2581 * returning any errors (e.g. EINTR/ETIMEDOUT) reported by cv_timedwait(_sig).
2582 * If the tty is revoked, restarting a pending call will redo validation done
2583 * at the start of the call.
2584 *
2585 * Must be called with the tty lock held.
2586 */
2587 int
2588 ttysleep(struct tty *tp, kcondvar_t *cv, bool catch, int timo)
2589 {
2590 int error;
2591 short gen;
2592
2593 KASSERT(mutex_owned(&tty_lock));
2594
2595 gen = tp->t_gen;
2596 if (catch)
2597 error = cv_timedwait_sig(cv, &tty_lock, timo);
2598 else
2599 error = cv_timedwait(cv, &tty_lock, timo);
2600 if (error != 0)
2601 return (error);
2602 return (tp->t_gen == gen ? 0 : ERESTART);
2603 }
2604
2605 /*
2606 * Attach a tty to the tty list.
2607 *
2608 * This should be called ONLY once per real tty (including pty's).
2609 * eg, on the sparc, the keyboard and mouse have struct tty's that are
2610 * distinctly NOT usable as tty's, and thus should not be attached to
2611 * the ttylist. This is why this call is not done from ttymalloc().
2612 *
2613 * Device drivers should attach tty's at a similar time that they are
2614 * ttymalloc()'ed, or, for the case of statically allocated struct tty's
2615 * either in the attach or (first) open routine.
2616 */
2617 void
2618 tty_attach(struct tty *tp)
2619 {
2620
2621 mutex_spin_enter(&tty_lock);
2622 TAILQ_INSERT_TAIL(&ttylist, tp, tty_link);
2623 ++tty_count;
2624 mutex_spin_exit(&tty_lock);
2625 }
2626
2627 /*
2628 * Remove a tty from the tty list.
2629 */
2630 void
2631 tty_detach(struct tty *tp)
2632 {
2633
2634 mutex_spin_enter(&tty_lock);
2635 --tty_count;
2636 #ifdef DIAGNOSTIC
2637 if (tty_count < 0)
2638 panic("tty_detach: tty_count < 0");
2639 #endif
2640 TAILQ_REMOVE(&ttylist, tp, tty_link);
2641 mutex_spin_exit(&tty_lock);
2642 }
2643
2644 /*
2645 * Allocate a tty structure and its associated buffers.
2646 */
2647 struct tty *
2648 ttymalloc(void)
2649 {
2650 struct tty *tp;
2651 int i;
2652
2653 tp = kmem_zalloc(sizeof(*tp), KM_SLEEP);
2654 callout_init(&tp->t_rstrt_ch, 0);
2655 callout_setfunc(&tp->t_rstrt_ch, ttrstrt, tp);
2656 /* XXX: default to 1024 chars for now */
2657 clalloc(&tp->t_rawq, 1024, 1);
2658 cv_init(&tp->t_rawcv, "ttyraw");
2659 cv_init(&tp->t_rawcvf, "ttyrawf");
2660 clalloc(&tp->t_canq, 1024, 1);
2661 cv_init(&tp->t_cancv, "ttycan");
2662 cv_init(&tp->t_cancvf, "ttycanf");
2663 /* output queue doesn't need quoting */
2664 clalloc(&tp->t_outq, 1024, 0);
2665 cv_init(&tp->t_outcv, "ttyout");
2666 cv_init(&tp->t_outcvf, "ttyoutf");
2667 /* Set default line discipline. */
2668 tp->t_linesw = ttyldisc_default();
2669 selinit(&tp->t_rsel);
2670 selinit(&tp->t_wsel);
2671 for (i = 0; i < TTYSIG_COUNT; i++)
2672 sigemptyset(&tp->t_sigs[i]);
2673 return (tp);
2674 }
2675
2676 /*
2677 * Free a tty structure and its buffers.
2678 *
2679 * Be sure to call tty_detach() for any tty that has been
2680 * tty_attach()ed.
2681 */
2682 void
2683 ttyfree(struct tty *tp)
2684 {
2685 int i;
2686
2687 mutex_enter(proc_lock);
2688 mutex_enter(&tty_lock);
2689 for (i = 0; i < TTYSIG_COUNT; i++)
2690 sigemptyset(&tp->t_sigs[i]);
2691 if (tp->t_sigcount != 0)
2692 TAILQ_REMOVE(&tty_sigqueue, tp, t_sigqueue);
2693 mutex_exit(&tty_lock);
2694 mutex_exit(proc_lock);
2695
2696 callout_halt(&tp->t_rstrt_ch, NULL);
2697 callout_destroy(&tp->t_rstrt_ch);
2698 ttyldisc_release(tp->t_linesw);
2699 clfree(&tp->t_rawq);
2700 clfree(&tp->t_canq);
2701 clfree(&tp->t_outq);
2702 cv_destroy(&tp->t_rawcv);
2703 cv_destroy(&tp->t_rawcvf);
2704 cv_destroy(&tp->t_cancv);
2705 cv_destroy(&tp->t_cancvf);
2706 cv_destroy(&tp->t_outcv);
2707 cv_destroy(&tp->t_outcvf);
2708 seldestroy(&tp->t_rsel);
2709 seldestroy(&tp->t_wsel);
2710 kmem_free(tp, sizeof(*tp));
2711 }
2712
2713 /*
2714 * ttyprintf_nolock: send a message to a specific tty, without locking.
2715 *
2716 * => should be used only by tty driver or anything that knows the
2717 * underlying tty will not be revoked(2)'d away. [otherwise,
2718 * use tprintf]
2719 */
2720 static void
2721 ttyprintf_nolock(struct tty *tp, const char *fmt, ...)
2722 {
2723 va_list ap;
2724
2725 /* No mutex needed; going to process TTY. */
2726 va_start(ap, fmt);
2727 kprintf(fmt, TOTTY|NOLOCK, tp, NULL, ap);
2728 va_end(ap);
2729 }
2730
2731 static int
2732 tty_listener_cb(kauth_cred_t cred, kauth_action_t action, void *cookie,
2733 void *arg0, void *arg1, void *arg2, void *arg3)
2734 {
2735 struct tty *tty;
2736 int result;
2737
2738 result = KAUTH_RESULT_DEFER;
2739
2740 if (action != KAUTH_DEVICE_TTY_OPEN)
2741 return result;
2742
2743 tty = arg0;
2744
2745 /* If it's not opened, we allow. */
2746 if ((tty->t_state & TS_ISOPEN) == 0)
2747 result = KAUTH_RESULT_ALLOW;
2748 else {
2749 /*
2750 * If it's opened, we can only allow if it's not exclusively
2751 * opened; otherwise, that's a privileged operation and we
2752 * let the secmodel handle it.
2753 */
2754 if ((tty->t_state & TS_XCLUDE) == 0)
2755 result = KAUTH_RESULT_ALLOW;
2756 }
2757
2758 return result;
2759 }
2760
2761 /*
2762 * Initialize the tty subsystem.
2763 */
2764 void
2765 tty_init(void)
2766 {
2767
2768 mutex_init(&tty_lock, MUTEX_DEFAULT, IPL_VM);
2769 rw_init(&ttcompat_lock);
2770 tty_sigsih = softint_establish(SOFTINT_CLOCK, ttysigintr, NULL);
2771 KASSERT(tty_sigsih != NULL);
2772
2773 tty_listener = kauth_listen_scope(KAUTH_SCOPE_DEVICE,
2774 tty_listener_cb, NULL);
2775
2776 sysctl_kern_tkstat_setup();
2777 }
2778
2779 /*
2780 * Send a signal from a tty to its process group or session leader.
2781 * Handoff to the target is deferred to a soft interrupt.
2782 */
2783 void
2784 ttysig(struct tty *tp, enum ttysigtype st, int sig)
2785 {
2786 sigset_t *sp;
2787
2788 /* XXXSMP not yet KASSERT(mutex_owned(&tty_lock)); */
2789
2790 sp = &tp->t_sigs[st];
2791 if (sigismember(sp, sig))
2792 return;
2793 sigaddset(sp, sig);
2794 if (tp->t_sigcount++ == 0)
2795 TAILQ_INSERT_TAIL(&tty_sigqueue, tp, t_sigqueue);
2796 softint_schedule(tty_sigsih);
2797 }
2798
2799 /*
2800 * Deliver deferred signals from ttys. Note that the process groups
2801 * and sessions associated with the ttys may have changed from when
2802 * the signal was originally sent, but in practice it should not matter.
2803 * For signals produced as a result of a syscall, the soft interrupt
2804 * will fire before the syscall returns to the user.
2805 */
2806 static void
2807 ttysigintr(void *cookie)
2808 {
2809 struct tty *tp;
2810 enum ttysigtype st;
2811 struct pgrp *pgrp;
2812 struct session *sess;
2813 int sig, lflag;
2814 char infobuf[200];
2815
2816 mutex_enter(proc_lock);
2817 mutex_spin_enter(&tty_lock);
2818 while ((tp = TAILQ_FIRST(&tty_sigqueue)) != NULL) {
2819 KASSERT(tp->t_sigcount > 0);
2820 for (st = 0; st < TTYSIG_COUNT; st++) {
2821 if ((sig = firstsig(&tp->t_sigs[st])) != 0)
2822 break;
2823 }
2824 KASSERT(st < TTYSIG_COUNT);
2825 sigdelset(&tp->t_sigs[st], sig);
2826 if (--tp->t_sigcount == 0)
2827 TAILQ_REMOVE(&tty_sigqueue, tp, t_sigqueue);
2828 pgrp = tp->t_pgrp;
2829 sess = tp->t_session;
2830 lflag = tp->t_lflag;
2831 if (sig == SIGINFO) {
2832 if (ISSET(tp->t_state, TS_SIGINFO)) {
2833 /* Via ioctl: ignore tty option. */
2834 tp->t_state &= ~TS_SIGINFO;
2835 lflag |= ISIG;
2836 }
2837 if (!ISSET(lflag, NOKERNINFO)) {
2838 mutex_spin_exit(&tty_lock);
2839 ttygetinfo(tp, 1, infobuf, sizeof(infobuf));
2840 mutex_spin_enter(&tty_lock);
2841 ttyputinfo(tp, infobuf);
2842 }
2843 if (!ISSET(lflag, ISIG))
2844 continue;
2845 }
2846 mutex_spin_exit(&tty_lock);
2847 KASSERT(sig != 0);
2848 switch (st) {
2849 case TTYSIG_PG1:
2850 if (pgrp != NULL)
2851 pgsignal(pgrp, sig, 1);
2852 break;
2853 case TTYSIG_PG2:
2854 if (pgrp != NULL)
2855 pgsignal(pgrp, sig, sess != NULL);
2856 break;
2857 case TTYSIG_LEADER:
2858 if (sess != NULL && sess->s_leader != NULL)
2859 psignal(sess->s_leader, sig);
2860 break;
2861 default:
2862 /* NOTREACHED */
2863 break;
2864 }
2865 mutex_spin_enter(&tty_lock);
2866 }
2867 mutex_spin_exit(&tty_lock);
2868 mutex_exit(proc_lock);
2869 }
2870