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