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