summaryrefslogtreecommitdiff
path: root/src/login/logind-session.c
diff options
context:
space:
mode:
authorSven Eden <yamakuzure@gmx.net>2017-06-14 17:44:53 +0200
committerSven Eden <yamakuzure@gmx.net>2017-06-16 10:13:01 +0200
commitc651a8a1445336b303e7ffdbcc9c8a4ef5389a4e (patch)
tree0418e27c61bb0db6cad531360932ef895e959532 /src/login/logind-session.c
parenta70be41f0832e4a36ff2fc99a2ac1f082b17b3be (diff)
Prep v231: Apply missing fixes from upstream (4/6) src/login
Diffstat (limited to 'src/login/logind-session.c')
-rw-r--r--src/login/logind-session.c35
1 files changed, 17 insertions, 18 deletions
diff --git a/src/login/logind-session.c b/src/login/logind-session.c
index 3a77b833f..06ad99e1f 100644
--- a/src/login/logind-session.c
+++ b/src/login/logind-session.c
@@ -635,7 +635,6 @@ int session_start(Session *s) {
#if 0 /// UNNEEDED by elogind
static int session_stop_scope(Session *s, bool force) {
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
- char *job = NULL;
int r;
assert(s);
@@ -643,22 +642,25 @@ static int session_stop_scope(Session *s, bool force) {
if (!s->scope)
return 0;
+ /* Let's always abandon the scope first. This tells systemd that we are not interested anymore, and everything
+ * that is left in in the scope is "left-over". Informing systemd about this has the benefit that it will log
+ * when killing any processes left after this point. */
+ r = manager_abandon_scope(s->manager, s->scope, &error);
+ if (r < 0)
+ log_warning_errno(r, "Failed to abandon session scope, ignoring: %s", bus_error_message(&error, r));
+
+ /* Optionally, let's kill everything that's left now. */
if (force || manager_shall_kill(s->manager, s->user->name)) {
+ char *job = NULL;
+
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;
- }
+ if (r < 0)
+ return log_error_errno(r, "Failed to stop session scope: %s", bus_error_message(&error, 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;
- }
- }
+ } else
+ s->scope_job = mfree(s->scope_job);
return 0;
}
@@ -1076,13 +1078,10 @@ int session_kill(Session *s, KillWho who, int signo) {
return log_error_errno(errno, "Failed to kill process leader %d for session %s: %m", s->leader, s->id);
}
return 0;
- } else {
- bool sigcont = false;
- bool ignore_self = true;
- bool rem = true;
+ } else
return cg_kill_recursive (SYSTEMD_CGROUP_CONTROLLER, s->id, signo,
- sigcont, ignore_self, rem, NULL);
- }
+ CGROUP_IGNORE_SELF | CGROUP_REMOVE,
+ NULL, NULL, NULL);
#endif // 0
}