projects
/
paraslash.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
exec and fade cleanups.
[paraslash.git]
/
signal.c
diff --git
a/signal.c
b/signal.c
index bf0cd5ccff28286852858e1b4f22bf00f9436f7b..f8be2f4612002214f669fa74ce92390866b0dc90 100644
(file)
--- a/
signal.c
+++ b/
signal.c
@@
-1,9
+1,9
@@
/*
/*
- * Copyright (C) 2004-200
6
Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2004-200
8
Andre Noll <maan@systemlinux.org>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
-/** \file signal.c
signal handling functions
*/
+/** \file signal.c
Signal handling functions.
*/
#include <signal.h>
#include <sys/types.h>
#include <signal.h>
#include <sys/types.h>
@@
-16,7
+16,7
@@
static int signal_pipe[2];
/**
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
*
* This function creates a pipe, the signal pipe, to deliver pending
* signals to the application (Bernstein's trick). It should be called
@@
-35,18
+35,20
@@
static int signal_pipe[2];
*/
int para_signal_init(void)
{
*/
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;
goto err_out;
- ret = mark_fd_nonblock(signal_pipe[0]);
+ }
+ ret = mark_fd_nonblocking(signal_pipe[0]);
if (ret < 0)
goto err_out;
if (ret < 0)
goto err_out;
- ret = mark_fd_nonblock(signal_pipe[1]);
+ ret = mark_fd_nonblock
ing
(signal_pipe[1]);
if (ret < 0)
goto err_out;
return signal_pipe[0];
err_out:
if (ret < 0)
goto err_out;
return signal_pipe[0];
err_out:
- PARA_EMERG_LOG("%s\n",
PARA_STRERROR
(-ret));
+ PARA_EMERG_LOG("%s\n",
para_strerror
(-ret));
exit(EXIT_FAILURE);
}
exit(EXIT_FAILURE);
}
@@
-60,55
+62,63
@@
static void generic_signal_handler(int s)
}
/**
}
/**
- * reap one child
+ * Reap one child.
+ *
+ * \param 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 Like \p waitpid(), this function returns the process ID of the
- * terminated child; on error, \p -E_WAITPID is returned.
- * \sa waitpid(2)
+ * \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.
+ *
+ * \sa waitpid(2).
*/
*/
-
pid_t para_reap_child(vo
id)
+
int para_reap_child(pid_t *p
id)
{
int status;
{
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))
if (WIFEXITED(status))
- PARA_DEBUG_LOG("child %i exited. Exit status: %i\n", pid,
+ PARA_DEBUG_LOG("child %i exited. Exit status: %i\n",
(int)*
pid,
WEXITSTATUS(status));
else if (WIFSIGNALED(status))
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",
(int)*
pid,
WTERMSIG(status));
else
WTERMSIG(status));
else
- PARA_WARNING_LOG("child %i terminated abormally\n", pid);
- return
pid
;
+ PARA_WARNING_LOG("child %i terminated abormally\n",
(int)*
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)
{
*
* 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 */
}
/**
; /* nothing */
}
/**
- * 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.
*
* 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.
* \return This function returns 1 on success and \p -E_SIGNAL_SIG_ERR on errors.
- * \sa signal(2)
+ *
+ * \sa signal(2).
*/
int para_install_sighandler(int sig)
{
*/
int para_install_sighandler(int sig)
{
@@
-117,22
+127,37
@@
int para_install_sighandler(int sig)
}
/**
}
/**
- *
return number of next pending signal
+ *
Return the number of next pending signal.
*
* This should be called if the fd for the signal pipe is ready for reading.
*
*
* 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
- *
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 returned zero or was interrupted by another signal the function returns
+ *
0. Otherwise, a negative error value is returned
.
*/
int para_next_signal(void)
{
int s;
*/
int para_next_signal(void)
{
int s;
- ssize_t r;
+ ssize_t r
= read(signal_pipe[0], &s, sizeof(s))
;
- if ((r = read(signal_pipe[0], &s, sizeof(s)) == sizeof(s)) > 0) {
- PARA_DEBUG_LOG("next signal: %d\n", s);
- return s;
+ if (!r) {
+ PARA_CRIT_LOG("read from signal pipe returned zero\n");
+ return 0;
+ }
+ if (r < 0) {
+ if (errno == EAGAIN || errno == EINTR)
+ return 0;
+ return -ERRNO_TO_PARA_ERROR(errno);
}
}
- return r < 0 && (errno != EAGAIN)? 0 : -E_SIGNAL_READ;
+ assert(r == sizeof(s));
+ PARA_DEBUG_LOG("next signal: %d\n", s);
+ return s;
+}
+
+/**
+ * Close the write end of the signal pipe.
+ */
+void para_signal_shutdown(void)
+{
+ close(signal_pipe[1]);
}
}