1 /*- 2 * Copyright (c) 1982, 1986, 1990, 1991, 1993 3 * The Regents of the University of California. All rights reserved. 4 * (c) UNIX System Laboratories, Inc. 5 * All or some portions of this file are derived from material licensed 6 * to the University of California by American Telephone and Telegraph 7 * Co. or Unix System Laboratories, Inc. and are reproduced herein with 8 * the permission of UNIX System Laboratories, Inc. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. All advertising materials mentioning features or use of this software 19 * must display the following acknowledgement: 20 * This product includes software developed by the University of 21 * California, Berkeley and its contributors. 22 * 4. Neither the name of the University nor the names of its contributors 23 * may be used to endorse or promote products derived from this software 24 * without specific prior written permission. 25 * 26 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 29 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 36 * SUCH DAMAGE. 37 * 38 * @(#)tty.c 8.8 (Berkeley) 1/21/94 39 * $FreeBSD$ 40 */ 41 42 /*- 43 * TODO: 44 * o Fix races for sending the start char in ttyflush(). 45 * o Handle inter-byte timeout for "MIN > 0, TIME > 0" in ttyselect(). 46 * With luck, there will be MIN chars before select() returns(). 47 * o Handle CLOCAL consistently for ptys. Perhaps disallow setting it. 48 * o Don't allow input in TS_ZOMBIE case. It would be visible through 49 * FIONREAD. 50 * o Do the new sio locking stuff here and use it to avoid special 51 * case for EXTPROC? 52 * o Lock PENDIN too? 53 * o Move EXTPROC and/or PENDIN to t_state? 54 * o Wrap most of ttioctl in spltty/splx. 55 * o Implement TIOCNOTTY or remove it from <sys/ioctl.h>. 56 * o Send STOP if IXOFF is toggled off while TS_TBLOCK is set. 57 * o Don't allow certain termios flags to affect disciplines other 58 * than TTYDISC. Cancel their effects before switch disciplines 59 * and ignore them if they are set while we are in another 60 * discipline. 61 * o Now that historical speed conversions are handled here, don't 62 * do them in drivers. 63 * o Check for TS_CARR_ON being set while everything is closed and not 64 * waiting for carrier. TS_CARR_ON isn't cleared if nothing is open, 65 * so it would live until the next open even if carrier drops. 66 * o Restore TS_WOPEN since it is useful in pstat. It must be cleared 67 * only when _all_ openers leave open(). 68 */ 69 70 #include "opt_compat.h" 71 #include "opt_uconsole.h" 72 73 #include <sys/param.h> 74 #include <sys/systm.h> 75 #include <sys/filio.h> 76 #include <sys/lock.h> 77 #include <sys/mutex.h> 78 #if defined(COMPAT_43) || defined(COMPAT_SUNOS) 79 #include <sys/ioctl_compat.h> 80 #endif 81 #include <sys/proc.h> 82 #define TTYDEFCHARS 83 #include <sys/tty.h> 84 #undef TTYDEFCHARS 85 #include <sys/fcntl.h> 86 #include <sys/conf.h> 87 #include <sys/dkstat.h> 88 #include <sys/poll.h> 89 #include <sys/kernel.h> 90 #include <sys/vnode.h> 91 #include <sys/signalvar.h> 92 #include <sys/resourcevar.h> 93 #include <sys/malloc.h> 94 #include <sys/filedesc.h> 95 #include <sys/sysctl.h> 96 97 #include <vm/vm.h> 98 #include <vm/pmap.h> 99 #include <vm/vm_map.h> 100 101 MALLOC_DEFINE(M_TTYS, "ttys", "tty data structures"); 102 103 static int proc_compare __P((struct proc *p1, struct proc *p2)); 104 static int ttnread __P((struct tty *tp)); 105 static void ttyecho __P((int c, struct tty *tp)); 106 static int ttyoutput __P((int c, register struct tty *tp)); 107 static void ttypend __P((struct tty *tp)); 108 static void ttyretype __P((struct tty *tp)); 109 static void ttyrub __P((int c, struct tty *tp)); 110 static void ttyrubo __P((struct tty *tp, int cnt)); 111 static void ttyunblock __P((struct tty *tp)); 112 static int ttywflush __P((struct tty *tp)); 113 static int filt_ttyread __P((struct knote *kn, long hint)); 114 static void filt_ttyrdetach __P((struct knote *kn)); 115 static int filt_ttywrite __P((struct knote *kn, long hint)); 116 static void filt_ttywdetach __P((struct knote *kn)); 117 118 /* 119 * Table with character classes and parity. The 8th bit indicates parity, 120 * the 7th bit indicates the character is an alphameric or underscore (for 121 * ALTWERASE), and the low 6 bits indicate delay type. If the low 6 bits 122 * are 0 then the character needs no special processing on output; classes 123 * other than 0 might be translated or (not currently) require delays. 124 */ 125 #define E 0x00 /* Even parity. */ 126 #define O 0x80 /* Odd parity. */ 127 #define PARITY(c) (char_type[c] & O) 128 129 #define ALPHA 0x40 /* Alpha or underscore. */ 130 #define ISALPHA(c) (char_type[(c) & TTY_CHARMASK] & ALPHA) 131 132 #define CCLASSMASK 0x3f 133 #define CCLASS(c) (char_type[c] & CCLASSMASK) 134 135 #define BS BACKSPACE 136 #define CC CONTROL 137 #define CR RETURN 138 #define NA ORDINARY | ALPHA 139 #define NL NEWLINE 140 #define NO ORDINARY 141 #define TB TAB 142 #define VT VTAB 143 144 static u_char const char_type[] = { 145 E|CC, O|CC, O|CC, E|CC, O|CC, E|CC, E|CC, O|CC, /* nul - bel */ 146 O|BS, E|TB, E|NL, O|CC, E|VT, O|CR, O|CC, E|CC, /* bs - si */ 147 O|CC, E|CC, E|CC, O|CC, E|CC, O|CC, O|CC, E|CC, /* dle - etb */ 148 E|CC, O|CC, O|CC, E|CC, O|CC, E|CC, E|CC, O|CC, /* can - us */ 149 O|NO, E|NO, E|NO, O|NO, E|NO, O|NO, O|NO, E|NO, /* sp - ' */ 150 E|NO, O|NO, O|NO, E|NO, O|NO, E|NO, E|NO, O|NO, /* ( - / */ 151 E|NA, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA, /* 0 - 7 */ 152 O|NA, E|NA, E|NO, O|NO, E|NO, O|NO, O|NO, E|NO, /* 8 - ? */ 153 O|NO, E|NA, E|NA, O|NA, E|NA, O|NA, O|NA, E|NA, /* @ - G */ 154 E|NA, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA, /* H - O */ 155 E|NA, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA, /* P - W */ 156 O|NA, E|NA, E|NA, O|NO, E|NO, O|NO, O|NO, O|NA, /* X - _ */ 157 E|NO, O|NA, O|NA, E|NA, O|NA, E|NA, E|NA, O|NA, /* ` - g */ 158 O|NA, E|NA, E|NA, O|NA, E|NA, O|NA, O|NA, E|NA, /* h - o */ 159 O|NA, E|NA, E|NA, O|NA, E|NA, O|NA, O|NA, E|NA, /* p - w */ 160 E|NA, O|NA, O|NA, E|NO, O|NO, E|NO, E|NO, O|CC, /* x - del */ 161 /* 162 * Meta chars; should be settable per character set; 163 * for now, treat them all as normal characters. 164 */ 165 NA, NA, NA, NA, NA, NA, NA, NA, 166 NA, NA, NA, NA, NA, NA, NA, NA, 167 NA, NA, NA, NA, NA, NA, NA, NA, 168 NA, NA, NA, NA, NA, NA, NA, NA, 169 NA, NA, NA, NA, NA, NA, NA, NA, 170 NA, NA, NA, NA, NA, NA, NA, NA, 171 NA, NA, NA, NA, NA, NA, NA, NA, 172 NA, NA, NA, NA, NA, NA, NA, NA, 173 NA, NA, NA, NA, NA, NA, NA, NA, 174 NA, NA, NA, NA, NA, NA, NA, NA, 175 NA, NA, NA, NA, NA, NA, NA, NA, 176 NA, NA, NA, NA, NA, NA, NA, NA, 177 NA, NA, NA, NA, NA, NA, NA, NA, 178 NA, NA, NA, NA, NA, NA, NA, NA, 179 NA, NA, NA, NA, NA, NA, NA, NA, 180 NA, NA, NA, NA, NA, NA, NA, NA, 181 }; 182 #undef BS 183 #undef CC 184 #undef CR 185 #undef NA 186 #undef NL 187 #undef NO 188 #undef TB 189 #undef VT 190 191 /* Macros to clear/set/test flags. */ 192 #define SET(t, f) (t) |= (f) 193 #define CLR(t, f) (t) &= ~(f) 194 #define ISSET(t, f) ((t) & (f)) 195 196 #undef MAX_INPUT /* XXX wrong in <sys/syslimits.h> */ 197 #define MAX_INPUT TTYHOG /* XXX limit is usually larger for !ICANON */ 198 199 /* 200 * list of struct tty where pstat(8) can pick it up with sysctl 201 */ 202 static SLIST_HEAD(, tty) tty_list; 203 204 static int drainwait = 5*60; 205 SYSCTL_INT(_kern, OID_AUTO, drainwait, CTLFLAG_RW, &drainwait, 206 0, "Output drain timeout in seconds"); 207 208 /* 209 * Initial open of tty, or (re)entry to standard tty line discipline. 210 */ 211 int 212 ttyopen(device, tp) 213 dev_t device; 214 register struct tty *tp; 215 { 216 int s; 217 218 s = spltty(); 219 tp->t_dev = device; 220 if (!ISSET(tp->t_state, TS_ISOPEN)) { 221 SET(tp->t_state, TS_ISOPEN); 222 if (ISSET(tp->t_cflag, CLOCAL)) 223 SET(tp->t_state, TS_CONNECTED); 224 bzero(&tp->t_winsize, sizeof(tp->t_winsize)); 225 } 226 /* XXX don't hang forever on output */ 227 if (tp->t_timeout < 0) 228 tp->t_timeout = drainwait*hz; 229 ttsetwater(tp); 230 splx(s); 231 return (0); 232 } 233 234 /* 235 * Handle close() on a tty line: flush and set to initial state, 236 * bumping generation number so that pending read/write calls 237 * can detect recycling of the tty. 238 * XXX our caller should have done `spltty(); l_close(); ttyclose();' 239 * and l_close() should have flushed, but we repeat the spltty() and 240 * the flush in case there are buggy callers. 241 */ 242 int 243 ttyclose(tp) 244 register struct tty *tp; 245 { 246 int s; 247 248 funsetown(tp->t_sigio); 249 s = spltty(); 250 if (constty == tp) 251 constty = NULL; 252 253 ttyflush(tp, FREAD | FWRITE); 254 clist_free_cblocks(&tp->t_canq); 255 clist_free_cblocks(&tp->t_outq); 256 clist_free_cblocks(&tp->t_rawq); 257 258 tp->t_gen++; 259 tp->t_line = TTYDISC; 260 tp->t_pgrp = NULL; 261 tp->t_session = NULL; 262 tp->t_state = 0; 263 splx(s); 264 return (0); 265 } 266 267 #define FLUSHQ(q) { \ 268 if ((q)->c_cc) \ 269 ndflush(q, (q)->c_cc); \ 270 } 271 272 /* Is 'c' a line delimiter ("break" character)? */ 273 #define TTBREAKC(c, lflag) \ 274 ((c) == '\n' || (((c) == cc[VEOF] || \ 275 (c) == cc[VEOL] || ((c) == cc[VEOL2] && lflag & IEXTEN)) && \ 276 (c) != _POSIX_VDISABLE)) 277 278 /* 279 * Process input of a single character received on a tty. 280 */ 281 int 282 ttyinput(c, tp) 283 register int c; 284 register struct tty *tp; 285 { 286 register tcflag_t iflag, lflag; 287 register cc_t *cc; 288 int i, err; 289 290 /* 291 * If input is pending take it first. 292 */ 293 lflag = tp->t_lflag; 294 if (ISSET(lflag, PENDIN)) 295 ttypend(tp); 296 /* 297 * Gather stats. 298 */ 299 if (ISSET(lflag, ICANON)) { 300 ++tk_cancc; 301 ++tp->t_cancc; 302 } else { 303 ++tk_rawcc; 304 ++tp->t_rawcc; 305 } 306 ++tk_nin; 307 308 /* 309 * Block further input iff: 310 * current input > threshold AND input is available to user program 311 * AND input flow control is enabled and not yet invoked. 312 * The 3 is slop for PARMRK. 313 */ 314 iflag = tp->t_iflag; 315 if (tp->t_rawq.c_cc + tp->t_canq.c_cc > tp->t_ihiwat - 3 && 316 (!ISSET(lflag, ICANON) || tp->t_canq.c_cc != 0) && 317 (ISSET(tp->t_cflag, CRTS_IFLOW) || ISSET(iflag, IXOFF)) && 318 !ISSET(tp->t_state, TS_TBLOCK)) 319 ttyblock(tp); 320 321 /* Handle exceptional conditions (break, parity, framing). */ 322 cc = tp->t_cc; 323 err = (ISSET(c, TTY_ERRORMASK)); 324 if (err) { 325 CLR(c, TTY_ERRORMASK); 326 if (ISSET(err, TTY_BI)) { 327 if (ISSET(iflag, IGNBRK)) 328 return (0); 329 if (ISSET(iflag, BRKINT)) { 330 ttyflush(tp, FREAD | FWRITE); 331 pgsignal(tp->t_pgrp, SIGINT, 1); 332 goto endcase; 333 } 334 if (ISSET(iflag, PARMRK)) 335 goto parmrk; 336 } else if ((ISSET(err, TTY_PE) && ISSET(iflag, INPCK)) 337 || ISSET(err, TTY_FE)) { 338 if (ISSET(iflag, IGNPAR)) 339 return (0); 340 else if (ISSET(iflag, PARMRK)) { 341 parmrk: 342 if (tp->t_rawq.c_cc + tp->t_canq.c_cc > 343 MAX_INPUT - 3) 344 goto input_overflow; 345 (void)putc(0377 | TTY_QUOTE, &tp->t_rawq); 346 (void)putc(0 | TTY_QUOTE, &tp->t_rawq); 347 (void)putc(c | TTY_QUOTE, &tp->t_rawq); 348 goto endcase; 349 } else 350 c = 0; 351 } 352 } 353 354 if (!ISSET(tp->t_state, TS_TYPEN) && ISSET(iflag, ISTRIP)) 355 CLR(c, 0x80); 356 if (!ISSET(lflag, EXTPROC)) { 357 /* 358 * Check for literal nexting very first 359 */ 360 if (ISSET(tp->t_state, TS_LNCH)) { 361 SET(c, TTY_QUOTE); 362 CLR(tp->t_state, TS_LNCH); 363 } 364 /* 365 * Scan for special characters. This code 366 * is really just a big case statement with 367 * non-constant cases. The bottom of the 368 * case statement is labeled ``endcase'', so goto 369 * it after a case match, or similar. 370 */ 371 372 /* 373 * Control chars which aren't controlled 374 * by ICANON, ISIG, or IXON. 375 */ 376 if (ISSET(lflag, IEXTEN)) { 377 if (CCEQ(cc[VLNEXT], c)) { 378 if (ISSET(lflag, ECHO)) { 379 if (ISSET(lflag, ECHOE)) { 380 (void)ttyoutput('^', tp); 381 (void)ttyoutput('\b', tp); 382 } else 383 ttyecho(c, tp); 384 } 385 SET(tp->t_state, TS_LNCH); 386 goto endcase; 387 } 388 if (CCEQ(cc[VDISCARD], c)) { 389 if (ISSET(lflag, FLUSHO)) 390 CLR(tp->t_lflag, FLUSHO); 391 else { 392 ttyflush(tp, FWRITE); 393 ttyecho(c, tp); 394 if (tp->t_rawq.c_cc + tp->t_canq.c_cc) 395 ttyretype(tp); 396 SET(tp->t_lflag, FLUSHO); 397 } 398 goto startoutput; 399 } 400 } 401 /* 402 * Signals. 403 */ 404 if (ISSET(lflag, ISIG)) { 405 if (CCEQ(cc[VINTR], c) || CCEQ(cc[VQUIT], c)) { 406 if (!ISSET(lflag, NOFLSH)) 407 ttyflush(tp, FREAD | FWRITE); 408 ttyecho(c, tp); 409 pgsignal(tp->t_pgrp, 410 CCEQ(cc[VINTR], c) ? SIGINT : SIGQUIT, 1); 411 goto endcase; 412 } 413 if (CCEQ(cc[VSUSP], c)) { 414 if (!ISSET(lflag, NOFLSH)) 415 ttyflush(tp, FREAD); 416 ttyecho(c, tp); 417 pgsignal(tp->t_pgrp, SIGTSTP, 1); 418 goto endcase; 419 } 420 } 421 /* 422 * Handle start/stop characters. 423 */ 424 if (ISSET(iflag, IXON)) { 425 if (CCEQ(cc[VSTOP], c)) { 426 if (!ISSET(tp->t_state, TS_TTSTOP)) { 427 SET(tp->t_state, TS_TTSTOP); 428 (*tp->t_stop)(tp, 0); 429 return (0); 430 } 431 if (!CCEQ(cc[VSTART], c)) 432 return (0); 433 /* 434 * if VSTART == VSTOP then toggle 435 */ 436 goto endcase; 437 } 438 if (CCEQ(cc[VSTART], c)) 439 goto restartoutput; 440 } 441 /* 442 * IGNCR, ICRNL, & INLCR 443 */ 444 if (c == '\r') { 445 if (ISSET(iflag, IGNCR)) 446 return (0); 447 else if (ISSET(iflag, ICRNL)) 448 c = '\n'; 449 } else if (c == '\n' && ISSET(iflag, INLCR)) 450 c = '\r'; 451 } 452 if (!ISSET(tp->t_lflag, EXTPROC) && ISSET(lflag, ICANON)) { 453 /* 454 * From here on down canonical mode character 455 * processing takes place. 456 */ 457 /* 458 * erase or erase2 (^H / ^?) 459 */ 460 if (CCEQ(cc[VERASE], c) || CCEQ(cc[VERASE2], c) ) { 461 if (tp->t_rawq.c_cc) 462 ttyrub(unputc(&tp->t_rawq), tp); 463 goto endcase; 464 } 465 /* 466 * kill (^U) 467 */ 468 if (CCEQ(cc[VKILL], c)) { 469 if (ISSET(lflag, ECHOKE) && 470 tp->t_rawq.c_cc == tp->t_rocount && 471 !ISSET(lflag, ECHOPRT)) 472 while (tp->t_rawq.c_cc) 473 ttyrub(unputc(&tp->t_rawq), tp); 474 else { 475 ttyecho(c, tp); 476 if (ISSET(lflag, ECHOK) || 477 ISSET(lflag, ECHOKE)) 478 ttyecho('\n', tp); 479 FLUSHQ(&tp->t_rawq); 480 tp->t_rocount = 0; 481 } 482 CLR(tp->t_state, TS_LOCAL); 483 goto endcase; 484 } 485 /* 486 * word erase (^W) 487 */ 488 if (CCEQ(cc[VWERASE], c) && ISSET(lflag, IEXTEN)) { 489 int ctype; 490 491 /* 492 * erase whitespace 493 */ 494 while ((c = unputc(&tp->t_rawq)) == ' ' || c == '\t') 495 ttyrub(c, tp); 496 if (c == -1) 497 goto endcase; 498 /* 499 * erase last char of word and remember the 500 * next chars type (for ALTWERASE) 501 */ 502 ttyrub(c, tp); 503 c = unputc(&tp->t_rawq); 504 if (c == -1) 505 goto endcase; 506 if (c == ' ' || c == '\t') { 507 (void)putc(c, &tp->t_rawq); 508 goto endcase; 509 } 510 ctype = ISALPHA(c); 511 /* 512 * erase rest of word 513 */ 514 do { 515 ttyrub(c, tp); 516 c = unputc(&tp->t_rawq); 517 if (c == -1) 518 goto endcase; 519 } while (c != ' ' && c != '\t' && 520 (!ISSET(lflag, ALTWERASE) || ISALPHA(c) == ctype)); 521 (void)putc(c, &tp->t_rawq); 522 goto endcase; 523 } 524 /* 525 * reprint line (^R) 526 */ 527 if (CCEQ(cc[VREPRINT], c) && ISSET(lflag, IEXTEN)) { 528 ttyretype(tp); 529 goto endcase; 530 } 531 /* 532 * ^T - kernel info and generate SIGINFO 533 */ 534 if (CCEQ(cc[VSTATUS], c) && ISSET(lflag, IEXTEN)) { 535 if (ISSET(lflag, ISIG)) 536 pgsignal(tp->t_pgrp, SIGINFO, 1); 537 if (!ISSET(lflag, NOKERNINFO)) 538 ttyinfo(tp); 539 goto endcase; 540 } 541 } 542 /* 543 * Check for input buffer overflow 544 */ 545 if (tp->t_rawq.c_cc + tp->t_canq.c_cc >= MAX_INPUT) { 546 input_overflow: 547 if (ISSET(iflag, IMAXBEL)) { 548 if (tp->t_outq.c_cc < tp->t_ohiwat) 549 (void)ttyoutput(CTRL('g'), tp); 550 } 551 goto endcase; 552 } 553 554 if ( c == 0377 && ISSET(iflag, PARMRK) && !ISSET(iflag, ISTRIP) 555 && ISSET(iflag, IGNBRK|IGNPAR) != (IGNBRK|IGNPAR)) 556 (void)putc(0377 | TTY_QUOTE, &tp->t_rawq); 557 558 /* 559 * Put data char in q for user and 560 * wakeup on seeing a line delimiter. 561 */ 562 if (putc(c, &tp->t_rawq) >= 0) { 563 if (!ISSET(lflag, ICANON)) { 564 ttwakeup(tp); 565 ttyecho(c, tp); 566 goto endcase; 567 } 568 if (TTBREAKC(c, lflag)) { 569 tp->t_rocount = 0; 570 catq(&tp->t_rawq, &tp->t_canq); 571 ttwakeup(tp); 572 } else if (tp->t_rocount++ == 0) 573 tp->t_rocol = tp->t_column; 574 if (ISSET(tp->t_state, TS_ERASE)) { 575 /* 576 * end of prterase \.../ 577 */ 578 CLR(tp->t_state, TS_ERASE); 579 (void)ttyoutput('/', tp); 580 } 581 i = tp->t_column; 582 ttyecho(c, tp); 583 if (CCEQ(cc[VEOF], c) && ISSET(lflag, ECHO)) { 584 /* 585 * Place the cursor over the '^' of the ^D. 586 */ 587 i = imin(2, tp->t_column - i); 588 while (i > 0) { 589 (void)ttyoutput('\b', tp); 590 i--; 591 } 592 } 593 } 594 endcase: 595 /* 596 * IXANY means allow any character to restart output. 597 */ 598 if (ISSET(tp->t_state, TS_TTSTOP) && 599 !ISSET(iflag, IXANY) && cc[VSTART] != cc[VSTOP]) 600 return (0); 601 restartoutput: 602 CLR(tp->t_lflag, FLUSHO); 603 CLR(tp->t_state, TS_TTSTOP); 604 startoutput: 605 return (ttstart(tp)); 606 } 607 608 /* 609 * Output a single character on a tty, doing output processing 610 * as needed (expanding tabs, newline processing, etc.). 611 * Returns < 0 if succeeds, otherwise returns char to resend. 612 * Must be recursive. 613 */ 614 static int 615 ttyoutput(c, tp) 616 register int c; 617 register struct tty *tp; 618 { 619 register tcflag_t oflag; 620 register int col, s; 621 622 oflag = tp->t_oflag; 623 if (!ISSET(oflag, OPOST)) { 624 if (ISSET(tp->t_lflag, FLUSHO)) 625 return (-1); 626 if (putc(c, &tp->t_outq)) 627 return (c); 628 tk_nout++; 629 tp->t_outcc++; 630 return (-1); 631 } 632 /* 633 * Do tab expansion if OXTABS is set. Special case if we external 634 * processing, we don't do the tab expansion because we'll probably 635 * get it wrong. If tab expansion needs to be done, let it happen 636 * externally. 637 */ 638 CLR(c, ~TTY_CHARMASK); 639 if (c == '\t' && 640 ISSET(oflag, OXTABS) && !ISSET(tp->t_lflag, EXTPROC)) { 641 c = 8 - (tp->t_column & 7); 642 if (!ISSET(tp->t_lflag, FLUSHO)) { 643 s = spltty(); /* Don't interrupt tabs. */ 644 c -= b_to_q(" ", c, &tp->t_outq); 645 tk_nout += c; 646 tp->t_outcc += c; 647 splx(s); 648 } 649 tp->t_column += c; 650 return (c ? -1 : '\t'); 651 } 652 if (c == CEOT && ISSET(oflag, ONOEOT)) 653 return (-1); 654 655 /* 656 * Newline translation: if ONLCR is set, 657 * translate newline into "\r\n". 658 */ 659 if (c == '\n' && ISSET(tp->t_oflag, ONLCR)) { 660 tk_nout++; 661 tp->t_outcc++; 662 if (!ISSET(tp->t_lflag, FLUSHO) && putc('\r', &tp->t_outq)) 663 return (c); 664 } 665 /* If OCRNL is set, translate "\r" into "\n". */ 666 else if (c == '\r' && ISSET(tp->t_oflag, OCRNL)) 667 c = '\n'; 668 /* If ONOCR is set, don't transmit CRs when on column 0. */ 669 else if (c == '\r' && ISSET(tp->t_oflag, ONOCR) && tp->t_column == 0) 670 return (-1); 671 672 tk_nout++; 673 tp->t_outcc++; 674 if (!ISSET(tp->t_lflag, FLUSHO) && putc(c, &tp->t_outq)) 675 return (c); 676 677 col = tp->t_column; 678 switch (CCLASS(c)) { 679 case BACKSPACE: 680 if (col > 0) 681 --col; 682 break; 683 case CONTROL: 684 break; 685 case NEWLINE: 686 if (ISSET(tp->t_oflag, ONLCR | ONLRET)) 687 col = 0; 688 break; 689 case RETURN: 690 col = 0; 691 break; 692 case ORDINARY: 693 ++col; 694 break; 695 case TAB: 696 col = (col + 8) & ~7; 697 break; 698 } 699 tp->t_column = col; 700 return (-1); 701 } 702 703 /* 704 * Ioctls for all tty devices. Called after line-discipline specific ioctl 705 * has been called to do discipline-specific functions and/or reject any 706 * of these ioctl commands. 707 */ 708 /* ARGSUSED */ 709 int 710 ttioctl(tp, cmd, data, flag) 711 register struct tty *tp; 712 u_long cmd; 713 int flag; 714 void *data; 715 { 716 register struct proc *p; 717 int s, error; 718 719 p = curproc; /* XXX */ 720 721 /* If the ioctl involves modification, hang if in the background. */ 722 switch (cmd) { 723 case TIOCCBRK: 724 case TIOCCONS: 725 case TIOCDRAIN: 726 case TIOCEXCL: 727 case TIOCFLUSH: 728 #ifdef TIOCHPCL 729 case TIOCHPCL: 730 #endif 731 case TIOCNXCL: 732 case TIOCSBRK: 733 case TIOCSCTTY: 734 case TIOCSDRAINWAIT: 735 case TIOCSETA: 736 case TIOCSETAF: 737 case TIOCSETAW: 738 case TIOCSETD: 739 case TIOCSPGRP: 740 case TIOCSTART: 741 case TIOCSTAT: 742 case TIOCSTI: 743 case TIOCSTOP: 744 case TIOCSWINSZ: 745 #if defined(COMPAT_43) || defined(COMPAT_SUNOS) 746 case TIOCLBIC: 747 case TIOCLBIS: 748 case TIOCLSET: 749 case TIOCSETC: 750 case OTIOCSETD: 751 case TIOCSETN: 752 case TIOCSETP: 753 case TIOCSLTC: 754 #endif 755 while (isbackground(p, tp) && !(p->p_flag & P_PPWAIT) && 756 !SIGISMEMBER(p->p_sigignore, SIGTTOU) && 757 !SIGISMEMBER(p->p_sigmask, SIGTTOU)) { 758 if (p->p_pgrp->pg_jobc == 0) 759 return (EIO); 760 pgsignal(p->p_pgrp, SIGTTOU, 1); 761 error = ttysleep(tp, &lbolt, TTOPRI | PCATCH, "ttybg1", 762 0); 763 if (error) 764 return (error); 765 } 766 break; 767 } 768 769 switch (cmd) { /* Process the ioctl. */ 770 case FIOASYNC: /* set/clear async i/o */ 771 s = spltty(); 772 if (*(int *)data) 773 SET(tp->t_state, TS_ASYNC); 774 else 775 CLR(tp->t_state, TS_ASYNC); 776 splx(s); 777 break; 778 case FIONBIO: /* set/clear non-blocking i/o */ 779 break; /* XXX: delete. */ 780 case FIONREAD: /* get # bytes to read */ 781 s = spltty(); 782 *(int *)data = ttnread(tp); 783 splx(s); 784 break; 785 786 case FIOSETOWN: 787 /* 788 * Policy -- Don't allow FIOSETOWN on someone else's 789 * controlling tty 790 */ 791 if (tp->t_session != NULL && !isctty(p, tp)) 792 return (ENOTTY); 793 794 error = fsetown(*(int *)data, &tp->t_sigio); 795 if (error) 796 return (error); 797 break; 798 case FIOGETOWN: 799 if (tp->t_session != NULL && !isctty(p, tp)) 800 return (ENOTTY); 801 *(int *)data = fgetown(tp->t_sigio); 802 break; 803 804 case TIOCEXCL: /* set exclusive use of tty */ 805 s = spltty(); 806 SET(tp->t_state, TS_XCLUDE); 807 splx(s); 808 break; 809 case TIOCFLUSH: { /* flush buffers */ 810 register int flags = *(int *)data; 811 812 if (flags == 0) 813 flags = FREAD | FWRITE; 814 else 815 flags &= FREAD | FWRITE; 816 ttyflush(tp, flags); 817 break; 818 } 819 case TIOCCONS: /* become virtual console */ 820 if (*(int *)data) { 821 if (constty && constty != tp && 822 ISSET(constty->t_state, TS_CONNECTED)) 823 return (EBUSY); 824 #ifndef UCONSOLE 825 if ((error = suser_xxx(p->p_ucred, NULL, 0)) != 0) 826 return (error); 827 #endif 828 constty = tp; 829 } else if (tp == constty) 830 constty = NULL; 831 break; 832 case TIOCDRAIN: /* wait till output drained */ 833 error = ttywait(tp); 834 if (error) 835 return (error); 836 break; 837 case TIOCGETA: { /* get termios struct */ 838 struct termios *t = (struct termios *)data; 839 840 bcopy(&tp->t_termios, t, sizeof(struct termios)); 841 break; 842 } 843 case TIOCGETD: /* get line discipline */ 844 *(int *)data = tp->t_line; 845 break; 846 case TIOCGWINSZ: /* get window size */ 847 *(struct winsize *)data = tp->t_winsize; 848 break; 849 case TIOCGPGRP: /* get pgrp of tty */ 850 if (!isctty(p, tp)) 851 return (ENOTTY); 852 *(int *)data = tp->t_pgrp ? tp->t_pgrp->pg_id : NO_PID; 853 break; 854 #ifdef TIOCHPCL 855 case TIOCHPCL: /* hang up on last close */ 856 s = spltty(); 857 SET(tp->t_cflag, HUPCL); 858 splx(s); 859 break; 860 #endif 861 case TIOCNXCL: /* reset exclusive use of tty */ 862 s = spltty(); 863 CLR(tp->t_state, TS_XCLUDE); 864 splx(s); 865 break; 866 case TIOCOUTQ: /* output queue size */ 867 *(int *)data = tp->t_outq.c_cc; 868 break; 869 case TIOCSETA: /* set termios struct */ 870 case TIOCSETAW: /* drain output, set */ 871 case TIOCSETAF: { /* drn out, fls in, set */ 872 register struct termios *t = (struct termios *)data; 873 874 if (t->c_ispeed == 0) 875 t->c_ispeed = t->c_ospeed; 876 if (t->c_ispeed == 0) 877 t->c_ispeed = tp->t_ospeed; 878 if (t->c_ispeed == 0) 879 return (EINVAL); 880 s = spltty(); 881 if (cmd == TIOCSETAW || cmd == TIOCSETAF) { 882 error = ttywait(tp); 883 if (error) { 884 splx(s); 885 return (error); 886 } 887 if (cmd == TIOCSETAF) 888 ttyflush(tp, FREAD); 889 } 890 if (!ISSET(t->c_cflag, CIGNORE)) { 891 /* 892 * Set device hardware. 893 */ 894 if (tp->t_param && (error = (*tp->t_param)(tp, t))) { 895 splx(s); 896 return (error); 897 } 898 if (ISSET(t->c_cflag, CLOCAL) && 899 !ISSET(tp->t_cflag, CLOCAL)) { 900 /* 901 * XXX disconnections would be too hard to 902 * get rid of without this kludge. The only 903 * way to get rid of controlling terminals 904 * is to exit from the session leader. 905 */ 906 CLR(tp->t_state, TS_ZOMBIE); 907 908 wakeup(TSA_CARR_ON(tp)); 909 ttwakeup(tp); 910 ttwwakeup(tp); 911 } 912 if ((ISSET(tp->t_state, TS_CARR_ON) || 913 ISSET(t->c_cflag, CLOCAL)) && 914 !ISSET(tp->t_state, TS_ZOMBIE)) 915 SET(tp->t_state, TS_CONNECTED); 916 else 917 CLR(tp->t_state, TS_CONNECTED); 918 tp->t_cflag = t->c_cflag; 919 tp->t_ispeed = t->c_ispeed; 920 if (t->c_ospeed != 0) 921 tp->t_ospeed = t->c_ospeed; 922 ttsetwater(tp); 923 } 924 if (ISSET(t->c_lflag, ICANON) != ISSET(tp->t_lflag, ICANON) && 925 cmd != TIOCSETAF) { 926 if (ISSET(t->c_lflag, ICANON)) 927 SET(tp->t_lflag, PENDIN); 928 else { 929 /* 930 * XXX we really shouldn't allow toggling 931 * ICANON while we're in a non-termios line 932 * discipline. Now we have to worry about 933 * panicing for a null queue. 934 */ 935 if (tp->t_canq.c_cbreserved > 0 && 936 tp->t_rawq.c_cbreserved > 0) { 937 catq(&tp->t_rawq, &tp->t_canq); 938 /* 939 * XXX the queue limits may be 940 * different, so the old queue 941 * swapping method no longer works. 942 */ 943 catq(&tp->t_canq, &tp->t_rawq); 944 } 945 CLR(tp->t_lflag, PENDIN); 946 } 947 ttwakeup(tp); 948 } 949 tp->t_iflag = t->c_iflag; 950 tp->t_oflag = t->c_oflag; 951 /* 952 * Make the EXTPROC bit read only. 953 */ 954 if (ISSET(tp->t_lflag, EXTPROC)) 955 SET(t->c_lflag, EXTPROC); 956 else 957 CLR(t->c_lflag, EXTPROC); 958 tp->t_lflag = t->c_lflag | ISSET(tp->t_lflag, PENDIN); 959 if (t->c_cc[VMIN] != tp->t_cc[VMIN] || 960 t->c_cc[VTIME] != tp->t_cc[VTIME]) 961 ttwakeup(tp); 962 bcopy(t->c_cc, tp->t_cc, sizeof(t->c_cc)); 963 splx(s); 964 break; 965 } 966 case TIOCSETD: { /* set line discipline */ 967 register int t = *(int *)data; 968 dev_t device = tp->t_dev; 969 970 if ((u_int)t >= nlinesw) 971 return (ENXIO); 972 if (t != tp->t_line) { 973 s = spltty(); 974 (*linesw[tp->t_line].l_close)(tp, flag); 975 error = (*linesw[t].l_open)(device, tp); 976 if (error) { 977 (void)(*linesw[tp->t_line].l_open)(device, tp); 978 splx(s); 979 return (error); 980 } 981 tp->t_line = t; 982 splx(s); 983 } 984 break; 985 } 986 case TIOCSTART: /* start output, like ^Q */ 987 s = spltty(); 988 if (ISSET(tp->t_state, TS_TTSTOP) || 989 ISSET(tp->t_lflag, FLUSHO)) { 990 CLR(tp->t_lflag, FLUSHO); 991 CLR(tp->t_state, TS_TTSTOP); 992 ttstart(tp); 993 } 994 splx(s); 995 break; 996 case TIOCSTI: /* simulate terminal input */ 997 if ((flag & FREAD) == 0 && suser_xxx(p->p_ucred, NULL, 0)) 998 return (EPERM); 999 if (!isctty(p, tp) && suser_xxx(p->p_ucred, NULL, 0)) 1000 return (EACCES); 1001 s = spltty(); 1002 (*linesw[tp->t_line].l_rint)(*(u_char *)data, tp); 1003 splx(s); 1004 break; 1005 case TIOCSTOP: /* stop output, like ^S */ 1006 s = spltty(); 1007 if (!ISSET(tp->t_state, TS_TTSTOP)) { 1008 SET(tp->t_state, TS_TTSTOP); 1009 (*tp->t_stop)(tp, 0); 1010 } 1011 splx(s); 1012 break; 1013 case TIOCSCTTY: /* become controlling tty */ 1014 /* Session ctty vnode pointer set in vnode layer. */ 1015 if (!SESS_LEADER(p) || 1016 ((p->p_session->s_ttyvp || tp->t_session) && 1017 (tp->t_session != p->p_session))) 1018 return (EPERM); 1019 tp->t_session = p->p_session; 1020 tp->t_pgrp = p->p_pgrp; 1021 p->p_session->s_ttyp = tp; 1022 p->p_flag |= P_CONTROLT; 1023 break; 1024 case TIOCSPGRP: { /* set pgrp of tty */ 1025 register struct pgrp *pgrp = pgfind(*(int *)data); 1026 1027 if (!isctty(p, tp)) 1028 return (ENOTTY); 1029 else if (pgrp == NULL || pgrp->pg_session != p->p_session) 1030 return (EPERM); 1031 tp->t_pgrp = pgrp; 1032 break; 1033 } 1034 case TIOCSTAT: /* simulate control-T */ 1035 s = spltty(); 1036 ttyinfo(tp); 1037 splx(s); 1038 break; 1039 case TIOCSWINSZ: /* set window size */ 1040 if (bcmp((caddr_t)&tp->t_winsize, data, 1041 sizeof (struct winsize))) { 1042 tp->t_winsize = *(struct winsize *)data; 1043 pgsignal(tp->t_pgrp, SIGWINCH, 1); 1044 } 1045 break; 1046 case TIOCSDRAINWAIT: 1047 error = suser_xxx(p->p_ucred, NULL, 0); 1048 if (error) 1049 return (error); 1050 tp->t_timeout = *(int *)data * hz; 1051 wakeup(TSA_OCOMPLETE(tp)); 1052 wakeup(TSA_OLOWAT(tp)); 1053 break; 1054 case TIOCGDRAINWAIT: 1055 *(int *)data = tp->t_timeout / hz; 1056 break; 1057 default: 1058 #if defined(COMPAT_43) || defined(COMPAT_SUNOS) 1059 return (ttcompat(tp, cmd, data, flag)); 1060 #else 1061 return (ENOIOCTL); 1062 #endif 1063 } 1064 return (0); 1065 } 1066 1067 int 1068 ttypoll(dev, events, td) 1069 dev_t dev; 1070 int events; 1071 struct thread *td; 1072 { 1073 int s; 1074 int revents = 0; 1075 struct tty *tp; 1076 1077 tp = dev->si_tty; 1078 if (tp == NULL) /* XXX used to return ENXIO, but that means true! */ 1079 return ((events & (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM)) 1080 | POLLHUP); 1081 1082 s = spltty(); 1083 if (events & (POLLIN | POLLRDNORM)) { 1084 if (ttnread(tp) > 0 || ISSET(tp->t_state, TS_ZOMBIE)) 1085 revents |= events & (POLLIN | POLLRDNORM); 1086 else 1087 selrecord(td, &tp->t_rsel); 1088 } 1089 if (events & (POLLOUT | POLLWRNORM)) { 1090 if ((tp->t_outq.c_cc <= tp->t_olowat && 1091 ISSET(tp->t_state, TS_CONNECTED)) 1092 || ISSET(tp->t_state, TS_ZOMBIE)) 1093 revents |= events & (POLLOUT | POLLWRNORM); 1094 else 1095 selrecord(td, &tp->t_wsel); 1096 } 1097 splx(s); 1098 return (revents); 1099 } 1100 1101 static struct filterops ttyread_filtops = 1102 { 1, NULL, filt_ttyrdetach, filt_ttyread }; 1103 static struct filterops ttywrite_filtops = 1104 { 1, NULL, filt_ttywdetach, filt_ttywrite }; 1105 1106 int 1107 ttykqfilter(dev, kn) 1108 dev_t dev; 1109 struct knote *kn; 1110 { 1111 struct tty *tp = dev->si_tty; 1112 struct klist *klist; 1113 int s; 1114 1115 switch (kn->kn_filter) { 1116 case EVFILT_READ: 1117 klist = &tp->t_rsel.si_note; 1118 kn->kn_fop = &ttyread_filtops; 1119 break; 1120 case EVFILT_WRITE: 1121 klist = &tp->t_wsel.si_note; 1122 kn->kn_fop = &ttywrite_filtops; 1123 break; 1124 default: 1125 return (1); 1126 } 1127 1128 kn->kn_hook = (caddr_t)dev; 1129 1130 s = spltty(); 1131 SLIST_INSERT_HEAD(klist, kn, kn_selnext); 1132 splx(s); 1133 1134 return (0); 1135 } 1136 1137 static void 1138 filt_ttyrdetach(struct knote *kn) 1139 { 1140 struct tty *tp = ((dev_t)kn->kn_hook)->si_tty; 1141 int s = spltty(); 1142 1143 SLIST_REMOVE(&tp->t_rsel.si_note, kn, knote, kn_selnext); 1144 splx(s); 1145 } 1146 1147 static int 1148 filt_ttyread(struct knote *kn, long hint) 1149 { 1150 struct tty *tp = ((dev_t)kn->kn_hook)->si_tty; 1151 1152 kn->kn_data = ttnread(tp); 1153 if (ISSET(tp->t_state, TS_ZOMBIE)) { 1154 kn->kn_flags |= EV_EOF; 1155 return (1); 1156 } 1157 return (kn->kn_data > 0); 1158 } 1159 1160 static void 1161 filt_ttywdetach(struct knote *kn) 1162 { 1163 struct tty *tp = ((dev_t)kn->kn_hook)->si_tty; 1164 int s = spltty(); 1165 1166 SLIST_REMOVE(&tp->t_wsel.si_note, kn, knote, kn_selnext); 1167 splx(s); 1168 } 1169 1170 static int 1171 filt_ttywrite(kn, hint) 1172 struct knote *kn; 1173 long hint; 1174 { 1175 struct tty *tp = ((dev_t)kn->kn_hook)->si_tty; 1176 1177 kn->kn_data = tp->t_outq.c_cc; 1178 if (ISSET(tp->t_state, TS_ZOMBIE)) 1179 return (1); 1180 return (kn->kn_data <= tp->t_olowat && 1181 ISSET(tp->t_state, TS_CONNECTED)); 1182 } 1183 1184 /* 1185 * Must be called at spltty(). 1186 */ 1187 static int 1188 ttnread(tp) 1189 struct tty *tp; 1190 { 1191 int nread; 1192 1193 if (ISSET(tp->t_lflag, PENDIN)) 1194 ttypend(tp); 1195 nread = tp->t_canq.c_cc; 1196 if (!ISSET(tp->t_lflag, ICANON)) { 1197 nread += tp->t_rawq.c_cc; 1198 if (nread < tp->t_cc[VMIN] && tp->t_cc[VTIME] == 0) 1199 nread = 0; 1200 } 1201 return (nread); 1202 } 1203 1204 /* 1205 * Wait for output to drain. 1206 */ 1207 int 1208 ttywait(tp) 1209 register 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_CONNECTED) && tp->t_oproc) { 1217 (*tp->t_oproc)(tp); 1218 if ((tp->t_outq.c_cc || ISSET(tp->t_state, TS_BUSY)) && 1219 ISSET(tp->t_state, TS_CONNECTED)) { 1220 SET(tp->t_state, TS_SO_OCOMPLETE); 1221 error = ttysleep(tp, TSA_OCOMPLETE(tp), 1222 TTOPRI | PCATCH, "ttywai", 1223 tp->t_timeout); 1224 if (error) { 1225 if (error == EWOULDBLOCK) 1226 error = EIO; 1227 break; 1228 } 1229 } else 1230 break; 1231 } 1232 if (!error && (tp->t_outq.c_cc || ISSET(tp->t_state, TS_BUSY))) 1233 error = EIO; 1234 splx(s); 1235 return (error); 1236 } 1237 1238 /* 1239 * Flush if successfully wait. 1240 */ 1241 static int 1242 ttywflush(tp) 1243 struct tty *tp; 1244 { 1245 int error; 1246 1247 if ((error = ttywait(tp)) == 0) 1248 ttyflush(tp, FREAD); 1249 return (error); 1250 } 1251 1252 /* 1253 * Flush tty read and/or write queues, notifying anyone waiting. 1254 */ 1255 void 1256 ttyflush(tp, rw) 1257 register struct tty *tp; 1258 int rw; 1259 { 1260 register int s; 1261 1262 s = spltty(); 1263 #if 0 1264 again: 1265 #endif 1266 if (rw & FWRITE) { 1267 FLUSHQ(&tp->t_outq); 1268 CLR(tp->t_state, TS_TTSTOP); 1269 } 1270 (*tp->t_stop)(tp, rw); 1271 if (rw & FREAD) { 1272 FLUSHQ(&tp->t_canq); 1273 FLUSHQ(&tp->t_rawq); 1274 CLR(tp->t_lflag, PENDIN); 1275 tp->t_rocount = 0; 1276 tp->t_rocol = 0; 1277 CLR(tp->t_state, TS_LOCAL); 1278 ttwakeup(tp); 1279 if (ISSET(tp->t_state, TS_TBLOCK)) { 1280 if (rw & FWRITE) 1281 FLUSHQ(&tp->t_outq); 1282 ttyunblock(tp); 1283 1284 /* 1285 * Don't let leave any state that might clobber the 1286 * next line discipline (although we should do more 1287 * to send the START char). Not clearing the state 1288 * may have caused the "putc to a clist with no 1289 * reserved cblocks" panic/printf. 1290 */ 1291 CLR(tp->t_state, TS_TBLOCK); 1292 1293 #if 0 /* forget it, sleeping isn't always safe and we don't know when it is */ 1294 if (ISSET(tp->t_iflag, IXOFF)) { 1295 /* 1296 * XXX wait a bit in the hope that the stop 1297 * character (if any) will go out. Waiting 1298 * isn't good since it allows races. This 1299 * will be fixed when the stop character is 1300 * put in a special queue. Don't bother with 1301 * the checks in ttywait() since the timeout 1302 * will save us. 1303 */ 1304 SET(tp->t_state, TS_SO_OCOMPLETE); 1305 ttysleep(tp, TSA_OCOMPLETE(tp), TTOPRI, 1306 "ttyfls", hz / 10); 1307 /* 1308 * Don't try sending the stop character again. 1309 */ 1310 CLR(tp->t_state, TS_TBLOCK); 1311 goto again; 1312 } 1313 #endif 1314 } 1315 } 1316 if (rw & FWRITE) { 1317 FLUSHQ(&tp->t_outq); 1318 ttwwakeup(tp); 1319 } 1320 splx(s); 1321 } 1322 1323 /* 1324 * Copy in the default termios characters. 1325 */ 1326 void 1327 termioschars(t) 1328 struct termios *t; 1329 { 1330 1331 bcopy(ttydefchars, t->c_cc, sizeof t->c_cc); 1332 } 1333 1334 /* 1335 * Old interface. 1336 */ 1337 void 1338 ttychars(tp) 1339 struct tty *tp; 1340 { 1341 1342 termioschars(&tp->t_termios); 1343 } 1344 1345 /* 1346 * Handle input high water. Send stop character for the IXOFF case. Turn 1347 * on our input flow control bit and propagate the changes to the driver. 1348 * XXX the stop character should be put in a special high priority queue. 1349 */ 1350 void 1351 ttyblock(tp) 1352 struct tty *tp; 1353 { 1354 1355 SET(tp->t_state, TS_TBLOCK); 1356 if (ISSET(tp->t_iflag, IXOFF) && tp->t_cc[VSTOP] != _POSIX_VDISABLE && 1357 putc(tp->t_cc[VSTOP], &tp->t_outq) != 0) 1358 CLR(tp->t_state, TS_TBLOCK); /* try again later */ 1359 ttstart(tp); 1360 } 1361 1362 /* 1363 * Handle input low water. Send start character for the IXOFF case. Turn 1364 * off our input flow control bit and propagate the changes to the driver. 1365 * XXX the start character should be put in a special high priority queue. 1366 */ 1367 static void 1368 ttyunblock(tp) 1369 struct tty *tp; 1370 { 1371 1372 CLR(tp->t_state, TS_TBLOCK); 1373 if (ISSET(tp->t_iflag, IXOFF) && tp->t_cc[VSTART] != _POSIX_VDISABLE && 1374 putc(tp->t_cc[VSTART], &tp->t_outq) != 0) 1375 SET(tp->t_state, TS_TBLOCK); /* try again later */ 1376 ttstart(tp); 1377 } 1378 1379 #ifdef notyet 1380 /* Not used by any current (i386) drivers. */ 1381 /* 1382 * Restart after an inter-char delay. 1383 */ 1384 void 1385 ttrstrt(tp_arg) 1386 void *tp_arg; 1387 { 1388 struct tty *tp; 1389 int s; 1390 1391 KASSERT(tp_arg != NULL, ("ttrstrt")); 1392 1393 tp = tp_arg; 1394 s = spltty(); 1395 1396 CLR(tp->t_state, TS_TIMEOUT); 1397 ttstart(tp); 1398 1399 splx(s); 1400 } 1401 #endif 1402 1403 int 1404 ttstart(tp) 1405 struct tty *tp; 1406 { 1407 1408 if (tp->t_oproc != NULL) /* XXX: Kludge for pty. */ 1409 (*tp->t_oproc)(tp); 1410 return (0); 1411 } 1412 1413 /* 1414 * "close" a line discipline 1415 */ 1416 int 1417 ttylclose(tp, flag) 1418 struct tty *tp; 1419 int flag; 1420 { 1421 1422 if (flag & FNONBLOCK || ttywflush(tp)) 1423 ttyflush(tp, FREAD | FWRITE); 1424 return (0); 1425 } 1426 1427 /* 1428 * Handle modem control transition on a tty. 1429 * Flag indicates new state of carrier. 1430 * Returns 0 if the line should be turned off, otherwise 1. 1431 */ 1432 int 1433 ttymodem(tp, flag) 1434 register struct tty *tp; 1435 int flag; 1436 { 1437 1438 if (ISSET(tp->t_state, TS_CARR_ON) && ISSET(tp->t_cflag, MDMBUF)) { 1439 /* 1440 * MDMBUF: do flow control according to carrier flag 1441 * XXX TS_CAR_OFLOW doesn't do anything yet. TS_TTSTOP 1442 * works if IXON and IXANY are clear. 1443 */ 1444 if (flag) { 1445 CLR(tp->t_state, TS_CAR_OFLOW); 1446 CLR(tp->t_state, TS_TTSTOP); 1447 ttstart(tp); 1448 } else if (!ISSET(tp->t_state, TS_CAR_OFLOW)) { 1449 SET(tp->t_state, TS_CAR_OFLOW); 1450 SET(tp->t_state, TS_TTSTOP); 1451 (*tp->t_stop)(tp, 0); 1452 } 1453 } else if (flag == 0) { 1454 /* 1455 * Lost carrier. 1456 */ 1457 CLR(tp->t_state, TS_CARR_ON); 1458 if (ISSET(tp->t_state, TS_ISOPEN) && 1459 !ISSET(tp->t_cflag, CLOCAL)) { 1460 SET(tp->t_state, TS_ZOMBIE); 1461 CLR(tp->t_state, TS_CONNECTED); 1462 if (tp->t_session && tp->t_session->s_leader) { 1463 struct proc *p; 1464 1465 p = tp->t_session->s_leader; 1466 PROC_LOCK(p); 1467 psignal(p, SIGHUP); 1468 PROC_UNLOCK(p); 1469 } 1470 ttyflush(tp, FREAD | FWRITE); 1471 return (0); 1472 } 1473 } else { 1474 /* 1475 * Carrier now on. 1476 */ 1477 SET(tp->t_state, TS_CARR_ON); 1478 if (!ISSET(tp->t_state, TS_ZOMBIE)) 1479 SET(tp->t_state, TS_CONNECTED); 1480 wakeup(TSA_CARR_ON(tp)); 1481 ttwakeup(tp); 1482 ttwwakeup(tp); 1483 } 1484 return (1); 1485 } 1486 1487 /* 1488 * Reinput pending characters after state switch 1489 * call at spltty(). 1490 */ 1491 static void 1492 ttypend(tp) 1493 register struct tty *tp; 1494 { 1495 struct clist tq; 1496 register int c; 1497 1498 CLR(tp->t_lflag, PENDIN); 1499 SET(tp->t_state, TS_TYPEN); 1500 /* 1501 * XXX this assumes too much about clist internals. It may even 1502 * fail if the cblock slush pool is empty. We can't allocate more 1503 * cblocks here because we are called from an interrupt handler 1504 * and clist_alloc_cblocks() can wait. 1505 */ 1506 tq = tp->t_rawq; 1507 bzero(&tp->t_rawq, sizeof tp->t_rawq); 1508 tp->t_rawq.c_cbmax = tq.c_cbmax; 1509 tp->t_rawq.c_cbreserved = tq.c_cbreserved; 1510 while ((c = getc(&tq)) >= 0) 1511 ttyinput(c, tp); 1512 CLR(tp->t_state, TS_TYPEN); 1513 } 1514 1515 /* 1516 * Process a read call on a tty device. 1517 */ 1518 int 1519 ttread(tp, uio, flag) 1520 register struct tty *tp; 1521 struct uio *uio; 1522 int flag; 1523 { 1524 register struct clist *qp; 1525 register int c; 1526 register tcflag_t lflag; 1527 register cc_t *cc = tp->t_cc; 1528 register struct proc *p = curproc; 1529 int s, first, error = 0; 1530 int has_stime = 0, last_cc = 0; 1531 long slp = 0; /* XXX this should be renamed `timo'. */ 1532 struct timeval stime; 1533 1534 loop: 1535 s = spltty(); 1536 lflag = tp->t_lflag; 1537 /* 1538 * take pending input first 1539 */ 1540 if (ISSET(lflag, PENDIN)) { 1541 ttypend(tp); 1542 splx(s); /* reduce latency */ 1543 s = spltty(); 1544 lflag = tp->t_lflag; /* XXX ttypend() clobbers it */ 1545 } 1546 1547 /* 1548 * Hang process if it's in the background. 1549 */ 1550 if (isbackground(p, tp)) { 1551 splx(s); 1552 if (SIGISMEMBER(p->p_sigignore, SIGTTIN) || 1553 SIGISMEMBER(p->p_sigmask, SIGTTIN) || 1554 (p->p_flag & P_PPWAIT) || p->p_pgrp->pg_jobc == 0) 1555 return (EIO); 1556 pgsignal(p->p_pgrp, SIGTTIN, 1); 1557 error = ttysleep(tp, &lbolt, TTIPRI | PCATCH, "ttybg2", 0); 1558 if (error) 1559 return (error); 1560 goto loop; 1561 } 1562 1563 if (ISSET(tp->t_state, TS_ZOMBIE)) { 1564 splx(s); 1565 return (0); /* EOF */ 1566 } 1567 1568 /* 1569 * If canonical, use the canonical queue, 1570 * else use the raw queue. 1571 * 1572 * (should get rid of clists...) 1573 */ 1574 qp = ISSET(lflag, ICANON) ? &tp->t_canq : &tp->t_rawq; 1575 1576 if (flag & IO_NDELAY) { 1577 if (qp->c_cc > 0) 1578 goto read; 1579 if (!ISSET(lflag, ICANON) && cc[VMIN] == 0) { 1580 splx(s); 1581 return (0); 1582 } 1583 splx(s); 1584 return (EWOULDBLOCK); 1585 } 1586 if (!ISSET(lflag, ICANON)) { 1587 int m = cc[VMIN]; 1588 long t = cc[VTIME]; 1589 struct timeval timecopy; 1590 1591 /* 1592 * Check each of the four combinations. 1593 * (m > 0 && t == 0) is the normal read case. 1594 * It should be fairly efficient, so we check that and its 1595 * companion case (m == 0 && t == 0) first. 1596 * For the other two cases, we compute the target sleep time 1597 * into slp. 1598 */ 1599 if (t == 0) { 1600 if (qp->c_cc < m) 1601 goto sleep; 1602 if (qp->c_cc > 0) 1603 goto read; 1604 1605 /* m, t and qp->c_cc are all 0. 0 is enough input. */ 1606 splx(s); 1607 return (0); 1608 } 1609 t *= 100000; /* time in us */ 1610 #define diff(t1, t2) (((t1).tv_sec - (t2).tv_sec) * 1000000 + \ 1611 ((t1).tv_usec - (t2).tv_usec)) 1612 if (m > 0) { 1613 if (qp->c_cc <= 0) 1614 goto sleep; 1615 if (qp->c_cc >= m) 1616 goto read; 1617 getmicrotime(&timecopy); 1618 if (!has_stime) { 1619 /* first character, start timer */ 1620 has_stime = 1; 1621 stime = timecopy; 1622 slp = t; 1623 } else if (qp->c_cc > last_cc) { 1624 /* got a character, restart timer */ 1625 stime = timecopy; 1626 slp = t; 1627 } else { 1628 /* nothing, check expiration */ 1629 slp = t - diff(timecopy, stime); 1630 if (slp <= 0) 1631 goto read; 1632 } 1633 last_cc = qp->c_cc; 1634 } else { /* m == 0 */ 1635 if (qp->c_cc > 0) 1636 goto read; 1637 getmicrotime(&timecopy); 1638 if (!has_stime) { 1639 has_stime = 1; 1640 stime = timecopy; 1641 slp = t; 1642 } else { 1643 slp = t - diff(timecopy, stime); 1644 if (slp <= 0) { 1645 /* Timed out, but 0 is enough input. */ 1646 splx(s); 1647 return (0); 1648 } 1649 } 1650 } 1651 #undef diff 1652 /* 1653 * Rounding down may make us wake up just short 1654 * of the target, so we round up. 1655 * The formula is ceiling(slp * hz/1000000). 1656 * 32-bit arithmetic is enough for hz < 169. 1657 * XXX see tvtohz() for how to avoid overflow if hz 1658 * is large (divide by `tick' and/or arrange to 1659 * use tvtohz() if hz is large). 1660 */ 1661 slp = (long) (((u_long)slp * hz) + 999999) / 1000000; 1662 goto sleep; 1663 } 1664 if (qp->c_cc <= 0) { 1665 sleep: 1666 /* 1667 * There is no input, or not enough input and we can block. 1668 */ 1669 error = ttysleep(tp, TSA_HUP_OR_INPUT(tp), TTIPRI | PCATCH, 1670 ISSET(tp->t_state, TS_CONNECTED) ? 1671 "ttyin" : "ttyhup", (int)slp); 1672 splx(s); 1673 if (error == EWOULDBLOCK) 1674 error = 0; 1675 else if (error) 1676 return (error); 1677 /* 1678 * XXX what happens if another process eats some input 1679 * while we are asleep (not just here)? It would be 1680 * safest to detect changes and reset our state variables 1681 * (has_stime and last_cc). 1682 */ 1683 slp = 0; 1684 goto loop; 1685 } 1686 read: 1687 splx(s); 1688 /* 1689 * Input present, check for input mapping and processing. 1690 */ 1691 first = 1; 1692 if (ISSET(lflag, ICANON | ISIG)) 1693 goto slowcase; 1694 for (;;) { 1695 char ibuf[IBUFSIZ]; 1696 int icc; 1697 1698 icc = imin(uio->uio_resid, IBUFSIZ); 1699 icc = q_to_b(qp, ibuf, icc); 1700 if (icc <= 0) { 1701 if (first) 1702 goto loop; 1703 break; 1704 } 1705 error = uiomove(ibuf, icc, uio); 1706 /* 1707 * XXX if there was an error then we should ungetc() the 1708 * unmoved chars and reduce icc here. 1709 */ 1710 if (error) 1711 break; 1712 if (uio->uio_resid == 0) 1713 break; 1714 first = 0; 1715 } 1716 goto out; 1717 slowcase: 1718 for (;;) { 1719 c = getc(qp); 1720 if (c < 0) { 1721 if (first) 1722 goto loop; 1723 break; 1724 } 1725 /* 1726 * delayed suspend (^Y) 1727 */ 1728 if (CCEQ(cc[VDSUSP], c) && 1729 ISSET(lflag, IEXTEN | ISIG) == (IEXTEN | ISIG)) { 1730 pgsignal(tp->t_pgrp, SIGTSTP, 1); 1731 if (first) { 1732 error = ttysleep(tp, &lbolt, TTIPRI | PCATCH, 1733 "ttybg3", 0); 1734 if (error) 1735 break; 1736 goto loop; 1737 } 1738 break; 1739 } 1740 /* 1741 * Interpret EOF only in canonical mode. 1742 */ 1743 if (CCEQ(cc[VEOF], c) && ISSET(lflag, ICANON)) 1744 break; 1745 /* 1746 * Give user character. 1747 */ 1748 error = ureadc(c, uio); 1749 if (error) 1750 /* XXX should ungetc(c, qp). */ 1751 break; 1752 if (uio->uio_resid == 0) 1753 break; 1754 /* 1755 * In canonical mode check for a "break character" 1756 * marking the end of a "line of input". 1757 */ 1758 if (ISSET(lflag, ICANON) && TTBREAKC(c, lflag)) 1759 break; 1760 first = 0; 1761 } 1762 1763 out: 1764 /* 1765 * Look to unblock input now that (presumably) 1766 * the input queue has gone down. 1767 */ 1768 s = spltty(); 1769 if (ISSET(tp->t_state, TS_TBLOCK) && 1770 tp->t_rawq.c_cc + tp->t_canq.c_cc <= tp->t_ilowat) 1771 ttyunblock(tp); 1772 splx(s); 1773 1774 return (error); 1775 } 1776 1777 /* 1778 * Check the output queue on tp for space for a kernel message (from uprintf 1779 * or tprintf). Allow some space over the normal hiwater mark so we don't 1780 * lose messages due to normal flow control, but don't let the tty run amok. 1781 * Sleeps here are not interruptible, but we return prematurely if new signals 1782 * arrive. 1783 */ 1784 int 1785 ttycheckoutq(tp, wait) 1786 register struct tty *tp; 1787 int wait; 1788 { 1789 int hiwat, s; 1790 sigset_t oldmask; 1791 1792 hiwat = tp->t_ohiwat; 1793 SIGEMPTYSET(oldmask); 1794 s = spltty(); 1795 if (wait) 1796 oldmask = curproc->p_siglist; 1797 if (tp->t_outq.c_cc > hiwat + OBUFSIZ + 100) 1798 while (tp->t_outq.c_cc > hiwat) { 1799 ttstart(tp); 1800 if (tp->t_outq.c_cc <= hiwat) 1801 break; 1802 if (!(wait && SIGSETEQ(curproc->p_siglist, oldmask))) { 1803 splx(s); 1804 return (0); 1805 } 1806 SET(tp->t_state, TS_SO_OLOWAT); 1807 tsleep(TSA_OLOWAT(tp), PZERO - 1, "ttoutq", hz); 1808 } 1809 splx(s); 1810 return (1); 1811 } 1812 1813 /* 1814 * Process a write call on a tty device. 1815 */ 1816 int 1817 ttwrite(tp, uio, flag) 1818 register struct tty *tp; 1819 register struct uio *uio; 1820 int flag; 1821 { 1822 register char *cp = NULL; 1823 register int cc, ce; 1824 register struct proc *p; 1825 int i, hiwat, cnt, error, s; 1826 char obuf[OBUFSIZ]; 1827 1828 hiwat = tp->t_ohiwat; 1829 cnt = uio->uio_resid; 1830 error = 0; 1831 cc = 0; 1832 loop: 1833 s = spltty(); 1834 if (ISSET(tp->t_state, TS_ZOMBIE)) { 1835 splx(s); 1836 if (uio->uio_resid == cnt) 1837 error = EIO; 1838 goto out; 1839 } 1840 if (!ISSET(tp->t_state, TS_CONNECTED)) { 1841 if (flag & IO_NDELAY) { 1842 splx(s); 1843 error = EWOULDBLOCK; 1844 goto out; 1845 } 1846 error = ttysleep(tp, TSA_CARR_ON(tp), TTIPRI | PCATCH, 1847 "ttydcd", 0); 1848 splx(s); 1849 if (error) 1850 goto out; 1851 goto loop; 1852 } 1853 splx(s); 1854 /* 1855 * Hang the process if it's in the background. 1856 */ 1857 p = curproc; 1858 if (isbackground(p, tp) && 1859 ISSET(tp->t_lflag, TOSTOP) && !(p->p_flag & P_PPWAIT) && 1860 !SIGISMEMBER(p->p_sigignore, SIGTTOU) && 1861 !SIGISMEMBER(p->p_sigmask, SIGTTOU)) { 1862 if (p->p_pgrp->pg_jobc == 0) { 1863 error = EIO; 1864 goto out; 1865 } 1866 pgsignal(p->p_pgrp, SIGTTOU, 1); 1867 error = ttysleep(tp, &lbolt, TTIPRI | PCATCH, "ttybg4", 0); 1868 if (error) 1869 goto out; 1870 goto loop; 1871 } 1872 /* 1873 * Process the user's data in at most OBUFSIZ chunks. Perform any 1874 * output translation. Keep track of high water mark, sleep on 1875 * overflow awaiting device aid in acquiring new space. 1876 */ 1877 while (uio->uio_resid > 0 || cc > 0) { 1878 if (ISSET(tp->t_lflag, FLUSHO)) { 1879 uio->uio_resid = 0; 1880 return (0); 1881 } 1882 if (tp->t_outq.c_cc > hiwat) 1883 goto ovhiwat; 1884 /* 1885 * Grab a hunk of data from the user, unless we have some 1886 * leftover from last time. 1887 */ 1888 if (cc == 0) { 1889 cc = imin(uio->uio_resid, OBUFSIZ); 1890 cp = obuf; 1891 error = uiomove(cp, cc, uio); 1892 if (error) { 1893 cc = 0; 1894 break; 1895 } 1896 } 1897 /* 1898 * If nothing fancy need be done, grab those characters we 1899 * can handle without any of ttyoutput's processing and 1900 * just transfer them to the output q. For those chars 1901 * which require special processing (as indicated by the 1902 * bits in char_type), call ttyoutput. After processing 1903 * a hunk of data, look for FLUSHO so ^O's will take effect 1904 * immediately. 1905 */ 1906 while (cc > 0) { 1907 if (!ISSET(tp->t_oflag, OPOST)) 1908 ce = cc; 1909 else { 1910 ce = cc - scanc((u_int)cc, (u_char *)cp, 1911 char_type, CCLASSMASK); 1912 /* 1913 * If ce is zero, then we're processing 1914 * a special character through ttyoutput. 1915 */ 1916 if (ce == 0) { 1917 tp->t_rocount = 0; 1918 if (ttyoutput(*cp, tp) >= 0) { 1919 /* No Clists, wait a bit. */ 1920 ttstart(tp); 1921 if (flag & IO_NDELAY) { 1922 error = EWOULDBLOCK; 1923 goto out; 1924 } 1925 error = ttysleep(tp, &lbolt, 1926 TTOPRI|PCATCH, 1927 "ttybf1", 0); 1928 if (error) 1929 goto out; 1930 goto loop; 1931 } 1932 cp++; 1933 cc--; 1934 if (ISSET(tp->t_lflag, FLUSHO) || 1935 tp->t_outq.c_cc > hiwat) 1936 goto ovhiwat; 1937 continue; 1938 } 1939 } 1940 /* 1941 * A bunch of normal characters have been found. 1942 * Transfer them en masse to the output queue and 1943 * continue processing at the top of the loop. 1944 * If there are any further characters in this 1945 * <= OBUFSIZ chunk, the first should be a character 1946 * requiring special handling by ttyoutput. 1947 */ 1948 tp->t_rocount = 0; 1949 i = b_to_q(cp, ce, &tp->t_outq); 1950 ce -= i; 1951 tp->t_column += ce; 1952 cp += ce, cc -= ce, tk_nout += ce; 1953 tp->t_outcc += ce; 1954 if (i > 0) { 1955 /* No Clists, wait a bit. */ 1956 ttstart(tp); 1957 if (flag & IO_NDELAY) { 1958 error = EWOULDBLOCK; 1959 goto out; 1960 } 1961 error = ttysleep(tp, &lbolt, TTOPRI | PCATCH, 1962 "ttybf2", 0); 1963 if (error) 1964 goto out; 1965 goto loop; 1966 } 1967 if (ISSET(tp->t_lflag, FLUSHO) || 1968 tp->t_outq.c_cc > hiwat) 1969 break; 1970 } 1971 ttstart(tp); 1972 } 1973 out: 1974 /* 1975 * If cc is nonzero, we leave the uio structure inconsistent, as the 1976 * offset and iov pointers have moved forward, but it doesn't matter 1977 * (the call will either return short or restart with a new uio). 1978 */ 1979 uio->uio_resid += cc; 1980 return (error); 1981 1982 ovhiwat: 1983 ttstart(tp); 1984 s = spltty(); 1985 /* 1986 * This can only occur if FLUSHO is set in t_lflag, 1987 * or if ttstart/oproc is synchronous (or very fast). 1988 */ 1989 if (tp->t_outq.c_cc <= hiwat) { 1990 splx(s); 1991 goto loop; 1992 } 1993 if (flag & IO_NDELAY) { 1994 splx(s); 1995 uio->uio_resid += cc; 1996 return (uio->uio_resid == cnt ? EWOULDBLOCK : 0); 1997 } 1998 SET(tp->t_state, TS_SO_OLOWAT); 1999 error = ttysleep(tp, TSA_OLOWAT(tp), TTOPRI | PCATCH, "ttywri", 2000 tp->t_timeout); 2001 splx(s); 2002 if (error == EWOULDBLOCK) 2003 error = EIO; 2004 if (error) 2005 goto out; 2006 goto loop; 2007 } 2008 2009 /* 2010 * Rubout one character from the rawq of tp 2011 * as cleanly as possible. 2012 */ 2013 static void 2014 ttyrub(c, tp) 2015 register int c; 2016 register struct tty *tp; 2017 { 2018 register char *cp; 2019 register int savecol; 2020 int tabc, s; 2021 2022 if (!ISSET(tp->t_lflag, ECHO) || ISSET(tp->t_lflag, EXTPROC)) 2023 return; 2024 CLR(tp->t_lflag, FLUSHO); 2025 if (ISSET(tp->t_lflag, ECHOE)) { 2026 if (tp->t_rocount == 0) { 2027 /* 2028 * Screwed by ttwrite; retype 2029 */ 2030 ttyretype(tp); 2031 return; 2032 } 2033 if (c == ('\t' | TTY_QUOTE) || c == ('\n' | TTY_QUOTE)) 2034 ttyrubo(tp, 2); 2035 else { 2036 CLR(c, ~TTY_CHARMASK); 2037 switch (CCLASS(c)) { 2038 case ORDINARY: 2039 ttyrubo(tp, 1); 2040 break; 2041 case BACKSPACE: 2042 case CONTROL: 2043 case NEWLINE: 2044 case RETURN: 2045 case VTAB: 2046 if (ISSET(tp->t_lflag, ECHOCTL)) 2047 ttyrubo(tp, 2); 2048 break; 2049 case TAB: 2050 if (tp->t_rocount < tp->t_rawq.c_cc) { 2051 ttyretype(tp); 2052 return; 2053 } 2054 s = spltty(); 2055 savecol = tp->t_column; 2056 SET(tp->t_state, TS_CNTTB); 2057 SET(tp->t_lflag, FLUSHO); 2058 tp->t_column = tp->t_rocol; 2059 cp = tp->t_rawq.c_cf; 2060 if (cp) 2061 tabc = *cp; /* XXX FIX NEXTC */ 2062 for (; cp; cp = nextc(&tp->t_rawq, cp, &tabc)) 2063 ttyecho(tabc, tp); 2064 CLR(tp->t_lflag, FLUSHO); 2065 CLR(tp->t_state, TS_CNTTB); 2066 splx(s); 2067 2068 /* savecol will now be length of the tab. */ 2069 savecol -= tp->t_column; 2070 tp->t_column += savecol; 2071 if (savecol > 8) 2072 savecol = 8; /* overflow screw */ 2073 while (--savecol >= 0) 2074 (void)ttyoutput('\b', tp); 2075 break; 2076 default: /* XXX */ 2077 #define PANICSTR "ttyrub: would panic c = %d, val = %d\n" 2078 (void)printf(PANICSTR, c, CCLASS(c)); 2079 #ifdef notdef 2080 panic(PANICSTR, c, CCLASS(c)); 2081 #endif 2082 } 2083 } 2084 } else if (ISSET(tp->t_lflag, ECHOPRT)) { 2085 if (!ISSET(tp->t_state, TS_ERASE)) { 2086 SET(tp->t_state, TS_ERASE); 2087 (void)ttyoutput('\\', tp); 2088 } 2089 ttyecho(c, tp); 2090 } else { 2091 ttyecho(tp->t_cc[VERASE], tp); 2092 /* 2093 * This code may be executed not only when an ERASE key 2094 * is pressed, but also when ^U (KILL) or ^W (WERASE) are. 2095 * So, I didn't think it was worthwhile to pass the extra 2096 * information (which would need an extra parameter, 2097 * changing every call) needed to distinguish the ERASE2 2098 * case from the ERASE. 2099 */ 2100 } 2101 --tp->t_rocount; 2102 } 2103 2104 /* 2105 * Back over cnt characters, erasing them. 2106 */ 2107 static void 2108 ttyrubo(tp, cnt) 2109 register struct tty *tp; 2110 int cnt; 2111 { 2112 2113 while (cnt-- > 0) { 2114 (void)ttyoutput('\b', tp); 2115 (void)ttyoutput(' ', tp); 2116 (void)ttyoutput('\b', tp); 2117 } 2118 } 2119 2120 /* 2121 * ttyretype -- 2122 * Reprint the rawq line. Note, it is assumed that c_cc has already 2123 * been checked. 2124 */ 2125 static void 2126 ttyretype(tp) 2127 register struct tty *tp; 2128 { 2129 register char *cp; 2130 int s, c; 2131 2132 /* Echo the reprint character. */ 2133 if (tp->t_cc[VREPRINT] != _POSIX_VDISABLE) 2134 ttyecho(tp->t_cc[VREPRINT], tp); 2135 2136 (void)ttyoutput('\n', tp); 2137 2138 /* 2139 * XXX 2140 * FIX: NEXTC IS BROKEN - DOESN'T CHECK QUOTE 2141 * BIT OF FIRST CHAR. 2142 */ 2143 s = spltty(); 2144 for (cp = tp->t_canq.c_cf, c = (cp != NULL ? *cp : 0); 2145 cp != NULL; cp = nextc(&tp->t_canq, cp, &c)) 2146 ttyecho(c, tp); 2147 for (cp = tp->t_rawq.c_cf, c = (cp != NULL ? *cp : 0); 2148 cp != NULL; cp = nextc(&tp->t_rawq, cp, &c)) 2149 ttyecho(c, tp); 2150 CLR(tp->t_state, TS_ERASE); 2151 splx(s); 2152 2153 tp->t_rocount = tp->t_rawq.c_cc; 2154 tp->t_rocol = 0; 2155 } 2156 2157 /* 2158 * Echo a typed character to the terminal. 2159 */ 2160 static void 2161 ttyecho(c, tp) 2162 register int c; 2163 register struct tty *tp; 2164 { 2165 2166 if (!ISSET(tp->t_state, TS_CNTTB)) 2167 CLR(tp->t_lflag, FLUSHO); 2168 if ((!ISSET(tp->t_lflag, ECHO) && 2169 (c != '\n' || !ISSET(tp->t_lflag, ECHONL))) || 2170 ISSET(tp->t_lflag, EXTPROC)) 2171 return; 2172 if (ISSET(tp->t_lflag, ECHOCTL) && 2173 ((ISSET(c, TTY_CHARMASK) <= 037 && c != '\t' && c != '\n') || 2174 ISSET(c, TTY_CHARMASK) == 0177)) { 2175 (void)ttyoutput('^', tp); 2176 CLR(c, ~TTY_CHARMASK); 2177 if (c == 0177) 2178 c = '?'; 2179 else 2180 c += 'A' - 1; 2181 } 2182 (void)ttyoutput(c, tp); 2183 } 2184 2185 /* 2186 * Wake up any readers on a tty. 2187 */ 2188 void 2189 ttwakeup(tp) 2190 register struct tty *tp; 2191 { 2192 2193 if (tp->t_rsel.si_pid != 0) 2194 selwakeup(&tp->t_rsel); 2195 if (ISSET(tp->t_state, TS_ASYNC) && tp->t_sigio != NULL) 2196 pgsigio(tp->t_sigio, SIGIO, (tp->t_session != NULL)); 2197 wakeup(TSA_HUP_OR_INPUT(tp)); 2198 KNOTE(&tp->t_rsel.si_note, 0); 2199 } 2200 2201 /* 2202 * Wake up any writers on a tty. 2203 */ 2204 void 2205 ttwwakeup(tp) 2206 register struct tty *tp; 2207 { 2208 2209 if (tp->t_wsel.si_pid != 0 && tp->t_outq.c_cc <= tp->t_olowat) 2210 selwakeup(&tp->t_wsel); 2211 if (ISSET(tp->t_state, TS_ASYNC) && tp->t_sigio != NULL) 2212 pgsigio(tp->t_sigio, SIGIO, (tp->t_session != NULL)); 2213 if (ISSET(tp->t_state, TS_BUSY | TS_SO_OCOMPLETE) == 2214 TS_SO_OCOMPLETE && tp->t_outq.c_cc == 0) { 2215 CLR(tp->t_state, TS_SO_OCOMPLETE); 2216 wakeup(TSA_OCOMPLETE(tp)); 2217 } 2218 if (ISSET(tp->t_state, TS_SO_OLOWAT) && 2219 tp->t_outq.c_cc <= tp->t_olowat) { 2220 CLR(tp->t_state, TS_SO_OLOWAT); 2221 wakeup(TSA_OLOWAT(tp)); 2222 } 2223 KNOTE(&tp->t_wsel.si_note, 0); 2224 } 2225 2226 /* 2227 * Look up a code for a specified speed in a conversion table; 2228 * used by drivers to map software speed values to hardware parameters. 2229 */ 2230 int 2231 ttspeedtab(speed, table) 2232 int speed; 2233 register struct speedtab *table; 2234 { 2235 2236 for ( ; table->sp_speed != -1; table++) 2237 if (table->sp_speed == speed) 2238 return (table->sp_code); 2239 return (-1); 2240 } 2241 2242 /* 2243 * Set input and output watermarks and buffer sizes. For input, the 2244 * high watermark is about one second's worth of input above empty, the 2245 * low watermark is slightly below high water, and the buffer size is a 2246 * driver-dependent amount above high water. For output, the watermarks 2247 * are near the ends of the buffer, with about 1 second's worth of input 2248 * between them. All this only applies to the standard line discipline. 2249 */ 2250 void 2251 ttsetwater(tp) 2252 struct tty *tp; 2253 { 2254 register int cps, ttmaxhiwat, x; 2255 2256 /* Input. */ 2257 clist_alloc_cblocks(&tp->t_canq, TTYHOG, 512); 2258 switch (tp->t_ispeedwat) { 2259 case (speed_t)-1: 2260 cps = tp->t_ispeed / 10; 2261 break; 2262 case 0: 2263 /* 2264 * This case is for old drivers that don't know about 2265 * t_ispeedwat. Arrange for them to get the old buffer 2266 * sizes and watermarks. 2267 */ 2268 cps = TTYHOG - 2 * 256; 2269 tp->t_ififosize = 2 * 256; 2270 break; 2271 default: 2272 cps = tp->t_ispeedwat / 10; 2273 break; 2274 } 2275 tp->t_ihiwat = cps; 2276 tp->t_ilowat = 7 * cps / 8; 2277 x = cps + tp->t_ififosize; 2278 clist_alloc_cblocks(&tp->t_rawq, x, x); 2279 2280 /* Output. */ 2281 switch (tp->t_ospeedwat) { 2282 case (speed_t)-1: 2283 cps = tp->t_ospeed / 10; 2284 ttmaxhiwat = 2 * TTMAXHIWAT; 2285 break; 2286 case 0: 2287 cps = tp->t_ospeed / 10; 2288 ttmaxhiwat = TTMAXHIWAT; 2289 break; 2290 default: 2291 cps = tp->t_ospeedwat / 10; 2292 ttmaxhiwat = 8 * TTMAXHIWAT; 2293 break; 2294 } 2295 #define CLAMP(x, h, l) ((x) > h ? h : ((x) < l) ? l : (x)) 2296 tp->t_olowat = x = CLAMP(cps / 2, TTMAXLOWAT, TTMINLOWAT); 2297 x += cps; 2298 x = CLAMP(x, ttmaxhiwat, TTMINHIWAT); /* XXX clamps are too magic */ 2299 tp->t_ohiwat = roundup(x, CBSIZE); /* XXX for compat */ 2300 x = imax(tp->t_ohiwat, TTMAXHIWAT); /* XXX for compat/safety */ 2301 x += OBUFSIZ + 100; 2302 clist_alloc_cblocks(&tp->t_outq, x, x); 2303 #undef CLAMP 2304 } 2305 2306 /* 2307 * Report on state of foreground process group. 2308 */ 2309 void 2310 ttyinfo(tp) 2311 register struct tty *tp; 2312 { 2313 register struct proc *p, *pick; 2314 struct timeval utime, stime; 2315 const char *stmp; 2316 long ltmp; 2317 int tmp; 2318 struct thread *td; 2319 2320 if (ttycheckoutq(tp,0) == 0) 2321 return; 2322 2323 /* Print load average. */ 2324 tmp = (averunnable.ldavg[0] * 100 + FSCALE / 2) >> FSHIFT; 2325 ttyprintf(tp, "load: %d.%02d ", tmp / 100, tmp % 100); 2326 2327 if (tp->t_session == NULL) 2328 ttyprintf(tp, "not a controlling terminal\n"); 2329 else if (tp->t_pgrp == NULL) 2330 ttyprintf(tp, "no foreground process group\n"); 2331 else if ((p = LIST_FIRST(&tp->t_pgrp->pg_members)) == 0) 2332 ttyprintf(tp, "empty foreground process group\n"); 2333 else { 2334 mtx_lock_spin(&sched_lock); 2335 2336 /* Pick interesting process. */ 2337 for (pick = NULL; p != 0; p = LIST_NEXT(p, p_pglist)) 2338 if (proc_compare(pick, p)) 2339 pick = p; 2340 2341 td = FIRST_THREAD_IN_PROC(pick); 2342 stmp = pick->p_stat == SRUN ? "running" : /* XXXKSE */ 2343 td->td_wmesg ? td->td_wmesg : "iowait"; 2344 calcru(pick, &utime, &stime, NULL); 2345 ltmp = pick->p_stat == SIDL || pick->p_stat == SWAIT || 2346 pick->p_stat == SZOMB ? 0 : 2347 pgtok(vmspace_resident_count(pick->p_vmspace)); 2348 mtx_unlock_spin(&sched_lock); 2349 2350 ttyprintf(tp, " cmd: %s %d [%s] ", pick->p_comm, pick->p_pid, 2351 stmp); 2352 2353 /* Print user time. */ 2354 ttyprintf(tp, "%ld.%02ldu ", 2355 (long)utime.tv_sec, utime.tv_usec / 10000); 2356 2357 /* Print system time. */ 2358 ttyprintf(tp, "%ld.%02lds ", 2359 (long)stime.tv_sec, stime.tv_usec / 10000); 2360 2361 /* Print percentage cpu, resident set size. */ 2362 ttyprintf(tp, "%d%% %ldk\n", tmp / 100, ltmp); 2363 } 2364 tp->t_rocount = 0; /* so pending input will be retyped if BS */ 2365 } 2366 2367 /* 2368 * Returns 1 if p2 is "better" than p1 2369 * 2370 * The algorithm for picking the "interesting" process is thus: 2371 * 2372 * 1) Only foreground processes are eligible - implied. 2373 * 2) Runnable processes are favored over anything else. The runner 2374 * with the highest cpu utilization is picked (p_estcpu). Ties are 2375 * broken by picking the highest pid. 2376 * 3) The sleeper with the shortest sleep time is next. With ties, 2377 * we pick out just "short-term" sleepers (P_SINTR == 0). 2378 * 4) Further ties are broken by picking the highest pid. 2379 */ 2380 #define ISRUN(p) (((p)->p_stat == SRUN) || ((p)->p_stat == SIDL)) 2381 #define TESTAB(a, b) ((a)<<1 | (b)) 2382 #define ONLYA 2 2383 #define ONLYB 1 2384 #define BOTH 3 2385 2386 static int 2387 proc_compare(p1, p2) 2388 register struct proc *p1, *p2; 2389 { 2390 2391 int esta, estb; 2392 struct ksegrp *kg; 2393 mtx_assert(&sched_lock, MA_OWNED); 2394 if (p1 == NULL) 2395 return (1); 2396 2397 /* 2398 * see if at least one of them is runnable 2399 */ 2400 switch (TESTAB(ISRUN(p1), ISRUN(p2))) { 2401 case ONLYA: 2402 return (0); 2403 case ONLYB: 2404 return (1); 2405 case BOTH: 2406 /* 2407 * tie - favor one with highest recent cpu utilization 2408 */ 2409 esta = estb = 0; 2410 FOREACH_KSEGRP_IN_PROC(p1,kg) { 2411 esta += kg->kg_estcpu; 2412 } 2413 FOREACH_KSEGRP_IN_PROC(p2,kg) { 2414 estb += kg->kg_estcpu; 2415 } 2416 if (estb > esta) 2417 return (1); 2418 if (esta > estb) 2419 return (0); 2420 return (p2->p_pid > p1->p_pid); /* tie - return highest pid */ 2421 } 2422 /* 2423 * weed out zombies 2424 */ 2425 switch (TESTAB(p1->p_stat == SZOMB, p2->p_stat == SZOMB)) { 2426 case ONLYA: 2427 return (1); 2428 case ONLYB: 2429 return (0); 2430 case BOTH: 2431 return (p2->p_pid > p1->p_pid); /* tie - return highest pid */ 2432 } 2433 2434 #if 0 /* XXXKSE */ 2435 /* 2436 * pick the one with the smallest sleep time 2437 */ 2438 if (p2->p_slptime > p1->p_slptime) 2439 return (0); 2440 if (p1->p_slptime > p2->p_slptime) 2441 return (1); 2442 /* 2443 * favor one sleeping in a non-interruptible sleep 2444 */ 2445 if (p1->p_sflag & PS_SINTR && (p2->p_sflag & PS_SINTR) == 0) 2446 return (1); 2447 if (p2->p_sflag & PS_SINTR && (p1->p_sflag & PS_SINTR) == 0) 2448 return (0); 2449 #endif 2450 return (p2->p_pid > p1->p_pid); /* tie - return highest pid */ 2451 } 2452 2453 /* 2454 * Output char to tty; console putchar style. 2455 */ 2456 int 2457 tputchar(c, tp) 2458 int c; 2459 struct tty *tp; 2460 { 2461 register int s; 2462 2463 s = spltty(); 2464 if (!ISSET(tp->t_state, TS_CONNECTED)) { 2465 splx(s); 2466 return (-1); 2467 } 2468 if (c == '\n') 2469 (void)ttyoutput('\r', tp); 2470 (void)ttyoutput(c, tp); 2471 ttstart(tp); 2472 splx(s); 2473 return (0); 2474 } 2475 2476 /* 2477 * Sleep on chan, returning ERESTART if tty changed while we napped and 2478 * returning any errors (e.g. EINTR/EWOULDBLOCK) reported by tsleep. If 2479 * the tty is revoked, restarting a pending call will redo validation done 2480 * at the start of the call. 2481 */ 2482 int 2483 ttysleep(tp, chan, pri, wmesg, timo) 2484 struct tty *tp; 2485 void *chan; 2486 int pri, timo; 2487 char *wmesg; 2488 { 2489 int error; 2490 int gen; 2491 2492 gen = tp->t_gen; 2493 error = tsleep(chan, pri, wmesg, timo); 2494 if (error) 2495 return (error); 2496 return (tp->t_gen == gen ? 0 : ERESTART); 2497 } 2498 2499 /* 2500 * Allocate a tty struct. Clists in the struct will be allocated by 2501 * ttyopen(). 2502 */ 2503 struct tty * 2504 ttymalloc(tp) 2505 struct tty *tp; 2506 { 2507 2508 if (tp) 2509 return(tp); 2510 tp = malloc(sizeof *tp, M_TTYS, M_WAITOK | M_ZERO); 2511 ttyregister(tp); 2512 return (tp); 2513 } 2514 2515 #if 0 /* XXX not yet usable: session leader holds a ref (see kern_exit.c). */ 2516 /* 2517 * Free a tty struct. Clists in the struct should have been freed by 2518 * ttyclose(). 2519 */ 2520 void 2521 ttyfree(tp) 2522 struct tty *tp; 2523 { 2524 free(tp, M_TTYS); 2525 } 2526 #endif /* 0 */ 2527 2528 void 2529 ttyregister(tp) 2530 struct tty *tp; 2531 { 2532 tp->t_timeout = -1; 2533 SLIST_INSERT_HEAD(&tty_list, tp, t_list); 2534 } 2535 2536 static int 2537 sysctl_kern_ttys(SYSCTL_HANDLER_ARGS) 2538 { 2539 int error; 2540 struct tty *tp, t; 2541 SLIST_FOREACH(tp, &tty_list, t_list) { 2542 t = *tp; 2543 if (t.t_dev) 2544 t.ttyu.t_udev = dev2udev(t.t_dev); 2545 error = SYSCTL_OUT(req, (caddr_t)&t, sizeof(t)); 2546 if (error) 2547 return (error); 2548 } 2549 return (0); 2550 } 2551 2552 SYSCTL_PROC(_kern, OID_AUTO, ttys, CTLTYPE_OPAQUE|CTLFLAG_RD, 2553 0, 0, sysctl_kern_ttys, "S,tty", "All struct ttys"); 2554 SYSCTL_LONG(_kern, OID_AUTO, tty_nin, CTLFLAG_RD, 2555 &tk_nin, 0, "Total TTY in characters"); 2556 SYSCTL_LONG(_kern, OID_AUTO, tty_nout, CTLFLAG_RD, 2557 &tk_nout, 0, "Total TTY out characters"); 2558 2559 void 2560 nottystop(tp, rw) 2561 struct tty *tp; 2562 int rw; 2563 { 2564 2565 return; 2566 } 2567 2568 int 2569 ttyread(dev, uio, flag) 2570 dev_t dev; 2571 struct uio *uio; 2572 int flag; 2573 { 2574 struct tty *tp; 2575 2576 tp = dev->si_tty; 2577 if (tp == NULL) 2578 return (ENODEV); 2579 return ((*linesw[tp->t_line].l_read)(tp, uio, flag)); 2580 } 2581 2582 int 2583 ttywrite(dev, uio, flag) 2584 dev_t dev; 2585 struct uio *uio; 2586 int flag; 2587 { 2588 struct tty *tp; 2589 2590 tp = dev->si_tty; 2591 if (tp == NULL) 2592 return (ENODEV); 2593 return ((*linesw[tp->t_line].l_write)(tp, uio, flag)); 2594 } 2595