summaryrefslogtreecommitdiff
path: root/server.c
diff options
context:
space:
mode:
authorDavid Härdeman <david@hardeman.nu>2020-06-19 19:11:48 +0200
committerDavid Härdeman <david@hardeman.nu>2020-06-19 19:11:48 +0200
commit91a7ca50f3f8a2c7bb01113fa3849cb5e153a70f (patch)
tree18c5b7c76f4ec3069e9033a1c222eefd2c945da6 /server.c
parent445647adc4475c0b8264ce8b6c97d748eec69e7b (diff)
Add support for async DNS
Diffstat (limited to 'server.c')
-rw-r--r--server.c31
1 files changed, 28 insertions, 3 deletions
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);