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 --- main.c | 95 +++++++++++++++++++++++++++++------------------------------------- 1 file changed, 41 insertions(+), 54 deletions(-) (limited to 'main.c') diff --git a/main.c b/main.c index d940771..b4d8449 100644 --- a/main.c +++ b/main.c @@ -31,6 +31,7 @@ #define DEFAULT_MAIN_CONFIG_FILE_PATH "./mcproxy.conf" /* Global, not in struct cfg since they're too low-level */ +struct cfg *cfg = NULL; bool exiting = false; unsigned debug_mask = DBG_ERROR | DBG_INFO; @@ -38,7 +39,6 @@ unsigned debug_mask = DBG_ERROR | DBG_INFO; static bool daemonize = false; static FILE *log_file = NULL; static const char *log_file_path = NULL; -static struct cfg *cfghack = NULL; #define ANSI_RED "\x1B[0;31m" #define ANSI_GREEN "\x1B[0;32m" @@ -177,9 +177,9 @@ __die(const char *fmt, ...) static void cfg_free(struct uring_task *task) { - struct cfg *cfg = container_of(task, struct cfg, task); + struct cfg *xcfg = container_of(task, struct cfg, task); - assert_return(task); + assert_return(task && xcfg == cfg); debug(DBG_SIG, "called"); systemd_delete(cfg); @@ -214,7 +214,7 @@ struct cfg_key_value_map mcfg_key_map[] = { }; static void -cfg_read(struct cfg *cfg) +cfg_read() { FILE *cfgfile; const char *path; @@ -261,7 +261,7 @@ cfg_read(struct cfg *cfg) *pos = '\0'; pos = buf; - if (!config_parse_header(cfg, path, "mcproxy", &pos)) + if (!config_parse_header(path, "mcproxy", &pos)) die("main config file (%s) invalid", path); while (true) { @@ -269,7 +269,7 @@ cfg_read(struct cfg *cfg) const char *keyname; struct cfg_value value; - if (!config_parse_line(cfg, path, &pos, mcfg_key_map, + if (!config_parse_line(path, &pos, mcfg_key_map, &key, &keyname, &value)) break; @@ -370,10 +370,9 @@ usage(int argc, char **argv, bool invalid) exit(invalid ? EXIT_FAILURE : EXIT_SUCCESS); } -static struct cfg * +static void cfg_init(int argc, char **argv) { - struct cfg *cfg; int c; unsigned i; @@ -385,7 +384,7 @@ cfg_init(int argc, char **argv) cfg->uid = geteuid(); cfg->gid = getegid(); - uring_task_init(cfg, &cfg->task, "main", NULL, cfg_free); + uring_task_init(&cfg->task, "main", NULL, cfg_free); list_init(&cfg->servers); while (true) { @@ -482,16 +481,11 @@ cfg_init(int argc, char **argv) if (!cfg->homedir) cfg->homedir = DEFAULT_HOMEDIR_PATH; - - return cfg; } static void -cfg_apply(struct cfg *cfg) +cfg_apply() { - if (!cfg) - die("invalid arguments"); - if (cfg->uid == 0 || cfg->gid == 0) /* This catches both -u root and running as root without -u */ die("Execution as root is not supported (use -u )"); @@ -544,7 +538,6 @@ cfg_apply(struct cfg *cfg) } struct signalfd_ev { - struct cfg *cfg; struct uring_task task; struct uring_task_buf tbuf; int pipe[2]; @@ -559,17 +552,15 @@ signalfd_free(struct uring_task *task) debug(DBG_SIG, "called"); close(sev->pipe[PIPE_WR]); - sev->cfg->sev = NULL; + cfg->sev = NULL; xfree(sev); } static void -dump_tree(struct cfg *cfg) +dump_tree() { struct server *server; - assert_return(cfg); - if (!debug_enabled(DBG_REF)) return; @@ -592,14 +583,14 @@ dump_tree(struct cfg *cfg) } static void -signalfd_read(struct cfg *cfg, struct uring_task *task, int res) +signalfd_read(struct uring_task *task, int res) { struct signalfd_ev *sev = container_of(task, struct signalfd_ev, task); struct server *server, *stmp; static unsigned count = 0; siginfo_t *si; - assert_return(cfg && task); + assert_return(task); assert_task_alive(DBG_SIG, task); si = (siginfo_t *)task->tbuf->buf; @@ -630,7 +621,7 @@ signalfd_read(struct cfg *cfg, struct uring_task *task, int res) case SIGUSR2: debug(DBG_SIG, "got a SIGUSR2"); - dump_tree(cfg); + dump_tree(); break; case SIGTERM: @@ -644,21 +635,21 @@ signalfd_read(struct cfg *cfg, struct uring_task *task, int res) case SIGHUP: count++; if (count > 5) { - dump_tree(cfghack); + dump_tree(); exit(EXIT_FAILURE); } verbose("got a signal to dump tree"); sd_notifyf(0, "STOPPING=1\nSTATUS=Received signal, exiting"); - dump_tree(cfg); - uring_task_put(cfg, &sev->task); - igmp_delete(cfg); - announce_delete(cfg); - idle_delete(cfg); - cfgdir_delete(cfg); + dump_tree(); + uring_task_put(&sev->task); + igmp_delete(); + announce_delete(); + idle_delete(); + cfgdir_delete(); list_for_each_entry_safe(server, stmp, &cfg->servers, list) - server_delete(cfg, server); - uring_delete(cfg); + server_delete(server); + uring_delete(); return; default: @@ -667,7 +658,7 @@ signalfd_read(struct cfg *cfg, struct uring_task *task, int res) } out: - uring_tbuf_read(cfg, &sev->task, signalfd_read); + uring_tbuf_read(&sev->task, signalfd_read); } static void @@ -677,20 +668,18 @@ hack_signal_handler(int signum, siginfo_t *si, void *ucontext) assert_return(signum > 0 && si); - r = write(cfghack->sev->pipe[PIPE_WR], si, sizeof(*si)); + r = write(cfg->sev->pipe[PIPE_WR], si, sizeof(*si)); if (r != sizeof(*si)) error("write: %zi\n", r); } static void -signalfd_init(struct cfg *cfg) +signalfd_init() { //sigset_t mask; struct signalfd_ev *sev; - assert_return(cfg); - sev = zmalloc(sizeof(*sev)); if (!sev) die("malloc: %m"); @@ -725,31 +714,28 @@ signalfd_init(struct cfg *cfg) debug(DBG_SIG, "using pipe fds %i -> %i", sev->pipe[PIPE_WR], sev->pipe[PIPE_RD]); - uring_task_init(cfg, &sev->task, "signal", uring_parent(cfg), signalfd_free); + uring_task_init(&sev->task, "signal", uring_parent(), signalfd_free); uring_task_set_fd(&sev->task, sev->pipe[PIPE_RD]); uring_task_set_buf(&sev->task, &sev->tbuf); cfg->sev = sev; - sev->cfg = cfg; - uring_tbuf_read(cfg, &sev->task, signalfd_read); + uring_tbuf_read(&sev->task, signalfd_read); } int main(int argc, char **argv) { - struct cfg *cfg; struct server *server; unsigned server_count; - cfg = cfg_init(argc, argv); - cfghack = cfg; + cfg_init(argc, argv); - cfg_apply(cfg); + cfg_apply(); - cfg_read(cfg); + cfg_read(); - uring_init(cfg); + uring_init(); - igmp_init(cfg); + igmp_init(); /* Drop CAP_NET_RAW (if we have it), only used for igmp */ capng_clear(CAPNG_SELECT_BOTH); @@ -765,17 +751,17 @@ main(int argc, char **argv) die("capng_apply failed"); } - signalfd_init(cfg); + signalfd_init(); - cfgdir_init(cfg); + cfgdir_init(); - announce_init(cfg); + announce_init(); - announce_start(cfg->aev); + announce_start(); - idle_init(cfg); + idle_init(); - uring_task_put(cfg, &cfg->task); + uring_task_put(&cfg->task); server_count = 0; list_for_each_entry(server, &cfg->servers, list) @@ -790,11 +776,12 @@ main(int argc, char **argv) info("mcproxy started, %u server configurations loaded", server_count); - uring_event_loop(cfg); + uring_event_loop(); verbose("Exiting"); xfree(cfg); + cfg = NULL; if (debug_enabled(DBG_MALLOC)) debug_resource_usage(); -- cgit v1.2.3