summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/dbus-manager.c14
-rw-r--r--src/core/unit.c20
-rw-r--r--src/core/unit.h2
3 files changed, 23 insertions, 13 deletions
diff --git a/src/core/dbus-manager.c b/src/core/dbus-manager.c
index 51ee5817eb..693d93f3fe 100644
--- a/src/core/dbus-manager.c
+++ b/src/core/dbus-manager.c
@@ -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
diff --git a/src/core/unit.c b/src/core/unit.c
index d199d87bf8..7809bfd754 100644
--- a/src/core/unit.c
+++ b/src/core/unit.c
@@ -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);
+}
diff --git a/src/core/unit.h b/src/core/unit.h
index bcf41d2348..a69d624fad 100644
--- a/src/core/unit.h
+++ b/src/core/unit.h
@@ -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);
}