From dc544c894eddf90a77d49565673ea7eb216b3e44 Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Wed, 10 Dec 2008 13:44:18 +0100 Subject: run: better wait() error handling The current wait() error handling was insufficient. This patch introduce more verbose error reporting. Signed-off-by: Pablo Neira Ayuso --- src/run.c | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/run.c b/src/run.c index 4bd0e5b..8158f10 100644 --- a/src/run.c +++ b/src/run.c @@ -60,7 +60,39 @@ void killer(int foo) static void child(int foo) { - while(wait(NULL) > 0); + int status, ret; + + while ((ret = waitpid(0, &status, WNOHANG)) != 0) { + if (ret == -1) { + if (errno == EINTR) + continue; + if (errno == ECHILD) + break; + dlog(LOG_ERR, "wait has failed (%s)", strerror(errno)); + break; + } + if (!WIFSIGNALED(status)) + continue; + + switch(WTERMSIG(status)) { + case SIGSEGV: + dlog(LOG_ERR, "child process (pid=%u) has aborted, " + "received signal SIGSEGV (crashed)", ret); + break; + case SIGINT: + case SIGTERM: + case SIGKILL: + dlog(LOG_ERR, "child process (pid=%u) has aborted, " + "received termination signal (%u)", + ret, WTERMSIG(status)); + break; + default: + dlog(LOG_NOTICE, "child process (pid=%u) " + "received signal (%u)", + ret, WTERMSIG(status)); + break; + } + } } void local_handler(int fd, void *data) -- cgit v1.2.3