Retry name resolving after temporary failure few times before giving up
This is a temporary fix to allow starting when resolv.conf is not ready yet (e.g. when using NetworkManager). It may delay start up to 1022 seconds.
This commit is contained in:
parent
fd2641bcb9
commit
0148ecaea0
4 changed files with 32 additions and 5 deletions
|
@ -61,7 +61,7 @@ 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) {
|
||||||
src->ip_addr = DNS_Name2IPAddress(hostname);
|
src->ip_addr = DNS_Name2IPAddressRetry(hostname);
|
||||||
if (src->ip_addr != DNS_Failed_Address) {
|
if (src->ip_addr != DNS_Failed_Address) {
|
||||||
ok = 1;
|
ok = 1;
|
||||||
}
|
}
|
||||||
|
|
4
conf.c
4
conf.c
|
@ -584,7 +584,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) {
|
||||||
ip_addr = DNS_Name2IPAddress(hostname);
|
ip_addr = DNS_Name2IPAddressRetry(hostname);
|
||||||
if (ip_addr != DNS_Failed_Address) {
|
if (ip_addr != DNS_Failed_Address) {
|
||||||
init_srcs_ip[n_init_srcs] = ip_addr;
|
init_srcs_ip[n_init_srcs] = ip_addr;
|
||||||
++n_init_srcs;
|
++n_init_srcs;
|
||||||
|
@ -746,7 +746,7 @@ parse_allow_deny(const char *line, AllowDeny *list, int allow)
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
ip_addr = DNS_Name2IPAddress(p);
|
ip_addr = DNS_Name2IPAddressRetry(p);
|
||||||
if (ip_addr != DNS_Failed_Address) {
|
if (ip_addr != DNS_Failed_Address) {
|
||||||
new_node = MallocNew(AllowDeny);
|
new_node = MallocNew(AllowDeny);
|
||||||
new_node->allow = allow;
|
new_node->allow = allow;
|
||||||
|
|
29
nameserv.c
29
nameserv.c
|
@ -32,18 +32,28 @@
|
||||||
#include "sysincl.h"
|
#include "sysincl.h"
|
||||||
|
|
||||||
#include "nameserv.h"
|
#include "nameserv.h"
|
||||||
|
#include <resolv.h>
|
||||||
|
|
||||||
/* ================================================== */
|
/* ================================================== */
|
||||||
|
|
||||||
unsigned long
|
static unsigned int retries = 0;
|
||||||
DNS_Name2IPAddress(const char *name)
|
|
||||||
|
static unsigned long
|
||||||
|
Name2IPAddress(const char *name, int retry)
|
||||||
{
|
{
|
||||||
struct hostent *host;
|
struct hostent *host;
|
||||||
unsigned char *address0;
|
unsigned char *address0;
|
||||||
unsigned long result;
|
unsigned long result;
|
||||||
|
|
||||||
|
try_again:
|
||||||
host = gethostbyname(name);
|
host = gethostbyname(name);
|
||||||
if (host == NULL) {
|
if (host == NULL) {
|
||||||
|
if (retry && h_errno == TRY_AGAIN && retries < 10) {
|
||||||
|
sleep(2 << retries);
|
||||||
|
retries++;
|
||||||
|
res_init();
|
||||||
|
goto try_again;
|
||||||
|
}
|
||||||
result = DNS_Failed_Address;
|
result = DNS_Failed_Address;
|
||||||
} else {
|
} else {
|
||||||
address0 = host->h_addr_list[0];
|
address0 = host->h_addr_list[0];
|
||||||
|
@ -54,7 +64,22 @@ DNS_Name2IPAddress(const char *name)
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ================================================== */
|
||||||
|
|
||||||
|
unsigned long
|
||||||
|
DNS_Name2IPAddress(const char *name)
|
||||||
|
{
|
||||||
|
return Name2IPAddress(name, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ================================================== */
|
||||||
|
|
||||||
|
unsigned long
|
||||||
|
DNS_Name2IPAddressRetry(const char *name)
|
||||||
|
{
|
||||||
|
return Name2IPAddress(name, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ================================================== */
|
/* ================================================== */
|
||||||
|
|
|
@ -36,6 +36,8 @@ static const unsigned long DNS_Failed_Address = 0x0UL;
|
||||||
|
|
||||||
extern unsigned long DNS_Name2IPAddress(const char *name);
|
extern unsigned long DNS_Name2IPAddress(const char *name);
|
||||||
|
|
||||||
|
extern unsigned long DNS_Name2IPAddressRetry(const char *name);
|
||||||
|
|
||||||
const char *DNS_IPAddress2Name(unsigned long ip_addr);
|
const char *DNS_IPAddress2Name(unsigned long ip_addr);
|
||||||
|
|
||||||
#endif /* GOT_NAMESERV_H */
|
#endif /* GOT_NAMESERV_H */
|
||||||
|
|
Loading…
Reference in a new issue