summaryrefslogtreecommitdiff
path: root/cfgdir.c
diff options
context:
space:
mode:
authorDavid Härdeman <david@hardeman.nu>2020-06-22 10:50:15 +0200
committerDavid Härdeman <david@hardeman.nu>2020-06-22 10:50:15 +0200
commit31afd2aaaeb76a12e232eab0fb6a550b73948737 (patch)
tree7125a54d09904eef6c558a682cff0a7976529fad /cfgdir.c
parent41dc97f5d0dbcfe4399656c9aabb597f6366ca23 (diff)
Make struct cfg global and make the corresponding changes throughout
Diffstat (limited to 'cfgdir.c')
-rw-r--r--cfgdir.c124
1 files changed, 60 insertions, 64 deletions
diff --git a/cfgdir.c b/cfgdir.c
index 3e8cef3..ec8a0bf 100644
--- a/cfgdir.c
+++ b/cfgdir.c
@@ -17,10 +17,9 @@
#include "server.h"
static void
-scfg_dns_cb(struct dns_async *dns, bool (*server_cb)(struct cfg *, struct server *, struct saddr *))
+scfg_dns_cb(struct dns_async *dns, bool (*server_cb)(struct server *, struct saddr *))
{
struct server *server;
- struct cfg *cfg;
struct sockaddr_in *in4;
struct sockaddr_in6 *in6;
struct saddr *saddr;
@@ -30,8 +29,6 @@ scfg_dns_cb(struct dns_async *dns, bool (*server_cb)(struct cfg *, struct server
assert_return(dns && dns->priv && server_cb);
server = dns->priv;
- cfg = server->cfg;
-
debug(DBG_DNS, "called, dns: %p, name: %s, server: %p, server->name: %s",
dns, dns->name, server, server->name);
@@ -62,13 +59,13 @@ scfg_dns_cb(struct dns_async *dns, bool (*server_cb)(struct cfg *, struct server
case AF_INET:
in4 = (struct sockaddr_in *)ai->ai_addr;
saddr_set_ipv4(saddr, in4->sin_addr.s_addr, in4->sin_port);
- server_cb(cfg, server, saddr);
+ server_cb(server, saddr);
break;
case AF_INET6:
in6 = (struct sockaddr_in6 *)ai->ai_addr;
saddr_set_ipv6(saddr, &in6->sin6_addr, in6->sin6_port);
- server_cb(cfg, server, saddr);
+ server_cb(server, saddr);
break;
default:
@@ -83,8 +80,8 @@ out:
freeaddrinfo(results);
list_del(&dns->list);
xfree(dns);
- uring_task_put(cfg, &server->task);
- server_commit(cfg, server);
+ uring_task_put(&server->task);
+ server_commit(server);
}
static void
@@ -189,14 +186,14 @@ struct cfg_key_value_map scfg_key_map[] = {
};
static bool
-handle_dns(struct cfg *cfg, struct server *server, const char *type,
+handle_dns(struct server *server, const char *type,
struct cfg_value *value, dns_cb_t *async_cb,
- bool (*sync_cb)(struct cfg *, struct server *, struct saddr *))
+ bool (*sync_cb)(struct server *, struct saddr *))
{
struct saddr *saddr, *tmp;
struct dns_async *dns;
- assert_return(cfg && server && type && value && async_cb && sync_cb, false);
+ assert_return(server && type && value && async_cb && sync_cb, false);
switch (value->type) {
case CFG_VAL_TYPE_ADDRS:
@@ -204,7 +201,7 @@ handle_dns(struct cfg *cfg, struct server *server, const char *type,
list_for_each_entry_safe(saddr, tmp, &value->saddrs, list) {
list_del(&saddr->list);
- sync_cb(cfg, server, saddr);
+ sync_cb(server, saddr);
}
return true;
@@ -216,7 +213,7 @@ handle_dns(struct cfg *cfg, struct server *server, const char *type,
dns->cb = async_cb;
dns->priv = server;
list_add(&dns->list, &server->dnslookups);
- uring_task_get(cfg, &server->task);
+ uring_task_get(&server->task);
return true;
default:
@@ -225,15 +222,15 @@ handle_dns(struct cfg *cfg, struct server *server, const char *type,
}
static void
-scfg_parse(struct cfg *cfg, struct server *server)
+scfg_parse(struct server *server)
{
char *pos;
- assert_return(cfg && server);
+ assert_return(server);
pos = server->tbuf.buf;
- if (!config_parse_header(cfg, server->name, "server", &pos))
+ if (!config_parse_header(server->name, "server", &pos))
return;
while (true) {
@@ -241,7 +238,7 @@ scfg_parse(struct cfg *cfg, struct server *server)
const char *keyname;
struct cfg_value value;
- if (!config_parse_line(cfg, server->name, &pos, scfg_key_map,
+ if (!config_parse_line(server->name, &pos, scfg_key_map,
&key, &keyname, &value))
break;
@@ -254,87 +251,87 @@ scfg_parse(struct cfg *cfg, struct server *server)
case SCFG_KEY_TYPE:
if (streq(value.str, "proxy")) {
- if (!server_set_type(cfg, server, SERVER_TYPE_PROXY))
+ if (!server_set_type(server, SERVER_TYPE_PROXY))
return;
} else if (streq(value.str, "announce")) {
- if (!server_set_type(cfg, server, SERVER_TYPE_ANNOUNCE))
+ if (!server_set_type(server, SERVER_TYPE_ANNOUNCE))
return;
}
break;
case SCFG_KEY_NAME:
- if (!server_set_pretty_name(cfg, server, value.str))
+ if (!server_set_pretty_name(server, value.str))
return;
break;
case SCFG_KEY_PORT:
- if (!server_set_port(cfg, server, value.uint16))
+ if (!server_set_port(server, value.uint16))
return;
break;
case SCFG_KEY_LOCAL:
- if (!handle_dns(cfg, server, "local", &value,
+ if (!handle_dns(server, "local", &value,
scfg_local_dns_cb, server_add_local))
return;
break;
case SCFG_KEY_REMOTE:
- if (!handle_dns(cfg, server, "remote", &value,
+ if (!handle_dns(server, "remote", &value,
scfg_remote_dns_cb, server_add_remote))
return;
break;
case SCFG_KEY_IDLE_TIMEOUT:
- if (!server_set_idle_timeout(cfg, server, value.uint16))
+ if (!server_set_idle_timeout(server, value.uint16))
return;
break;
case SCFG_KEY_STOP_METHOD:
if (streq(value.str, "exec")) {
- if (server_set_stop_method(cfg, server, SERVER_STOP_METHOD_EXEC))
+ if (server_set_stop_method(server, SERVER_STOP_METHOD_EXEC))
break;
} else if (streq(value.str, "rcon")) {
- if (server_set_stop_method(cfg, server, SERVER_STOP_METHOD_RCON))
+ if (server_set_stop_method(server, SERVER_STOP_METHOD_RCON))
break;
} else if (streq(value.str, "systemd")) {
- if (server_set_stop_method(cfg, server, SERVER_STOP_METHOD_SYSTEMD))
+ if (server_set_stop_method(server, SERVER_STOP_METHOD_SYSTEMD))
break;
}
return;
case SCFG_KEY_START_METHOD:
if (streq(value.str, "exec")) {
- if (server_set_start_method(cfg, server, SERVER_START_METHOD_EXEC))
+ if (server_set_start_method(server, SERVER_START_METHOD_EXEC))
break;
} else if (streq(value.str, "systemd")) {
- if (server_set_start_method(cfg, server, SERVER_START_METHOD_SYSTEMD))
+ if (server_set_start_method(server, SERVER_START_METHOD_SYSTEMD))
break;
}
return;
case SCFG_KEY_STOP_EXEC:
- if (!server_set_stop_exec(cfg, server, value.str))
+ if (!server_set_stop_exec(server, value.str))
return;
break;
case SCFG_KEY_START_EXEC:
- if (!server_set_start_exec(cfg, server, value.str))
+ if (!server_set_start_exec(server, value.str))
return;
break;
case SCFG_KEY_RCON:
- if (!handle_dns(cfg, server, "rcon", &value,
+ if (!handle_dns(server, "rcon", &value,
scfg_rcon_dns_cb, server_add_rcon))
return;
break;
case SCFG_KEY_RCON_PASSWORD:
- if (!server_set_rcon_password(cfg, server, value.str))
+ if (!server_set_rcon_password(server, value.str))
return;
break;
case SCFG_KEY_SYSTEMD_SERVICE:
- if (!server_set_systemd_service(cfg, server, value.str))
+ if (!server_set_systemd_service(server, value.str))
return;
break;
@@ -346,42 +343,42 @@ scfg_parse(struct cfg *cfg, struct server *server)
}
static void
-scfg_read_cb(struct cfg *cfg, struct uring_task *task, int res)
+scfg_read_cb(struct uring_task *task, int res)
{
struct server *server = container_of(task, struct server, task);
- assert_return(cfg && task);
+ assert_return(task);
assert_task_alive(DBG_CFG, task);
if (res <= 0) {
error("error reading config file for %s: %s",
server->name, strerror(-res));
- server_delete(cfg, server);
+ server_delete(server);
}
debug(DBG_CFG, "%s: parsing cfg (%i bytes)", server->name, res);
- uring_task_close_fd(cfg, &server->task);
- scfg_parse(cfg, server);
- server_commit(cfg, server);
+ uring_task_close_fd(&server->task);
+ scfg_parse(server);
+ server_commit(server);
}
static void
-scfg_open_cb(struct cfg *cfg, struct uring_task *task, int res)
+scfg_open_cb(struct uring_task *task, int res)
{
struct server *server = container_of(task, struct server, task);
- assert_return(cfg && task);
+ assert_return(task);
assert_task_alive(DBG_CFG, task);
if (res < 0) {
error("open(%s) failed: %s", server->name, strerror(-res));
- server_delete(cfg, server);
+ server_delete(server);
return;
}
debug(DBG_CFG, "reading server cfg %s (fd %i)", server->name, res);
uring_task_set_fd(&server->task, res);
- uring_tbuf_read_until_eof(cfg, &server->task, scfg_read_cb);
+ uring_tbuf_read_until_eof(&server->task, scfg_read_cb);
}
static bool
@@ -410,9 +407,8 @@ static void
inotify_free(struct uring_task *task)
{
struct inotify_ev *iev = container_of(task, struct inotify_ev, task);
- struct cfg *cfg = container_of(task->parent, struct cfg, task);
- assert_return(task && iev && cfg);
+ assert_return(task);
debug(DBG_CFG, "called");
xfree(iev);
@@ -463,14 +459,14 @@ inotify_event_dump(const struct inotify_event *event)
}
static void
-inotify_cb(struct cfg *cfg, struct uring_task *task, int res)
+inotify_cb(struct uring_task *task, int res)
{
struct inotify_ev *iev = container_of(task, struct inotify_ev, task);
const struct inotify_event *event;
char *ptr;
struct server *server;
- assert_return(cfg && task);
+ assert_return(task);
assert_task_alive(DBG_CFG, task);
if (res <= 0) {
@@ -496,38 +492,38 @@ inotify_cb(struct cfg *cfg, struct uring_task *task, int res)
continue;
if (event->mask & (IN_MOVED_FROM | IN_DELETE))
- server_delete_by_name(cfg, event->name);
+ server_delete_by_name(event->name);
else if (event->mask & (IN_MOVED_TO | IN_CREATE | IN_CLOSE_WRITE)) {
- server = server_new(cfg, event->name);
+ server = server_new(event->name);
verbose("New server config file detected: %s", server->name);
- uring_openat(cfg, &server->task, server->name, scfg_open_cb);
+ uring_openat(&server->task, server->name, scfg_open_cb);
} else
error("inotify: unknown event: 0x%08x", event->mask);
}
- uring_read(cfg, &iev->task, iev->buf, sizeof(iev->buf), inotify_cb);
+ uring_read(&iev->task, iev->buf, sizeof(iev->buf), inotify_cb);
}
void
-cfgdir_refdump(struct inotify_ev *iev)
+cfgdir_refdump()
{
- assert_return(iev);
+ assert_return_silent(cfg->iev);
- uring_task_refdump(&iev->task);
+ uring_task_refdump(&cfg->iev->task);
}
void
-cfgdir_delete(struct cfg *cfg)
+cfgdir_delete()
{
- assert_return(cfg && cfg->iev);
+ assert_return(cfg->iev);
debug(DBG_CFG, "closing fd %i", cfg->iev->task.fd);
- uring_task_destroy(cfg, &cfg->iev->task);
+ uring_task_destroy(&cfg->iev->task);
cfg->iev = NULL;
}
void
-cfgdir_init(struct cfg *cfg)
+cfgdir_init()
{
int ifd;
int iwd;
@@ -536,7 +532,7 @@ cfgdir_init(struct cfg *cfg)
struct dirent *dent;
struct server *server;
- assert_return(cfg);
+ assert_return(!cfg->iev);
iev = zmalloc(sizeof(*iev));
if (!iev)
@@ -555,10 +551,10 @@ cfgdir_init(struct cfg *cfg)
if (iwd < 0)
die("inotify_add_watch: %m");
- uring_task_init(cfg, &iev->task, "server_config", uring_parent(cfg), inotify_free);
+ uring_task_init(&iev->task, "server_config", uring_parent(), inotify_free);
uring_task_set_fd(&iev->task, ifd);
cfg->iev = iev;
- uring_read(cfg, &iev->task, iev->buf, sizeof(iev->buf), inotify_cb);
+ uring_read(&iev->task, iev->buf, sizeof(iev->buf), inotify_cb);
dir = opendir(".");
if (!dir)
@@ -570,9 +566,9 @@ cfgdir_init(struct cfg *cfg)
if (!scfg_valid_filename(dent->d_name))
continue;
- server = server_new(cfg, dent->d_name);
+ server = server_new(dent->d_name);
if (server)
- uring_openat(cfg, &server->task, server->name, scfg_open_cb);
+ uring_openat(&server->task, server->name, scfg_open_cb);
}
closedir(dir);