X-Git-Url: http://andersk.mit.edu/gitweb/moira.git/blobdiff_plain/2ad0a7772b908ea4fe0fb4c9b47891842c4a6804..8ca3e3419cff0bb78f72e0e8254bda57c337391a:/update/exec_002.c diff --git a/update/exec_002.c b/update/exec_002.c index 86dc35c9..03188efc 100644 --- a/update/exec_002.c +++ b/update/exec_002.c @@ -12,41 +12,90 @@ static char *rcsid_exec_002_c = "$Header$"; #include #include +#include +#include +#ifdef _AIX +#undef _BSD +#endif #include +#ifdef _AIX +#define _BSD 44 +#endif #include #include #include #include "update.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); @@ -55,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);