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