| version 1.56.2.3, 2002/01/10 20:00:14 |
version 1.56.2.4, 2002/03/15 21:36:11 |
| Line 1125 soo_kqfilter(struct file *fp, struct kno |
|
| Line 1125 soo_kqfilter(struct file *fp, struct kno |
|
| { |
{ |
| struct socket *so; |
struct socket *so; |
| struct sockbuf *sb; |
struct sockbuf *sb; |
| int s; |
|
| |
|
| so = (struct socket *)kn->kn_fp->f_data; |
so = (struct socket *)kn->kn_fp->f_data; |
| switch (kn->kn_filter) { |
switch (kn->kn_filter) { |
| Line 1143 soo_kqfilter(struct file *fp, struct kno |
|
| Line 1142 soo_kqfilter(struct file *fp, struct kno |
|
| default: |
default: |
| return (1); |
return (1); |
| } |
} |
| s = splnet(); /* XXXLUKEM: maybe splsoftnet() ? */ |
|
| SLIST_INSERT_HEAD(&sb->sb_sel.si_klist, kn, kn_selnext); |
SLIST_INSERT_HEAD(&sb->sb_sel.si_klist, kn, kn_selnext); |
| sb->sb_flags |= SB_KNOTE; |
sb->sb_flags |= SB_KNOTE; |
| splx(s); |
|
| return (0); |
return (0); |
| } |
} |
| |
|
|
|
| filt_sordetach(struct knote *kn) |
filt_sordetach(struct knote *kn) |
| { |
{ |
| struct socket *so; |
struct socket *so; |
| int s; |
|
| |
|
| so = (struct socket *)kn->kn_fp->f_data; |
so = (struct socket *)kn->kn_fp->f_data; |
| s = splnet(); /* XXXLUKEM: maybe splsoftnet() ? */ |
|
| SLIST_REMOVE(&so->so_rcv.sb_sel.si_klist, kn, knote, kn_selnext); |
SLIST_REMOVE(&so->so_rcv.sb_sel.si_klist, kn, knote, kn_selnext); |
| if (SLIST_EMPTY(&so->so_rcv.sb_sel.si_klist)) |
if (SLIST_EMPTY(&so->so_rcv.sb_sel.si_klist)) |
| so->so_rcv.sb_flags &= ~SB_KNOTE; |
so->so_rcv.sb_flags &= ~SB_KNOTE; |
| splx(s); |
|
| } |
} |
| |
|
| /*ARGSUSED*/ |
/*ARGSUSED*/ |
|
|
| filt_sowdetach(struct knote *kn) |
filt_sowdetach(struct knote *kn) |
| { |
{ |
| struct socket *so; |
struct socket *so; |
| int s; |
|
| |
|
| so = (struct socket *)kn->kn_fp->f_data; |
so = (struct socket *)kn->kn_fp->f_data; |
| s = splnet(); /* XXXLUKEM: maybe splsoftnet() ? */ |
|
| SLIST_REMOVE(&so->so_snd.sb_sel.si_klist, kn, knote, kn_selnext); |
SLIST_REMOVE(&so->so_snd.sb_sel.si_klist, kn, knote, kn_selnext); |
| if (SLIST_EMPTY(&so->so_snd.sb_sel.si_klist)) |
if (SLIST_EMPTY(&so->so_snd.sb_sel.si_klist)) |
| so->so_snd.sb_flags &= ~SB_KNOTE; |
so->so_snd.sb_flags &= ~SB_KNOTE; |
| splx(s); |
|
| } |
} |
| |
|
| /*ARGSUSED*/ |
/*ARGSUSED*/ |
| Line 1228 filt_solisten(struct knote *kn, long hin |
|
| Line 1219 filt_solisten(struct knote *kn, long hin |
|
| struct socket *so; |
struct socket *so; |
| |
|
| so = (struct socket *)kn->kn_fp->f_data; |
so = (struct socket *)kn->kn_fp->f_data; |
| #if 0 |
|
| /* |
/* |
| * XXXLUKEM: this was freebsd's code. it appears that they |
* Set kn_data to number of incoming connections, not |
| * XXXLUKEM: modified the socket code to store the count |
* counting partial (incomplete) connections. |
| * XXXLUKEM: of all connections in so_qlen, and separately |
*/ |
| * XXXLUKEM: track the number of incompletes in so_incqlen. |
|
| * XXXLUKEM: as we appear to keep only completed connections |
|
| * XXXLUKEM: on so_qlen we can just return that. |
|
| * XXXLUKEM: that said, a socket guru should double check for me :) |
|
| */ |
|
| kn->kn_data = so->so_qlen - so->so_incqlen; |
|
| return (! TAILQ_EMPTY(&so->so_comp)); |
|
| #else |
|
| kn->kn_data = so->so_qlen; |
kn->kn_data = so->so_qlen; |
| return (kn->kn_data > 0); |
return (kn->kn_data > 0); |
| #endif |
|
| } |
} |