tty.c revision 1.182 1 /* $NetBSD: tty.c,v 1.182 2006/05/14 21:15:11 elad 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.182 2006/05/14 21:15:11 elad 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 stime.tv_usec = 0; /* XXX gcc */
1655 stime.tv_sec = 0; /* XXX gcc */
1656
1657 cc = tp->t_cc;
1658 p = curproc;
1659 error = 0;
1660 has_stime = 0;
1661 last_cc = 0;
1662 slp = 0;
1663
1664 loop:
1665 s = spltty();
1666 TTY_LOCK(tp);
1667 lflag = tp->t_lflag;
1668 /*
1669 * take pending input first
1670 */
1671 if (ISSET(lflag, PENDIN))
1672 ttypend(tp);
1673
1674 /*
1675 * Hang process if it's in the background.
1676 */
1677 if (isbackground(p, tp)) {
1678 if (sigismember(&p->p_sigctx.ps_sigignore, SIGTTIN) ||
1679 sigismember(&p->p_sigctx.ps_sigmask, SIGTTIN) ||
1680 p->p_flag & P_PPWAIT || p->p_pgrp->pg_jobc == 0) {
1681 TTY_UNLOCK(tp);
1682 splx(s);
1683 return (EIO);
1684 }
1685 pgsignal(p->p_pgrp, SIGTTIN, 1);
1686 error = ttysleep(tp, &lbolt, TTIPRI | PCATCH | PNORELOCK, ttybg, 0);
1687 splx(s);
1688 if (error)
1689 return (error);
1690 goto loop;
1691 }
1692
1693 if (!ISSET(lflag, ICANON)) {
1694 int m = cc[VMIN];
1695 long t = cc[VTIME];
1696
1697 qp = &tp->t_rawq;
1698 /*
1699 * Check each of the four combinations.
1700 * (m > 0 && t == 0) is the normal read case.
1701 * It should be fairly efficient, so we check that and its
1702 * companion case (m == 0 && t == 0) first.
1703 * For the other two cases, we compute the target sleep time
1704 * into slp.
1705 */
1706 if (t == 0) {
1707 if (qp->c_cc < m)
1708 goto sleep;
1709 goto read;
1710 }
1711 t *= hz; /* time in deca-ticks */
1712 /*
1713 * Time difference in deca-ticks, split division to avoid numeric overflow.
1714 * Ok for hz < ~200kHz
1715 */
1716 #define diff(t1, t2) (((t1).tv_sec - (t2).tv_sec) * 10 * hz + \
1717 ((t1).tv_usec - (t2).tv_usec) / 100 * hz / 1000)
1718 if (m > 0) {
1719 if (qp->c_cc <= 0)
1720 goto sleep;
1721 if (qp->c_cc >= m)
1722 goto read;
1723 if (!has_stime) {
1724 /* first character, start timer */
1725 has_stime = 1;
1726 stime = time;
1727 slp = t;
1728 } else if (qp->c_cc > last_cc) {
1729 /* got a character, restart timer */
1730 stime = time;
1731 slp = t;
1732 } else {
1733 /* nothing, check expiration */
1734 slp = t - diff(time, stime);
1735 }
1736 } else { /* m == 0 */
1737 if (qp->c_cc > 0)
1738 goto read;
1739 if (!has_stime) {
1740 has_stime = 1;
1741 stime = time;
1742 slp = t;
1743 } else
1744 slp = t - diff(time, stime);
1745 }
1746 last_cc = qp->c_cc;
1747 #undef diff
1748 if (slp > 0) {
1749 /*
1750 * Convert deca-ticks back to ticks.
1751 * Rounding down may make us wake up just short
1752 * of the target, so we round up.
1753 * Maybe we should do 'slp/10 + 1' because the
1754 * first tick maybe almost immediate.
1755 * However it is more useful for a program that sets
1756 * VTIME=10 to wakeup every second not every 1.01
1757 * seconds (if hz=100).
1758 */
1759 slp = (slp + 9)/ 10;
1760 goto sleep;
1761 }
1762 } else if ((qp = &tp->t_canq)->c_cc <= 0) {
1763 int carrier;
1764
1765 sleep:
1766 /*
1767 * If there is no input, sleep on rawq
1768 * awaiting hardware receipt and notification.
1769 * If we have data, we don't need to check for carrier.
1770 */
1771 carrier = CONNECTED(tp);
1772 if (!carrier && ISSET(tp->t_state, TS_ISOPEN)) {
1773 TTY_UNLOCK(tp);
1774 splx(s);
1775 return (0); /* EOF */
1776 }
1777 if (flag & IO_NDELAY) {
1778 TTY_UNLOCK(tp);
1779 splx(s);
1780 return (EWOULDBLOCK);
1781 }
1782 error = ttysleep(tp, &tp->t_rawq, TTIPRI | PCATCH | PNORELOCK,
1783 carrier ? ttyin : ttopen, slp);
1784 splx(s);
1785 /* VMIN == 0: any quantity read satisfies */
1786 if (cc[VMIN] == 0 && error == EWOULDBLOCK)
1787 return (0);
1788 if (error && error != EWOULDBLOCK)
1789 return (error);
1790 goto loop;
1791 }
1792 read:
1793 TTY_UNLOCK(tp);
1794 splx(s);
1795
1796 /*
1797 * Input present, check for input mapping and processing.
1798 */
1799 first = 1;
1800 while ((c = getc(qp)) >= 0) {
1801 /*
1802 * delayed suspend (^Y)
1803 */
1804 if (CCEQ(cc[VDSUSP], c) &&
1805 ISSET(lflag, IEXTEN|ISIG) == (IEXTEN|ISIG)) {
1806 pgsignal(tp->t_pgrp, SIGTSTP, 1);
1807 if (first) {
1808 s = spltty();
1809 TTY_LOCK(tp);
1810 error = ttysleep(tp, &lbolt,
1811 TTIPRI | PCATCH | PNORELOCK, ttybg, 0);
1812 splx(s);
1813 if (error)
1814 break;
1815 goto loop;
1816 }
1817 break;
1818 }
1819 /*
1820 * Interpret EOF only in canonical mode.
1821 */
1822 if (CCEQ(cc[VEOF], c) && ISSET(lflag, ICANON))
1823 break;
1824 /*
1825 * Give user character.
1826 */
1827 error = ureadc(c, uio);
1828 if (error)
1829 break;
1830 if (uio->uio_resid == 0)
1831 break;
1832 /*
1833 * In canonical mode check for a "break character"
1834 * marking the end of a "line of input".
1835 */
1836 if (ISSET(lflag, ICANON) && TTBREAKC(c, lflag))
1837 break;
1838 first = 0;
1839 }
1840 /*
1841 * Look to unblock output now that (presumably)
1842 * the input queue has gone down.
1843 */
1844 s = spltty();
1845 TTY_LOCK(tp);
1846 if (ISSET(tp->t_state, TS_TBLOCK) && tp->t_rawq.c_cc < TTYHOG / 5) {
1847 if (ISSET(tp->t_iflag, IXOFF) &&
1848 cc[VSTART] != _POSIX_VDISABLE &&
1849 putc(cc[VSTART], &tp->t_outq) == 0) {
1850 CLR(tp->t_state, TS_TBLOCK);
1851 ttstart(tp);
1852 }
1853 /* Try to unblock remote output via hardware flow control. */
1854 if (ISSET(tp->t_cflag, CHWFLOW) && tp->t_hwiflow &&
1855 (*tp->t_hwiflow)(tp, 0) != 0)
1856 CLR(tp->t_state, TS_TBLOCK);
1857 }
1858 TTY_UNLOCK(tp);
1859 splx(s);
1860 return (error);
1861 }
1862
1863 /*
1864 * Check the output queue on tp for space for a kernel message (from uprintf
1865 * or tprintf). Allow some space over the normal hiwater mark so we don't
1866 * lose messages due to normal flow control, but don't let the tty run amok.
1867 * Sleeps here are not interruptible, but we return prematurely if new signals
1868 * arrive.
1869 * Call with tty slock held.
1870 */
1871 static int
1872 ttycheckoutq_wlock(struct tty *tp, int wait)
1873 {
1874 int hiwat, s, error;
1875
1876 hiwat = tp->t_hiwat;
1877 s = spltty();
1878 if (tp->t_outq.c_cc > hiwat + 200)
1879 while (tp->t_outq.c_cc > hiwat) {
1880 ttstart(tp);
1881 if (wait == 0) {
1882 splx(s);
1883 return (0);
1884 }
1885 SET(tp->t_state, TS_ASLEEP);
1886 error = ltsleep(&tp->t_outq, (PZERO - 1) | PCATCH,
1887 "ttckoutq", hz, &tp->t_slock);
1888 if (error == EINTR)
1889 wait = 0;
1890 }
1891
1892 splx(s);
1893 return (1);
1894 }
1895
1896 int
1897 ttycheckoutq(struct tty *tp, int wait)
1898 {
1899 int r, s;
1900
1901 s = spltty();
1902 TTY_LOCK(tp);
1903 r = ttycheckoutq_wlock(tp, wait);
1904 TTY_UNLOCK(tp);
1905 splx(s);
1906 return (r);
1907 }
1908
1909 /*
1910 * Process a write call on a tty device.
1911 */
1912 int
1913 ttwrite(struct tty *tp, struct uio *uio, int flag)
1914 {
1915 u_char *cp;
1916 struct proc *p;
1917 int cc, ce, i, hiwat, error, s;
1918 size_t cnt;
1919 u_char obuf[OBUFSIZ];
1920
1921 cp = NULL;
1922 hiwat = tp->t_hiwat;
1923 cnt = uio->uio_resid;
1924 error = 0;
1925 cc = 0;
1926 loop:
1927 s = spltty();
1928 TTY_LOCK(tp);
1929 if (!CONNECTED(tp)) {
1930 if (ISSET(tp->t_state, TS_ISOPEN)) {
1931 TTY_UNLOCK(tp);
1932 splx(s);
1933 return (EIO);
1934 } else if (flag & IO_NDELAY) {
1935 TTY_UNLOCK(tp);
1936 splx(s);
1937 error = EWOULDBLOCK;
1938 goto out;
1939 } else {
1940 /* Sleep awaiting carrier. */
1941 error = ttysleep(tp,
1942 &tp->t_rawq, TTIPRI | PCATCH | PNORELOCK, ttopen, 0);
1943 splx(s);
1944 if (error)
1945 goto out;
1946 goto loop;
1947 }
1948 }
1949 TTY_UNLOCK(tp);
1950 splx(s);
1951 /*
1952 * Hang the process if it's in the background.
1953 */
1954 p = curproc;
1955 if (isbackground(p, tp) &&
1956 ISSET(tp->t_lflag, TOSTOP) && (p->p_flag & P_PPWAIT) == 0 &&
1957 !sigismember(&p->p_sigctx.ps_sigignore, SIGTTOU) &&
1958 !sigismember(&p->p_sigctx.ps_sigmask, SIGTTOU)) {
1959 if (p->p_pgrp->pg_jobc == 0) {
1960 error = EIO;
1961 goto out;
1962 }
1963 pgsignal(p->p_pgrp, SIGTTOU, 1);
1964 s = spltty();
1965 TTY_LOCK(tp);
1966 error = ttysleep(tp, &lbolt, TTIPRI | PCATCH | PNORELOCK, ttybg, 0);
1967 splx(s);
1968 if (error)
1969 goto out;
1970 goto loop;
1971 }
1972 /*
1973 * Process the user's data in at most OBUFSIZ chunks. Perform any
1974 * output translation. Keep track of high water mark, sleep on
1975 * overflow awaiting device aid in acquiring new space.
1976 */
1977 while (uio->uio_resid > 0 || cc > 0) {
1978 if (ISSET(tp->t_lflag, FLUSHO)) {
1979 uio->uio_resid = 0;
1980 return (0);
1981 }
1982 if (tp->t_outq.c_cc > hiwat)
1983 goto ovhiwat;
1984 /*
1985 * Grab a hunk of data from the user, unless we have some
1986 * leftover from last time.
1987 */
1988 if (cc == 0) {
1989 cc = min(uio->uio_resid, OBUFSIZ);
1990 cp = obuf;
1991 error = uiomove(cp, cc, uio);
1992 if (error) {
1993 cc = 0;
1994 goto out;
1995 }
1996 }
1997 /*
1998 * If nothing fancy need be done, grab those characters we
1999 * can handle without any of ttyoutput's processing and
2000 * just transfer them to the output q. For those chars
2001 * which require special processing (as indicated by the
2002 * bits in char_type), call ttyoutput. After processing
2003 * a hunk of data, look for FLUSHO so ^O's will take effect
2004 * immediately.
2005 */
2006 s = spltty();
2007 TTY_LOCK(tp);
2008 while (cc > 0) {
2009 if (!ISSET(tp->t_oflag, OPOST))
2010 ce = cc;
2011 else {
2012 ce = cc - scanc((u_int)cc, cp, char_type,
2013 CCLASSMASK);
2014 /*
2015 * If ce is zero, then we're processing
2016 * a special character through ttyoutput.
2017 */
2018 if (ce == 0) {
2019 tp->t_rocount = 0;
2020 if (ttyoutput(*cp, tp) >= 0) {
2021 /* out of space */
2022 TTY_UNLOCK(tp);
2023 splx(s);
2024 goto overfull;
2025 }
2026 cp++;
2027 cc--;
2028 if (ISSET(tp->t_lflag, FLUSHO) ||
2029 tp->t_outq.c_cc > hiwat) {
2030 TTY_UNLOCK(tp);
2031 splx(s);
2032 goto ovhiwat;
2033 }
2034 continue;
2035 }
2036 }
2037 /*
2038 * A bunch of normal characters have been found.
2039 * Transfer them en masse to the output queue and
2040 * continue processing at the top of the loop.
2041 * If there are any further characters in this
2042 * <= OBUFSIZ chunk, the first should be a character
2043 * requiring special handling by ttyoutput.
2044 */
2045 tp->t_rocount = 0;
2046 i = b_to_q(cp, ce, &tp->t_outq);
2047 ce -= i;
2048 tp->t_column += ce;
2049 cp += ce, cc -= ce, tk_nout += ce;
2050 tp->t_outcc += ce;
2051 if (i > 0) {
2052 /* out of space */
2053 TTY_UNLOCK(tp);
2054 splx(s);
2055 goto overfull;
2056 }
2057 if (ISSET(tp->t_lflag, FLUSHO) ||
2058 tp->t_outq.c_cc > hiwat)
2059 break;
2060 }
2061 TTY_UNLOCK(tp);
2062 splx(s);
2063 ttstart(tp);
2064 }
2065
2066 out:
2067 /*
2068 * If cc is nonzero, we leave the uio structure inconsistent, as the
2069 * offset and iov pointers have moved forward, but it doesn't matter
2070 * (the call will either return short or restart with a new uio).
2071 */
2072 uio->uio_resid += cc;
2073 return (error);
2074
2075 overfull:
2076 /*
2077 * Since we are using ring buffers, if we can't insert any more into
2078 * the output queue, we can assume the ring is full and that someone
2079 * forgot to set the high water mark correctly. We set it and then
2080 * proceed as normal.
2081 */
2082 hiwat = tp->t_outq.c_cc - 1;
2083
2084 ovhiwat:
2085 ttstart(tp);
2086 s = spltty();
2087 TTY_LOCK(tp);
2088 /*
2089 * This can only occur if FLUSHO is set in t_lflag,
2090 * or if ttstart/oproc is synchronous (or very fast).
2091 */
2092 if (tp->t_outq.c_cc <= hiwat) {
2093 TTY_UNLOCK(tp);
2094 splx(s);
2095 goto loop;
2096 }
2097 if (flag & IO_NDELAY) {
2098 TTY_UNLOCK(tp);
2099 splx(s);
2100 error = (uio->uio_resid == cnt) ? EWOULDBLOCK : 0;
2101 goto out;
2102 }
2103 SET(tp->t_state, TS_ASLEEP);
2104 error = ttysleep(tp, &tp->t_outq, TTOPRI | PCATCH | PNORELOCK, ttyout, 0);
2105 splx(s);
2106 if (error)
2107 goto out;
2108 goto loop;
2109 }
2110
2111 /*
2112 * Rubout one character from the rawq of tp
2113 * as cleanly as possible.
2114 * Called with tty slock held.
2115 */
2116 void
2117 ttyrub(int c, struct tty *tp)
2118 {
2119 u_char *cp;
2120 int savecol, tabc, s;
2121
2122 if (!ISSET(tp->t_lflag, ECHO) || ISSET(tp->t_lflag, EXTPROC))
2123 return;
2124 CLR(tp->t_lflag, FLUSHO);
2125 if (ISSET(tp->t_lflag, ECHOE)) {
2126 if (tp->t_rocount == 0) {
2127 /*
2128 * Screwed by ttwrite; retype
2129 */
2130 ttyretype(tp);
2131 return;
2132 }
2133 if (c == ('\t' | TTY_QUOTE) || c == ('\n' | TTY_QUOTE))
2134 ttyrubo(tp, 2);
2135 else {
2136 CLR(c, ~TTY_CHARMASK);
2137 switch (CCLASS(c)) {
2138 case ORDINARY:
2139 ttyrubo(tp, 1);
2140 break;
2141 case BACKSPACE:
2142 case CONTROL:
2143 case NEWLINE:
2144 case RETURN:
2145 case VTAB:
2146 if (ISSET(tp->t_lflag, ECHOCTL))
2147 ttyrubo(tp, 2);
2148 break;
2149 case TAB:
2150 if (tp->t_rocount < tp->t_rawq.c_cc) {
2151 ttyretype(tp);
2152 return;
2153 }
2154 s = spltty();
2155 savecol = tp->t_column;
2156 SET(tp->t_state, TS_CNTTB);
2157 SET(tp->t_lflag, FLUSHO);
2158 tp->t_column = tp->t_rocol;
2159 for (cp = firstc(&tp->t_rawq, &tabc); cp;
2160 cp = nextc(&tp->t_rawq, cp, &tabc))
2161 ttyecho(tabc, tp);
2162 CLR(tp->t_lflag, FLUSHO);
2163 CLR(tp->t_state, TS_CNTTB);
2164 splx(s);
2165
2166 /* savecol will now be length of the tab. */
2167 savecol -= tp->t_column;
2168 tp->t_column += savecol;
2169 if (savecol > 8)
2170 savecol = 8; /* overflow screw */
2171 while (--savecol >= 0)
2172 (void)ttyoutput('\b', tp);
2173 break;
2174 default: /* XXX */
2175 (void)printf("ttyrub: would panic c = %d, "
2176 "val = %d\n", c, CCLASS(c));
2177 }
2178 }
2179 } else if (ISSET(tp->t_lflag, ECHOPRT)) {
2180 if (!ISSET(tp->t_state, TS_ERASE)) {
2181 SET(tp->t_state, TS_ERASE);
2182 (void)ttyoutput('\\', tp);
2183 }
2184 ttyecho(c, tp);
2185 } else
2186 ttyecho(tp->t_cc[VERASE], tp);
2187 --tp->t_rocount;
2188 }
2189
2190 /*
2191 * Back over cnt characters, erasing them.
2192 * Called with tty slock held.
2193 */
2194 static void
2195 ttyrubo(struct tty *tp, int cnt)
2196 {
2197
2198 while (cnt-- > 0) {
2199 (void)ttyoutput('\b', tp);
2200 (void)ttyoutput(' ', tp);
2201 (void)ttyoutput('\b', tp);
2202 }
2203 }
2204
2205 /*
2206 * ttyretype --
2207 * Reprint the rawq line. Note, it is assumed that c_cc has already
2208 * been checked.
2209 *
2210 * Called with tty slock held.
2211 */
2212 void
2213 ttyretype(struct tty *tp)
2214 {
2215 u_char *cp;
2216 int s, c;
2217
2218 /* Echo the reprint character. */
2219 if (tp->t_cc[VREPRINT] != _POSIX_VDISABLE)
2220 ttyecho(tp->t_cc[VREPRINT], tp);
2221
2222 (void)ttyoutput('\n', tp);
2223
2224 s = spltty();
2225 for (cp = firstc(&tp->t_canq, &c); cp; cp = nextc(&tp->t_canq, cp, &c))
2226 ttyecho(c, tp);
2227 for (cp = firstc(&tp->t_rawq, &c); cp; cp = nextc(&tp->t_rawq, cp, &c))
2228 ttyecho(c, tp);
2229 CLR(tp->t_state, TS_ERASE);
2230 splx(s);
2231
2232 tp->t_rocount = tp->t_rawq.c_cc;
2233 tp->t_rocol = 0;
2234 }
2235
2236 /*
2237 * Echo a typed character to the terminal.
2238 * Called with tty slock held.
2239 */
2240 static void
2241 ttyecho(int c, struct tty *tp)
2242 {
2243
2244 if (!ISSET(tp->t_state, TS_CNTTB))
2245 CLR(tp->t_lflag, FLUSHO);
2246 if ((!ISSET(tp->t_lflag, ECHO) &&
2247 (!ISSET(tp->t_lflag, ECHONL) || c != '\n')) ||
2248 ISSET(tp->t_lflag, EXTPROC))
2249 return;
2250 if (((ISSET(tp->t_lflag, ECHOCTL) &&
2251 (ISSET(c, TTY_CHARMASK) <= 037 && c != '\t' && c != '\n')) ||
2252 ISSET(c, TTY_CHARMASK) == 0177)) {
2253 (void)ttyoutput('^', tp);
2254 CLR(c, ~TTY_CHARMASK);
2255 if (c == 0177)
2256 c = '?';
2257 else
2258 c += 'A' - 1;
2259 }
2260 (void)ttyoutput(c, tp);
2261 }
2262
2263 /*
2264 * Wake up any readers on a tty.
2265 * Called with tty slock held.
2266 */
2267 void
2268 ttwakeup(struct tty *tp)
2269 {
2270
2271 selnotify(&tp->t_rsel, NOTE_SUBMIT);
2272 if (ISSET(tp->t_state, TS_ASYNC))
2273 pgsignal(tp->t_pgrp, SIGIO, tp->t_session != NULL);
2274 wakeup((caddr_t)&tp->t_rawq);
2275 }
2276
2277 /*
2278 * Look up a code for a specified speed in a conversion table;
2279 * used by drivers to map software speed values to hardware parameters.
2280 */
2281 int
2282 ttspeedtab(int speed, const struct speedtab *table)
2283 {
2284
2285 for (; table->sp_speed != -1; table++)
2286 if (table->sp_speed == speed)
2287 return (table->sp_code);
2288 return (-1);
2289 }
2290
2291 /*
2292 * Set tty hi and low water marks.
2293 *
2294 * Try to arrange the dynamics so there's about one second
2295 * from hi to low water.
2296 */
2297 void
2298 ttsetwater(struct tty *tp)
2299 {
2300 int cps, x;
2301
2302 #define CLAMP(x, h, l) ((x) > h ? h : ((x) < l) ? l : (x))
2303
2304 cps = tp->t_ospeed / 10;
2305 tp->t_lowat = x = CLAMP(cps / 2, TTMAXLOWAT, TTMINLOWAT);
2306 x += cps;
2307 x = CLAMP(x, TTMAXHIWAT, TTMINHIWAT);
2308 tp->t_hiwat = roundup(x, CBSIZE);
2309 #undef CLAMP
2310 }
2311
2312 /*
2313 * Report on state of foreground process group.
2314 * Call with tty slock held.
2315 */
2316 void
2317 ttyinfo(struct tty *tp)
2318 {
2319 struct lwp *l;
2320 struct proc *p, *pick;
2321 struct timeval utime, stime;
2322 int tmp;
2323
2324 if (ttycheckoutq_wlock(tp, 0) == 0)
2325 return;
2326
2327 /* Print load average. */
2328 tmp = (averunnable.ldavg[0] * 100 + FSCALE / 2) >> FSHIFT;
2329 ttyprintf_nolock(tp, "load: %d.%02d ", tmp / 100, tmp % 100);
2330
2331 if (tp->t_session == NULL)
2332 ttyprintf_nolock(tp, "not a controlling terminal\n");
2333 else if (tp->t_pgrp == NULL)
2334 ttyprintf_nolock(tp, "no foreground process group\n");
2335 else if ((p = LIST_FIRST(&tp->t_pgrp->pg_members)) == 0)
2336 ttyprintf_nolock(tp, "empty foreground process group\n");
2337 else {
2338 /* Pick interesting process. */
2339 for (pick = NULL; p != NULL; p = LIST_NEXT(p, p_pglist))
2340 if (proc_compare(pick, p))
2341 pick = p;
2342
2343 ttyprintf_nolock(tp, " cmd: %s %d [", pick->p_comm, pick->p_pid);
2344 LIST_FOREACH(l, &pick->p_lwps, l_sibling)
2345 ttyprintf_nolock(tp, "%s%s",
2346 l->l_stat == LSONPROC ? "running" :
2347 l->l_stat == LSRUN ? "runnable" :
2348 l->l_wmesg ? l->l_wmesg : "iowait",
2349 (LIST_NEXT(l, l_sibling) != NULL) ? " " : "] ");
2350
2351 calcru(pick, &utime, &stime, NULL);
2352
2353 /* Round up and print user time. */
2354 utime.tv_usec += 5000;
2355 if (utime.tv_usec >= 1000000) {
2356 utime.tv_sec += 1;
2357 utime.tv_usec -= 1000000;
2358 }
2359 ttyprintf_nolock(tp, "%ld.%02ldu ", (long int)utime.tv_sec,
2360 (long int)utime.tv_usec / 10000);
2361
2362 /* Round up and print system time. */
2363 stime.tv_usec += 5000;
2364 if (stime.tv_usec >= 1000000) {
2365 stime.tv_sec += 1;
2366 stime.tv_usec -= 1000000;
2367 }
2368 ttyprintf_nolock(tp, "%ld.%02lds ", (long int)stime.tv_sec,
2369 (long int)stime.tv_usec / 10000);
2370
2371 #define pgtok(a) (((u_long) ((a) * PAGE_SIZE) / 1024))
2372 /* Print percentage CPU. */
2373 tmp = (pick->p_pctcpu * 10000 + FSCALE / 2) >> FSHIFT;
2374 ttyprintf_nolock(tp, "%d%% ", tmp / 100);
2375
2376 /* Print resident set size. */
2377 if (pick->p_stat == SIDL || P_ZOMBIE(pick))
2378 tmp = 0;
2379 else {
2380 struct vmspace *vm = pick->p_vmspace;
2381 tmp = pgtok(vm_resident_count(vm));
2382 }
2383 ttyprintf_nolock(tp, "%dk\n", tmp);
2384 }
2385 tp->t_rocount = 0; /* so pending input will be retyped if BS */
2386 }
2387
2388 /*
2389 * Returns 1 if p2 is "better" than p1
2390 *
2391 * The algorithm for picking the "interesting" process is thus:
2392 *
2393 * 1) Only foreground processes are eligible - implied.
2394 * 2) Runnable processes are favored over anything else. The runner
2395 * with the highest CPU utilization is picked (p_estcpu). Ties are
2396 * broken by picking the highest pid.
2397 * 3) The sleeper with the shortest sleep time is next. With ties,
2398 * we pick out just "short-term" sleepers (P_SINTR == 0).
2399 * 4) Further ties are broken by picking the highest pid.
2400 */
2401 #define ISRUN(p) ((p)->p_nrlwps > 0)
2402 #define TESTAB(a, b) ((a)<<1 | (b))
2403 #define ONLYA 2
2404 #define ONLYB 1
2405 #define BOTH 3
2406
2407 static int
2408 proc_compare(struct proc *p1, struct proc *p2)
2409 {
2410
2411 if (p1 == NULL)
2412 return (1);
2413 /*
2414 * see if at least one of them is runnable
2415 */
2416 switch (TESTAB(ISRUN(p1), ISRUN(p2))) {
2417 case ONLYA:
2418 return (0);
2419 case ONLYB:
2420 return (1);
2421 case BOTH:
2422 /*
2423 * tie - favor one with highest recent CPU utilization
2424 */
2425 if (p2->p_estcpu > p1->p_estcpu)
2426 return (1);
2427 if (p1->p_estcpu > p2->p_estcpu)
2428 return (0);
2429 return (p2->p_pid > p1->p_pid); /* tie - return highest pid */
2430 }
2431 /*
2432 * weed out zombies
2433 */
2434 switch (TESTAB(P_ZOMBIE(p1), P_ZOMBIE(p2))) {
2435 case ONLYA:
2436 return (1);
2437 case ONLYB:
2438 return (0);
2439 case BOTH:
2440 return (p2->p_pid > p1->p_pid); /* tie - return highest pid */
2441 }
2442 #if 0 /* XXX NJWLWP */
2443 /*
2444 * pick the one with the smallest sleep time
2445 */
2446 if (p2->p_slptime > p1->p_slptime)
2447 return (0);
2448 if (p1->p_slptime > p2->p_slptime)
2449 return (1);
2450 /*
2451 * favor one sleeping in a non-interruptible sleep
2452 */
2453 if (p1->p_flag & P_SINTR && (p2->p_flag & P_SINTR) == 0)
2454 return (1);
2455 if (p2->p_flag & P_SINTR && (p1->p_flag & P_SINTR) == 0)
2456 return (0);
2457 #endif
2458 return (p2->p_pid > p1->p_pid); /* tie - return highest pid */
2459 }
2460
2461 /*
2462 * Output char to tty; console putchar style.
2463 * Can be called with tty lock held through kprintf() machinery..
2464 */
2465 int
2466 tputchar(int c, int flags, struct tty *tp)
2467 {
2468 int s, r = 0;
2469
2470 s = spltty();
2471 if ((flags & NOLOCK) == 0)
2472 simple_lock(&tp->t_slock);
2473 if (!CONNECTED(tp)) {
2474 r = -1;
2475 goto out;
2476 }
2477 if (c == '\n')
2478 (void)ttyoutput('\r', tp);
2479 (void)ttyoutput(c, tp);
2480 ttstart(tp);
2481 out:
2482 if ((flags & NOLOCK) == 0)
2483 TTY_UNLOCK(tp);
2484 splx(s);
2485 return (r);
2486 }
2487
2488 /*
2489 * Sleep on chan, returning ERESTART if tty changed while we napped and
2490 * returning any errors (e.g. EINTR/ETIMEDOUT) reported by tsleep. If
2491 * the tty is revoked, restarting a pending call will redo validation done
2492 * at the start of the call.
2493 *
2494 * Must be called with the tty slock held.
2495 */
2496 int
2497 ttysleep(struct tty *tp, void *chan, int pri, const char *wmesg, int timo)
2498 {
2499 int error;
2500 short gen;
2501
2502 gen = tp->t_gen;
2503 if ((error = ltsleep(chan, pri, wmesg, timo, &tp->t_slock)) != 0)
2504 return (error);
2505 return (tp->t_gen == gen ? 0 : ERESTART);
2506 }
2507
2508 /*
2509 * Attach a tty to the tty list.
2510 *
2511 * This should be called ONLY once per real tty (including pty's).
2512 * eg, on the sparc, the keyboard and mouse have struct tty's that are
2513 * distinctly NOT usable as tty's, and thus should not be attached to
2514 * the ttylist. This is why this call is not done from ttymalloc().
2515 *
2516 * Device drivers should attach tty's at a similar time that they are
2517 * ttymalloc()'ed, or, for the case of statically allocated struct tty's
2518 * either in the attach or (first) open routine.
2519 */
2520 void
2521 tty_attach(struct tty *tp)
2522 {
2523
2524 simple_lock(&ttylist_slock);
2525 TAILQ_INSERT_TAIL(&ttylist, tp, tty_link);
2526 ++tty_count;
2527 simple_unlock(&ttylist_slock);
2528 }
2529
2530 /*
2531 * Remove a tty from the tty list.
2532 */
2533 void
2534 tty_detach(struct tty *tp)
2535 {
2536
2537 simple_lock(&ttylist_slock);
2538 --tty_count;
2539 #ifdef DIAGNOSTIC
2540 if (tty_count < 0)
2541 panic("tty_detach: tty_count < 0");
2542 #endif
2543 TAILQ_REMOVE(&ttylist, tp, tty_link);
2544 simple_unlock(&ttylist_slock);
2545 }
2546
2547 /*
2548 * Allocate a tty structure and its associated buffers.
2549 */
2550 struct tty *
2551 ttymalloc(void)
2552 {
2553 struct tty *tp;
2554
2555 tp = pool_get(&tty_pool, PR_WAITOK);
2556 memset(tp, 0, sizeof(*tp));
2557 simple_lock_init(&tp->t_slock);
2558 callout_init(&tp->t_rstrt_ch);
2559 /* XXX: default to 1024 chars for now */
2560 clalloc(&tp->t_rawq, 1024, 1);
2561 clalloc(&tp->t_canq, 1024, 1);
2562 /* output queue doesn't need quoting */
2563 clalloc(&tp->t_outq, 1024, 0);
2564 /* Set default line discipline. */
2565 tp->t_linesw = ttyldisc_default();
2566 return (tp);
2567 }
2568
2569 /*
2570 * Free a tty structure and its buffers.
2571 *
2572 * Be sure to call tty_detach() for any tty that has been
2573 * tty_attach()ed.
2574 */
2575 void
2576 ttyfree(struct tty *tp)
2577 {
2578
2579 callout_stop(&tp->t_rstrt_ch);
2580 ttyldisc_release(tp->t_linesw);
2581 clfree(&tp->t_rawq);
2582 clfree(&tp->t_canq);
2583 clfree(&tp->t_outq);
2584 pool_put(&tty_pool, tp);
2585 }
2586
2587 /*
2588 * ttyprintf_nolock: send a message to a specific tty, without locking.
2589 *
2590 * => should be used only by tty driver or anything that knows the
2591 * underlying tty will not be revoked(2)'d away. [otherwise,
2592 * use tprintf]
2593 */
2594 static void
2595 ttyprintf_nolock(struct tty *tp, const char *fmt, ...)
2596 {
2597 va_list ap;
2598
2599 /* No mutex needed; going to process TTY. */
2600 va_start(ap, fmt);
2601 kprintf(fmt, TOTTY|NOLOCK, tp, NULL, ap);
2602 va_end(ap);
2603 }
2604