File session-class-service.patch of Package systemd.1472

From: Andrei Borzenkov <arvidjaar@gmail.com>
Subject: [PATCH] add login session class "service" to avoid killing session processes

<patch description>

---
 src/login/logind-dbus.c    | 7 +++++++
 src/login/logind-session.c | 6 ++++--
 src/login/logind-session.h | 1 +
 src/login/logind.h         | 2 +-
 4 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c
index 8ea653f..a0a0313 100644
--- a/src/login/logind-dbus.c
+++ b/src/login/logind-dbus.c
@@ -2245,6 +2245,7 @@ int manager_start_scope(
                 const char *slice,
                 const char *description,
                 const char *after, const char *after2,
+                const char *killmode,
                 sd_bus_error *error,
                 char **job) {
 
@@ -2297,6 +2298,12 @@ int manager_start_scope(
                         return r;
         }
 
+        if (!isempty(killmode)) {
+                r = sd_bus_message_append(m, "(sv)", "KillMode", "s", killmode);
+                if (r < 0)
+                        return r;
+        }
+
         /* cgroup empty notification is not available in containers
          * currently. To make this less problematic, let's shorten the
          * stop timeout for sessions, so that we don't wait
diff --git a/src/login/logind-session.c b/src/login/logind-session.c
index ea1831d..9798d2d 100644
--- a/src/login/logind-session.c
+++ b/src/login/logind-session.c
@@ -497,6 +497,7 @@ static int session_start_scope(Session *s) {
                 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
                 _cleanup_free_ char *description = NULL;
                 char *scope, *job = NULL;
+                char *killmode = s->class == SESSION_SERVICE ? "none" : "control-group";
 
                 description = strjoin("Session ", s->id, " of user ", s->user->name, NULL);
                 if (!description)
@@ -506,7 +507,7 @@ 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);
+                r = manager_start_scope(s->manager, scope, s->leader, s->user->slice, description, "systemd-logind.service", "systemd-user-sessions.service", killmode, &error, &job);
                 if (r < 0) {
                         log_error("Failed to start session scope %s: %s %s",
                                   scope, bus_error_message(&error, r), error.name);
@@ -1179,7 +1180,8 @@ static const char* const session_class_table[_SESSION_CLASS_MAX] = {
         [SESSION_USER] = "user",
         [SESSION_GREETER] = "greeter",
         [SESSION_LOCK_SCREEN] = "lock-screen",
-        [SESSION_BACKGROUND] = "background"
+        [SESSION_BACKGROUND] = "background",
+        [SESSION_SERVICE] = "service",
 };
 
 DEFINE_STRING_TABLE_LOOKUP(session_class, SessionClass);
diff --git a/src/login/logind-session.h b/src/login/logind-session.h
index a007fb5..6f83a14 100644
--- a/src/login/logind-session.h
+++ b/src/login/logind-session.h
@@ -46,6 +46,7 @@ typedef enum SessionClass {
         SESSION_GREETER,
         SESSION_LOCK_SCREEN,
         SESSION_BACKGROUND,
+        SESSION_SERVICE,
         _SESSION_CLASS_MAX,
         _SESSION_CLASS_INVALID = -1
 } SessionClass;
diff --git a/src/login/logind.h b/src/login/logind.h
index 2f76572..63e06ea 100644
--- a/src/login/logind.h
+++ b/src/login/logind.h
@@ -176,7 +176,7 @@ int manager_send_changed(Manager *manager, const char *property, ...) _sentinel_
 
 int manager_dispatch_delayed(Manager *manager);
 
-int manager_start_scope(Manager *manager, const char *scope, pid_t pid, const char *slice, const char *description, const char *after, const char *after2, sd_bus_error *error, char **job);
+int manager_start_scope(Manager *manager, const char *scope, pid_t pid, const char *slice, const char *description, const char *after, const char *after2, const char *killmode, sd_bus_error *error, char **job);
 int manager_start_unit(Manager *manager, const char *unit, sd_bus_error *error, char **job);
 int manager_stop_unit(Manager *manager, const char *unit, sd_bus_error *error, char **job);
 int manager_abandon_scope(Manager *manager, const char *scope, sd_bus_error *error);
-- 
tg: (6ad9bb7..) bnc/906900 (depends on: master)
openSUSE Build Service is sponsored by