From: Andre Noll Date: Thu, 11 Oct 2007 16:59:36 +0000 (+0200) Subject: Merge commit 'remotes/fml/v0.3' into v0.3 X-Git-Tag: v0.3.0~282 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=9ae4e1bcaf7bdcc902b70428afa766ab332a5b23;hp=ab1f70b152a3fed964da7a062b557e00710d3371 Merge commit 'remotes/fml/v0.3' into v0.3 --- diff --git a/error.h b/error.h index 537e7393..40cccd56 100644 --- a/error.h +++ b/error.h @@ -264,8 +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"), \ - PARA_ERROR(SIGNAL_PIPE, "failed to setup signal pipe"), \ #define STRING_ERRORS \ @@ -410,8 +408,6 @@ extern const char **para_errlist[]; #define FD_ERRORS \ PARA_ERROR(FGETS, "fgets error"), \ PARA_ERROR(CHDIR, "failed to change directory"), \ - PARA_ERROR(FCHDIR, "fchdir failed"), \ - PARA_ERROR(OPENDIR, "can not open directory"), \ PARA_ERROR(OPEN, "failed to open file"), \ PARA_ERROR(CHDIR_PERM, "insufficient permissions to chdir"), \ diff --git a/fd.c b/fd.c index ed616645..10a3cf60 100644 --- a/fd.c +++ b/fd.c @@ -4,7 +4,7 @@ * Licensed under the GPL v2. For licencing details see COPYING. */ -/** \file fd.c helper functions for file descriptor handling */ +/** \file fd.c Helper functions for file descriptor handling. */ #include #include @@ -14,10 +14,11 @@ #include "para.h" #include "error.h" + /** - * check whether a file exists + * Check whether a file exists. * - * \param fn the file name + * \param fn The file name. * * \return Non-zero iff file exists. */ @@ -29,21 +30,22 @@ int file_exists(const char *fn) } /** - * paraslash's wrapper for select(2) + * Paraslash's wrapper for select(2). * * It calls select(2) (with no exceptfds) and starts over if select() was * interrupted by a signal. * - * \param n the highest-numbered descriptor in any of the two sets, plus 1 - * \param readfds fds that should be checked for readability - * \param writefds fds that should be checked for writablility + * \param n The highest-numbered descriptor in any of the two sets, plus 1. + * \param readfds fds that should be checked for readability. + * \param writefds fds that should be checked for writablility. * \param timeout_tv upper bound on the amount of time elapsed before select() - * returns + * returns. * - * \return The return value of the underlying select() call. + * \return The return value of the underlying select() call on success, the + * negative system error code on errors. * * All arguments are passed verbatim to select(2). - * \sa select(2) select_tut(2) + * \sa select(2) select_tut(2). */ int para_select(int n, fd_set *readfds, fd_set *writefds, struct timeval *timeout_tv) @@ -54,8 +56,7 @@ int para_select(int n, fd_set *readfds, fd_set *writefds, err = errno; } while (ret < 0 && err == EINTR); if (ret < 0) - PARA_CRIT_LOG("select error: %s, max_fileno: %d\n", - strerror(err), n); + return -ERRNO_TO_PARA_ERROR(errno); return ret; } @@ -78,16 +79,16 @@ int mark_fd_nonblock(int fd) } /** - * set a file descriptor in a fd_set + * Set a file descriptor in a fd_set. * - * \param fd the file descriptor to be set - * \param fds the file descriptor set - * \param max_fileno highest-numbered file descriptor + * \param fd The file descriptor to be set. + * \param fds The file descriptor set. + * \param max_fileno Highest-numbered file descriptor. * * This wrapper for FD_SET() passes its first two arguments to \p FD_SET. Upon * return, \a max_fileno contains the maximum of the old_value and \a fd. * - * \sa para_select + * \sa para_select. */ void para_fd_set(int fd, fd_set *fds, int *max_fileno) { @@ -110,10 +111,11 @@ void para_fd_set(int fd, fd_set *fds, int *max_fileno) } /** -* paraslash's wrapper for fgets(3) -* \param line pointer to the buffer to store the line -* \param size the size of the buffer given by \a line -* \param f the stream to read from +* Paraslash's wrapper for fgets(3). + +* \param line Pointer to the buffer to store the line. +* \param size The size of the buffer given by \a line. +* \param f The stream to read from. * * \return Unlike the standard fgets() function, an integer value * is returned. On success, this function returns 1. On errors, -E_FGETS @@ -139,12 +141,12 @@ again: /** * Paraslash's wrapper for mmap. * - * \param length number of bytes to mmap - * \param prot either PROT_NONE or the bitwise OR of one or more of - * PROT_EXEC PROT_READ PROT_WRITE - * \param flags exactly one of MAP_SHARED and MAP_PRIVATE - * \param fd the file to mmap from - * \param offset mmap start + * \param length Number of bytes to mmap. + * \param prot Either PROT_NONE or the bitwise OR of one or more of + * PROT_EXEC PROT_READ PROT_WRITE. + * \param flags Exactly one of MAP_SHARED and MAP_PRIVATE. + * \param fd The file to mmap from. + * \param offset Mmap start. * * \return This function either returns a valid pointer to the mapped area * or calls exit() on errors. @@ -167,8 +169,8 @@ void *para_mmap(size_t length, int prot, int flags, int fd, off_t offset) * \param flags The usual open(2) flags. * \param mode Specifies the permissions to use. * - * The mode parameter must be specified when O_CREAT is in the flags, and is ignored - * otherwise. + * The mode parameter must be specified when O_CREAT is in the flags, and is + * ignored otherwise. * * \return The file descriptor on success, negative on errors. * @@ -186,9 +188,9 @@ int para_open(const char *path, int flags, mode_t mode) /** * Wrapper for chdir(2). * - * \param path the specified directory. + * \param path The specified directory. * - * \return Positive on success, negative on errors. + * \return Standard. */ int para_chdir(const char *path) { @@ -206,7 +208,7 @@ int para_chdir(const char *path) * \param dir Result pointer. * \param cwd File descriptor of the current working directory. * - * \return Positive on success, negative on errors. + * \return Standard. * * Opening the current directory (".") and calling fchdir() to return is * usually faster and more reliable than saving cwd in some buffer and calling @@ -236,11 +238,10 @@ int para_opendir(const char *dirname, DIR **dir, int *cwd) ret = para_chdir(dirname); if (ret < 0) goto close_cwd; - ret = -E_OPENDIR; *dir = opendir("."); - if (!*dir) - goto change_to_orig_dir; - return 1; + if (*dir) + return 1; + ret = -ERRNO_TO_PARA_ERROR(errno); /* Ignore return value of fchdir() and close(). We're busted anyway. */ change_to_orig_dir: if (cwd) @@ -254,14 +255,14 @@ close_cwd: /** * A wrapper for fchdir(). * - * \param fd An open file descriptor + * \param fd An open file descriptor. * - * \return Positive on success, negative on errors. + * \return Standard. */ int para_fchdir(int fd) { if (fchdir(fd) < 0) - return -E_FCHDIR; + return -ERRNO_TO_PARA_ERROR(errno); return 1; } 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 bf0cd5cc..128f6bba 100644 --- a/signal.c +++ b/signal.c @@ -16,7 +16,7 @@ static int signal_pipe[2]; /** - * initialize the paraslash signal subsystem + * Initialize the paraslash signal subsystem. * * This function creates a pipe, the signal pipe, to deliver pending * signals to the application (Bernstein's trick). It should be called @@ -35,9 +35,11 @@ static int signal_pipe[2]; */ int para_signal_init(void) { - int ret = -E_SIGNAL_PIPE; - if (pipe(signal_pipe)) + int ret; + if (pipe(signal_pipe) < 0) { + ret = -ERRNO_TO_PARA_ERROR(errno); goto err_out; + } ret = mark_fd_nonblock(signal_pipe[0]); if (ret < 0) goto err_out; @@ -60,45 +62,50 @@ static void generic_signal_handler(int s) } /** - * reap one child + * Reap one child. + * + * \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. * - * 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 */ } @@ -122,7 +129,7 @@ int para_install_sighandler(int sig) * This should be called if the fd for the signal pipe is ready for reading. * * \return On success, the number of the received signal is returned. \p - * -E_SIGNAL_READ is returned if a read error occured while reading the signal + * -E_SIGNAL_READ is returned if a read error occurred while reading the signal * pipe. If the read was interrupted by another signal the function returns 0. */ int para_next_signal(void) 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);