From: Evan Hunt Date: Fri, 18 Apr 2014 00:04:51 +0000 (-0700) Subject: [master] host recognizes /etc/resolv.conf options X-Git-Tag: v9.11.0a1~1744 X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=4e7973990c2aaec391cf307a7e60583331568e01;p=thirdparty%2Fbind9.git [master] host recognizes /etc/resolv.conf options 3813. [func] "host" now recognizes the "timeout", "attempts" and "debug" options when set in /etc/resolv.conf. (Thanks to Adam Tkac at RedHat.) [RT #21885] --- diff --git a/CHANGES b/CHANGES index 94ea37ccb66..498856f4537 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,7 @@ +3813. [func] "host" now recognizes the "timeout", "attempts" and + "debug" options when set in /etc/resolv.conf. + (Thanks to Adam Tkac at RedHat.) [RT #21885] + 3812. [func] Dig now supports sending arbitary EDNS options from the command line (+ednsopt=code[:value]). [RT #35584] diff --git a/bin/dig/dig.c b/bin/dig/dig.c index e9a537b5a2c..bf3aa2fd911 100644 --- a/bin/dig/dig.c +++ b/bin/dig/dig.c @@ -1974,8 +1974,8 @@ main(int argc, char **argv) { result = isc_app_start(); check_result(result, "isc_app_start"); setup_libs(); - parse_args(ISC_FALSE, ISC_FALSE, argc, argv); setup_system(); + parse_args(ISC_FALSE, ISC_FALSE, argc, argv); if (domainopt[0] != '\0') { set_search_domain(domainopt); usesearch = ISC_TRUE; diff --git a/bin/dig/dighost.c b/bin/dig/dighost.c index cfc79616442..cb0bcd2d4cd 100644 --- a/bin/dig/dighost.c +++ b/bin/dig/dighost.c @@ -126,7 +126,8 @@ isc_boolean_t showsearch = ISC_FALSE, qr = ISC_FALSE, is_dst_up = ISC_FALSE, - keep_open = ISC_FALSE; + keep_open = ISC_FALSE, + verbose = ISC_FALSE; in_port_t port = 53; unsigned int timeout = 0; unsigned int extrabytes; @@ -1330,10 +1331,24 @@ setup_system(void) { } } + if (lwconf->resdebug) { + verbose = ISC_TRUE; + debug("verbose is on"); + } if (ndots == -1) { ndots = lwconf->ndots; debug("ndots is %d.", ndots); } + if (lwconf->attempts) { + tries = lwconf->attempts + 1; + if (tries < 2) + tries = 2; + debug("tries is %d.", tries); + } + if (lwconf->timeout) { + timeout = lwconf->timeout; + debug("timeout is %d.", timeout); + } /* If user doesn't specify server use nameservers from resolv.conf. */ if (ISC_LIST_EMPTY(server_list)) diff --git a/bin/dig/host.c b/bin/dig/host.c index 391ed802cb5..460094b3ffc 100644 --- a/bin/dig/host.c +++ b/bin/dig/host.c @@ -681,6 +681,7 @@ parse_args(isc_boolean_t is_batchfile, int argc, char **argv) { lookup->servfail_stops = ISC_FALSE; lookup->comments = ISC_FALSE; + short_form = !verbose; while ((c = isc_commandline_parse(argc, argv, optstring)) != -1) { switch (c) { @@ -891,8 +892,8 @@ main(int argc, char **argv) { result = isc_app_start(); check_result(result, "isc_app_start"); setup_libs(); - parse_args(ISC_FALSE, argc, argv); setup_system(); + parse_args(ISC_FALSE, argc, argv); result = isc_app_onrun(mctx, global_task, onrun_callback, NULL); check_result(result, "isc_app_onrun"); isc_app_run(); diff --git a/bin/dig/host.docbook b/bin/dig/host.docbook index 30fc441044e..430a1c6f378 100644 --- a/bin/dig/host.docbook +++ b/bin/dig/host.docbook @@ -125,7 +125,9 @@ options are equivalent. They have been provided for backwards compatibility. In previous versions, the option switched on debugging traces and enabled verbose - output. + output. Verbose output can also be enabled by setting the + debug option in + /etc/resolv.conf. @@ -163,10 +165,12 @@ indicates how many times host will repeat a query that does - not get answered. The default number of retries is 1. If + not get answered. If number is negative or zero, the number of - retries will default to 1. + retries will default to 1. The default value is 1, or + the value of the attempts option in + /etc/resolv.conf, if set. @@ -224,7 +228,11 @@ will effectively wait forever for a reply. The time to wait for a response will be set to the number of seconds given by the hardware's maximum - value for an integer quantity. + value for an integer quantity. By default, host + will wait for 5 seconds for UDP responses and 10 seconds for TCP + connections. These defaults can be overridden by the + timeout option in + /etc/resolv.conf. diff --git a/bin/dig/include/dig/dig.h b/bin/dig/include/dig/dig.h index e5effffe56e..a95fb0aa74e 100644 --- a/bin/dig/include/dig/dig.h +++ b/bin/dig/include/dig/dig.h @@ -292,6 +292,7 @@ extern isc_boolean_t keep_open; extern char *progname; extern int tries; extern int fatalexit; +extern isc_boolean_t verbose; #ifdef WITH_IDN extern int idnoptions; #endif diff --git a/bin/dig/nslookup.c b/bin/dig/nslookup.c index 051ed34b941..ed58ce61bf0 100644 --- a/bin/dig/nslookup.c +++ b/bin/dig/nslookup.c @@ -909,9 +909,8 @@ main(int argc, char **argv) { setup_libs(); progname = argv[0]; - parse_args(argc, argv); - setup_system(); + parse_args(argc, argv); if (domainopt[0] != '\0') set_search_domain(domainopt); if (in_use) diff --git a/lib/lwres/include/lwres/lwres.h b/lib/lwres/include/lwres/lwres.h index 6912448cf9e..c83240cefb1 100644 --- a/lib/lwres/include/lwres/lwres.h +++ b/lib/lwres/include/lwres/lwres.h @@ -243,6 +243,8 @@ typedef struct { lwres_uint8_t resdebug; /*%< non-zero if 'options debug' set */ lwres_uint8_t ndots; /*%< set to n in 'options ndots:n' */ lwres_uint8_t no_tld_query; /*%< non-zero if 'options no_tld_query' */ + lwres_int32_t attempts; /*%< set to n in 'options attempts:n' */ + lwres_int32_t timeout; /*%< set to n in 'options timeout:n' */ } lwres_conf_t; #define LWRES_ADDRTYPE_V4 0x00000001U /*%< ipv4 */ diff --git a/lib/lwres/lwconfig.c b/lib/lwres/lwconfig.c index 62630238e12..52f3c8ce202 100644 --- a/lib/lwres/lwconfig.c +++ b/lib/lwres/lwconfig.c @@ -237,6 +237,8 @@ lwres_conf_init(lwres_context_t *ctx) { confdata->resdebug = 0; confdata->ndots = 1; confdata->no_tld_query = 0; + confdata->attempts = 0; + confdata->timeout = 0; for (i = 0; i < LWRES_CONFMAXNAMESERVERS; i++) lwres_resetaddr(&confdata->nameservers[i]); @@ -289,6 +291,8 @@ lwres_conf_clear(lwres_context_t *ctx) { confdata->resdebug = 0; confdata->ndots = 1; confdata->no_tld_query = 0; + confdata->attempts = 0; + confdata->timeout = 0; } static lwres_result_t @@ -530,6 +534,8 @@ static lwres_result_t lwres_conf_parseoption(lwres_context_t *ctx, FILE *fp) { int delim; long ndots; + long attempts; + long timeout; char *p; char word[LWRES_CONFMAXLINELEN]; lwres_conf_t *confdata; @@ -546,6 +552,8 @@ lwres_conf_parseoption(lwres_context_t *ctx, FILE *fp) { confdata->resdebug = 1; } else if (strcmp("no_tld_query", word) == 0) { confdata->no_tld_query = 1; + } else if (strcmp("debug", word) == 0) { + confdata->resdebug = 1; } else if (strncmp("ndots:", word, 6) == 0) { ndots = strtol(word + 6, &p, 10); if (*p != '\0') /* Bad string. */ @@ -553,6 +561,18 @@ lwres_conf_parseoption(lwres_context_t *ctx, FILE *fp) { if (ndots < 0 || ndots > 0xff) /* Out of range. */ return (LWRES_R_FAILURE); confdata->ndots = (lwres_uint8_t)ndots; + } else if (strncmp("timeout:", word, 8) == 0) { + timeout = strtol(word + 8, &p, 10); + if (*p != '\0') /* Bad string. */ + return (LWRES_R_FAILURE); + confdata->timeout = (lwres_int32_t)timeout; + } else if (strncmp("attempts:", word, 9) == 0) { + attempts = strtol(word + 9, &p, 10); + if (*p != '\0') /* Bad string. */ + return (LWRES_R_FAILURE); + if (attempts < 0) /* Out of range. */ + return (LWRES_R_FAILURE); + confdata->attempts = (lwres_int32_t)attempts; } if (delim == EOF || delim == '\n') @@ -717,6 +737,12 @@ lwres_conf_print(lwres_context_t *ctx, FILE *fp) { if (confdata->no_tld_query) fprintf(fp, "options no_tld_query\n"); + if (confdata->attempts) + fprintf(fp, "options attempts:%d\n", confdata->attempts); + + if (confdata->timeout) + fprintf(fp, "options timeout:%d\n", confdata->timeout); + return (LWRES_R_SUCCESS); }