1: /*
2: * Copyright (c) 1980 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: */
6:
7: #ifndef lint
8: char copyright[] =
9: "@(#) Copyright (c) 1980 Regents of the University of California.\n\
10: All rights reserved.\n";
11: #endif not lint
12:
13: #ifndef lint
14: static char sccsid[] = "@(#)px_header.c 5.2 (Berkeley) 6/21/85";
15: #endif not lint
16:
17: /*
18: * pxheader - program to sit in front of interpreter code to make shell mods
19: * unnecessary to make Pascal obj's look like real programs.
20: *
21: * This program lives in /usr/lib/px_header
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:
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:
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:
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:
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:
143: exit(i)
144: {
145: _exit(i);
146: }
Defined functions
exit
defined in line
143; used 20 times
- in line 87,
140
- in /usr/src/ucb/pascal/utilities/pc.c line
125,
150,
157,
163,
170-179(3),
493,
501,
507,
533,
597
- in /usr/src/ucb/pascal/utilities/pc3.c line
119,
822
- in /usr/src/ucb/pascal/utilities/pix.c line
63,
122
- in /usr/src/ucb/pascal/utilities/pmerge.c line
111,
419
main
defined in line
39;
never used
run
defined in line
113; used 2 times
Defined variables
Defined macros