]> git.proxmox.com Git - mirror_lxc.git/commitdiff
forward signals to the container init
authorFerenc Wagner <wferi@niif.hu>
Tue, 13 Jul 2010 12:51:45 +0000 (14:51 +0200)
committerDaniel Lezcano <dlezcano@fr.ibm.com>
Tue, 13 Jul 2010 12:51:45 +0000 (14:51 +0200)
Signed-off-by: Ferenc Wagner <wferi@niif.hu>
Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
src/lxc/start.c

index dc57bea8e55906a36cb70e70b084ea3a12496a54..92f44e3d272dae38b20db007245d507a747275fd 100644 (file)
@@ -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");