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