aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTushar Pankaj <tushar.s.pankaj@gmail.com>2018-11-12 17:59:39 -0600
committerTushar Pankaj <tushar.s.pankaj@gmail.com>2018-11-12 17:59:39 -0600
commitea6ab8ce09d4e84440185536f7b3e92346789233 (patch)
tree36a1b3ae7670b2e4db19ab1beaa512372e470532
parentAdd IP addr structs to protocol (diff)
downloadwg-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.c23
-rw-r--r--client.h4
-rw-r--r--server.c74
-rw-r--r--server.h6
-rw-r--r--wg_dynamic_client.c22
-rw-r--r--wg_dynamic_server.c26
6 files changed, 138 insertions, 17 deletions
diff --git a/client.c b/client.c
index 1a839b9..ebef8b3 100644
--- a/client.c
+++ b/client.c
@@ -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;
}
diff --git a/client.h b/client.h
index 8dd35db..5a4b460 100644
--- a/client.h
+++ b/client.h
@@ -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
diff --git a/server.c b/server.c
index 0315ccb..89a78c0 100644
--- a/server.c
+++ b/server.c
@@ -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;
}
diff --git a/server.h b/server.h
index 3ffa9c5..43f8af2 100644
--- a/server.h
+++ b/server.h
@@ -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;
}