diff options
| -rw-r--r-- | sys/dev/syscons/syscons.c | 5 | ||||
| -rw-r--r-- | sys/gnu/isdn/iitty.c | 20 | ||||
| -rw-r--r-- | sys/i386/isa/cx.c | 2 | ||||
| -rw-r--r-- | sys/i386/isa/pcvt/pcvt_drv.c | 8 | ||||
| -rw-r--r-- | sys/i386/isa/syscons.c | 5 | ||||
| -rw-r--r-- | sys/isa/syscons.c | 5 | ||||
| -rw-r--r-- | sys/kern/tty.c | 122 | ||||
| -rw-r--r-- | sys/kern/tty_pty.c | 32 | ||||
| -rw-r--r-- | sys/net/if_ppp.c | 12 | ||||
| -rw-r--r-- | sys/net/if_sl.c | 8 | ||||
| -rw-r--r-- | sys/sys/tty.h | 7 |
11 files changed, 123 insertions, 103 deletions
diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c index e00049b6d2a4..74c4002f8ec9 100644 --- a/sys/dev/syscons/syscons.c +++ b/sys/dev/syscons/syscons.c @@ -25,7 +25,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: syscons.c,v 1.120 1995/07/11 18:34:29 bde Exp $ + * $Id: syscons.c,v 1.121 1995/07/22 01:30:05 bde Exp $ */ #include "sc.h" @@ -352,12 +352,11 @@ scopen(dev_t dev, int flag, int mode, struct proc *p) tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED; scparam(tp, &tp->t_termios); ttsetwater(tp); + (*linesw[tp->t_line].l_modem)(tp, 1); } else if (tp->t_state & TS_XCLUDE && p->p_ucred->cr_uid != 0) return(EBUSY); - tp->t_state |= TS_CARR_ON; - tp->t_cflag |= CLOCAL; if (!console[minor(dev)]) console[minor(dev)] = alloc_scp(); return((*linesw[tp->t_line].l_open)(dev, tp)); diff --git a/sys/gnu/isdn/iitty.c b/sys/gnu/isdn/iitty.c index afd806d9776f..1e2e6d4c5a8f 100644 --- a/sys/gnu/isdn/iitty.c +++ b/sys/gnu/isdn/iitty.c @@ -1,6 +1,6 @@ -static char _ittyid[] = "@(#)$Id: iitty.c,v 1.8 1995/07/22 01:29:28 bde Exp $"; +static char _ittyid[] = "@(#)$Id: iitty.c,v 1.9 1995/07/22 16:44:26 bde Exp $"; /******************************************************************************* - * II - Version 0.1 $Revision: 1.8 $ $State: Exp $ + * II - Version 0.1 $Revision: 1.9 $ $State: Exp $ * * Copyright 1994 Dietmar Friede ******************************************************************************* @@ -10,6 +10,12 @@ static char _ittyid[] = "@(#)$Id: iitty.c,v 1.8 1995/07/22 01:29:28 bde Exp * ******************************************************************************* * $Log: iitty.c,v $ + * Revision 1.9 1995/07/22 16:44:26 bde + * Obtained from: partly from ancient patches of mine via 1.1.5 + * + * Give names to the magic tty i/o sleep addresses and use them. This makes + * it easier to remember what the addresses are for and to keep them unique. + * * Revision 1.8 1995/07/22 01:29:28 bde * Move the inline code for waking up writers to a new function * ttwwakeup(). The conditions for doing the wakeup will soon become @@ -159,7 +165,14 @@ ityopen(dev_t dev, int flag, int mode, struct proc * p) return (EBUSY); (void) spltty(); - if(OUTBOUND(dev)) tp->t_cflag |= CLOCAL; + if (OUTBOUND(dev)) { + /* + * XXX should call l_modem() here and not meddle with CLOCAL, + * but itystart() wants TS_CARR_ON to give the true carrier. + */ + tp->t_cflag |= CLOCAL; + tp->t_state |= TS_CONNECTED; + } while ((flag & O_NONBLOCK) == 0 && (tp->t_cflag & CLOCAL) == 0 && (tp->t_state & TS_CARR_ON) == 0) @@ -286,7 +299,6 @@ ity_connect(int no) return; if(OUTBOUND(tp->t_dev)) tp->t_cflag &= ~CLOCAL; (*linesw[tp->t_line].l_modem) (tp, 1); - tp->t_state |= TS_CARR_ON; tp->t_state &=~ (TS_BUSY|TS_FLUSH); if (tp->t_line) (*linesw[tp->t_line].l_start)(tp); diff --git a/sys/i386/isa/cx.c b/sys/i386/isa/cx.c index 9fd4b2d3dde2..6c236f59041d 100644 --- a/sys/i386/isa/cx.c +++ b/sys/i386/isa/cx.c @@ -194,7 +194,7 @@ int cxopen (dev_t dev, int flag, int mode, struct proc *p) cx_chan_rts (c, 1); } if (cx_chan_cd (c)) - tp->t_state |= TS_CARR_ON; + (*linesw[tp->t_line].l_modem)(tp, 1); if (! (flag & O_NONBLOCK)) { /* Lock the channel against cxconfig while we are * waiting for carrier. */ diff --git a/sys/i386/isa/pcvt/pcvt_drv.c b/sys/i386/isa/pcvt/pcvt_drv.c index a8d6c982f1ec..d9b69dc9e63b 100644 --- a/sys/i386/isa/pcvt/pcvt_drv.c +++ b/sys/i386/isa/pcvt/pcvt_drv.c @@ -433,16 +433,12 @@ pcopen(Dev_t dev, int flag, int mode, struct proc *p) tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED; pcparam(tp, &tp->t_termios); ttsetwater(tp); + (*linesw[tp->t_line].l_modem)(tp, 1); /* fake connection */ + winsz = 1; /* set winsize later */ } else if (tp->t_state & TS_XCLUDE && p->p_ucred->cr_uid != 0) return (EBUSY); - tp->t_state |= TS_CARR_ON; - tp->t_cflag |= CLOCAL; /* cannot be a modem (:-) */ - - if ((tp->t_state & TS_ISOPEN) == 0) /* is this a "cold" open ? */ - winsz = 1; /* yes, set winsize later */ - #if PCVT_NETBSD || (PCVT_FREEBSD >= 200) retval = ((*linesw[tp->t_line].l_open)(dev, tp)); #else diff --git a/sys/i386/isa/syscons.c b/sys/i386/isa/syscons.c index e00049b6d2a4..74c4002f8ec9 100644 --- a/sys/i386/isa/syscons.c +++ b/sys/i386/isa/syscons.c @@ -25,7 +25,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: syscons.c,v 1.120 1995/07/11 18:34:29 bde Exp $ + * $Id: syscons.c,v 1.121 1995/07/22 01:30:05 bde Exp $ */ #include "sc.h" @@ -352,12 +352,11 @@ scopen(dev_t dev, int flag, int mode, struct proc *p) tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED; scparam(tp, &tp->t_termios); ttsetwater(tp); + (*linesw[tp->t_line].l_modem)(tp, 1); } else if (tp->t_state & TS_XCLUDE && p->p_ucred->cr_uid != 0) return(EBUSY); - tp->t_state |= TS_CARR_ON; - tp->t_cflag |= CLOCAL; if (!console[minor(dev)]) console[minor(dev)] = alloc_scp(); return((*linesw[tp->t_line].l_open)(dev, tp)); diff --git a/sys/isa/syscons.c b/sys/isa/syscons.c index e00049b6d2a4..74c4002f8ec9 100644 --- a/sys/isa/syscons.c +++ b/sys/isa/syscons.c @@ -25,7 +25,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: syscons.c,v 1.120 1995/07/11 18:34:29 bde Exp $ + * $Id: syscons.c,v 1.121 1995/07/22 01:30:05 bde Exp $ */ #include "sc.h" @@ -352,12 +352,11 @@ scopen(dev_t dev, int flag, int mode, struct proc *p) tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED; scparam(tp, &tp->t_termios); ttsetwater(tp); + (*linesw[tp->t_line].l_modem)(tp, 1); } else if (tp->t_state & TS_XCLUDE && p->p_ucred->cr_uid != 0) return(EBUSY); - tp->t_state |= TS_CARR_ON; - tp->t_cflag |= CLOCAL; if (!console[minor(dev)]) console[minor(dev)] = alloc_scp(); return((*linesw[tp->t_line].l_open)(dev, tp)); diff --git a/sys/kern/tty.c b/sys/kern/tty.c index 22d510e81fc9..4476330368ba 100644 --- a/sys/kern/tty.c +++ b/sys/kern/tty.c @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)tty.c 8.8 (Berkeley) 1/21/94 - * $Id: tty.c,v 1.61 1995/07/31 18:29:28 bde Exp $ + * $Id: tty.c,v 1.62 1995/07/31 19:17:11 bde Exp $ */ /*- @@ -772,8 +772,7 @@ ttioctl(tp, cmd, data, flag) case TIOCCONS: /* become virtual console */ if (*(int *)data) { if (constty && constty != tp && - ISSET(constty->t_state, TS_CARR_ON | TS_ISOPEN) == - (TS_CARR_ON | TS_ISOPEN)) + ISSET(constty->t_state, TS_CONNECTED)) return (EBUSY); #ifndef UCONSOLE if (error = suser(p->p_ucred, &p->p_acflag)) @@ -842,20 +841,30 @@ ttioctl(tp, cmd, data, flag) if (tp->t_param && (error = (*tp->t_param)(tp, t))) { splx(s); return (error); - } else { - if (!ISSET(tp->t_state, TS_CARR_ON) && - ISSET(tp->t_cflag, CLOCAL) && - !ISSET(t->c_cflag, CLOCAL)) { -#if 0 - CLR(tp->t_state, TS_ISOPEN); -#endif - ttwakeup(tp); - } + } + if (ISSET(t->c_cflag, CLOCAL) && + !ISSET(tp->t_cflag, CLOCAL)) { + /* + * XXX disconnections would be too hard to + * get rid of without this kludge. The only + * way to get rid of controlling terminals + * is to exit from the session leader. + */ + CLR(tp->t_state, TS_ZOMBIE); + + wakeup(TSA_CARR_ON(tp)); + ttwakeup(tp); ttwwakeup(tp); - tp->t_cflag = t->c_cflag; - tp->t_ispeed = t->c_ispeed; - tp->t_ospeed = t->c_ospeed; } + if ((ISSET(tp->t_state, TS_CARR_ON) || + ISSET(t->c_cflag, CLOCAL)) && + !ISSET(tp->t_state, TS_ZOMBIE)) + SET(tp->t_state, TS_CONNECTED); + else + CLR(tp->t_state, TS_CONNECTED); + tp->t_cflag = t->c_cflag; + tp->t_ispeed = t->c_ispeed; + tp->t_ospeed = t->c_ospeed; ttsetwater(tp); } if (ISSET(t->c_lflag, ICANON) != ISSET(tp->t_lflag, ICANON) && @@ -1018,13 +1027,14 @@ ttyselect(tp, rw, p) s = spltty(); switch (rw) { case FREAD: - if (ttnread(tp) > 0 || (!ISSET(tp->t_cflag, CLOCAL) && - !ISSET(tp->t_state, TS_CARR_ON))) + if (ttnread(tp) > 0 || ISSET(tp->t_state, TS_ZOMBIE)) goto win; selrecord(p, &tp->t_rsel); break; case FWRITE: - if (tp->t_outq.c_cc <= tp->t_lowat) { + if ((tp->t_outq.c_cc <= tp->t_lowat && + ISSET(tp->t_state, TS_CONNECTED)) + || ISSET(tp->t_state, TS_ZOMBIE)) { win: splx(s); return (1); } @@ -1080,11 +1090,10 @@ ttywait(tp) error = 0; s = spltty(); while ((tp->t_outq.c_cc || ISSET(tp->t_state, TS_BUSY)) && - (ISSET(tp->t_state, TS_CARR_ON) || ISSET(tp->t_cflag, CLOCAL)) - && tp->t_oproc) { + ISSET(tp->t_state, TS_CONNECTED) && tp->t_oproc) { (*tp->t_oproc)(tp); if ((tp->t_outq.c_cc || ISSET(tp->t_state, TS_BUSY)) && - (ISSET(tp->t_state, TS_CARR_ON) || ISSET(tp->t_cflag, CLOCAL))) { + ISSET(tp->t_state, TS_CONNECTED)) { SET(tp->t_state, TS_SO_OCOMPLETE); error = ttysleep(tp, TSA_OCOMPLETE(tp), TTOPRI | PCATCH, "ttywai", @@ -1306,6 +1315,8 @@ ttymodem(tp, flag) CLR(tp->t_state, TS_CARR_ON); if (ISSET(tp->t_state, TS_ISOPEN) && !ISSET(tp->t_cflag, CLOCAL)) { + SET(tp->t_state, TS_ZOMBIE); + CLR(tp->t_state, TS_CONNECTED); if (tp->t_session && tp->t_session->s_leader) psignal(tp->t_session->s_leader, SIGHUP); ttyflush(tp, FREAD | FWRITE); @@ -1316,6 +1327,9 @@ ttymodem(tp, flag) * Carrier now on. */ SET(tp->t_state, TS_CARR_ON); + if (!ISSET(tp->t_state, TS_ZOMBIE)) + SET(tp->t_state, TS_CONNECTED); + wakeup(TSA_CARR_ON(tp)); ttwakeup(tp); ttwwakeup(tp); } @@ -1364,7 +1378,7 @@ ttread(tp, uio, flag) register tcflag_t lflag; register cc_t *cc = tp->t_cc; register struct proc *p = curproc; - int s, first, error = 0, carrier; + int s, first, error = 0; int has_stime = 0, last_cc = 0; long slp = 0; /* XXX this should be renamed `timo'. */ @@ -1397,6 +1411,11 @@ loop: goto loop; } + if (ISSET(tp->t_state, TS_ZOMBIE)) { + splx(s); + return (0); /* EOF */ + } + /* * If canonical, use the canonical queue, * else use the raw queue. @@ -1408,10 +1427,7 @@ loop: if (flag & IO_NDELAY) { if (qp->c_cc > 0) goto read; - carrier = ISSET(tp->t_state, TS_CARR_ON) || - ISSET(tp->t_cflag, CLOCAL); - if ((!carrier && ISSET(tp->t_state, TS_ISOPEN)) || - !ISSET(lflag, ICANON) && cc[VMIN] == 0) { + if (!ISSET(lflag, ICANON) && cc[VMIN] == 0) { splx(s); return (0); } @@ -1501,22 +1517,13 @@ loop: slp = (long) (((u_long)slp * hz) + 999999) / 1000000; goto sleep; } - - /* - * If there is no input, sleep on rawq - * awaiting hardware receipt and notification. - * If we have data, we don't need to check for carrier. - */ if (qp->c_cc <= 0) { sleep: - carrier = ISSET(tp->t_state, TS_CARR_ON) || - ISSET(tp->t_cflag, CLOCAL); - if (!carrier && ISSET(tp->t_state, TS_ISOPEN)) { - splx(s); - return (0); /* EOF */ - } - error = ttysleep(tp, TSA_CARR_ON(tp), TTIPRI | PCATCH, - carrier ? + /* + * There is no input, or not enough input and we can block. + */ + error = ttysleep(tp, TSA_HUP_OR_INPUT(tp), TTIPRI | PCATCH, + ISSET(tp->t_state, TS_CONNECTED) ? "ttyin" : "ttyhup", (int)slp); splx(s); if (error == EWOULDBLOCK) @@ -1690,23 +1697,24 @@ ttwrite(tp, uio, flag) cc = 0; loop: s = spltty(); - if (!ISSET(tp->t_state, TS_CARR_ON) && - !ISSET(tp->t_cflag, CLOCAL)) { - if (ISSET(tp->t_state, TS_ISOPEN)) { - splx(s); - return (EIO); - } else if (flag & IO_NDELAY) { + if (ISSET(tp->t_state, TS_ZOMBIE)) { + splx(s); + if (uio->uio_resid == cnt) + error = EIO; + goto out; + } + if (!ISSET(tp->t_state, TS_CONNECTED)) { + if (flag & IO_NDELAY) { splx(s); error = EWOULDBLOCK; goto out; - } else { - error = ttysleep(tp, TSA_CARR_ON(tp), TTIPRI | PCATCH, - "ttydcd", 0); - splx(s); - if (error) - goto out; - goto loop; } + error = ttysleep(tp, TSA_CARR_ON(tp), TTIPRI | PCATCH, + "ttydcd", 0); + splx(s); + if (error) + goto out; + goto loop; } splx(s); /* @@ -2040,10 +2048,11 @@ ttwakeup(tp) register struct tty *tp; { - selwakeup(&tp->t_rsel); + if (tp->t_rsel.si_pid != 0) + selwakeup(&tp->t_rsel); if (ISSET(tp->t_state, TS_ASYNC)) pgsignal(tp->t_pgrp, SIGIO, 1); - wakeup(TSA_CARR_ON(tp)); + wakeup(TSA_HUP_OR_INPUT(tp)); } /* @@ -2250,8 +2259,7 @@ tputchar(c, tp) register int s; s = spltty(); - if (ISSET(tp->t_state, - TS_CARR_ON | TS_ISOPEN) != (TS_CARR_ON | TS_ISOPEN)) { + if (!ISSET(tp->t_state, TS_CONNECTED)) { splx(s); return (-1); } diff --git a/sys/kern/tty_pty.c b/sys/kern/tty_pty.c index 596e07587419..178082dd0f9b 100644 --- a/sys/kern/tty_pty.c +++ b/sys/kern/tty_pty.c @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * @(#)tty_pty.c 8.2 (Berkeley) 9/23/93 - * $Id: tty_pty.c,v 1.14 1995/07/22 01:30:32 bde Exp $ + * $Id: tty_pty.c,v 1.15 1995/07/22 16:45:08 bde Exp $ */ /* @@ -132,7 +132,7 @@ ptsopen(dev, flag, devtype, p) } else if (tp->t_state&TS_XCLUDE && p->p_ucred->cr_uid != 0) return (EBUSY); if (tp->t_oproc) /* Ctrlr still around. */ - tp->t_state |= TS_CARR_ON; + (void)(*linesw[tp->t_line].l_modem)(tp, 1); while ((tp->t_state & TS_CARR_ON) == 0) { if (flag&FNONBLOCK) break; @@ -268,17 +268,11 @@ ptcwakeup(tp, flag) } } -/*ARGSUSED*/ -#ifdef __STDC__ -int -ptcopen(dev_t dev, int flag, int devtype, struct proc *p) -#else int ptcopen(dev, flag, devtype, p) dev_t dev; int flag, devtype; struct proc *p; -#endif { register struct tty *tp; struct pt_ioctl *pti; @@ -309,7 +303,19 @@ ptcclose(dev) tp = &pt_tty[minor(dev)]; (void)(*linesw[tp->t_line].l_modem)(tp, 0); - tp->t_state &= ~TS_CARR_ON; + + /* + * XXX MDMBUF makes no sense for ptys but would inhibit the above + * l_modem(). CLOCAL makes sense but isn't supported. Special + * l_modem()s that ignore carrier drop make no sense for ptys but + * may be in use because other parts of the line discipline make + * sense for ptys. Recover by doing everything that a normal + * ttymodem() would have done except for sending a SIGHUP. + */ + tp->t_state &= ~(TS_CARR_ON | TS_CONNECTED); + tp->t_state |= TS_ZOMBIE; + ttyflush(tp, FREAD | FWRITE); + tp->t_oproc = 0; /* mark closed */ tp->t_session = 0; return (0); @@ -357,7 +363,7 @@ ptcread(dev, uio, flag) if (tp->t_outq.c_cc && (tp->t_state&TS_TTSTOP) == 0) break; } - if ((tp->t_state&TS_CARR_ON) == 0) + if ((tp->t_state & TS_CONNECTED) == 0) return (0); /* EOF */ if (flag & IO_NDELAY) return (EWOULDBLOCK); @@ -411,7 +417,7 @@ ptcselect(dev, rw, p) struct pt_ioctl *pti = &pt_ioctl[minor(dev)]; int s; - if ((tp->t_state&TS_CARR_ON) == 0) + if ((tp->t_state & TS_CONNECTED) == 0) return (1); switch (rw) { @@ -511,7 +517,7 @@ again: while (cc > 0) { if ((tp->t_rawq.c_cc + tp->t_canq.c_cc) >= TTYHOG - 2 && (tp->t_canq.c_cc > 0 || !(tp->t_iflag&ICANON))) { - wakeup(TSA_CARR_ON(tp)); + wakeup(TSA_HUP_OR_INPUT(tp)); goto block; } (*linesw[tp->t_line].l_rint)(*cp++, tp); @@ -526,7 +532,7 @@ block: * Come here to wait for slave to open, for space * in outq, or space in rawq. */ - if ((tp->t_state&TS_CARR_ON) == 0) + if ((tp->t_state & TS_CONNECTED) == 0) return (EIO); if (flag & IO_NDELAY) { /* adjust for data copied in but not written */ diff --git a/sys/net/if_ppp.c b/sys/net/if_ppp.c index e9d5e65a9f3f..c3f5bb1a0f04 100644 --- a/sys/net/if_ppp.c +++ b/sys/net/if_ppp.c @@ -69,7 +69,7 @@ * Paul Mackerras (paulus@cs.anu.edu.au). */ -/* $Id: if_ppp.c,v 1.16 1995/07/21 20:52:55 bde Exp $ */ +/* $Id: if_ppp.c,v 1.17 1995/07/29 13:39:44 bde Exp $ */ /* from if_sl.c,v 1.11 84/10/04 12:54:47 rick Exp */ #include "ppp.h" @@ -381,7 +381,7 @@ pppread(tp, uio, flag) register int s; int error = 0; - if ((tp->t_state & TS_CARR_ON) == 0 && (tp->t_cflag & CLOCAL) == 0) + if ((tp->t_state & TS_CONNECTED) == 0) return 0; /* end of file */ if (sc == NULL || tp != (struct tty *) sc->sc_devp) return 0; @@ -391,7 +391,7 @@ pppread(tp, uio, flag) splx(s); return (EWOULDBLOCK); } - error = ttysleep(tp, (caddr_t)&tp->t_rawq, TTIPRI|PCATCH, "pppin", 0); + error = ttysleep(tp, TSA_HUP_OR_INPUT(tp), TTIPRI | PCATCH, "pppin", 0); if (error) return error; } @@ -429,7 +429,7 @@ pppwrite(tp, uio, flag) struct ppp_header *ph1, *ph2; int len, error; - if ((tp->t_state & TS_CARR_ON) == 0 && (tp->t_cflag & CLOCAL) == 0) + if ((tp->t_state & TS_CONNECTED) == 0) return 0; /* wrote 0 bytes */ if (tp->t_line != PPPDISC) return (EINVAL); @@ -891,7 +891,7 @@ pppstart(tp) int n, s, ndone, done; struct mbuf *m2; - if ((tp->t_state & TS_CARR_ON) == 0 && (tp->t_cflag & CLOCAL) == 0) { + if ((tp->t_state & TS_CONNECTED) == 0) { /* sorry, I can't talk now */ return 0; } @@ -1293,7 +1293,7 @@ pppinput(c, tp) ++sc->sc_bytesrcvd; - if (!(tp->t_state & TS_CARR_ON) && !(tp->t_cflag & CLOCAL)) { + if ((tp->t_state & TS_CONNECTED) == 0) { if (sc->sc_flags & SC_DEBUG) printf("ppp%d: no carrier\n", sc->sc_if.if_unit); goto flush; diff --git a/sys/net/if_sl.c b/sys/net/if_sl.c index d73cca3cc5bb..0b33a2d7fa41 100644 --- a/sys/net/if_sl.c +++ b/sys/net/if_sl.c @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * @(#)if_sl.c 8.6 (Berkeley) 2/1/94 - * $Id: if_sl.c,v 1.26 1995/07/07 01:13:49 davidg Exp $ + * $Id: if_sl.c,v 1.27 1995/07/29 13:39:46 bde Exp $ */ /* @@ -444,8 +444,7 @@ sloutput(ifp, m, dst, rtp) m_freem(m); return (ENETDOWN); } - if ((sc->sc_ttyp->t_state & TS_CARR_ON) == 0 && - (sc->sc_ttyp->t_cflag & CLOCAL) == 0) { + if ((sc->sc_ttyp->t_state & TS_CONNECTED) == 0) { m_freem(m); return (EHOSTUNREACH); } @@ -731,8 +730,7 @@ slinput(c, tp) sc = (struct sl_softc *)tp->t_sc; if (sc == NULL) return 0; - if (c & TTY_ERRORMASK || ((tp->t_state & TS_CARR_ON) == 0 && - (tp->t_cflag & CLOCAL) == 0)) { + if (c & TTY_ERRORMASK || (tp->t_state & TS_CONNECTED) == 0) { sc->sc_flags |= SC_ERROR; return 0; } diff --git a/sys/sys/tty.h b/sys/sys/tty.h index 7e50099cb0cb..e3206ff5b5c8 100644 --- a/sys/sys/tty.h +++ b/sys/sys/tty.h @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)tty.h 8.6 (Berkeley) 1/21/94 - * $Id: tty.h,v 1.27 1995/07/31 18:29:37 bde Exp $ + * $Id: tty.h,v 1.28 1995/07/31 19:17:19 bde Exp $ */ #ifndef _SYS_TTY_H_ @@ -154,8 +154,10 @@ struct tty { /* Extras. */ #define TS_CAN_BYPASS_L_RINT 0x010000 /* Device in "raw" mode. */ +#define TS_CONNECTED 0x020000 /* Connection open. */ #define TS_SNOOP 0x040000 /* Device is being snooped on. */ #define TS_SO_OCOMPLETE 0x080000 /* Wake up when output completes. */ +#define TS_ZOMBIE 0x100000 /* Connection lost. */ /* Character type information. */ #define ORDINARY 0 @@ -195,7 +197,8 @@ struct speedtab { (isctty((p), (tp)) && (p)->p_pgrp != (tp)->t_pgrp) /* Unique sleep addresses. */ -#define TSA_CARR_ON(tp) ((void *)&(tp)->t_rawq) /* XXX overloaded */ +#define TSA_CARR_ON(tp) ((void *)&(tp)->t_rawq) +#define TSA_HUP_OR_INPUT(tp) ((void *)&(tp)->t_rawq.c_cf) #define TSA_OCOMPLETE(tp) ((void *)&(tp)->t_outq.c_cl) #define TSA_OLOWAT(tp) ((void *)&(tp)->t_outq) #define TSA_PTC_READ(tp) ((void *)&(tp)->t_outq.c_cf) |
