summaryrefslogtreecommitdiff
path: root/server.c
diff options
context:
space:
mode:
Diffstat (limited to 'server.c')
-rw-r--r--server.c134
1 files changed, 6 insertions, 128 deletions
diff --git a/server.c b/server.c
index ddd4ad4..9290a96 100644
--- a/server.c
+++ b/server.c
@@ -10,9 +10,6 @@
#include <poll.h>
#include <errno.h>
#include <sched.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <netinet/tcp.h>
#include "main.h"
#include "uring.h"
@@ -24,13 +21,6 @@
#include "rcon.h"
#include "systemd.h"
-struct server_local {
- struct saddr local;
- struct saddr client;
- struct uring_task task;
- struct list_head list;
-};
-
static bool
set_property(struct server *server, char **property, const char *value)
{
@@ -58,7 +48,7 @@ server_refdump(struct server *server)
uring_task_refdump(&server->ann_task);
uring_task_refdump(&server->idle_task);
list_for_each_entry(local, &server->locals, list)
- uring_task_refdump(&local->task);
+ local_refdump(local);
list_for_each_entry(proxy, &server->proxys, list)
proxy_refdump(proxy);
rcon_refdump(server->rcon);
@@ -101,7 +91,7 @@ server_delete(struct server *server)
rcon_delete(server);
list_for_each_entry_safe(local, ltmp, &server->locals, list)
- uring_task_destroy(&local->task);
+ local_delete(local);
list_for_each_entry_safe(proxy, ptmp, &server->proxys, list)
proxy_delete(proxy);
@@ -187,111 +177,6 @@ server_dump(struct server *server)
}
static void
-server_local_free(struct uring_task *task)
-{
- struct server_local *local = container_of(task, struct server_local, task);
-
- assert_return(task);
-
- debug(DBG_SRV, "task %p, local %p", task, local);
- list_del(&local->list);
- xfree(local);
-}
-
-static void
-server_local_accept(struct uring_task *task, int res)
-{
- struct server_local *local = container_of(task, struct server_local, task);
- struct server *server = container_of(task->parent, struct server, task);
- struct server_proxy *proxy;
-
- assert_return(task);
- assert_task_alive(DBG_SRV, task);
-
- debug(DBG_SRV, "task %p, res %i, server %s", task, res, server->name);
-
- if (res < 0) {
- error("result was %i", res);
- goto out;
- }
-
- saddr_set_addrstr(&local->client);
-
- verbose("%s: incoming proxy connection: %s -> %s",
- server->name, local->client.addrstr, local->local.addrstr);
-
- if (list_empty(&server->remotes)) {
- /* This shouldn't be possible, checked before opening local */
- error("server->remotes empty!");
- uring_close(&local->task, res);
- goto out;
- }
-
- proxy = proxy_new(server, &local->client, res);
- if (!proxy)
- uring_close(&local->task, res);
-
-out:
- uring_accept(&local->task, &local->client, server_local_accept);
-}
-
-static bool
-server_local_open(struct server *server, struct server_local *local)
-{
- int sfd;
- int option;
- int r;
-
- assert_return(server && local, false);
-
- sfd = socket(local->local.storage.ss_family, SOCK_STREAM | SOCK_CLOEXEC, 0);
- if (sfd < 0) {
- error("socket: %m");
- goto error;
- }
-
- option = true;
- if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option)) < 0) {
- error("setsockopt: %m");
- goto error;
- }
-
- /* The MC protocol expects the client to send data first */
- /* FIXME: could make this configurable */
- option = true;
- if (setsockopt(sfd, IPPROTO_TCP, TCP_DEFER_ACCEPT, &option, sizeof(option)) < 0)
- error("setsockopt: %m");
-
- /* FIXME: could make this configurable */
- option = true;
- if (setsockopt(sfd, IPPROTO_IP, IP_FREEBIND, &option, sizeof(option)) < 0)
- error("setsockopt: %m");
-
- socket_set_low_latency(sfd);
-
- r = bind(sfd, (struct sockaddr *)&local->local.storage, local->local.addrlen);
- if (r < 0) {
- error("bind: %m");
- goto error;
- }
-
- r = listen(sfd, 100);
- if (r < 0) {
- error("listen: %m");
- goto error;
- }
-
- uring_task_set_fd(&local->task, sfd);
- uring_accept(&local->task, &local->client, server_local_accept);
- return true;
-
-error:
- if (sfd >= 0)
- close(sfd);
- return false;
-}
-
-static void
server_exec_free(struct uring_task *task)
{
assert_return(task);
@@ -731,9 +616,8 @@ server_commit(struct server *server)
/* FIXME: config, dont reread config if server running, make sure fd is available before this is called */
server_dump(server);
- list_for_each_entry(local, &server->locals, list) {
- server_local_open(server, local);
- }
+ list_for_each_entry(local, &server->locals, list)
+ local_open(local);
server->state = SERVER_STATE_CFG_OK;
@@ -762,17 +646,11 @@ server_add_local(struct server *server, struct saddr *saddr)
assert_return(server && saddr, false);
assert_task_alive_or(DBG_SRV, &server->task, return false);
- local = zmalloc(sizeof(*local));
- if (!local) {
- error("malloc: %m");
+ local = local_new(server, saddr);
+ if (!local)
return false;
- }
- debug(DBG_SRV, "adding local: %s", saddr->addrstr);
- local->local = *saddr;
- uring_task_init(&local->task, "local", &server->task, server_local_free);
list_add(&local->list, &server->locals);
- xfree(saddr);
return true;
}