diff options
author | Stefan Stefanović <stefanx2ovic@gmail.com> | 2018-11-04 18:39:03 +0100 |
---|---|---|
committer | Sven Eden <sven.eden@prydeworx.com> | 2018-11-10 10:00:27 +0100 |
commit | 9f54ff0832237f4040ee9f13679a62425a78a86e (patch) | |
tree | 3e83dae73c01884354b0dbc18b66eb6ad47d2cd1 /src/login | |
parent | c35c7b3a589e8f7f99e9fd0e7e853210af5fea9c (diff) |
elogind: Try to register any of the signals report errors and return the first error.
Diffstat (limited to 'src/login')
-rw-r--r-- | src/login/elogind.c | 44 | ||||
-rw-r--r-- | src/login/elogind.h | 3 | ||||
-rw-r--r-- | src/login/logind.c | 12 |
3 files changed, 41 insertions, 18 deletions
diff --git a/src/login/elogind.c b/src/login/elogind.c index 58040f353..edcf312d4 100644 --- a/src/login/elogind.c +++ b/src/login/elogind.c @@ -372,7 +372,7 @@ void elogind_manager_free(Manager* m) { /// Add-On for manager_new() int elogind_manager_new(Manager* m) { - int r = 0; + int r = 0, e = 0; m->cgroups_agent_fd = -1; m->pin_cgroupfs_fd = -1; @@ -398,22 +398,6 @@ int elogind_manager_new(Manager* m) { if (r > -1) r = manager_setup_cgroup(m); - /* Install our signal handler */ - 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 r; } @@ -469,3 +453,29 @@ void elogind_manager_reset_config(Manager* m) { m->hibernate_delay_sec / USEC_PER_MINUTE); #endif // ENABLE_DEBUG_ELOGIND } + +/// Add-On for manager_startup() +int elogind_manager_startup(Manager* m) { + int r, e = 0; + + /* Install our signal handler */ + r = sd_event_add_signal(m->event, NULL, SIGINT, elogind_signal_handler, m); + if (r < 0) { + if (e == 0) e = r; + log_error_errno(r, "Failed to register SIGINT handler: %m"); + } + + r = sd_event_add_signal(m->event, NULL, SIGQUIT, elogind_signal_handler, m); + if (r < 0) { + if (e == 0) e = r; + log_error_errno(r, "Failed to register SIGQUIT handler: %m"); + } + + r = sd_event_add_signal(m->event, NULL, SIGTERM, elogind_signal_handler, m); + if (r < 0) { + if (e == 0) e = r; + log_error_errno(r, "Failed to register SIGTERM handler: %m"); + } + + return e; +} diff --git a/src/login/elogind.h b/src/login/elogind.h index a5743a162..37bcb1e40 100644 --- a/src/login/elogind.h +++ b/src/login/elogind.h @@ -41,4 +41,7 @@ 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 d9b777fed..558733b30 100644 --- a/src/login/logind.c +++ b/src/login/logind.c @@ -89,7 +89,7 @@ static int manager_new(Manager **ret) { if (r < 0) return r; -#if 0 /// elogind uses its own signal handler, installed at elogind_manager_new() +#if 0 /// elogind uses its own signal handler, installed at elogind_manager_startup() r = sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL); if (r < 0) return r; @@ -1153,6 +1153,12 @@ static int manager_startup(Manager *m) { if (r < 0) return log_error_errno(r, "Failed to register SIGHUP handler: %m"); +#if 1 /// install elogind specific signal handlers + r = elogind_manager_startup(m); + if (r < 0) + return log_error_errno(r, "Failed to register elogind signal handlers: %m"); +#endif // 1 + /* Connect to utmp */ manager_connect_utmp(m); @@ -1326,7 +1332,11 @@ int main(int argc, char *argv[]) { return log_error_errno(r, "Failed to create /run/systemd/machines : %m"); #endif // 0 +#if 0 /// elogind also blocks SIGQUIT, and installs a signal handler for it assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGHUP, SIGTERM, SIGINT, -1) >= 0); +#else + assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGHUP, SIGTERM, SIGINT, SIGQUIT, -1) >= 0); +#endif // 0 r = manager_new(&m); if (r < 0) { |