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