X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=lib%2Fsystem%2Fsystem.c;h=7371445a876d0bdbd8e7ad2d7da49a5aa266e743;hp=380ddedadcd8a94de678e86e0af9da4a21fd7718;hb=62cf2ababe1046b88bf225db3d2ec7187c634812;hpb=b3e1a66f23b7338d88e0668b8cf10ffe139a9a03 diff --git a/lib/system/system.c b/lib/system/system.c index 380dded..7371445 100644 --- a/lib/system/system.c +++ b/lib/system/system.c @@ -3,6 +3,7 @@ #include "config.h" #endif +#include #include #include #include @@ -19,6 +20,7 @@ const struct pb_system_apps pb_system_apps = { .cp = "/bin/cp", .kexec = "/sbin/kexec", .mount = "/bin/mount", + .shutdown = "/sbin/shutdown", .sftp = "/usr/bin/sftp", .tftp = "/usr/bin/tftp", .umount = "/bin/umount", @@ -104,13 +106,13 @@ int pb_rmdir_recursive(const char *base, const char *dir) int pb_run_cmd(const char *const *cmd_argv) { - 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; @@ -125,12 +127,23 @@ int pb_run_cmd(const char *const *cmd_argv) pb_log("%s: %s\n", __func__, cmd_argv[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);