diff --git a/src/login/logind-session-dbus.c b/src/login/logind-session-dbus.c index cc2d581bc5..5300284e5a 100644 --- a/src/login/logind-session-dbus.c +++ b/src/login/logind-session-dbus.c @@ -360,7 +360,7 @@ int bus_session_method_kill(sd_bus_message *message, void *userdata, sd_bus_erro if (r == 0) return 1; /* Will call us back */ - r = session_kill(s, whom, signo); + r = session_kill(s, whom, signo, error); if (r < 0) return r; diff --git a/src/login/logind-session.c b/src/login/logind-session.c index 26ed2d3e49..351b64b60b 100644 --- a/src/login/logind-session.c +++ b/src/login/logind-session.c @@ -1387,16 +1387,20 @@ SessionState session_get_state(Session *s) { return SESSION_ONLINE; } -int session_kill(Session *s, KillWhom whom, int signo) { +int session_kill(Session *s, KillWhom whom, int signo, sd_bus_error *error) { assert(s); switch (whom) { case KILL_ALL: - if (!s->scope) - return -ESRCH; + if (!SESSION_CLASS_WANTS_SCOPE(s->class)) + return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, + "Session '%s' has no associated scope", s->id); - return manager_kill_unit(s->manager, s->scope, KILL_ALL, signo, NULL); + if (!s->scope) + return sd_bus_error_set_errnof(error, ESRCH, "Scope for session '%s' not active", s->id); + + return manager_kill_unit(s->manager, s->scope, KILL_ALL, signo, error); case KILL_LEADER: return pidref_kill(&s->leader, signo); diff --git a/src/login/logind-session.h b/src/login/logind-session.h index 86ffc64bda..2d2cb189fc 100644 --- a/src/login/logind-session.h +++ b/src/login/logind-session.h @@ -191,7 +191,7 @@ int session_finalize(Session *s); int session_release(Session *s); int session_save(Session *s); int session_load(Session *s); -int session_kill(Session *s, KillWhom whom, int signo); +int session_kill(Session *s, KillWhom whom, int signo, sd_bus_error *error); SessionState session_get_state(Session *u);