From: Ian Jackson Date: Sat, 12 Oct 2019 11:42:47 +0000 (+0100) Subject: test: udp-preload: Provide setsockopt X-Git-Tag: v0.5.0~111 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=commitdiff_plain;h=d0708bae1c9b9598798e2cc340364a8006b77db7;hp=24333a4b2ec70bb1bdaa0ce0390b666092def4c1;p=secnet.git test: udp-preload: Provide setsockopt Signed-off-by: Ian Jackson --- 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; +}