From: Bruno Haible Date: Thu, 24 Dec 2020 18:04:57 +0000 (+0100) Subject: execute: Treat signalled processes like wait-process does. X-Git-Tag: v1.0~3328 X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=438234c7409a58f091e314a2eecaef156efbc6ac;p=gnulib.git execute: Treat signalled processes like wait-process does. * lib/execute.c: Include , . (execute): Recognize the case where the exit code indicates a signalled child process. * tests/test-execute-main.c (main): Update expected test result. * modules/execute (Depends-on): Add sys_wait. --- diff --git a/ChangeLog b/ChangeLog index b0e4ad5e44..397bd7dbdd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2020-12-24 Bruno Haible + + execute: Treat signalled processes like wait-process does. + * lib/execute.c: Include , . + (execute): Recognize the case where the exit code indicates a signalled + child process. + * tests/test-execute-main.c (main): Update expected test result. + * modules/execute (Depends-on): Add sys_wait. + 2020-12-24 Bruno Haible windows-spawn: Improve errno upon failure on native Windows. diff --git a/lib/execute.c b/lib/execute.c index 38dd07bcef..4cc779e4ac 100644 --- a/lib/execute.c +++ b/lib/execute.c @@ -28,6 +28,9 @@ #include #include +#include +#include + #include "canonicalize.h" #include "error.h" #include "fatal-signal.h" @@ -214,12 +217,22 @@ execute (const char *progname, free (argv_mem_to_free); free (prog_path_to_free); + /* Treat failure and signalled child processes like wait_subprocess() + does. */ if (termsigp != NULL) *termsigp = 0; if (exitcode == -1) goto fail_with_saved_errno; + if (WIFSIGNALED (exitcode)) + { + if (termsigp != NULL) + *termsigp = WTERMSIG (exitcode); + saved_errno = 0; + goto fail_with_saved_errno; + } + return exitcode; #else diff --git a/modules/execute b/modules/execute index 90a7b89c3c..434558050e 100644 --- a/modules/execute +++ b/modules/execute @@ -29,6 +29,7 @@ posix_spawnattr_setflags posix_spawnattr_destroy stdbool stdlib +sys_wait unistd wait-process windows-spawn diff --git a/tests/test-execute-main.c b/tests/test-execute-main.c index c58a62dcae..29a4c309d1 100644 --- a/tests/test-execute-main.c +++ b/tests/test-execute-main.c @@ -135,11 +135,10 @@ main (int argc, char *argv[]) int termsig = 0xDEADBEEF; int ret = execute (progname, prog_argv[0], prog_argv, NULL, false, false, false, false, true, false, &termsig); + ASSERT (ret == 127); #if defined _WIN32 && !defined __CYGWIN__ - ASSERT (ret == 3); - ASSERT (termsig == 0); + ASSERT (termsig == SIGTERM); /* dummy, from WTERMSIG in */ #else - ASSERT (ret == 127); ASSERT (termsig == SIGINT); #endif }