diff --git a/daemon/main.c b/daemon/main.c index 2d2c1b932..55b8097d0 100644 --- a/daemon/main.c +++ b/daemon/main.c @@ -32,6 +32,13 @@ +struct main_context { + struct poller *p; + struct callmaster *m; +}; + + + static int global_shutdown; @@ -315,21 +322,14 @@ static void init_everything() { } -int main(int argc, char **argv) { - struct poller *p; - struct callmaster *m; +void create_everything(struct main_context *ctx) { struct callmaster_config mc; struct control *c; struct control_udp *cu; int kfd = -1; - int ret; void *dlh; const char **strp; - init_everything(); - options(&argc, &argv); - - if (table >= 0 && kernel_create_table(table)) { fprintf(stderr, "FAILED TO CREATE KERNEL TABLE %i, KERNEL FORWARDING DISABLED\n", table); mylog(LOG_CRIT, "FAILED TO CREATE KERNEL TABLE %i, KERNEL FORWARDING DISABLED\n", table); @@ -348,13 +348,13 @@ int main(int argc, char **argv) { } } - p = poller_new(); - if (!p) + ctx->p = poller_new(); + if (!ctx->p) die("poller creation failed\n"); - m = callmaster_new(p); - if (!m) - return -1; + ctx->m = callmaster_new(ctx->p); + if (!ctx->m) + die("callmaster creation failed\n"); ZERO(mc); mc.kernelfd = kfd; @@ -372,14 +372,14 @@ int main(int argc, char **argv) { c = NULL; if (listenport) { - c = control_new(p, listenp, listenport, m); + c = control_new(ctx->p, listenp, listenport, ctx->m); if (!c) die("Failed to open TCP control connection port\n"); } cu = NULL; if (udp_listenport) { - cu = control_udp_new(p, udp_listenp, udp_listenport, m); + cu = control_udp_new(ctx->p, udp_listenp, udp_listenport, ctx->m); if (!cu) die("Failed to open UDP control connection port\n"); } @@ -403,22 +403,33 @@ int main(int argc, char **argv) { die("Cannot start up without Redis database\n"); } - callmaster_config(m, &mc); - mylog(LOG_INFO, "Startup complete, version %s", MEDIAPROXY_VERSION); + callmaster_config(ctx->m, &mc); if (!foreground) daemonize(); wpidfile(); if (mc.redis) { - if (redis_restore(m, mc.redis)) + if (redis_restore(ctx->m, mc.redis)) die("Refusing to continue without working Redis database\n"); } thread_create_detach(sighandler, NULL); +} + + +int main(int argc, char **argv) { + struct main_context ctx; + int ret; + + init_everything(); + options(&argc, &argv); + create_everything(&ctx); + + mylog(LOG_INFO, "Startup complete, version %s", MEDIAPROXY_VERSION); while (!global_shutdown) { - ret = poller_poll(p, 100); + ret = poller_poll(ctx.p, 100); if (ret == -1) break; threads_join_all();