]> andersk Git - moira.git/blame - update/exec_002.c
get longer tickets
[moira.git] / update / exec_002.c
CommitLineData
de56407f 1/*
2 * $Source$
3 * $Header$
4 */
546bc43b 5/* (c) Copyright 1988 by the Massachusetts Institute of Technology. */
6/* For copying and distribution information, please see the file */
7/* <mit-copyright.h>. */
de56407f 8
9#ifndef lint
10static char *rcsid_exec_002_c = "$Header$";
11#endif lint
12
546bc43b 13#include <mit-copyright.h>
de56407f 14#include <stdio.h>
8b3ba58e 15#include <errno.h>
c57b6bd3 16#include <sys/types.h>
de56407f 17#include <sys/wait.h>
6143ee87 18#include <signal.h>
c8dc853f 19#include <gdb.h>
2ad0a777 20#include <moira.h>
de56407f 21#include "update.h"
de56407f 22
23extern CONNECTION conn;
8b3ba58e 24extern int code, errno, uid;
25extern char *whoami;
26
984bd8ef 27#if defined(vax) || defined(ibm032)
28#define WEXITSTATUS(waitb) ((waitb).w_retcode)
29#endif
30
de56407f 31
32int
33exec_002(str)
34 char *str;
35{
984bd8ef 36#ifdef _AIX
37 int waitb;
38#else
de56407f 39 union wait waitb;
984bd8ef 40#endif
6143ee87 41 int n, pid, mask;
de56407f 42
8b3ba58e 43 if (config_lookup("noexec")) {
44 code = EPERM;
45 code = send_object(conn, (char *)&code, INTEGER_T);
46 com_err(whoami, code, "Not allowed to execute");
984bd8ef 47 return(0);
8b3ba58e 48 }
de56407f 49 str += 8;
50 while (*str == ' ')
51 str++;
6143ee87 52 mask = sigblock(sigmask(SIGCHLD));
de56407f 53 pid = fork();
54 switch (pid) {
55 case -1:
56 n = errno;
6143ee87 57 sigsetmask(mask);
de56407f 58 log_priority = log_ERROR;
59 com_err(whoami, errno, ": can't fork to run install script");
60 code = send_object(conn, (char *)&n, INTEGER_T);
61 if (code)
62 exit(1);
984bd8ef 63 return(0);
de56407f 64 case 0:
8b3ba58e 65 if (setuid(uid) < 0) {
66 com_err(whoami, errno, "Unable to setuid to %d\n", uid);
67 exit(1);
68 }
e19df9fb 69 sigsetmask(mask);
de56407f 70 execlp(str, str, (char *)NULL);
71 n = errno;
6143ee87 72 sigsetmask(mask);
de56407f 73 log_priority = log_ERROR;
74 com_err(whoami, n, ": %s", str);
75 (void) send_object(conn, (char *)&n, INTEGER_T);
76 exit(1);
77 default:
78 do {
79 n = wait(&waitb);
80 } while (n != -1 && n != pid);
6143ee87 81 sigsetmask(mask);
984bd8ef 82 if (WEXITSTATUS(waitb)) {
83 n = WEXITSTATUS(waitb) + ERROR_TABLE_BASE_sms;
de56407f 84 log_priority = log_ERROR;
984bd8ef 85 com_err(whoami, n, " child exited with status %d",
86 WEXITSTATUS(waitb));
de56407f 87 code = send_object(conn, (char *)&n, INTEGER_T);
c8dc853f 88 if (code) {
de56407f 89 exit(1);
c8dc853f 90 }
91 } else {
de56407f 92 code = send_ok();
93 if (code)
c8dc853f 94 exit(1);
de56407f 95 }
96 }
97}
This page took 0.129047 seconds and 5 git commands to generate.