return 0;
}
+static int wait_context_watch(
+ WaitContext *wait_context,
+ sd_bus *bus,
+ const char *name) {
+
+ _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+ _cleanup_free_ char *unit_path = NULL;
+ int r;
+
+ assert(wait_context);
+ assert(name);
+
+ log_debug("Watching for property changes of %s", name);
+ r = sd_bus_call_method(
+ bus,
+ "org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.systemd1.Manager",
+ "RefUnit",
+ &error,
+ NULL,
+ "s", name);
+ if (r < 0)
+ return log_error_errno(r, "Failed to add reference to unit %s: %s", name, bus_error_message(&error, r));
+
+ unit_path = unit_dbus_path_from_name(name);
+ if (!unit_path)
+ return log_oom();
+
+ r = set_ensure_allocated(&wait_context->unit_paths, &string_hash_ops);
+ if (r < 0)
+ return log_oom();
+
+ r = set_put_strdup(wait_context->unit_paths, unit_path);
+ if (r < 0)
+ return log_error_errno(r, "Failed to add unit path %s to set: %m", unit_path);
+
+ r = sd_bus_match_signal_async(bus,
+ &wait_context->match,
+ NULL,
+ unit_path,
+ "org.freedesktop.DBus.Properties",
+ "PropertiesChanged",
+ on_properties_changed, NULL, wait_context);
+ if (r < 0)
+ return log_error_errno(r, "Failed to request match for PropertiesChanged signal: %m");
+
+ return 0;
+}
+
static int start_unit_one(
sd_bus *bus,
const char *method,
assert(error);
if (wait_context) {
- _cleanup_free_ char *unit_path = NULL;
-
- log_debug("Watching for property changes of %s", name);
- r = sd_bus_call_method(
- bus,
- "org.freedesktop.systemd1",
- "/org/freedesktop/systemd1",
- "org.freedesktop.systemd1.Manager",
- "RefUnit",
- error,
- NULL,
- "s", name);
- if (r < 0)
- return log_error_errno(r, "Failed to RefUnit %s: %s", name, bus_error_message(error, r));
-
- unit_path = unit_dbus_path_from_name(name);
- if (!unit_path)
- return log_oom();
-
- r = set_put_strdup(wait_context->unit_paths, unit_path);
- if (r < 0)
- return log_error_errno(r, "Failed to add unit path %s to set: %m", unit_path);
-
- r = sd_bus_match_signal_async(bus,
- &wait_context->match,
- NULL,
- unit_path,
- "org.freedesktop.DBus.Properties",
- "PropertiesChanged",
- on_properties_changed, NULL, wait_context);
+ r = wait_context_watch(wait_context, bus, name);
if (r < 0)
- return log_error_errno(r, "Failed to request match for PropertiesChanged signal: %m");
+ return r;
}
log_debug("%s dbus call org.freedesktop.systemd1.Manager %s(%s, %s)",
}
if (arg_wait) {
- wait_context.unit_paths = set_new(&string_hash_ops);
- if (!wait_context.unit_paths)
- return log_oom();
-
r = sd_bus_call_method_async(
bus,
NULL,