Don't retry resolving in DNS_Name2IPAddress
Instead of retrying to resolve it in the function and blocking for a long time, return a TryAgain status and let the caller retry it later if necessary.
This commit is contained in:
parent
2458325c09
commit
3d260d41b3
5 changed files with 36 additions and 33 deletions
12
client.c
12
client.c
|
@ -150,7 +150,7 @@ open_io(const char *hostname, int port)
|
||||||
IPAddr ip;
|
IPAddr ip;
|
||||||
|
|
||||||
/* Note, this call could block for a while */
|
/* Note, this call could block for a while */
|
||||||
if (!DNS_Name2IPAddress(hostname, &ip, 0)) {
|
if (DNS_Name2IPAddress(hostname, &ip) != DNS_Success) {
|
||||||
fprintf(stderr, "Could not get IP address for %s\n", hostname);
|
fprintf(stderr, "Could not get IP address for %s\n", hostname);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
@ -330,7 +330,7 @@ read_address_integer(char *line, IPAddr *address, int *value)
|
||||||
fprintf(stderr, "Invalid syntax for address value\n");
|
fprintf(stderr, "Invalid syntax for address value\n");
|
||||||
ok = 0;
|
ok = 0;
|
||||||
} else {
|
} else {
|
||||||
if (!DNS_Name2IPAddress(hostname, address, 0)) {
|
if (DNS_Name2IPAddress(hostname, address) != DNS_Success) {
|
||||||
fprintf(stderr, "Could not get address for hostname\n");
|
fprintf(stderr, "Could not get address for hostname\n");
|
||||||
ok = 0;
|
ok = 0;
|
||||||
} else {
|
} else {
|
||||||
|
@ -355,7 +355,7 @@ read_address_double(char *line, IPAddr *address, double *value)
|
||||||
fprintf(stderr, "Invalid syntax for address value\n");
|
fprintf(stderr, "Invalid syntax for address value\n");
|
||||||
ok = 0;
|
ok = 0;
|
||||||
} else {
|
} else {
|
||||||
if (!DNS_Name2IPAddress(hostname, address, 0)) {
|
if (DNS_Name2IPAddress(hostname, address) != DNS_Success) {
|
||||||
fprintf(stderr, "Could not get address for hostname\n");
|
fprintf(stderr, "Could not get address for hostname\n");
|
||||||
ok = 0;
|
ok = 0;
|
||||||
} else {
|
} else {
|
||||||
|
@ -621,7 +621,7 @@ parse_allow_deny(CMD_Request *msg, char *line)
|
||||||
if (*q == '\n') *q = 0;
|
if (*q == '\n') *q = 0;
|
||||||
q++;
|
q++;
|
||||||
}
|
}
|
||||||
if (!DNS_Name2IPAddress(p, &ip, 0)) {
|
if (DNS_Name2IPAddress(p, &ip) != DNS_Success) {
|
||||||
fprintf(stderr, "Could not read address\n");
|
fprintf(stderr, "Could not read address\n");
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
|
@ -795,7 +795,7 @@ accheck_getaddr(char *line, IPAddr *addr)
|
||||||
if (*q == '\n') *q = 0;
|
if (*q == '\n') *q = 0;
|
||||||
q++;
|
q++;
|
||||||
}
|
}
|
||||||
if (!DNS_Name2IPAddress(p, &ip, 0)) {
|
if (DNS_Name2IPAddress(p, &ip) != DNS_Success) {
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
*addr = ip;
|
*addr = ip;
|
||||||
|
@ -982,7 +982,7 @@ process_cmd_delete(CMD_Request *msg, char *line)
|
||||||
fprintf(stderr, "Invalid syntax for address\n");
|
fprintf(stderr, "Invalid syntax for address\n");
|
||||||
ok = 0;
|
ok = 0;
|
||||||
} else {
|
} else {
|
||||||
if (!DNS_Name2IPAddress(hostname, &address, 0)) {
|
if (DNS_Name2IPAddress(hostname, &address) != DNS_Success) {
|
||||||
fprintf(stderr, "Could not get address for hostname\n");
|
fprintf(stderr, "Could not get address for hostname\n");
|
||||||
ok = 0;
|
ok = 0;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -46,6 +46,7 @@ CPS_ParseNTPSourceAdd(const char *line, CPS_NTP_Source *src)
|
||||||
int ok, n, done;
|
int ok, n, done;
|
||||||
char cmd[MAXLEN+1], hostname[MAXLEN+1];
|
char cmd[MAXLEN+1], hostname[MAXLEN+1];
|
||||||
CPS_Status result;
|
CPS_Status result;
|
||||||
|
DNS_Status s;
|
||||||
|
|
||||||
src->port = 123;
|
src->port = 123;
|
||||||
src->params.minpoll = 6;
|
src->params.minpoll = 6;
|
||||||
|
@ -62,7 +63,8 @@ CPS_ParseNTPSourceAdd(const char *line, CPS_NTP_Source *src)
|
||||||
|
|
||||||
ok = 0;
|
ok = 0;
|
||||||
if (sscanf(line, "%" SMAXLEN "s%n", hostname, &n) == 1) {
|
if (sscanf(line, "%" SMAXLEN "s%n", hostname, &n) == 1) {
|
||||||
if (DNS_Name2IPAddress(hostname, &src->ip_addr, 1)) {
|
s = DNS_Name2IPAddress(hostname, &src->ip_addr);
|
||||||
|
if (s == DNS_Success) {
|
||||||
ok = 1;
|
ok = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
4
conf.c
4
conf.c
|
@ -754,7 +754,7 @@ parse_initstepslew(const char *line)
|
||||||
}
|
}
|
||||||
while (*p) {
|
while (*p) {
|
||||||
if (sscanf(p, "%" SHOSTNAME_LEN "s%n", hostname, &n) == 1) {
|
if (sscanf(p, "%" SHOSTNAME_LEN "s%n", hostname, &n) == 1) {
|
||||||
if (DNS_Name2IPAddress(hostname, &ip_addr, 1)) {
|
if (DNS_Name2IPAddress(hostname, &ip_addr) == DNS_Success) {
|
||||||
init_srcs_ip[n_init_srcs] = ip_addr;
|
init_srcs_ip[n_init_srcs] = ip_addr;
|
||||||
++n_init_srcs;
|
++n_init_srcs;
|
||||||
}
|
}
|
||||||
|
@ -962,7 +962,7 @@ parse_allow_deny(const char *line, AllowDeny *list, int allow)
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (DNS_Name2IPAddress(p, &ip_addr, 1)) {
|
if (DNS_Name2IPAddress(p, &ip_addr) == DNS_Success) {
|
||||||
new_node = MallocNew(AllowDeny);
|
new_node = MallocNew(AllowDeny);
|
||||||
new_node->allow = allow;
|
new_node->allow = allow;
|
||||||
new_node->all = all;
|
new_node->all = all;
|
||||||
|
|
39
nameserv.c
39
nameserv.c
|
@ -38,9 +38,6 @@
|
||||||
|
|
||||||
/* ================================================== */
|
/* ================================================== */
|
||||||
|
|
||||||
#define MAXRETRIES 10
|
|
||||||
static unsigned int retries = 0;
|
|
||||||
|
|
||||||
static int address_family = IPADDR_UNSPEC;
|
static int address_family = IPADDR_UNSPEC;
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -49,8 +46,8 @@ DNS_SetAddressFamily(int family)
|
||||||
address_family = family;
|
address_family = family;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
DNS_Status
|
||||||
DNS_Name2IPAddress(const char *name, IPAddr *addr, int retry)
|
DNS_Name2IPAddress(const char *name, IPAddr *addr)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_IPV6
|
#ifdef HAVE_IPV6
|
||||||
struct addrinfo hints, *res, *ai;
|
struct addrinfo hints, *res, *ai;
|
||||||
|
@ -63,17 +60,10 @@ DNS_Name2IPAddress(const char *name, IPAddr *addr, int retry)
|
||||||
hints.ai_flags = AI_ADDRCONFIG;
|
hints.ai_flags = AI_ADDRCONFIG;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
try_again:
|
|
||||||
result = getaddrinfo(name, NULL, &hints, &res);
|
result = getaddrinfo(name, NULL, &hints, &res);
|
||||||
|
|
||||||
if (result) {
|
if (result) {
|
||||||
if (retry && result == EAI_AGAIN && retries < MAXRETRIES) {
|
return result == EAI_AGAIN ? DNS_TryAgain : DNS_Failure;
|
||||||
sleep(2 << retries);
|
|
||||||
retries++;
|
|
||||||
res_init();
|
|
||||||
goto try_again;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (ai = res; !result && ai != NULL; ai = ai->ai_next) {
|
for (ai = res; !result && ai != NULL; ai = ai->ai_next) {
|
||||||
|
@ -96,21 +86,16 @@ try_again:
|
||||||
}
|
}
|
||||||
|
|
||||||
freeaddrinfo(res);
|
freeaddrinfo(res);
|
||||||
return result;
|
return result ? DNS_Success : DNS_Failure;
|
||||||
#else
|
#else
|
||||||
struct hostent *host;
|
struct hostent *host;
|
||||||
char *address0;
|
char *address0;
|
||||||
|
|
||||||
try_again:
|
|
||||||
host = gethostbyname(name);
|
host = gethostbyname(name);
|
||||||
|
|
||||||
if (host == NULL) {
|
if (host == NULL) {
|
||||||
if (retry && h_errno == TRY_AGAIN && retries < MAXRETRIES) {
|
if (h_errno == TRY_AGAIN)
|
||||||
sleep(2 << retries);
|
return DNS_TryAgain;
|
||||||
retries++;
|
|
||||||
res_init();
|
|
||||||
goto try_again;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
addr->family = IPADDR_INET4;
|
addr->family = IPADDR_INET4;
|
||||||
address0 = host->h_addr_list[0];
|
address0 = host->h_addr_list[0];
|
||||||
|
@ -118,10 +103,10 @@ try_again:
|
||||||
(((unsigned long)address0[1])<<16) |
|
(((unsigned long)address0[1])<<16) |
|
||||||
(((unsigned long)address0[2])<<8) |
|
(((unsigned long)address0[2])<<8) |
|
||||||
(((unsigned long)address0[3])));
|
(((unsigned long)address0[3])));
|
||||||
return 1;
|
return DNS_Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return DNS_Failure;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -190,3 +175,11 @@ DNS_IPAddress2Name(IPAddr *ip_addr, char *name, int len)
|
||||||
|
|
||||||
/* ================================================== */
|
/* ================================================== */
|
||||||
|
|
||||||
|
void
|
||||||
|
DNS_Reload(void)
|
||||||
|
{
|
||||||
|
res_init();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ================================================== */
|
||||||
|
|
||||||
|
|
10
nameserv.h
10
nameserv.h
|
@ -34,12 +34,20 @@
|
||||||
|
|
||||||
#include "addressing.h"
|
#include "addressing.h"
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
DNS_Success,
|
||||||
|
DNS_TryAgain,
|
||||||
|
DNS_Failure
|
||||||
|
} DNS_Status;
|
||||||
|
|
||||||
/* Resolve names only to selected address family */
|
/* Resolve names only to selected address family */
|
||||||
extern void DNS_SetAddressFamily(int family);
|
extern void DNS_SetAddressFamily(int family);
|
||||||
|
|
||||||
extern int DNS_Name2IPAddress(const char *name, IPAddr *addr, int retry);
|
extern DNS_Status DNS_Name2IPAddress(const char *name, IPAddr *addr);
|
||||||
|
|
||||||
extern int DNS_IPAddress2Name(IPAddr *ip_addr, char *name, int len);
|
extern int DNS_IPAddress2Name(IPAddr *ip_addr, char *name, int len);
|
||||||
|
|
||||||
|
extern void DNS_Reload(void);
|
||||||
|
|
||||||
#endif /* GOT_NAMESERV_H */
|
#endif /* GOT_NAMESERV_H */
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue