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