}
static int context_execute(Context *c) {
- int r;
+ int r, ret;
assert(c);
log_debug("Plugin arguments: %s", strna(z));
}
- r = execute_strv(
+ ret = execute_strv(
/* name = */ NULL,
c->plugins,
/* root = */ NULL,
c->argv,
c->envp,
EXEC_DIR_SKIP_REMAINING);
- if (r < 0)
- return r;
r = context_remove_entry_dir(c);
if (r < 0)
return r;
- return 0;
+ /* This returns 0 on success, positive exit code on plugin failure, negative errno on other failures. */
+ return ret;
}
static bool bypass(void) {
/* version= */ (*d)->d_name,
/* kernel= */ full,
/* initrds= */ NULL);
- RET_GATHER(ret, r);
-
- if (r >= 0)
+ if (r == 0)
n++;
+ else if (ret == 0)
+ ret = r;
}
if (n > 0)
return dispatch_verb(argc, argv, verbs, &c);
}
-DEFINE_MAIN_FUNCTION(run);
+DEFINE_MAIN_FUNCTION_WITH_POSITIVE_FAILURE(run);