[lxc-devel] [patch -lxc 1/4] forward signals to the container init

Daniel Lezcano dlezcano at fr.ibm.com
Thu Jul 15 21:08:15 UTC 2010


From: Ferenc Wagner <wferi at niif.hu>

Signed-off-by: Ferenc Wagner <wferi at niif.hu>
Signed-off-by: Daniel Lezcano <dlezcano at fr.ibm.com>
---
 src/lxc/start.c |   22 ++++++++++++++--------
 1 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/src/lxc/start.c b/src/lxc/start.c
index dc57bea..92f44e3 100644
--- a/src/lxc/start.c
+++ b/src/lxc/start.c
@@ -195,13 +195,13 @@ static int setup_sigchld_fd(sigset_t *oldmask)
 	sigset_t mask;
 	int fd;
 
-	if (sigprocmask(SIG_BLOCK, NULL, &mask)) {
-		SYSERROR("failed to get mask signal");
-		return -1;
-	}
-
-	if (sigaddset(&mask, SIGCHLD) || sigprocmask(SIG_BLOCK, &mask, oldmask)) {
-		SYSERROR("failed to set mask signal");
+	/* Block everything except serious error signals */
+	if (sigfillset(&mask) ||
+	    sigdelset(&mask, SIGILL) ||
+	    sigdelset(&mask, SIGSEGV) ||
+	    sigdelset(&mask, SIGBUS) ||
+	    sigprocmask(SIG_BLOCK, &mask, oldmask)) {
+		SYSERROR("failed to set signal mask");
 		return -1;
 	}
 
@@ -231,7 +231,7 @@ static int sigchld_handler(int fd, void *data,
 
 	ret = read(fd, &siginfo, sizeof(siginfo));
 	if (ret < 0) {
-		ERROR("failed to read sigchld info");
+		ERROR("failed to read signal info");
 		return -1;
 	}
 
@@ -240,6 +240,12 @@ static int sigchld_handler(int fd, void *data,
 		return -1;
 	}
 
+	if (siginfo.ssi_signo != SIGCHLD) {
+		kill(*pid, siginfo.ssi_signo);
+		INFO("forwarded signal %d to pid %d", siginfo.ssi_signo, *pid);
+		return 0;
+	}
+
 	if (siginfo.ssi_code == CLD_STOPPED ||
 	    siginfo.ssi_code == CLD_CONTINUED) {
 		INFO("container init process was stopped/continued");
-- 
1.7.0.4





More information about the lxc-devel mailing list