X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flogin%2Flogind.c;h=a54195cebb6d578ab343302090bad343630e6430;hb=1c0f62e37b0e775df7cb6121bc6ae64d1d885d3b;hp=3a1903ca130032d946a02eba337f32d471109016;hpb=addedec48ba0ffc4472ef6d3b5a45c9d4239f1cd;p=elogind.git diff --git a/src/login/logind.c b/src/login/logind.c index 3a1903ca1..a54195ceb 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) { @@ -955,7 +997,8 @@ static int manager_connect_udev(Manager *m) { ev.events = EPOLLIN; ev.data.u32 = FD_SEAT_UDEV; - if (m->n_autovts <= 0) + /* Don't bother watching VCSA devices, if nobody cares */ + if (m->n_autovts <= 0 || m->console_active_fd < 0) return 0; if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->udev_seat_fd, &ev) < 0) @@ -1074,13 +1117,13 @@ int manager_startup(Manager *m) { if (m->epoll_fd < 0) return -errno; - /* Connect to udev */ - r = manager_connect_udev(m); + /* Connect to console */ + r = manager_connect_console(m); if (r < 0) return r; - /* Connect to console */ - r = manager_connect_console(m); + /* Connect to udev */ + r = manager_connect_udev(m); if (r < 0) return r; @@ -1173,7 +1216,7 @@ static int manager_parse_config_file(Manager *m) { assert(m); - fn = "/etc/systemd/systemd-logind.conf"; + fn = "/etc/systemd/logind.conf"; f = fopen(fn, "re"); if (!f) { if (errno == ENOENT) @@ -1197,6 +1240,7 @@ int main(int argc, char *argv[]) { int r; log_set_target(LOG_TARGET_AUTO); + log_set_facility(LOG_AUTH); log_parse_environment(); log_open(); @@ -1223,9 +1267,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);