diff options
author | Ian Jackson <ijackson@chiark.greenend.org.uk> | 2014-08-10 20:38:41 +0100 |
---|---|---|
committer | Ian Jackson <ijackson@chiark.greenend.org.uk> | 2014-08-10 20:38:41 +0100 |
commit | 5e359c5927e8df1a0ce1652a4b83436e9d5d3410 (patch) | |
tree | 80ad8b960b20bb024a1aad809030da65a608fda6 /dgit | |
parent | fa084a3525ff66d656272e860852aaa27b5e5f7b (diff) |
Better reporting of child exit statuses (esp. deaths due to signals).
Diffstat (limited to 'dgit')
-rwxr-xr-x | dgit | 22 |
1 files changed, 19 insertions, 3 deletions
@@ -30,6 +30,7 @@ use Dpkg::Version; use POSIX; use IPC::Open2; use Digest::SHA; +use Config; our $our_version = 'UNRELEASED'; ###substituted### @@ -133,6 +134,23 @@ END { } }; +our @signames = split / /, $Config{sig_name}; + +sub waitstatusmsg () { + if (!$?) { + return "terminated, reporting successful completion"; + } elsif (!($? & 255)) { + return "failed with error exit status ".WEXITSTATUS($?); + } elsif (WIFSIGNALED($?)) { + my $signum=WTERMSIG($?); + return "died due to fatal signal ". + ($signames[$signum] // "number $signum"). + ($? & 128 ? " (core dumped)" : ""); # POSIX(3pm) has no WCOREDUMP + } else { + return "failed with unknown wait status ".$?; + } +} + sub printdebug { print DEBUG $debugprefix, @_ or die $!; } sub fail { @@ -350,10 +368,8 @@ sub failedcmd { { local ($!); printcmd \*STDERR, "$us: failed command:", @_ or die $!; }; if ($!) { fail "failed to fork/exec: $!"; - } elsif (!($? & 0xff)) { - fail "subprocess failed with error exit status ".($?>>8); } elsif ($?) { - fail "subprocess crashed (wait status $?)"; + fail "subprocess ".waitstatusmsg(); } else { fail "subprocess produced invalid output"; } |