File 0018-Make-LSB-Skripts-know-about-Required-and-Should.patch of Package systemd.1059

Should solve the problems of

  bug #858864 - LSB "+" dependencies aren't handled properly
  bug #857204 - inssrv fails to enable rpcbind
     The side effect is that RequiresOverridable= is used for the services
     add behind Required-Start
  bug #863217 - systemd overrides explicit admin request to disable a service
     That is that in this version the Wants= for all services behind
     Should-Start, X-Start-Before, and X-Stop-After is not used anymore

---
 service.c |   15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

--- systemd-208/src/core/service.c
+++ systemd-208/src/core/service.c	2014-02-21 14:44:59.066735478 +0000
@@ -380,6 +380,8 @@ static int sysv_translate_facility(const
                 "remote_fs",            SPECIAL_REMOTE_FS_TARGET,
                 "syslog",               NULL,
                 "time",                 SPECIAL_TIME_SYNC_TARGET,
+                "all",                  SPECIAL_DEFAULT_TARGET,
+                "null",                 NULL,
         };
 
         unsigned i;
@@ -389,7 +391,7 @@ static int sysv_translate_facility(const
         assert(name);
         assert(_r);
 
-        n = *name == '$' ? name + 1 : name;
+        n = (*name == '$' || *name == '+') ? name + 1 : name;
 
         for (i = 0; i < ELEMENTSOF(table); i += 2) {
 
@@ -816,10 +818,13 @@ static int service_load_sysv_path(Servic
                                    startswith_no_case(t, "Should-Start:") ||
                                    startswith_no_case(t, "X-Start-Before:") ||
                                    startswith_no_case(t, "X-Start-After:")) {
+                                UnitDependency d, e;
                                 char *i, *w;
                                 size_t z;
 
                                 state = LSB;
+                                d = startswith_no_case(t, "X-Start-Before:") ? UNIT_BEFORE : UNIT_AFTER;
+                                e = startswith_no_case(t, "Required-Start:") ? UNIT_REQUIRES_OVERRIDABLE : _UNIT_DEPENDENCY_INVALID;
 
                                 FOREACH_WORD_QUOTED(w, z, strchr(t, ':')+1, i) {
                                         char *n, *m;
@@ -838,12 +843,18 @@ static int service_load_sysv_path(Servic
                                                 continue;
                                         }
 
+                                        if (*n == '+')
+                                                e = UNIT_WANTS;
+
                                         free(n);
 
                                         if (r == 0)
                                                 continue;
 
-                                        r = unit_add_dependency_by_name(u, startswith_no_case(t, "X-Start-Before:") ? UNIT_BEFORE : UNIT_AFTER, m, NULL, true);
+                                        if (e != _UNIT_DEPENDENCY_INVALID)
+                                                r = unit_add_two_dependencies_by_name(u, d, e, m, NULL, true);
+                                        else
+                                                r = unit_add_dependency_by_name(u, d, m, NULL, true);
 
                                         if (r < 0)
                                                 log_error_unit(u->id, "[%s:%u] Failed to add dependency on %s, ignoring: %s",
openSUSE Build Service is sponsored by