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