[git commit] wget: make -c _not_ truncate the file

Denys Vlasenko vda.linux at googlemail.com
Sun Jun 17 17:52:25 UTC 2012


commit: http://git.busybox.net/busybox/commit/?id=6144124aac1d4a30ff81842ba1bb0e28373a71c8
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

function                                             old     new   delta
retrieve_file_data                                   396     436     +40
reset_beg_range_to_zero                               52      45      -7

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 networking/wget.c |   16 ++++++++++++++--
 1 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/networking/wget.c b/networking/wget.c
index 013b878..5d58450 100644
--- a/networking/wget.c
+++ b/networking/wget.c
@@ -352,10 +352,11 @@ static char *gethdr(FILE *fp)
 
 static void reset_beg_range_to_zero(void)
 {
-	//bb_error_msg("restart failed");
+	bb_error_msg("restart failed");
 	G.beg_range = 0;
 	xlseek(G.output_fd, 0, SEEK_SET);
-	ftruncate(G.output_fd, 0);
+	/* Done at the end instead: */
+	/* ftruncate(G.output_fd, 0); */
 }
 
 static FILE* prepare_ftp_session(FILE **dfpp, struct host_info *target, len_and_sockaddr *lsa)
@@ -554,6 +555,17 @@ static void NOINLINE retrieve_file_data(FILE *dfp)
 		G.got_clen = 1;
 	}
 
+	/* If -c failed, we restart from the beginning,
+	 * but we do not truncate file then, we do it only now, at the end.
+	 * This lets user to ^C if his 99% complete 10 GB file download
+	 * failed to restart *without* losing the almost complete file.
+	 */
+	{
+		off_t pos = lseek(G.output_fd, 0, SEEK_CUR);
+		if (pos != (off_t)-1)
+			ftruncate(G.output_fd, pos);
+	}
+
 	/* Draw full bar and free its resources */
 	G.chunked = 0;  /* makes it show 100% even for chunked download */
 	G.got_clen = 1; /* makes it show 100% even for download of (formerly) unknown size */


More information about the busybox-cvs mailing list