diff --git a/man/knsupdate.8in b/man/knsupdate.8in index c0ab1d13a6d5f3f520ea03747b51fd20f7b1dc10..0e78dd3b959144419e150be3b8f3cc900b1cd716 100644 --- a/man/knsupdate.8in +++ b/man/knsupdate.8in @@ -21,10 +21,10 @@ Use TCP protocol. Set the default port. .TP .BI -t \ timeout -The query timeout. +The query timeout (default 300 seconds). .TP .BI -r \ retries -The number of UDP retries. +The number of UDP retries (default 3). .TP .BI -y \ \fR[\fIhmac:\fR]\fIname:key\fR] Use TSIG. diff --git a/src/utils/nsupdate/nsupdate_exec.c b/src/utils/nsupdate/nsupdate_exec.c index bdc88535a27d786bc9f6a9256825912836d10609..a24ceaf0c1f1b6eb36c45f2c681930915db51095 100644 --- a/src/utils/nsupdate/nsupdate_exec.c +++ b/src/utils/nsupdate/nsupdate_exec.c @@ -799,14 +799,11 @@ int cmd_send(const char* lp, nsupdate_params_t *params) return ret; } } - - /* Send/recv message (N retries). */ - int retries = params->retries; - if (params->protocol == PROTO_TCP) { - retries = 1; /* No retries for TCP. */ - } + int rb = 0; - for (; retries > 0; --retries) { + /* Send/recv message (1 try + N retries). */ + int tries = 1 + params->retries; + for (; tries > 0; --tries) { memset(params->rwire, 0, MAX_PACKET_SIZE); rb = pkt_sendrecv(params, wire, len, params->rwire, MAX_PACKET_SIZE); diff --git a/src/utils/nsupdate/nsupdate_params.c b/src/utils/nsupdate/nsupdate_params.c index afd9dc334f0b96f1df1e2175120c9f7d3791763f..34b85db1141dca72e9ef88b36f2b0201cfb7f11e 100644 --- a/src/utils/nsupdate/nsupdate_params.c +++ b/src/utils/nsupdate/nsupdate_params.c @@ -28,7 +28,7 @@ #include "libknot/libknot.h" #define DEFAULT_RETRIES_NSUPDATE 3 -#define DEFAULT_TIMEOUT_NSUPDATE 1 +#define DEFAULT_TIMEOUT_NSUPDATE 300 static const style_t DEFAULT_STYLE_NSUPDATE = { .format = FORMAT_NSUPDATE, @@ -194,6 +194,18 @@ int nsupdate_parse(nsupdate_params_t *params, int argc, char *argv[]) } } + /* No retries for TCP. */ + if (params->protocol == PROTO_TCP) { + params->retries = 0; + } else { + /* If wait/tries < 1 s, set 1 second for each try. */ + if (params->wait > 0 && params->wait < ( 1 + params->retries)) { + params->wait = 1; + } else { + params->wait /= (1 + params->retries); + } + } + /* Process non-option parameters. */ for (; optind < argc; ++optind) { strnode_t *n = malloc(sizeof(strnode_t));