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 3f3dbf69d78dadb0ad8e732930dba88e4317418f..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>
@@
-48,7
+48,7
@@
int para_signal_init(void)
goto err_out;
return signal_pipe[0];
err_out:
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);
}
@@
-73,7
+73,7
@@
static void generic_signal_handler(int s)
* one otherwise. If and only if the function returns one, the content of \a
* pid is meaningful.
*
* one otherwise. If and only if the function returns one, the content of \a
* pid is meaningful.
*
- * \sa waitpid(2)
+ * \sa waitpid(2)
.
*/
int para_reap_child(pid_t *pid)
{
*/
int para_reap_child(pid_t *pid)
{
@@
-85,13
+85,13
@@
int para_reap_child(pid_t *pid)
if (*pid < 0)
return -ERRNO_TO_PARA_ERROR(errno);
if (WIFEXITED(status))
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",
(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);
+ PARA_WARNING_LOG("child %i terminated abormally\n",
(int)
*pid);
return 1;
}
return 1;
}
@@
-110,12
+110,15
@@
void para_reap_children(void)
}
/**
}
/**
- * 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)
{
@@
-124,26
+127,36
@@
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 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 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
;
}
}
- return r < 0 && (errno != EAGAIN)? 0 : -E_SIGNAL_READ;
+ if (r < 0) {
+ if (errno == EAGAIN || errno == EINTR)
+ return 0;
+ return -ERRNO_TO_PARA_ERROR(errno);
+ }
+ 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]);
void para_signal_shutdown(void)
{
close(signal_pipe[1]);