Deleted Added
full compact
34c34
< * $FreeBSD: head/sys/kern/uipc_socket.c 58225 2000-03-18 08:56:56Z fenner $
---
> * $FreeBSD: head/sys/kern/uipc_socket.c 59288 2000-04-16 18:53:38Z jlemon $
42a43
> #include <sys/file.h> /* for struct knote */
44a46
> #include <sys/event.h>
57a60,75
> static int filt_sorattach(struct knote *kn);
> static void filt_sordetach(struct knote *kn);
> static int filt_soread(struct knote *kn, long hint);
> static int filt_sowattach(struct knote *kn);
> static void filt_sowdetach(struct knote *kn);
> static int filt_sowrite(struct knote *kn, long hint);
> static int filt_solisten(struct knote *kn, long hint);
>
> static struct filterops solisten_filtops =
> { 1, filt_sorattach, filt_sordetach, filt_solisten };
>
> struct filterops so_rwfiltops[] = {
> { 1, filt_sorattach, filt_sordetach, filt_soread },
> { 1, filt_sowattach, filt_sowdetach, filt_sowrite },
> };
>
1390a1409,1499
>
> static int
> filt_sorattach(struct knote *kn)
> {
> struct socket *so = (struct socket *)kn->kn_fp->f_data;
> int s = splnet();
>
> if (so->so_options & SO_ACCEPTCONN)
> kn->kn_fop = &solisten_filtops;
> SLIST_INSERT_HEAD(&so->so_rcv.sb_sel.si_note, kn, kn_selnext);
> so->so_rcv.sb_flags |= SB_KNOTE;
> splx(s);
> return (0);
> }
>
> static void
> filt_sordetach(struct knote *kn)
> {
> struct socket *so = (struct socket *)kn->kn_fp->f_data;
> int s = splnet();
>
> SLIST_REMOVE(&so->so_rcv.sb_sel.si_note, kn, knote, kn_selnext);
> if (SLIST_EMPTY(&so->so_rcv.sb_sel.si_note))
> so->so_rcv.sb_flags &= ~SB_KNOTE;
> splx(s);
> }
>
> /*ARGSUSED*/
> static int
> filt_soread(struct knote *kn, long hint)
> {
> struct socket *so = (struct socket *)kn->kn_fp->f_data;
>
> kn->kn_data = so->so_rcv.sb_cc;
> if (so->so_state & SS_CANTRCVMORE) {
> kn->kn_flags |= EV_EOF;
> return (1);
> }
> return (kn->kn_data > 0);
> }
>
> static int
> filt_sowattach(struct knote *kn)
> {
> struct socket *so = (struct socket *)kn->kn_fp->f_data;
> int s = splnet();
>
> SLIST_INSERT_HEAD(&so->so_snd.sb_sel.si_note, kn, kn_selnext);
> so->so_snd.sb_flags |= SB_KNOTE;
> splx(s);
> return (0);
> }
>
> static void
> filt_sowdetach(struct knote *kn)
> {
> struct socket *so = (struct socket *)kn->kn_fp->f_data;
> int s = splnet();
>
> SLIST_REMOVE(&so->so_snd.sb_sel.si_note, kn, knote, kn_selnext);
> if (SLIST_EMPTY(&so->so_snd.sb_sel.si_note))
> so->so_snd.sb_flags &= ~SB_KNOTE;
> splx(s);
> }
>
> /*ARGSUSED*/
> static int
> filt_sowrite(struct knote *kn, long hint)
> {
> struct socket *so = (struct socket *)kn->kn_fp->f_data;
>
> kn->kn_data = sbspace(&so->so_snd);
> if (so->so_state & SS_CANTSENDMORE) {
> kn->kn_flags |= EV_EOF;
> return (1);
> }
> if (((so->so_state & SS_ISCONNECTED) == 0) &&
> (so->so_proto->pr_flags & PR_CONNREQUIRED))
> return (0);
> return (kn->kn_data >= so->so_snd.sb_lowat);
> }
>
> /*ARGSUSED*/
> static int
> filt_solisten(struct knote *kn, long hint)
> {
> struct socket *so = (struct socket *)kn->kn_fp->f_data;
>
> kn->kn_data = so->so_qlen - so->so_incqlen;
> return (! TAILQ_EMPTY(&so->so_comp));
> }