summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMilan Bouchet-Valat <nalimilan@club.fr>2009-11-18 16:26:20 +0100
committerMilan Bouchet-Valat <nalimilan@club.fr>2010-01-11 17:37:42 +0100
commitf64cef21aca94518e0af681c89cd2eb658492094 (patch)
treeaacb41c3e0b6a45a233e75bd11586b3801a8728a
parent8885e952de23ae1c3be6898fb482765399ce62cd (diff)
Improve error reporting when running external commands
exec() does not allow checking the returned error code. Use system() instead, even if we still need to fork to set stdin, stdout and LC_ALL. Add a new report when launching a command failed.
-rw-r--r--Utils/File.pm19
-rw-r--r--Utils/Report.pm1
2 files changed, 14 insertions, 6 deletions
diff --git a/Utils/File.pm b/Utils/File.pm
index 0bace55..f226ed6 100644
--- a/Utils/File.pm
+++ b/Utils/File.pm
@@ -770,11 +770,10 @@ sub run_full
$tool_path = &locate_tool ($cmd);
return -1 if ($tool_path eq "");
- return -1 if $command == -1;
+ return -1 if $cmd == -1;
$command = join (" ", ($tool_path, @arguments));
&Utils::Report::do_report ("file_run_full", $command);
- &Utils::Report::leave ();
my $pid = fork();
@@ -785,8 +784,10 @@ sub run_full
$ENV{"LC_ALL"} = "C";
open (STDOUT, "/dev/null");
open (STDERR, "/dev/null");
- exec ($tool_path, @arguments);
- exit (0);
+ system ($tool_path, @arguments);
+
+ # As documented in perlfunc, divide by 256.
+ exit ($? / 256);
}
# If no error has occurred so far, assume success,
@@ -795,8 +796,14 @@ sub run_full
waitpid ($pid, 0);
- # As documented in perlfunc, divide by 256.
- return ($? / 256);
+ if ($? != 0)
+ {
+ &Utils::Report::do_report ("file_run_full_failed", $command);
+ }
+
+ &Utils::Report::leave ();
+
+ return ($?);
}
# Simple wrappers calling &run_full() with the right background parameter
diff --git a/Utils/Report.pm b/Utils/Report.pm
index 1bf47d5..dfdb8d3 100644
--- a/Utils/Report.pm
+++ b/Utils/Report.pm
@@ -189,6 +189,7 @@ sub add
"file_run_pipe_failed" => ["warn", "Failed to pipe command [%s] for reading."],
"file_run_pipe_success" => ["info", "Piping command [%s] for reading."],
"file_run_full" => ["info", "Running command [%s]."],
+ "file_run_full_failed" => ["warn", "Command [%s] failed."],
"file_create_path" => ["info", "Directory [%s] created."],
"file_backup_rotate" => ["info", "Backup directory [%s] was rotated."],
"file_backup_success" => ["info", "Saved backup for [%s]."],