wget: correctly handle failure to -c (continue)
function old new delta
reset_beg_range_to_zero - 52 +52
wget_main 2168 2189 +21
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
diff --git a/networking/wget.c b/networking/wget.c
index 34c4652..b5c808d 100644
--- a/networking/wget.c
+++ b/networking/wget.c
@@ -348,6 +348,14 @@
return hdrval;
}
+static void reset_beg_range_to_zero(void)
+{
+ //bb_error_msg("restart failed");
+ G.beg_range = 0;
+ xlseek(G.output_fd, 0, SEEK_SET);
+ ftruncate(G.output_fd, 0);
+}
+
static FILE* prepare_ftp_session(FILE **dfpp, struct host_info *target, len_and_sockaddr *lsa)
{
FILE *sfp;
@@ -419,6 +427,8 @@
sprintf(G.wget_buf, "REST %"OFF_FMT"u", G.beg_range);
if (ftpcmd(G.wget_buf, NULL, sfp) == 350)
G.content_len -= G.beg_range;
+ else
+ reset_beg_range_to_zero();
}
if (ftpcmd("RETR ", target->path, sfp) > 150)
@@ -742,6 +752,12 @@
(e.g. Boa/0.94.14rc21) simply use code 204 when file size is zero.
*/
case 204:
+ if (G.beg_range != 0) {
+ /* "Range:..." was not honored by the server.
+ * Restart download from the beginning.
+ */
+ reset_beg_range_to_zero();
+ }
break;
case 300: /* redirection */
case 301: