X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flogin%2Flogind.c;h=2e4342b0aedf4af9792bae02018107ac46fca38e;hp=72889535e330b0176dc7115d4635d981491e2c4c;hb=d2338db3145922b1dfcb3b458e5bce2568a9347a;hpb=6156b4779584b4bf1dc973ce988a34a1bcae1db3 diff --git a/src/login/logind.c b/src/login/logind.c index 72889535e..2e4342b0a 100644 --- a/src/login/logind.c +++ b/src/login/logind.c @@ -30,12 +30,13 @@ #include "conf-parser.h" #include "bus-util.h" #include "bus-error.h" -#include "logind.h" #include "udev-util.h" #include "formats-util.h" +#include "signal-util.h" #include "label.h" -#include "label.h" +#include "logind.h" #include "cgroup.h" +#include "mount-setup.h" #include "virt.h" static void manager_free(Manager *m); @@ -95,6 +96,13 @@ static Manager *manager_new(void) { if (!m->kill_exclude_users) goto fail; + /* If elogind should be its own controller, mount its cgroup */ + if (streq(SYSTEMD_CGROUP_CONTROLLER, "name=elogind")) { + r = mount_setup(true); + if (r < 0) + goto fail; + } + /* Make cgroups */ r = manager_setup_cgroup(m); if (r < 0) @@ -195,7 +203,7 @@ static void manager_free(Manager *m) { udev_unref(m->udev); if (m->unlink_nologin) - unlink("/run/nologin"); + (void) unlink("/run/nologin"); bus_verify_polkit_async_registry_free(m->polkit_registry); @@ -210,8 +218,8 @@ static void manager_free(Manager *m) { /* Avoid the creation of new processes forked by the * kernel; at this point, we will not listen to the * signals anyway */ - if (detect_container(NULL) <= 0) - (void) cg_uninstall_release_agent(ELOGIND_CGROUP_CONTROLLER); + if (detect_container() <= 0) + (void) cg_uninstall_release_agent(SYSTEMD_CGROUP_CONTROLLER); manager_shutdown_cgroup(m, true); @@ -861,13 +869,8 @@ static int manager_connect_console(Manager *m) { return -EINVAL; } - r = ignore_signals(SIGRTMIN + 1, -1); - if (r < 0) - return log_error_errno(r, "Cannot ignore SIGRTMIN + 1: %m"); - - r = sigprocmask_many(SIG_BLOCK, SIGRTMIN, -1); - if (r < 0) - return log_error_errno(r, "Cannot block SIGRTMIN: %m"); + assert_se(ignore_signals(SIGRTMIN + 1, -1) >= 0); + assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGRTMIN, -1) >= 0); r = sd_event_add_signal(m->event, NULL, SIGRTMIN, manager_vt_switch, m); if (r < 0) @@ -1194,6 +1197,12 @@ static int manager_run(Manager *m) { manager_gc(m, true); + r = manager_dispatch_delayed(m, false); + if (r < 0) + return r; + if (r > 0) + continue; + r = sd_event_run(m->event, (uint64_t) -1); if (r < 0) return r;