From 91a7ca50f3f8a2c7bb01113fa3849cb5e153a70f Mon Sep 17 00:00:00 2001 From: David Härdeman Date: Fri, 19 Jun 2020 19:11:48 +0200 Subject: Add support for async DNS --- server.c | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) (limited to 'server.c') diff --git a/server.c b/server.c index 5025f18..690c0ca 100644 --- a/server.c +++ b/server.c @@ -19,6 +19,7 @@ #include "server.h" #include "proxy.h" #include "utils.h" +#include "config.h" #include "idle.h" #include "rcon.h" #include "systemd.h" @@ -85,6 +86,7 @@ server_delete(struct cfg *cfg, struct server *scfg) struct saddr *remote; struct saddr *rcon; struct saddr *tmp; + struct dns_async *dns, *dtmp; verbose("Removing server %s\n", scfg->name); @@ -107,6 +109,9 @@ server_delete(struct cfg *cfg, struct server *scfg) xfree(remote); } + list_for_each_entry_safe(dns, dtmp, &scfg->dnslookups, list) + gai_cancel(&dns->gcb); + uring_poll_cancel(cfg, &scfg->exec_task); uring_task_put(cfg, &scfg->exec_task); uring_task_destroy(cfg, &scfg->task); @@ -429,18 +434,32 @@ server_commit(struct cfg *cfg, struct server *scfg) return false; } + if (!list_empty(&scfg->dnslookups)) { + debug(DBG_SRV, "called with pending DNS requests\n"); + return true; + } + /* FIXME: running? */ if (scfg->stop_method == SERVER_STOP_METHOD_RCON && - (list_empty(&scfg->rcons) || !scfg->rcon_password)) { - error("%s: rcon stop method but missing rcon password\n", scfg->name); + list_empty(&scfg->rcons)) { + error("%s: rcon stop method missing rcon address\n", + scfg->name); + return false; + } + + if (scfg->stop_method == SERVER_STOP_METHOD_RCON && + !scfg->rcon_password) { + error("%s: rcon stop method missing rcon password\n", + scfg->name); return false; } if ((scfg->start_method == SERVER_START_METHOD_SYSTEMD || scfg->stop_method == SERVER_STOP_METHOD_SYSTEMD) && !scfg->systemd_service) { - error("%s: systemd start/stop method but missing systemd service\n", scfg->name); + error("%s: systemd start/stop method missing systemd service\n", + scfg->name); return false; } @@ -558,6 +577,7 @@ server_commit(struct cfg *cfg, struct server *scfg) systemd_service_running(cfg, scfg); } + debug(DBG_SRV, "success\n"); return true; } @@ -567,6 +587,7 @@ server_add_remote(struct cfg *cfg, struct server *scfg, struct saddr *remote) if (!scfg || !remote) return false; + debug(DBG_SRV, "adding remote: %s\n", remote->addrstr); list_add(&remote->list, &scfg->remotes); return true; } @@ -590,6 +611,7 @@ server_add_local(struct cfg *cfg, struct server *scfg, struct saddr *saddr) local->local = *saddr; uring_task_init(&local->task, "local", &scfg->task, server_local_free); + debug(DBG_SRV, "adding local: %s\n", saddr->addrstr); list_add(&local->list, &scfg->locals); xfree(saddr); return true; @@ -601,6 +623,7 @@ server_add_rcon(struct cfg *cfg, struct server *scfg, struct saddr *rcon) if (!scfg || !rcon) return false; + debug(DBG_SRV, "adding rcon: %s\n", rcon->addrstr); list_add(&rcon->list, &scfg->rcons); return true; } @@ -740,6 +763,7 @@ server_new(struct cfg *cfg, const char *name) return NULL; } + scfg->cfg = cfg; scfg->type = SERVER_TYPE_UNDEFINED; scfg->name = xstrdup(name); scfg->running = false; @@ -752,6 +776,7 @@ server_new(struct cfg *cfg, const char *name) list_init(&scfg->locals); list_init(&scfg->proxys); list_init(&scfg->rcons); + list_init(&scfg->dnslookups); scfg->idle_timeout = 0; list_add(&scfg->list, &cfg->servers); -- cgit v1.2.3