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