diff --git a/sys/kern/sys_socket.c b/sys/kern/sys_socket.c --- a/sys/kern/sys_socket.c +++ b/sys/kern/sys_socket.c @@ -87,7 +87,7 @@ static fo_rdwr_t soo_write; static fo_ioctl_t soo_ioctl; static fo_poll_t soo_poll; -extern fo_kqfilter_t soo_kqfilter; +static fo_kqfilter_t soo_kqfilter; static fo_stat_t soo_stat; static fo_close_t soo_close; static fo_chmod_t soo_chmod; @@ -291,6 +291,14 @@ return (so->so_proto->pr_sopoll(so, events, td)); } +static int +soo_kqfilter(struct file *fp, struct knote *kn) +{ + struct socket *so = fp->f_data; + + return (so->so_proto->pr_kqfilter(so, kn)); +} + static int soo_stat(struct file *fp, struct stat *ub, struct ucred *active_cred) { diff --git a/sys/kern/uipc_domain.c b/sys/kern/uipc_domain.c --- a/sys/kern/uipc_domain.c +++ b/sys/kern/uipc_domain.c @@ -191,6 +191,7 @@ DEFAULT(pr_sopoll, sopoll_generic); DEFAULT(pr_setsbopt, sbsetopt); DEFAULT(pr_aio_queue, soaio_queue_generic); + DEFAULT(pr_kqfilter, sokqfilter_generic); #define NOTSUPP(foo) if (pr->foo == NULL) pr->foo = foo ## _notsupp NOTSUPP(pr_accept); diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -186,7 +186,6 @@ static void filt_sowdetach(struct knote *kn); static int filt_sowrite(struct knote *kn, long hint); static int filt_soempty(struct knote *kn, long hint); -fo_kqfilter_t soo_kqfilter; static const struct filterops soread_filtops = { .f_isfd = 1, @@ -4468,9 +4467,8 @@ } int -soo_kqfilter(struct file *fp, struct knote *kn) +sokqfilter_generic(struct socket *so, struct knote *kn) { - struct socket *so = kn->kn_fp->f_data; struct sockbuf *sb; sb_which which; struct knlist *knl; diff --git a/sys/sys/protosw.h b/sys/sys/protosw.h --- a/sys/sys/protosw.h +++ b/sys/sys/protosw.h @@ -51,6 +51,7 @@ struct ucred; struct uio; struct kaiocb; +struct knote; enum shutdown_how; /* USE THESE FOR YOUR PROTOTYPES ! */ @@ -90,6 +91,7 @@ typedef int pr_soreceive_t(struct socket *, struct sockaddr **, struct uio *, struct mbuf **, struct mbuf **, int *); typedef int pr_sopoll_t(struct socket *, int, struct thread *); +typedef int pr_kqfilter_t(struct socket *, struct knote *); typedef void pr_sosetlabel_t(struct socket *); typedef void pr_close_t(struct socket *); typedef int pr_bindat_t(int, struct socket *, struct sockaddr *, @@ -140,6 +142,7 @@ pr_sosetlabel_t *pr_sosetlabel; /* MAC, XXXGL: remove */ pr_setsbopt_t *pr_setsbopt; /* Socket buffer ioctls */ pr_chmod_t *pr_chmod; /* fchmod(2) */ + pr_kqfilter_t *pr_kqfilter; /* kevent(2) */ }; #endif /* defined(_KERNEL) || defined(_WANT_PROTOSW) */ #ifdef _KERNEL diff --git a/sys/sys/socketvar.h b/sys/sys/socketvar.h --- a/sys/sys/socketvar.h +++ b/sys/sys/socketvar.h @@ -526,6 +526,7 @@ struct socket * sopeeloff(struct socket *); int sopoll_generic(struct socket *so, int events, struct thread *td); +int sokqfilter_generic(struct socket *so, struct knote *kn); int soaio_queue_generic(struct socket *so, struct kaiocb *job); int soreceive(struct socket *so, struct sockaddr **paddr, struct uio *uio, struct mbuf **mp0, struct mbuf **controlp, int *flagsp);