/* * $Source$ * $Author$ * $Header$ * * Copyright (C) 1987 by the Massachusetts Institute of Technology * For copying and distribution information, please see the file * . * * This program starts the moira server in a "clean" environment. * and then waits for it to exit. * */ #ifndef lint static char *rcsid_mr_starter_c = "$Header$"; #endif lint #include #include #include #include #include #include #include #include #include #include #include #include #define PROG "moirad" int rdpipe[2]; char *whoami; cleanup() { int stat; char buf[BUFSIZ]; extern int errno; int serrno = errno; buf[0]='\0'; while (waitpid(-1, &stat, WNOHANG) > 0) { if (WIFEXITED(stat)) { if (WEXITSTATUS(stat)) { sprintf(buf, "exited with code %d\n", WEXITSTATUS(stat)); send_zgram("startmoira", buf); } } if (WIFSIGNALED(stat)) { sprintf(buf, "exited on signal %d%s\n", WTERMSIG(stat), (WCOREDUMP(stat)?"; Core dumped":0)); if(WCOREDUMP(stat)) send_zgram("startmoira", buf); } write(rdpipe[1], buf, strlen(buf)); close(rdpipe[1]); } errno = serrno; } main(argc, argv) int argc; char *argv[]; { char buf[BUFSIZ]; FILE *log, *prog; int logf, inf, i, done, pid, tty; struct rlimit rl; extern int errno; extern char *sys_errlist[]; struct sigaction action; int nfds; whoami = argv[0]; getrlimit(RLIMIT_NOFILE, &rl); nfds = rl.rlim_cur; action.sa_handler = cleanup; action.sa_flags = 0; sigemptyset(&action.sa_mask); sigaction(SIGCHLD, &action, NULL); sprintf(buf, "%s/moira.log", SMS_DIR); logf = open(buf, O_CREAT|O_WRONLY|O_APPEND, 0640); if (logf<0) { perror(buf); exit(1); } inf = open("/dev/null", O_RDONLY , 0); if (inf < 0) { perror("/dev/null"); exit(1); } pipe(rdpipe); if (fork()) { exit(0); } chdir("/"); close(0); close(1); close(2); dup2(inf, 0); dup2(inf, 1); dup2(inf, 2); setpgrp(); sprintf(buf, "%s/%s", BIN_DIR, PROG); if ((pid = fork()) == 0) { dup2(inf, 0); dup2(rdpipe[1], 1); dup2(1,2); for (i = 3; i