From 5e359c5927e8df1a0ce1652a4b83436e9d5d3410 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 10 Aug 2014 20:38:41 +0100 Subject: [PATCH] Better reporting of child exit statuses (esp. deaths due to signals). --- debian/changelog | 1 + dgit | 22 +++++++++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/debian/changelog b/debian/changelog index 978ad109..f70f2ff6 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 diff --git a/dgit b/dgit index b2426467..e3fc0eef 100755 --- a/dgit +++ b/dgit @@ -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"; } -- 2.30.2