diff options
author | Tushar Pankaj <tushar.s.pankaj@gmail.com> | 2018-11-12 17:59:39 -0600 |
---|---|---|
committer | Tushar Pankaj <tushar.s.pankaj@gmail.com> | 2018-11-12 17:59:39 -0600 |
commit | ea6ab8ce09d4e84440185536f7b3e92346789233 (patch) | |
tree | 36a1b3ae7670b2e4db19ab1beaa512372e470532 | |
parent | Add IP addr structs to protocol (diff) | |
download | wg-dynamic-ea6ab8ce09d4e84440185536f7b3e92346789233.tar.xz wg-dynamic-ea6ab8ce09d4e84440185536f7b3e92346789233.zip |
Working client and server comms
Signed-off-by: Tushar Pankaj <tushar.s.pankaj@gmail.com>
-rw-r--r-- | client.c | 23 | ||||
-rw-r--r-- | client.h | 4 | ||||
-rw-r--r-- | server.c | 74 | ||||
-rw-r--r-- | server.h | 6 | ||||
-rw-r--r-- | wg_dynamic_client.c | 22 | ||||
-rw-r--r-- | wg_dynamic_server.c | 26 |
6 files changed, 138 insertions, 17 deletions
@@ -4,16 +4,16 @@ */ #include <stdlib.h> -#include <stdio.h> #include <stdbool.h> #include <unistd.h> +#include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include "protocol.h" #include "client.h" -bool is_server_in_allowed_ips(const char interface[]) +bool is_server_in_allowed_ips(const char iface[]) { /* TODO: check if IP is in wg allowed ips, etc */ return true; @@ -22,21 +22,30 @@ bool is_server_in_allowed_ips(const char interface[]) int connect_to_server() { int sock = -1; + int ret; struct sockaddr_in6 addr; sock = socket(AF_INET6, SOCK_STREAM, 0); + if (sock < 0) { + return -errno; + } addr.sin6_family = AF_INET6; addr.sin6_port = htons(WG_DYNAMIC_SERVER_PORT); inet_pton(AF_INET6, WG_DYNAMIC_SERVER_IP, &addr.sin6_addr); - connect(sock, (struct sockaddr *)&addr, sizeof(addr)); + ret = connect(sock, (struct sockaddr *)&addr, sizeof(addr)); + if (ret < 0) { + return -errno; + } return sock; } -void close_connection(int sock) +int close_connection(int sock) { - if (close(sock) < 0) { - perror("error closing socket to server"); - exit(EXIT_FAILURE); + int ret; + ret = close(sock); + if (ret < 0) { + return -errno; } + return 0; } @@ -8,8 +8,8 @@ #include <stdbool.h> -bool is_server_in_allowed_ips(const char interface[]); +bool is_server_in_allowed_ips(const char iface[]); int connect_to_server(); -void close_connection(int sock); +int close_connection(int sock); #endif @@ -3,8 +3,78 @@ * Copyright (C) 2018 Wireguard LLC */ -int setup_server(const char interface[]) +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/wait.h> +#include <sys/socket.h> +#include <arpa/inet.h> +#include "protocol.h" +#include "server.h" + +bool is_wg_up_on_iface(const char iface[]) +{ + /* TODO */ + return true; +} + +int setup_server() +{ + int sock = -1; + int reuseaddr = 1; + int ret; + struct sockaddr_in6 addr; + + sock = socket(AF_INET6, SOCK_STREAM, 0); + if (sock < 0) { + return -errno; + } + setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, + sizeof(reuseaddr)); + addr.sin6_family = AF_INET6; + addr.sin6_port = htons(WG_DYNAMIC_SERVER_PORT); + inet_pton(AF_INET6, WG_DYNAMIC_SERVER_IP, &addr.sin6_addr); + ret = bind(sock, (struct sockaddr *)&addr, sizeof(addr)); + if (ret < 0) { + return -errno; + } + ret = listen(sock, 5); + if (ret < 0) { + return -errno; + } + return sock; +} + +static void handle_connection(int conn, struct sockaddr_in6 addr) { /* TODO */ - return -1; +} + +int handle_connections(int sock) +{ + int conn = -1; + pid_t pid = -1; + struct sockaddr_in6 addr; + socklen_t addr_size = sizeof(addr); + ; + while (1) { + conn = accept(sock, (struct sockaddr *)&addr, &addr_size); + if (conn < 0) { + return -errno; + } + pid = fork(); + if (pid < 0) { + return -errno; + } else if (pid == 0) { + close(sock); + handle_connection(conn, addr); + close(conn); + exit(EXIT_SUCCESS); + } else { + close(conn); + } + } + return 0; } @@ -6,6 +6,10 @@ #ifndef SERVER_H #define SERVER_H -int setup_server(const char interface[]); +#include <stdbool.h> + +bool is_wg_up_on_iface(const char iface[]); +int setup_server(); +int handle_connections(int sock); #endif diff --git a/wg_dynamic_client.c b/wg_dynamic_client.c index 318714d..7862e9e 100644 --- a/wg_dynamic_client.c +++ b/wg_dynamic_client.c @@ -7,6 +7,7 @@ #include <stdlib.h> #include <stdio.h> +#include <string.h> const char *PROG_NAME; @@ -17,6 +18,9 @@ static void show_usage() int main(int argc, char *argv[]) { + const char *iface; + int sock; + PROG_NAME = argv[0]; if (argc == 1) { @@ -24,8 +28,22 @@ int main(int argc, char *argv[]) return EXIT_FAILURE; } - if (connect_to_server(argv[1]) < 0) { - perror("error connecting to server"); + iface = argv[1]; + + if (!is_server_in_allowed_ips(iface)) { + fprintf(stderr, "server is not in allowed IPs for tunnel %s\n", + iface); + return EXIT_FAILURE; + } + + if ((sock = connect_to_server(argv[1])) < 0) { + fprintf(stderr, "error connecting to server: %s\n", + strerror(-sock)); + return EXIT_FAILURE; + } + + if ((sock = close_connection(sock)) < 0) { + fprintf(stderr, "error closing socket: %s\n", strerror(-sock)); return EXIT_FAILURE; } diff --git a/wg_dynamic_server.c b/wg_dynamic_server.c index dcc7737..75bf3af 100644 --- a/wg_dynamic_server.c +++ b/wg_dynamic_server.c @@ -7,6 +7,7 @@ #include <stdlib.h> #include <stdio.h> +#include <string.h> const char *PROG_NAME; @@ -17,6 +18,10 @@ static void show_usage() int main(int argc, char *argv[]) { + const char *iface; + int sock; + int ret; + PROG_NAME = argv[0]; if (argc == 1) { @@ -24,10 +29,25 @@ int main(int argc, char *argv[]) return EXIT_FAILURE; } - if (setup_server(argv[1]) < 0) { - perror("error setting up server"); + iface = argv[1]; + + if (!is_wg_up_on_iface(iface)) { + fprintf(stderr, "no such wireguard iface %s\n", iface); + return EXIT_FAILURE; + } + + if ((sock = setup_server(argv[1])) < 0) { + fprintf(stderr, "error setting up server: %s\n", + strerror(-sock)); + return EXIT_FAILURE; + } + + if ((ret = handle_connections(sock)) < 0) { + fprintf(stderr, "error while handling connections: %s\n", + strerror(-ret)); return EXIT_FAILURE; } - return EXIT_SUCCESS; + /* unreachable */ + return EXIT_FAILURE; } |