X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flogin%2Flogind-core.c;h=0e7786f10395f373bca521b9bfa8a694eee0babe;hp=e1e288f0fe574b350c79cca1454c591d0a0ee91e;hb=d49b80008fd8c0952da67bee0dc8a1314f29b8a7;hpb=198eb9458184a7b82a85df1d03a3dd52f24f5f26 diff --git a/src/login/logind-core.c b/src/login/logind-core.c index e1e288f0f..0e7786f10 100644 --- a/src/login/logind-core.c +++ b/src/login/logind-core.c @@ -1,5 +1,3 @@ -/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ - /*** This file is part of systemd. @@ -19,19 +17,22 @@ along with systemd; If not, see . ***/ -#include -#include #include #include +#include +#include #include -#include "strv.h" -#include "cgroup-util.h" -#include "bus-util.h" +#include "alloc-util.h" #include "bus-error.h" -#include "udev-util.h" +#include "bus-util.h" +#include "cgroup-util.h" +#include "fd-util.h" #include "logind.h" +#include "strv.h" #include "terminal-util.h" +#include "udev-util.h" +#include "user-util.h" int manager_add_device(Manager *m, const char *sysfs, bool master, Device **_device) { Device *d; @@ -95,15 +96,16 @@ int manager_add_session(Manager *m, const char *id, Session **_session) { int manager_add_user(Manager *m, uid_t uid, gid_t gid, const char *name, User **_user) { User *u; + int r; assert(m); assert(name); u = hashmap_get(m->users, UID_TO_PTR(uid)); if (!u) { - u = user_new(m, uid, gid, name); - if (!u) - return -ENOMEM; + r = user_new(&u, m, uid, gid, name); + if (r < 0) + return r; } if (_user) @@ -135,7 +137,7 @@ int manager_add_user_by_uid(Manager *m, uid_t uid, User **_user) { errno = 0; p = getpwuid(uid); if (!p) - return errno ? -errno : -ENOENT; + return errno > 0 ? -errno : -ENOENT; return manager_add_user(m, uid, p->pw_gid, p->pw_name, _user); } @@ -183,44 +185,6 @@ int manager_add_button(Manager *m, const char *name, Button **_button) { return 0; } -int manager_watch_busname(Manager *m, const char *name) { - char *n; - int r; - - assert(m); - assert(name); - - if (set_get(m->busnames, (char*) name)) - return 0; - - n = strdup(name); - if (!n) - return -ENOMEM; - - r = set_put(m->busnames, n); - if (r < 0) { - free(n); - return r; - } - - return 0; -} - -void manager_drop_busname(Manager *m, const char *name) { - Session *session; - Iterator i; - - assert(m); - assert(name); - - /* keep it if the name still owns a controller */ - HASHMAP_FOREACH(session, m->sessions, i) - if (session_is_controller(session, name)) - return; - - free(set_remove(m->busnames, (char*) name)); -} - int manager_process_seat_device(Manager *m, struct udev_device *d) { Device *device; int r; @@ -312,40 +276,75 @@ int manager_process_button_device(Manager *m, struct udev_device *d) { } int manager_get_session_by_pid(Manager *m, pid_t pid, Session **session) { +#if 0 /// elogind does not support systemd units, but its own session system + _cleanup_free_ char *unit = NULL; +#else _cleanup_free_ char *session_name = NULL; +#endif // 0 Session *s; int r; assert(m); - assert(session); if (pid < 1) return -EINVAL; +#if 0 /// elogind does not support systemd units, but its own session system + r = cg_pid_get_unit(pid, &unit); + if (r < 0) + return 0; + + s = hashmap_get(m->session_units, unit); +#else + log_debug_elogind("Searching session for PID %u", pid); r = cg_pid_get_session(pid, &session_name); if (r < 0) return 0; s = hashmap_get(m->sessions, session_name); + log_debug_elogind("Session Name \"%s\" -> Session \"%s\"", + session_name, s && s->id ? s->id : "NULL"); +#endif // 0 if (!s) return 0; - *session = s; + if (session) + *session = s; return 1; } int manager_get_user_by_pid(Manager *m, pid_t pid, User **user) { +#if 0 /// elogind does not support systemd units, but its own session system + _cleanup_free_ char *unit = NULL; + User *u; +#else Session *s; +#endif // 0 int r; assert(m); assert(user); + if (pid < 1) + return -EINVAL; + +#if 0 /// elogind does not support systemd units, but its own session system + r = cg_pid_get_slice(pid, &unit); + if (r < 0) + return 0; + + u = hashmap_get(m->user_units, unit); + if (!u) + return 0; + + *user = u; +#else r = manager_get_session_by_pid (m, pid, &s); if (r <= 0) return r; *user = s->user; +#endif // 0 return 1; } @@ -392,18 +391,19 @@ bool manager_shall_kill(Manager *m, const char *user) { assert(m); assert(user); - if (!m->kill_user_processes) + if (!m->kill_exclude_users && streq(user, "root")) return false; if (strv_contains(m->kill_exclude_users, user)) return false; - if (strv_isempty(m->kill_only_users)) - return true; + if (!strv_isempty(m->kill_only_users)) + return strv_contains(m->kill_only_users, user); - return strv_contains(m->kill_only_users, user); + return m->kill_user_processes; } +#if 0 /// UNNEEDED by elogind static int vt_is_busy(unsigned int vtnr) { struct vt_stat vt_stat; int r = 0; @@ -429,6 +429,47 @@ static int vt_is_busy(unsigned int vtnr) { return r; } +int manager_spawn_autovt(Manager *m, unsigned int vtnr) { + _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; + char name[sizeof("autovt@tty.service") + DECIMAL_STR_MAX(unsigned int)]; + int r; + + assert(m); + assert(vtnr >= 1); + + if (vtnr > m->n_autovts && + vtnr != m->reserve_vt) + return 0; + + if (vtnr != m->reserve_vt) { + /* If this is the reserved TTY, we'll start the getty + * on it in any case, but otherwise only if it is not + * busy. */ + + r = vt_is_busy(vtnr); + if (r < 0) + return r; + else if (r > 0) + return -EBUSY; + } + + snprintf(name, sizeof(name), "autovt@tty%u.service", vtnr); + r = sd_bus_call_method( + m->bus, + "org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.systemd.Manager", + "StartUnit", + &error, + NULL, + "ss", name, "fail"); + if (r < 0) + log_error("Failed to start %s: %s", name, bus_error_message(&error, r)); + + return r; +} +#endif // 0 + static bool manager_is_docked(Manager *m) { Iterator i; Button *b; @@ -484,7 +525,7 @@ static int manager_count_external_displays(Manager *m) { continue; /* Ignore internal displays: the type is encoded in - * the sysfs name, as the second dash seperated item + * the sysfs name, as the second dash separated item * (the first is the card name, the last the connector * number). We implement a whitelist of external * displays here, rather than a whitelist, to ensure