diff options
author | Rafał Miłecki <zajec5@gmail.com> | 2015-01-27 10:19:31 +0300 |
---|---|---|
committer | John Crispin <blogic@openwrt.org> | 2015-01-28 12:51:15 +0300 |
commit | 827ad8337e88ec9e0bf73a8af1d6cf8555e8ef3d (patch) | |
tree | 565f1bda4b5f20d1f970e851dc7f7f28db2c4cd3 /uloop.c | |
parent | ad9aa180d30ebf2ae91e3cc656c814693bb921ca (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.c | 24 |
1 files changed, 24 insertions, 0 deletions
@@ -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) |