X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fposix%2FSignals.c;h=e34190c4393790f80c6880a2835a8af1382b3b55;hb=cbc5fb05036f3c1990b2f9f91b9e1c66b97a392f;hp=f79e348d601660e299f60c67fe444ace6d327f22;hpb=0e3cc7448cd966c1463adc4685b7d8646dccd0ed;p=ghc-hetmet.git diff --git a/rts/posix/Signals.c b/rts/posix/Signals.c index f79e348..e34190c 100644 --- a/rts/posix/Signals.c +++ b/rts/posix/Signals.c @@ -458,7 +458,7 @@ shutdown_handler(int sig STG_UNUSED) * doesn't seem to do so. * -------------------------------------------------------------------------- */ void -initDefaultHandlers() +initDefaultHandlers(void) { struct sigaction action,oact; @@ -496,6 +496,33 @@ initDefaultHandlers() #ifdef alpha_HOST_ARCH ieee_set_fp_control(0); #endif + + // ignore SIGPIPE; see #1619 + action.sa_handler = SIG_IGN; + sigemptyset(&action.sa_mask); + action.sa_flags = 0; + if (sigaction(SIGPIPE, &action, &oact) != 0) { + sysErrorBelch("warning: failed to install SIGPIPE handler"); + } +} + +void +resetDefaultHandlers(void) +{ + struct sigaction action; + + action.sa_handler = SIG_DFL; + sigemptyset(&action.sa_mask); + action.sa_flags = 0; + + // restore SIGINT + if (sigaction(SIGINT, &action, NULL) != 0) { + sysErrorBelch("warning: failed to uninstall SIGINT handler"); + } + // restore SIGPIPE + if (sigaction(SIGPIPE, &action, NULL) != 0) { + sysErrorBelch("warning: failed to uninstall SIGPIPE handler"); + } } void