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