xref: /csrg-svn/usr.bin/pascal/pix/pix.c (revision 67250)
148106Sbostic /*-
262175Sbostic  * Copyright (c) 1980, 1993
362175Sbostic  *	The Regents of the University of California.  All rights reserved.
448106Sbostic  *
548106Sbostic  * %sccs.include.redist.c%
622262Sdist  */
72948Smckusic 
822262Sdist #ifndef lint
962175Sbostic static char copyright[] =
1062175Sbostic "@(#) Copyright (c) 1980, 1993\n\
1162175Sbostic 	The Regents of the University of California.  All rights reserved.\n";
1248106Sbostic #endif /* not lint */
132948Smckusic 
1422262Sdist #ifndef lint
15*67250Smckusick static char sccsid[] = "@(#)pix.c	8.2 (Berkeley) 05/27/94";
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 
29*67250Smckusick char	argname[] = "-o/tmp/pixaXXXXX";
30*67250Smckusick char	*name = &argname[2];
312839Swnj 
322839Swnj int	onintr();
332839Swnj 
342839Swnj #define	ETXTBSY	26
352839Swnj 
main(argc,argv)362839Swnj main(argc, argv)
372839Swnj 	int argc;
382839Swnj 	char *argv[];
392839Swnj {
402839Swnj 	register char **av;
412839Swnj 	register int ac;
422839Swnj 	int i, io, pid, status;
432839Swnj 	extern errno;
442839Swnj 
452839Swnj 	do
462839Swnj 		io = open("/dev/null", 0);
472839Swnj 	while (io >= 0 && io < 3);
482839Swnj 	for (io = 3; io < 15; io++)
492839Swnj 		close(io);
502839Swnj 	if ((signal(2, 1) & 01) == 0)
512839Swnj 		signal(2, onintr);
522839Swnj 	for (ac = 1; ac < argc; ac++)
532839Swnj 		if (dotted(argv[ac], 'p')) {
542839Swnj 			ac++;
552839Swnj 			break;
562839Swnj 		}
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 
dotted(cp,ch)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 
onintr()1182839Swnj onintr()
1192839Swnj {
1202839Swnj 
1212839Swnj 	signal(2, 1);
1222839Swnj 	unlink(name);
1232839Swnj 	exit(1);
1242839Swnj }
125