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