X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=signal.c;h=c82e58b29af65fff20b77d5180217cd9c01b8bea;hb=2a2d1f8d52477af7e6e161d60c722b7a2f1a4651;hp=160730f5b6e737f1256bf5117df736efd7d8f970;hpb=a31c35b86e485c6c1feeaf9e1957e3d3ab52c7e5;p=dss.git diff --git a/signal.c b/signal.c index 160730f..c82e58b 100644 --- a/signal.c +++ b/signal.c @@ -69,7 +69,7 @@ err_out: static void generic_signal_handler(int s) { write(signal_pipe[1], &s, sizeof(int)); - //fprintf(stderr, "got sig %i, write returned %d\n", s, ret); + //fprintf(stderr, "got sig %i\n", s); } /** @@ -107,31 +107,36 @@ int reap_child(pid_t *pid) } /** - * wrapper around signal(2) - * \param sig the number of the signal to catch + * Wrapper around signal(2) + * + * \param sig The number of the signal to catch. * * This installs the generic signal handler for the given signal. + * * \return This function returns 1 on success and \p -E_SIGNAL_SIG_ERR on errors. * \sa signal(2) */ int install_sighandler(int sig) { DSS_DEBUG_LOG("catching signal %d\n", sig); - return signal(sig, &generic_signal_handler) == SIG_ERR? -E_SIGNAL_SIG_ERR : 1; + if (signal(sig, &generic_signal_handler) != SIG_ERR) + return 1; + make_err_msg("signal %d", sig); + return -E_SIGNAL_SIG_ERR; } /** - * return number of next pending signal + * Return number of next pending signal. * * 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 occurred while reading the signal - * pipe. If the read was interrupted by another signal the function returns 0. + * \return On success, the number of the received signal is returned. + * If the read was interrupted by another signal the function returns 0. + * Otherwise a negative error code is returned. */ int next_signal(void) { - int s; + int s, err; ssize_t r; r = read(signal_pipe[0], &s, sizeof(s)); @@ -139,7 +144,12 @@ int next_signal(void) DSS_DEBUG_LOG("next signal: %d\n", s); return s; } - return r < 0 && (errno != EAGAIN)? 0 : -ERRNO_TO_DSS_ERROR(errno); + err = errno; + assert(r < 0); + if (err == EAGAIN) + return 0; + make_err_msg("failed to read from signal pipe"); + return -ERRNO_TO_DSS_ERROR(err); } /**