[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