X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=manager.c;h=82dc9a676bb344273aeb2b9c9f9adc0cbf715bf5;hp=7d288bde60300bf21ef5c0e6d3d411735447b827;hb=57ee42cefda6a3f3ea3252e0ab9190b709f0ce49;hpb=80876c20f64f87765242bc35895977ab6a855729 diff --git a/manager.c b/manager.c index 7d288bde6..82dc9a676 100644 --- a/manager.c +++ b/manager.c @@ -72,18 +72,25 @@ static int enable_special_signals(Manager *m) { static int manager_setup_signals(Manager *m) { sigset_t mask; struct epoll_event ev; + struct sigaction sa; assert(m); + /* We are not interested in SIGSTOP and friends. */ + zero(sa); + sa.sa_handler = SIG_DFL; + sa.sa_flags = SA_NOCLDSTOP|SA_RESTART; + assert_se(sigaction(SIGCHLD, &sa, NULL) == 0); + assert_se(sigemptyset(&mask) == 0); assert_se(sigaddset(&mask, SIGCHLD) == 0); - assert_se(sigaddset(&mask, SIGINT) == 0); /* Kernel sends us this on control-alt-del */ - assert_se(sigaddset(&mask, SIGWINCH) == 0); /* Kernel sends us this on kbrequest (alt-arrowup) */ assert_se(sigaddset(&mask, SIGTERM) == 0); assert_se(sigaddset(&mask, SIGHUP) == 0); assert_se(sigaddset(&mask, SIGUSR1) == 0); assert_se(sigaddset(&mask, SIGUSR2) == 0); - assert_se(sigaddset(&mask, SIGPWR) == 0); + assert_se(sigaddset(&mask, SIGINT) == 0); /* Kernel sends us this on control-alt-del */ + assert_se(sigaddset(&mask, SIGWINCH) == 0); /* Kernel sends us this on kbrequest (alt-arrowup) */ + assert_se(sigaddset(&mask, SIGPWR) == 0); /* Some kernel drivers and upsd send us this on power failure */ assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0); m->signal_watch.type = WATCH_SIGNAL; @@ -1477,7 +1484,7 @@ static int manager_dispatch_sigchld(Manager *m) { if (si.si_pid <= 0) break; - if (si.si_code == CLD_EXITED && si.si_code == CLD_KILLED && si.si_code == CLD_DUMPED) { + if (si.si_code == CLD_EXITED || si.si_code == CLD_KILLED || si.si_code == CLD_DUMPED) { char *name = NULL; get_process_name(si.si_pid, &name); @@ -1576,6 +1583,25 @@ static int manager_process_signal_fd(Manager *m, bool *quit) { manager_dump_jobs(m, stdout, "\t"); break; + case SIGUSR2: { + Unit *u; + + u = manager_get_unit(m, SPECIAL_DBUS_SERVICE); + + if (!u || UNIT_IS_ACTIVE_OR_RELOADING(unit_active_state(u))) { + log_info("Trying to reconnect to bus..."); + bus_init_system(m); + bus_init_api(m); + } + + if (!u || !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u))) { + log_info("Loading D-Bus service..."); + manager_start_target(m, SPECIAL_DBUS_SERVICE); + } + + break; + } + default: log_info("Got unhandled signal <%s>.", strsignal(sfsi.ssi_signo)); }