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 <zaj...@gmail.com> --- V2: Replace signal call with sigaction --- uloop.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/uloop.c b/uloop.c index 9a77ce4..baaef8d 100644 --- a/uloop.c +++ b/uloop.c @@ -582,6 +582,27 @@ 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 */ + s.sa_handler = SIG_IGN; + s.sa_flags = 0; + sigaction(signum, &s, NULL); + } + } else { + if (s.sa_handler == SIG_IGN) { /* Restore only if noone modified our SIG_IGN */ + s.sa_handler = SIG_DFL; + s.sa_flags = 0; + sigaction(signum, &s, NULL); + } + } +} + static void uloop_setup_signals(bool add) { static struct sigaction old_sigint, old_sigchld, old_sigterm; @@ -589,6 +610,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) -- 1.8.4.5 _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel