Minix1.5/amoeba/util/master.c
#include <signal.h>
char console[] = "/dev/console";
run(uid, gid, argv)
char **argv;
{
for (;;)
switch (fork()) {
default:
return;
case 0:
if (setgid(gid) < 0) perror("can't set gid");
if (setuid(uid) < 0) perror("can't set uid");
/*
execvp(*argv, argv);
*/
execv(*argv, argv);
perror("master: exec'ing");
prints("can't execute %s\n", *argv);
/*
kill(getppid(), SIGTERM);
*/
/* If the exec failed, don't try it again immediately.
* Give the kernel a chance to do something else.
*/
sleep (5);
_exit(1);
case -1:
sleep(10);
}
}
main(argc, argv)
char **argv;
{
register n, uid, gid;
/* Minix can't do this
setpgrp(getpid(), getpid());
*/
if (argc < 4) {
prints("Usage: master # uid gid command args ...\n");
return(1);
}
n = atoi(argv[1]);
if (n < 1 || n > 20) {
prints("Bad count.\n");
return(1);
}
signal(SIGHUP, SIG_IGN);
signal(SIGINT, SIG_IGN);
signal(SIGQUIT, SIG_IGN);
/* Put the program into the background. */
switch (fork()) {
case 0:
break;
case -1:
perror(argv[0]);
return 1;
default:
return 0;
}
uid = atoi(argv[2]);
gid = atoi(argv[3]);
/* Start n copies of the program. */
do
run(uid, gid, &argv[4]);
while (--n);
/* Replace each one that dies. */
while (wait((int *) 0) > 0)
run(uid, gid, &argv[4]);
return(0);
}