9 /* Licensed under the GPL
10 * Copyright (c) Miek Gieben, 2006
13 /* like tee(1), but then connect to other programs using
14 * pipes _and_ output to standard output
18 close_pipes(FILE **p
, size_t i
)
22 for (j
= 0; j
< i
; j
++) {
25 ret
|= WEXITSTATUS(r
);
33 main(int argc
, char **argv
) {
34 int ignore_write_error
= 1;
35 int ignore_sigpipe
= 1;
39 int inactive_pipes
= 0;
43 if (!strcmp(argv
[1], "--no-ignore-sigpipe")) {
47 } else if (!strcmp(argv
[1], "--ignore-sigpipe")) {
51 } else if (!strcmp(argv
[1], "--no-ignore-write-errors")) {
53 ignore_write_error
= 0;
55 } else if (!strcmp(argv
[1], "--ignore-write-errors")) {
57 ignore_write_error
= 1;
63 if (ignore_sigpipe
&& (signal(SIGPIPE
, SIG_IGN
) == SIG_ERR
)) {
64 fprintf(stderr
, "Unable to ignore SIGPIPE\n");
68 pipes
= malloc(((argc
- 1) * sizeof *pipes
));
69 inactive_pipe
= calloc((argc
- 1), (sizeof *inactive_pipe
));
70 if (!pipes
|| !inactive_pipe
)
73 for (i
= 1; i
< argc
; i
++) {
74 pipes
[i
- 1] = popen(argv
[i
], "w");
76 fprintf(stderr
, "Can not open pipe to '%s\'\n", argv
[i
]);
77 close_pipes(pipes
, argc
);
82 setbuf(pipes
[i
- 1], NULL
);
87 r
= read(STDIN_FILENO
, buf
, BUFSIZ
);
89 /* Interrupted by signal? Try again. */
90 if (r
== -1 && errno
== EINTR
)
93 /* Other error or EOF. */
97 for(i
= 0; i
< argc
; i
++) {
101 if (fwrite(buf
, sizeof(char), r
, pipes
[i
]) == r
)
106 if (!ignore_write_error
)
107 fprintf(stderr
, "Write error to `%s\'\n",
110 if (!ignore_write_error
|| (inactive_pipes
== argc
)) {
111 close_pipes(pipes
, argc
);
115 inactive_pipe
[i
] = 1;
118 exit(close_pipes(pipes
, argc
));