* $Author$
* $Header$
*
- * Copyright (C) 1987 by the Massachusetts Institute of Technology
+ * Copyright (C) 1987, 1988 by the Massachusetts Institute of Technology
+ * For copying and distribution information, please see the file
+ * <mit-copyright.h>.
*
* 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$";
+static char *rcsid_mr_starter_c = "$Header$";
#endif lint
+#include <mit-copyright.h>
+#include <errno.h>
#include <stdio.h>
-#include <strings.h>
+#include <string.h>
#include <sys/types.h>
#include <sys/file.h>
#include <sys/wait.h>
#include <sys/signal.h>
#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <sys/resource.h>
+#include <moira_site.h>
+#include <time.h>
-#define SMS_LOG_FILE "/u1/sms/dcm.log"
-
-#define SMS_PROG "/u1/sms/bin/dcm"
+#define PROG "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"
-};
+extern int errno;
-cleanup()
+void cleanup()
{
- union wait stat;
+ int stat, serrno = errno;
char buf[BUFSIZ];
- extern int errno;
- int serrno = errno;
buf[0]='\0';
- while (wait3(&stat, WNOHANG, 0) > 0) {
+ while (waitpid(-1, &stat, WNOHANG) > 0) {
if (WIFEXITED(stat)) {
- if (stat.w_retcode)
+ if (WEXITSTATUS(stat))
sprintf(buf,
"exited with code %d\n",
- stat.w_retcode);
+ WEXITSTATUS(stat));
}
if (WIFSIGNALED(stat)) {
- sprintf(buf, "exited on %s signal%s\n",
- sigdescr[stat.w_termsig],
- (stat.w_coredump?"; Core dumped":0));
+ sprintf(buf, "exited on signal %d%s\n",
+ WTERMSIG(stat),
+ (WCOREDUMP(stat)?"; Core dumped":0));
}
write(rdpipe[1], buf, strlen(buf));
close(rdpipe[1]);
char buf[BUFSIZ];
FILE *log, *prog;
int logf, inf, i, done, pid, tty;
+ struct rlimit rl;
extern int errno;
extern char *sys_errlist[];
- int nfds = getdtablesize();
+ struct sigaction action;
+ int nfds;
- setreuid(0);
- signal(SIGCHLD, cleanup);
+ getrlimit(RLIMIT_NOFILE, &rl);
+ nfds = rl.rlim_cur;
+
+ action.sa_handler = cleanup;
+ action.sa_flags = 0;
+ sigemptyset(&action.sa_mask);
+ sigaction(SIGCHLD, &action, NULL);
- logf = open(SMS_LOG_FILE, O_CREAT|O_WRONLY|O_APPEND, 0640);
+ sprintf(buf, "%s/%s.log", SMS_DIR, PROG);
+ logf = open(buf, O_CREAT|O_WRONLY|O_APPEND, 0640);
if (logf<0) {
- perror(SMS_LOG_FILE);
+ perror(buf);
exit(1);
}
inf = open("/dev/null", O_RDONLY , 0);
}
pipe(rdpipe);
if (fork()) {
- exit();
+ exit(0);
}
chdir("/");
close(0);
dup2(inf, 1);
dup2(inf, 2);
- tty = open("/dev/tty");
- ioctl(tty, TIOCNOTTY, 0);
- close(tty);
+ setpgrp();
+ sprintf(buf, "%s/%s", BIN_DIR, PROG);
if ((pid = fork()) == 0) {
dup2(rdpipe[1], 1);
dup2(1,2);
for (i = 3; i <nfds; i++) close(i);
- execl(SMS_PROG, "dcm", 0);
+ execl(buf, PROG, 0);
perror("cannot run dcm");
exit(1);
}
do {
char *time_s;
- extern char *ctime();
long foo;
done = 0;
errno = 0;
if (fgets(buf, BUFSIZ, prog) == NULL) {
- if (errno) {
+ if (errno && errno!=EINTR) {
strcpy(buf, "Unable to read from program: ");
strcat(buf, sys_errlist[errno]);
strcat(buf, "\n");
} while (!done);
exit(0);
}
-
-
-
-