|
|
1.1 ! root 1: #include <pagsiz.h> ! 2: #define BUFSIZ BSIZE ! 3: /* ! 4: * pxheader - program to sit in front of interpreter code to make shell mods ! 5: * unnecessary to make Pascal obj's look like real programs. ! 6: * ! 7: * This program lives in /usr/lib/px_header ! 8: * Bill Joy UCB February 6, 1978 ! 9: */ ! 10: ! 11: char USRUCBPX[] = "/usr/ucb/px"; ! 12: ! 13: extern errno; ! 14: ! 15: #define ETXTBSY 26 ! 16: ! 17: ! 18: struct header ! 19: { ! 20: int magic; ! 21: unsigned txt_size; ! 22: unsigned data_size; ! 23: unsigned bss_size; ! 24: unsigned syms_size; ! 25: unsigned entry_point; ! 26: unsigned tr_size; ! 27: unsigned dr_size; ! 28: }; ! 29: ! 30: #define HEADER_BYTES 1024 ! 31: #define ADDR_LC HEADER_BYTES - sizeof (struct header) - sizeof (int) ! 32: ! 33: main(argc, argv) ! 34: register int argc; ! 35: register char *argv[]; ! 36: { ! 37: register int i, j; ! 38: register unsigned short *ip; ! 39: char *largv[512]; ! 40: int pv[2]; ! 41: ! 42: if (argc > 510) { ! 43: error("Too many arguments.\n"); ! 44: exit(1); ! 45: } ! 46: largv[0] = argv[0]; ! 47: largv[1] = "-"; ! 48: for (i = 1; i < argc; i++) ! 49: largv[i + 1] = argv[i]; ! 50: largv[argc + 1] = 0; ! 51: pipe(pv); ! 52: i = fork(); ! 53: if (i == -1) ! 54: error("Try again.\n"); ! 55: if (i == 0) { ! 56: close(pv[0]); ! 57: write(pv[1], ADDR_LC, sizeof ( int )); ! 58: ip = (unsigned short *) (ADDR_LC); ! 59: i = *(int *)ip; ip += 2; ! 60: while (i != 0) { ! 61: j = (i > 0 && i < BUFSIZ) ? i : BUFSIZ; ! 62: write(pv[1], ip, j); ! 63: ip += BUFSIZ / sizeof ( unsigned short ); ! 64: i -= j; ! 65: } ! 66: exit(1); ! 67: } ! 68: close(pv[1]); ! 69: if (pv[0] != 3) { ! 70: close(3); ! 71: dup(pv[0]); ! 72: close(pv[0]); ! 73: } ! 74: for (;;) { ! 75: execv(USRUCBPX, largv); ! 76: if (errno != ETXTBSY) ! 77: break; ! 78: sleep(2); ! 79: } ! 80: error("Px not found.\n"); ! 81: } ! 82: ! 83: error(cp) ! 84: register char *cp; ! 85: { ! 86: register int i; ! 87: register char *dp; ! 88: ! 89: dp = cp; ! 90: i = 0; ! 91: while (*dp++) ! 92: i++; ! 93: write(2, cp, i); ! 94: exit(1); ! 95: } ! 96: ! 97: exit(i) ! 98: { ! 99: _exit(i); ! 100: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.