summaryrefslogtreecommitdiffstats
path: root/sys/kern/uipc_socket.c
diff options
context:
space:
mode:
authorjlemon <jlemon@FreeBSD.org>2001-02-15 16:34:11 +0000
committerjlemon <jlemon@FreeBSD.org>2001-02-15 16:34:11 +0000
commit11781a7431fab609cd00058a63ac09ccddb16854 (patch)
treeee46dbf40488c941cf17b05e69bfe21e4f2d7128 /sys/kern/uipc_socket.c
parent5655168b87e22a331c5fc3b603901647ff90b2e4 (diff)
downloadFreeBSD-src-11781a7431fab609cd00058a63ac09ccddb16854.zip
FreeBSD-src-11781a7431fab609cd00058a63ac09ccddb16854.tar.gz
Extend kqueue down to the device layer.
Backwards compatible approach suggested by: peter
Diffstat (limited to 'sys/kern/uipc_socket.c')
-rw-r--r--sys/kern/uipc_socket.c55
1 files changed, 28 insertions, 27 deletions
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c
index d8a95cf..85667de 100644
--- a/sys/kern/uipc_socket.c
+++ b/sys/kern/uipc_socket.c
@@ -64,21 +64,18 @@
static int do_setopt_accept_filter(struct socket *so, struct sockopt *sopt);
#endif
-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 },
-};
+ { 1, NULL, filt_sordetach, filt_solisten };
+static struct filterops soread_filtops =
+ { 1, NULL, filt_sordetach, filt_soread };
+static struct filterops sowrite_filtops =
+ { 1, NULL, filt_sowdetach, filt_sowrite };
struct vm_zone *socket_zone;
so_gen_t so_gencnt; /* generation count for sockets */
@@ -1534,16 +1531,32 @@ sopoll(struct socket *so, int events, struct ucred *cred, struct proc *p)
return (revents);
}
-static int
-filt_sorattach(struct knote *kn)
+int
+sokqfilter(struct file *fp, struct knote *kn)
{
struct socket *so = (struct socket *)kn->kn_fp->f_data;
- int s = splnet();
+ struct sockbuf *sb;
+ int s;
- 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;
+ switch (kn->kn_filter) {
+ case EVFILT_READ:
+ if (so->so_options & SO_ACCEPTCONN)
+ kn->kn_fop = &solisten_filtops;
+ else
+ kn->kn_fop = &soread_filtops;
+ sb = &so->so_rcv;
+ break;
+ case EVFILT_WRITE:
+ kn->kn_fop = &sowrite_filtops;
+ sb = &so->so_snd;
+ break;
+ default:
+ return (1);
+ }
+
+ s = splnet();
+ SLIST_INSERT_HEAD(&sb->sb_sel.si_note, kn, kn_selnext);
+ sb->sb_flags |= SB_KNOTE;
splx(s);
return (0);
}
@@ -1576,18 +1589,6 @@ filt_soread(struct knote *kn, long hint)
return (kn->kn_data >= so->so_rcv.sb_lowat);
}
-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)
{
OpenPOWER on IntegriCloud