X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flogin%2Flogind-session.c;h=109e3ef133b8c9274461503fe187e5afcfc7dae6;hp=a51f9f3e0fccd2c040e6c6db9cbf32add41941ed;hb=81d08ba2e8e3cc1e59ab057953f18119804b9ff9;hpb=8cb4ab0058e51f1fba93683d145ef95f97c2fa86 diff --git a/src/login/logind-session.c b/src/login/logind-session.c index a51f9f3e0..109e3ef13 100644 --- a/src/login/logind-session.c +++ b/src/login/logind-session.c @@ -28,9 +28,7 @@ #include #include -#include "sd-id128.h" #include "sd-messages.h" -#include "strv.h" #include "util.h" #include "mkdir.h" #include "path-util.h" @@ -40,8 +38,6 @@ #include "bus-error.h" #include "logind-session.h" -#define RELEASE_USEC (20*USEC_PER_SEC) - static void session_remove_fifo(Session *s); Session* session_new(Manager *m, const char *id) { @@ -120,13 +116,6 @@ void session_free(Session *s) { LIST_REMOVE(sessions_by_seat, s->seat->sessions, s); } - if (s->scope) { - hashmap_remove(s->manager->session_units, s->scope); - free(s->scope); - } - - free(s->scope_job); - sd_bus_message_unref(s->create_message); free(s->tty); @@ -194,11 +183,6 @@ int session_save(Session *s) { if (s->class >= 0) fprintf(f, "CLASS=%s\n", session_class_to_string(s->class)); - if (s->scope) - fprintf(f, "SCOPE=%s\n", s->scope); - if (s->scope_job) - fprintf(f, "SCOPE_JOB=%s\n", s->scope_job); - if (s->fifo_path) fprintf(f, "FIFO=%s\n", s->fifo_path); @@ -301,6 +285,7 @@ int session_load(Session *s) { _cleanup_free_ char *remote = NULL, *seat = NULL, *vtnr = NULL, + *state = NULL, *pos = NULL, *leader = NULL, *type = NULL, @@ -316,8 +301,6 @@ int session_load(Session *s) { r = parse_env_file(s->state_file, NEWLINE, "REMOTE", &remote, - "SCOPE", &s->scope, - "SCOPE_JOB", &s->scope_job, "FIFO", &s->fifo_path, "SEAT", &seat, "TTY", &s->tty, @@ -327,6 +310,7 @@ int session_load(Session *s) { "SERVICE", &s->service, "DESKTOP", &s->desktop, "VTNR", &vtnr, + "STATE", &state, "POS", &pos, "LEADER", &leader, "TYPE", &type, @@ -415,13 +399,18 @@ int session_load(Session *s) { s->class = c; } + if (state && streq(state, "closing")) + s->stopping = true; + if (s->fifo_path) { int fd; /* If we open an unopened pipe for reading we will not get an EOF. to trigger an EOF we hence open it for - reading, but close it right-away which then will - trigger the EOF. */ + writing, but close it right away which then will + trigger the EOF. This will happen immediately if no + other process has the FIFO open for writing, i. e. + when the session died before logind (re)started. */ fd = session_create_fifo(s); safe_close(fd); @@ -456,7 +445,7 @@ int session_activate(Session *s) { assert(s->user); if (!s->seat) - return -ENOTSUP; + return -EOPNOTSUPP; if (s->seat->active == s) return 0; @@ -464,7 +453,7 @@ int session_activate(Session *s) { /* on seats with VTs, we let VTs manage session-switching */ if (seat_has_vts(s->seat)) { if (!s->vtnr) - return -ENOTSUP; + return -EOPNOTSUPP; return chvt(s->vtnr); } @@ -486,46 +475,6 @@ int session_activate(Session *s) { return 0; } -static int session_start_scope(Session *s) { - int r; - - assert(s); - assert(s->user); - assert(s->user->slice); - - if (!s->scope) { - _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; - _cleanup_free_ char *description = NULL; - char *scope, *job = NULL; - - description = strjoin("Session ", s->id, " of user ", s->user->name, NULL); - if (!description) - return log_oom(); - - scope = strjoin("session-", s->id, ".scope", NULL); - if (!scope) - return log_oom(); - - r = manager_start_scope(s->manager, scope, s->leader, s->user->slice, description, "systemd-logind.service", "systemd-user-sessions.service", &error, &job); - if (r < 0) { - log_error("Failed to start session scope %s: %s %s", - scope, bus_error_message(&error, r), error.name); - free(scope); - return r; - } else { - s->scope = scope; - - free(s->scope_job); - s->scope_job = job; - } - } - - if (s->scope) - hashmap_put(s->manager->session_units, s->scope, s); - - return 0; -} - int session_start(Session *s) { int r; @@ -541,11 +490,6 @@ int session_start(Session *s) { if (r < 0) return r; - /* Create cgroup */ - r = session_start_scope(s); - if (r < 0) - return r; - log_struct(s->class == SESSION_BACKGROUND ? LOG_DEBUG : LOG_INFO, LOG_MESSAGE_ID(SD_MESSAGE_SESSION_START), "SESSION_ID=%s", s->id, @@ -583,38 +527,8 @@ int session_start(Session *s) { return 0; } -static int session_stop_scope(Session *s, bool force) { - _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; - char *job = NULL; - int r; - - assert(s); - - if (!s->scope) - return 0; - - 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)); - return r; - } - - free(s->scope_job); - s->scope_job = job; - } else { - r = manager_abandon_scope(s->manager, s->scope, &error); - if (r < 0) { - log_error("Failed to abandon session scope: %s", bus_error_message(&error, r)); - return r; - } - } - - return 0; -} - int session_stop(Session *s, bool force) { - int r; + int r = 0; assert(s); @@ -626,9 +540,6 @@ int session_stop(Session *s, bool force) { /* We are going down, don't care about FIFOs anymore */ session_remove_fifo(s); - /* Kill cgroup */ - r = session_stop_scope(s, force); - s->stopping = true; user_elect_display(s->user); @@ -686,28 +597,19 @@ int session_finalize(Session *s) { return r; } -static int release_timeout_callback(sd_event_source *es, uint64_t usec, void *userdata) { - Session *s = userdata; - - assert(es); - assert(s); - - session_stop(s, false); - return 0; -} - -void session_release(Session *s) { +int session_release(Session *s) { assert(s); if (!s->started || s->stopping) - return; + return 0; + + if (s->timer_event_source) + return 0; - if (!s->timer_event_source) - sd_event_add_time(s->manager->event, - &s->timer_event_source, - CLOCK_MONOTONIC, - now(CLOCK_MONOTONIC) + RELEASE_USEC, 0, - release_timeout_callback, s); + /* In systemd, session release is triggered by user jobs + dying. In elogind we don't have that so go ahead and stop + now. */ + session_stop(s, false); } bool session_is_active(Session *s) { @@ -912,12 +814,6 @@ bool session_check_gc(Session *s, bool drop_not_started) { return true; } - if (s->scope_job && manager_job_is_active(s->manager, s->scope_job)) - return true; - - if (s->scope && manager_unit_is_active(s->manager, s->scope)) - return true; - return false; } @@ -938,7 +834,7 @@ SessionState session_get_state(Session *s) { if (s->stopping || s->timer_event_source) return SESSION_CLOSING; - if (s->scope_job || s->fifo_fd < 0) + if (s->fifo_fd < 0) return SESSION_OPENING; if (session_is_active(s)) @@ -950,10 +846,8 @@ SessionState session_get_state(Session *s) { int session_kill(Session *s, KillWho who, int signo) { assert(s); - if (!s->scope) - return -ESRCH; - - return manager_kill_unit(s->manager, s->scope, who, signo, NULL); + /* No way to kill the session without cgroups. */ + return -ESRCH; } static int session_open_vt(Session *s) { @@ -1034,15 +928,15 @@ void session_restore_vt(Session *s) { if (vt < 0) return; - ioctl(vt, KDSETMODE, KD_TEXT); + (void) ioctl(vt, KDSETMODE, KD_TEXT); if (read_one_line_file("/sys/module/vt/parameters/default_utf8", &utf8) >= 0 && *utf8 == '1') kb = K_UNICODE; - ioctl(vt, KDSKBMODE, kb); + (void) ioctl(vt, KDSKBMODE, kb); mode.mode = VT_AUTO; - ioctl(vt, VT_SETMODE, &mode); + (void) ioctl(vt, VT_SETMODE, &mode); fchown(vt, 0, -1);