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