core: move check whether a unit is suitable to become transient into unit.c
authorLennart Poettering <lennart@poettering.net>
Tue, 17 Nov 2015 13:04:40 +0000 (14:04 +0100)
committerLennart Poettering <lennart@poettering.net>
Tue, 17 Nov 2015 16:32:49 +0000 (17:32 +0100)
Lets introduce unit_is_pristine() that verifies whether a unit is
suitable to become a transient unit, by checking that it is no
referenced yet and has no data on disk assigned.

src/core/dbus-manager.c
src/core/unit.c
src/core/unit.h

index 51ee581..693d93f 100644 (file)
@@ -663,19 +663,7 @@ static int transient_unit_from_message(
         if (r < 0)
                 return r;
 
-        /* Check if the unit already exists or is already referenced,
-         * in a number of different ways. Note that to cater for unit
-         * types such as slice, we are generally fine with units that
-         * are marked UNIT_LOADED even even though nothing was
-         * actually loaded, as those unit types don't require a file
-         * on disk to validly load. */
-
-        if (!IN_SET(u->load_state, UNIT_NOT_FOUND, UNIT_LOADED) ||
-            u->fragment_path ||
-            u->source_path ||
-            !strv_isempty(u->dropin_paths) ||
-            u->refs ||
-            set_size(u->dependencies[UNIT_REFERENCED_BY]) > 0)
+        if (!unit_is_pristine(u))
                 return sd_bus_error_setf(error, BUS_ERROR_UNIT_EXISTS, "Unit %s already exists.", name);
 
         /* OK, the unit failed to load and is unreferenced, now let's
index d199d87..7809bfd 100644 (file)
@@ -3704,3 +3704,23 @@ int unit_fail_if_symlink(Unit *u, const char* where) {
 
         return -ELOOP;
 }
+
+bool unit_is_pristine(Unit *u) {
+        assert(u);
+
+        /* Check if the unit already exists or is already referenced,
+         * in a number of different ways. Note that to cater for unit
+         * types such as slice, we are generally fine with units that
+         * are marked UNIT_LOADED even even though nothing was
+         * actually loaded, as those unit types don't require a file
+         * on disk to validly load. */
+
+        return !(!IN_SET(u->load_state, UNIT_NOT_FOUND, UNIT_LOADED) ||
+                 u->fragment_path ||
+                 u->source_path ||
+                 !strv_isempty(u->dropin_paths) ||
+                 u->refs ||
+                 set_size(u->dependencies[UNIT_REFERENCED_BY]) > 0 ||
+                 u->job ||
+                 u->merged_into);
+}
index bcf41d2..a69d624 100644 (file)
@@ -586,6 +586,8 @@ int unit_require_mounts_for(Unit *u, const char *path);
 
 bool unit_type_supported(UnitType t);
 
+bool unit_is_pristine(Unit *u);
+
 static inline bool unit_supported(Unit *u) {
         return unit_type_supported(u->type);
 }