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 --- proxy.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 proxy.c (limited to 'proxy.c') 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; +} + -- cgit v1.2.3