X-Git-Url: http://andersk.mit.edu/gitweb/moira.git/blobdiff_plain/7ac48069b111a991ee5975cb6088c4563b57b670..ea0caf4a83b273a8b146ffa0b87e07cb66c8ed3e:/update/exec_002.c diff --git a/update/exec_002.c b/update/exec_002.c index aeec495c..77e1c23f 100644 --- a/update/exec_002.c +++ b/update/exec_002.c @@ -17,32 +17,27 @@ #include #include -#include - RCSID("$Header$"); -extern CONNECTION conn; -extern int code, uid, log_priority, have_authorization; -extern char *whoami; - -int exec_002(char *str) +void exec_002(int conn, char *str) { - int waitb; + int waitb, n; sigset_t mask, oldmask; - int n, pid; + pid_t pid; + long code; if (!have_authorization) { - reject_call(MR_PERM); - return 0; + 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; + send_int(conn, EPERM); + com_err(whoami, EPERM, "Not allowed to execute"); + return; } + str += 8; while (*str == ' ') str++; @@ -55,12 +50,12 @@ int exec_002(char *str) case -1: n = errno; sigprocmask(SIG_UNBLOCK, &oldmask, &mask); - log_priority = log_ERROR; - com_err(whoami, errno, ": can't fork to run install script"); - code = send_object(conn, (char *)&n, INTEGER_T); + com_err(whoami, n, ": can't fork to run install script"); + code = send_int(conn, n); if (code) exit(1); - return 0; + return; + case 0: if (setuid(uid) < 0) { @@ -71,19 +66,19 @@ int exec_002(char *str) execlp(str, str, NULL); n = errno; sigprocmask(SIG_UNBLOCK, &oldmask, &mask); - log_priority = log_ERROR; com_err(whoami, n, ": %s", str); - send_object(conn, (char *)&n, INTEGER_T); + send_int(conn, n); exit(1); + default: do n = wait(&waitb); while (n != -1 && n != pid); + sigprocmask(SIG_UNBLOCK, &oldmask, &mask); if ((WIFEXITED(waitb) && (WEXITSTATUS(waitb) != 0)) || WIFSIGNALED(waitb)) { - log_priority = log_ERROR; if (WIFSIGNALED(waitb)) { n = MR_COREDUMP; @@ -96,16 +91,16 @@ int exec_002(char *str) com_err(whoami, n, " child exited with status %d", WEXITSTATUS(waitb)); } - code = send_object(conn, (char *)&n, INTEGER_T); + code = send_int(conn, n); if (code) exit(1); } else { - code = send_ok(); + code = send_ok(conn); if (code) exit(1); } } - return 0; + return; }