diff options
| -rw-r--r-- | sys/kern/tty.c | 44 | ||||
| -rw-r--r-- | sys/kern/tty_pty.c | 88 | ||||
| -rw-r--r-- | sys/kern/tty_tty.c | 16 |
3 files changed, 73 insertions, 75 deletions
diff --git a/sys/kern/tty.c b/sys/kern/tty.c index 0c023ea24a57..0be04a0c3553 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.94 1997/03/24 12:02:59 bde Exp $ + * $Id: tty.c,v 1.95 1997/09/02 20:05:54 bde Exp $ */ /*- @@ -83,6 +83,7 @@ #include <sys/fcntl.h> #include <sys/conf.h> #include <sys/dkstat.h> +#include <sys/poll.h> #include <sys/kernel.h> #include <sys/vnode.h> #include <sys/signalvar.h> @@ -1031,35 +1032,34 @@ ttioctl(tp, cmd, data, flag) } int -ttyselect(tp, rw, p) +ttypoll(tp, events, p) struct tty *tp; - int rw; + int events; struct proc *p; { int s; + int revents = 0; - if (tp == NULL) - return (ENXIO); + if (tp == NULL) /* XXX used to return ENXIO, but that means true! */ + return ((events & (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM)) + | POLLHUP); s = spltty(); - switch (rw) { - case FREAD: + if (events & (POLLIN | POLLRDNORM)) if (ttnread(tp) > 0 || ISSET(tp->t_state, TS_ZOMBIE)) - goto win; - selrecord(p, &tp->t_rsel); - break; - case FWRITE: + revents |= events & (POLLIN | POLLRDNORM); + else + selrecord(p, &tp->t_rsel); + + if (events & (POLLOUT | POLLWRNORM)) 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); - } - selrecord(p, &tp->t_wsel); - break; - } + || ISSET(tp->t_state, TS_ZOMBIE)) + revents |= events & (POLLOUT | POLLWRNORM); + else + selrecord(p, &tp->t_wsel); splx(s); - return (0); + return (revents); } /* @@ -1067,12 +1067,12 @@ win: splx(s); * cdevsw. It relies on a proper xxxdevtotty routine. */ int -ttselect(dev, rw, p) +ttpoll(dev, events, p) dev_t dev; - int rw; + int events; struct proc *p; { - return ttyselect((*cdevsw[major(dev)]->d_devtotty)(dev), rw, p); + return ttypoll((*cdevsw[major(dev)]->d_devtotty)(dev), events, p); } /* diff --git a/sys/kern/tty_pty.c b/sys/kern/tty_pty.c index cc46c2ae03a8..34e10294bfde 100644 --- a/sys/kern/tty_pty.c +++ b/sys/kern/tty_pty.c @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * @(#)tty_pty.c 8.4 (Berkeley) 2/20/95 - * $Id: tty_pty.c,v 1.44 1997/07/30 10:05:18 jmg Exp $ + * $Id: tty_pty.c,v 1.45 1997/09/02 20:05:55 bde Exp $ */ /* @@ -49,6 +49,7 @@ #include <sys/tty.h> #include <sys/conf.h> #include <sys/fcntl.h> +#include <sys/poll.h> #include <sys/kernel.h> #include <sys/vnode.h> #include <sys/signalvar.h> @@ -74,19 +75,19 @@ static d_open_t ptcopen; static d_close_t ptcclose; static d_read_t ptcread; static d_write_t ptcwrite; -static d_select_t ptcselect; +static d_poll_t ptcpoll; #define CDEV_MAJOR_S 5 #define CDEV_MAJOR_C 6 static struct cdevsw pts_cdevsw = { ptsopen, ptsclose, ptsread, ptswrite, /*5*/ ptyioctl, ptsstop, nullreset, ptydevtotty,/* ttyp */ - ttselect, nommap, NULL, "pts", NULL, -1 }; + ttpoll, nommap, NULL, "pts", NULL, -1 }; static struct cdevsw ptc_cdevsw = { ptcopen, ptcclose, ptcread, ptcwrite, /*6*/ ptyioctl, nullstop, nullreset, ptydevtotty,/* ptyp */ - ptcselect, nommap, NULL, "ptc", NULL, -1 }; + ptcpoll, nommap, NULL, "ptc", NULL, -1 }; #if NPTY == 1 @@ -459,58 +460,53 @@ ptsstop(tp, flush) } static int -ptcselect(dev, rw, p) +ptcpoll(dev, events, p) dev_t dev; - int rw; + int events; struct proc *p; { register struct tty *tp = &pt_tty[minor(dev)]; struct pt_ioctl *pti = &pt_ioctl[minor(dev)]; + int revents = 0; int s; if ((tp->t_state & TS_CONNECTED) == 0) - return (1); - switch (rw) { - - case FREAD: - /* - * Need to block timeouts (ttrstart). - */ - s = spltty(); - if ((tp->t_state&TS_ISOPEN) && - tp->t_outq.c_cc && (tp->t_state&TS_TTSTOP) == 0) { - splx(s); - return (1); - } - splx(s); - /* FALLTHROUGH */ - - case 0: /* exceptional */ - if ((tp->t_state&TS_ISOPEN) && - ((pti->pt_flags&PF_PKT && pti->pt_send) || - (pti->pt_flags&PF_UCNTL && pti->pt_ucntl))) - return (1); - selrecord(p, &pti->pt_selr); - break; - - - case FWRITE: - if (tp->t_state&TS_ISOPEN) { - if (pti->pt_flags & PF_REMOTE) { - if (tp->t_canq.c_cc == 0) - return (1); - } else { - if (tp->t_rawq.c_cc + tp->t_canq.c_cc < TTYHOG-2) - return (1); - if (tp->t_canq.c_cc == 0 && (tp->t_iflag&ICANON)) - return (1); - } - } - selrecord(p, &pti->pt_selw); - break; + return (seltrue(dev, events, p) | POLLHUP); + /* + * Need to block timeouts (ttrstart). + */ + s = spltty(); + + if (events & (POLLIN | POLLRDNORM)) + if ((tp->t_state & TS_ISOPEN) && + ((tp->t_outq.c_cc && (tp->t_state & TS_TTSTOP) == 0) || + ((pti->pt_flags & PF_PKT) && pti->pt_send) || + ((pti->pt_flags & PF_UCNTL) && pti->pt_ucntl))) + revents |= events & (POLLIN | POLLRDNORM); + + if (events & (POLLOUT | POLLWRNORM)) + if (tp->t_state & TS_ISOPEN && + ((pti->pt_flags & PF_REMOTE) ? + (tp->t_canq.c_cc == 0) : + ((tp->t_rawq.c_cc + tp->t_canq.c_cc < TTYHOG - 2) || + (tp->t_canq.c_cc == 0 && (tp->t_iflag & ICANON))))) + revents |= events & (POLLOUT | POLLWRNORM); + + if (events & POLLHUP) + if ((tp->t_state & TS_CARR_ON) == 0) + revents |= POLLHUP; + + if (revents == 0) { + if (events & (POLLIN | POLLRDNORM)) + selrecord(p, &pti->pt_selr); + + if (events & (POLLOUT | POLLWRNORM)) + selrecord(p, &pti->pt_selw); } - return (0); + splx(s); + + return (revents); } static int diff --git a/sys/kern/tty_tty.c b/sys/kern/tty_tty.c index bc0de91dd528..fb648b1f4557 100644 --- a/sys/kern/tty_tty.c +++ b/sys/kern/tty_tty.c @@ -31,13 +31,14 @@ * SUCH DAMAGE. * * @(#)tty_tty.c 8.2 (Berkeley) 9/23/93 - * $Id: tty_tty.c,v 1.16 1997/03/24 11:24:38 bde Exp $ + * $Id: tty_tty.c,v 1.17 1997/09/02 20:05:56 bde Exp $ */ /* * Indirect driver for controlling tty. */ #include <sys/param.h> +#include <sys/systm.h> #include <sys/conf.h> #include <sys/proc.h> #include <sys/tty.h> @@ -52,14 +53,14 @@ static d_open_t cttyopen; static d_read_t cttyread; static d_write_t cttywrite; static d_ioctl_t cttyioctl; -static d_select_t cttyselect; +static d_poll_t cttypoll; #define CDEV_MAJOR 1 /* Don't make static, fdesc_vnops uses this. */ struct cdevsw ctty_cdevsw = { cttyopen, nullclose, cttyread, cttywrite, /*1*/ cttyioctl, nullstop, nullreset, nodevtotty,/* tty */ - cttyselect, nommap, NULL, "ctty", NULL, -1 }; + cttypoll, nommap, NULL, "ctty", NULL, -1 }; #define cttyvp(p) ((p)->p_flag & P_CONTROLT ? (p)->p_session->s_ttyvp : NULL) @@ -160,16 +161,17 @@ cttyioctl(dev, cmd, addr, flag, p) /*ARGSUSED*/ static int -cttyselect(dev, flag, p) +cttypoll(dev, events, p) dev_t dev; - int flag; + int events; struct proc *p; { struct vnode *ttyvp = cttyvp(p); if (ttyvp == NULL) - return (1); /* try operation to get EOF/failure */ - return (VOP_SELECT(ttyvp, flag, FREAD|FWRITE, NOCRED, p)); + /* try operation to get EOF/failure */ + return (seltrue(dev, events, p)); + return (VOP_POLL(ttyvp, events, p->p_ucred, p)); } static ctty_devsw_installed = 0; |
