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