summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/kern/uipc_accf.c27
-rw-r--r--sys/kern/uipc_socket.c19
-rw-r--r--sys/sys/socketvar.h1
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);