]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Code cleanup, mainly in dig option processing.
authorMichael Sawyer <source@isc.org>
Fri, 22 Sep 2000 23:21:32 +0000 (23:21 +0000)
committerMichael Sawyer <source@isc.org>
Fri, 22 Sep 2000 23:21:32 +0000 (23:21 +0000)
bin/dig/dig.c
bin/dig/dighost.c

index e6e966adef99941f6dc2fdf807054699057feccf..8340e6ed9f335652e65088899d538600ae927f64 100644 (file)
  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: dig.c,v 1.98 2000/09/22 17:36:02 gson Exp $ */
+/* $Id: dig.c,v 1.99 2000/09/22 23:21:29 mws Exp $ */
 
 #include <config.h>
 #include <stdlib.h>
 #include <time.h>
+#include <ctype.h>
 
 #include <isc/app.h>
 #include <isc/netaddr.h>
@@ -82,7 +83,8 @@ char *batchname = NULL;
 FILE *batchfp = NULL;
 char *argv0;
 
-isc_boolean_t short_form = ISC_FALSE, printcmd = ISC_TRUE;
+isc_boolean_t short_form = ISC_FALSE, printcmd = ISC_TRUE,
+       nibble = ISC_FALSE;
 
 isc_uint16_t bufsize = 0;
 isc_boolean_t forcecomment = ISC_FALSE;
