diff options
-rw-r--r-- | debian/changelog | 1 | ||||
-rwxr-xr-x | dgit | 22 |
2 files changed, 20 insertions, 3 deletions
diff --git a/debian/changelog b/debian/changelog index 978ad10..f70f2ff 100644 --- a/debian/changelog +++ b/debian/changelog @@ -37,6 +37,7 @@ dgit (0.22~experimental1) experimental; urgency=low * Improve error message for .dsc having already been signed (iff using libdpkg-perl 1.17.x). Closes:#731635. * Improve error message for .dsc parsing failures more generally. + * Better reporting of child exit statuses (esp. deaths due to signals). Major new feature, currently stalled awaiting server infrastructure: * dgit-repos-server: New program for receiving signed-tag-based @@ -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"; } |