]> git.ipfire.org Git - thirdparty/chrony.git/commitdiff
Retry name resolving after temporary failure few times before giving up
authorMiroslav Lichvar <mlichvar@redhat.com>
Mon, 10 Nov 2008 13:42:41 +0000 (14:42 +0100)
committerMiroslav Lichvar <mlichvar@redhat.com>
Mon, 10 Nov 2008 14:54:06 +0000 (15:54 +0100)
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.

cmdparse.c
conf.c
nameserv.c
nameserv.h

index 7acc44cca2e5c52c86cc86f0c636925af5ea5395..e09db45938156a0983032a235764e2c7e7492ed0 100644 (file)
@@ -61,7 +61,7 @@ CPS_ParseNTPSourceAdd(const char *line, CPS_NTP_Source *src)
   
   ok = 0;
   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) {
       ok = 1;
     }
diff --git a/conf.c b/conf.c
index e34927ed5031363856407b8b735027ff7f068beb..8e6c1d9a63053eb0adac71c71d5d052ee0813d23 100644 (file)
--- a/conf.c
+++ b/conf.c
@@ -584,7 +584,7 @@ parse_initstepslew(const char *line)
   }
   while (*p) {
     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) {
         init_srcs_ip[n_init_srcs] = ip_addr;
         ++n_init_srcs;
@@ -746,7 +746,7 @@ parse_allow_deny(const char *line, AllowDeny *list, int allow)
       }
 
     } else {
-      ip_addr = DNS_Name2IPAddress(p);
+      ip_addr = DNS_Name2IPAddressRetry(p);
       if (ip_addr != DNS_Failed_Address) {
         new_node = MallocNew(AllowDeny);
         new_node->allow = allow;
index dd610df525eb8c4ce376e5d6ca2eea7d5a8c61d1..9a25254110443745448a297a928f795b61e51097 100644 (file)
 #include "sysincl.h"
 
 #include "nameserv.h"
+#include <resolv.h>
 
 /* ================================================== */
 
-unsigned long
-DNS_Name2IPAddress(const char *name)
+static unsigned int retries = 0;
+
+static unsigned long
+Name2IPAddress(const char *name, int retry)
 {
   struct hostent *host;
   unsigned char *address0;
   unsigned long result;
 
+try_again:
   host = gethostbyname(name);
   if (host == NULL) {
+    if (retry && h_errno == TRY_AGAIN && retries < 10) {
+      sleep(2 << retries);
+      retries++;
+      res_init();
+      goto try_again;
+    }
     result = DNS_Failed_Address;
   } else {
     address0 = host->h_addr_list[0];
@@ -54,7 +64,22 @@ DNS_Name2IPAddress(const char *name)
   }
 
   return result;
+}
+
+/* ================================================== */
+
+unsigned long
+DNS_Name2IPAddress(const char *name)
+{
+  return Name2IPAddress(name, 0);
+}
 
+/* ================================================== */
+
+unsigned long
+DNS_Name2IPAddressRetry(const char *name)
+{
+  return Name2IPAddress(name, 1);
 }
 
 /* ================================================== */
index e62f334bcab25431ee03ab3c993a0ab484b5804f..69ceef8ea4507a0671124f83886f0059f858eaac 100644 (file)
@@ -36,6 +36,8 @@ static const unsigned long DNS_Failed_Address = 0x0UL;
 
 extern unsigned long DNS_Name2IPAddress(const char *name);
 
+extern unsigned long DNS_Name2IPAddressRetry(const char *name);
+
 const char *DNS_IPAddress2Name(unsigned long ip_addr);
 
 #endif /* GOT_NAMESERV_H */