summaryrefslogtreecommitdiff
path: root/main.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 /main.c
parent41dc97f5d0dbcfe4399656c9aabb597f6366ca23 (diff)
Make struct cfg global and make the corresponding changes throughout
Diffstat (limited to 'main.c')
-rw-r--r--main.c95
1 files changed, 41 insertions, 54 deletions
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 <someuser>)");
@@ -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();