From 3d2d0d4b3aa64aba018b049edf9c0396d5a598d5 Mon Sep 17 00:00:00 2001 From: David Härdeman Date: Fri, 5 Jun 2020 17:41:04 +0200 Subject: Split out active proxy connection handling to separate file --- main.h | 10 ------ meson.build | 2 +- proxy.c | 67 +++++++++++++++++++++++++++++++++++++ proxy.h | 19 +++++++++++ server.c | 108 +++++------------------------------------------------------- utils.c | 28 ++++++++++++++++ utils.h | 17 ++++++++-- 7 files changed, 139 insertions(+), 112 deletions(-) create mode 100644 proxy.c create mode 100644 proxy.h diff --git a/main.h b/main.h index 9ab769c..5fafcc2 100644 --- a/main.h +++ b/main.h @@ -33,16 +33,6 @@ struct uring_task { callback_t callback; }; -struct sockaddr_in46 { - union { - struct sockaddr_storage storage; - struct sockaddr_in in4; - struct sockaddr_in6 in6; - }; - socklen_t addrlen; - struct list_head list; -}; - struct cfg { const char *homedir; struct uring_ev *uev; diff --git a/meson.build b/meson.build index efa0cdb..4c7fb08 100644 --- a/meson.build +++ b/meson.build @@ -4,6 +4,6 @@ uring = dependency('liburing') executable('ctest', 'ctest.c') executable('stest', 'stest.c') executable('mcproxy', - ['main.c', 'uring.c', 'server.c', 'cfgdir.c', 'config.c', 'utils.c'], + ['main.c', 'uring.c', 'server.c', 'proxy.c', 'cfgdir.c', 'config.c', 'utils.c'], dependencies: uring) diff --git a/proxy.c b/proxy.c new file mode 100644 index 0000000..00090b1 --- /dev/null +++ b/proxy.c @@ -0,0 +1,67 @@ +#include "main.h" +#include "uring.h" +#include "server.h" +#include "proxy.h" +#include "utils.h" + +void +proxy_refdump(struct server_proxy *proxy) +{ + uring_task_refdump(&proxy->task); +} + +static void +proxy_free(struct uring_task *task) +{ + struct server_proxy *proxy = container_of(task, struct server_proxy, task); + + list_del(&proxy->list); + free(proxy); +} + +static void +proxy_connected(struct cfg *cfg, struct uring_task *task, int res) +{ + //struct server_proxy *proxy = container_of(task, struct server_proxy, task); + + fprintf(stderr, "%s: connected %i\n", __func__, res); + return; +} + +struct server_proxy * +proxy_new(struct cfg *cfg, struct server *scfg, struct sockaddr_in46 *client, int fd) +{ + struct server_proxy *proxy; + struct sockaddr_in46 *remote; + int sfd; + + proxy = zmalloc(sizeof(*proxy)); + if (!proxy) { + perror("malloc"); + return NULL; + } + + remote = list_first_entry(&scfg->remotes, struct sockaddr_in46, list); + proxy->server = *remote; + sockaddr_to_str(&proxy->server, proxy->serverstr, sizeof(proxy->serverstr)); + fprintf(stderr, "%s: attempting proxy connection to %s (len %u)\n", + scfg->name, proxy->serverstr, proxy->server.addrlen); + + sfd = socket(proxy->server.storage.ss_family, SOCK_STREAM, 0); + if (sfd < 0) { + perror("socket"); + uring_close(cfg, NULL, fd, NULL); + free(proxy); + return NULL; + } + + proxy->client = *client; + sockaddr_to_str(&proxy->client, proxy->clientstr, sizeof(proxy->clientstr)); + uring_task_init(&proxy->task, "server_proxy", &scfg->task, proxy_free); + uring_task_set_fd(&proxy->task, sfd); + list_add(&proxy->list, &scfg->proxys); + uring_connect(cfg, &proxy->task, &proxy->server, proxy_connected); + + return proxy; +} + diff --git a/proxy.h b/proxy.h new file mode 100644 index 0000000..5b09cbc --- /dev/null +++ b/proxy.h @@ -0,0 +1,19 @@ +#ifndef fooproxyhfoo +#define fooproxyhfoo + +struct server_proxy { + struct sockaddr_in46 client; + char clientstr[ADDRSTRLEN]; + struct sockaddr_in46 server; + char serverstr[ADDRSTRLEN]; + struct uring_task task; + char buf[4096]; + size_t len; + struct list_head list; +}; + +void proxy_refdump(struct server_proxy *proxy); + +struct server_proxy *proxy_new(struct cfg *cfg, struct server *scfg, struct sockaddr_in46 *client, int fd); + +#endif diff --git a/server.c b/server.c index 0ef5aa7..9b9788b 100644 --- a/server.c +++ b/server.c @@ -6,28 +6,15 @@ #include "main.h" #include "uring.h" -#include "config.h" #include "server.h" - -#define ADDRSTRLEN (9 /*strlen("AF_INETX ")*/ + INET6_ADDRSTRLEN + 6 /*strlen(" 65535")*/ + 1) +#include "proxy.h" +#include "utils.h" struct server_local { struct sockaddr_in46 addr; char addrstr[ADDRSTRLEN]; struct sockaddr_in46 peer; - char peerstr[ADDRSTRLEN]; - struct uring_task task; - struct list_head list; -}; - -struct server_proxy { - struct sockaddr_in46 client; - char clientstr[ADDRSTRLEN]; - struct sockaddr_in46 server; - char serverstr[ADDRSTRLEN]; struct uring_task task; - char buf[4096]; - size_t len; struct list_head list; }; @@ -41,7 +28,7 @@ server_refdump(struct server *server) list_for_each_entry(local, &server->locals, list) uring_task_refdump(&local->task); list_for_each_entry(proxy, &server->proxys, list) - uring_task_refdump(&proxy->task); + proxy_refdump(proxy); } static void @@ -92,30 +79,6 @@ server_delete_by_name(struct cfg *cfg, const char *name) } } -static char * -server_print_addr(struct sockaddr_in46 *addr, char *buf, size_t buflen) -{ - char abuf[ADDRSTRLEN]; - - switch (addr->storage.ss_family) { - case AF_INET: - snprintf(buf, buflen, "AF_INET4 %s %u", - inet_ntop(addr->in4.sin_family, &addr->in4.sin_addr, abuf, sizeof(abuf)), - (unsigned)ntohs(addr->in4.sin_port)); - break; - case AF_INET6: - snprintf(buf, buflen, "AF_INET6 %s %u", - inet_ntop(addr->in6.sin6_family, &addr->in6.sin6_addr, abuf, sizeof(abuf)), - (unsigned)ntohs(addr->in6.sin6_port)); - break; - default: - snprintf(buf, buflen, "AF_UNKNOWN"); - break; - } - - return buf; -} - static void server_dump(struct server *scfg) { @@ -142,38 +105,7 @@ server_dump(struct server *scfg) fprintf(stderr, " * %s\n", local->addrstr); fprintf(stderr, " * Remote ports:\n"); list_for_each_entry(remote, &scfg->remotes, list) - fprintf(stderr, " * %s\n", server_print_addr(remote, abuf, sizeof(abuf))); -} - -/* -struct server_active_proxy { - struct sockaddr_in46 client; - char clientstr[ADDRSTRLEN]; - struct sockaddr_in46 server; - char serverstr[ADDRSTRLEN] - struct uring_task task; - char buf[4096]; - size_t len; - struct list_head list; -}; -*/ - -static void -server_proxy_free(struct uring_task *task) -{ - struct server_proxy *proxy = container_of(task, struct server_proxy, task); - - list_del(&proxy->list); - free(proxy); -} - -static void -server_proxy_connected(struct cfg *cfg, struct uring_task *task, int res) -{ - //struct server_proxy *proxy = container_of(task, struct server_proxy, task); - - fprintf(stderr, "%s: connected %i\n", __func__, res); - return; + fprintf(stderr, " * %s\n", sockaddr_to_str(remote, abuf, sizeof(abuf))); } static void @@ -193,9 +125,7 @@ server_local_accept(struct cfg *cfg, struct uring_task *task, int res) struct server_local *local = container_of(task, struct server_local, task); struct server *scfg = container_of(task->parent, struct server, task); struct server_proxy *proxy; - struct sockaddr_in46 *remote; char abuf[ADDRSTRLEN]; - int sfd; fprintf(stderr, "%s called: task 0x%p and res %i\n", __func__, task, res); fprintf(stderr, "%s called: scfg name is %s\n", __func__, scfg->name); @@ -211,38 +141,18 @@ server_local_accept(struct cfg *cfg, struct uring_task *task, int res) goto out; } - server_print_addr(&local->peer, local->peerstr, sizeof(local->peerstr)); - fprintf(stderr, "%s: incoming proxy connection: %s -> %s\n", scfg->name, local->peerstr, local->addrstr); + sockaddr_to_str(&local->peer, abuf, sizeof(abuf)); + fprintf(stderr, "%s: incoming proxy connection: %s -> %s\n", scfg->name, abuf, local->addrstr); if (list_empty(&scfg->remotes)) { error("scfg->remotes empty!\n"); - goto out; - } - - proxy = zmalloc(sizeof(*proxy)); - if (!proxy) { - perror("malloc"); uring_close(cfg, NULL, res, NULL); goto out; } - remote = list_first_entry(&scfg->remotes, struct sockaddr_in46, list); - fprintf(stderr, "%s: attempting proxy connection to %s (len %u)\n", - scfg->name, server_print_addr(remote, abuf, sizeof(abuf)), remote->addrlen); - - sfd = socket(remote->storage.ss_family, SOCK_STREAM, 0); - if (sfd < 0) { - perror("socket"); + proxy = proxy_new(cfg, scfg, &local->peer, res); + if (!proxy) uring_close(cfg, NULL, res, NULL); - goto out; - } - - proxy->client = local->peer; - memcpy(proxy->clientstr, local->peerstr, sizeof(proxy->clientstr)); - uring_task_init(&proxy->task, "proxy", &scfg->task, server_proxy_free); - uring_task_set_fd(&proxy->task, sfd); - list_add(&proxy->list, &scfg->proxys); - uring_connect(cfg, &proxy->task, remote, server_proxy_connected); out: uring_accept(cfg, &local->task, &local->peer, server_local_accept); @@ -329,7 +239,7 @@ server_add_local(struct cfg *cfg, struct server *scfg, struct sockaddr_in46 *add local->addr.storage = addr->storage; local->addr.addrlen = addr->addrlen; uring_task_init(&local->task, "local", &scfg->task, server_local_free); - server_print_addr(&local->addr, local->addrstr, sizeof(local->addrstr)); + sockaddr_to_str(&local->addr, local->addrstr, sizeof(local->addrstr)); fprintf(stderr, "Adding local: %s\n", local->addrstr); list_add(&local->list, &scfg->locals); free(addr); diff --git a/utils.c b/utils.c index a84f63b..91e44b3 100644 --- a/utils.c +++ b/utils.c @@ -2,6 +2,34 @@ #include #include #include +#include + +#include "main.h" +#include "utils.h" + +char * +sockaddr_to_str(struct sockaddr_in46 *addr, char *buf, size_t buflen) +{ + char abuf[ADDRSTRLEN]; + + switch (addr->storage.ss_family) { + case AF_INET: + snprintf(buf, buflen, "AF_INET4 %s %u", + inet_ntop(addr->in4.sin_family, &addr->in4.sin_addr, abuf, sizeof(abuf)), + (unsigned)ntohs(addr->in4.sin_port)); + break; + case AF_INET6: + snprintf(buf, buflen, "AF_INET6 %s %u", + inet_ntop(addr->in6.sin6_family, &addr->in6.sin6_addr, abuf, sizeof(abuf)), + (unsigned)ntohs(addr->in6.sin6_port)); + break; + default: + snprintf(buf, buflen, "AF_UNKNOWN"); + break; + } + + return buf; +} int strtou16_strict(const char *str, uint16_t *result) diff --git a/utils.h b/utils.h index ccebb30..89bcccc 100644 --- a/utils.h +++ b/utils.h @@ -5,8 +5,6 @@ #include #include -int strtou16_strict(const char *str, uint16_t *result); - struct list_head { struct list_head *next; struct list_head *prev; @@ -86,6 +84,21 @@ static inline void* zmalloc(size_t size) return calloc(1, size); } +#define ADDRSTRLEN (9 /*strlen("AF_INETX ")*/ + INET6_ADDRSTRLEN + 6 /*strlen(" 65535")*/ + 1) +struct sockaddr_in46 { + union { + struct sockaddr_storage storage; + struct sockaddr_in in4; + struct sockaddr_in6 in6; + }; + socklen_t addrlen; + struct list_head list; +}; + +int strtou16_strict(const char *str, uint16_t *result); + +char *sockaddr_to_str(struct sockaddr_in46 *addr, char *buf, size_t buflen); + /* #define _cleanup_(x) __attribute__((cleanup(x))) -- cgit v1.2.3