From 3ff31eda6e86ffc7d276635fe117c7408a72b719 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Fri, 19 Sep 2014 22:48:45 +0100 Subject: [PATCH] udp: Support IPv6 when using authbind Signed-off-by: Ian Jackson --- udp.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/udp.c b/udp.c index fe60368..80299ac 100644 --- a/udp.c +++ b/udp.c @@ -278,20 +278,35 @@ static void udp_make_socket(struct udp *st, struct udpsock *us) fatal_perror("udp_phase_hook: fork() for authbind"); } if (c==0) { - char *argv[4], addrstr[9], portstr[5]; + char *argv[5], addrstr[33], portstr[5]; + const char *addrfam; + int port; switch (addr->sa.sa_family) { case AF_INET: sprintf(addrstr,"%08lX",(long)addr->sin.sin_addr.s_addr); - sprintf(portstr,"%04X",addr->sin.sin_port); + port=addr->sin.sin_port; + addrfam=NULL; break; +#ifdef CONFIG_IPV6 + case AF_INET6: { + int i; + for (i=0; i<16; i++) + sprintf(addrstr+i*2,"%02X",addr->sin6.sin6_addr.s6_addr[i]); + port=addr->sin6.sin6_port; + addrfam="6"; + break; + } +#endif /*CONFIG_IPV6*/ default: fatal("udp (%s:%d): unsupported address family for authbind", st->loc.file,st->loc.line); } + sprintf(portstr,"%04X",port); argv[0]=st->authbind; argv[1]=addrstr; argv[2]=portstr; - argv[3]=NULL; + argv[3]=(char*)addrfam; + argv[4]=NULL; dup2(us->fd,0); execvp(st->authbind,argv); _exit(255); -- 2.30.2