summaryrefslogtreecommitdiff
path: root/src/login/logind-session.c
diff options
context:
space:
mode:
authorSven Eden <yamakuzure@gmx.net>2017-01-26 09:56:23 +0100
committerSven Eden <yamakuzure@gmx.net>2017-03-14 10:23:10 +0100
commitdb74dfab5842da3f83d3bb9e2fa3bf8736939ecf (patch)
treef33a44512dea72f0dd475c98d19a1cb223b36e26 /src/login/logind-session.c
parentfaf2e887be42215c1999950d16d1975e70bbdfe9 (diff)
Remove dependency of systemd units, services and slices for new sessions.
* elogind does not support systemd services and units. But at least the units are needed to support the systemd cgroup slice/scope system. * Remove systemd subscription to scope, service and slice jobs. These can not be supported in any way, as they depend on systemd running the machine. * The functions session_start_scope(), user_start_service() and user_start_slice() no longer try to call systemd via dbus for assistance. This way they generate their proper scope, service and slice names, and store them in the Managers HashMaps for session and user units. This should enable us to reverse track pids to users and such stuff, as that is what systemd-logind does, not knowing whether any unit *really* has been started or not. However, this will not work out of the box until we find a way to integrate cg_create_everywhere() into elogind without becoming dependent of systemd unit, service and job knowledge again.
Diffstat (limited to 'src/login/logind-session.c')
-rw-r--r--src/login/logind-session.c43
1 files changed, 39 insertions, 4 deletions
diff --git a/src/login/logind-session.c b/src/login/logind-session.c
index a277cda48..1a3567194 100644
--- a/src/login/logind-session.c
+++ b/src/login/logind-session.c
@@ -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();
+/// 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;
@@ -932,11 +954,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 +983,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 +1000,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) {