|
|
1.1 root 1: /*ident "@(#)ctrans:demangler/errfilt.c 1.1"*/
2: /*
3: * C++ Demangler Source Code
4: * @(#)master 1.5
5: * 7/27/88 13:54:37
6: */
7: /* If the filter is applied using the standard
8: * shell's pipes, then to use c++filt one must
9: * say:
10: *
11: * cc options 2>&1 | c++filt >&2
12: *
13: * But when this is done, the return code from
14: * the cc command is lost. Furthermore, the
15: * stdout becomes the stderr.
16: * This program is a kludge to alleviate these
17: * problems. It is invoked as follows:
18: *
19: * errfilt "cc $OPTS" c++filt
20: *
21: * Only the stderr is redirected to the pipe
22: * for c++filt. Furthermore, the return code
23: * is what it should be for the cc command.
24: */
25: #include <stdio.h>
26:
27: main(argc, argv) int argc; char **argv; {
28: int pfd[2],f = -1;
29: int f2;
30: int rc,rc2;
31: int pid;
32:
33: if(argc != 3) {
34: fprintf(stderr, "usage: %s string1 string2\n", argv[0]);
35: return 0;
36: }
37: pipe(pfd);
38: f = fork();
39:
40: /* filter program */
41: if(f == 0) {
42: close(0);
43: dup(pfd[0]);
44: close(1);
45: dup(2);
46:
47: close(pfd[0]); close(pfd[1]);
48: execl("/bin/sh","sh","-c",argv[2],0);
49: exit(255);
50: }
51: f2 = fork();
52: /* base program */
53: if(f2 == 0) {
54: close(2);
55: dup(pfd[1]);
56:
57: close(pfd[1]); close(pfd[0]);
58: execl("/bin/sh","sh","-c",argv[1],0);
59: exit(255);
60: }
61: close(pfd[1]); close(pfd[0]);
62:
63: while((pid = wait(&rc)) != -1) {
64: if(pid == f) {
65: f = 0;
66: }
67: if(pid == f2) {
68: f2 = 0;
69: rc2 = rc;
70: }
71: }
72: return rc2/0xff;
73: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.