]> andersk Git - moira.git/blobdiff - update/exec_002.c
Switch from Imake-based build system to autoconf-based.
[moira.git] / update / exec_002.c
index fcf0d96ff1437003f3b94aada4c684f686e65d80..77e1c23f827529902240823ee82a0650861dce03 100644 (file)
-/*
- *     $Source$
- *     $Header$
+/* $Id$
+ *
+ * Copyright (C) 1988-1998 by the Massachusetts Institute of Technology.
+ * For copying and distribution information, please see the file
+ * <mit-copyright.h>.
  */
-/*  (c) Copyright 1988 by the Massachusetts Institute of Technology. */
-/*  For copying and distribution information, please see the file */
-/*  <mit-copyright.h>. */
-
-#ifndef lint
-static char *rcsid_exec_002_c = "$Header$";
-#endif
 
 #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 <moira.h>
+#include "update_server.h"
 #include "update.h"
 
-extern CONNECTION conn;
-extern int code, errno, uid, log_priority, have_authorization;
-extern char *whoami;
+#include <sys/wait.h>
 
-#if defined(vax) || defined(ibm032)
-#define WEXITSTATUS(waitb) ((waitb).w_retcode)
-#endif
+#include <errno.h>
+#include <signal.h>
+#include <stdio.h>
+#include <unistd.h>
 
+RCSID("$Header$");
 
-int
-exec_002(str)
-    char *str;
+void exec_002(int conn, char *str)
 {
-#ifdef POSIX
-    int waitb;
-    sigset_t mask,oldmask;
-#else
-    union wait waitb;
-    int mask;
-#endif
-    int n, pid;
+  int waitb, n;
+  sigset_t mask, oldmask;
+  pid_t pid;
+  long code;
 
-    if (!have_authorization) {
-       reject_call(MR_PERM);
-       return(0);
+  if (!have_authorization)
+    {
+      send_int(conn, MR_PERM);
+      return;
     }
-    if (config_lookup("noexec")) {
-       code = EPERM;
-       send_object(conn, (char *)&code, INTEGER_T);
-       com_err(whoami, code, "Not allowed to execute");
-       return(0);
+  if (config_lookup("noexec"))
+    {
+      send_int(conn, EPERM);
+      com_err(whoami, EPERM, "Not allowed to execute");
+      return;
     }
-    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) {
+
+  str += 8;
+  while (*str == ' ')
+    str++;
+  sigemptyset(&mask);
+  sigaddset(&mask, SIGCHLD);
+  sigprocmask(SIG_BLOCK, &mask, &oldmask);
+  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(0);
+      n = errno;
+      sigprocmask(SIG_UNBLOCK, &oldmask, &mask);
+      com_err(whoami, n, ": can't fork to run install script");
+      code = send_int(conn, n);
+      if (code)
+       exit(1);
+      return;
+
     case 0:
-       if (setuid(uid) < 0) {
-           com_err(whoami, errno, "Unable to setuid to %d\n", uid);
-           exit(1);
+      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);
-       exit(1);
+      sigprocmask(SIG_UNBLOCK, &oldmask, &mask);
+      execlp(str, str, NULL);
+      n = errno;
+      sigprocmask(SIG_UNBLOCK, &oldmask, &mask);
+      com_err(whoami, n, ": %s", str);
+      send_int(conn, n);
+      exit(1);
+
     default:
-       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) && (WEXITSTATUS(waitb)!=0)) || WIFSIGNALED(waitb)  ) {
-           log_priority = log_ERROR;
-           if (WIFSIGNALED(waitb)) {
-               n = MR_COREDUMP;
-               com_err(whoami, n, " child exited on signal %d",
-                       WTERMSIG(waitb));
-           } else {
-               n = WEXITSTATUS(waitb) + ERROR_TABLE_BASE_sms;
-               com_err(whoami, n, " child exited with status %d",
-                       WEXITSTATUS(waitb));
+      do
+       n = wait(&waitb);
+      while (n != -1 && n != pid);
+
+      sigprocmask(SIG_UNBLOCK, &oldmask, &mask);
+      if ((WIFEXITED(waitb) && (WEXITSTATUS(waitb) != 0)) ||
+         WIFSIGNALED(waitb))
+       {
+         if (WIFSIGNALED(waitb))
+           {
+             n = MR_COREDUMP;
+             com_err(whoami, n, " child exited on signal %d",
+                     WTERMSIG(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);
-#endif
-           code = send_object(conn, (char *)&n, INTEGER_T);
-           if (code) {
-               exit(1);
+         else
+           {
+             n = WEXITSTATUS(waitb) + ERROR_TABLE_BASE_sms;
+             com_err(whoami, n, " child exited with status %d",
+                     WEXITSTATUS(waitb));
            }
-       } else {
-           code = send_ok();
-           if (code)
-             exit(1);
+         code = send_int(conn, n);
+         if (code)
+           exit(1);
+       }
+      else
+       {
+         code = send_ok(conn);
+         if (code)
+           exit(1);
        }
     }
+  return;
 }
This page took 0.098592 seconds and 4 git commands to generate.