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