Commit | Line | Data |
---|---|---|
505bf312 KB |
1 | /*- |
2 | * Copyright (c) 1980 The Regents of the University of California. | |
3 | * All rights reserved. | |
4 | * | |
5 | * %sccs.include.redist.c% | |
252367af DF |
6 | */ |
7 | ||
8 | #ifndef lint | |
9 | char copyright[] = | |
505bf312 | 10 | "@(#) Copyright (c) 1980 The Regents of the University of California.\n\ |
252367af | 11 | All rights reserved.\n"; |
505bf312 | 12 | #endif /* not lint */ |
252367af DF |
13 | |
14 | #ifndef lint | |
505bf312 KB |
15 | static char sccsid[] = "@(#)px_header.c 5.3 (Berkeley) %G%"; |
16 | #endif /* not lint */ | |
252367af | 17 | |
0d7d819d BJ |
18 | /* |
19 | * pxheader - program to sit in front of interpreter code to make shell mods | |
20 | * unnecessary to make Pascal obj's look like real programs. | |
21 | * | |
0d7d819d BJ |
22 | * Bill Joy UCB February 6, 1978 |
23 | */ | |
0d7d819d | 24 | |
2d40c995 KM |
25 | #include <stdio.h> |
26 | #include <sys/types.h> | |
27 | #include <a.out.h> | |
b36901cf | 28 | #include "config.h" |
2d40c995 KM |
29 | #include "whoami.h" |
30 | #include "objfmt.h" | |
0d7d819d | 31 | |
0d7d819d | 32 | #define ETXTBSY 26 |
65acfc39 KM |
33 | #define ADDR_LC \ |
34 | (START + HEADER_BYTES - sizeof (struct exec) - sizeof (struct pxhdr)) | |
3c7de845 | 35 | #define MAXARGS 512 |
0d7d819d | 36 | |
2d40c995 KM |
37 | extern errno; |
38 | ||
0d7d819d BJ |
39 | main(argc, argv) |
40 | register int argc; | |
41 | register char *argv[]; | |
42 | { | |
3c7de845 KM |
43 | register int i; |
44 | int codesiz, symtabsiz; | |
45 | register char *cp; | |
46 | char *largv[MAXARGS]; | |
47 | int fd, pv[2], pid; | |
0d7d819d | 48 | |
3c7de845 KM |
49 | cp = (char *)(ADDR_LC); |
50 | codesiz = ((struct pxhdr *)(cp))->objsize + sizeof(struct pxhdr); | |
51 | symtabsiz = ((struct pxhdr *)(cp))->symtabsize; | |
52 | if (argc > MAXARGS - 3) | |
53 | error(2, "Too many arguments.\n"); | |
54 | if (symtabsiz != 0) { | |
55 | largv[0] = "pxhdr"; | |
56 | largv[1] = "/tmp/px00000"; | |
57 | cp = &largv[1][11]; | |
58 | for (i = getpid(); i > 0; i /= 10) | |
59 | *cp-- = '0' + i % 10; | |
60 | fd = creat(largv[1], 0444); | |
61 | if (fd < 0) | |
62 | error(3, "Cannot create /tmp file\n"); | |
63 | for (i = 0; i < argc; i++) | |
64 | largv[i + 2] = argv[i]; | |
65 | largv[argc + 2] = 0; | |
66 | writeobj(fd, codesiz, symtabsiz); | |
b36901cf | 67 | run(px_debug, largv); |
3c7de845 | 68 | /* no return */ |
0d7d819d | 69 | } |
3c7de845 KM |
70 | largv[0] = "pipe"; |
71 | for (i = 0; i < argc; i++) | |
0d7d819d BJ |
72 | largv[i + 1] = argv[i]; |
73 | largv[argc + 1] = 0; | |
74 | pipe(pv); | |
3c7de845 KM |
75 | pid = fork(); |
76 | if (pid != 0) { | |
77 | if (pv[0] != 3) { | |
78 | close(3); | |
79 | dup(pv[0]); | |
80 | close(pv[0]); | |
0d7d819d | 81 | } |
3c7de845 | 82 | close(pv[1]); |
b36901cf | 83 | run(px_intrp, largv); |
3c7de845 | 84 | /* no return */ |
0d7d819d | 85 | } |
3c7de845 KM |
86 | writeobj(pv[1], codesiz, symtabsiz); |
87 | exit(0); | |
88 | } | |
89 | ||
90 | writeobj(fd, codesiz, symtabsiz) | |
91 | int fd; | |
92 | int codesiz, symtabsiz; | |
93 | { | |
94 | int i; | |
95 | register char *cp; | |
96 | ||
97 | cp = (char *)(ADDR_LC); | |
98 | while (codesiz != 0) { | |
99 | i = (codesiz < BUFSIZ) ? codesiz : BUFSIZ; | |
100 | write(fd, cp, i); | |
101 | cp += i; | |
102 | codesiz -= i; | |
103 | } | |
104 | while (symtabsiz != 0) { | |
105 | i = (symtabsiz < BUFSIZ) ? symtabsiz : BUFSIZ; | |
106 | write(fd, cp, i); | |
107 | cp += i; | |
108 | symtabsiz -= i; | |
0d7d819d | 109 | } |
3c7de845 KM |
110 | close(fd); |
111 | } | |
112 | ||
113 | run(prog, args) | |
114 | char *prog; | |
115 | char **args; | |
116 | { | |
0d7d819d | 117 | for (;;) { |
3c7de845 | 118 | execv(prog, args); |
0d7d819d BJ |
119 | if (errno != ETXTBSY) |
120 | break; | |
121 | sleep(2); | |
122 | } | |
3c7de845 KM |
123 | error(0, prog); |
124 | error(1, " not found.\n"); | |
0d7d819d BJ |
125 | } |
126 | ||
3c7de845 KM |
127 | error(errcode, cp) |
128 | int errcode; | |
0d7d819d BJ |
129 | register char *cp; |
130 | { | |
131 | register int i; | |
132 | register char *dp; | |
133 | ||
134 | dp = cp; | |
135 | i = 0; | |
136 | while (*dp++) | |
137 | i++; | |
138 | write(2, cp, i); | |
3c7de845 KM |
139 | if (errcode) |
140 | exit(errcode); | |
0d7d819d BJ |
141 | } |
142 | ||
143 | exit(i) | |
144 | { | |
145 | _exit(i); | |
146 | } |