From 84ada014b1bf2cf7e5a38320be7371dbbf91bb23 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Wed, 28 May 2014 23:52:34 +0100 Subject: [PATCH] regress/: Use adns_addr2text/text2addr instead of inet_aton/ntoa. Makes the test harness agnostic regarding address families. Signed-off-by: Mark Wooding --- regress/hcommon.c | 10 ++++++---- regress/hcommon.c.m4 | 13 ++++++++----- regress/hplayback.c | 44 ++++++++++++++++++++++++++++-------------- regress/hplayback.c.m4 | 42 ++++++++++++++++++++++++++-------------- 4 files changed, 70 insertions(+), 39 deletions(-) diff --git a/regress/hcommon.c b/regress/hcommon.c index 2ee9d41..7aada14 100644 --- a/regress/hcommon.c +++ b/regress/hcommon.c @@ -143,10 +143,12 @@ void Qwrite( int fd , const void *buf , size_t len ) { Q_vb(); } void Tvbaddr(const struct sockaddr *addr, int len) { - const struct sockaddr_in *ai= (const struct sockaddr_in*)addr; - assert(len==sizeof(struct sockaddr_in)); - assert(ai->sin_family==AF_INET); - Tvbf("%s:%u",inet_ntoa(ai->sin_addr),htons(ai->sin_port)); + char buf[ADNS_ADDR2TEXT_BUFLEN]; + int err, port; + int sz= sizeof(buf); + err= adns_addr2text(addr, 0, buf,&sz, &port); + assert(!err); + Tvbf(strchr(buf, ':') ? "[%s]:%d" : "%s:%d", buf,port); } void Tvbbytes(const void *buf, int len) { const byte *bp; diff --git a/regress/hcommon.c.m4 b/regress/hcommon.c.m4 index 03ff5d7..d8b9821 100644 --- a/regress/hcommon.c.m4 +++ b/regress/hcommon.c.m4 @@ -129,11 +129,14 @@ m4_define(`hm_specsyscall', `') m4_include(`hsyscalls.i4') void Tvbaddr(const struct sockaddr *addr, int len) { - const struct sockaddr_in *ai= (const struct sockaddr_in*)addr; - - assert(len==sizeof(struct sockaddr_in)); - assert(ai->sin_family==AF_INET); - Tvbf("%s:%u",inet_ntoa(ai->sin_addr),htons(ai->sin_port)); + char buf[ADNS_ADDR2TEXT_BUFLEN]; + int err, port; + int sz= sizeof(buf); + + err= adns_addr2text(addr, 0, buf,&sz, &port); + assert(!err); + + Tvbf(strchr(buf, ':') ? "[%s]:%d" : "%s:%d", buf,port); } void Tvbbytes(const void *buf, int len) { diff --git a/regress/hplayback.c b/regress/hplayback.c index d229f34..c14426c 100644 --- a/regress/hplayback.c +++ b/regress/hplayback.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include "harness.h" @@ -153,21 +154,34 @@ static void Ppollfds(struct pollfd *fds, int nfds) { } #endif static void Paddr(struct sockaddr *addr, int *lenr) { - struct sockaddr_in *sa= (struct sockaddr_in*)addr; - char *p, *ep; - long ul; - assert(*lenr >= sizeof(*sa)); - p= strchr(vb2.buf+vb2.used,':'); - if (!p) Psyntax("no port on address"); - *p++= 0; - memset(sa,0,sizeof(*sa)); - sa->sin_family= AF_INET; - if (!inet_aton(vb2.buf+vb2.used,&sa->sin_addr)) Psyntax("invalid address"); - ul= strtoul(p,&ep,10); - if (*ep && *ep != ' ') Psyntax("invalid port (bad syntax)"); - if (ul >= 65536) Psyntax("port too large"); - sa->sin_port= htons(ul); - *lenr= sizeof(*sa); + struct addrinfo *ai, hint = { 0 }; + char *p, *q, *ep; + int err; + p= vb2.buf+vb2.used; + if (*p!='[') { + q= strchr(p,':'); + if (!q) Psyntax("missing :"); + *q++= 0; + } else { + p++; + q= strchr(p,']'); + if (!q) Psyntax("missing ]"); + *q++= 0; + if (*q!=':') Psyntax("expected : after ]"); + q++; + } + for (ep=q; ctype_digit(*ep); ep++); + if (ep==q || (*ep && *ep!=' ')) Psyntax("invalid port number"); + *ep= 0; + hint.ai_socktype= SOCK_DGRAM; + hint.ai_family= AF_UNSPEC; + hint.ai_flags= AI_NUMERICHOST | AI_NUMERICSERV; + err= getaddrinfo(p, q, &hint, &ai); + if (err) Psyntax("invalid address"); + assert(*lenr >= ai->ai_addrlen); + memcpy(addr, ai->ai_addr, ai->ai_addrlen); + *lenr= ai->ai_addrlen; + freeaddrinfo(ai); vb2.used= ep - (char*)vb2.buf; } static int Pbytes(byte *buf, int maxlen) { diff --git a/regress/hplayback.c.m4 b/regress/hplayback.c.m4 index 679cff1..dfb0a0c 100644 --- a/regress/hplayback.c.m4 +++ b/regress/hplayback.c.m4 @@ -210,23 +210,35 @@ static void Ppollfds(struct pollfd *fds, int nfds) { #endif static void Paddr(struct sockaddr *addr, int *lenr) { - struct sockaddr_in *sa= (struct sockaddr_in*)addr; - char *p, *ep; - long ul; - - assert(*lenr >= sizeof(*sa)); - p= strchr(vb2.buf+vb2.used,':'); - if (!p) Psyntax("no port on address"); - *p++= 0; - memset(sa,0,sizeof(*sa)); - sa->sin_family= AF_INET; - if (!inet_aton(vb2.buf+vb2.used,&sa->sin_addr)) Psyntax("invalid address"); - ul= strtoul(p,&ep,10); - if (*ep && *ep != hm_squote hm_squote) Psyntax("invalid port (bad syntax)"); + adns_rr_addr a; + char *p, *q, *ep; + int err; + unsigned long ul; + + p= vb2.buf+vb2.used; + if (*p!='[') { + q= strchr(p,':'); + if (!q) Psyntax("missing :"); + *q++= 0; + } else { + p++; + q= strchr(p,']'); + if (!q) Psyntax("missing ]"); + *q++= 0; + if (*q!=':') Psyntax("expected : after ]"); + q++; + } + ul= strtoul(q,&ep,10); + if (*ep && *ep != ' ') Psyntax("invalid port (bad syntax)"); if (ul >= 65536) Psyntax("port too large"); - sa->sin_port= htons(ul); - *lenr= sizeof(*sa); + a.len= sizeof(a.addr); + err= adns_text2addr(p, (int)ul, 0, &a.addr.sa,&a.len); + if (err) Psyntax("invalid address"); + + assert(*lenr >= a.len); + memcpy(addr, &a.addr, a.len); + *lenr= a.len; vb2.used= ep - (char*)vb2.buf; } -- 2.30.2