wget: make -c _not_ truncate the file
[platform/upstream/busybox.git] / networking / wget.c
index 013b878..5d58450 100644 (file)
@@ -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 */