chiark / gitweb /
logind: terminate cleanly on SIGTERM/SIGINT
authorLennart Poettering <lennart@poettering.net>
Tue, 24 Apr 2018 16:14:25 +0000 (18:14 +0200)
committerSven Eden <yamakuzure@gmx.net>
Fri, 24 Aug 2018 14:47:08 +0000 (16:47 +0200)
Let's properly terminate on SIGTERM or SIGINT. Previously we'd just rely
on the implicit process clean-up logic on UNIX. By shutting down
properly on SIGTERM/SIGINT we make it easier to track down memory leaks
by employing valgrind.

src/login/logind.c

index 537a739089e5004bedc40424cda115e8f36ad0bd..1687891d0f31ff8839f62288edd1f96a34246bd8 100644 (file)
@@ -89,6 +89,14 @@ static int manager_new(Manager **ret) {
         if (r < 0)
                 return r;
 
+        r = sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL);
+        if (r < 0)
+                return r;
+
+        r = sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL);
+        if (r < 0)
+                return r;
+
         (void) sd_event_set_watchdog(m->event, true);
 
         manager_reset_config(m);
@@ -1140,8 +1148,6 @@ static int manager_startup(Manager *m) {
 
         assert(m);
 
-        assert_se(sigprocmask_many(SIG_SETMASK, NULL, SIGHUP, -1) >= 0);
-
         r = sd_event_add_signal(m->event, NULL, SIGHUP, manager_dispatch_reload_signal, m);
         if (r < 0)
                 return log_error_errno(r, "Failed to register SIGHUP handler: %m");
@@ -1298,6 +1304,8 @@ int main(int argc, char *argv[]) {
         mkdir_label("/run/systemd/users", 0755);
         mkdir_label("/run/systemd/sessions", 0755);
 
+        assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGHUP, SIGTERM, SIGINT, -1) >= 0);
+
         r = manager_new(&m);
         if (r < 0) {
                 log_error_errno(r, "Failed to allocate manager object: %m");