chiark / gitweb /
service: don't create sysv order deps on merged units
[elogind.git] / src / unit.c
index ca15c257e8aaff591be7266fc502af2808dbeb91..5960c277b7dc60d0db724bd8a8ec8e7295c63844 100644 (file)
@@ -578,7 +578,7 @@ const char *unit_description(Unit *u) {
         if (u->meta.description)
                 return u->meta.description;
 
-        return u->meta.id;
+        return strna(u->meta.id);
 }
 
 void unit_dump(Unit *u, FILE *f, const char *prefix) {
@@ -726,13 +726,19 @@ int unit_load_fragment_and_dropin_optional(Unit *u) {
         return 0;
 }
 
-static int unit_add_one_default_dependency(Unit *u, Unit *target) {
+int unit_add_default_target_dependency(Unit *u, Unit *target) {
         assert(u);
         assert(target);
 
         if (target->meta.type != UNIT_TARGET)
                 return 0;
 
+        /* Only add the dependency if boths units are loaded, so that
+         * that loop check below is reliable */
+        if (u->meta.load_state != UNIT_LOADED ||
+            target->meta.load_state != UNIT_LOADED)
+                return 0;
+
         /* Don't create loops */
         if (set_get(target->meta.dependencies[UNIT_BEFORE], u))
                 return 0;
@@ -741,22 +747,22 @@ static int unit_add_one_default_dependency(Unit *u, Unit *target) {
 }
 
 static int unit_add_default_dependencies(Unit *u) {
-        Unit *other;
+        Unit *target;
         Iterator i;
         int r;
 
         assert(u);
 
-        SET_FOREACH(other, u->meta.dependencies[UNIT_REQUIRED_BY], i)
-                if ((r = unit_add_one_default_dependency(u, other)) < 0)
+        SET_FOREACH(target, u->meta.dependencies[UNIT_REQUIRED_BY], i)
+                if ((r = unit_add_default_target_dependency(u, target)) < 0)
                         return r;
 
-        SET_FOREACH(other, u->meta.dependencies[UNIT_REQUIRED_BY_OVERRIDABLE], i)
-                if ((r = unit_add_one_default_dependency(u, other)) < 0)
+        SET_FOREACH(target, u->meta.dependencies[UNIT_REQUIRED_BY_OVERRIDABLE], i)
+                if ((r = unit_add_default_target_dependency(u, target)) < 0)
                         return r;
 
-        SET_FOREACH(other, u->meta.dependencies[UNIT_WANTED_BY], i)
-                if ((r = unit_add_one_default_dependency(u, other)) < 0)
+        SET_FOREACH(target, u->meta.dependencies[UNIT_WANTED_BY], i)
+                if ((r = unit_add_default_target_dependency(u, target)) < 0)
                         return r;
 
         return 0;
@@ -1397,6 +1403,9 @@ int unit_add_dependency(Unit *u, UnitDependency d, Unit *other, bool add_referen
         assert(d >= 0 && d < _UNIT_DEPENDENCY_MAX);
         assert(other);
 
+        u = unit_follow_merge(u);
+        other = unit_follow_merge(other);
+
         /* We won't allow dependencies on ourselves. We will not
          * consider them an error however. */
         if (u == other)