X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flogin%2Flogind.c;h=7fd6515ffd329e80a3163f89696f19a3b9b036a4;hb=b412ab3bcca61cf4402a6df2888b22ce88eaee08;hp=333d5f85bdd09c808c310bc7d513a2c3cd864f58;hpb=976c088a0242a1a91b8f00899a4c2ae0e621a185;p=elogind.git diff --git a/src/login/logind.c b/src/login/logind.c index 333d5f85b..7fd6515ff 100644 --- a/src/login/logind.c +++ b/src/login/logind.c @@ -29,6 +29,8 @@ #include #include +#include + #include "logind.h" #include "dbus-common.h" #include "dbus-loop.h" @@ -779,34 +781,74 @@ finish: return r; } -void manager_cgroup_notify_empty(Manager *m, const char *cgroup) { +int manager_get_session_by_cgroup(Manager *m, const char *cgroup, Session **session) { Session *s; char *p; assert(m); assert(cgroup); + assert(session); + + s = hashmap_get(m->cgroups, cgroup); + if (s) { + *session = s; + return 1; + } p = strdup(cgroup); if (!p) { log_error("Out of memory."); - return; + return -ENOMEM; } for (;;) { char *e; - if (isempty(p) || streq(p, "/")) - break; - - s = hashmap_get(m->cgroups, p); - if (s) - session_add_to_gc_queue(s); + e = strrchr(p, '/'); + if (!e || e == p) { + free(p); + *session = NULL; + return 0; + } - assert_se(e = strrchr(p, '/')); *e = 0; + + s = hashmap_get(m->cgroups, p); + if (s) { + free(p); + *session = s; + return 1; + } } +} + +int manager_get_session_by_pid(Manager *m, pid_t pid, Session **session) { + char *p; + int r; + assert(m); + assert(pid >= 1); + assert(session); + + r = cg_get_by_pid(SYSTEMD_CGROUP_CONTROLLER, pid, &p); + if (r < 0) + return r; + + r = manager_get_session_by_cgroup(m, p, session); free(p); + + return r; +} + +void manager_cgroup_notify_empty(Manager *m, const char *cgroup) { + Session *s; + int r; + + r = manager_get_session_by_cgroup(m, cgroup, &s); + if (r <= 0) + return; + + session_add_to_gc_queue(s); } static void manager_pipe_notify_eof(Manager *m, int fd) { @@ -1224,9 +1266,20 @@ int main(int argc, char *argv[]) { goto finish; } + log_debug("systemd-logind running as pid %lu", (unsigned long) getpid()); + + sd_notify(false, + "READY=1\n" + "STATUS=Processing requests..."); + r = manager_run(m); + log_debug("systemd-logind stopped as pid %lu", (unsigned long) getpid()); + finish: + sd_notify(false, + "STATUS=Shutting down..."); + if (m) manager_free(m);