aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2012-08-16 16:52:27 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2012-08-16 16:52:27 +0200
commit9c55143bbf4ce24bef093301e46aab15b4a71d69 (patch)
tree3707b637b2b1608f6568ce2eebb976a6c551ee62
parent45c35e9de01010c6bb12f2b86fd5b8b31afe4617 (diff)
downloadbusybox-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.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/networking/wget.c b/networking/wget.c
index 6d8f8a504..3416636ae 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);