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;
}
}
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;
}
} 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;
#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];
}
return result;
+}
+
+/* ================================================== */
+
+unsigned long
+DNS_Name2IPAddress(const char *name)
+{
+ return Name2IPAddress(name, 0);
+}
+/* ================================================== */
+
+unsigned long
+DNS_Name2IPAddressRetry(const char *name)
+{
+ return Name2IPAddress(name, 1);
}
/* ================================================== */
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 */