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