wg: retry name resolution on temporary failure

This should solve many problems at init time.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
Jason A. Donenfeld 2017-04-24 03:45:40 +02:00
parent c98c415bd1
commit 83223f8e4c

View file

@ -8,6 +8,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <unistd.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <errno.h> #include <errno.h>
@ -189,7 +190,15 @@ static inline bool parse_endpoint(struct sockaddr *endpoint, const char *value)
*end = '\0'; *end = '\0';
++end; ++end;
} }
ret = getaddrinfo(begin, end, &hints, &resolved);
for (unsigned int timeout = 1000000; timeout < 90000000; timeout = timeout * 3 / 2) {
ret = getaddrinfo(begin, end, &hints, &resolved);
if (ret != EAI_AGAIN)
break;
fprintf(stderr, "%s: `%s`. Trying again in %.2f seconds...\n", gai_strerror(ret), value, timeout / 1000000.0);
usleep(timeout);
}
if (ret != 0) { if (ret != 0) {
free(mutable); free(mutable);
fprintf(stderr, "%s: `%s`\n", gai_strerror(ret), value); fprintf(stderr, "%s: `%s`\n", gai_strerror(ret), value);