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