chiark / gitweb /
src/types.c, regress/: Use checklabel hook to parse PTR query domains.
[adns.git] / client / adh-main.c
index 16412949666e40fda65631ebc735156e6a64c245..b6f3bd4d0d2ada0b3658b7b41a0b51f893467b34 100644 (file)
@@ -4,12 +4,11 @@
  *   main program and useful subroutines
  */
 /*
- *  This file 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>
+ *  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 "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,7 +52,7 @@ void usageerr(const char *fmt, ...) {
   vfprintf(stderr,fmt,al);
   va_end(al);
   putc('\n',stderr);
-  exit(11);
+  quitnow(11);
 }
 
 void outerr(void) {
@@ -62,6 +74,10 @@ char *xstrsave(const char *str) {
   return p;
 }
 
+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;
@@ -73,6 +89,7 @@ void of_type(const struct optioninfo *oi, const char *arg, const char *arg2) {
     { adns_r_ptr,    "ptr"    },
     { adns_r_mx,     "mx"     },
     { adns_r_rp,     "rp"     },
+    { adns_r_srv,    "srv"    },
     { adns_r_addr,   "addr"   },
     
     /* types with only one version */
@@ -87,11 +104,20 @@ void of_type(const struct optioninfo *oi, const char *arg, const char *arg2) {
     { adns_r_ptr_raw,  "ptr-" },
     { adns_r_mx_raw,   "mx-"  },
     { adns_r_rp_raw,   "rp-"  },
+    { adns_r_srv_raw,  "srv-" },
 
     { adns_r_none, 0 }
   };
 
   const struct typename *tnp;
+  unsigned long unknowntype;
+  char *ep;
+
+  if (strlen(arg) > 4 && !memcmp(arg,"type",4) &&
+      (unknowntype= strtoul(arg+4, &ep, 10), !*ep) && unknowntype < 65536) {
+    ov_type= unknowntype | adns_r_unknown;
+    return;
+  }
 
   for (tnp=typenames;
        tnp->type && strcmp(arg,tnp->desc);
@@ -100,8 +126,6 @@ void of_type(const struct optioninfo *oi, const char *arg, const char *arg2) {
   ov_type= tnp->type;
 }
 
-int rcode;
-
 static void process_optarg(const char *arg,
                           const char *const **argv_p,
                           const char *value) {
@@ -125,7 +149,7 @@ static void process_optarg(const char *arg,
       } else if (oip->type == ot_funcarg2) {
        assert(argv_p);
        arg= *++(*argv_p);
-       if (arg) arg2= *++(*argv_p);
+       arg2= arg ? *++(*argv_p) : 0;
        if (!arg || !arg2)
          usageerr("option --%s requires two more arguments", oip->lopt);
       } else {
@@ -164,9 +188,6 @@ static void process_optarg(const char *arg,
 }
     
 static void read_stdin(void) {
-  static int used, avail;
-  static char *buf;
-
   int anydone, r;
   char *newline, *space;
 
@@ -248,5 +269,5 @@ int main(int argc, const char *const *argv) {
   }
 x_quit:
   if (fclose(stdout)) outerr();
-  exit(rcode);
+  quitnow(rcode);
 }