]> andersk Git - moira.git/blobdiff - update/exec_002.c
allow child exit status to be returned; GDB was catching signal
[moira.git] / update / exec_002.c
index 4f4d06c4438f54aa716300fffb69d0a8b4157674..c65b3ab535a7331dd4a1107d1991234f1c6f6067 100644 (file)
@@ -9,6 +9,7 @@ static char *rcsid_exec_002_c = "$Header$";
 
 #include <stdio.h>
 #include <sys/wait.h>
+#include <signal.h>
 #include "gdb.h"
 #include "update.h"
 #include "sms_update_int.h"
@@ -23,15 +24,17 @@ exec_002(str)
     char *str;
 {
     union wait waitb;
-    int n, pid;
+    int n, pid, mask;
 
     str += 8;
     while (*str == ' ')
        str++;
+    mask = sigblock(sigmask(SIGCHLD));
     pid = fork();
     switch (pid) {
     case -1:
        n = errno;
+       sigsetmask(mask);
        log_priority = log_ERROR;
        com_err(whoami, errno, ": can't fork to run install script");
        code = send_object(conn, (char *)&n, INTEGER_T);
@@ -41,6 +44,7 @@ exec_002(str)
     case 0:
        execlp(str, str, (char *)NULL);
        n = errno;
+       sigsetmask(mask);
        log_priority = log_ERROR;
        com_err(whoami, n, ": %s", str);
        (void) send_object(conn, (char *)&n, INTEGER_T);
@@ -49,6 +53,7 @@ exec_002(str)
        do {
            n = wait(&waitb);
        } while (n != -1 && n != pid);
+       sigsetmask(mask);
        if (waitb.w_status) {
            log_priority = log_ERROR;
            com_err(whoami, 0, "child exited with status %d", waitb.w_status);
This page took 0.033765 seconds and 4 git commands to generate.