summaryrefslogtreecommitdiff
path: root/process.c
diff options
context:
space:
mode:
authornormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-07-02 21:13:26 +0000
committernormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-07-02 21:13:26 +0000
commit80a0c0f808ced70bbd01a0dddf02344c93708eb5 (patch)
tree59b0d2620e24a0c4762ae09a7511c4e538f6a28c /process.c
parent213e7a1c53294f81dcd31a3baad43464e4031080 (diff)
process.c (disable_child_handler_fork_child): simplify
signal(2) is portable for SIG_DFL and SIG_IGN, so we do not need the extra code for sigaction(2). Also, execve will reset all signal handlers to default anyways, so there is little sense in preserving old signal handler besides SIG_IGN. Hopefully this makes the code easier-to-understand and maintain. * process.c (disable_child_handler_fork_child): simplify [ruby-core:75781] [Misc #12439] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55566 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'process.c')
-rw-r--r--process.c61
1 files changed, 9 insertions, 52 deletions
diff --git a/process.c b/process.c
index fa4f0202b3..2938b9f578 100644
--- a/process.c
+++ b/process.c
@@ -3497,44 +3497,10 @@ disable_child_handler_fork_child(struct child_handler_disabler_state *old, char
{
int sig;
int ret;
-#ifdef POSIX_SIGNAL
- struct sigaction act, oact;
-
- act.sa_handler = SIG_DFL;
- act.sa_flags = 0;
- ret = sigemptyset(&act.sa_mask); /* async-signal-safe */
- if (ret == -1) {
- ERRMSG("sigemptyset");
- return -1;
- }
-#else
- sig_t handler;
-#endif
for (sig = 1; sig < NSIG; sig++) {
- int reset = 0;
-#ifdef SIGPIPE
- if (sig == SIGPIPE) {
- reset = 1;
-#ifndef POSIX_SIGNAL
- handler = SIG_DFL;
-#endif
- }
-#endif
- if (!reset) {
-#ifdef POSIX_SIGNAL
- ret = sigaction(sig, NULL, &oact); /* async-signal-safe */
- if (ret == -1 && errno == EINVAL) {
- continue; /* Ignore invalid signal number. */
- }
- if (ret == -1) {
- ERRMSG("sigaction to obtain old action");
- return -1;
- }
- reset = (oact.sa_flags & SA_SIGINFO) ||
- (oact.sa_handler != SIG_IGN && oact.sa_handler != SIG_DFL);
-#else
- handler = signal(sig, SIG_DFL);
+ sig_t handler = signal(sig, SIG_DFL);
+
if (handler == SIG_ERR && errno == EINVAL) {
continue; /* Ignore invalid signal number */
}
@@ -3542,24 +3508,15 @@ disable_child_handler_fork_child(struct child_handler_disabler_state *old, char
ERRMSG("signal to obtain old action");
return -1;
}
- reset = (handler != SIG_IGN && handler != SIG_DFL);
-#endif
- }
- if (reset) {
-#ifdef POSIX_SIGNAL
- ret = sigaction(sig, &act, NULL); /* async-signal-safe */
- if (ret == -1) {
- ERRMSG("sigaction to set default action");
- return -1;
+#ifdef SIGPIPE
+ if (sig == SIGPIPE) {
+ continue;
}
-#else
- handler = signal(sig, handler);
- if (handler == SIG_ERR) {
- ERRMSG("signal to set default action");
- return -1;
- }
#endif
- }
+ /* it will be reset to SIG_DFL at execve time, instead */
+ if (handler == SIG_IGN) {
+ signal(sig, SIG_IGN);
+ }
}
ret = sigprocmask(SIG_SETMASK, &old->sigmask, NULL); /* async-signal-safe */