xref: /csrg-svn/usr.bin/pascal/pix/pix.c (revision 10567)
12948Smckusic /* Copyright (c) 1979 Regents of the University of California */
22948Smckusic 
3*10567Smckusick static char sccsid[] = "@(#)pix.c 1.4 01/22/83";
42948Smckusic 
52839Swnj /*
62839Swnj  * pix - pi then px
72839Swnj  *
82839Swnj  * Bill Joy UCB August 26, 1977
92839Swnj  */
102839Swnj 
112948Smckusic #include "whoami.h"
122948Smckusic #include "objfmt.h"
13*10567Smckusick #include "config.h"
142839Swnj #define	ERRS	1
152839Swnj 
162839Swnj char	*name;
172839Swnj 
182839Swnj int	onintr();
192839Swnj 
202839Swnj #define	ETXTBSY	26
212839Swnj 
222839Swnj main(argc, argv)
232839Swnj 	int argc;
242839Swnj 	char *argv[];
252839Swnj {
262839Swnj 	register char **av;
272839Swnj 	register int ac;
282839Swnj 	int i, io, pid, status;
292839Swnj 	extern errno;
302839Swnj 
312839Swnj 	do
322839Swnj 		io = open("/dev/null", 0);
332839Swnj 	while (io >= 0 && io < 3);
342839Swnj 	for (io = 3; io < 15; io++)
352839Swnj 		close(io);
362839Swnj 	if ((signal(2, 1) & 01) == 0)
372839Swnj 		signal(2, onintr);
382839Swnj 	for (ac = 1; ac < argc; ac++)
392839Swnj 		if (dotted(argv[ac], 'p')) {
402839Swnj 			ac++;
412839Swnj 			break;
422839Swnj 		}
432839Swnj 	name = "-o/tmp/pixaXXXXX" + 2;
442839Swnj 	mktemp(name);
452839Swnj 	for (;;) {
462839Swnj 		io = creat(name, 0400);
472839Swnj 		if (io > 0)
482839Swnj 			break;
492839Swnj 		if (name[8] == 'z') {
502839Swnj 			perror(name);
512839Swnj 			exit(1);
522839Swnj 		}
532839Swnj 		name[8]++;
542839Swnj 	}
552839Swnj 	pid = fork();
562839Swnj 	if (pid == -1) {
572839Swnj 		write(2, "No more processes\n", 18);
582839Swnj 		onintr();
592839Swnj 	}
602839Swnj 	if (pid == 0) {
612839Swnj 		if (io != 3) {
622839Swnj 			write(2, "Impossible error in pix\n", 24);
632839Swnj 			onintr();
642839Swnj 		}
652839Swnj 		argv[ac] = 0;
662839Swnj 		argv[0] = name - 2;
672839Swnj 		do
68*10567Smckusick 			execv(pi_comp, argv);
692839Swnj 		while (errno == ETXTBSY);
702839Swnj 		write(2, "Can't find pi\n", 14);
712839Swnj 		onintr();
722839Swnj 	}
732839Swnj 	close(io);
742839Swnj 	do
752839Swnj 		i = wait(&status);
762839Swnj 	while (i != pid && i != -1);
772839Swnj 	if (i == -1 || (status & 0377))
782839Swnj 		onintr();
792839Swnj 	if (status != 0) {
802839Swnj 		if ((status >> 8) == ERRS)
812839Swnj 			write(2, "Execution suppressed due to compilation errors\n", 47);
822839Swnj 		onintr();
832839Swnj 	}
842839Swnj 	ac--;
855641Smckusic 	argv[ac] = name;
865641Smckusic 	ac--;
875641Smckusic 	argv[ac] = "pix";
882839Swnj 	argv[argc] = 0;
892839Swnj 	do
90*10567Smckusick 		execv(px_debug, &argv[ac]);
912839Swnj 	while (errno == ETXTBSY);
922839Swnj 	write(2, "Can't find px\n", 14);
932839Swnj 	onintr();
942839Swnj }
952839Swnj 
962839Swnj dotted(cp, ch)
972839Swnj 	char *cp, ch;
982839Swnj {
992839Swnj 	register int i;
1002839Swnj 
1012839Swnj 	i = strlen(cp);
1022839Swnj 	return (i > 1 && cp[i - 2] == '.' && cp[i - 1] == ch);
1032839Swnj }
1042839Swnj 
1052839Swnj onintr()
1062839Swnj {
1072839Swnj 
1082839Swnj 	signal(2, 1);
1092839Swnj 	unlink(name);
1102839Swnj 	exit(1);
1112839Swnj }
112