1 /*-
2 * Copyright (c) 1980, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 */
7
8 #ifndef lint
9 static char copyright[] =
10 "@(#) Copyright (c) 1980, 1993\n\
11 The Regents of the University of California. All rights reserved.\n";
12 #endif /* not lint */
13
14 #ifndef lint
15 static char sccsid[] = "@(#)px_header.c 8.1 (Berkeley) 06/06/93";
16 #endif /* not lint */
17
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 *
22 * Bill Joy UCB February 6, 1978
23 */
24
25 #include <stdio.h>
26 #include <sys/types.h>
27 #include <a.out.h>
28 #include "config.h"
29 #include "whoami.h"
30 #include "objfmt.h"
31
32 #define ETXTBSY 26
33 #define ADDR_LC \
34 (START + HEADER_BYTES - sizeof (struct exec) - sizeof (struct pxhdr))
35 #define MAXARGS 512
36
37 extern errno;
38
main(argc,argv)39 main(argc, argv)
40 register int argc;
41 register char *argv[];
42 {
43 register int i;
44 int codesiz, symtabsiz;
45 register char *cp;
46 char *largv[MAXARGS];
47 int fd, pv[2], pid;
48
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);
67 run(px_debug, largv);
68 /* no return */
69 }
70 largv[0] = "pipe";
71 for (i = 0; i < argc; i++)
72 largv[i + 1] = argv[i];
73 largv[argc + 1] = 0;
74 pipe(pv);
75 pid = fork();
76 if (pid != 0) {
77 if (pv[0] != 3) {
78 close(3);
79 dup(pv[0]);
80 close(pv[0]);
81 }
82 close(pv[1]);
83 run(px_intrp, largv);
84 /* no return */
85 }
86 writeobj(pv[1], codesiz, symtabsiz);
87 exit(0);
88 }
89
writeobj(fd,codesiz,symtabsiz)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;
109 }
110 close(fd);
111 }
112
run(prog,args)113 run(prog, args)
114 char *prog;
115 char **args;
116 {
117 for (;;) {
118 execv(prog, args);
119 if (errno != ETXTBSY)
120 break;
121 sleep(2);
122 }
123 error(0, prog);
124 error(1, " not found.\n");
125 }
126
error(errcode,cp)127 error(errcode, cp)
128 int errcode;
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);
139 if (errcode)
140 exit(errcode);
141 }
142
exit(i)143 exit(i)
144 {
145 _exit(i);
146 }
147