]> sjero.net Git - wget/blobdiff - src/ftp.c
On a network error, attempt to resume the download, not restart it.
[wget] / src / ftp.c
index d3f6b18ba36eacd62e6c5fec908a74902f7da524..c331d066f2c6569ca2434794367244f3d5a94f17 100644 (file)
--- a/src/ftp.c
+++ b/src/ftp.c
@@ -241,7 +241,7 @@ static uerr_t ftp_get_listing (struct url *, ccon *, struct fileinfo **);
    and closes the control connection in case of error.  */
 static uerr_t
 getftp (struct url *u, wgint passed_expected_bytes, wgint *qtyread,
-        wgint restval, ccon *con)
+        wgint restval, ccon *con, int count)
 {
   int csock, dtsock, local_sock, res;
   uerr_t err = RETROK;          /* appease the compiler */
@@ -503,10 +503,10 @@ Error in server response, closing control connection.\n"));
         logputs (LOG_VERBOSE, _("==> CWD not needed.\n"));
       else
         {
-          char *targ;
-         int cwd_count;
-         int cwd_end;
-         int cwd_start;
+          char *targ = NULL;
+          int cwd_count;
+          int cwd_end;
+          int cwd_start;
 
           char *target = u->dir;
 
@@ -1152,7 +1152,7 @@ Error in server response, closing control connection.\n"));
 # define BIN_TYPE_FILE 1
 #endif /* def __VMS [else] */
 
-      if (restval && !(con->cmd & DO_LIST))
+      if ((restval && !(con->cmd & DO_LIST)) || count > 0)
         {
 #ifdef __VMS
           int open_id;
@@ -1173,7 +1173,22 @@ Error in server response, closing control connection.\n"));
         }
       else if (opt.noclobber || opt.always_rest || opt.timestamping || opt.dirstruct
                || opt.output_document)
-        {
+        {        
+         if (opt.unlink && file_exists_p (con->target))
+           {
+             int res = unlink (con->target);
+             if (res < 0)
+               {
+                 logprintf (LOG_NOTQUIET, "%s: %s\n", con->target,
+                            strerror (errno));
+                 fd_close (csock);
+                 con->csock = -1;
+                 fd_close (dtsock);
+                 fd_close (local_sock);
+                 return UNLINKERR;
+               }
+           }
+
 #ifdef __VMS
           int open_id;
 
@@ -1473,7 +1488,7 @@ ftp_loop_internal (struct url *u, struct fileinfo *f, ccon *con, char **local_fi
         len = f->size;
       else
         len = 0;
-      err = getftp (u, len, &qtyread, restval, con);
+      err = getftp (u, len, &qtyread, restval, con, count);
 
       if (con->csock == -1)
         con->st &= ~DONE_CWD;
@@ -1484,6 +1499,7 @@ ftp_loop_internal (struct url *u, struct fileinfo *f, ccon *con, char **local_fi
         {
         case HOSTERR: case CONIMPOSSIBLE: case FWRITEERR: case FOPENERR:
         case FTPNSFOD: case FTPLOGINC: case FTPNOPASV: case CONTNOTSUPPORTED:
+        case UNLINKERR:
           /* Fatal errors, give up.  */
           return err;
         case CONSOCKERR: case CONERROR: case FTPSRVERR: case FTPRERR: