new copyright; att/bsd/shared
[unix-history] / usr / src / usr.bin / pascal / px_header / px_header.c
CommitLineData
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
9char 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
15static 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
37extern errno;
38
0d7d819d
BJ
39main(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
90writeobj(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
113run(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
127error(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
143exit(i)
144{
145 _exit(i);
146}