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