Message ID | 1422267933-5240-1-git-send-email-zajec5@gmail.com |
---|---|
State | Superseded |
Headers | show |
On 2015-01-26 11:25, Rafał Miłecki wrote: > Most app don't want to crash because of unhandled SIGPIPE. It could > happen is such trivial situations like writing to socket. > > Signed-off-by: Rafał Miłecki <zajec5@gmail.com> > --- > uloop.c | 17 +++++++++++++++++ > 1 file changed, 17 insertions(+) > > diff --git a/uloop.c b/uloop.c > index 9a77ce4..7d11bbc 100644 > --- a/uloop.c > +++ b/uloop.c > @@ -582,6 +582,21 @@ static void uloop_install_handler(int signum, void (*handler)(int), struct sigac > sigaction(signum, act, NULL); > } > > +static void uloop_ignore_signal(int signum, bool ignore) > +{ > + struct sigaction s; > + > + sigaction(signum, NULL, &s); > + > + if (ignore) { > + if (s.sa_handler == SIG_DFL) /* Ignore only if there isn't any custom handler */ > + signal(signum, SIG_IGN); > + } else { > + if (s.sa_handler == SIG_IGN) /* Restore only if noone modified our SIG_IGN */ > + signal(signum, SIG_DFL); > + } How about setting sa.handler inside the if block, and using sigaction to change the signal. This API mix looks a bit quirky to me. - Felix
diff --git a/uloop.c b/uloop.c index 9a77ce4..7d11bbc 100644 --- a/uloop.c +++ b/uloop.c @@ -582,6 +582,21 @@ static void uloop_install_handler(int signum, void (*handler)(int), struct sigac sigaction(signum, act, NULL); } +static void uloop_ignore_signal(int signum, bool ignore) +{ + struct sigaction s; + + sigaction(signum, NULL, &s); + + if (ignore) { + if (s.sa_handler == SIG_DFL) /* Ignore only if there isn't any custom handler */ + signal(signum, SIG_IGN); + } else { + if (s.sa_handler == SIG_IGN) /* Restore only if noone modified our SIG_IGN */ + signal(signum, SIG_DFL); + } +} + static void uloop_setup_signals(bool add) { static struct sigaction old_sigint, old_sigchld, old_sigterm; @@ -589,6 +604,8 @@ static void uloop_setup_signals(bool add) uloop_install_handler(SIGINT, uloop_handle_sigint, &old_sigint, add); uloop_install_handler(SIGTERM, uloop_handle_sigint, &old_sigterm, add); uloop_install_handler(SIGCHLD, uloop_sigchld, &old_sigchld, add); + + uloop_ignore_signal(SIGPIPE, add); } static int uloop_get_next_timeout(struct timeval *tv)
Most app don't want to crash because of unhandled SIGPIPE. It could happen is such trivial situations like writing to socket. Signed-off-by: Rafał Miłecki <zajec5@gmail.com> --- uloop.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)