]> andersk Git - moira.git/blame - update/exec_002.c
use CODE=ANSI_C option to proc
[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$";
7da203a3 11#endif
de56407f 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;
994657b2 24extern int code, errno, uid, log_priority, have_authorization;
8b3ba58e 25extern char *whoami;
26
5eaef520 27int exec_002(char *str)
de56407f 28{
5eaef520 29 int waitb;
30 sigset_t mask, oldmask;
31 int n, pid;
de56407f 32
5eaef520 33 if (!have_authorization)
34 {
35 reject_call(MR_PERM);
36 return 0;
994657b2 37 }
5eaef520 38 if (config_lookup("noexec"))
39 {
40 code = EPERM;
41 send_object(conn, (char *)&code, INTEGER_T);
42 com_err(whoami, code, "Not allowed to execute");
43 return 0;
8b3ba58e 44 }
5eaef520 45 str += 8;
46 while (*str == ' ')
47 str++;
48 sigemptyset(&mask);
49 sigaddset(&mask, SIGCHLD);
50 sigprocmask(SIG_BLOCK, &mask, &oldmask);
51 pid = fork();
52 switch (pid)
53 {
de56407f 54 case -1:
5eaef520 55 n = errno;
56 sigprocmask(SIG_UNBLOCK, &oldmask, &mask);
57 log_priority = log_ERROR;
58 com_err(whoami, errno, ": can't fork to run install script");
59 code = send_object(conn, (char *)&n, INTEGER_T);
60 if (code)
61 exit(1);
62 return 0;
de56407f 63 case 0:
5eaef520 64 if (setuid(uid) < 0)
65 {
66 com_err(whoami, errno, "Unable to setuid to %d\n", uid);
67 exit(1);
8b3ba58e 68 }
5eaef520 69 sigprocmask(SIG_UNBLOCK, &oldmask, &mask);
70 execlp(str, str, NULL);
71 n = errno;
72 sigprocmask(SIG_UNBLOCK, &oldmask, &mask);
73 log_priority = log_ERROR;
74 com_err(whoami, n, ": %s", str);
75 send_object(conn, (char *)&n, INTEGER_T);
76 exit(1);
de56407f 77 default:
5eaef520 78 do
79 n = wait(&waitb);
80 while (n != -1 && n != pid);
81 sigprocmask(SIG_UNBLOCK, &oldmask, &mask);
82 if ((WIFEXITED(waitb) && (WEXITSTATUS(waitb) != 0)) ||
83 WIFSIGNALED(waitb))
84 {
85 log_priority = log_ERROR;
86 if (WIFSIGNALED(waitb))
87 {
88 n = MR_COREDUMP;
89 com_err(whoami, n, " child exited on signal %d",
90 WTERMSIG(waitb));
585b298c 91 }
5eaef520 92 else
93 {
94 n = WEXITSTATUS(waitb) + ERROR_TABLE_BASE_sms;
95 com_err(whoami, n, " child exited with status %d",
96 WEXITSTATUS(waitb));
c8dc853f 97 }
5eaef520 98 code = send_object(conn, (char *)&n, INTEGER_T);
99 if (code)
100 exit(1);
101 }
102 else
103 {
104 code = send_ok();
105 if (code)
106 exit(1);
de56407f 107 }
108 }
109}
This page took 0.096515 seconds and 5 git commands to generate.