X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flogin%2Flogind-session.c;h=b5e4bee9ee947c77dff27b93a97605805d410da1;hb=bf2098e9e4837573d84dd4949b9c28a7372c93b9;hp=92a6027a7ef4a085f21ca90c5a60f13823b2d68a;hpb=1b99ea27bc3ffa1fc6f7cfe89563d891a9aed4c5;p=elogind.git diff --git a/src/login/logind-session.c b/src/login/logind-session.c index 92a6027a7..b5e4bee9e 100644 --- a/src/login/logind-session.c +++ b/src/login/logind-session.c @@ -40,7 +40,7 @@ #include "formats-util.h" #include "terminal-util.h" -#define RELEASE_USEC (20*USEC_PER_SEC) +// #define RELEASE_USEC (20*USEC_PER_SEC) static void session_remove_fifo(Session *s); @@ -125,7 +125,10 @@ void session_free(Session *s) { free(s->scope); } +/// elogind does not support systemd scope_jobs +#if 0 free(s->scope_job); +#endif // 0 sd_bus_message_unref(s->create_message); @@ -196,8 +199,11 @@ int session_save(Session *s) { if (s->scope) fprintf(f, "SCOPE=%s\n", s->scope); +/// elogind does not support systemd scope_jobs +#if 0 if (s->scope_job) fprintf(f, "SCOPE_JOB=%s\n", s->scope_job); +#endif // 0 if (s->fifo_path) fprintf(f, "FIFO=%s\n", s->fifo_path); @@ -324,7 +330,10 @@ int session_load(Session *s) { r = parse_env_file(s->state_file, NEWLINE, "REMOTE", &remote, "SCOPE", &s->scope, +/// elogind does not support systemd scope_jobs +#if 0 "SCOPE_JOB", &s->scope_job, +#endif // 0 "FIFO", &s->fifo_path, "SEAT", &seat, "TTY", &s->tty, @@ -500,7 +509,7 @@ int session_activate(Session *s) { } static int session_start_scope(Session *s) { - int r; + int r = 0; assert(s); assert(s->user); @@ -509,7 +518,7 @@ static int session_start_scope(Session *s) { if (!s->scope) { _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; _cleanup_free_ char *description = NULL; - char *scope, *job = NULL; + char *scope = NULL; //, *job = NULL; description = strjoin("Session ", s->id, " of user ", s->user->name, NULL); if (!description) @@ -519,7 +528,10 @@ static int session_start_scope(Session *s) { 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); +/// elogind : Do not try to use dbus to call systemd +#if 0 + r = manager_start_scope(s->manager, scope, s->leader, s->user->slice, description, "logind.service", "systemd-user-sessions.service", &error, &job); +#endif // 0 if (r < 0) { log_error("Failed to start session scope %s: %s %s", scope, bus_error_message(&error, r), error.name); @@ -527,9 +539,11 @@ static int session_start_scope(Session *s) { return r; } else { s->scope = scope; - +/// elogind does not support scope jobs +#if 0 free(s->scope_job); s->scope_job = job; +#endif // 0 } } @@ -596,6 +610,8 @@ int session_start(Session *s) { return 0; } +/// UNNEEDED by elogind +#if 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; @@ -625,9 +641,10 @@ static int session_stop_scope(Session *s, bool force) { return 0; } +#endif // 0 int session_stop(Session *s, bool force) { - int r; + int r = 0; assert(s); @@ -643,7 +660,12 @@ int session_stop(Session *s, bool force) { session_remove_fifo(s); /* Kill cgroup */ +/// @todo : Currently elogind does not start scopes. It remains to be seen +/// whether this is really not needed, but then, elogind is not a +/// systemd cgroups manager. +#if 0 r = session_stop_scope(s, force); +#endif // 0 s->stopping = true; @@ -704,6 +726,8 @@ int session_finalize(Session *s) { return 0; } +/// UNNEEDED by elogind +#if 0 static int release_timeout_callback(sd_event_source *es, uint64_t usec, void *userdata) { Session *s = userdata; @@ -713,6 +737,7 @@ static int release_timeout_callback(sd_event_source *es, uint64_t usec, void *us session_stop(s, false); return 0; } +#endif // 0 int session_release(Session *s) { assert(s); @@ -723,11 +748,19 @@ int session_release(Session *s) { if (s->timer_event_source) return 0; + /* In systemd, session release is triggered by user jobs + dying. In elogind we don't have that so go ahead and stop + now. */ +#if 0 return sd_event_add_time(s->manager->event, &s->timer_event_source, CLOCK_MONOTONIC, now(CLOCK_MONOTONIC) + RELEASE_USEC, 0, release_timeout_callback, s); + +#else + return session_stop(s, false); +#endif // 0 } bool session_is_active(Session *s) { @@ -932,11 +965,14 @@ bool session_check_gc(Session *s, bool drop_not_started) { return true; } +/// elogind supports neither scopes nor jobs +#if 0 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; +#endif // 0 return false; } @@ -958,7 +994,12 @@ SessionState session_get_state(Session *s) { if (s->stopping || s->timer_event_source) return SESSION_CLOSING; +/// elogind does not support systemd scope_jobs +#if 0 if (s->scope_job || s->fifo_fd < 0) +#else + if (s->fifo_fd < 0) +#endif // 0 return SESSION_OPENING; if (session_is_active(s)) @@ -970,10 +1011,15 @@ SessionState session_get_state(Session *s) { int session_kill(Session *s, KillWho who, int signo) { assert(s); +/// FIXME: Without direct cgroup support, elogind can not kill sessions +#if 0 if (!s->scope) return -ESRCH; return manager_kill_unit(s->manager, s->scope, who, signo, NULL); +#else + return -ESRCH; +#endif // 0 } static int session_open_vt(Session *s) {