204 lines
5.3 KiB
Diff
204 lines
5.3 KiB
Diff
|
From b0e79979672935ff07bf23703c675ee788940c59 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Petr=20Men=C5=A1=C3=ADk?= <pemensik@redhat.com>
|
||
|
Date: Tue, 22 Jun 2021 16:35:46 +0200
|
||
|
Subject: [PATCH] Parse 'timeout' and 'attempts' from resolv.conf
|
||
|
|
||
|
It was supported by lwres in BIND 9.11, and is still mentioned in
|
||
|
the manual page. Restore support for it by adding it to libirs.
|
||
|
---
|
||
|
bin/dig/dighost.c | 13 ++++++-
|
||
|
lib/irs/include/irs/resconf.h | 20 +++++++++++
|
||
|
lib/irs/resconf.c | 64 ++++++++++++++++++++++++++++-------
|
||
|
3 files changed, 84 insertions(+), 13 deletions(-)
|
||
|
|
||
|
diff --git a/bin/dig/dighost.c b/bin/dig/dighost.c
|
||
|
index 0222454..274e894 100644
|
||
|
--- a/bin/dig/dighost.c
|
||
|
+++ b/bin/dig/dighost.c
|
||
|
@@ -133,7 +133,7 @@ int sendcount = 0;
|
||
|
int recvcount = 0;
|
||
|
int sockcount = 0;
|
||
|
int ndots = -1;
|
||
|
-int tries = 3;
|
||
|
+int tries = -1;
|
||
|
int lookup_counter = 0;
|
||
|
|
||
|
static char servercookie[256];
|
||
|
@@ -1330,6 +1330,17 @@ setup_system(bool ipv4only, bool ipv6only) {
|
||
|
ndots = irs_resconf_getndots(resconf);
|
||
|
debug("ndots is %d.", ndots);
|
||
|
}
|
||
|
+ if (timeout == 0) {
|
||
|
+ timeout = irs_resconf_gettimeout(resconf);
|
||
|
+ debug("timeout is %d.", timeout);
|
||
|
+ }
|
||
|
+ if (tries == -1) {
|
||
|
+ tries = irs_resconf_getattempts(resconf);
|
||
|
+ if (tries == 0) {
|
||
|
+ tries = 3;
|
||
|
+ }
|
||
|
+ debug("retries is %d.", tries);
|
||
|
+ }
|
||
|
|
||
|
/* If user doesn't specify server use nameservers from resolv.conf. */
|
||
|
if (ISC_LIST_EMPTY(server_list)) {
|
||
|
diff --git a/lib/irs/include/irs/resconf.h b/lib/irs/include/irs/resconf.h
|
||
|
index 424b795..74fc84a 100644
|
||
|
--- a/lib/irs/include/irs/resconf.h
|
||
|
+++ b/lib/irs/include/irs/resconf.h
|
||
|
@@ -113,6 +113,26 @@ irs_resconf_getndots(irs_resconf_t *conf);
|
||
|
*\li 'conf' is a valid resconf object.
|
||
|
*/
|
||
|
|
||
|
+unsigned int
|
||
|
+irs_resconf_getattempts(irs_resconf_t *conf);
|
||
|
+/*%<
|
||
|
+ * Return the 'attempts' value stored in 'conf'.
|
||
|
+ *
|
||
|
+ * Requires:
|
||
|
+ *
|
||
|
+ *\li 'conf' is a valid resconf object.
|
||
|
+ */
|
||
|
+
|
||
|
+unsigned int
|
||
|
+irs_resconf_gettimeout(irs_resconf_t *conf);
|
||
|
+/*%<
|
||
|
+ * Return the 'timeout' value stored in 'conf'.
|
||
|
+ *
|
||
|
+ * Requires:
|
||
|
+ *
|
||
|
+ *\li 'conf' is a valid resconf object.
|
||
|
+ */
|
||
|
+
|
||
|
ISC_LANG_ENDDECLS
|
||
|
|
||
|
#endif /* IRS_RESCONF_H */
|
||
|
diff --git a/lib/irs/resconf.c b/lib/irs/resconf.c
|
||
|
index 096064b..dd51d71 100644
|
||
|
--- a/lib/irs/resconf.c
|
||
|
+++ b/lib/irs/resconf.c
|
||
|
@@ -80,6 +80,13 @@
|
||
|
#define RESCONFMAXLINELEN 256U /*%< max size of a line */
|
||
|
#define RESCONFMAXSORTLIST 10U /*%< max 10 */
|
||
|
|
||
|
+#define CHECK(op) \
|
||
|
+ do { \
|
||
|
+ result = (op); \
|
||
|
+ if (result != ISC_R_SUCCESS) \
|
||
|
+ goto cleanup; \
|
||
|
+ } while (0)
|
||
|
+
|
||
|
/*!
|
||
|
* configuration data structure
|
||
|
*/
|
||
|
@@ -114,6 +121,10 @@ struct irs_resconf {
|
||
|
uint8_t resdebug;
|
||
|
/*%< set to n in 'options ndots:n' */
|
||
|
uint8_t ndots;
|
||
|
+ /*%< set to n in 'options attempts:n' */
|
||
|
+ uint8_t attempts;
|
||
|
+ /*%< set to n in 'options timeout:n' */
|
||
|
+ uint8_t timeout;
|
||
|
};
|
||
|
|
||
|
static isc_result_t
|
||
|
@@ -176,8 +187,8 @@ eatwhite(FILE *fp) {
|
||
|
*/
|
||
|
static int
|
||
|
getword(FILE *fp, char *buffer, size_t size) {
|
||
|
+ char *p = NULL;
|
||
|
int ch;
|
||
|
- char *p;
|
||
|
|
||
|
REQUIRE(buffer != NULL);
|
||
|
REQUIRE(size > 0U);
|
||
|
@@ -457,11 +468,26 @@ resconf_parsesortlist(irs_resconf_t *conf, FILE *fp) {
|
||
|
return (ISC_R_SUCCESS);
|
||
|
}
|
||
|
|
||
|
+static isc_result_t
|
||
|
+resconf_optionnumber(const char *word, uint8_t *number) {
|
||
|
+ char *p;
|
||
|
+ long n;
|
||
|
+
|
||
|
+ n = strtol(word, &p, 10);
|
||
|
+ if (*p != '\0') { /* Bad string. */
|
||
|
+ return (ISC_R_UNEXPECTEDTOKEN);
|
||
|
+ }
|
||
|
+ if (n < 0 || n > 0xff) { /* Out of range. */
|
||
|
+ return (ISC_R_RANGE);
|
||
|
+ }
|
||
|
+ *number = n;
|
||
|
+ return (ISC_R_SUCCESS);
|
||
|
+}
|
||
|
+
|
||
|
static isc_result_t
|
||
|
resconf_parseoption(irs_resconf_t *conf, FILE *fp) {
|
||
|
int delim;
|
||
|
- long ndots;
|
||
|
- char *p;
|
||
|
+ isc_result_t result = ISC_R_SUCCESS;
|
||
|
char word[RESCONFMAXLINELEN];
|
||
|
|
||
|
delim = getword(fp, word, sizeof(word));
|
||
|
@@ -473,14 +499,11 @@ resconf_parseoption(irs_resconf_t *conf, FILE *fp) {
|
||
|
if (strcmp("debug", word) == 0) {
|
||
|
conf->resdebug = 1;
|
||
|
} else if (strncmp("ndots:", word, 6) == 0) {
|
||
|
- ndots = strtol(word + 6, &p, 10);
|
||
|
- if (*p != '\0') { /* Bad string. */
|
||
|
- return (ISC_R_UNEXPECTEDTOKEN);
|
||
|
- }
|
||
|
- if (ndots < 0 || ndots > 0xff) { /* Out of range. */
|
||
|
- return (ISC_R_RANGE);
|
||
|
- }
|
||
|
- conf->ndots = (uint8_t)ndots;
|
||
|
+ CHECK(resconf_optionnumber(word + 6, &conf->ndots));
|
||
|
+ } else if (strncmp("attempts:", word, 9) == 0) {
|
||
|
+ CHECK(resconf_optionnumber(word + 9, &conf->attempts));
|
||
|
+ } else if (strncmp("timeout:", word, 8) == 0) {
|
||
|
+ CHECK(resconf_optionnumber(word + 8, &conf->timeout));
|
||
|
}
|
||
|
|
||
|
if (delim == EOF || delim == '\n') {
|
||
|
@@ -490,7 +513,8 @@ resconf_parseoption(irs_resconf_t *conf, FILE *fp) {
|
||
|
}
|
||
|
}
|
||
|
|
||
|
- return (ISC_R_SUCCESS);
|
||
|
+cleanup:
|
||
|
+ return (result);
|
||
|
}
|
||
|
|
||
|
static isc_result_t
|
||
|
@@ -532,6 +556,8 @@ irs_resconf_load(isc_mem_t *mctx, const char *filename, irs_resconf_t **confp) {
|
||
|
conf->sortlistnxt = 0;
|
||
|
conf->resdebug = 0;
|
||
|
conf->ndots = 1;
|
||
|
+ conf->attempts = 3;
|
||
|
+ conf->timeout = 0;
|
||
|
for (i = 0; i < RESCONFMAXSEARCH; i++) {
|
||
|
conf->search[i] = NULL;
|
||
|
}
|
||
|
@@ -687,3 +713,17 @@ irs_resconf_getndots(irs_resconf_t *conf) {
|
||
|
|
||
|
return ((unsigned int)conf->ndots);
|
||
|
}
|
||
|
+
|
||
|
+unsigned int
|
||
|
+irs_resconf_getattempts(irs_resconf_t *conf) {
|
||
|
+ REQUIRE(IRS_RESCONF_VALID(conf));
|
||
|
+
|
||
|
+ return ((unsigned int)conf->attempts);
|
||
|
+}
|
||
|
+
|
||
|
+unsigned int
|
||
|
+irs_resconf_gettimeout(irs_resconf_t *conf) {
|
||
|
+ REQUIRE(IRS_RESCONF_VALID(conf));
|
||
|
+
|
||
|
+ return ((unsigned int)conf->timeout);
|
||
|
+}
|
||
|
--
|
||
|
2.35.3
|
||
|
|