chiark / gitweb /
+ * Create $(bin_dir) and $(lib_dir) on `make install', and also
[adns.git] / client / adh-main.c
index b933bfa4f6537d8ce40bce69ae5f2d38eeae2131..193092a8ef4e31293cf504ad51f8908cb88696d0 100644 (file)
@@ -5,11 +5,11 @@
  */
 /*
  *  This file is
- *    Copyright (C) 1997-1999 Ian Jackson <ian@davenant.greenend.org.uk>
+ *    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
  *
  *  It is part of adns, which is
- *    Copyright (C) 1997-1999 Ian Jackson <ian@davenant.greenend.org.uk>
- *    Copyright (C) 1999 Tony Finch <dot@dotat.at>
+ *    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
+ *    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
 
 #include "adnshost.h"
 
+int rcode;
+const char *config_text;
+
+static int used, avail;
+static char *buf;
+
+void quitnow(int rc) {
+  if (ads) adns_finish(ads);
+  free(buf);
+  free(ov_id);
+  exit(rc);
+}
+
 void sysfail(const char *what, int errnoval) {
   fprintf(stderr,"adnshost failed: %s: %s\n",what,strerror(errnoval));
-  exit(10);
+  quitnow(10);
 }
 
 void usageerr(const char *fmt, ...) {
@@ -40,19 +53,13 @@ void usageerr(const char *fmt, ...) {
   vfprintf(stderr,fmt,al);
   va_end(al);
   putc('\n',stderr);
-  exit(11);
+  quitnow(11);
 }
 
 void outerr(void) {
   sysfail("write to stdout",errno);
 }
 
-static void domain_do(const char *domain) {
-  if (ov_pipe && !ads) usageerr("-f/--pipe not consistent with domains on command line");
-  ensure_adns_init();
-  query_do(domain);
-}
-
 void *xmalloc(size_t sz) {
   void *p;
 
@@ -68,7 +75,11 @@ char *xstrsave(const char *str) {
   return p;
 }
 
-void of_type(const struct optioninfo *oi, const char *arg) {
+void of_config(const struct optioninfo *oi, const char *arg, const char *arg2) {
+  config_text= arg;
+}
+
+void of_type(const struct optioninfo *oi, const char *arg, const char *arg2) {
   static const struct typename {
     adns_rrtype type;
     const char *desc;
@@ -106,12 +117,11 @@ void of_type(const struct optioninfo *oi, const char *arg) {
   ov_type= tnp->type;
 }
 
-int rcode;
-
 static void process_optarg(const char *arg,
                           const char *const **argv_p,
                           const char *value) {
   const struct optioninfo *oip;
+  const char *arg2;
   int invert;
 
   if (arg[0] == '-' || arg[0] == '+') {
@@ -126,15 +136,23 @@ static void process_optarg(const char *arg,
       if (oip->type == ot_funcarg) {
        arg= argv_p ? *++(*argv_p) : value;
        if (!arg) usageerr("option --%s requires a value argument",oip->lopt);
+       arg2= 0;
+      } else if (oip->type == ot_funcarg2) {
+       assert(argv_p);
+       arg= *++(*argv_p);
+       arg2= arg ? *++(*argv_p) : 0;
+       if (!arg || !arg2)
+         usageerr("option --%s requires two more arguments", oip->lopt);
       } else {
        if (value) usageerr("option --%s does not take a value",oip->lopt);
        arg= 0;
+       arg2= 0;
       }
-      opt_do(oip,arg,invert);
+      opt_do(oip,invert,arg,arg2);
     } else if (arg[0] == '-' && arg[1] == 0) {
       arg= argv_p ? *++(*argv_p) : value;
       if (!arg) usageerr("option `-' must be followed by a domain");
-      domain_do(arg);
+      query_do(arg);
     } else { /* arg[1] != '-', != '\0' */
       invert= (arg[0] == '+');
       ++arg;
@@ -147,23 +165,20 @@ static void process_optarg(const char *arg,
          } else {
            if (value) usageerr("two values for option -%s given !",oip->sopt);
          }
-         opt_do(oip,arg,invert);
+         opt_do(oip,invert,arg,0);
          arg= "";
        } else {
          if (value) usageerr("option -%s does not take a value",oip->sopt);
-         opt_do(oip,0,invert);
+         opt_do(oip,invert,0,0);
        }
       }
     }
   } else { /* arg[0] != '-' */
-    domain_do(arg);
+    query_do(arg);
   }
 }
     
 static void read_stdin(void) {
-  static int used, avail;
-  static char *buf;
-
   int anydone, r;
   char *newline, *space;
 
@@ -245,5 +260,5 @@ int main(int argc, const char *const *argv) {
   }
 x_quit:
   if (fclose(stdout)) outerr();
-  exit(rcode);
+  quitnow(rcode);
 }