1*2841Swnj #include <pagsiz.h>
2*2841Swnj #include <sys/types.h>
3*2841Swnj #include <a.out.h>
4*2841Swnj #include "whoami.h"
5*2841Swnj #include "objfmt.h"
6*2841Swnj 
7*2841Swnj /*
8*2841Swnj  * pxheader - program to sit in front of interpreter code to make shell mods
9*2841Swnj  *	      unnecessary to make Pascal obj's look like real programs.
10*2841Swnj  *
11*2841Swnj  * This program lives in /usr/lib/px_header
12*2841Swnj  * Bill Joy UCB February 6, 1978
13*2841Swnj  */
14*2841Swnj static	char *sccsid = "@(#)px_header.c	1.1 (Berkeley) 03/02/81";
15*2841Swnj 
16*2841Swnj extern	errno;
17*2841Swnj 
18*2841Swnj #define	BUFSIZ	BSIZE
19*2841Swnj #define	ETXTBSY	26
20*2841Swnj #define	ADDR_LC	HEADER_BYTES - sizeof (struct exec) - sizeof (struct pxhdr)
21*2841Swnj 
22*2841Swnj main(argc, argv)
23*2841Swnj 	register int argc;
24*2841Swnj 	register char *argv[];
25*2841Swnj {
26*2841Swnj 	register int i, j;
27*2841Swnj 	register unsigned short *ip;
28*2841Swnj 	char *largv[512];
29*2841Swnj 	int pv[2];
30*2841Swnj 
31*2841Swnj 	if (argc > 510) {
32*2841Swnj 		error("Too many arguments.\n");
33*2841Swnj 		exit(1);
34*2841Swnj 	}
35*2841Swnj 	largv[0] = argv[0];
36*2841Swnj 	largv[1] = "-";
37*2841Swnj 	for (i = 1; i < argc; i++)
38*2841Swnj 		largv[i + 1] = argv[i];
39*2841Swnj 	largv[argc + 1] = 0;
40*2841Swnj 	pipe(pv);
41*2841Swnj 	i = fork();
42*2841Swnj 	if (i == -1)
43*2841Swnj 		error("Try again.\n");
44*2841Swnj 	if (i == 0) {
45*2841Swnj 		close(pv[0]);
46*2841Swnj 		ip = (unsigned short *) (ADDR_LC);
47*2841Swnj 		i = ((struct pxhdr *)(ADDR_LC))->objsize + sizeof(struct pxhdr);
48*2841Swnj 		while (i != 0) {
49*2841Swnj 			j = (i > 0 && i < BUFSIZ) ? i : BUFSIZ;
50*2841Swnj 			write(pv[1], ip, j);
51*2841Swnj 			ip += BUFSIZ / sizeof ( unsigned short );
52*2841Swnj 			i -= j;
53*2841Swnj 		}
54*2841Swnj 		exit(1);
55*2841Swnj 	}
56*2841Swnj 	close(pv[1]);
57*2841Swnj 	if (pv[0] != 3) {
58*2841Swnj 		close(3);
59*2841Swnj 		dup(pv[0]);
60*2841Swnj 		close(pv[0]);
61*2841Swnj 	}
62*2841Swnj 	for (;;) {
63*2841Swnj 		execv(PX_INTRP, largv);
64*2841Swnj 		if (errno != ETXTBSY)
65*2841Swnj 			break;
66*2841Swnj 		sleep(2);
67*2841Swnj 	}
68*2841Swnj 	error("Px not found.\n");
69*2841Swnj }
70*2841Swnj 
71*2841Swnj error(cp)
72*2841Swnj 	register char *cp;
73*2841Swnj {
74*2841Swnj 	register int i;
75*2841Swnj 	register char *dp;
76*2841Swnj 
77*2841Swnj 	dp = cp;
78*2841Swnj 	i = 0;
79*2841Swnj 	while (*dp++)
80*2841Swnj 		i++;
81*2841Swnj 	write(2, cp, i);
82*2841Swnj 	exit(1);
83*2841Swnj }
84*2841Swnj 
85*2841Swnj exit(i)
86*2841Swnj {
87*2841Swnj 	_exit(i);
88*2841Swnj }
89