Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.openwrt.org/project/libubox.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafał Miłecki <zajec5@gmail.com>2015-01-27 10:19:31 +0300
committerJohn Crispin <blogic@openwrt.org>2015-01-28 12:51:15 +0300
commit827ad8337e88ec9e0bf73a8af1d6cf8555e8ef3d (patch)
tree565f1bda4b5f20d1f970e851dc7f7f28db2c4cd3 /uloop.c
parentad9aa180d30ebf2ae91e3cc656c814693bb921ca (diff)
uloop: ignore SIGPIPE by default
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>
Diffstat (limited to 'uloop.c')
-rw-r--r--uloop.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/uloop.c b/uloop.c
index d4df6e2..9ebeca6 100644
--- a/uloop.c
+++ b/uloop.c
@@ -582,6 +582,28 @@ 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;
+ void *new_handler = NULL;
+
+ sigaction(signum, NULL, &s);
+
+ if (ignore) {
+ if (s.sa_handler == SIG_DFL) /* Ignore only if there isn't any custom handler */
+ new_handler = SIG_IGN;
+ } else {
+ if (s.sa_handler == SIG_IGN) /* Restore only if noone modified our SIG_IGN */
+ new_handler = SIG_DFL;
+ }
+
+ if (new_handler) {
+ s.sa_handler = new_handler;
+ 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 +611,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)