diff options
Diffstat (limited to 'bin/dig/dig.c')
-rw-r--r-- | bin/dig/dig.c | 57 |
1 files changed, 39 insertions, 18 deletions
diff --git a/bin/dig/dig.c b/bin/dig/dig.c index c7a50b5af2fc..07d8b0b7e14a 100644 --- a/bin/dig/dig.c +++ b/bin/dig/dig.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2013 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 2004-2014 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000-2003 Internet Software Consortium. * * Permission to use, copy, modify, and/or distribute this software for any @@ -243,7 +243,6 @@ help(void) { void received(int bytes, isc_sockaddr_t *from, dig_query_t *query) { isc_uint64_t diff; - isc_time_t now; time_t tnow; struct tm tmnow; char time_str[100]; @@ -251,10 +250,8 @@ received(int bytes, isc_sockaddr_t *from, dig_query_t *query) { isc_sockaddr_format(from, fromtext, sizeof(fromtext)); - TIME_NOW(&now); - if (query->lookup->stats && !short_form) { - diff = isc_time_microdiff(&now, &query->time_sent); + diff = isc_time_microdiff(&query->time_recv, &query->time_sent); printf(";; Query time: %ld msec\n", (long int)diff/1000); printf(";; SERVER: %s(%s)\n", fromtext, query->servname); time(&tnow); @@ -280,7 +277,7 @@ received(int bytes, isc_sockaddr_t *from, dig_query_t *query) { } puts(""); } else if (query->lookup->identify && !short_form) { - diff = isc_time_microdiff(&now, &query->time_sent); + diff = isc_time_microdiff(&query->time_recv, &query->time_sent); printf(";; Received %" ISC_PRINT_QUADFORMAT "u bytes " "from %s(%s) in %d ms\n\n", query->lookup->doing_xfr ? @@ -308,7 +305,6 @@ static isc_result_t say_message(dns_rdata_t *rdata, dig_query_t *query, isc_buffer_t *buf) { isc_result_t result; isc_uint64_t diff; - isc_time_t now; char store[sizeof("12345678901234567890")]; if (query->lookup->trace || query->lookup->ns_search_only) { @@ -322,8 +318,7 @@ say_message(dns_rdata_t *rdata, dig_query_t *query, isc_buffer_t *buf) { return (result); check_result(result, "dns_rdata_totext"); if (query->lookup->identify) { - TIME_NOW(&now); - diff = isc_time_microdiff(&now, &query->time_sent); + diff = isc_time_microdiff(&query->time_recv, &query->time_sent); ADD_STRING(buf, " from server "); ADD_STRING(buf, query->servname); snprintf(store, 19, " in %d ms.", (int)diff/1000); @@ -1092,7 +1087,7 @@ plus_option(char *option, isc_boolean_t is_batchfile, if (splitwidth) splitwidth += 3; if (result != ISC_R_SUCCESS) - fatal("Couldn't parse retries"); + fatal("Couldn't parse split"); break; case 't': /* stats */ FULLCHECK("stats"); @@ -1106,8 +1101,10 @@ plus_option(char *option, isc_boolean_t is_batchfile, switch (cmd[1]) { case 'c': /* tcp */ FULLCHECK("tcp"); - if (!is_batchfile) + if (!is_batchfile) { lookup->tcp_mode = state; + lookup->tcp_mode_set = ISC_TRUE; + } break; case 'i': /* timeout */ FULLCHECK("timeout"); @@ -1187,8 +1184,10 @@ plus_option(char *option, isc_boolean_t is_batchfile, break; case 'v': FULLCHECK("vc"); - if (!is_batchfile) + if (!is_batchfile) { lookup->tcp_mode = state; + lookup->tcp_mode_set = ISC_TRUE; + } break; default: invalid_option: @@ -1403,10 +1402,12 @@ dash_option(char *option, char *next, dig_lookup_t **lookup, (*lookup)->ixfr_serial = serial; (*lookup)->section_question = plusquest; (*lookup)->comments = pluscomm; - (*lookup)->tcp_mode = ISC_TRUE; + if (!(*lookup)->tcp_mode_set) + (*lookup)->tcp_mode = ISC_TRUE; } else { (*lookup)->rdtype = rdtype; - (*lookup)->rdtypeset = ISC_TRUE; + if (!config_only) + (*lookup)->rdtypeset = ISC_TRUE; if (rdtype == dns_rdatatype_axfr) { (*lookup)->section_question = plusquest; (*lookup)->comments = pluscomm; @@ -1448,6 +1449,7 @@ dash_option(char *option, char *next, dig_lookup_t **lookup, ip6_int, ISC_FALSE) == ISC_R_SUCCESS) { strncpy((*lookup)->textname, textname, sizeof((*lookup)->textname)); + (*lookup)->textname[sizeof((*lookup)->textname)-1] = 0; debug("looking up %s", (*lookup)->textname); (*lookup)->trace_root = ISC_TF((*lookup)->trace || (*lookup)->ns_search_only); @@ -1511,7 +1513,8 @@ preparse_args(int argc, char **argv) { static void parse_args(isc_boolean_t is_batchfile, isc_boolean_t config_only, - int argc, char **argv) { + int argc, char **argv) +{ isc_result_t result; isc_textregion_t tr; isc_boolean_t firstarg = ISC_TRUE; @@ -1604,8 +1607,25 @@ parse_args(isc_boolean_t is_batchfile, isc_boolean_t config_only, debug("main parsing %s", rv[0]); if (strncmp(rv[0], "%", 1) == 0) break; - if (strncmp(rv[0], "@", 1) == 0) { - addresscount = getaddresses(lookup, &rv[0][1], NULL); + if (rv[0][0] == '@') { + + if (is_batchfile && !config_only) { + addresscount = getaddresses(lookup, &rv[0][1], + &result); + if (result != ISC_R_SUCCESS) { + fprintf(stderr, "couldn't get address " + "for '%s': %s: skipping " + "lookup\n", &rv[0][1], + isc_result_totext(result)); + if (ISC_LINK_LINKED(lookup, link)) + ISC_LIST_DEQUEUE(lookup_list, + lookup, link); + destroy_lookup(lookup); + return; + } + } else + addresscount = getaddresses(lookup, &rv[0][1], + NULL); } else if (rv[0][0] == '+') { plus_option(&rv[0][1], is_batchfile, lookup); @@ -1669,7 +1689,8 @@ parse_args(isc_boolean_t is_batchfile, isc_boolean_t config_only, lookup->section_question = plusquest; lookup->comments = pluscomm; - lookup->tcp_mode = ISC_TRUE; + if (!lookup->tcp_mode_set) + lookup->tcp_mode = ISC_TRUE; } else { lookup->rdtype = rdtype; lookup->rdtypeset = ISC_TRUE; |