#include "config.h"
#endif
+#include <assert.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include "system.h"
const struct pb_system_apps pb_system_apps = {
+ .prefix = PREFIX,
.cp = "/bin/cp",
.kexec = "/sbin/kexec",
.mount = "/bin/mount",
+ .shutdown = "/sbin/shutdown",
.sftp = "/usr/bin/sftp",
.tftp = "/usr/bin/tftp",
.umount = "/bin/umount",
/**
* pb_run_cmd - Run the supplied command.
* @cmd_argv: An argument list array for execv.
+ * @wait: Wait for the child process to complete before returning.
+ * @dry_run: Don't actually fork and exec.
*/
-int pb_run_cmd(const char *const *cmd_argv)
+int pb_run_cmd(const char *const *cmd_argv, int wait, int dry_run)
{
- int status;
- pid_t pid;
#if defined(DEBUG)
enum {do_debug = 1};
#else
enum {do_debug = 0};
#endif
+ int status;
+ pid_t pid;
if (do_debug) {
const char *const *p = cmd_argv;
- pb_log("%s: ", __func__);
+ pb_log("%s: %s", __func__, (dry_run ? "(dry-run) " : ""));
+
while (*p) {
pb_log("%s ", *p);
p++;
}
pb_log("\n");
} else
- pb_log("%s: %s\n", __func__, cmd_argv[0]);
+ pb_log("%s: %s%s\n", __func__, (dry_run ? "(dry-run) " : ""),
+ cmd_argv[0]);
+
+ if (dry_run)
+ return 0;
pid = fork();
+
if (pid == -1) {
pb_log("%s: fork failed: %s\n", __func__, strerror(errno));
return -1;
}
if (pid == 0) {
+ int log = fileno(pb_log_get_stream());
+
+ /* Redirect child output to log. */
+
+ status = dup2(log, STDOUT_FILENO);
+ assert(status != -1);
+
+ status = dup2(log, STDERR_FILENO);
+ assert(status != -1);
+
execvp(cmd_argv[0], (char *const *)cmd_argv);
pb_log("%s: exec failed: %s\n", __func__, strerror(errno));
exit(EXIT_FAILURE);
}
+ if (!wait && !waitpid(pid, &status, WNOHANG))
+ return 0;
+
if (waitpid(pid, &status, 0) == -1) {
pb_log("%s: waitpid failed: %s\n", __func__,
strerror(errno));