[OpenWrt-Devel] [PATCH libubox] Allow SIGINT to be released on request

Michel Stam m.stam at fugro.nl
Thu Oct 2 08:47:05 EDT 2014


SIGINT is captured by uloop by default. This does not work for
procd, where SIGINT is used by the kernel to indicate that the
system must be rebooted.

Signed-off-by: Michel Stam <m.stam at fugro.nl>
---
 uloop.c | 24 +++++++++++++++++-------
 uloop.h |  1 +
 2 files changed, 18 insertions(+), 7 deletions(-)

diff --git a/uloop.c b/uloop.c
index c3d206a..5180a80 100644
--- a/uloop.c
+++ b/uloop.c
@@ -57,6 +57,7 @@ static struct list_head timeouts = LIST_HEAD_INIT(timeouts);
 static struct list_head processes = LIST_HEAD_INIT(processes);
 
 static int poll_fd = -1;
+static bool uloop_catch_sigint = true;
 bool uloop_cancelled = false;
 bool uloop_handle_sigchld = true;
 static bool do_sigchld = false;
@@ -549,6 +550,11 @@ static void uloop_handle_processes(void)
 
 }
 
+void uloop_release_sigint(void)
+{
+	uloop_catch_sigint = false;
+}
+
 static void uloop_handle_sigint(int signo)
 {
 	uloop_cancelled = true;
@@ -562,18 +568,22 @@ static void uloop_sigchld(int signo)
 static void uloop_setup_signals(bool add)
 {
 	static struct sigaction old_sigint, old_sigchld;
+	static bool sigint_caught = false;
 	struct sigaction s;
 
 	memset(&s, 0, sizeof(struct sigaction));
 
-	if (add) {
-		s.sa_handler = uloop_handle_sigint;
-		s.sa_flags = 0;
-	} else {
-		s = old_sigint;
-	}
+	if (uloop_catch_sigint || sigint_caught) {
+		sigint_caught = true;
+		if (add) {
+			s.sa_handler = uloop_handle_sigint;
+			s.sa_flags = 0;
+		} else {
+			s = old_sigint;
+		}
 
-	sigaction(SIGINT, &s, &old_sigint);
+		sigaction(SIGINT, &s, &old_sigint);
+	}
 
 	if (!uloop_handle_sigchld)
 		return;
diff --git a/uloop.h b/uloop.h
index 7564514..b38d213 100644
--- a/uloop.h
+++ b/uloop.h
@@ -105,5 +105,6 @@ static inline void uloop_end(void)
 int uloop_init(void);
 void uloop_run(void);
 void uloop_done(void);
+void uloop_release_sigint(void);
 
 #endif
-- 
1.7.12.1
_______________________________________________
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