]> andersk Git - moira.git/blob - update/exec_002.c
no longer use special execute_comd.c
[moira.git] / update / exec_002.c
1 /*
2  *      $Source$
3  *      $Header$
4  */
5
6 #ifndef lint
7 static char *rcsid_exec_002_c = "$Header$";
8 #endif  lint
9
10 #include <stdio.h>
11 #include <sys/wait.h>
12 #include <signal.h>
13 #include <gdb.h>
14 #include <sms.h>
15 #include "update.h"
16 #include "kludge.h"
17
18 extern CONNECTION conn;
19 extern int code, errno;
20
21 int
22 exec_002(str)
23     char *str;
24 {
25     union wait waitb;
26     int n, pid, mask;
27
28     str += 8;
29     while (*str == ' ')
30         str++;
31     mask = sigblock(sigmask(SIGCHLD));
32     pid = fork();
33     switch (pid) {
34     case -1:
35         n = errno;
36         sigsetmask(mask);
37         log_priority = log_ERROR;
38         com_err(whoami, errno, ": can't fork to run install script");
39         code = send_object(conn, (char *)&n, INTEGER_T);
40         if (code)
41             exit(1);
42         return;
43     case 0:
44         execlp(str, str, (char *)NULL);
45         n = errno;
46         sigsetmask(mask);
47         log_priority = log_ERROR;
48         com_err(whoami, n, ": %s", str);
49         (void) send_object(conn, (char *)&n, INTEGER_T);
50         exit(1);
51     default:
52         do {
53             n = wait(&waitb);
54         } while (n != -1 && n != pid);
55         sigsetmask(mask);
56         if (waitb.w_status) {
57             n = waitb.w_retcode + sms_err_base;
58             log_priority = log_ERROR;
59             com_err(whoami, n, " child exited with status %d", waitb.w_retcode);
60             code = send_object(conn, (char *)&n, INTEGER_T);
61             if (code) {
62                 exit(1);
63             }
64         } else {
65             code = send_ok();
66             if (code)
67               exit(1);
68         }
69     }
70 }
This page took 0.059208 seconds and 5 git commands to generate.