aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/config.c
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2017-04-24 03:45:40 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2017-05-17 18:07:42 +0200
commit83223f8e4c2001b61465509143e12fe9e862b3ea (patch)
treeae576ee9ac498720c2e7ee49e5ae887796b6ed89 /src/config.c
parentwg: no hyphen in preshared, to keep uniformity (diff)
downloadwireguard-tools-83223f8e4c2001b61465509143e12fe9e862b3ea.tar.xz
wireguard-tools-83223f8e4c2001b61465509143e12fe9e862b3ea.zip
wg: retry name resolution on temporary failure
This should solve many problems at init time. Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'src/config.c')
-rw-r--r--src/config.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/config.c b/src/config.c
index be15870..c00e91c 100644
--- a/src/config.c
+++ b/src/config.c
@@ -8,6 +8,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <errno.h>
@@ -189,7 +190,15 @@ static inline bool parse_endpoint(struct sockaddr *endpoint, const char *value)
*end = '\0';
++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) {
free(mutable);
fprintf(stderr, "%s: `%s`\n", gai_strerror(ret), value);