diff options
-rw-r--r-- | sys/kern/uipc_accf.c | 27 | ||||
-rw-r--r-- | sys/kern/uipc_socket.c | 19 | ||||
-rw-r--r-- | sys/sys/socketvar.h | 1 |
3 files changed, 29 insertions, 18 deletions
diff --git a/sys/kern/uipc_accf.c b/sys/kern/uipc_accf.c index 1a0a41c66e46..8991120a4312 100644 --- a/sys/kern/uipc_accf.c +++ b/sys/kern/uipc_accf.c @@ -163,6 +163,33 @@ accept_filt_generic_mod_event(module_t mod, int event, void *data) } int +do_getopt_accept_filter(struct socket *so, struct sockopt *sopt) +{ + struct accept_filter_arg *afap; + int error; + + error = 0; + MALLOC(afap, struct accept_filter_arg *, sizeof(*afap), M_TEMP, + M_WAITOK | M_ZERO); + SOCK_LOCK(so); + if ((so->so_options & SO_ACCEPTCONN) == 0) { + error = EINVAL; + goto out; + } + if ((so->so_options & SO_ACCEPTFILTER) == 0) + goto out; + strcpy(afap->af_name, so->so_accf->so_accept_filter->accf_name); + if (so->so_accf->so_accept_filter_str != NULL) + strcpy(afap->af_arg, so->so_accf->so_accept_filter_str); +out: + SOCK_UNLOCK(so); + if (error == 0) + error = sooptcopyout(sopt, afap, sizeof(*afap)); + FREE(afap, M_TEMP); + return (error); +} + +int do_setopt_accept_filter(struct socket *so, struct sockopt *sopt) { struct accept_filter_arg *afap; diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index 867e0d9ad283..694747d2a015 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -1745,9 +1745,6 @@ sogetopt(so, sopt) int error, optval; struct linger l; struct timeval tv; -#ifdef INET - struct accept_filter_arg *afap; -#endif #ifdef MAC struct mac extmac; #endif @@ -1763,23 +1760,9 @@ sogetopt(so, sopt) switch (sopt->sopt_name) { #ifdef INET case SO_ACCEPTFILTER: - /* Unlocked read. */ - if ((so->so_options & SO_ACCEPTCONN) == 0) - return (EINVAL); - MALLOC(afap, struct accept_filter_arg *, sizeof(*afap), - M_TEMP, M_WAITOK | M_ZERO); - SOCK_LOCK(so); - if ((so->so_options & SO_ACCEPTFILTER) != 0) { - strcpy(afap->af_name, so->so_accf->so_accept_filter->accf_name); - if (so->so_accf->so_accept_filter_str != NULL) - strcpy(afap->af_arg, so->so_accf->so_accept_filter_str); - } - SOCK_UNLOCK(so); - error = sooptcopyout(sopt, afap, sizeof(*afap)); - FREE(afap, M_TEMP); + error = do_getopt_accept_filter(so, sopt); break; #endif - case SO_LINGER: SOCK_LOCK(so); l.l_onoff = so->so_options & SO_LINGER; diff --git a/sys/sys/socketvar.h b/sys/sys/socketvar.h index 415a6c257c9e..7b32f80d5cab 100644 --- a/sys/sys/socketvar.h +++ b/sys/sys/socketvar.h @@ -447,6 +447,7 @@ struct uio; /* * From uipc_socket and friends */ +int do_getopt_accept_filter(struct socket *so, struct sockopt *sopt); int do_setopt_accept_filter(struct socket *so, struct sockopt *sopt); int so_setsockopt(struct socket *so, int level, int optname, void *optval, size_t optlen); |