aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorEgor Tensin <Egor.Tensin@gmail.com>2023-07-26 10:18:14 +0200
committerEgor Tensin <Egor.Tensin@gmail.com>2023-07-26 10:38:38 +0200
commit68f5ff0ec4ba02712e806df963ba65838522e2bb (patch)
tree665623ccd549e3b1a62d6b95ee19695d4edc20cd
parentworkflows/ci: refactoring (diff)
downloadcimple-68f5ff0ec4ba02712e806df963ba65838522e2bb.tar.gz
cimple-68f5ff0ec4ba02712e806df963ba65838522e2bb.zip
process: portable exit code processing
Diffstat (limited to '')
-rw-r--r--src/process.c18
-rw-r--r--test/py/lib/test_repo.py4
2 files changed, 14 insertions, 8 deletions
diff --git a/src/process.c b/src/process.c
index 3fc866f..1e2583b 100644
--- a/src/process.c
+++ b/src/process.c
@@ -40,12 +40,20 @@ static int wait_for_child(pid_t pid, int *ec)
return ret;
}
- if (WIFEXITED(status))
+ /* The child process reports the lowest 8 bits of its exit code, which
+ * are treated as an unsigned integer on Linux.
+ *
+ * If it was killed by a signal, indicate that by negating the signal
+ * number. */
+
+ if (WIFEXITED(status)) {
*ec = WEXITSTATUS(status);
- else if (WIFSIGNALED(status))
- *ec = status; /* Same as $?. */
- else
- *ec = -1;
+ } else if (WIFSIGNALED(status)) {
+ *ec = -WTERMSIG(status);
+ } else {
+ log_err("This shouldn't happen: %d\n", status);
+ *ec = 1;
+ }
return 0;
}
diff --git a/test/py/lib/test_repo.py b/test/py/lib/test_repo.py
index eb2786d..af0da68 100644
--- a/test/py/lib/test_repo.py
+++ b/test/py/lib/test_repo.py
@@ -217,9 +217,7 @@ class TestRepoSegfault(TestRepo):
shutil.copy(self.prog_path, self.ci_script_path)
def run_exit_code_matches(self, ec):
- # If WIFSIGNALED(status) && WTERMSIG(status) == SIGSEGV, then the $?
- # would be 139.
- return ec == 139
+ return ec == -11
def run_output_matches(self, output):
return "Started the test program.\n" == output.decode()