chiark / gitweb /
regression tests: Properly handle adnshost et al exit status
[adns.git] / regress / hcommon.c
index 2cd3508a251dd7434ad0ef0b9ac736f295502d6f..0aa3ffb05e58550310f050f708ed06ebc1b95602 100644 (file)
@@ -29,10 +29,12 @@ const struct Terrno Terrnos[]= {
   { "ECONNRESET",                ECONNRESET                   },
   { "ECONNREFUSED",              ECONNREFUSED                 },
   { "EPIPE",                     EPIPE                        },
+  { "ENOTSOCK",                  ENOTSOCK                     },
   {  0,                          0                            }
 };
 static vbuf vbw;
 int Hgettimeofday(struct timeval *tv, struct timezone *tz) {
+  Tensurerecordfile();
   Tmust("gettimeofday","tz",!tz);
   *tv= currenttime;
   return 0;
@@ -65,9 +67,12 @@ void Qpoll(  const struct pollfd *fds , int nfds , int timeout       ) {
   Q_vb();
 }
 #endif
-void Qsocket(   int type       ) {
+void Qsocket(  int domain , int type   ) {
  vb.used= 0;
  Tvba("socket");
+  Tvbf(domain==AF_INET ? " domain=AF_INET" :
+         domain==AF_INET6 ? " domain=AF_INET6" :
+         " domain=AF_???"); 
   Tvbf(type==SOCK_STREAM ? " type=SOCK_STREAM" : " type=SOCK_DGRAM"); 
   Q_vb();
 }
@@ -91,6 +96,20 @@ void Qconnect(       int fd , const struct sockaddr *addr , int addrlen      ) {
        Tvba(" addr="); Tvbaddr(addr,addrlen); 
   Q_vb();
 }
+void Qbind(    int fd , const struct sockaddr *addr , int addrlen      ) {
+ vb.used= 0;
+ Tvba("bind");
+       Tvbf(" fd=%d",fd); 
+       Tvba(" addr="); Tvbaddr(addr,addrlen); 
+  Q_vb();
+}
+void Qlisten(  int fd , int backlog    ) {
+ vb.used= 0;
+ Tvba("listen");
+       Tvbf(" fd=%d",fd); 
+       Tvbf(" backlog=%d",backlog); 
+  Q_vb();
+}
 void Qclose(   int fd  ) {
  vb.used= 0;
  Tvba("close");
@@ -110,7 +129,6 @@ void Qrecvfrom(     int fd , int buflen , int addrlen       ) {
  Tvba("recvfrom");
        Tvbf(" fd=%d",fd); 
        Tvbf(" buflen=%lu",(unsigned long)buflen); 
-       Tvbf(" *addrlen=%d",addrlen); 
   Q_vb();
 }
 void Qread(    int fd , size_t buflen  ) {
@@ -128,10 +146,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;
@@ -147,6 +167,10 @@ void Tvbbytes(const void *buf, int len) {
 void Tvbfdset(int max, const fd_set *fds) {
   int i;
   const char *comma= "";
+  if (!fds) {
+    Tvba("null");
+    return;
+  }
   Tvba("[");
   for (i=0; i<max; i++) {
     if (!FD_ISSET(i,fds)) continue;
@@ -261,11 +285,11 @@ void *Hrealloc(void *op, size_t nsz) {
   size_t osz;
   if (op) { oldnode= (void*)((char*)op - MALLOCHSZ); osz= oldnode->sz; } else { osz= 0; }
   np= Hmalloc(nsz);
-  memcpy(np,op, osz>nsz ? nsz : osz);
+  if (osz) memcpy(np,op, osz>nsz ? nsz : osz);
   Hfree(op);
   return np;
 }
-void Hexit(int rv) {
+void Texit(int rv) {
   struct malloced *loopnode;
   Tshutdown();
   adns__vbuf_free(&vb);
@@ -273,9 +297,18 @@ void Hexit(int rv) {
   if (mallocedlist.head) {
     fprintf(stderr,"adns test harness: memory leaked:");
     for (loopnode=mallocedlist.head; loopnode; loopnode=loopnode->next)
-      fprintf(stderr," %lu(%lu)",loopnode->count,(unsigned long)loopnode->sz);
+      fprintf(stderr," %lu",loopnode->count);
     putc('\n',stderr);
     if (ferror(stderr)) exit(-1);
   }
   exit(rv);
 }
+void Hexit(int rv) {
+  vb.used= 0;
+  Tvbf("exit %d", rv);
+  Q_vb();
+  Texit(0);
+}
+pid_t Hgetpid(void) {
+  return 2264; /* just some number */
+}