From: Frederic Crozat <fcrozat@suse.com>
Date: Wed, 7 Dec 2011 15:15:07 +0000
Subject: remain_after_exit initscript heuristic and add new LSB headers

Add remain_after_exit heuristic for initscripts and add LSB headers
PIDFile: and X-Systemd-RemainAfterExit to control it.

(bnc#721426) (bnc#727771)
---
 src/core/service.c | 34 ++++++++++++++++++++++++++++++++--
 src/core/service.h |  1 +
 2 files changed, 33 insertions(+), 2 deletions(-)

Index: systemd-208/src/core/service.c
===================================================================
--- systemd-208.orig/src/core/service.c
+++ systemd-208/src/core/service.c
@@ -135,6 +135,7 @@ static void service_init(Unit *u) {
 #ifdef HAVE_SYSV_COMPAT
         s->sysv_start_priority = -1;
         s->sysv_start_priority_from_rcnd = -1;
+        s->sysv_remain_after_exit_heuristic = true;
 #endif
         s->socket_fd = -1;
         s->guess_main_pid = true;
@@ -883,6 +884,34 @@ static int service_load_sysv_path(Servic
                                 free(short_description);
                                 short_description = d;
 
+                        } else if (startswith_no_case(t, "PIDFile:")) {
+                                char *fn;
+
+                                state = LSB;
+
+                                fn = strstrip(t+8);
+                                if (!path_is_absolute(fn)) {
+                                        log_warning("[%s:%u] PID file not absolute. Ignoring.", path, line);
+                                        continue;
+                                }
+
+                                if (!(fn = strdup(fn))) {
+                                        r = -ENOMEM;
+                                        goto finish;
+                                }
+
+                                free(s->pid_file);
+                                s->pid_file = fn;
+                                s->sysv_remain_after_exit_heuristic = false;
+                                s->remain_after_exit = false;
+                        } else if (startswith_no_case(t, "X-Systemd-RemainAfterExit:")) {
+                                char *j;
+
+                                state = LSB;
+                                if ((j = strstrip(t+26)) && *j) {
+                                        s->remain_after_exit = parse_boolean(j);
+                                        s->sysv_remain_after_exit_heuristic = false;
+                                }
                         } else if (state == LSB_DESCRIPTION) {
 
                                 if (startswith(l, "#\t") || startswith(l, "#  ")) {
@@ -933,7 +962,8 @@ static int service_load_sysv_path(Servic
 
         /* Special setting for all SysV services */
         s->type = SERVICE_FORKING;
-        s->remain_after_exit = !s->pid_file;
+        if (s->sysv_remain_after_exit_heuristic)
+                s->remain_after_exit = !s->pid_file;
         s->guess_main_pid = false;
         s->restart = SERVICE_RESTART_NO;
         s->exec_context.ignore_sigpipe = false;
@@ -2080,7 +2110,7 @@ static void service_enter_running(Servic
         if ((main_pid_ok > 0 || (main_pid_ok < 0 && cgroup_ok != 0)) &&
             (s->bus_name_good || s->type != SERVICE_DBUS)) {
 #ifdef HAVE_SYSV_COMPAT
-                if (s->sysv_enabled && !s->pid_file)
+                if (s->sysv_enabled && !s->pid_file && s->sysv_remain_after_exit_heuristic)
                         s->remain_after_exit = false;
 #endif
                 service_set_state(s, SERVICE_RUNNING);
Index: systemd-208/src/core/service.h
===================================================================
--- systemd-208.orig/src/core/service.h
+++ systemd-208/src/core/service.h
@@ -178,6 +178,7 @@ struct Service {
         bool is_sysv:1;
         bool sysv_has_lsb:1;
         bool sysv_enabled:1;
+        bool sysv_remain_after_exit_heuristic:1;
         int sysv_start_priority_from_rcnd;
         int sysv_start_priority;
 
