struct unit_control_decision_maker *dm = container_of(handler,
struct unit_control_decision_maker, eh);
struct unit_control_event *ev = to_unit_control_event(event);
- int ret = 0;
bool matched = false;
int error_code = 0;
struct whitelist_entry *w;
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
- char *service_name;
+ _cleanup_free_ char *service_name = NULL;
/* cannot use start with wildcards */
if (!strcmp(ev->method, "start") && strstr(ev->unit, "@.")) {
log_debug("execute action %s on pattern %s", ev->method, service_name);
if (!strcmp(ev->method, "start") || !is_wildcard(service_name)) /* no need to query when starting or for single unit*/
- ret = unit_control_execute(service_name, ev->method, event);
+ error_code = unit_control_execute(service_name, ev->method, event);
else
- ret = unit_control_query_and_execute(service_name, ev->method, event);
- if (ret < 0) {
- log_error_errno(ret, "action %s on unit %s failed (%m)", ev->method, service_name);
- error_code = ret;
+ error_code = unit_control_query_and_execute(service_name, ev->method, event);
+
+ if (error_code < 0) {
+ log_error_errno(error_code, "action %s on unit %s failed (%m)", ev->method, service_name);
+ goto cleanup;
}
- free(service_name);
}
if (matched != true)
cleanup:
if (error_code != 0) {
sd_bus_error_set_errno(&error, error_code);
- ret = sd_bus_reply_method_error(ev->m, &error);
+ sd_bus_reply_method_error(ev->m, &error);
sd_bus_message_unref(ev->m);
- ret = error_code;
- } else {
- ret = 0;
}
epc_event_unref(event);
- return ret;
+ return 0;
}
static void cleanup_whitelist_entry(struct whitelist_entry *w)