X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flogind-session.c;h=63ee75808b546f9ef668b380ebde57907c89d797;hb=66ccd0387e528567dff92239e85c962d2f140ef1;hp=ab4de66ca4d8c4bc90eb521a72029476296a0a82;hpb=0254daedb1b67a16c6d54b964b31b5e8eaa4ac4c;p=elogind.git diff --git a/src/logind-session.c b/src/logind-session.c index ab4de66ca..63ee75808 100644 --- a/src/logind-session.c +++ b/src/logind-session.c @@ -536,7 +536,8 @@ int session_start(Session *s) { if (r < 0) return r; - log_info("New session %s of user %s.", s->id, s->user->name); + log_full(s->type == SESSION_TTY || s->type == SESSION_X11 ? LOG_INFO : LOG_DEBUG, + "New session %s of user %s.", s->id, s->user->name); /* Create cgroup */ r = session_create_cgroup(s); @@ -588,7 +589,7 @@ static bool session_shall_kill(Session *s) { return strv_contains(s->manager->kill_only_users, s->user->name); } -static int session_kill_cgroup(Session *s) { +static int session_terminate_cgroup(Session *s) { int r; char **k; @@ -658,10 +659,11 @@ int session_stop(Session *s) { assert(s); if (s->started) - log_info("Removed session %s.", s->id); + log_full(s->type == SESSION_TTY || s->type == SESSION_X11 ? LOG_INFO : LOG_DEBUG, + "Removed session %s.", s->id); /* Kill cgroup */ - k = session_kill_cgroup(s); + k = session_terminate_cgroup(s); if (k < 0) r = k; @@ -886,6 +888,47 @@ void session_add_to_gc_queue(Session *s) { s->in_gc_queue = true; } +int session_kill(Session *s, KillWho who, int signo) { + int r = 0; + Set *pid_set = NULL; + + assert(s); + + if (!s->cgroup_path) + return -ESRCH; + + if (s->leader <= 0 && who == KILL_LEADER) + return -ESRCH; + + if (s->leader > 0) + if (kill(s->leader, signo) < 0) + r = -errno; + + if (who == KILL_ALL) { + int q; + + pid_set = set_new(trivial_hash_func, trivial_compare_func); + if (!pid_set) + return -ENOMEM; + + if (s->leader > 0) { + q = set_put(pid_set, LONG_TO_PTR(s->leader)); + if (q < 0) + r = q; + } + + q = cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, s->cgroup_path, signo, false, true, false, pid_set); + if (q < 0) + if (q != -EAGAIN && q != -ESRCH && q != -ENOENT) + r = q; + } + + if (pid_set) + set_free(pid_set); + + return r; +} + static const char* const session_type_table[_SESSION_TYPE_MAX] = { [SESSION_TTY] = "tty", [SESSION_X11] = "x11", @@ -893,3 +936,10 @@ static const char* const session_type_table[_SESSION_TYPE_MAX] = { }; DEFINE_STRING_TABLE_LOOKUP(session_type, SessionType); + +static const char* const kill_who_table[_KILL_WHO_MAX] = { + [KILL_LEADER] = "leader", + [KILL_ALL] = "all" +}; + +DEFINE_STRING_TABLE_LOOKUP(kill_who, KillWho);