--- bind-9.3.1/bin/dig/dighost.c.next_server_on_referral 2005-08-16 16:27:33.000000000 -0400 +++ bind-9.3.1/bin/dig/dighost.c 2005-08-16 16:27:49.000000000 -0400 @@ -2765,7 +2765,17 @@ UNLOCK_LOOKUP; return; } - if (msg->rcode == dns_rcode_servfail && !l->servfail_stops) { + if ( (!l->servfail_stops) + &&( (msg->rcode == dns_rcode_servfail) + ||( (msg->rcode == dns_rcode_noerror) + &&(msg->counts[DNS_SECTION_ANSWER] == 0) + &&(msg->counts[DNS_SECTION_ADDITIONAL] == 0) + &&((msg->flags & DNS_MESSAGEFLAG_RD) == DNS_MESSAGEFLAG_RD) + &&((msg->flags & (DNS_MESSAGEFLAG_RA | DNS_MESSAGEFLAG_AA)) == 0) + ) + ) + ) + { dig_query_t *next = ISC_LIST_NEXT(query, link); if (l->current_query == query) l->current_query = NULL; @@ -2783,9 +2793,11 @@ */ 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); + if( l->comments == ISC_TRUE ) + printf(";; Got %s reply from %s, " + "trying next server\n", + msg->rcode == dns_rcode_servfail ? "SERVFAIL" : "referral", + query->servname); clear_query(query); check_next_lookup(l); dns_message_destroy(&msg);