diff --git a/src/bind.c b/src/bind.c index 9e3053c..276a1ae 100644 --- a/src/bind.c +++ b/src/bind.c @@ -100,19 +100,6 @@ gt_setup_mtu(struct mud *mud, const char *tun_name) return mtu; } -static void -gt_setup_port(struct sockaddr_storage *ss, uint16_t port) -{ - switch (ss->ss_family) { - case AF_INET: - ((struct sockaddr_in *)ss)->sin_port = htons(port); - break; - case AF_INET6: - ((struct sockaddr_in6 *)ss)->sin6_port = htons(port); - break; - } -} - int gt_bind(int argc, char **argv) { @@ -150,8 +137,8 @@ gt_bind(int argc, char **argv) if (argz(bindz, argc, argv)) return 1; - gt_setup_port(&bind_addr, bind_port); - gt_setup_port(&peer_addr, peer_port); + gt_set_port((struct sockaddr *)&bind_addr, bind_port); + gt_set_port((struct sockaddr *)&peer_addr, peer_port); unsigned char *buf = malloc(bufsize); diff --git a/src/common.c b/src/common.c index 45b1bdd..60ed176 100644 --- a/src/common.c +++ b/src/common.c @@ -69,3 +69,44 @@ gt_fromhex(uint8_t *dst, size_t dst_size, const char *src, size_t src_size) return 0; } + +void +gt_set_port(struct sockaddr *sa, uint16_t port) +{ + switch (sa->sa_family) { + case AF_INET: + ((struct sockaddr_in *)sa)->sin_port = htons(port); + break; + case AF_INET6: + ((struct sockaddr_in6 *)sa)->sin6_port = htons(port); + break; + } +} + +uint16_t +gt_get_port(struct sockaddr *sa) +{ + switch (sa->sa_family) { + case AF_INET: + return ntohs(((struct sockaddr_in *)sa)->sin_port); + case AF_INET6: + return ntohs(((struct sockaddr_in6 *)sa)->sin6_port); + } + + return 0; +} + +int +gt_toaddr(char *str, size_t size, struct sockaddr *sa) +{ + switch (sa->sa_family) { + case AF_INET: + return -!inet_ntop(AF_INET, + &((struct sockaddr_in *)sa)->sin_addr, str, size); + case AF_INET6: + return -!inet_ntop(AF_INET6, + &((struct sockaddr_in6 *)sa)->sin6_addr, str, size); + } + + return -1; +} diff --git a/src/common.h b/src/common.h index a242e2b..ecb9a52 100644 --- a/src/common.h +++ b/src/common.h @@ -1,5 +1,9 @@ #pragma once +#if defined __linux__ && !defined _GNU_SOURCE +#define _GNU_SOURCE +#endif + #include #include #include @@ -7,6 +11,8 @@ #include #include +#include + #ifndef PACKAGE_NAME #define PACKAGE_NAME "glorytun" #endif @@ -53,3 +59,7 @@ void gt_log (const char *, ...) _printf_(1,2); int gt_tohex (char *, size_t, const uint8_t *, size_t); int gt_fromhex (uint8_t *, size_t, const char *, size_t); + +void gt_set_port (struct sockaddr *, uint16_t); +uint16_t gt_get_port (struct sockaddr *); +int gt_toaddr (char *, size_t, struct sockaddr *); diff --git a/src/path.c b/src/path.c index a3d15a5..ed4c684 100644 --- a/src/path.c +++ b/src/path.c @@ -1,7 +1,6 @@ #include "common.h" #include "ctl.h" #include "str.h" -#include "ssutils.h" #include #include @@ -25,8 +24,10 @@ gt_path_status(int fd) char bindstr[INET6_ADDRSTRLEN] = {0}; char peerstr[INET6_ADDRSTRLEN] = {0}; - if (gt_ss_addr(bindstr, sizeof(bindstr), &res.path_status.local_addr) || - gt_ss_addr(peerstr, sizeof(peerstr), &res.path_status.addr)) + if (gt_toaddr(bindstr, sizeof(bindstr), + (struct sockaddr *)&res.path_status.local_addr) || + gt_toaddr(peerstr, sizeof(peerstr), + (struct sockaddr *)&res.path_status.addr)) return -2; const char *statestr = NULL; diff --git a/src/show.c b/src/show.c index 752ea13..f053671 100644 --- a/src/show.c +++ b/src/show.c @@ -1,7 +1,6 @@ #include "common.h" #include "ctl.h" #include "str.h" -#include "ssutils.h" #include "../argz/argz.h" @@ -22,32 +21,34 @@ gt_show_dev_status(int fd, const char *dev) char bindstr[INET6_ADDRSTRLEN] = {0}; char peerstr[INET6_ADDRSTRLEN] = {0}; - if (gt_ss_addr(bindstr, sizeof(bindstr), &res.status.bind)) + if (gt_toaddr(bindstr, sizeof(bindstr), + (struct sockaddr *)&res.status.bind)) return -2; - int server = gt_ss_addr(peerstr, sizeof(peerstr), &res.status.peer); + int server = gt_toaddr(peerstr, sizeof(peerstr), + (struct sockaddr *)&res.status.peer); if (server) { printf("server %s:\n" - " bind: %s port %hu\n" + " bind: %s port %"PRIu16"\n" " mtu: %zu\n" " auto mtu: %s\n" " cipher: %s\n", dev, - bindstr, gt_ss_port(&res.status.bind), + bindstr, gt_get_port((struct sockaddr *)&res.status.bind), res.status.mtu, res.status.mtu_auto ? "enabled" : "disabled", res.status.chacha ? "chacha20poly1305" : "aes256gcm"); } else { printf("client %s:\n" - " bind: %s port %hu\n" - " peer: %s port %hu\n" + " bind: %s port %"PRIu16"\n" + " peer: %s port %"PRIu16"\n" " mtu: %zu\n" " auto mtu: %s\n" " cipher: %s\n", dev, - bindstr, gt_ss_port(&res.status.bind), - peerstr, gt_ss_port(&res.status.peer), + bindstr, gt_get_port((struct sockaddr *)&res.status.bind), + peerstr, gt_get_port((struct sockaddr *)&res.status.peer), res.status.mtu, res.status.mtu_auto ? "enabled" : "disabled", res.status.chacha ? "chacha20poly1305" : "aes256gcm"); diff --git a/src/ssutils.h b/src/ssutils.h deleted file mode 100644 index 89056c3..0000000 --- a/src/ssutils.h +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once - -#include - -static inline unsigned short -gt_ss_port(struct sockaddr_storage *ss) -{ - switch (ss->ss_family) { - case AF_INET: - return ntohs(((struct sockaddr_in *)ss)->sin_port); - case AF_INET6: - return ntohs(((struct sockaddr_in6 *)ss)->sin6_port); - } - - return 0; -} - -static inline int -gt_ss_addr(char *str, size_t size, struct sockaddr_storage *ss) -{ - switch (ss->ss_family) { - case AF_INET: - return -!inet_ntop(AF_INET, - &((struct sockaddr_in *)ss)->sin_addr, str, size); - case AF_INET6: - return -!inet_ntop(AF_INET6, - &((struct sockaddr_in6 *)ss)->sin6_addr, str, size); - } - - return -1; -}