Deleted Added
full compact
98c98
< __FBSDID("$FreeBSD: head/sys/kern/uipc_socket.c 191917 2009-05-08 14:34:25Z zec $");
---
> __FBSDID("$FreeBSD: head/sys/kern/uipc_socket.c 193272 2009-06-01 21:17:03Z jhb $");
3057c3057,3058
< struct socket *head;
---
> struct socket *head;
> int ret;
3058a3060
> restart:
3078,3081c3080,3082
< so->so_upcall =
< head->so_accf->so_accept_filter->accf_callback;
< so->so_upcallarg = head->so_accf->so_accept_filter_arg;
< so->so_rcv.sb_flags |= SB_UPCALL;
---
> soupcall_set(so, SO_RCV,
> head->so_accf->so_accept_filter->accf_callback,
> head->so_accf->so_accept_filter_arg);
3082a3084,3087
> ret = head->so_accf->so_accept_filter->accf_callback(so,
> head->so_accf->so_accept_filter_arg, M_DONTWAIT);
> if (ret == SU_ISCONNECTED)
> soupcall_clear(so, SO_RCV);
3084c3089,3090
< so->so_upcall(so, so->so_upcallarg, M_DONTWAIT);
---
> if (ret == SU_ISCONNECTED)
> goto restart;
3148a3155,3205
> * Register per-socket buffer upcalls.
> */
> void
> soupcall_set(struct socket *so, int which,
> int (*func)(struct socket *, void *, int), void *arg)
> {
> struct sockbuf *sb;
>
> switch (which) {
> case SO_RCV:
> sb = &so->so_rcv;
> break;
> case SO_SND:
> sb = &so->so_snd;
> break;
> default:
> panic("soupcall_set: bad which");
> }
> SOCKBUF_LOCK_ASSERT(sb);
> #if 0
> /* XXX: accf_http actually wants to do this on purpose. */
> KASSERT(sb->sb_upcall == NULL, ("soupcall_set: overwriting upcall"));
> #endif
> sb->sb_upcall = func;
> sb->sb_upcallarg = arg;
> sb->sb_flags |= SB_UPCALL;
> }
>
> void
> soupcall_clear(struct socket *so, int which)
> {
> struct sockbuf *sb;
>
> switch (which) {
> case SO_RCV:
> sb = &so->so_rcv;
> break;
> case SO_SND:
> sb = &so->so_snd;
> break;
> default:
> panic("soupcall_clear: bad which");
> }
> SOCKBUF_LOCK_ASSERT(sb);
> KASSERT(sb->sb_upcall != NULL, ("soupcall_clear: no upcall to clear"));
> sb->sb_upcall = NULL;
> sb->sb_upcallarg = NULL;
> sb->sb_flags &= ~SB_UPCALL;
> }
>
> /*