diff options
author | David Härdeman <david@hardeman.nu> | 2020-06-05 17:41:04 +0200 |
---|---|---|
committer | David Härdeman <david@hardeman.nu> | 2020-06-05 17:41:04 +0200 |
commit | 3d2d0d4b3aa64aba018b049edf9c0396d5a598d5 (patch) | |
tree | 2c4700417d240793a3dfe0aa9de9696ece91baa2 /proxy.c | |
parent | db90b7982410c20bca2c3dc206a690012edecce4 (diff) |
Split out active proxy connection handling to separate file
Diffstat (limited to 'proxy.c')
-rw-r--r-- | proxy.c | 67 |
1 files changed, 67 insertions, 0 deletions
@@ -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; +} + |