1*48110Sbostic /*- 2*48110Sbostic * Copyright (c) 1980 The Regents of the University of California. 3*48110Sbostic * All rights reserved. 4*48110Sbostic * 5*48110Sbostic * %sccs.include.redist.c% 622264Sdist */ 722264Sdist 822264Sdist #ifndef lint 922264Sdist char copyright[] = 10*48110Sbostic "@(#) Copyright (c) 1980 The Regents of the University of California.\n\ 1122264Sdist All rights reserved.\n"; 12*48110Sbostic #endif /* not lint */ 1322264Sdist 1422264Sdist #ifndef lint 15*48110Sbostic static char sccsid[] = "@(#)px_header.c 5.3 (Berkeley) 04/16/91"; 16*48110Sbostic #endif /* not lint */ 1722264Sdist 1822264Sdist /* 192841Swnj * pxheader - program to sit in front of interpreter code to make shell mods 202841Swnj * unnecessary to make Pascal obj's look like real programs. 212841Swnj * 222841Swnj * Bill Joy UCB February 6, 1978 232841Swnj */ 242841Swnj 252948Smckusic #include <stdio.h> 262948Smckusic #include <sys/types.h> 272948Smckusic #include <a.out.h> 2810571Smckusick #include "config.h" 292948Smckusic #include "whoami.h" 302948Smckusic #include "objfmt.h" 312948Smckusic 322841Swnj #define ETXTBSY 26 3311879Smckusick #define ADDR_LC \ 3411879Smckusick (START + HEADER_BYTES - sizeof (struct exec) - sizeof (struct pxhdr)) 355639Smckusic #define MAXARGS 512 362841Swnj 372948Smckusic extern errno; 382948Smckusic 392841Swnj main(argc, argv) 402841Swnj register int argc; 412841Swnj register char *argv[]; 422841Swnj { 435639Smckusic register int i; 445639Smckusic int codesiz, symtabsiz; 455639Smckusic register char *cp; 465639Smckusic char *largv[MAXARGS]; 475639Smckusic int fd, pv[2], pid; 482841Swnj 495639Smckusic cp = (char *)(ADDR_LC); 505639Smckusic codesiz = ((struct pxhdr *)(cp))->objsize + sizeof(struct pxhdr); 515639Smckusic symtabsiz = ((struct pxhdr *)(cp))->symtabsize; 525639Smckusic if (argc > MAXARGS - 3) 535639Smckusic error(2, "Too many arguments.\n"); 545639Smckusic if (symtabsiz != 0) { 555639Smckusic largv[0] = "pxhdr"; 565639Smckusic largv[1] = "/tmp/px00000"; 575639Smckusic cp = &largv[1][11]; 585639Smckusic for (i = getpid(); i > 0; i /= 10) 595639Smckusic *cp-- = '0' + i % 10; 605639Smckusic fd = creat(largv[1], 0444); 615639Smckusic if (fd < 0) 625639Smckusic error(3, "Cannot create /tmp file\n"); 635639Smckusic for (i = 0; i < argc; i++) 645639Smckusic largv[i + 2] = argv[i]; 655639Smckusic largv[argc + 2] = 0; 665639Smckusic writeobj(fd, codesiz, symtabsiz); 6710571Smckusick run(px_debug, largv); 685639Smckusic /* no return */ 692841Swnj } 705639Smckusic largv[0] = "pipe"; 715639Smckusic for (i = 0; i < argc; i++) 722841Swnj largv[i + 1] = argv[i]; 732841Swnj largv[argc + 1] = 0; 742841Swnj pipe(pv); 755639Smckusic pid = fork(); 765639Smckusic if (pid != 0) { 775639Smckusic if (pv[0] != 3) { 785639Smckusic close(3); 795639Smckusic dup(pv[0]); 805639Smckusic close(pv[0]); 812841Swnj } 825639Smckusic close(pv[1]); 8310571Smckusick run(px_intrp, largv); 845639Smckusic /* no return */ 852841Swnj } 865639Smckusic writeobj(pv[1], codesiz, symtabsiz); 875639Smckusic exit(0); 885639Smckusic } 895639Smckusic 905639Smckusic writeobj(fd, codesiz, symtabsiz) 915639Smckusic int fd; 925639Smckusic int codesiz, symtabsiz; 935639Smckusic { 945639Smckusic int i; 955639Smckusic register char *cp; 965639Smckusic 975639Smckusic cp = (char *)(ADDR_LC); 985639Smckusic while (codesiz != 0) { 995639Smckusic i = (codesiz < BUFSIZ) ? codesiz : BUFSIZ; 1005639Smckusic write(fd, cp, i); 1015639Smckusic cp += i; 1025639Smckusic codesiz -= i; 1032841Swnj } 1045639Smckusic while (symtabsiz != 0) { 1055639Smckusic i = (symtabsiz < BUFSIZ) ? symtabsiz : BUFSIZ; 1065639Smckusic write(fd, cp, i); 1075639Smckusic cp += i; 1085639Smckusic symtabsiz -= i; 1095639Smckusic } 1105639Smckusic close(fd); 1115639Smckusic } 1125639Smckusic 1135639Smckusic run(prog, args) 1145639Smckusic char *prog; 1155639Smckusic char **args; 1165639Smckusic { 1172841Swnj for (;;) { 1185639Smckusic execv(prog, args); 1192841Swnj if (errno != ETXTBSY) 1202841Swnj break; 1212841Swnj sleep(2); 1222841Swnj } 1235639Smckusic error(0, prog); 1245639Smckusic error(1, " not found.\n"); 1252841Swnj } 1262841Swnj 1275639Smckusic error(errcode, cp) 1285639Smckusic int errcode; 1292841Swnj register char *cp; 1302841Swnj { 1312841Swnj register int i; 1322841Swnj register char *dp; 1332841Swnj 1342841Swnj dp = cp; 1352841Swnj i = 0; 1362841Swnj while (*dp++) 1372841Swnj i++; 1382841Swnj write(2, cp, i); 1395639Smckusic if (errcode) 1405639Smckusic exit(errcode); 1412841Swnj } 1422841Swnj 1432841Swnj exit(i) 1442841Swnj { 1452841Swnj _exit(i); 1462841Swnj } 147