summaryrefslogtreecommitdiff
path: root/proxy.c
diff options
context:
space:
mode:
Diffstat (limited to 'proxy.c')
-rw-r--r--proxy.c67
1 files changed, 67 insertions, 0 deletions
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;
+}
+