Makes the test harness agnostic regarding address families.
Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
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;
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) {
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/time.h>
+#include <netdb.h>
#include <unistd.h>
#include <fcntl.h>
#include "harness.h"
}
#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) {
#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;
}