]> andersk Git - moira.git/blobdiff - update/exec_002.c
add prefix to subnet table & queries
[moira.git] / update / exec_002.c
index f0fbbf4636854db5415efda5595f21818ee468b4..03188efcd65ea1a2172aa9029a02d2dae947f93a 100644 (file)
@@ -12,42 +12,90 @@ static char *rcsid_exec_002_c = "$Header$";
 
 #include <mit-copyright.h>
 #include <stdio.h>
+#include <errno.h>
+#include <sys/types.h>
+#ifdef _AIX
+#undef _BSD
+#endif
 #include <sys/wait.h>
+#ifdef _AIX
+#define _BSD 44
+#endif
 #include <signal.h>
 #include <gdb.h>
-#include <sms.h>
+#include <moira.h>
 #include "update.h"
-#include "kludge.h"
 
 extern CONNECTION conn;
-extern int code, errno;
+extern int code, errno, uid;
+extern char *whoami;
+
+#if defined(vax) || defined(ibm032)
+#define WEXITSTATUS(waitb) ((waitb).w_retcode)
+#endif
+
 
 int
 exec_002(str)
     char *str;
 {
+#ifdef POSIX
+    int waitb;
+    sigset_t mask,oldmask;
+#else
     union wait waitb;
-    int n, pid, mask;
+    int mask;
+#endif
+    int n, pid;
 
+    if (config_lookup("noexec")) {
+       code = EPERM;
+       code = send_object(conn, (char *)&code, INTEGER_T);
+       com_err(whoami, code, "Not allowed to execute");
+       return(0);
+    }
     str += 8;
     while (*str == ' ')
        str++;
+#ifdef POSIX
+    sigemptyset(&mask);
+    sigaddset(&mask,SIGCHLD);
+    sigprocmask(SIG_BLOCK,&mask,&oldmask);
+#else
     mask = sigblock(sigmask(SIGCHLD));
+#endif
     pid = fork();
     switch (pid) {
     case -1:
        n = errno;
+#ifdef POSIX
+       sigprocmask(SIG_UNBLOCK,&oldmask,&mask);
+#else
        sigsetmask(mask);
+#endif
        log_priority = log_ERROR;
        com_err(whoami, errno, ": can't fork to run install script");
        code = send_object(conn, (char *)&n, INTEGER_T);
        if (code)
            exit(1);
-       return;
+       return(0);
     case 0:
+       if (setuid(uid) < 0) {
+           com_err(whoami, errno, "Unable to setuid to %d\n", uid);
+           exit(1);
+       }
+#ifdef POSIX
+       sigprocmask(SIG_UNBLOCK,&oldmask,&mask);
+#else
+       sigsetmask(mask);
+#endif
        execlp(str, str, (char *)NULL);
        n = errno;
+#ifdef POSIX
+       sigprocmask(SIG_UNBLOCK,&oldmask,&mask);
+#else
        sigsetmask(mask);
+#endif
        log_priority = log_ERROR;
        com_err(whoami, n, ": %s", str);
        (void) send_object(conn, (char *)&n, INTEGER_T);
@@ -56,11 +104,24 @@ exec_002(str)
        do {
            n = wait(&waitb);
        } while (n != -1 && n != pid);
+#ifdef POSIX
+       sigprocmask(SIG_UNBLOCK,&oldmask,&mask);
+#else
        sigsetmask(mask);
+#endif
+#ifdef POSIX
+       if (WIFEXITED(waitb)) {
+           n = WEXITSTATUS(waitb) + ERROR_TABLE_BASE_sms;
+           log_priority = log_ERROR;
+           com_err(whoami, n, " child exited with status %d",
+                   WEXITSTATUS(waitb));
+#else
        if (waitb.w_status) {
            n = waitb.w_retcode + ERROR_TABLE_BASE_sms;
            log_priority = log_ERROR;
-           com_err(whoami, n, " child exited with status %d", waitb.w_retcode);
+           com_err(whoami, n, " child exited with status %d",
+                   waitb.w_retcode);
+#endif
            code = send_object(conn, (char *)&n, INTEGER_T);
            if (code) {
                exit(1);
This page took 0.218791 seconds and 4 git commands to generate.