]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Add +fail option to try next server after a SERVFAIL
authorMichael Sawyer <source@isc.org>
Mon, 25 Sep 2000 23:10:00 +0000 (23:10 +0000)
committerMichael Sawyer <source@isc.org>
Mon, 25 Sep 2000 23:10:00 +0000 (23:10 +0000)
Fix some minor problems in some of the new option processing code.
Slight change in mem debugging
TODO changes

bin/dig/dig.c
bin/dig/dighost.c
bin/dig/include/dig/dig.h
doc/todo/mws/todo

index bb1de72244af531351ef87b37ae9063e8e817023..fd41c000d349f9644e282f9589c2622f074fa719 100644 (file)
@@ -15,7 +15,7 @@
  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: dig.c,v 1.101 2000/09/25 16:14:20 mws Exp $ */
+/* $Id: dig.c,v 1.102 2000/09/25 23:09:56 mws Exp $ */
 
 #include <config.h>
 #include <stdlib.h>
@@ -160,6 +160,7 @@ show_usage(void) {
 "                 +[no]recursive      (Recursive mode)\n"
 "                 +[no]ignore         (Don't revert to TCP for TC responses.)"
 "\n"
+"                 +[no]fail           (Try next server on SERVFAIL reply)\n"
 "                 +[no]aaonly         (Set AA flag in query)\n"
 "                 +[no]adflag         (Set AD flag in query)\n"
 "                 +[no]cdflag         (Set CD flag in query)\n"
@@ -596,7 +597,7 @@ plus_option(char *option, isc_boolean_t is_batchfile,
                                lookup->section_additional = state;
                                break;
                        case 'f': /* adflag */
-                               lookup->adflag = ISC_FALSE;
+                               lookup->adflag = state;
                                break;
                        default:
                                goto invalid_option;
@@ -670,6 +671,9 @@ plus_option(char *option, isc_boolean_t is_batchfile,
                        goto invalid_option;
                }
                break;
+       case 'f': /* fail */
+               lookup->next_on_fail = state;
+               break;
        case 'i':
                switch (tolower(cmd[1])) {
                case 'd': /* identify */
@@ -799,9 +803,6 @@ plus_option(char *option, isc_boolean_t is_batchfile,
                                        show_details = ISC_TRUE;
                                }
                                break;
-                       case 'e': /* recurse */
-                               lookup->recurse = ISC_TRUE;
-                               break;
                        case 'i': /* tries */
                                if (value == NULL)
                                        goto need_value;
@@ -814,9 +815,11 @@ plus_option(char *option, isc_boolean_t is_batchfile,
                        default:
                                goto invalid_option;
                        }
+                       break;
                default:
                        goto invalid_option;
                }
+               break;
        case 'v': /* vc */
                if (!is_batchfile)
                        lookup->tcp_mode = state;
@@ -867,7 +870,7 @@ dash_option(char *option, char *next, dig_lookup_t **lookup)
                exit(0);
                break;
        case 'm':
-               isc_mem_debugging = ISC_MEM_DEBUGTRACE;
+               isc_mem_debugging = ISC_MEM_DEBUGTRACE | ISC_MEM_DEBUGRECORD;
                return (ISC_FALSE);
                break;
        case 'n':
@@ -1270,6 +1273,8 @@ main(int argc, char **argv) {
                                 (dig_server_t *)s2, link);
                isc_mem_free(mctx, s2);
        }
+       if (isc_mem_debugging != 0)
+               isc_mem_stats(mctx, stderr);
        isc_mem_free(mctx, default_lookup);
        if (batchname != NULL) {
                if (batchfp != stdin)
index dc7408972c926aff477e4fcac8b60154bded5773..153987a9ac599b43f3f80cf0a1971acda63ea0e6 100644 (file)
@@ -15,7 +15,7 @@
  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: dighost.c,v 1.133 2000/09/22 23:21:32 mws Exp $ */
+/* $Id: dighost.c,v 1.134 2000/09/25 23:09:57 mws Exp $ */
 
 /*
  * Notice to programmers:  Do not use this code as an example of how to
@@ -296,6 +296,7 @@ make_empty_lookup(void) {
        looknew->trace_root = ISC_FALSE;
        looknew->identify = ISC_FALSE;
        looknew->ignore = ISC_FALSE;
+       looknew->next_on_fail = ISC_FALSE;
        looknew->udpsize = 0;
        looknew->recurse = ISC_TRUE;
        looknew->aaonly = ISC_FALSE;
@@ -347,6 +348,7 @@ clone_lookup(dig_lookup_t *lookold, isc_boolean_t servers) {
        looknew->trace_root = lookold->trace_root;
        looknew->identify = lookold->identify;
        looknew->ignore = lookold->ignore;
+       looknew->next_on_fail = lookold->next_on_fail;
        looknew->udpsize = lookold->udpsize;
        looknew->recurse = lookold->recurse;
         looknew->aaonly = lookold->aaonly;
@@ -2175,6 +2177,36 @@ recv_done(isc_task_t *task, isc_event_t *event) {
                        UNLOCK_LOOKUP;
                        return;
                }                       
+               if ((msg->rcode == dns_rcode_servfail) &&
+                   l->next_on_fail) {
+                       dig_query_t *next = ISC_LIST_NEXT(query, link);
+                       if (l->current_query == query)
+                               l->current_query = NULL;
+                       if (next != NULL) {
+                               debug("sending query %lx\n", next);
+                               if (l->tcp_mode)
+                                       send_tcp_connect(next);
+                               else
+                                       send_udp(next);
+                       }
+                       /*
+                        * If our query is at the head of the list and there
+                        * is no next, we're the only one left, so fall
+                        * through to print the message.
+                        */
+                       if ((ISC_LIST_HEAD(l->q) != query) ||
+                           (ISC_LIST_NEXT(query, link) != NULL)) {
+                               printf(";; Got SERVFAIL reply from %s, "
+                                      "trying next server\n",
+                                      query->servname);
+                               clear_query(query);
+                               check_next_lookup(l);
+                               dns_message_destroy(&msg);
+                               isc_event_free(&event);
+                               UNLOCK_LOOKUP;
+                               return;
+                       }
+               }
 
                if (key != NULL) {
                        result = dns_tsig_verify(&query->recvbuf, msg,
index a011ecb9d77639ec049516d28cf0ab3605f04e15..cb9ed082e9e68973710a1ec4a16668002c6cfc2b 100644 (file)
@@ -15,7 +15,7 @@
  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: dig.h,v 1.48 2000/09/21 23:47:41 marka Exp $ */
+/* $Id: dig.h,v 1.49 2000/09/25 23:09:59 mws Exp $ */
 
 #ifndef DIG_H
 #define DIG_H
@@ -94,6 +94,7 @@ struct dig_lookup {
                section_answer,
                section_authority,
                section_additional,
+               next_on_fail,
                new_search;
        char textname[MXNAME]; /* Name we're going to be looking up */
        dns_rdatatype_t rdtype;
index dcb191e9bfd940d00dd63766eb33677913c46220..5dc934c01e57eba4f5974bc74a36e731d1d1ebd0 100644 (file)
@@ -8,6 +8,10 @@ Examine dig8's behavior when one of the servers it talks to servfail's
 back, and, if necessary, reproduce behavior in dig9.  (RT351)
 
 Remove or fix port number display in places where it is not correctly
-reported (nslookup, in particular). (RT352)
+reported (nslookup, in particular). (RT352)    [COMPLETED]
+
+Check text strings for host and nslookup output ov various types.
+
+Check functionality of +search option