[OpenWrt-Devel] [PATCH V2 libubox] uloop: ignore SIGPIPE by default
Rafał Miłecki
zajec5 at gmail.com
Mon Jan 26 15:12:02 EST 2015
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 at 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 at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
More information about the openwrt-devel
mailing list