};
void bus_unit_send_change_signal(Unit *u) {
- _cleanup_free_ char *p = NULL;
_cleanup_dbus_message_unref_ DBusMessage *m = NULL;
+ _cleanup_free_ char *p = NULL;
+ int r;
assert(u);
}
p = unit_dbus_path(u);
- if (!p)
- goto oom;
+ if (!p) {
+ log_oom();
+ return;
+ }
if (u->sent_dbus_new_signal) {
/* Send a properties changed signal. First for the
m = bus_properties_changed_new(p,
UNIT_VTABLE(u)->bus_interface,
UNIT_VTABLE(u)->bus_invalidating_properties);
- if (!m)
- goto oom;
+ if (!m) {
+ log_oom();
+ return;
+ }
- if (bus_broadcast(u->manager, m) < 0)
- goto oom;
+ r = bus_broadcast(u->manager, m);
+ if (r < 0) {
+ log_error("Failed to broadcast change message: %s", strerror(-r));
+ return;
+ }
dbus_message_unref(m);
}
m = bus_properties_changed_new(p, "org.freedesktop.systemd1.Unit",
INVALIDATING_PROPERTIES);
- if (!m)
- goto oom;
+ if (!m) {
+ log_oom();
+ return;
+ }
} else {
/* Send a new signal */
m = dbus_message_new_signal("/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
"UnitNew");
- if (!m)
- goto oom;
+ if (!m) {
+ log_oom();
+ return;
+ }
if (!dbus_message_append_args(m,
DBUS_TYPE_STRING, &u->id,
DBUS_TYPE_OBJECT_PATH, &p,
- DBUS_TYPE_INVALID))
- goto oom;
+ DBUS_TYPE_INVALID)) {
+ log_oom();
+ return;
+ }
}
- if (bus_broadcast(u->manager, m) < 0)
- goto oom;
+ r = bus_broadcast(u->manager, m);
+ if (r < 0) {
+ log_error("Failed to broadcast UnitNew/PropertiesChanged message.");
+ return;
+ }
u->sent_dbus_new_signal = true;
-
- return;
-
-oom:
- log_oom();
}
void bus_unit_send_removed_signal(Unit *u) {
r = unit_set_description(u, description);
if (r < 0)
return r;
+
+ unit_write_drop_in_format(u, mode, name, "[Unit]\nDescription=%s\n", description);
}
return 1;
} else if (streq(name, "Slice") && unit_get_cgroup_context(u)) {
const char *s;
- Unit *slice;
if (dbus_message_iter_get_arg_type(i) != DBUS_TYPE_STRING)
return -EINVAL;
dbus_message_iter_get_basic(i, &s);
if (isempty(s)) {
- if (mode != UNIT_CHECK)
+ if (mode != UNIT_CHECK) {
unit_ref_unset(&u->slice);
+ unit_remove_drop_in(u, mode, name);
+ }
} else {
+ Unit *slice;
+
r = manager_load_unit(u->manager, s, NULL, error, &slice);
if (r < 0)
return r;
if (slice->type != UNIT_SLICE)
return -EINVAL;
- if (mode != UNIT_CHECK)
+ if (mode != UNIT_CHECK) {
unit_ref_set(&u->slice, slice);
+ unit_write_drop_in_private_format(u, mode, name, "Slice=%s\n", s);
+ }
+ }
+
+ return 1;
+
+ } else if (streq(name, "Requires") ||
+ streq(name, "RequiresOverridable") ||
+ streq(name, "Requisite") ||
+ streq(name, "RequisiteOverridable") ||
+ streq(name, "Wants") ||
+ streq(name, "BindsTo") ||
+ streq(name, "Conflicts") ||
+ streq(name, "Before") ||
+ streq(name, "After") ||
+ streq(name, "OnFailure") ||
+ streq(name, "PropagatesReloadTo") ||
+ streq(name, "ReloadPropagatedFrom") ||
+ streq(name, "PartOf")) {
+
+ UnitDependency d;
+ DBusMessageIter sub;
+
+ d = unit_dependency_from_string(name);
+ if (d < 0)
+ return -EINVAL;
+
+ if (dbus_message_iter_get_arg_type(i) != DBUS_TYPE_ARRAY ||
+ dbus_message_iter_get_element_type(i) != DBUS_TYPE_STRING)
+ return -EINVAL;
+
+ dbus_message_iter_recurse(i, &sub);
+ while (dbus_message_iter_get_arg_type(&sub) == DBUS_TYPE_STRING) {
+ const char *other;
+
+ dbus_message_iter_get_basic(&sub, &other);
+
+ if (!unit_name_is_valid(other, false))
+ return -EINVAL;
+
+ if (mode != UNIT_CHECK) {
+ _cleanup_free_ char *label = NULL;
+
+ r = unit_add_dependency_by_name(u, d, other, NULL, true);
+ if (r < 0)
+ return r;
+
+ label = strjoin(name, "-", other, NULL);
+ if (!label)
+ return -ENOMEM;
+
+ unit_write_drop_in_format(u, mode, label, "[Unit]\n%s=%s\n", name, other);
+ }
+
+ dbus_message_iter_next(&sub);
}
+
return 1;
}
{ "ConditionResult", bus_property_append_bool, "b", offsetof(Unit, condition_result) },
{ "LoadError", bus_unit_append_load_error, "(ss)", 0 },
{ "Transient", bus_property_append_bool, "b", offsetof(Unit, transient) },
- { NULL, }
+ {}
};
const BusProperty bus_unit_cgroup_properties[] = {
{ "Slice", bus_unit_append_slice, "s", 0 },
{ "ControlGroup", bus_property_append_string, "s", offsetof(Unit, cgroup_path), true },
+ {}
};