From 1334ca42c672320cd7113cbcbc253cd93bf158b8 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Thu, 30 Jan 2025 20:49:41 +0100 Subject: Correctly return errors caused bu sub-process signals such as segfaults and aborts. --- src/execute.cc | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) (limited to 'src/execute.cc') diff --git a/src/execute.cc b/src/execute.cc index 17f8714..a905efc 100644 --- a/src/execute.cc +++ b/src/execute.cc @@ -48,12 +48,38 @@ int parent_waitpid(pid_t pid) { int status{}; - if(waitpid(pid, &status, 0) != pid) + auto rc_pid = waitpid(pid, &status, 0); + + if(rc_pid > 0) { - return 1; + if(WIFEXITED(status)) + { + // Child exited with normally + return WEXITSTATUS(status); + } + if(WIFSIGNALED(status)) + { + // Child exited via signal (segfault, abort, ...) + std::cerr << strsignal(status) << '\n'; + return WTERMSIG(status); + } + } + else + { // No PID returned, this is an error + if(errno == ECHILD) + { + // No children exist. + return 1; + } + else + { + // Unexpected error. + abort(); + } } - return WEXITSTATUS(status); + // Should never happen... + return 1; } } // namespace :: -- cgit v1.2.3