static void afs_signal_post_select(struct sched *s, struct task *t)
{
- struct signal_task *st = container_of(t, struct signal_task, task);
int signum;
if (getppid() == 1) {
PARA_EMERG_LOG("para_server died\n");
goto shutdown;
}
- if (!FD_ISSET(st->fd, &s->rfds))
+ signum = para_next_signal(&s->rfds);
+ if (signum == 0)
return;
- signum = para_next_signal();
if (signum == SIGHUP) {
close_afs_tables();
parse_config_or_die(1);
para_fd_set(st->fd, &s->rfds, &s->max_fileno);
}
-static void signal_post_select(struct sched *s, struct task *t)
+static void signal_post_select(struct sched *s, __a_unused struct task *t)
{
- struct signal_task *st = container_of(t, struct signal_task, task);
int signum;
- if (!FD_ISSET(st->fd, &s->rfds))
- return;
-
- signum = para_next_signal();
+ signum = para_next_signal(&s->rfds);
switch (signum) {
case SIGINT:
case SIGTERM:
if (ret <= 0)
goto check_return; /* skip fd checks */
/* signals */
- if (FD_ISSET(signal_pipe, &rfds)) {
- int sig_nr = para_next_signal();
- if (sig_nr > 0)
- handle_signal(sig_nr);
- }
+ ret = para_next_signal(&rfds);
+ if (ret > 0)
+ handle_signal(ret);
/* read command pipe if ready */
if (command_pipe >= 0 && mode == COMMAND_MODE &&
FD_ISSET(command_pipe, &rfds)) {
kill(mmd->afs_pid, SIGHUP);
}
-static void signal_post_select(struct sched *s, struct task *t)
+static void signal_post_select(struct sched *s, __a_unused struct task *t)
{
- struct signal_task *st = container_of(t, struct signal_task, task);
- int signum;
-
- if (!FD_ISSET(st->fd, &s->rfds))
- return;
+ int signum = para_next_signal(&s->rfds);
- signum = para_next_signal();
switch (signum) {
+ case 0:
+ return;
case SIGHUP:
handle_sighup();
break;
/**
* Return the number of the next pending signal.
*
- * This should be called if the fd for the signal pipe is ready for reading.
+ * \param rfds Th fd_set containing the signal pipe.
*
- * \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.
+ * \return On success, the number of the received signal is returned. If there
+ * is no signal currently pending, the function returns zero. On read errors
+ * from the signal pipe, the process is terminated.
*/
-int para_next_signal(void)
+int para_next_signal(fd_set *rfds)
{
- int s;
- ssize_t r = read(signal_pipe[0], &s, sizeof(s));
+ size_t n;
+ int s, ret = read_nonblock(signal_pipe[0], &s, sizeof(s), rfds, &n);
- 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);
+ if (ret < 0) {
+ PARA_EMERG_LOG("%s\n", para_strerror(-ret));
+ exit(EXIT_FAILURE);
}
- assert(r == sizeof(s));
+ if (n == 0)
+ return 0;
+ assert(n == sizeof(s));
PARA_DEBUG_LOG("next signal: %d\n", s);
return s;
}
void para_sigaction(int sig, void (*handler)(int));
void para_install_sighandler(int);
int para_reap_child(pid_t *pid);
-int para_next_signal(void);
+int para_next_signal(fd_set *rfds);
void para_signal_shutdown(void);