chiark / gitweb /
+ * Cast ptrdiff_t to int for %.*s length in adnsheloex and adnslogres,
[adns.git] / client / adnstest.c
index b994e7bde8283bfee8685d46e483ed0e1ac01035..550cf275642f7f29683a9c278bf90e22b49bb274 100644 (file)
@@ -3,7 +3,11 @@
  * - simple test program, not part of the library
  */
 /*
- *  This file is part of adns, which is Copyright (C) 1997-1999 Ian Jackson
+ *  This file is part of adns, which is
+ *    Copyright (C) 1997-2000,2003,2006  Ian Jackson
+ *    Copyright (C) 1999-2000,2003,2006  Tony Finch
+ *    Copyright (C) 1991 Massachusetts Institute of Technology
+ *  (See the file INSTALL for full details.)
  *  
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
 #include <string.h>
 #include <errno.h>
 
-#include "adns.h"
-
 #include "config.h"
+#include "adns.h"
 
-#ifndef OUTPUTSTREAM
-# define OUTPUTSTREAM stdout
+#ifdef ADNS_REGRESS_TEST
+# include "hredirect.h"
 #endif
 
+struct myctx {
+  adns_query qu;
+  int doneyet, found;
+  const char *fdom;
+};
+  
+static struct myctx *mcs;
+static adns_state ads;
+static adns_rrtype *types_a;
+
+static void quitnow(int rc) NONRETURNING;
+static void quitnow(int rc) {
+  free(mcs);
+  free(types_a);
+  if (ads) adns_finish(ads);
+  
+  exit(rc);
+}
+
 #ifndef HAVE_POLL
 #undef poll
 int poll(struct pollfd *ufds, int nfds, int timeout) {
   fputs("poll(2) not supported on this system\n",stderr);
-  exit(5);
+  quitnow(5);
 }
 #define adns_beforepoll(a,b,c,d,e) 0
 #define adns_afterpoll(a,b,c,d) 0
@@ -49,13 +71,24 @@ int poll(struct pollfd *ufds, int nfds, int timeout) {
 static void failure_status(const char *what, adns_status st) NONRETURNING;
 static void failure_status(const char *what, adns_status st) {
   fprintf(stderr,"adns failure: %s: %s\n",what,adns_strerror(st));
-  exit(2);
+  quitnow(2);
 }
 
 static void failure_errno(const char *what, int errnoval) NONRETURNING;
 static void failure_errno(const char *what, int errnoval) {
-  fprintf(stderr,"adns failure: %s: errno=%d\n",what,errnoval);
-  exit(2);
+  switch (errnoval) {
+#define CE(e) \
+  case e: fprintf(stderr,"adns failure: %s: errno=" #e "\n",what); break
+  CE(EINVAL);
+  CE(EINTR);
+  CE(ESRCH);
+  CE(EAGAIN);
+  CE(ENOSYS);
+  CE(ERANGE);
+#undef CE
+  default: fprintf(stderr,"adns failure: %s: errno=%d\n",what,errnoval); break;
+  }
+  quitnow(2);
 }
 
 static void usageerr(const char *why) NONRETURNING;
@@ -75,7 +108,7 @@ static void usageerr(const char *why) {
          "              4 usage error\n"
          "              5 operation not supported on this system\n",
          why);
-  exit(4);
+  quitnow(4);
 }
 
 static const adns_rrtype defaulttypes[]= {
@@ -102,7 +135,7 @@ static const adns_rrtype defaulttypes[]= {
 
 static void dumptype(adns_status ri, const char *rrtn, const char *fmtn) {
   fprintf(stdout, "%s(%s)%s%s",
-         ri ? "?" : rrtn, ri ? "?" : fmtn ? fmtn : "-",
+         (!ri && rrtn) ? rrtn : "?", ri ? "?" : fmtn ? fmtn : "-",
          ri ? " " : "", ri ? adns_strerror(ri) : "");
 }
 
@@ -115,7 +148,7 @@ static void fdom_split(const char *fdom, const char **dom_r, int *qf_r,
   if (*ep == ',' && strchr(ep,'/')) {
     ep++;
     while (*ep != '/') {
-      if (--ownflags_l <= 0) { fputs("too many flags\n",stderr); exit(3); }
+      if (--ownflags_l <= 0) { fputs("too many flags\n",stderr); quitnow(3); }
       *ownflags++= *ep++;
     }
   }
@@ -129,27 +162,18 @@ static int consistsof(const char *string, const char *accept) {
 }
 
 int main(int argc, char *const *argv) {
-  struct myctx {
-    adns_query qu;
-    int doneyet, found;
-    const char *fdom;
-  };
-  
-  adns_state ads;
   adns_query qu;
-  struct myctx *mcs, *mc, *mcw;
+  struct myctx *mc, *mcw;
   void *mcr;
   adns_answer *ans;
   const char *initstring, *rrtn, *fmtn;
   const char *const *fdomlist, *domain;
   char *show, *cp;
-  int len, i, qc, qi, tc, ti, ch, qflags, initflagsnum, npollfds, npollfdsavail, timeout;
-  struct pollfd *pollfds;
+  int len, i, qc, qi, tc, ti, ch, qflags, initflagsnum;
   adns_status ri;
   int r;
   const adns_rrtype *types;
   struct timeval now;
-  adns_rrtype *types_a;
   char ownflags[10];
   char *ep;
   const char *initflags, *owninitflags;
@@ -181,7 +205,7 @@ int main(int argc, char *const *argv) {
     for (cp= argv[1]+1, tc=1; (ch= *cp); cp++)
       if (ch==',') tc++;
     types_a= malloc(sizeof(*types_a)*(tc+1));
-    if (!types_a) { perror("malloc types"); exit(3); }
+    if (!types_a) { perror("malloc types"); quitnow(3); }
     for (cp= argv[1]+1, ti=0; ti<tc; ti++) {
       types_a[ti]= strtoul(cp,&cp,10);
       if ((ch= *cp)) {
@@ -189,10 +213,11 @@ int main(int argc, char *const *argv) {
        cp++;
       }
     }
-    *cp++= adns_r_none;
+    types_a[ti]= adns_r_none;
     types= types_a;
     argv++;
   } else {
+    types_a= 0;
     types= defaulttypes;
   }
   
@@ -201,12 +226,15 @@ int main(int argc, char *const *argv) {
 
   for (qc=0; fdomlist[qc]; qc++);
   for (tc=0; types[tc] != adns_r_none; tc++);
-  mcs= malloc(sizeof(*mcs)*qc*tc);
-  if (!mcs) { perror("malloc mcs"); exit(3); }
+  mcs= malloc(tc ? sizeof(*mcs)*qc*tc : 1);
+  if (!mcs) { perror("malloc mcs"); quitnow(3); }
 
+  setvbuf(stdout,0,_IOLBF,0);
+  
   if (initstring) {
     r= adns_init_strcfg(&ads,
-                       (adns_if_debug|adns_if_noautosys)^initflagsnum,
+                       (adns_if_debug|adns_if_noautosys|adns_if_checkc_freq)
+                       ^initflagsnum,
                        stdout,initstring);
   } else {
     r= adns_init(&ads,
@@ -215,9 +243,6 @@ int main(int argc, char *const *argv) {
   }
   if (r) failure_errno("init",r);
 
-  npollfdsavail= 0;
-  pollfds= 0;
-  
   for (qi=0; qi<qc; qi++) {
     fdom_split(fdomlist[qi],&domain,&qflags,ownflags,sizeof(ownflags));
     if (!consistsof(ownflags,"a")) usageerr("unknown ownqueryflag");
@@ -278,23 +303,7 @@ int main(int argc, char *const *argv) {
     }
 
     if (strchr(owninitflags,'p')) {
-      for (;;) {
-       r= adns_check(ads,&qu,&ans,&mcr);
-       if (r != EWOULDBLOCK) break;
-       for (;;) {
-         npollfds= npollfdsavail;
-         timeout= -1;
-         r= adns_beforepoll(ads, pollfds, &npollfds, &timeout, 0);
-         if (r != ERANGE) break;
-         pollfds= realloc(pollfds,sizeof(*pollfds)*npollfds);
-         if (!pollfds) failure_errno("realloc pollfds",errno);
-         npollfdsavail= npollfds;
-       }
-       if (r) failure_errno("beforepoll",r);
-       r= poll(pollfds,npollfds,timeout);
-       if (r == -1) failure_errno("poll",errno);
-       adns_afterpoll(ads,pollfds, r?npollfds:0, 0);
-      }
+      r= adns_wait_poll(ads,&qu,&ans,&mcr);
     } else {
       r= adns_wait(ads,&qu,&ans,&mcr);
     }
@@ -307,7 +316,7 @@ int main(int argc, char *const *argv) {
     
     fdom_split(mc->fdom,&domain,&qflags,ownflags,sizeof(ownflags));
 
-    if (gettimeofday(&now,0)) { perror("gettimeofday"); exit(3); }
+    if (gettimeofday(&now,0)) { perror("gettimeofday"); quitnow(3); }
       
     ri= adns_rr_info(ans->type, &rrtn,&fmtn,&len, 0,0);
     fprintf(stdout, "%s flags %d type ",domain,qflags);
@@ -335,8 +344,5 @@ int main(int argc, char *const *argv) {
     mc->doneyet= 1;
   }
 
-  free(mcs);
-  adns_finish(ads);
-  
-  exit(0);
+  quitnow(0);
 }