[OpenWrt-Devel,V2,libubox] uloop: ignore SIGPIPE by default
diff mbox

Message ID 1422303122-18312-1-git-send-email-zajec5@gmail.com
State Changes Requested
Headers show

Commit Message

Rafał Miłecki Jan. 26, 2015, 8:12 p.m. UTC
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>
---
V2: Replace signal call with sigaction
---
 uloop.c | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

Comments

Felix Fietkau Jan. 26, 2015, 11:05 p.m. UTC | #1
On 2015-01-26 21:12, 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>
> ---
> 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);
> +		}
> +	}
> +}
Please reduce code duplication as well (setting sa_flags and calling
sigaction)

- Felix

Patch
diff mbox

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)