diff options
Diffstat (limited to 'src/login/elogind.c')
-rw-r--r-- | src/login/elogind.c | 46 |
1 files changed, 28 insertions, 18 deletions
diff --git a/src/login/elogind.c b/src/login/elogind.c index 9fe52a94c..77622483a 100644 --- a/src/login/elogind.c +++ b/src/login/elogind.c @@ -156,7 +156,7 @@ static int elogind_daemonize(void) { /// Simple tool to see, if elogind is already running static pid_t elogind_is_already_running(bool need_pid_file) { - _cleanup_free_ char *s = NULL; + _cleanup_free_ char *s = NULL, *comm = NULL; pid_t pid; int r; @@ -170,8 +170,17 @@ static pid_t elogind_is_already_running(bool need_pid_file) { if (r < 0) goto we_are_alone; - if ( (pid != getpid_cached()) && pid_is_alive(pid)) - return pid; + if ( (pid != getpid_cached()) && pid_is_alive(pid)) { + /* If the old elogind process currently running was forked into + * background, its name will be "elogind-daemon", while this + * process will be "elogind". + * Therefore check comm with startswith(). + */ + get_process_comm(pid, &comm); + if (NULL == startswith(strna(comm), program_invocation_short_name)) + goto we_are_alone; + } + return pid; we_are_alone: @@ -454,27 +463,28 @@ void elogind_manager_reset_config(Manager* m) { #endif // ENABLE_DEBUG_ELOGIND } - /// Add-On for manager_startup() -int elogind_manager_startup(Manager *m) { - int r; - - assert(m); +int elogind_manager_startup(Manager* m) { + int r, e = 0; - assert_se(sigprocmask_many(SIG_SETMASK, NULL, SIGINT, -1) >= 0); + /* Install our signal handler */ 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"); + if (r < 0) { + if (e == 0) e = r; + 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"); + if (r < 0) { + if (e == 0) e = r; + 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"); + if (r < 0) { + if (e == 0) e = r; + log_error_errno(r, "Failed to register SIGTERM handler: %m"); + } - return 0; + return e; } |