X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;ds=sidebyside;f=src%2Flogin%2Flogind-session.c;h=d7c074bdce8b4022bcbdf1675793b57fd944ff20;hb=8fe63cd4f16e1e7cdf528ff053f8eb4da7848455;hp=f661cc8b8d2aa1720b70bf6b349348b93b9b8239;hpb=ba4c5d93b73ef7bba0ae0c6bf2b36a42360f7a34;p=elogind.git diff --git a/src/login/logind-session.c b/src/login/logind-session.c index f661cc8b8..d7c074bdc 100644 --- a/src/login/logind-session.c +++ b/src/login/logind-session.c @@ -565,7 +565,7 @@ int session_start(Session *s) { return 0; } -static int session_stop_scope(Session *s) { +static int session_stop_scope(Session *s, bool force) { _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; char *job; int r; @@ -575,7 +575,7 @@ static int session_stop_scope(Session *s) { if (!s->scope) return 0; - if (manager_shall_kill(s->manager, s->user->name)) { + if (force || manager_shall_kill(s->manager, s->user->name)) { r = manager_stop_unit(s->manager, s->scope, &error, &job); if (r < 0) { log_error("Failed to stop session scope: %s", bus_error_message(&error, r)); @@ -595,7 +595,7 @@ static int session_stop_scope(Session *s) { return 0; } -int session_stop(Session *s) { +int session_stop(Session *s, bool force) { int r; assert(s); @@ -609,7 +609,7 @@ int session_stop(Session *s) { session_remove_fifo(s); /* Kill cgroup */ - r = session_stop_scope(s); + r = session_stop_scope(s, force); s->stopping = true; @@ -672,7 +672,7 @@ static int release_timeout_callback(sd_event_source *es, uint64_t usec, void *us assert(es); assert(s); - session_stop(s); + session_stop(s, false); return 0; } @@ -812,7 +812,7 @@ static int session_dispatch_fifo(sd_event_source *es, int fd, uint32_t revents, /* EOF on the FIFO means the session died abnormally. */ session_remove_fifo(s); - session_stop(s); + session_stop(s, false); return 1; } @@ -915,10 +915,11 @@ void session_add_to_gc_queue(Session *s) { SessionState session_get_state(Session *s) { assert(s); + /* always check closing first */ if (s->stopping || s->timer_event_source) return SESSION_CLOSING; - if (s->scope_job) + if (s->scope_job || s->fifo_fd < 0) return SESSION_OPENING; if (session_is_active(s))