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