]> andersk Git - moira.git/blame - update/exec_002.c
no longer use special execute_comd.c
[moira.git] / update / exec_002.c
CommitLineData
de56407f 1/*
2 * $Source$
3 * $Header$
4 */
5
6#ifndef lint
7static char *rcsid_exec_002_c = "$Header$";
8#endif lint
9
10#include <stdio.h>
11#include <sys/wait.h>
6143ee87 12#include <signal.h>
c8dc853f 13#include <gdb.h>
14#include <sms.h>
de56407f 15#include "update.h"
de56407f 16#include "kludge.h"
de56407f 17
18extern CONNECTION conn;
19extern int code, errno;
20
21int
22exec_002(str)
23 char *str;
24{
25 union wait waitb;
6143ee87 26 int n, pid, mask;
de56407f 27
28 str += 8;
29 while (*str == ' ')
30 str++;
6143ee87 31 mask = sigblock(sigmask(SIGCHLD));
de56407f 32 pid = fork();
33 switch (pid) {
34 case -1:
35 n = errno;
6143ee87 36 sigsetmask(mask);
de56407f 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;
6143ee87 46 sigsetmask(mask);
de56407f 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);
6143ee87 55 sigsetmask(mask);
de56407f 56 if (waitb.w_status) {
c8dc853f 57 n = waitb.w_retcode + sms_err_base;
de56407f 58 log_priority = log_ERROR;
c8dc853f 59 com_err(whoami, n, " child exited with status %d", waitb.w_retcode);
de56407f 60 code = send_object(conn, (char *)&n, INTEGER_T);
c8dc853f 61 if (code) {
de56407f 62 exit(1);
c8dc853f 63 }
64 } else {
de56407f 65 code = send_ok();
66 if (code)
c8dc853f 67 exit(1);
de56407f 68 }
69 }
70}
This page took 0.059466 seconds and 5 git commands to generate.