[lxc-devel] [PATCH 6/7] forward signals to the container init

Ferenc Wagner wferi at niif.hu
Sun Jun 6 21:07:31 UTC 2010


Signed-off-by: Ferenc Wagner <wferi at niif.hu>
---
 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 ee79892..b8ccd31 100644
--- a/src/lxc/start.c
+++ b/src/lxc/start.c
@@ -192,13 +192,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;
 	}
 
@@ -228,7 +228,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;
 	}
 
@@ -237,6 +237,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.6.5





More information about the lxc-devel mailing list