Minix1.5/amoeba/util/master.c

Compare this file to the similar file:
Show the results in this format:

#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);
}