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