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