diff --git a/daemon/main.c b/daemon/main.c index 288dd16c1..19d878a1d 100644 --- a/daemon/main.c +++ b/daemon/main.c @@ -31,6 +31,8 @@ +static int global_shutdown; + static char *pidfile; static gboolean foreground; static u_int32_t ipv4; @@ -56,9 +58,38 @@ static char *b2b_url; +gpointer sighandler(gpointer x) { + sigset_t ss; + int ret, sig; + + sigemptyset(&ss); + sigaddset(&ss, SIGINT); + sigaddset(&ss, SIGTERM); + sigaddset(&ss, SIGABRT); + sigaddset(&ss, SIGSEGV); + sigaddset(&ss, SIGQUIT); + + while (!global_shutdown) { + ret = sigwait(&ss, &sig); + if (ret) + abort(); + + if (sig == SIGINT || sig == SIGTERM) + global_shutdown = 1; + else + abort(); + } + + return NULL; +} + + static void signals(void) { - signal(SIGPIPE, SIG_IGN); - signal(SIGCHLD, SIG_IGN); + sigset_t ss; + + sigfillset(&ss); + sigprocmask(SIG_SETMASK, &ss, NULL); + pthread_sigmask(SIG_SETMASK, &ss, NULL); } static int rlim(int res, rlim_t val) { @@ -273,6 +304,7 @@ int main(int argc, char **argv) { int ret; void *dlh; const char **strp; + GThread *signal_handler_thread; options(&argc, &argv); g_thread_init(NULL); @@ -365,11 +397,19 @@ int main(int argc, char **argv) { die("Refusing to continue without working Redis database\n"); } - for (;;) { + signal_handler_thread = g_thread_create(sighandler, NULL, TRUE, NULL); + if (!signal_handler_thread) + die("Failed to create thread\n"); + + while (!global_shutdown) { ret = poller_poll(p, 100); if (ret == -1) break; } + g_thread_join(signal_handler_thread); + + mylog(LOG_INFO, "Version %s shutting down", MEDIAPROXY_VERSION); + return 0; }