12841Swnj /* 22841Swnj * pxheader - program to sit in front of interpreter code to make shell mods 32841Swnj * unnecessary to make Pascal obj's look like real programs. 42841Swnj * 52841Swnj * This program lives in /usr/lib/px_header 62841Swnj * Bill Joy UCB February 6, 1978 72841Swnj */ 82841Swnj 9*10571Smckusick static char sccsid[] = "@(#)px_header.c 1.4 01/22/83"; 102841Swnj 112948Smckusic #include <stdio.h> 122948Smckusic #include <sys/types.h> 132948Smckusic #include <a.out.h> 14*10571Smckusick #include "config.h" 152948Smckusic #include "whoami.h" 162948Smckusic #include "objfmt.h" 172948Smckusic 182841Swnj #define ETXTBSY 26 192841Swnj #define ADDR_LC HEADER_BYTES - sizeof (struct exec) - sizeof (struct pxhdr) 205639Smckusic #define MAXARGS 512 212841Swnj 222948Smckusic extern errno; 232948Smckusic 242841Swnj main(argc, argv) 252841Swnj register int argc; 262841Swnj register char *argv[]; 272841Swnj { 285639Smckusic register int i; 295639Smckusic int codesiz, symtabsiz; 305639Smckusic register char *cp; 315639Smckusic char *largv[MAXARGS]; 325639Smckusic int fd, pv[2], pid; 332841Swnj 345639Smckusic cp = (char *)(ADDR_LC); 355639Smckusic codesiz = ((struct pxhdr *)(cp))->objsize + sizeof(struct pxhdr); 365639Smckusic symtabsiz = ((struct pxhdr *)(cp))->symtabsize; 375639Smckusic if (argc > MAXARGS - 3) 385639Smckusic error(2, "Too many arguments.\n"); 395639Smckusic if (symtabsiz != 0) { 405639Smckusic largv[0] = "pxhdr"; 415639Smckusic largv[1] = "/tmp/px00000"; 425639Smckusic cp = &largv[1][11]; 435639Smckusic for (i = getpid(); i > 0; i /= 10) 445639Smckusic *cp-- = '0' + i % 10; 455639Smckusic fd = creat(largv[1], 0444); 465639Smckusic if (fd < 0) 475639Smckusic error(3, "Cannot create /tmp file\n"); 485639Smckusic for (i = 0; i < argc; i++) 495639Smckusic largv[i + 2] = argv[i]; 505639Smckusic largv[argc + 2] = 0; 515639Smckusic writeobj(fd, codesiz, symtabsiz); 52*10571Smckusick run(px_debug, largv); 535639Smckusic /* no return */ 542841Swnj } 555639Smckusic largv[0] = "pipe"; 565639Smckusic for (i = 0; i < argc; i++) 572841Swnj largv[i + 1] = argv[i]; 582841Swnj largv[argc + 1] = 0; 592841Swnj pipe(pv); 605639Smckusic pid = fork(); 615639Smckusic if (pid != 0) { 625639Smckusic if (pv[0] != 3) { 635639Smckusic close(3); 645639Smckusic dup(pv[0]); 655639Smckusic close(pv[0]); 662841Swnj } 675639Smckusic close(pv[1]); 68*10571Smckusick run(px_intrp, largv); 695639Smckusic /* no return */ 702841Swnj } 715639Smckusic writeobj(pv[1], codesiz, symtabsiz); 725639Smckusic exit(0); 735639Smckusic } 745639Smckusic 755639Smckusic writeobj(fd, codesiz, symtabsiz) 765639Smckusic int fd; 775639Smckusic int codesiz, symtabsiz; 785639Smckusic { 795639Smckusic int i; 805639Smckusic register char *cp; 815639Smckusic 825639Smckusic cp = (char *)(ADDR_LC); 835639Smckusic while (codesiz != 0) { 845639Smckusic i = (codesiz < BUFSIZ) ? codesiz : BUFSIZ; 855639Smckusic write(fd, cp, i); 865639Smckusic cp += i; 875639Smckusic codesiz -= i; 882841Swnj } 895639Smckusic while (symtabsiz != 0) { 905639Smckusic i = (symtabsiz < BUFSIZ) ? symtabsiz : BUFSIZ; 915639Smckusic write(fd, cp, i); 925639Smckusic cp += i; 935639Smckusic symtabsiz -= i; 945639Smckusic } 955639Smckusic close(fd); 965639Smckusic } 975639Smckusic 985639Smckusic run(prog, args) 995639Smckusic char *prog; 1005639Smckusic char **args; 1015639Smckusic { 1022841Swnj for (;;) { 1035639Smckusic execv(prog, args); 1042841Swnj if (errno != ETXTBSY) 1052841Swnj break; 1062841Swnj sleep(2); 1072841Swnj } 1085639Smckusic error(0, prog); 1095639Smckusic error(1, " not found.\n"); 1102841Swnj } 1112841Swnj 1125639Smckusic error(errcode, cp) 1135639Smckusic int errcode; 1142841Swnj register char *cp; 1152841Swnj { 1162841Swnj register int i; 1172841Swnj register char *dp; 1182841Swnj 1192841Swnj dp = cp; 1202841Swnj i = 0; 1212841Swnj while (*dp++) 1222841Swnj i++; 1232841Swnj write(2, cp, i); 1245639Smckusic if (errcode) 1255639Smckusic exit(errcode); 1262841Swnj } 1272841Swnj 1282841Swnj exit(i) 1292841Swnj { 1302841Swnj _exit(i); 1312841Swnj } 132