chiark / gitweb /
regress/: Use adns_addr2text/text2addr instead of inet_aton/ntoa.
authorMark Wooding <mdw@distorted.org.uk>
Wed, 28 May 2014 22:52:34 +0000 (23:52 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 19 Oct 2014 20:09:54 +0000 (21:09 +0100)
Makes the test harness agnostic regarding address families.

Signed-off-by: Mark Wooding <mdw@distorted.org.uk>
regress/hcommon.c
regress/hcommon.c.m4
regress/hplayback.c
regress/hplayback.c.m4

index 2ee9d417776f0a6277025f96405585aaa0e25f9c..7aada144aed629c37d49df95de3da19cf666f141 100644 (file)
@@ -143,10 +143,12 @@ void Qwrite(      int fd , const void *buf , size_t len   ) {
   Q_vb();
 }
 void Tvbaddr(const struct sockaddr *addr, int 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;
 }
 void Tvbbytes(const void *buf, int len) {
   const byte *bp;
index 03ff5d7177be3717be5700e194434a503b7a1b84..d8b9821c94e86b470a03118a3e5494f5cf2b2d5c 100644 (file)
@@ -129,11 +129,14 @@ m4_define(`hm_specsyscall', `')
 m4_include(`hsyscalls.i4')
 
 void Tvbaddr(const struct sockaddr *addr, int len) {
 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) {
 }
 
 void Tvbbytes(const void *buf, int len) {
index d229f34f6f9680cf5d419fbb49f550ffdb5114d9..c14426c5588f8c6d36abf1fb53621f5b776d73d5 100644 (file)
@@ -7,6 +7,7 @@
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <sys/time.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <sys/time.h>
+#include <netdb.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include "harness.h"
 #include <unistd.h>
 #include <fcntl.h>
 #include "harness.h"
@@ -153,21 +154,34 @@ static void Ppollfds(struct pollfd *fds, int nfds) {
 }
 #endif
 static void Paddr(struct sockaddr *addr, int *lenr) {
 }
 #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) {
   vb2.used= ep - (char*)vb2.buf;
 }
 static int Pbytes(byte *buf, int maxlen) {
index 679cff16a928a76ffb935123db480160d5418eed..dfb0a0c2eaeac98dfbe0b11541c064d75910b06c 100644 (file)
@@ -210,23 +210,35 @@ static void Ppollfds(struct pollfd *fds, int nfds) {
 #endif
 
 static void Paddr(struct sockaddr *addr, int *lenr) {
 #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");
   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;
 }
 
   vb2.used= ep - (char*)vb2.buf;
 }