chiark / gitweb /
Prep v235: Catch and react on SIGINT, SIGQUIT and SIGTERM
authorSven Eden <yamakuzure@gmx.net>
Thu, 31 Aug 2017 14:44:51 +0000 (16:44 +0200)
committerSven Eden <yamakuzure@gmx.net>
Thu, 31 Aug 2017 14:44:51 +0000 (16:44 +0200)
src/login/elogind.c
src/login/elogind.h
src/login/logind.c

index 79037a4d922182818e086e7266004d64916df6ab..96cb7bd41d67d77c8c0577352ed69f72a858feb7 100644 (file)
@@ -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"
 #  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;
+}
index 7f11a150aa37dfbc01469a60945fb31a2d434fab..60b9f80dd1ae9dcf997b87c0c1e1eeee2293d965 100644 (file)
@@ -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
index a390293af195aacad6a277f2d7cc9f1ef460f01c..7452c5b82c125e06c8af6327a627c2d0f7ea9476 100644 (file)
@@ -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)