xref: /csrg-svn/usr.bin/pascal/pix/pix.c (revision 5641)
12948Smckusic /* Copyright (c) 1979 Regents of the University of California */
22948Smckusic 
3*5641Smckusic static char sccsid[] = "@(#)pix.c 1.3 02/01/82";
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"
132839Swnj #define	ERRS	1
142839Swnj 
152839Swnj char	*name;
162839Swnj 
172839Swnj int	onintr();
182839Swnj 
192839Swnj #define	ETXTBSY	26
202839Swnj 
212839Swnj main(argc, argv)
222839Swnj 	int argc;
232839Swnj 	char *argv[];
242839Swnj {
252839Swnj 	register char **av;
262839Swnj 	register int ac;
272839Swnj 	int i, io, pid, status;
282839Swnj 	extern errno;
292839Swnj 
302839Swnj 	do
312839Swnj 		io = open("/dev/null", 0);
322839Swnj 	while (io >= 0 && io < 3);
332839Swnj 	for (io = 3; io < 15; io++)
342839Swnj 		close(io);
352839Swnj 	if ((signal(2, 1) & 01) == 0)
362839Swnj 		signal(2, onintr);
372839Swnj 	for (ac = 1; ac < argc; ac++)
382839Swnj 		if (dotted(argv[ac], 'p')) {
392839Swnj 			ac++;
402839Swnj 			break;
412839Swnj 		}
422839Swnj 	name = "-o/tmp/pixaXXXXX" + 2;
432839Swnj 	mktemp(name);
442839Swnj 	for (;;) {
452839Swnj 		io = creat(name, 0400);
462839Swnj 		if (io > 0)
472839Swnj 			break;
482839Swnj 		if (name[8] == 'z') {
492839Swnj 			perror(name);
502839Swnj 			exit(1);
512839Swnj 		}
522839Swnj 		name[8]++;
532839Swnj 	}
542839Swnj 	pid = fork();
552839Swnj 	if (pid == -1) {
562839Swnj 		write(2, "No more processes\n", 18);
572839Swnj 		onintr();
582839Swnj 	}
592839Swnj 	if (pid == 0) {
602839Swnj 		if (io != 3) {
612839Swnj 			write(2, "Impossible error in pix\n", 24);
622839Swnj 			onintr();
632839Swnj 		}
642839Swnj 		argv[ac] = 0;
652839Swnj 		argv[0] = name - 2;
662839Swnj 		do
672948Smckusic 			execv(PI_COMP, argv);
682839Swnj 		while (errno == ETXTBSY);
692839Swnj 		write(2, "Can't find pi\n", 14);
702839Swnj 		onintr();
712839Swnj 	}
722839Swnj 	close(io);
732839Swnj 	do
742839Swnj 		i = wait(&status);
752839Swnj 	while (i != pid && i != -1);
762839Swnj 	if (i == -1 || (status & 0377))
772839Swnj 		onintr();
782839Swnj 	if (status != 0) {
792839Swnj 		if ((status >> 8) == ERRS)
802839Swnj 			write(2, "Execution suppressed due to compilation errors\n", 47);
812839Swnj 		onintr();
822839Swnj 	}
832839Swnj 	ac--;
84*5641Smckusic 	argv[ac] = name;
85*5641Smckusic 	ac--;
86*5641Smckusic 	argv[ac] = "pix";
872839Swnj 	argv[argc] = 0;
882839Swnj 	do
89*5641Smckusic 		execv(PX_DEBUG, &argv[ac]);
902839Swnj 	while (errno == ETXTBSY);
912839Swnj 	write(2, "Can't find px\n", 14);
922839Swnj 	onintr();
932839Swnj }
942839Swnj 
952839Swnj dotted(cp, ch)
962839Swnj 	char *cp, ch;
972839Swnj {
982839Swnj 	register int i;
992839Swnj 
1002839Swnj 	i = strlen(cp);
1012839Swnj 	return (i > 1 && cp[i - 2] == '.' && cp[i - 1] == ch);
1022839Swnj }
1032839Swnj 
1042839Swnj onintr()
1052839Swnj {
1062839Swnj 
1072839Swnj 	signal(2, 1);
1082839Swnj 	unlink(name);
1092839Swnj 	exit(1);
1102839Swnj }
111