diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2017-04-24 03:45:40 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2017-05-17 18:07:42 +0200 |
commit | 83223f8e4c2001b61465509143e12fe9e862b3ea (patch) | |
tree | ae576ee9ac498720c2e7ee49e5ae887796b6ed89 /src/config.c | |
parent | wg: no hyphen in preshared, to keep uniformity (diff) | |
download | wireguard-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.c | 11 |
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); |