From: Sven Eden Date: Thu, 31 Aug 2017 14:44:51 +0000 (+0200) Subject: Prep v235: Catch and react on SIGINT, SIGQUIT and SIGTERM X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=9e60a42b6a546ddf433e244502bfcee3f02ee674;p=elogind.git Prep v235: Catch and react on SIGINT, SIGQUIT and SIGTERM --- diff --git a/src/login/elogind.c b/src/login/elogind.c index 79037a4d9..96cb7bd41 100644 --- a/src/login/elogind.c +++ b/src/login/elogind.c @@ -27,6 +27,7 @@ #include "mount-setup.h" #include "parse-util.h" #include "process-util.h" +#include "signal-util.h" #include "socket-util.h" #include "stdio-util.h" #include "string-util.h" @@ -39,6 +40,25 @@ # define ELOGIND_PID_FILE "/run/elogind.pid" #endif // ELOGIND_PID_FILE + +static int elogind_signal_handler(sd_event_source *s, + const struct signalfd_siginfo *si, + void *userdata) { + Manager *m = userdata; + int r; + + log_warning("Received signal %u [%s]", si->ssi_signo, + signal_to_string(si->ssi_signo)); + + r = sd_event_get_state(m->event); + + if (r != SD_EVENT_FINISHED) + sd_event_exit(m->event, si->ssi_signo); + + return 0; +} + + static void remove_pid_file(void) { if (access(ELOGIND_PID_FILE, F_OK) == 0) unlink_noerrno(ELOGIND_PID_FILE); @@ -433,3 +453,28 @@ void elogind_manager_reset_config(Manager* m) { dbg_cnt, m->hybrid_sleep_state[dbg_cnt]); #endif // ENABLE_DEBUG_ELOGIND } + + +/// Add-On for manager_startup() +int elogind_manager_startup(Manager *m) { + int r; + + assert(m); + + assert_se(sigprocmask_many(SIG_SETMASK, NULL, SIGINT, -1) >= 0); + r = sd_event_add_signal(m->event, NULL, SIGINT, elogind_signal_handler, m); + if (r < 0) + return log_error_errno(r, "Failed to register SIGINT handler: %m"); + + assert_se(sigprocmask_many(SIG_SETMASK, NULL, SIGQUIT, -1) >= 0); + r = sd_event_add_signal(m->event, NULL, SIGQUIT, elogind_signal_handler, m); + if (r < 0) + return log_error_errno(r, "Failed to register SIGQUIT handler: %m"); + + assert_se(sigprocmask_many(SIG_SETMASK, NULL, SIGTERM, -1) >= 0); + r = sd_event_add_signal(m->event, NULL, SIGTERM, elogind_signal_handler, m); + if (r < 0) + return log_error_errno(r, "Failed to register SIGTERM handler: %m"); + + return 0; +} diff --git a/src/login/elogind.h b/src/login/elogind.h index 7f11a150a..60b9f80dd 100644 --- a/src/login/elogind.h +++ b/src/login/elogind.h @@ -41,5 +41,8 @@ int elogind_manager_new(Manager* m); /// Add-On for manager_reset_config() void elogind_manager_reset_config(Manager* m); +/// Add-On for manager_startup() +int elogind_manager_startup(Manager *m); + #endif // ELOGIND_SRC_LOGIN_ELOGIN_H_INCLUDED diff --git a/src/login/logind.c b/src/login/logind.c index a390293af..7452c5b82 100644 --- a/src/login/logind.c +++ b/src/login/logind.c @@ -1161,6 +1161,10 @@ static int manager_startup(Manager *m) { if (r < 0) return log_error_errno(r, "Failed to register SIGHUP handler: %m"); +#if 1 /// elogind needs some extra preparations before connecting... + elogind_manager_startup(m); +#endif // 1 + /* Connect to console */ r = manager_connect_console(m); if (r < 0)