2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-09-01 23:25:38 +00:00

Make +trace work. More cleanup.

This commit is contained in:
Brian Wellington
2001-07-28 00:11:15 +00:00
parent 57bccaacd0
commit d0de20156a
4 changed files with 84 additions and 133 deletions

View File

@@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $Id: dig.c,v 1.153 2001/07/27 06:45:20 bwelling Exp $ */ /* $Id: dig.c,v 1.154 2001/07/28 00:11:09 bwelling Exp $ */
#include <config.h> #include <config.h>
#include <stdlib.h> #include <stdlib.h>
@@ -758,7 +758,7 @@ plus_option(char *option, isc_boolean_t is_batchfile,
lookup->section_additional = ISC_FALSE; lookup->section_additional = ISC_FALSE;
lookup->section_authority = ISC_FALSE; lookup->section_authority = ISC_FALSE;
lookup->section_question = ISC_FALSE; lookup->section_question = ISC_FALSE;
lookup->rdtype = dns_rdatatype_soa; lookup->rdtype = dns_rdatatype_ns;
lookup->rdtypeset = ISC_TRUE; lookup->rdtypeset = ISC_TRUE;
short_form = ISC_TRUE; short_form = ISC_TRUE;
} }

View File

@@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $Id: dighost.c,v 1.215 2001/07/27 22:07:10 bwelling Exp $ */ /* $Id: dighost.c,v 1.216 2001/07/28 00:11:11 bwelling Exp $ */
/* /*
* Notice to programmers: Do not use this code as an example of how to * Notice to programmers: Do not use this code as an example of how to
@@ -350,6 +350,7 @@ make_empty_lookup(void) {
looknew->textname[0] = 0; looknew->textname[0] = 0;
looknew->cmdline[0] = 0; looknew->cmdline[0] = 0;
looknew->rdtype = dns_rdatatype_a; looknew->rdtype = dns_rdatatype_a;
looknew->qrdtype = dns_rdatatype_a;
looknew->rdclass = dns_rdataclass_in; looknew->rdclass = dns_rdataclass_in;
looknew->rdtypeset = ISC_FALSE; looknew->rdtypeset = ISC_FALSE;
looknew->rdclassset = ISC_FALSE; looknew->rdclassset = ISC_FALSE;
@@ -376,7 +377,6 @@ make_empty_lookup(void) {
looknew->adflag = ISC_FALSE; looknew->adflag = ISC_FALSE;
looknew->cdflag = ISC_FALSE; looknew->cdflag = ISC_FALSE;
looknew->ns_search_only = ISC_FALSE; looknew->ns_search_only = ISC_FALSE;
looknew->ns_search_only_leafnode = ISC_FALSE;
looknew->origin = NULL; looknew->origin = NULL;
looknew->querysig = NULL; looknew->querysig = NULL;
looknew->retries = tries; looknew->retries = tries;
@@ -421,6 +421,7 @@ clone_lookup(dig_lookup_t *lookold, isc_boolean_t servers) {
strncpy(looknew->cmdline, lookold->cmdline, MXNAME); strncpy(looknew->cmdline, lookold->cmdline, MXNAME);
looknew->textname[MXNAME-1] = 0; looknew->textname[MXNAME-1] = 0;
looknew->rdtype = lookold->rdtype; looknew->rdtype = lookold->rdtype;
looknew->qrdtype = lookold->qrdtype;
looknew->rdclass = lookold->rdclass; looknew->rdclass = lookold->rdclass;
looknew->rdtypeset = lookold->rdtypeset; looknew->rdtypeset = lookold->rdtypeset;
looknew->rdclassset = lookold->rdclassset; looknew->rdclassset = lookold->rdclassset;
@@ -440,7 +441,6 @@ clone_lookup(dig_lookup_t *lookold, isc_boolean_t servers) {
looknew->adflag = lookold->adflag; looknew->adflag = lookold->adflag;
looknew->cdflag = lookold->cdflag; looknew->cdflag = lookold->cdflag;
looknew->ns_search_only = lookold->ns_search_only; looknew->ns_search_only = lookold->ns_search_only;
looknew->ns_search_only_leafnode = lookold->ns_search_only_leafnode;
looknew->tcp_mode = lookold->tcp_mode; looknew->tcp_mode = lookold->tcp_mode;
looknew->comments = lookold->comments; looknew->comments = lookold->comments;
looknew->stats = lookold->stats; looknew->stats = lookold->stats;
@@ -1047,7 +1047,7 @@ followup_lookup(dns_message_t *msg, dig_query_t *query, dns_section_t section)
dns_rdata_freestruct(&ns); dns_rdata_freestruct(&ns);
/* Initialize lookup if we've not yet */ /* Initialize lookup if we've not yet */
debug("found NS %d %s", namestr); debug("found NS %d %s", numLookups, namestr);
numLookups++; numLookups++;
if (!success) { if (!success) {
success = ISC_TRUE; success = ISC_TRUE;
@@ -1056,16 +1056,8 @@ followup_lookup(dns_message_t *msg, dig_query_t *query, dns_section_t section)
lookup = requeue_lookup(query->lookup, lookup = requeue_lookup(query->lookup,
ISC_FALSE); ISC_FALSE);
lookup->doing_xfr = ISC_FALSE; lookup->doing_xfr = ISC_FALSE;
if (section == DNS_SECTION_ANSWER) { lookup->trace = query->lookup->trace;
lookup->trace = ISC_FALSE; lookup->ns_search_only = ISC_FALSE;
lookup->ns_search_only = ISC_FALSE;
} else {
lookup->trace = query->lookup->trace;
lookup->ns_search_only =
query->lookup->ns_search_only;
lookup->ns_search_only_leafnode =
query->lookup->ns_search_only_leafnode;
}
lookup->trace_root = ISC_FALSE; lookup->trace_root = ISC_FALSE;
} }
srv = make_server(namestr); srv = make_server(namestr);
@@ -1166,7 +1158,7 @@ insert_soa(dig_lookup_t *lookup) {
dns_rdatalist_init(rdatalist); dns_rdatalist_init(rdatalist);
rdatalist->type = dns_rdatatype_soa; rdatalist->type = dns_rdatatype_soa;
rdatalist->rdclass = lookup->rdclass; rdatalist->rdclass = lookup->rdclass;
rdatalist->covers = dns_rdatatype_soa; rdatalist->covers = 0;
rdatalist->ttl = 1; rdatalist->ttl = 1;
ISC_LIST_INIT(rdatalist->rdata); ISC_LIST_INIT(rdatalist->rdata);
ISC_LIST_APPEND(rdatalist->rdata, rdata, link); ISC_LIST_APPEND(rdatalist->rdata, rdata, link);
@@ -1260,7 +1252,7 @@ setup_lookup(dig_lookup_t *lookup) {
lookup->origin->origin, lookup->origin->origin,
isc_result_totext(result)); isc_result_totext(result));
} }
if (lookup->trace_root) { if (lookup->trace && lookup->trace_root) {
dns_name_clone(dns_rootname, lookup->name); dns_name_clone(dns_rootname, lookup->name);
} else { } else {
len = strlen(lookup->textname); len = strlen(lookup->textname);
@@ -1281,7 +1273,9 @@ setup_lookup(dig_lookup_t *lookup) {
dns_message_puttempname(lookup->sendmsg, &lookup->oname); dns_message_puttempname(lookup->sendmsg, &lookup->oname);
} else { } else {
debug("using root origin"); debug("using root origin");
if (!lookup->trace_root) { if (lookup->trace && lookup->trace_root)
dns_name_clone(dns_rootname, lookup->name);
else {
len = strlen(lookup->textname); len = strlen(lookup->textname);
isc_buffer_init(&b, lookup->textname, len); isc_buffer_init(&b, lookup->textname, len);
isc_buffer_add(&b, len); isc_buffer_add(&b, len);
@@ -1289,8 +1283,6 @@ setup_lookup(dig_lookup_t *lookup) {
dns_rootname, dns_rootname,
ISC_FALSE, ISC_FALSE,
&lookup->namebuf); &lookup->namebuf);
} else {
dns_name_clone(dns_rootname, lookup->name);
} }
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
dns_message_puttempname(lookup->sendmsg, dns_message_puttempname(lookup->sendmsg,
@@ -1312,7 +1304,10 @@ setup_lookup(dig_lookup_t *lookup) {
* If this is a trace request, completely disallow recursion, since * If this is a trace request, completely disallow recursion, since
* it's meaningless for traces. * it's meaningless for traces.
*/ */
if (lookup->recurse && !lookup->trace && !lookup->ns_search_only) { if (lookup->trace || (lookup->ns_search_only && !lookup->trace_root))
lookup->recurse = ISC_FALSE;
if (lookup->recurse) {
debug("recursive query"); debug("recursive query");
lookup->sendmsg->flags |= DNS_MESSAGEFLAG_RD; lookup->sendmsg->flags |= DNS_MESSAGEFLAG_RD;
} }
@@ -1336,8 +1331,10 @@ setup_lookup(dig_lookup_t *lookup) {
dns_message_addname(lookup->sendmsg, lookup->name, dns_message_addname(lookup->sendmsg, lookup->name,
DNS_SECTION_QUESTION); DNS_SECTION_QUESTION);
if (lookup->trace_root) if (lookup->trace && lookup->trace_root) {
lookup->rdtype = dns_rdatatype_soa; lookup->qrdtype = lookup->rdtype;
lookup->rdtype = dns_rdatatype_ns;
}
if ((lookup->rdtype == dns_rdatatype_axfr) || if ((lookup->rdtype == dns_rdatatype_axfr) ||
(lookup->rdtype == dns_rdatatype_ixfr)) { (lookup->rdtype == dns_rdatatype_ixfr)) {
@@ -1352,7 +1349,7 @@ setup_lookup(dig_lookup_t *lookup) {
add_question(lookup->sendmsg, lookup->name, lookup->rdclass, add_question(lookup->sendmsg, lookup->name, lookup->rdclass,
lookup->rdtype); lookup->rdtype);
/* XXX add_soa */ /* add_soa */
if (lookup->rdtype == dns_rdatatype_ixfr) if (lookup->rdtype == dns_rdatatype_ixfr)
insert_soa(lookup); insert_soa(lookup);
@@ -1651,7 +1648,7 @@ send_tcp_connect(dig_query_t *query) {
* If we're at the endgame of a nameserver search, we need to * If we're at the endgame of a nameserver search, we need to
* immediately bring up all the queries. Do it here. * immediately bring up all the queries. Do it here.
*/ */
if (l->ns_search_only_leafnode) { if (l->ns_search_only && !l->trace_root) {
debug("sending next, since searching"); debug("sending next, since searching");
next = ISC_LIST_NEXT(query, link); next = ISC_LIST_NEXT(query, link);
if (next != NULL) if (next != NULL)
@@ -1729,7 +1726,7 @@ send_udp(dig_query_t *query) {
* If we're at the endgame of a nameserver search, we need to * If we're at the endgame of a nameserver search, we need to
* immediately bring up all the queries. Do it here. * immediately bring up all the queries. Do it here.
*/ */
if (l->ns_search_only_leafnode) { if (l->ns_search_only && !l->trace_root) {
debug("sending next, since searching"); debug("sending next, since searching");
next = ISC_LIST_NEXT(query, link); next = ISC_LIST_NEXT(query, link);
if (next != NULL) if (next != NULL)
@@ -2176,7 +2173,6 @@ recv_done(isc_task_t *task, isc_event_t *event) {
isc_result_t result; isc_result_t result;
dig_lookup_t *n, *l; dig_lookup_t *n, *l;
isc_boolean_t docancel = ISC_FALSE; isc_boolean_t docancel = ISC_FALSE;
unsigned int local_timeout;
unsigned int parseflags; unsigned int parseflags;
UNUSED(task); UNUSED(task);
@@ -2199,8 +2195,7 @@ recv_done(isc_task_t *task, isc_event_t *event) {
if ((l->tcp_mode) && (l->timer != NULL)) if ((l->tcp_mode) && (l->timer != NULL))
isc_timer_touch(l->timer); isc_timer_touch(l->timer);
if ((!l->pending && !l->ns_search_only && !l->ns_search_only_leafnode) if ((!l->pending && !l->ns_search_only) || cancel_now) {
|| cancel_now) {
debug("no longer pending. Got %s", debug("no longer pending. Got %s",
isc_result_totext(sevent->result)); isc_result_totext(sevent->result));
query->waiting_connect = ISC_FALSE; query->waiting_connect = ISC_FALSE;
@@ -2252,6 +2247,7 @@ recv_done(isc_task_t *task, isc_event_t *event) {
msg->tcp_continuation = 1; msg->tcp_continuation = 1;
l->msgcounter++; l->msgcounter++;
} }
debug("before parse starts"); debug("before parse starts");
parseflags = DNS_MESSAGEPARSE_PRESERVEORDER; parseflags = DNS_MESSAGEPARSE_PRESERVEORDER;
if (l->besteffort) if (l->besteffort)
@@ -2335,14 +2331,16 @@ recv_done(isc_task_t *task, isc_event_t *event) {
} }
debug("after parse"); debug("after parse");
if (l->xfr_q == NULL) { if (l->doing_xfr && l->xfr_q == NULL) {
l->xfr_q = query; l->xfr_q = query;
/* /*
* Once we are in the XFR message, increase * Once we are in the XFR message, increase
* the timeout to much longer, so brief network * the timeout to much longer, so brief network
* outages won't cause the XFR to abort * outages won't cause the XFR to abort
*/ */
if (timeout != INT_MAX && l->timer != NULL && l->doing_xfr) { if (timeout != INT_MAX && l->timer != NULL) {
unsigned int local_timeout;
if (timeout == 0) { if (timeout == 0) {
if (l->tcp_mode) if (l->tcp_mode)
local_timeout = TCP_TIMEOUT; local_timeout = TCP_TIMEOUT;
@@ -2364,95 +2362,54 @@ recv_done(isc_task_t *task, isc_event_t *event) {
check_result(result, "isc_timer_reset"); check_result(result, "isc_timer_reset");
} }
} }
if (l->xfr_q == query) {
if (l->trace || l->ns_search_only) { if (!l->doing_xfr || l->xfr_q == query) {
debug("in TRACE code"); if (msg->rcode != dns_rcode_noerror && l->origin != NULL) {
printmessage(query, msg, ISC_TRUE);
if (msg->rcode != dns_rcode_noerror &&
l->origin != NULL)
{
if (!next_origin(msg, query)) {
printmessage(query, msg, ISC_TRUE);
received(b->used, &sevent->address,
query);
}
} else {
result = dns_message_firstname(msg,
DNS_SECTION_ANSWER);
if (l->ns_search_only) {
if (result != ISC_R_SUCCESS ||
l->trace_root)
{
/*
* We didn't get an answer
* section, or else this is
* the first initial SOA query
* (in which case we will in
* fact get an answer section
* but it won't be the right
* one). In either case, our
* next query should be an NS.
*/
l->rdtype = dns_rdatatype_ns;
} else {
/*
* We got an answer section for
* our NS query! Yay! Now we
* shift gears, set the
* leafnode bit and look for
* SOAs in all the servers we
* got back in our answer
* section.
*/
l->rdtype = dns_rdatatype_soa;
l->ns_search_only_leafnode = ISC_TRUE;
if (followup_lookup(msg, query,
DNS_SECTION_ANSWER) == 0)
{
docancel = ISC_TRUE;
}
}
}
if ((result != ISC_R_SUCCESS) ||
l->trace_root)
{
/*
* This is executed regardless of
* whether we're doing ns_search_only,
* but because of the way the logic
* works, it's mutually exclusive with
* the other call to followup_lookup
* above. This is a good thing because
* we want to call followup_lookup
* at most once per query.
*
* The idea here is that if we didn't
* get an answer section (or if it's
* the initial root query) then we want
* to take whatever is in the authority
* section and follow up with them.
*/
if (followup_lookup(msg, query,
DNS_SECTION_AUTHORITY)
== 0)
{
docancel = ISC_TRUE;
}
}
}
} else if (msg->rcode != dns_rcode_noerror &&
l->origin != NULL)
{
if (!next_origin(msg, query)) { if (!next_origin(msg, query)) {
printmessage(query, msg, ISC_TRUE); printmessage(query, msg, ISC_TRUE);
received(b->used, &sevent->address, query); received(b->used, &sevent->address, query);
} }
} else {
printmessage(query, msg, ISC_TRUE);
} }
else if (!l->trace && !l->ns_search_only) {
printmessage(query, msg, ISC_TRUE);
} else if (l->ns_search_only) {
debug("in NSSEARCH code");
printmessage(query, msg, ISC_TRUE);
if (l->trace_root) {
/*
* This is the initial NS query.
*/
int n;
l->trace_root = ISC_FALSE;
l->rdtype = dns_rdatatype_soa;
n = followup_lookup(msg, query,
DNS_SECTION_ANSWER);
if (n == 0)
docancel = ISC_TRUE;
}
} else {
int n = 0;
int count = msg->counts[DNS_SECTION_ANSWER];
debug("in TRACE code");
printmessage(query, msg, ISC_TRUE);
l->rdtype = l->qrdtype;
if (l->trace_root) {
l->trace_root = ISC_FALSE;
n = followup_lookup(msg, query,
DNS_SECTION_ANSWER);
} else if (count == 0)
n = followup_lookup(msg, query,
DNS_SECTION_AUTHORITY);
if (n == 0)
docancel = ISC_TRUE;
}
} else if (msg->counts[DNS_SECTION_ANSWER] > 0 && } else if (msg->counts[DNS_SECTION_ANSWER] > 0 &&
(l->ns_search_only || l->ns_search_only_leafnode) && l->ns_search_only &&
!l->trace_root ) { !l->trace_root) {
printmessage(query, msg, ISC_TRUE); printmessage(query, msg, ISC_TRUE);
} }
@@ -2474,29 +2431,23 @@ recv_done(isc_task_t *task, isc_event_t *event) {
cancel_lookup(l); cancel_lookup(l);
check_next_lookup(l); check_next_lookup(l);
} }
if (msg != NULL)
dns_message_destroy(&msg);
isc_event_free(&event);
} else { } else {
if ((msg->rcode == 0) || if (msg->rcode == dns_rcode_noerror || l->origin == NULL)
(l->origin == NULL)) {
received(b->used, &sevent->address, query); received(b->used, &sevent->address, query);
} if (!query->lookup->ns_search_only)
if (!(query->lookup->ns_search_only ||
query->lookup->ns_search_only_leafnode))
query->lookup->pending = ISC_FALSE; query->lookup->pending = ISC_FALSE;
if (!(query->lookup->ns_search_only || if (!query->lookup->ns_search_only ||
query->lookup->ns_search_only_leafnode) || query->lookup->trace_root || docancel)
query->lookup->trace_root || docancel) { {
dns_message_destroy(&msg); dns_message_destroy(&msg);
cancel_lookup(l); cancel_lookup(l);
} }
if (msg != NULL)
dns_message_destroy(&msg);
isc_event_free(&event);
clear_query(query); clear_query(query);
check_next_lookup(l); check_next_lookup(l);
} }
if (msg != NULL)
dns_message_destroy(&msg);
isc_event_free(&event);
UNLOCK_LOOKUP; UNLOCK_LOOKUP;
} }

View File

@@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $Id: host.c,v 1.72 2001/07/27 06:11:09 bwelling Exp $ */ /* $Id: host.c,v 1.73 2001/07/28 00:11:13 bwelling Exp $ */
#include <config.h> #include <config.h>
#include <stdlib.h> #include <stdlib.h>
@@ -419,7 +419,7 @@ printmessage(dig_query_t *query, dns_message_t *msg, isc_boolean_t headers) {
* still following pointers, haven't gotten to the real NS records * still following pointers, haven't gotten to the real NS records
* yet, don't print anything. * yet, don't print anything.
*/ */
if (query->lookup->ns_search_only && !query->lookup->ns_search_only_leafnode) if (query->lookup->ns_search_only)
return (ISC_R_SUCCESS); return (ISC_R_SUCCESS);
if (listed_server) { if (listed_server) {

View File

@@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $Id: dig.h,v 1.68 2001/07/27 05:26:38 bwelling Exp $ */ /* $Id: dig.h,v 1.69 2001/07/28 00:11:15 bwelling Exp $ */
#ifndef DIG_H #ifndef DIG_H
#define DIG_H #define DIG_H
@@ -83,7 +83,6 @@ struct dig_lookup {
waiting_connect, waiting_connect,
doing_xfr, doing_xfr,
ns_search_only, ns_search_only,
ns_search_only_leafnode,
identify, /* Append an "on server <foo>" message */ identify, /* Append an "on server <foo>" message */
identify_previous_line, /* Prepend a "Nameserver <foo>:" identify_previous_line, /* Prepend a "Nameserver <foo>:"
message, with newline and tab */ message, with newline and tab */
@@ -109,6 +108,7 @@ struct dig_lookup {
char textname[MXNAME]; /* Name we're going to be looking up */ char textname[MXNAME]; /* Name we're going to be looking up */
char cmdline[MXNAME]; char cmdline[MXNAME];
dns_rdatatype_t rdtype; dns_rdatatype_t rdtype;
dns_rdatatype_t qrdtype;
dns_rdataclass_t rdclass; dns_rdataclass_t rdclass;
isc_boolean_t rdtypeset; isc_boolean_t rdtypeset;
isc_boolean_t rdclassset; isc_boolean_t rdclassset;