|
|
1.1 ! root 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.5 4/8/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 \ ! 20: (START + HEADER_BYTES - sizeof (struct exec) - sizeof (struct pxhdr)) ! 21: #define MAXARGS 512 ! 22: ! 23: extern errno; ! 24: ! 25: main(argc, argv) ! 26: register int argc; ! 27: register char *argv[]; ! 28: { ! 29: register int i; ! 30: int codesiz, symtabsiz; ! 31: register char *cp; ! 32: char *largv[MAXARGS]; ! 33: int fd, pv[2], pid; ! 34: ! 35: cp = (char *)(ADDR_LC); ! 36: codesiz = ((struct pxhdr *)(cp))->objsize + sizeof(struct pxhdr); ! 37: symtabsiz = ((struct pxhdr *)(cp))->symtabsize; ! 38: if (argc > MAXARGS - 3) ! 39: error(2, "Too many arguments.\n"); ! 40: if (symtabsiz != 0) { ! 41: largv[0] = "pxhdr"; ! 42: largv[1] = "/tmp/px00000"; ! 43: cp = &largv[1][11]; ! 44: for (i = getpid(); i > 0; i /= 10) ! 45: *cp-- = '0' + i % 10; ! 46: fd = creat(largv[1], 0444); ! 47: if (fd < 0) ! 48: error(3, "Cannot create /tmp file\n"); ! 49: for (i = 0; i < argc; i++) ! 50: largv[i + 2] = argv[i]; ! 51: largv[argc + 2] = 0; ! 52: writeobj(fd, codesiz, symtabsiz); ! 53: run(px_debug, largv); ! 54: /* no return */ ! 55: } ! 56: largv[0] = "pipe"; ! 57: for (i = 0; i < argc; i++) ! 58: largv[i + 1] = argv[i]; ! 59: largv[argc + 1] = 0; ! 60: pipe(pv); ! 61: pid = fork(); ! 62: if (pid != 0) { ! 63: if (pv[0] != 3) { ! 64: close(3); ! 65: dup(pv[0]); ! 66: close(pv[0]); ! 67: } ! 68: close(pv[1]); ! 69: run(px_intrp, largv); ! 70: /* no return */ ! 71: } ! 72: writeobj(pv[1], codesiz, symtabsiz); ! 73: exit(0); ! 74: } ! 75: ! 76: writeobj(fd, codesiz, symtabsiz) ! 77: int fd; ! 78: int codesiz, symtabsiz; ! 79: { ! 80: int i; ! 81: register char *cp; ! 82: ! 83: cp = (char *)(ADDR_LC); ! 84: while (codesiz != 0) { ! 85: i = (codesiz < BUFSIZ) ? codesiz : BUFSIZ; ! 86: write(fd, cp, i); ! 87: cp += i; ! 88: codesiz -= i; ! 89: } ! 90: while (symtabsiz != 0) { ! 91: i = (symtabsiz < BUFSIZ) ? symtabsiz : BUFSIZ; ! 92: write(fd, cp, i); ! 93: cp += i; ! 94: symtabsiz -= i; ! 95: } ! 96: close(fd); ! 97: } ! 98: ! 99: run(prog, args) ! 100: char *prog; ! 101: char **args; ! 102: { ! 103: for (;;) { ! 104: execv(prog, args); ! 105: if (errno != ETXTBSY) ! 106: break; ! 107: sleep(2); ! 108: } ! 109: error(0, prog); ! 110: error(1, " not found.\n"); ! 111: } ! 112: ! 113: error(errcode, cp) ! 114: int errcode; ! 115: register char *cp; ! 116: { ! 117: register int i; ! 118: register char *dp; ! 119: ! 120: dp = cp; ! 121: i = 0; ! 122: while (*dp++) ! 123: i++; ! 124: write(2, cp, i); ! 125: if (errcode) ! 126: exit(errcode); ! 127: } ! 128: ! 129: exit(i) ! 130: { ! 131: _exit(i); ! 132: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.