From 322a024f44bd6c2d665010588d74a681c9703431 Mon Sep 17 00:00:00 2001 From: Geoff Levand Date: Thu, 9 Jul 2009 10:40:43 -0700 Subject: [PATCH] Log child output Redirect the output of child processes to pb_log. Signed-off-by: Geoff Levand --- lib/system/system.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/lib/system/system.c b/lib/system/system.c index 380dded..65bd6bf 100644 --- a/lib/system/system.c +++ b/lib/system/system.c @@ -3,6 +3,7 @@ #include "config.h" #endif +#include #include #include #include @@ -104,13 +105,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 +126,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); -- 2.39.2