diff options
author | David Härdeman <david@hardeman.nu> | 2020-06-19 19:11:48 +0200 |
---|---|---|
committer | David Härdeman <david@hardeman.nu> | 2020-06-19 19:11:48 +0200 |
commit | 91a7ca50f3f8a2c7bb01113fa3849cb5e153a70f (patch) | |
tree | 18c5b7c76f4ec3069e9033a1c222eefd2c945da6 /server.c | |
parent | 445647adc4475c0b8264ce8b6c97d748eec69e7b (diff) |
Add support for async DNS
Diffstat (limited to 'server.c')
-rw-r--r-- | server.c | 31 |
1 files changed, 28 insertions, 3 deletions
@@ -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); |