[git commit] wget: try reading after poll timeout - stdio may have buffered data. Closes 5426

Denys Vlasenko vda.linux at googlemail.com
Thu Aug 16 14:52:27 UTC 2012


commit: http://git.busybox.net/busybox/commit/?id=9c55143bbf4ce24bef093301e46aab15b4a71d69
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

function                                             old     new   delta
retrieve_file_data                                   436     451     +15

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 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);


More information about the busybox-cvs mailing list