From 4297fecb32cfa679d7611d2adb3274f2dc366393 Mon Sep 17 00:00:00 2001 From: wesommer Date: Wed, 9 Sep 1987 08:43:21 +0000 Subject: [PATCH] Initial revision --- dcm/startdcm.c | 176 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 dcm/startdcm.c diff --git a/dcm/startdcm.c b/dcm/startdcm.c new file mode 100644 index 00000000..9888fb69 --- /dev/null +++ b/dcm/startdcm.c @@ -0,0 +1,176 @@ +/* + * $Source$ + * $Author$ + * $Header$ + * + * Copyright (C) 1987 by the Massachusetts Institute of Technology + * + * This program starts the DCM 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/dcm.log" + +#define SMS_PROG "/u1/sms/bin/dcm" + +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); +} + + + + -- 2.45.2