From d0708bae1c9b9598798e2cc340364a8006b77db7 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 12 Oct 2019 12:42:47 +0100 Subject: [PATCH] test: udp-preload: Provide setsockopt Signed-off-by: Ian Jackson --- test/udp-preload.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/test/udp-preload.c b/test/udp-preload.c index ec3be09..86240a4 100644 --- a/test/udp-preload.c +++ b/test/udp-preload.c @@ -59,9 +59,12 @@ static anyfn_type *find_any(const char *name) { #define socket_args int domain, int type, int protocol #define bind_args int fd, const struct sockaddr *addr, socklen_t addrlen -#define WRAPS(X) \ - X(socket, (domain,type,protocol)) \ - X(bind, (fd,addr,addrlen)) +#define setsockopt_args int fd, int level, int optname, \ + const void *optval, socklen_t optlen +#define WRAPS(X) \ + X(socket, (domain,type,protocol)) \ + X(bind, (fd,addr,addrlen)) \ + X(setsockopt, (fd,level,optname,optval,optlen)) #define DEF_OLD(fn,args) \ typedef int fn##_fn_type(fn##_args); \ @@ -160,4 +163,13 @@ WRAP(bind) { return old_bind(fd,(const void*)&sun,sizeof(sun)); } -//udp (test/tmp/outside.conf:19): setsockopt(,IPV6_V6ONLY,&1,): Operation not supported +WRAP(setsockopt) { + fdinfo *ent=lookup(fd); + if (!ent) return old_setsockopt(fd,level,optname,optval,optlen); + if (ent->af==AF_INET6 && level==IPPROTO_IPV6 && optname==IPV6_V6ONLY + && optlen==sizeof(int) && *(int*)optval==1) { + return 0; + } + errno=ENOTTY; + return -1; +} -- 2.30.2