From 31afd2aaaeb76a12e232eab0fb6a550b73948737 Mon Sep 17 00:00:00 2001 From: David Härdeman Date: Mon, 22 Jun 2020 10:50:15 +0200 Subject: Make struct cfg global and make the corresponding changes throughout --- cfgdir.c | 124 +++++++++++++++++++++++++++++++-------------------------------- 1 file changed, 60 insertions(+), 64 deletions(-) (limited to 'cfgdir.c') 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); -- cgit v1.2.3