Update copyright dates and documentation.
[adns] / client / adnsresfilter.c
index db7a631..3a3cacf 100644 (file)
@@ -4,11 +4,11 @@
  */
 /*
  *  This file is
  */
 /*
  *  This file is
- *    Copyright (C) 1999 Ian Jackson <ian@davenant.greenend.org.uk>
+ *    Copyright (C) 1999-2000 Ian Jackson <ian@davenant.greenend.org.uk>
  *
  *  It is part of adns, which is
  *    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
  *
  *  It is part of adns, which is
  *    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
- *    Copyright (C) 1999 Tony Finch <dot@dotat.at>
+ *    Copyright (C) 1999-2000 Tony Finch <dot@dotat.at>
  *  
  *  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
  *  
  *  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 <unistd.h>
 #include <fcntl.h>
 
 #include <unistd.h>
 #include <fcntl.h>
 
-#include "adns.h"
 #include "config.h"
 #include "config.h"
+#include "adns.h"
 #include "dlist.h"
 #include "tvarith.h"
 
 #include "dlist.h"
 #include "tvarith.h"
 
+#ifdef ADNS_REGRESS_TEST
+# include "hredirect.h"
+#endif
+
 struct outqueuenode {
   struct outqueuenode *next, *back;
   void *buffer;
 struct outqueuenode {
   struct outqueuenode *next, *back;
   void *buffer;
@@ -54,6 +58,8 @@ struct outqueuenode {
 static int bracket, forever, address;
 static unsigned long timeout= 1000;
 static adns_rrtype rrt= adns_r_ptr;
 static int bracket, forever, address;
 static unsigned long timeout= 1000;
 static adns_rrtype rrt= adns_r_ptr;
+static adns_initflags initflags= 0;
+static const char *config_text;
 
 static int outblocked, inputeof;
 static struct { struct outqueuenode *head, *tail; } outqueue;
 
 static int outblocked, inputeof;
 static struct { struct outqueuenode *head, *tail; } outqueue;
@@ -116,9 +122,12 @@ static void usage(void) {
             "         -b|--brackets    (require [...] around IP addresses)\n"
             "         -a|--address     (always include [address] in output)\n"
             "         -u|--unchecked   (do not forward map for checking)\n"
             "         -b|--brackets    (require [...] around IP addresses)\n"
             "         -a|--address     (always include [address] in output)\n"
             "         -u|--unchecked   (do not forward map for checking)\n"
+            "         --config <text>  (use this instead of resolv.conf)\n"
+            "         --debug          (turn on adns resolver debugging)\n"
             "Timeout is the maximum amount to delay any particular bit of output for.\n"
             "Timeout is the maximum amount to delay any particular bit of output for.\n"
-            "Lookups will go on in the background.  Default timeout = 100 (ms).\n")
+            "Lookups will go on in the background.  Default timeout = 1000 (ms).\n")
       == EOF) outputerr();
       == EOF) outputerr();
+  if (fflush(stdout)) sysfail("flush stdout");
 }
 
 static void usageerr(const char *why) NONRETURNING;
 }
 
 static void usageerr(const char *why) NONRETURNING;
@@ -147,48 +156,53 @@ static void parseargs(const char *const *argv) {
   while ((arg= *++argv)) {
     if (arg[0] != '-') usageerr("no non-option arguments are allowed");
     if (arg[1] == '-') {
   while ((arg= *++argv)) {
     if (arg[0] != '-') usageerr("no non-option arguments are allowed");
     if (arg[1] == '-') {
-      if (!strcmp(arg,"--brackets")) {
-       bracket= 1;
-      } else if (!strcmp(arg,"--unchecked")) {
-       rrt= adns_r_ptr_raw;
+      if (!strcmp(arg,"--timeout")) {
+       if (!(arg= *++argv)) usageerr("--timeout needs a value");
+       settimeout(arg);
+       forever= 0;
       } else if (!strcmp(arg,"--wait")) {
        forever= 1;
       } else if (!strcmp(arg,"--wait")) {
        forever= 1;
+      } else if (!strcmp(arg,"--brackets")) {
+       bracket= 1;
       } else if (!strcmp(arg,"--address")) {
        address= 1;
       } else if (!strcmp(arg,"--address")) {
        address= 1;
+      } else if (!strcmp(arg,"--unchecked")) {
+       rrt= adns_r_ptr_raw;
+      } else if (!strcmp(arg,"--config")) {
+       if (!(arg= *++argv)) usageerr("--config needs a value");
+       config_text= arg;
+      } else if (!strcmp(arg,"--debug")) {
+       initflags |= adns_if_debug;
       } else if (!strcmp(arg,"--help")) {
        usage(); quit(0);
       } else if (!strcmp(arg,"--help")) {
        usage(); quit(0);
-      } else if (!strcmp(arg,"--timeout")) {
-       if (!(arg= *++argv)) usageerr("--timeout needs a value");
-       settimeout(arg);
-       forever= 0;
       } else {
        usageerr("unknown long option");
       }
     } else {
       while ((c= *++arg)) {
        switch (c) {
       } else {
        usageerr("unknown long option");
       }
     } else {
       while ((c= *++arg)) {
        switch (c) {
-       case 'b':
-         bracket= 1;
-         break;
-       case 'u':
-         rrt= adns_r_ptr_raw;
+       case 't':
+         if (*++arg) settimeout(arg);
+         else if ((arg= *++argv)) settimeout(arg);
+         else usageerr("-t needs a value");
+         forever= 0;
+         arg= "\0";
          break;
        case 'w':
          forever= 1;
          break;
          break;
        case 'w':
          forever= 1;
          break;
+       case 'b':
+         bracket= 1;
+         break;
        case 'a':
          address= 1;
          break;
        case 'a':
          address= 1;
          break;
+       case 'u':
+         rrt= adns_r_ptr_raw;
+         break;
        case 'h':
          usage();
          quit(0);
        case 'h':
          usage();
          quit(0);
-       case 't':
-         if (*++arg) settimeout(arg);
-         else if ((arg= *++argv)) settimeout(arg);
-         else usageerr("-t needs a value");
-         forever= 0;
-         arg= "\0";
-         break;
        default:
          usageerr("unknown short option");
        }
        default:
          usageerr("unknown short option");
        }
@@ -380,7 +394,12 @@ static void startup(void) {
   if (nonblock(1,1)) sysfail("set stdout to nonblocking mode");
   memset(&sa,0,sizeof(sa));
   sa.sin_family= AF_INET;
   if (nonblock(1,1)) sysfail("set stdout to nonblocking mode");
   memset(&sa,0,sizeof(sa));
   sa.sin_family= AF_INET;
-  r= adns_init(&ads,0,0);  if (r) adnsfail("init",r);
+  if (config_text) {
+    r= adns_init_strcfg(&ads,initflags,stderr,config_text);
+  } else {
+    r= adns_init(&ads,initflags,0);
+  }
+  if (r) adnsfail("init",r);
   cbyte= -1;
   inbyte= -1;
   inbuf= 0;
   cbyte= -1;
   inbyte= -1;
   inbuf= 0;
@@ -449,7 +468,6 @@ int main(int argc, const char *const *argv) {
   }
   if (nonblock(0,0)) sysfail("un-nonblock stdin");
   if (nonblock(1,0)) sysfail("un-nonblock stdout");
   }
   if (nonblock(0,0)) sysfail("un-nonblock stdin");
   if (nonblock(1,0)) sysfail("un-nonblock stdout");
-  if (ferror(stdin) || fclose(stdin)) sysfail("read stdin");
-  if (fclose(stdout)) sysfail("close stdout");
+  adns_finish(ads);
   exit(0);
 }
   exit(0);
 }