Commit 7ffe62d9 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

- Given a recent enough libssh2, libcurl can now seek/resume with SFTP even

  on file indexes beyond 2 or 4GB.
parent d5bfec70
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -7,6 +7,8 @@
                                  Changelog

Daniel Stenberg (22 Dec 2008)
- Given a recent enough libssh2, libcurl can now seek/resume with SFTP even
  on file indexes beyond 2 or 4GB.

- Anthony Bryan provided a set of patches that cleaned up manual language,
  corrected spellings and more.
+1 −0
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ This release includes the following bugfixes:
 o curl_multi_timeout() no longer returns timeout 0 when there's nothing to do
   yet
 o the multi_socket API and HTTP pipelining now work a lot better when combined
 o SFTP seek/resume beyond 32bit file sizes

This release includes the following known bugs:

+13 −3
Original line number Diff line number Diff line
@@ -431,6 +431,16 @@ static CURLcode ssh_getworkingpath(struct connectdata *conn,
  return CURLE_OK;
}

/*
 * Earlier libssh2 versions didn't have the ability to seek to 64bit positions
 * with 32bit size_t.
 */
#ifdef HAVE_LIBSSH2_SFTP_SEEK2
#define SFTP_SEEK(x,y) libssh2_sftp_seek2(x, (libssh2_uint64_t)y)
#else
#define SFTP_SEEK(x,y) libssh2_sftp_seek(x, y)
#endif

/*
 * ssh_statemach_act() runs the SSH statemachine "one round" and returns.  The
 * data the pointer 'block' points to will be set to TRUE if the libssh2
@@ -1343,7 +1353,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
        Curl_pgrsSetUploadSize(data, data->set.infilesize);
      }

      libssh2_sftp_seek(sshc->sftp_handle, data->state.resume_from);
      SFTP_SEEK(sshc->sftp_handle, data->state.resume_from);
    }
    if(data->set.infilesize>0) {
      data->req.size = data->set.infilesize;
@@ -1716,7 +1726,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
          size = to - from + 1;
        }

        libssh2_sftp_seek(conn->proto.sshc.sftp_handle, from);
        SFTP_SEEK(conn->proto.sshc.sftp_handle, from);
      }
      data->req.size = size;
      data->req.maxdownload = size;
@@ -1750,7 +1760,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
      data->req.maxdownload = attrs.filesize - data->state.resume_from;
      Curl_pgrsSetDownloadSize(data,
                               attrs.filesize - data->state.resume_from);
      libssh2_sftp_seek(sshc->sftp_handle, data->state.resume_from);
      SFTP_SEEK(sshc->sftp_handle, data->state.resume_from);
    }
  }
  /* Setup the actual download */