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