static int signalfd_open(struct file_desc *d, int *new_fd) { struct signalfd_info *info; int tmp; sigset_t mask; info = container_of(d, struct signalfd_info, d); pr_info("Restoring signalfd %#x\n", info->sfe->id); sigset_fill(&mask, info->sfe->sigmask); tmp = signalfd(-1, &mask, 0); if (tmp < 0) { pr_perror("Can't create signalfd %#08x", info->sfe->id); return -1; } if (rst_file_params(tmp, info->sfe->fown, info->sfe->flags)) { pr_perror("Can't restore params on signalfd %#08x", info->sfe->id); goto err_close; } *new_fd = tmp; return 0; err_close: close(tmp); return -1; }
static void setup(void) { int i = 0; if(pipe(my_sigpipe) == -1){ fatal_syserr("failure setting up selfpipe"); } for(i = 0; i < 2; ++i){ fd_cloexec(my_sigpipe[i]); fd_nonblock(my_sigpipe[i]); } if(pipe(my_logpipe) == -1){ fatal_syserr("failure creating logpipe"); } sigset_fill(&my_sigset); sigset_block(&my_sigset); sig_catch(SIGTERM, &sigtrap); sig_catch(SIGINT, &sigtrap); sig_catch(SIGCHLD, &sigtrap); /* catching these signals to pass to program: */ sig_catch(SIGALRM, &sigtrap); sig_catch(SIGCONT, &sigtrap); sig_catch(SIGHUP, &sigtrap); sig_catch(SIGQUIT, &sigtrap); sig_catch(SIGTSTP, &sigtrap); sig_catch(SIGUSR1, &sigtrap); sig_catch(SIGUSR2, &sigtrap); sig_ignore(SIGPIPE); return; }