X-Git-Url: http://andersk.mit.edu/gitweb/moira.git/blobdiff_plain/3c46fcae107ba0b8c949df3202d74b84e9d5025f..34b6375ca4de11ca05f8c6907638a80411a8bfa9:/server/startmoira.c diff --git a/server/startmoira.c b/server/startmoira.c index 9f6a9e69..a85bc680 100644 --- a/server/startmoira.c +++ b/server/startmoira.c @@ -1,179 +1,156 @@ -/* - * $Source$ - * $Author$ - * $Header$ +/* $Id$ * - * Copyright (C) 1987 by the Massachusetts Institute of Technology - * - * This program starts the sms server in a "clean" environment. - * and then waits for it to exit. - * - * $Log$ - * Revision 1.1 1987-06-01 03:35:33 wesommer - * Initial revision + * This program starts the moira server in a "clean" environment. + * and then waits for it to exit. * + * Copyright (C) 1987-1998 by the Massachusetts Institute of Technology + * For copying and distribution information, please see the file + * . */ -#ifndef lint -static char *rcsid_sms_starter_c = "$Header$"; -#endif lint +#include +#include +#include -#include -#include -#include +#include #include -#include -#include -#define SMS_LOG_FILE "/u1/sms/sms.log" +#include +#include +#include +#include +#include +#include + +RCSID("$Header$"); -#define SMS_PROG "/u1/sms/rpc/smsd" +#define PROG "moirad" int rdpipe[2]; -char *sigdescr[] = { - 0, - "hangup", - "interrupt", - "quit", - "illegal instruction", - "trace/BPT trap", - "IOT trap", - "EMT trap", - "floating exception", - "kill", - "bus error", - "segmentation violation", - "bad system call", - "broken pipe", - "alarm clock", - "termination", - "urgent I/O condition", - "stopped", - "stopped", - "continued", - "child exited", - "stopped (tty input)", - "stopped (tty output)", - "I/O possible", - "cputime limit exceeded", - "filesize limit exceeded", - "virtual timer expired", - "profiling timer expired", - "window size changed", - "signal 29", - "user defined signal 1", - "user defined signal 2", - "signal 32" -}; - -cleanup() +char *whoami; +void cleanup(void); + +void cleanup(void) { - union wait stat; - char buf[BUFSIZ]; - extern int errno; - int serrno = errno; - - buf[0]='\0'; - - while (wait3(&stat, WNOHANG, 0) > 0) { - if (WIFEXITED(stat)) { - if (stat.w_retcode) - sprintf(buf, - "exited with code %d\n", - stat.w_retcode); - } - if (WIFSIGNALED(stat)) { - sprintf(buf, "exited on %s signal%s\n", - sigdescr[stat.w_termsig], - (stat.w_coredump?"; Core dumped":0)); - } - write(rdpipe[1], buf, strlen(buf)); - close(rdpipe[1]); + int stat, serrno = errno; + char buf[BUFSIZ]; + + buf[0] = '\0'; + + while (waitpid(-1, &stat, WNOHANG) > 0) + { + if (WIFEXITED(stat)) + { + if (WEXITSTATUS(stat)) + { + sprintf(buf, "exited with code %d\n", WEXITSTATUS(stat)); + critical_alert("startmoira", "%s", buf); + } + } + if (WIFSIGNALED(stat)) + { + sprintf(buf, "exited on signal %d%s\n", WTERMSIG(stat), + (WCOREDUMP(stat) ? "; Core dumped" : "")); + if (WCOREDUMP(stat)) + critical_alert("startmoira", "%s", buf); } - errno = serrno; + write(rdpipe[1], buf, strlen(buf)); + close(rdpipe[1]); + } + errno = serrno; } -main(argc, argv) +int main(int argc, char *argv[]) { - char buf[BUFSIZ]; - FILE *log, *prog; - int logf, inf, i, done, pid, tty; - - extern int errno; - extern char *sys_errlist[]; - - int nfds = getdtablesize(); - - setreuid(0); - signal(SIGCHLD, cleanup); - - logf = open(SMS_LOG_FILE, O_CREAT|O_WRONLY|O_APPEND, 0640); - if (logf<0) { - perror(SMS_LOG_FILE); - exit(1); - } - inf = open("/dev/null", O_RDONLY , 0); - if (inf < 0) { - perror("/dev/null"); - exit(1); - } - pipe(rdpipe); - if (fork()) { - exit(); - } - chdir("/"); - close(0); - close(1); - close(2); - dup2(inf, 0); - dup2(inf, 1); - dup2(inf, 2); - - tty = open("/dev/tty"); - ioctl(tty, TIOCNOTTY, 0); - close(tty); - - if ((pid = fork()) == 0) { - - dup2(inf, 0); - dup2(rdpipe[1], 1); - dup2(1,2); - for (i = 3; i