diff options
author | Thomas Gschwantner <tharre3@gmail.com> | 2019-12-11 04:06:21 +0100 |
---|---|---|
committer | Thomas Gschwantner <tharre3@gmail.com> | 2019-12-11 06:22:17 +0100 |
commit | ca0e5670ac989ff3621ba133a455756ee378faf4 (patch) | |
tree | aa8ba4da7c76cdfdeeae01a9274be09468f9c2ad /wg-dynamic-client.c | |
parent | Change request_ip protocol (diff) | |
download | wg-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.c | 45 |
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; } |