summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSven Eden <yamakuzure@gmx.net>2017-08-31 16:44:51 +0200
committerSven Eden <yamakuzure@gmx.net>2017-08-31 16:44:51 +0200
commit9e60a42b6a546ddf433e244502bfcee3f02ee674 (patch)
treef9cfaf45086ba2968ed565435fc8530433387265 /src
parent03b6c31e91c7ffbb84336ce03dc845e95ef7dcd5 (diff)
Prep v235: Catch and react on SIGINT, SIGQUIT and SIGTERM
Diffstat (limited to 'src')
-rw-r--r--src/login/elogind.c45
-rw-r--r--src/login/elogind.h3
-rw-r--r--src/login/logind.c4
3 files changed, 52 insertions, 0 deletions
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)