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