From: wesommer Date: Thu, 10 Sep 1987 22:18:55 +0000 (+0000) Subject: Initial revision X-Git-Tag: BETA5-24-88~51 X-Git-Url: http://andersk.mit.edu/gitweb/moira.git/commitdiff_plain/a3c170f4d64fcec6abaf79c61e77e23569393514 Initial revision --- diff --git a/reg_svr/startreg.c b/reg_svr/startreg.c new file mode 100644 index 00000000..7f18d3de --- /dev/null +++ b/reg_svr/startreg.c @@ -0,0 +1,176 @@ +/* + * $Source$ + * $Author$ + * $Header$ + * + * Copyright (C) 1987 by the Massachusetts Institute of Technology + * + * This program starts the user registration server + * in a "clean" environment, and then waits for it to exit. + */ + +#ifndef lint +static char *rcsid_sms_starter_c = "$Header$"; +#endif lint + +#include +#include +#include +#include +#include +#include +#include + +#define SMS_LOG_FILE "/u1/sms/reg_svr.log" + +#define SMS_PROG "/u1/sms/bin/reg_svr" + +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() +{ + 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]); + } + errno = serrno; +} + +main(argc, 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 %s", time_s, pid, buf); + fflush(log); + } while (!done); + exit(0); +} + + + +