diff options
author | Fumitoshi UKAI <ukai@debian.or.jp> | 2003-01-23 15:59:24 +0000 |
---|---|---|
committer | Fumitoshi UKAI <ukai@debian.or.jp> | 2003-01-23 15:59:24 +0000 |
commit | fb759b572b8e6303d84233a95bf87ae748545bfb (patch) | |
tree | 4bd477f638f87a2adcb3f99625cc0673ab108c78 | |
parent | [w3m-dev 03678] Re: config.param is clear when configure -help (diff) | |
download | w3m-fb759b572b8e6303d84233a95bf87ae748545bfb.tar.gz w3m-fb759b572b8e6303d84233a95bf87ae748545bfb.zip |
[w3m-dev 03679] Re: cleanup for pipe
* etc.c (open_pipe_rw): check stdin, stdout
* file.c (uncompress_stream): rewrite
From: Hironori SAKAMOTO <hsaka@mth.biglobe.ne.jp>
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | etc.c | 12 | ||||
-rw-r--r-- | file.c | 26 |
3 files changed, 32 insertions, 14 deletions
@@ -1,3 +1,9 @@ +2003-01-24 Hironori SAKAMOTO <hsaka@mth.biglobe.ne.jp> + + * [w3m-dev 03679] Re: cleanup for pipe + * etc.c (open_pipe_rw): check stdin, stdout + * file.c (uncompress_stream): rewrite + 2003-01-23 Fumitoshi UKAI <ukai@debian.or.jp> * [w3m-dev 03678] Re: config.param is clear when configure -help @@ -6715,4 +6721,4 @@ a * [w3m-dev 03276] compile error on EWS4800 * release-0-2-1 * import w3m-0.2.1 -$Id: ChangeLog,v 1.705 2003/01/22 16:36:11 ukai Exp $ +$Id: ChangeLog,v 1.706 2003/01/23 15:59:24 ukai Exp $ @@ -1,4 +1,4 @@ -/* $Id: etc.c,v 1.54 2003/01/22 16:11:03 ukai Exp $ */ +/* $Id: etc.c,v 1.55 2003/01/23 15:59:25 ukai Exp $ */ #include "fm.h" #include <pwd.h> #include "myctype.h" @@ -1369,11 +1369,17 @@ open_pipe_rw(FILE ** fr, FILE ** fw) else { if (fr) { close(fdr[1]); - *fr = fdopen(fdr[0], "r"); + if (*fr == stdin) + dup2(fdr[0], 0); + else + *fr = fdopen(fdr[0], "r"); } if (fw) { close(fdw[0]); - *fw = fdopen(fdw[1], "w"); + if (*fw == stdout) + dup2(fdw[1], 1); + else + *fw = fdopen(fdw[1], "w"); } } return pid; @@ -1,4 +1,4 @@ -/* $Id: file.c,v 1.200 2003/01/22 16:16:20 ukai Exp $ */ +/* $Id: file.c,v 1.201 2003/01/23 15:59:27 ukai Exp $ */ #include "fm.h" #include <sys/types.h> #include "myctype.h" @@ -7749,6 +7749,7 @@ uncompress_stream(URLFile *uf, char **src) tmpf = tmpfname(TMPF_DFL, ext)->ptr; } + /* child1 -- stdout|f1=uf -> parent */ pid1 = open_pipe_rw(&f1, NULL); if (pid1 < 0) { UFclose(uf); @@ -7757,31 +7758,36 @@ uncompress_stream(URLFile *uf, char **src) if (pid1 == 0) { /* child */ pid_t pid2; - FILE *f2; - dup2(1, 2); /* stderr>&stdout */ - setup_child(TRUE, -1, UFfileno(uf)); - pid2 = open_pipe_rw(NULL, &f2); + FILE *f2 = stdin; + + /* uf -> child2 -- stdout|stdin -> child1 */ + pid2 = open_pipe_rw(&f2, NULL); if (pid2 < 0) { UFclose(uf); exit(1); } - if (pid2 > 0) { + if (pid2 == 0) { + /* child2 */ Str buf = Strnew_size(SAVE_BUF_SIZE); FILE *f = NULL; + + setup_child(TRUE, 2, UFfileno(uf)); if (tmpf) f = fopen(tmpf, "wb"); while (UFread(uf, buf, SAVE_BUF_SIZE)) { - if (Strfputs(buf, f2) < 0) + if (Strfputs(buf, stdout) < 0) break; if (f) Strfputs(buf, f); } - fclose(f2); + UFclose(uf); if (f) fclose(f); exit(0); } - /* child */ + /* child1 */ + dup2(1, 2); /* stderr>&stdout */ + setup_child(TRUE, -1, -1); execlp(expand_cmd, expand_name, NULL); exit(1); } @@ -7792,7 +7798,7 @@ uncompress_stream(URLFile *uf, char **src) uf->scheme = SCM_LOCAL; } UFhalfclose(uf); - uf->stream = newFileStream(f1, (void (*)())fclose); + uf->stream = newFileStream(f1, (void (*)())pclose); } static FILE * |