From 7d51fc4741a7ac86fcff8e6bb7be465750d9018d Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Fri, 19 Sep 2014 21:02:47 +0100 Subject: [PATCH] resolver: Support IPv6 literals With CONFIG_IPV6, use adns_addr2text instead of inet_ntoa. Signed-off-by: Ian Jackson --- resolver.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/resolver.c b/resolver.c index f2023fa..f2c620b 100644 --- a/resolver.c +++ b/resolver.c @@ -34,8 +34,13 @@ static bool_t resolve_request(void *sst, cstring_t name, struct adns *st=sst; struct query *q; int rv; - const int maxlitlen=50; - + const int maxlitlen= +#ifdef CONFIG_IPV6 + ADNS_ADDR2TEXT_BUFLEN*2 +#else + 50 +#endif + ; ssize_t l=strlen(name); if (name[0]=='[' && l2 && name[l-1]==']') { char trimmed[maxlitlen+1]; @@ -45,12 +50,28 @@ static bool_t resolve_request(void *sst, cstring_t name, FILLZERO(ca); ca.comm=comm; ca.ix=-1; +#ifdef CONFIG_IPV6 + socklen_t salen=sizeof(ca.ia); + rv=adns_text2addr(trimmed, port, adns_qf_addrlit_ipv4_quadonly, + &ca.ia.sa, &salen); + assert(rv!=ENOSPC); + if (rv) { + char msg[250]; + snprintf(msg,sizeof(msg),"invalid address literal: %s", + strerror(rv)); + msg[sizeof(msg)-1]=0; + cb(cst,0,0,msg); + } else { + cb(cst,&ca,1,0); + } +#else ca.ia.sin.sin_family=AF_INET; ca.ia.sin.sin_port=htons(port); if (inet_aton(trimmed,&ca.ia.sin.sin_addr)) cb(cst,&ca,1,0); else cb(cst,0,0,"invalid IP address"); +#endif return True; } -- 2.30.2