xref: /csrg-svn/usr.bin/pascal/pix/pix.c (revision 2839)
1*2839Swnj #
2*2839Swnj /*
3*2839Swnj  * pix - pi then px
4*2839Swnj  *
5*2839Swnj  * Bill Joy UCB August 26, 1977
6*2839Swnj  */
7*2839Swnj static	char *sccsid = "@(#)pix.c	1.1 (Berkeley) 03/02/81";
8*2839Swnj 
9*2839Swnj #define	ERRS	1
10*2839Swnj 
11*2839Swnj char	*name;
12*2839Swnj 
13*2839Swnj int	onintr();
14*2839Swnj 
15*2839Swnj #define	ETXTBSY	26
16*2839Swnj 
17*2839Swnj main(argc, argv)
18*2839Swnj 	int argc;
19*2839Swnj 	char *argv[];
20*2839Swnj {
21*2839Swnj 	register char **av;
22*2839Swnj 	register int ac;
23*2839Swnj 	int i, io, pid, status;
24*2839Swnj 	extern errno;
25*2839Swnj 
26*2839Swnj 	do
27*2839Swnj 		io = open("/dev/null", 0);
28*2839Swnj 	while (io >= 0 && io < 3);
29*2839Swnj 	for (io = 3; io < 15; io++)
30*2839Swnj 		close(io);
31*2839Swnj 	if ((signal(2, 1) & 01) == 0)
32*2839Swnj 		signal(2, onintr);
33*2839Swnj 	for (ac = 1; ac < argc; ac++)
34*2839Swnj 		if (dotted(argv[ac], 'p')) {
35*2839Swnj 			ac++;
36*2839Swnj 			break;
37*2839Swnj 		}
38*2839Swnj 	name = "-o/tmp/pixaXXXXX" + 2;
39*2839Swnj 	mktemp(name);
40*2839Swnj 	for (;;) {
41*2839Swnj 		io = creat(name, 0400);
42*2839Swnj 		if (io > 0)
43*2839Swnj 			break;
44*2839Swnj 		if (name[8] == 'z') {
45*2839Swnj 			perror(name);
46*2839Swnj 			exit(1);
47*2839Swnj 		}
48*2839Swnj 		name[8]++;
49*2839Swnj 	}
50*2839Swnj 	pid = fork();
51*2839Swnj 	if (pid == -1) {
52*2839Swnj 		write(2, "No more processes\n", 18);
53*2839Swnj 		onintr();
54*2839Swnj 	}
55*2839Swnj 	if (pid == 0) {
56*2839Swnj 		if (io != 3) {
57*2839Swnj 			write(2, "Impossible error in pix\n", 24);
58*2839Swnj 			onintr();
59*2839Swnj 		}
60*2839Swnj 		argv[ac] = 0;
61*2839Swnj 		argv[0] = name - 2;
62*2839Swnj #ifdef CORY
63*2839Swnj 		/* Temporary to allow accounting to distinguish pix's and pi's */
64*2839Swnj 		do
65*2839Swnj 			execv("/usr/bin/pix-pi", argv);
66*2839Swnj 		while (errno == ETXTBSY);
67*2839Swnj #endif
68*2839Swnj 		do
69*2839Swnj 			execv("/usr/ucb/pi", argv);
70*2839Swnj 		while (errno == ETXTBSY);
71*2839Swnj 		do
72*2839Swnj 			execv("/usr/bin/pi", argv);
73*2839Swnj 		while (errno == ETXTBSY);
74*2839Swnj 		write(2, "Can't find pi\n", 14);
75*2839Swnj 		onintr();
76*2839Swnj 	}
77*2839Swnj 	close(io);
78*2839Swnj 	do
79*2839Swnj 		i = wait(&status);
80*2839Swnj 	while (i != pid && i != -1);
81*2839Swnj 	if (i == -1 || (status & 0377))
82*2839Swnj 		onintr();
83*2839Swnj 	if (status != 0) {
84*2839Swnj 		if ((status >> 8) == ERRS)
85*2839Swnj 			write(2, "Execution suppressed due to compilation errors\n", 47);
86*2839Swnj 		onintr();
87*2839Swnj 	}
88*2839Swnj 	ac--;
89*2839Swnj 	argv[ac] = name - 2;
90*2839Swnj 	argv[argc] = 0;
91*2839Swnj #ifdef CORY
92*2839Swnj 	/* Temporary to allow accounting to distinguish pix's and px's */
93*2839Swnj 	do
94*2839Swnj 		execv("/usr/bin/pix-px", &argv[ac]);
95*2839Swnj 	while (errno == ETXTBSY);
96*2839Swnj #endif
97*2839Swnj 	do
98*2839Swnj 		execv("/usr/ucb/px", &argv[ac]);
99*2839Swnj 	while (errno == ETXTBSY);
100*2839Swnj 	do
101*2839Swnj 		execv("/usr/bin/px", &argv[ac]);
102*2839Swnj 	while (errno == ETXTBSY);
103*2839Swnj 	write(2, "Can't find px\n", 14);
104*2839Swnj 	onintr();
105*2839Swnj }
106*2839Swnj 
107*2839Swnj dotted(cp, ch)
108*2839Swnj 	char *cp, ch;
109*2839Swnj {
110*2839Swnj 	register int i;
111*2839Swnj 
112*2839Swnj 	i = strlen(cp);
113*2839Swnj 	return (i > 1 && cp[i - 2] == '.' && cp[i - 1] == ch);
114*2839Swnj }
115*2839Swnj 
116*2839Swnj onintr()
117*2839Swnj {
118*2839Swnj 
119*2839Swnj 	signal(2, 1);
120*2839Swnj 	unlink(name);
121*2839Swnj 	exit(1);
122*2839Swnj }
123