summaryrefslogtreecommitdiff
path: root/bin/dig/dig.c
diff options
context:
space:
mode:
Diffstat (limited to 'bin/dig/dig.c')
-rw-r--r--bin/dig/dig.c57
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;