X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fdbus-unit.c;h=e07a28e32d6bf07b243eb678e3f6ee8a441c881f;hb=b9316fb0f39fff3df792e4e72eb491ec4265b91f;hp=ad6d5a603885694ab13c0f9829438c60167e0fd0;hpb=c221420be8744bb0f8b8a8145efc1f247f1aa801;p=elogind.git diff --git a/src/core/dbus-unit.c b/src/core/dbus-unit.c index ad6d5a603..e07a28e32 100644 --- a/src/core/dbus-unit.c +++ b/src/core/dbus-unit.c @@ -568,8 +568,9 @@ const DBusObjectPathVTable bus_unit_vtable = { }; 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); @@ -587,8 +588,10 @@ void bus_unit_send_change_signal(Unit *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 @@ -601,19 +604,26 @@ void bus_unit_send_change_signal(Unit *u) { 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 */ @@ -621,25 +631,27 @@ void bus_unit_send_change_signal(Unit *u) { 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) { @@ -778,16 +790,25 @@ static int bus_unit_set_transient_property( assert(i); if (streq(name, "Description")) { - const char *description; - if (dbus_message_iter_get_arg_type(i) != DBUS_TYPE_STRING) return -EINVAL; - dbus_message_iter_get_basic(i, &description); + if (mode != UNIT_CHECK) { + _cleanup_free_ char *contents = NULL; + const char *description; - r = unit_set_description(u, description); - if (r < 0) - return r; + dbus_message_iter_get_basic(i, &description); + + r = unit_set_description(u, description); + if (r < 0) + return r; + + contents = strjoin("[Unit]\nDescription=", description, "\n", NULL); + if (!contents) + return -ENOMEM; + + unit_write_drop_in(u, mode, "Description", contents); + } return 1; @@ -800,14 +821,28 @@ static int bus_unit_set_transient_property( dbus_message_iter_get_basic(i, &s); - r = manager_load_unit(u->manager, s, NULL, error, &slice); - if (r < 0) - return r; + if (isempty(s)) { + if (mode != UNIT_CHECK) + unit_ref_unset(&u->slice); + } else { + _cleanup_free_ char *contents = NULL; - if (slice->type != UNIT_SLICE) - return -EINVAL; + 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) + unit_ref_set(&u->slice, slice); - unit_ref_set(&u->slice, slice); + contents = strjoin("[", UNIT_VTABLE(u)->private_section, "]\nSlice=", s, NULL); + if (!contents) + return -ENOMEM; + + unit_write_drop_in(u, mode, "Slice", contents); + } return 1; }