diff options
author | Denys Vlasenko | 2012-08-16 16:52:27 +0200 |
---|---|---|
committer | Denys Vlasenko | 2012-08-16 16:52:27 +0200 |
commit | 9c55143bbf4ce24bef093301e46aab15b4a71d69 (patch) | |
tree | 3707b637b2b1608f6568ce2eebb976a6c551ee62 | |
parent | 45c35e9de01010c6bb12f2b86fd5b8b31afe4617 (diff) | |
download | busybox-9c55143bbf4ce24bef093301e46aab15b4a71d69.zip busybox-9c55143bbf4ce24bef093301e46aab15b4a71d69.tar.gz |
wget: try reading after poll timeout - stdio may have buffered data. Closes 5426
function old new delta
retrieve_file_data 436 451 +15
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | networking/wget.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/networking/wget.c b/networking/wget.c index 6d8f8a5..3416636 100644 --- a/networking/wget.c +++ b/networking/wget.c @@ -448,6 +448,9 @@ static void NOINLINE retrieve_file_data(FILE *dfp) # endif struct pollfd polldata; +# if ENABLE_FEATURE_WGET_TIMEOUT + second_cnt = G.timeout_seconds; +# endif polldata.fd = fileno(dfp); polldata.events = POLLIN | POLLPRI; #endif @@ -483,12 +486,7 @@ static void NOINLINE retrieve_file_data(FILE *dfp) } #if ENABLE_FEATURE_WGET_STATUSBAR || ENABLE_FEATURE_WGET_TIMEOUT -# if ENABLE_FEATURE_WGET_TIMEOUT - second_cnt = G.timeout_seconds; -# endif - while (1) { - if (safe_poll(&polldata, 1, 1000) != 0) - break; /* error, EOF, or data is available */ + if (safe_poll(&polldata, 1, 1000) == 0) { # if ENABLE_FEATURE_WGET_TIMEOUT if (second_cnt != 0 && --second_cnt == 0) { progress_meter(PROGRESS_END); @@ -497,6 +495,13 @@ static void NOINLINE retrieve_file_data(FILE *dfp) # endif /* Needed for "stalled" indicator */ progress_meter(PROGRESS_BUMP); + /* + * We used to loop back to poll here, + * but in chunked case, we can be here after + * fgets and it could buffer some data in dfp... + * which poll knows nothing about! + * Therefore let's try fread'ing anyway. + */ } /* fread internally uses read loop, which in our case @@ -527,7 +532,9 @@ static void NOINLINE retrieve_file_data(FILE *dfp) } xwrite(G.output_fd, G.wget_buf, n); - +#if ENABLE_FEATURE_WGET_TIMEOUT + second_cnt = G.timeout_seconds; +#endif #if ENABLE_FEATURE_WGET_STATUSBAR G.transferred += n; progress_meter(PROGRESS_BUMP); |