@@ -561,6 +563,435 @@ reorder_args(int argc, char *argv[]) {
  * that routine.
  * XXX doc options
  */
+
+static void
+plus_option(char *option, isc_boolean_t is_batchfile,
+           dig_lookup_t *lookup)
+{
+       char option_store[256];
+       char *cmd, *value;
+       isc_boolean_t state = ISC_TRUE;
+
+       strncpy(option_store, option, sizeof(option_store));
+       cmd=next_token(&option,"=");
+       if (cmd == NULL) {
+               printf (";; Invalid option %s\n",option_store);
+               return;
+       }
+       value=option;
+       if (strncasecmp(cmd,"no",2)==0) {
+               cmd += 2;
+               state = ISC_FALSE;
+       }
+       switch (tolower(cmd[0])) {
+       case 'a':
+               switch (tolower(cmd[1])) {
+               case 'a': /* aaflag */
+                       lookup->aaonly = state;
+                       break;
+               case 'd': 
+                       switch (tolower(cmd[2])) {
+                       case 'd': /* additional */
+                               lookup->section_additional = state;
+                               break;
+                       case 'f': /* adflag */
+                               lookup->adflag = ISC_FALSE;
+                               break;
+                       default:
+                               goto invalid_option;
+                       }
+                       break;
+               case 'l': /* all */
+                       lookup->section_question = state;
+                       lookup->section_authority = state;
+                       lookup->section_answer = state;
+                       lookup->section_additional = state;
+                       lookup->comments = state;
+                       break;
+               case 'n': /* answer */
+                       lookup->section_answer = state;
+                       break;
+               case 'u': /* authority */
+                       lookup->section_authority = state;
+                       break;
+               default:
+                       goto invalid_option;
+               }
+               break;
+       case 'b': /* bufsize */
+               if (value == NULL)
+                       goto need_value;
+               if (!state)
+                       goto invalid_option;
+               lookup->udpsize = atoi(value);
+               if (lookup->udpsize <= 0)
+                       lookup->udpsize = 0;
+               if (lookup->udpsize > COMMSIZE)
+                       lookup->udpsize = COMMSIZE;
+               break;
+       case 'c':
+               switch (tolower(cmd[1])) {
+               case 'd':/* cdflag */
+                       lookup->cdflag = state;
+                       break;
+               case 'm': /* cmd */
+                       printcmd = state;
+                       break;
+               case 'o': /* comments */
+                       lookup->comments = state;
+                       break;
+               default:
+                       goto invalid_option;
+               }
+               break;
+       case 'd':
+               switch (tolower(cmd[1])) {
+               case 'e':
+                       switch (tolower(cmd[2])) {
+                       case 'f': /* defname */
+                               lookup->defname = state;
+                               break;
+                       case 't': /* details */
+                               show_details = state;
+                               break;
+                       default:
+                               goto invalid_option;
+                       }
+                       break;
+               case 'o': /* domain */  
+                       if (value == NULL)
+                               goto need_value;
+                       if (!state)
+                               goto invalid_option;
+                       strncpy(fixeddomain, value, MXNAME);
+                       break;
+               default:
+                       goto invalid_option;
+               }
+               break;
+       case 'i':
+               switch (tolower(cmd[1])) {
+               case 'd': /* identify */
+                       lookup->identify = state;
+                       break;
+               case 'g': /* ignore */
+               default: /* Inherets default for compatibility */
+                       lookup->ignore = ISC_TRUE;
+               }
+               break;
+       case 'n':
+               switch (tolower(cmd[1])) {
+               case 'a': /* namelimit */
+                       if (value == NULL)
+                               goto need_value;
+                       if (!state)
+                               goto invalid_option;
+                       name_limit = atoi(value);
+                       break;
+               case 'd': /* ndots */
+                       if (value == NULL)
+                               goto need_value;
+                       if (!state)
+                               goto invalid_option;
+                       ndots = atoi(value);
+                       if (ndots < 0)
+                               ndots = 0;
+                       break;
+               case 's': /* nssearch */
+                       lookup->ns_search_only = state;
+                       if (state) {
+                               lookup->trace_root = ISC_TRUE;
+                               lookup->recurse = ISC_FALSE;
+                               lookup->identify = ISC_TRUE;
+                               lookup->stats = ISC_FALSE;
+                               lookup->comments = ISC_FALSE;
+                               lookup->section_additional = ISC_FALSE;
+                               lookup->section_authority = ISC_FALSE;
+                               lookup->section_question = ISC_FALSE;
+                               lookup->rdtype = dns_rdatatype_soa;
+                               short_form = ISC_TRUE;
+                       }
+                       break;
+               default:
+                       goto invalid_option;
+               }
+               break;
+       case 'q': 
+               switch (tolower(cmd[1])) {
+               case 'r': /* qr */
+                       qr = state;
+                       break;
+               case 'u': /* question */
+                       lookup->section_question = state;
+                       break;
+               default:
+                       goto invalid_option;
+               }
+               break;
+       case 'r': /* rrlimit */
+               if (value == NULL)
+                       goto need_value;
+               if (!state)
+                       goto invalid_option;
+               rr_limit = atoi(value);
+               break;
+       case 's':
+               switch (tolower(cmd[1])) {
+               case 'e': /* search */
+                       usesearch = state;
+                       break;
+               case 'h': /* short */
+                       short_form = state;
+                       if (!state) {
+                               printcmd = ISC_FALSE;
+                               lookup->section_additional = ISC_FALSE;
+                               lookup->section_authority = ISC_FALSE;
+                               lookup->section_question = ISC_FALSE;
+                               lookup->comments = ISC_FALSE;
+                               lookup->stats = ISC_FALSE;
+                       }
+                       break;
+               case 't': /* stats */
+                       lookup->stats = state;
+                       break;
+               default:
+                       goto invalid_option;
+               }
+               break;
+       case 't':
+               switch (tolower(cmd[1])) {
+               case 'c': /* tcp */
+                       if (!is_batchfile)
+                               lookup->tcp_mode = state;
+                       break;
+               case 'i': /* timeout */
+                       if (value == NULL)
+                               goto need_value;
+                       if (!state)
+                               goto invalid_option;
+                       timeout = atoi(value);
+                       if (timeout <= 0)
+                               timeout = 1;
+                       break;
+               case 'r':
+                       switch (tolower(cmd[2])) {
+                       case 'a': /* trace */
+                               lookup->trace = state;
+                               lookup->trace_root = state;
+                               if (state) {
+                                       lookup->recurse = ISC_FALSE;
+                                       lookup->identify = ISC_TRUE;
+                                       lookup->comments = ISC_FALSE;
+                                       lookup->stats = ISC_FALSE;
+                                       lookup->section_additional = ISC_FALSE;
+                                       lookup->section_authority = ISC_TRUE;
+                                       lookup->section_question = ISC_FALSE;
+                                       show_details = ISC_TRUE;
+                               }
+                               break;
+                       case 'e': /* recurse */
+                               lookup->recurse = ISC_TRUE;
+                               break;
+                       case 'i': /* tries */
+                               if (value == NULL)
+                                       goto need_value;
+                               if (!state)
+                                       goto invalid_option;
+                               lookup->retries = atoi(value);
+                               if (lookup->retries <= 0)
+                                       lookup->retries = 1;
+                               break;
+                       default:
+                               goto invalid_option;
+                       }
+               default:
+                       goto invalid_option;
+               }
+       case 'v': /* vc */
+               if (!is_batchfile)
+                       lookup->tcp_mode = state;
+               break;
+       default:
+       invalid_option:
+       need_value:
+               fprintf (stderr, "Invalid option: +%s\n",
+                        option_store);
+               show_usage();
+               exit(1);
+       }
+       return;
+}
+
+/*
+ * ISC_TRUE returned if value was used
+ */
+static isc_boolean_t
+dash_option(char *option, char *next, dig_lookup_t **lookup)
+{
+       char option_store[256];
+       char cmd, *value, *ptr;
+       isc_result_t result;
+       isc_boolean_t value_from_next;
+       isc_textregion_t tr;
+       dns_rdatatype_t rdtype;
+       dns_rdataclass_t rdclass;
+       int adrs[4];
+       int n, i;
+       char batchline[MXNAME];
+
+       strncpy(option_store, option, sizeof(option_store));
+       cmd = option[0];
+       if (strlen(option) > 1) {
+               value_from_next = ISC_FALSE;
+               value = &option[1];
+       }
+       else {
+               value_from_next = ISC_TRUE;
+               value = next;
+       }
+       switch (tolower(cmd)) {
+       case 'b':
+               get_address(value, 0, &bind_address);
+               specified_source = ISC_TRUE;
+               return (value_from_next);
+               break;
+       case 'c':
+               tr.base = value;
+               tr.length = strlen(value);
+               result = dns_rdataclass_fromtext(&rdclass,
+                                                (isc_textregion_t *)&tr);
+               if (result == ISC_R_SUCCESS)
+                       (*lookup)->rdclass = rdclass;
+               else
+                       fprintf (stderr, ";; Warning, ignoring "
+                                "invalid class %s\n",
+                                value);
+               return (value_from_next);
+               break;
+       case 'd':
+               debugging = ISC_TRUE;
+               return (ISC_FALSE);
+               break;
+       case 'f':
+               batchname = value;
+               return (value_from_next);
+               break;
+       case 'h':
+               show_usage();
+               exit(0);
+               break;
+       case 'k':
+               strncpy(keyfile, value, MXNAME);
+               return (value_from_next);
+               break;
+       case 'm':
+               isc_mem_debugging = ISC_MEM_DEBUGTRACE;
+               return (ISC_FALSE);
+               break;
+       case 'n':
+               nibble = ISC_TRUE;
+               return (ISC_FALSE);
+               break;
+       case 'p':
+               port = atoi(value);
+               return (value_from_next);
+               break;
+       case 't':
+               if (strncasecmp(value, "ixfr=", 5) == 0) {
+                       (*lookup)->rdtype = dns_rdatatype_ixfr;
+                       (*lookup)->ixfr_serial =
+                               atoi(&value[5]);
+                       return (value_from_next);
+               }
+               tr.base = value;
+               tr.length = strlen(value);
+               result = dns_rdatatype_fromtext(&rdtype,
+                                               (isc_textregion_t *)&tr);
+               if (result == ISC_R_SUCCESS)
+                       (*lookup)->rdtype = rdtype;
+               else
+                       fprintf (stderr, ";; Warning, ignoring "
+                                "invalid type %s\n",
+                                value);
+               return (value_from_next);
+               break;
+       case 'y':
+               ptr = next_token(&value,":");
+               if (ptr == NULL) {
+                       show_usage();
+                       exit(1);
+               }
+               strncpy(keynametext, ptr, MXNAME);
+               ptr = next_token(&value, "");
+               if (ptr == NULL) {
+                       show_usage();
+                       exit(1);
+               }
+               strncpy(keysecret, ptr, MXNAME);
+               return (value_from_next);
+               break;
+       case 'x':
+               *lookup = clone_lookup(default_lookup, ISC_TRUE);
+               if (strchr(value, ':') == NULL) {
+                       n = sscanf(value, "%d.%d.%d.%d",
+                                  &adrs[0], &adrs[1],
+                                  &adrs[2], &adrs[3]);
+                       if (n == 0) {
+                               show_usage();
+                               exit (1);
+                       }
+                       for (i = n - 1; i >= 0; i--) {
+                               snprintf(batchline, MXNAME/8, "%d.",
+                                        adrs[i]);
+                               strncat((*lookup)->textname, batchline,
+                                       MXNAME);
+                       }
+                       strncat((*lookup)->textname, "in-addr.arpa.",
+                               MXNAME);
+               } else {
+                       isc_netaddr_t addr;
+                       dns_fixedname_t fname;
+                       dns_name_t *name;
+                       isc_buffer_t b;
+                       
+                       addr.family = AF_INET6;
+                       n = inet_pton(AF_INET6, value, &addr.type.in6);
+                       if (n <= 0)
+                               show_usage();
+                       dns_fixedname_init(&fname);
+                       name = dns_fixedname_name(&fname);
+                       (*lookup)->nibble = nibble;
+                       result = dns_byaddr_createptrname(&addr, nibble,
+                                                         name);
+                       if (result != ISC_R_SUCCESS)
+                               show_usage();
+                       isc_buffer_init(&b, (*lookup)->textname,
+                                       sizeof (*lookup)->textname);
+                       result = dns_name_totext(name, ISC_FALSE, &b);
+                       isc_buffer_putuint8(&b, 0);
+                       if (result != ISC_R_SUCCESS)
+                               show_usage();
+               }
+               debug("looking up %s", (*lookup)->textname);
+               (*lookup)->trace_root = ISC_TF((*lookup)->trace  ||
+                                           (*lookup)->ns_search_only);
+               (*lookup)->rdtype = dns_rdatatype_ptr;
+               (*lookup)->rdclass = dns_rdataclass_in;
+               (*lookup)->new_search = ISC_TRUE;
+               
+               ISC_LIST_APPEND(lookup_list, *lookup, link);
+               return (value_from_next);
+               break;
+
+       default:
+               fprintf (stderr, "Invalid option: -%s\n",
+                        option_store);
+               show_usage();
+               exit(1);
+       }
+       return (ISC_FALSE);
+}
+
 static void
 parse_args(isc_boolean_t is_batchfile, isc_boolean_t config_only,
           int argc, char **argv) {
@@ -571,19 +1002,14 @@ parse_args(isc_boolean_t is_batchfile, isc_boolean_t config_only,
        dns_rdatatype_t rdtype;
        dns_rdataclass_t rdclass;
        char batchline[MXNAME];
-       char address[MXNAME];
        int bargc;
        char *bargv[16];
-       int i, n;
-       int adrs[4];
        int rc;
        char **rv;
-       char *ptr;
 #ifndef NOPOSIX
        char *homedir;
        char rcfile[132];
 #endif
-       isc_boolean_t nibble = ISC_FALSE;
        char *input;
 
        /*
@@ -649,393 +1075,23 @@ parse_args(isc_boolean_t is_batchfile, isc_boolean_t config_only,
                        srv = make_server(&rv[0][1]);
                        ISC_LIST_APPEND(lookup->my_server_list,
                                        srv, link);
-               } else if ((strcmp(rv[0], "+vc") == 0)
-                          && (!is_batchfile)) {
-                       lookup->tcp_mode = ISC_TRUE;
-               } else if ((strcmp(rv[0], "+novc") == 0)
-                          && (!is_batchfile)) {
-                       lookup->tcp_mode = ISC_FALSE;
-               } else if ((strcmp(rv[0], "+tcp") == 0)
-                          && (!is_batchfile)) {
-                       lookup->tcp_mode = ISC_TRUE;
-               } else if ((strcmp(rv[0], "+notcp") == 0)
-                          && (!is_batchfile)) {
-                       lookup->tcp_mode = ISC_FALSE;
-               } else if (strncmp(rv[0], "+domain=", 8) == 0) {
-                       /* Global option always */
-                       strncpy(fixeddomain, &rv[0][8], MXNAME);
-               } else if (strncmp(rv[0], "+sea", 4) == 0) {
-                       /* Global option always */
-                       usesearch = ISC_TRUE;
-               } else if (strncmp(rv[0], "+nosea", 6) == 0) {
-                       usesearch = ISC_FALSE;
-               } else if (strncmp(rv[0], "+defn", 5) == 0) {
-                       lookup->defname = ISC_TRUE;
-               } else if (strncmp(rv[0], "+nodefn", 7) == 0) {
-                       lookup->defname = ISC_FALSE;
-               } else if (strncmp(rv[0], "+time=", 6) == 0) {
-                       /* Global option always */
-                       timeout = atoi(&rv[0][6]);
-                       if (timeout <= 0)
-                               timeout = 1;
-                       debug("timeout set to %d", timeout);
-               } else if (strncmp(rv[0], "+timeout=", 9) == 0) {
-                       /* Global option always */
-                       timeout = atoi(&rv[0][9]);
-                       if (timeout <= 0)
-                               timeout = 1;
-                       debug("timeout set to %d", timeout);
-               } else if (strncmp(rv[0], "+tries=", 7) == 0) {
-                       lookup->retries = atoi(&rv[0][7]);
-                       if (lookup->retries <= 0)
-                               lookup->retries = 1;
-               } else if (strncmp(rv[0], "+namelimit=", 11) == 0) {
-                       name_limit = atoi(&rv[0][11]);
-               } else if (strncmp(rv[0], "+rrlimit=", 9) == 0) {
-                       rr_limit = atoi(&rv[0][9]);
-               } else if (strncmp(rv[0], "+buf=", 5) == 0) {
-                       lookup->udpsize = atoi(&rv[0][5]);
-                       if (lookup->udpsize <= 0)
-                               lookup->udpsize = 0;
-                       if (lookup->udpsize > COMMSIZE)
-                               lookup->udpsize = COMMSIZE;
-               } else if (strncmp(rv[0], "+buf=", 5) == 0) {
-                       lookup->udpsize = atoi(&rv[0][5]);
-                       if (lookup->udpsize <= 0)
-                               lookup->udpsize = 0;
-                       if (lookup->udpsize > COMMSIZE)
-                               lookup->udpsize = COMMSIZE;
-               } else if (strncmp(rv[0], "+bufsize=", 9) == 0) {
-                       lookup->udpsize = atoi(&rv[0][9]);
-                       if (lookup->udpsize <= 0)
-                               lookup->udpsize = 0;
-                       if (lookup->udpsize > COMMSIZE)
-                               lookup->udpsize = COMMSIZE;
-               } else if (strncmp(rv[0], "+ndots=", 7) == 0) {
-                       /* Global option always */
-                       ndots = atoi(&rv[0][7]);
-                       if (ndots < 0)
-                               ndots = 0;
-               } else if (strncmp(rv[0], "+rec", 4) == 0) {
-                       lookup->recurse = ISC_TRUE;
-               } else if (strncmp(rv[0], "+norec", 6) == 0) {
-                       lookup->recurse = ISC_FALSE;
-               } else if (strncmp(rv[0], "+aa", 3) == 0) {
-                       lookup->aaonly = ISC_TRUE;
-               } else if (strncmp(rv[0], "+noaa", 5) == 0) {
-                       lookup->aaonly = ISC_FALSE;
-               } else if (strncmp(rv[0], "+adf", 4) == 0) {
-                       lookup->adflag = ISC_TRUE;
-               } else if (strncmp(rv[0], "+noadf", 6) == 0) {
-                       lookup->adflag = ISC_FALSE;
-               } else if (strncmp(rv[0], "+cd", 3) == 0) {
-                       lookup->cdflag = ISC_TRUE;
-               } else if (strncmp(rv[0], "+nocd", 5) == 0) {
-                       lookup->cdflag = ISC_FALSE;
-               } else if (strncmp(rv[0], "+ns", 3) == 0) {
-                       lookup->ns_search_only = ISC_TRUE;
-                       lookup->trace_root = ISC_TRUE;
-                       lookup->recurse = ISC_FALSE;
-                       lookup->identify = ISC_TRUE;
-                       lookup->stats = ISC_FALSE;
-                       if (!forcecomment)
-                               lookup->comments = ISC_FALSE;
-                       lookup->section_additional = ISC_FALSE;
-                       lookup->section_authority = ISC_FALSE;
-                       lookup->section_question = ISC_FALSE;
-                       lookup->rdtype = dns_rdatatype_soa;
-                       short_form = ISC_TRUE;
-               } else if (strncmp(rv[0], "+nons", 6) == 0) {
-                       lookup->ns_search_only = ISC_FALSE;
-               } else if (strncmp(rv[0], "+tr", 3) == 0) {
-                       lookup->trace = ISC_TRUE;
-                       lookup->trace_root = ISC_TRUE;
-                       lookup->recurse = ISC_FALSE;
-                       lookup->identify = ISC_TRUE;
-                       if (!forcecomment) {
-                               lookup->comments = ISC_FALSE;
-                               lookup->stats = ISC_FALSE;
-                       }
-                       lookup->section_additional = ISC_FALSE;
-                       lookup->section_authority = ISC_TRUE;
-                       lookup->section_question = ISC_FALSE;
-                       show_details = ISC_TRUE;
-               } else if (strncmp(rv[0], "+notr", 6) == 0) {
-                       lookup->trace = ISC_FALSE;
-                       lookup->trace_root = ISC_FALSE;
-               } else if (strncmp(rv[0], "+det", 4) == 0) {
-                       show_details = ISC_TRUE;
-               } else if (strncmp(rv[0], "+nodet", 6) == 0) {
-                       show_details = ISC_FALSE;
-               } else if (strncmp(rv[0], "+cmd", 4) == 0) {
-                       printcmd = ISC_TRUE;
-               } else if (strncmp(rv[0], "+nocmd", 6) == 0) {
-                       printcmd = ISC_FALSE;
-               } else if (strncmp(rv[0], "+sho", 4) == 0) {
-                       short_form = ISC_TRUE;
-                       printcmd = ISC_FALSE;
-                       lookup->section_additional = ISC_FALSE;
-                       lookup->section_authority = ISC_FALSE;
-                       lookup->section_question = ISC_FALSE;
-                       if (!forcecomment) {
-                               lookup->comments = ISC_FALSE;
-                               lookup->stats = ISC_FALSE;
-                       }
-               } else if (strncmp(rv[0], "+nosho", 6) == 0) {
-                       short_form = ISC_FALSE;
-               } else if (strncmp(rv[0], "+id", 3) == 0) {
-                       lookup->identify = ISC_TRUE;
-               } else if (strncmp(rv[0], "+noid", 5) == 0) {
-                       lookup->identify = ISC_FALSE;
-               } else if (strncmp(rv[0], "+i", 2) == 0) {
-                       lookup->ignore = ISC_TRUE;
-               } else if (strncmp(rv[0], "+noi", 4) == 0) {
-                       lookup->ignore = ISC_FALSE;
-               } else if (strncmp(rv[0], "+com", 4) == 0) {
-                       lookup->comments = ISC_TRUE;
-                       forcecomment = ISC_TRUE;
-               } else if (strncmp(rv[0], "+nocom", 6) == 0) {
-                       lookup->comments = ISC_FALSE;
-                       lookup->stats = ISC_FALSE;
-                       forcecomment = ISC_FALSE;
-               } else if (strncmp(rv[0], "+sta", 4) == 0) {
-                       lookup->stats = ISC_TRUE;
-               } else if (strncmp(rv[0], "+nosta", 6) == 0) {
-                       lookup->stats = ISC_FALSE;
-               } else if (strncmp(rv[0], "+qr", 3) == 0) {
-                       qr = ISC_TRUE;
-               } else if (strncmp(rv[0], "+noqr", 5) == 0) {
-                       qr = ISC_FALSE;
-               } else if (strncmp(rv[0], "+que", 4) == 0) {
-                       lookup->section_question = ISC_TRUE;
-               } else if (strncmp(rv[0], "+noque", 6) == 0) {
-                       lookup->section_question = ISC_FALSE;
-               } else if (strncmp(rv[0], "+ans", 4) == 0) {
-                       lookup->section_answer = ISC_TRUE;
-               } else if (strncmp(rv[0], "+noans", 6) == 0) {
-                       lookup->section_answer = ISC_FALSE;
-               } else if (strncmp(rv[0], "+add", 4) == 0) {
-                       lookup->section_additional = ISC_TRUE;
-               } else if (strncmp(rv[0], "+noadd", 6) == 0) {
-                       lookup->section_additional = ISC_FALSE;
-               } else if (strncmp(rv[0], "+aut", 4) == 0) {
-                       lookup->section_authority = ISC_TRUE;
-               } else if (strncmp(rv[0], "+noaut", 6) == 0) {
-                               lookup->section_authority = ISC_FALSE;
-               } else if (strncmp(rv[0], "+all", 4) == 0) {
-                       lookup->section_question = ISC_TRUE;
-                       lookup->section_authority = ISC_TRUE;
-                       lookup->section_answer = ISC_TRUE;
-                       lookup->section_additional = ISC_TRUE;
-                       lookup->comments = ISC_TRUE;
-               } else if (strncmp(rv[0], "+noall", 6) == 0) {
-                       lookup->section_question = ISC_FALSE;
-                       lookup->section_authority = ISC_FALSE;
-                       lookup->section_answer = ISC_FALSE;
-                       lookup->section_additional = ISC_FALSE;
-                       lookup->comments = ISC_FALSE;
-               } else if (strncmp(rv[0], "-c", 2) == 0) {
-                       if (rv[0][2] != 0) {
-                               ptr = &rv[0][2];
-                       } else {
-                               if (rc <= 1) {
-                                       show_usage();
-                                       exit(1);
+               } else if (rv[0][0] == '+') {
+                       plus_option(&rv[0][1], is_batchfile,
+                                   lookup);
+               } else if (rv[0][0] == '-') {
+                       if (rc <= 1) {
+                               if (dash_option(&rv[0][1], NULL,
+                                               &lookup)) {
+                                       rc--;
+                                       rv++;
                                }
-                               ptr = rv[1];
-                               rv++;
-                               rc--;
-                       }
-                       tr.base = ptr;
-                       tr.length = strlen(ptr);
-                       result = dns_rdataclass_fromtext(&rdclass,
-                                                   (isc_textregion_t *)&tr);
-                       if (result == ISC_R_SUCCESS)
-                               lookup->rdclass = rdclass;
-                       else
-                               fprintf (stderr, ";; Warning, ignoring "
-                                        "invalid class %s\n",
-                                        ptr);
-               } else if (strncmp(rv[0], "-t", 2) == 0) {
-                       if (rv[0][2] != 0) {
-                               ptr = &rv[0][2];
                        } else {
-                               if (rc <= 1) {
-                                       show_usage();
-                                       exit(1);
+                               if (dash_option(&rv[0][1], rv[1],
+                                               &lookup)) {
+                                       rc--;
+                                       rv++;
                                }
-                               ptr = rv[1];
-                               rv++;
-                               rc--;
-                       }
-                       tr.base = ptr;
-                       tr.length = strlen(ptr);
-                       if (strncmp(rv[0], "ixfr=", 5) == 0) {
-                               lookup->rdtype = dns_rdatatype_ixfr;
-                               lookup->ixfr_serial =
-                                       atoi(&rv[0][5]);
-                       } else {
-                               result = dns_rdatatype_fromtext(&rdtype,
-                                                   (isc_textregion_t *)&tr);
-                               if ((result == ISC_R_SUCCESS) &&
-                                   (rdtype != dns_rdatatype_ixfr))
-                                       lookup->rdtype = rdtype;
-                               else
-                                       fprintf (stderr, ";; Warning, "
-                                                "ignoring invalid type %s\n",
-                                                ptr);
-                       }
-               } else if (strncmp(rv[0], "-f", 2) == 0) {
-                       if (rv[0][2] != 0) {
-                               batchname = &rv[0][2];
-                       } else {
-                               if (rc <= 1) {
-                                       show_usage();
-                                       exit(1);
-                               }
-                               batchname = rv[1];
-                               rv++;
-                               rc--;
-                       }
-               } else if (strncmp(rv[0], "-y", 2) == 0) {
-                       if (rv[0][2] != 0)
-                               ptr = &rv[0][2];
-                       else {
-                               if (rc <= 1) {
-                                       show_usage();
-                                       exit(1);
-                               }
-                               ptr = rv[1];
-                               rv++;
-                               rc--;
-                       }
-                       input = ptr;
-                       ptr = next_token(&input,":");
-                       if (ptr == NULL) {
-                               show_usage();
-                               exit(1);
-                       }
-                       strncpy(keynametext, ptr, MXNAME);
-                       ptr = next_token(&input, "");
-                       if (ptr == NULL) {
-                               show_usage();
-                               exit(1);
-                       }
-                       strncpy(keysecret, ptr, MXNAME);
-               } else if (strncmp(rv[0], "-k", 2) == 0) {
-                       if (rv[0][2] != 0)
-                               ptr = &rv[0][2];
-                       else {
-                               if (rc <= 1) {
-                                       show_usage();
-                                       exit(1);
-                               }
-                               ptr = rv[1];
-                               rv++;
-                               rc--;
-                       }
-                       strncpy(keyfile, ptr, MXNAME);
-               } else if (strncmp(rv[0], "-p", 2) == 0) {
-                       if (rv[0][2] != 0) {
-                               port = atoi(&rv[0][2]);
-                       } else {
-                               if (rc <= 1) {
-                                       show_usage();
-                                       exit(1);
-                               }
-                               port = atoi(rv[1]);
-                               rv++;
-                               rc--;
-                       }
-               } else if (strncmp(rv[0], "-b", 2) == 0) {
-                       if (rv[0][2] != 0) {
-                               strncpy(address, &rv[0][2],
-                                       sizeof(address));
-                       } else {
-                               if (rc <= 1) {
-                                       show_usage();
-                                       exit(1);
-                               }
-                               strncpy(address, rv[1],
-                                       sizeof(address));
-                               rv++;
-                               rc--;
-                       }
-                       get_address(address, 0, &bind_address);
-                       specified_source = ISC_TRUE;
-               } else if (strncmp(rv[0], "-h", 2) == 0) {
-                       show_usage();
-                       exit(1);
-               } else if (strcmp(rv[0], "-memdebug") == 0) {
-                       isc_mem_debugging = ISC_MEM_DEBUGTRACE;
-               } else if (strcmp(rv[0], "-debug") == 0) {
-                       debugging = ISC_TRUE;
-               } else if ((strncmp(rv[0], "-x", 2) == 0) &&
-                          !config_only) {
-                       /*
-                        * XXXMWS Only works for ipv4 now.
-                        * Can't use inet_pton here, since we allow
-                        * partial addresses.
-                        */
-                       if (rc == 1) {
-                               show_usage();
-                               exit(1);
-                       }
-
-                       lookup = clone_lookup(default_lookup, ISC_TRUE);
-
-                       if (strchr(rv[1], ':') == NULL) {
-                               n = sscanf(rv[1], "%d.%d.%d.%d",
-                                          &adrs[0], &adrs[1],
-                                          &adrs[2], &adrs[3]);
-                               if (n == 0)
-                                       show_usage();
-
-                               for (i = n - 1; i >= 0; i--) {
-                                       snprintf(batchline, MXNAME/8, "%d.",
-                                                 adrs[i]);
-                                       strncat(lookup->textname, batchline,
-                                               MXNAME);
-                               }
-                               strncat(lookup->textname, "in-addr.arpa.",
-                                       MXNAME);
-                       } else {
-                               isc_netaddr_t addr;
-                               dns_fixedname_t fname;
-                               dns_name_t *name;
-                               isc_buffer_t b;
-
-                               addr.family = AF_INET6;
-                               n = inet_pton(AF_INET6, rv[1], &addr.type.in6);
-                               if (n <= 0)
-                                       show_usage();
-                               dns_fixedname_init(&fname);
-                               name = dns_fixedname_name(&fname);
-                               lookup->nibble = nibble;
-                               result = dns_byaddr_createptrname(&addr,
-                                                       lookup->nibble,
-                                                       name);
-                               if (result != ISC_R_SUCCESS)
-                                       show_usage();
-                               isc_buffer_init(&b, lookup->textname,
-                                               sizeof lookup->textname);
-                               result = dns_name_totext(name, ISC_FALSE, &b);
-                               isc_buffer_putuint8(&b, 0);
-                               if (result != ISC_R_SUCCESS)
-                                       show_usage();
                        }
-                       debug("looking up %s", lookup->textname);
-                       lookup->trace_root = ISC_TF(lookup->trace  ||
-                                                   lookup->ns_search_only);
-                       lookup->rdtype = dns_rdatatype_ptr;
-                       lookup->rdclass = dns_rdataclass_in;
-                       lookup->new_search = ISC_TRUE;
-
-                       ISC_LIST_APPEND(lookup_list, lookup, link);
-                       rv++;
-                       rc--;
-               } else if ((strncmp(rv[0], "-n", 2) == 0)) {
-                       nibble = ISC_TRUE;
                } else {
                        /*
                         * Anything which isn't an option
index 273a3cd028eb4d387b76d5a153635472445d47c7..dc7408972c926aff477e4fcac8b60154bded5773 100644 (file)
@@ -15,7 +15,7 @@
  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: dighost.c,v 1.132 2000/09/21 23:47:38 marka Exp $ */
+/* $Id: dighost.c,v 1.133 2000/09/22 23:21:32 mws Exp $ */
 
 /*
  * Notice to programmers:  Do not use this code as an example of how to
@@ -2460,7 +2460,7 @@ onrun_callback(isc_task_t *task, isc_event_t *event) {
 void
 cancel_all(void) {
        dig_lookup_t *l, *n;
-       dig_query_t *q;
+       dig_query_t *q, *nq;
 
        debug("cancel_all()");
 
@@ -2488,11 +2488,14 @@ cancel_all(void) {
                while (q != NULL) {
                        debug("cancelling query %p, belonging to %p",
                               q, current_lookup);
+                       nq = ISC_LIST_NEXT(q, link);
                        if (q->sock != NULL) {
                                isc_socket_cancel(q->sock, NULL,
                                                  ISC_SOCKCANCEL_ALL);
+                       } else {
+                               clear_query (q);
                        }
-                       q = ISC_LIST_NEXT(q, link);
+                       q = nq;
                }
        }
        l = ISC_LIST_HEAD(lookup_list);