aboutsummaryrefslogtreecommitdiffstats
path: root/wg-dynamic-client.c
diff options
context:
space:
mode:
authorThomas Gschwantner <tharre3@gmail.com>2019-12-11 04:06:21 +0100
committerThomas Gschwantner <tharre3@gmail.com>2019-12-11 06:22:17 +0100
commitca0e5670ac989ff3621ba133a455756ee378faf4 (patch)
treeaa8ba4da7c76cdfdeeae01a9274be09468f9c2ad /wg-dynamic-client.c
parentChange request_ip protocol (diff)
downloadwg-dynamic-ca0e5670ac989ff3621ba133a455756ee378faf4.tar.xz
wg-dynamic-ca0e5670ac989ff3621ba133a455756ee378faf4.zip
Properly send and display wg_errno and errmsg
Diffstat (limited to 'wg-dynamic-client.c')
-rw-r--r--wg-dynamic-client.c45
1 files changed, 35 insertions, 10 deletions
diff --git a/wg-dynamic-client.c b/wg-dynamic-client.c
index 7284e3b..7839210 100644
--- a/wg-dynamic-client.c
+++ b/wg-dynamic-client.c
@@ -144,6 +144,7 @@ static int request_ip(struct wg_dynamic_request_ip *rip)
if (close(sockfd))
debug("Failed to close socket: %s\n", strerror(errno));
+ log_err("Server communication error.\n");
return -1;
}
@@ -151,27 +152,51 @@ static int request_ip(struct wg_dynamic_request_ip *rip)
log_err("Warning: discarding %zu extra bytes sent by the server\n",
remaining);
- if (rip->wg_errno)
+ if (rip->wg_errno && !rip->has_ipv4 && !rip->has_ipv6) {
+ if (rip->errmsg) {
+ log_err("Server refused request: %s\n", rip->errmsg);
+ return -1;
+ } else if (rip->wg_errno <= ARRAY_SIZE(WG_DYNAMIC_ERR) - 1) {
+ log_err("Server refused request: %s\n",
+ WG_DYNAMIC_ERR[rip->wg_errno]);
+ } else {
+ log_err("Server refused request: unknown error code %u\n",
+ rip->wg_errno);
+ }
+
+ free(rip->errmsg); /* TODO: this could be done cleaner */
return -1;
+ }
+ free(rip->errmsg);
if (!ipv4_assigned || memcmp(&ipv4, &rip->ipv4, sizeof ipv4)) {
if (ipv4_assigned && ipm_deladdr_v4(device->ifindex, &ipv4))
fatal("ipm_deladdr_v4()");
- memcpy(&ipv4, &rip->ipv4, sizeof ipv4);
- if (ipm_newaddr_v4(device->ifindex, &ipv4))
- fatal("ipm_newaddr_v4()");
- ipv4_assigned = true;
+ if (rip->has_ipv4) {
+ memcpy(&ipv4, &rip->ipv4, sizeof ipv4);
+ if (ipm_newaddr_v4(device->ifindex, &ipv4))
+ fatal("ipm_newaddr_v4()");
+ ipv4_assigned = true;
+ } else {
+ memset(&ipv4, 0, sizeof ipv4);
+ ipv4_assigned = false;
+ }
}
if (!ipv6_assigned || memcmp(&ipv6, &rip->ipv6, sizeof ipv6)) {
if (ipv6_assigned && ipm_deladdr_v6(device->ifindex, &ipv6))
fatal("ipm_deladdr_v6()");
- memcpy(&ipv6, &rip->ipv6, sizeof ipv6);
- if (ipm_newaddr_v6(device->ifindex, &ipv6))
- fatal("ipm_newaddr_v6()");
- ipv6_assigned = true;
+ if (rip->has_ipv6) {
+ memcpy(&ipv6, &rip->ipv6, sizeof ipv6);
+ if (ipm_newaddr_v6(device->ifindex, &ipv6))
+ fatal("ipm_newaddr_v6()");
+ ipv6_assigned = true;
+ } else {
+ memset(&ipv6, 0, sizeof ipv6);
+ ipv6_assigned = false;
+ }
}
if (close(sockfd))
@@ -245,7 +270,7 @@ static void loop()
if (request_ip(&rip)) {
/* TODO: implement some sort of exponential backoff */
- debug("Server communication error, trying again in 30s\n");
+ log_err("Trying again in 30s.\n");
xnanosleep(30);
return;
}