From: Andre Noll Date: Wed, 10 Oct 2007 18:19:26 +0000 (+0200) Subject: Get rid of E_WAITPID. X-Git-Tag: v0.3.0~283 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=6751fdf54c240791298420b3034a32aa9cdc4200 Get rid of E_WAITPID. --- diff --git a/error.h b/error.h index cc953d28..40cccd56 100644 --- a/error.h +++ b/error.h @@ -264,7 +264,6 @@ extern const char **para_errlist[]; #define SIGNAL_ERRORS \ PARA_ERROR(SIGNAL_SIG_ERR, "signal() retured SIG_ERR"), \ PARA_ERROR(SIGNAL_READ, "read error from signal pipe"), \ - PARA_ERROR(WAITPID, "waitpid error"), \ #define STRING_ERRORS \ diff --git a/gui.c b/gui.c index f884e864..a71a2a7c 100644 --- a/gui.c +++ b/gui.c @@ -726,10 +726,11 @@ static void init_curses(void) static void check_sigchld(void) { + int ret; pid_t pid; reap_next_child: - pid = para_reap_child(); - if (pid <= 0) + ret = para_reap_child(&pid); + if (ret <= 0) return; if (pid == cmd_pid) { cmd_pid = 0; diff --git a/server.c b/server.c index d5946e47..7171c6e2 100644 --- a/server.c +++ b/server.c @@ -540,8 +540,8 @@ repeat: break; case SIGCHLD: for (;;) { - pid = para_reap_child(); - if (pid <= 0) + ret = para_reap_child(&pid); + if (ret <= 0) break; if (pid != afs_pid) continue; diff --git a/signal.c b/signal.c index 1db008ca..128f6bba 100644 --- a/signal.c +++ b/signal.c @@ -62,45 +62,50 @@ static void generic_signal_handler(int s) } /** - * reap one child + * Reap one child. * - * call waitpid() and print a log message containing the pid - * and the cause of the child's death. + * \para, pid In case a child died, its pid is returned here. + * + * Call waitpid() and print a log message containing the pid and the cause of + * the child's death. + * + * \return A (negative) paraslash error code on errors, zero, if no child died, + * one otherwise. If and only if the function returns one, the content of \a + * pid is meaningful. * - * \return Like \p waitpid(), this function returns the process ID of the - * terminated child; on error, \p -E_WAITPID is returned. * \sa waitpid(2) */ -pid_t para_reap_child(void) +int para_reap_child(pid_t *pid) { int status; - pid_t pid = waitpid(-1, &status, WNOHANG); + *pid = waitpid(-1, &status, WNOHANG); - if (pid <= 0) { - if (pid < 0) - pid = -E_WAITPID; - return pid; - } + if (!*pid) + return 0; + if (*pid < 0) + return -ERRNO_TO_PARA_ERROR(errno); if (WIFEXITED(status)) - PARA_DEBUG_LOG("child %i exited. Exit status: %i\n", pid, + PARA_DEBUG_LOG("child %i exited. Exit status: %i\n", *pid, WEXITSTATUS(status)); else if (WIFSIGNALED(status)) - PARA_DEBUG_LOG("child %i was killed by signal %i\n", pid, + PARA_DEBUG_LOG("child %i was killed by signal %i\n", *pid, WTERMSIG(status)); else - PARA_WARNING_LOG("child %i terminated abormally\n", pid); - return pid; + PARA_WARNING_LOG("child %i terminated abormally\n", *pid); + return 1; } /** - * paraslash's zombie killer + * Paraslash's zombie killer. * * It just calls \p para_reap_child() until there are no more children left to * reap. */ void para_reap_children(void) { - while (para_reap_child() > 0) + pid_t pid; + + while (para_reap_child(&pid) > 0) ; /* nothing */ } diff --git a/signal.h b/signal.h index 92144830..5df64c33 100644 --- a/signal.h +++ b/signal.h @@ -21,5 +21,5 @@ struct signal_task { int para_signal_init(void); int para_install_sighandler(int); void para_reap_children(void); -pid_t para_reap_child(void); +int para_reap_child(pid_t *pid); int para_next_signal(void);