From: Denys Vlasenko Date: Sun, 17 Jun 2012 17:52:25 +0000 (+0200) Subject: wget: make -c _not_ truncate the file X-Git-Tag: 1_21_0~131 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=6144124aac1d4a30ff81842ba1bb0e28373a71c8;p=oweals%2Fbusybox.git wget: make -c _not_ truncate the file function old new delta retrieve_file_data 396 436 +40 reset_beg_range_to_zero 52 45 -7 Signed-off-by: Denys Vlasenko --- diff --git a/networking/wget.c b/networking/wget.c index 013b87801..5d5845019 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 */