1 /* 2 * pxheader - program to sit in front of interpreter code to make shell mods 3 * unnecessary to make Pascal obj's look like real programs. 4 * 5 * This program lives in /usr/lib/px_header 6 * Bill Joy UCB February 6, 1978 7 */ 8 9 static char sccsid[] = "@(#)px_header.c 1.4 01/22/83"; 10 11 #include <stdio.h> 12 #include <sys/types.h> 13 #include <a.out.h> 14 #include "config.h" 15 #include "whoami.h" 16 #include "objfmt.h" 17 18 #define ETXTBSY 26 19 #define ADDR_LC HEADER_BYTES - sizeof (struct exec) - sizeof (struct pxhdr) 20 #define MAXARGS 512 21 22 extern errno; 23 24 main(argc, argv) 25 register int argc; 26 register char *argv[]; 27 { 28 register int i; 29 int codesiz, symtabsiz; 30 register char *cp; 31 char *largv[MAXARGS]; 32 int fd, pv[2], pid; 33 34 cp = (char *)(ADDR_LC); 35 codesiz = ((struct pxhdr *)(cp))->objsize + sizeof(struct pxhdr); 36 symtabsiz = ((struct pxhdr *)(cp))->symtabsize; 37 if (argc > MAXARGS - 3) 38 error(2, "Too many arguments.\n"); 39 if (symtabsiz != 0) { 40 largv[0] = "pxhdr"; 41 largv[1] = "/tmp/px00000"; 42 cp = &largv[1][11]; 43 for (i = getpid(); i > 0; i /= 10) 44 *cp-- = '0' + i % 10; 45 fd = creat(largv[1], 0444); 46 if (fd < 0) 47 error(3, "Cannot create /tmp file\n"); 48 for (i = 0; i < argc; i++) 49 largv[i + 2] = argv[i]; 50 largv[argc + 2] = 0; 51 writeobj(fd, codesiz, symtabsiz); 52 run(px_debug, largv); 53 /* no return */ 54 } 55 largv[0] = "pipe"; 56 for (i = 0; i < argc; i++) 57 largv[i + 1] = argv[i]; 58 largv[argc + 1] = 0; 59 pipe(pv); 60 pid = fork(); 61 if (pid != 0) { 62 if (pv[0] != 3) { 63 close(3); 64 dup(pv[0]); 65 close(pv[0]); 66 } 67 close(pv[1]); 68 run(px_intrp, largv); 69 /* no return */ 70 } 71 writeobj(pv[1], codesiz, symtabsiz); 72 exit(0); 73 } 74 75 writeobj(fd, codesiz, symtabsiz) 76 int fd; 77 int codesiz, symtabsiz; 78 { 79 int i; 80 register char *cp; 81 82 cp = (char *)(ADDR_LC); 83 while (codesiz != 0) { 84 i = (codesiz < BUFSIZ) ? codesiz : BUFSIZ; 85 write(fd, cp, i); 86 cp += i; 87 codesiz -= i; 88 } 89 while (symtabsiz != 0) { 90 i = (symtabsiz < BUFSIZ) ? symtabsiz : BUFSIZ; 91 write(fd, cp, i); 92 cp += i; 93 symtabsiz -= i; 94 } 95 close(fd); 96 } 97 98 run(prog, args) 99 char *prog; 100 char **args; 101 { 102 for (;;) { 103 execv(prog, args); 104 if (errno != ETXTBSY) 105 break; 106 sleep(2); 107 } 108 error(0, prog); 109 error(1, " not found.\n"); 110 } 111 112 error(errcode, cp) 113 int errcode; 114 register char *cp; 115 { 116 register int i; 117 register char *dp; 118 119 dp = cp; 120 i = 0; 121 while (*dp++) 122 i++; 123 write(2, cp, i); 124 if (errcode) 125 exit(errcode); 126 } 127 128 exit(i) 129 { 130 _exit(i); 131 } 132