uloop_signal_fd_cb(struct uloop_fd *fd, unsigned int events)
{
struct signalfd_siginfo fdsi;
+ struct sigaction act;
int ret;
retry:
if (ret != sizeof(fdsi))
return;
- uloop_handle_signal(fdsi.ssi_signo);
+ switch (fdsi.ssi_signo) {
+ case SIGQUIT:
+ case SIGINT:
+ case SIGTERM:
+ sigaction(fdsi.ssi_signo, NULL, &act);
+ if (act.sa_handler != SIG_IGN &&
+ act.sa_handler != SIG_DFL) {
+ act.sa_handler(fdsi.ssi_signo);
+ break;
+ }
+
+ /* fall through */
+ default:
+ uloop_handle_signal(fdsi.ssi_signo);
+ break;
+ }
}
static bool
if (!add) {
uloop_fd_delete(&sfd);
- sigprocmask(SIG_SETMASK, &prev_mask, NULL);
+ sigprocmask(SIG_BLOCK, &prev_mask, NULL);
} else {
sigaddset(&mask, SIGQUIT);
sigaddset(&mask, SIGINT);
static void uloop_setup_signals(bool add)
{
- static struct sigaction old_sigint, old_sigchld, old_sigterm;
+ static struct sigaction old_sigint, old_sigchld, old_sigterm, old_sigquit;
- if (uloop_setup_signalfd(add))
- return;
+ uloop_setup_signalfd(add);
uloop_install_handler(SIGINT, uloop_handle_signal, &old_sigint, add);
uloop_install_handler(SIGTERM, uloop_handle_signal, &old_sigterm, add);
- uloop_install_handler(SIGQUIT, uloop_handle_signal, &old_sigterm, add);
+ uloop_install_handler(SIGQUIT, uloop_handle_signal, &old_sigquit, add);
uloop_install_handler(SIGCHLD, uloop_handle_signal, &old_sigchld, add);
uloop_ignore_signal(SIGPIPE, add);