xref: /csrg-svn/usr.bin/pascal/pix/pix.c (revision 62175)
148106Sbostic /*-
2*62175Sbostic  * Copyright (c) 1980, 1993
3*62175Sbostic  *	The Regents of the University of California.  All rights reserved.
448106Sbostic  *
548106Sbostic  * %sccs.include.redist.c%
622262Sdist  */
72948Smckusic 
822262Sdist #ifndef lint
9*62175Sbostic static char copyright[] =
10*62175Sbostic "@(#) Copyright (c) 1980, 1993\n\
11*62175Sbostic 	The Regents of the University of California.  All rights reserved.\n";
1248106Sbostic #endif /* not lint */
132948Smckusic 
1422262Sdist #ifndef lint
15*62175Sbostic static char sccsid[] = "@(#)pix.c	8.1 (Berkeley) 06/06/93";
1648106Sbostic #endif /* not lint */
1722262Sdist 
182839Swnj /*
192839Swnj  * pix - pi then px
202839Swnj  *
212839Swnj  * Bill Joy UCB August 26, 1977
222839Swnj  */
232839Swnj 
242948Smckusic #include "whoami.h"
252948Smckusic #include "objfmt.h"
2610567Smckusick #include "config.h"
272839Swnj #define	ERRS	1
282839Swnj 
292839Swnj char	*name;
302839Swnj 
312839Swnj int	onintr();
322839Swnj 
332839Swnj #define	ETXTBSY	26
342839Swnj 
352839Swnj main(argc, argv)
362839Swnj 	int argc;
372839Swnj 	char *argv[];
382839Swnj {
392839Swnj 	register char **av;
402839Swnj 	register int ac;
412839Swnj 	int i, io, pid, status;
422839Swnj 	extern errno;
432839Swnj 
442839Swnj 	do
452839Swnj 		io = open("/dev/null", 0);
462839Swnj 	while (io >= 0 && io < 3);
472839Swnj 	for (io = 3; io < 15; io++)
482839Swnj 		close(io);
492839Swnj 	if ((signal(2, 1) & 01) == 0)
502839Swnj 		signal(2, onintr);
512839Swnj 	for (ac = 1; ac < argc; ac++)
522839Swnj 		if (dotted(argv[ac], 'p')) {
532839Swnj 			ac++;
542839Swnj 			break;
552839Swnj 		}
562839Swnj 	name = "-o/tmp/pixaXXXXX" + 2;
572839Swnj 	mktemp(name);
582839Swnj 	for (;;) {
592839Swnj 		io = creat(name, 0400);
602839Swnj 		if (io > 0)
612839Swnj 			break;
622839Swnj 		if (name[8] == 'z') {
632839Swnj 			perror(name);
642839Swnj 			exit(1);
652839Swnj 		}
662839Swnj 		name[8]++;
672839Swnj 	}
682839Swnj 	pid = fork();
692839Swnj 	if (pid == -1) {
702839Swnj 		write(2, "No more processes\n", 18);
712839Swnj 		onintr();
722839Swnj 	}
732839Swnj 	if (pid == 0) {
742839Swnj 		if (io != 3) {
752839Swnj 			write(2, "Impossible error in pix\n", 24);
762839Swnj 			onintr();
772839Swnj 		}
782839Swnj 		argv[ac] = 0;
792839Swnj 		argv[0] = name - 2;
802839Swnj 		do
8110567Smckusick 			execv(pi_comp, argv);
822839Swnj 		while (errno == ETXTBSY);
832839Swnj 		write(2, "Can't find pi\n", 14);
842839Swnj 		onintr();
852839Swnj 	}
862839Swnj 	close(io);
872839Swnj 	do
882839Swnj 		i = wait(&status);
892839Swnj 	while (i != pid && i != -1);
902839Swnj 	if (i == -1 || (status & 0377))
912839Swnj 		onintr();
922839Swnj 	if (status != 0) {
932839Swnj 		if ((status >> 8) == ERRS)
942839Swnj 			write(2, "Execution suppressed due to compilation errors\n", 47);
952839Swnj 		onintr();
962839Swnj 	}
972839Swnj 	ac--;
985641Smckusic 	argv[ac] = name;
995641Smckusic 	ac--;
1005641Smckusic 	argv[ac] = "pix";
1012839Swnj 	argv[argc] = 0;
1022839Swnj 	do
10310567Smckusick 		execv(px_debug, &argv[ac]);
1042839Swnj 	while (errno == ETXTBSY);
1052839Swnj 	write(2, "Can't find px\n", 14);
1062839Swnj 	onintr();
1072839Swnj }
1082839Swnj 
1092839Swnj dotted(cp, ch)
1102839Swnj 	char *cp, ch;
1112839Swnj {
1122839Swnj 	register int i;
1132839Swnj 
1142839Swnj 	i = strlen(cp);
1152839Swnj 	return (i > 1 && cp[i - 2] == '.' && cp[i - 1] == ch);
1162839Swnj }
1172839Swnj 
1182839Swnj onintr()
1192839Swnj {
1202839Swnj 
1212839Swnj 	signal(2, 1);
1222839Swnj 	unlink(name);
1232839Swnj 	exit(1);
1242839Swnj }
125