[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