1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-22 08:08:50 -05:00

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

on file indexes beyond 2 or 4GB.
This commit is contained in:
Daniel Stenberg 2008-12-22 13:12:36 +00:00
parent d5bfec70af
commit 7ffe62d901
3 changed files with 16 additions and 3 deletions

View File

@ -7,6 +7,8 @@
Changelog Changelog
Daniel Stenberg (22 Dec 2008) 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, - Anthony Bryan provided a set of patches that cleaned up manual language,
corrected spellings and more. corrected spellings and more.

View File

@ -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 o curl_multi_timeout() no longer returns timeout 0 when there's nothing to do
yet yet
o the multi_socket API and HTTP pipelining now work a lot better when combined 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: This release includes the following known bugs:

View File

@ -431,6 +431,16 @@ static CURLcode ssh_getworkingpath(struct connectdata *conn,
return CURLE_OK; 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 * 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 * 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); 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) { if(data->set.infilesize>0) {
data->req.size = data->set.infilesize; data->req.size = data->set.infilesize;
@ -1716,7 +1726,7 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
size = to - from + 1; 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.size = size;
data->req.maxdownload = 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; data->req.maxdownload = attrs.filesize - data->state.resume_from;
Curl_pgrsSetDownloadSize(data, Curl_pgrsSetDownloadSize(data,
attrs.filesize - data->state.resume_from); 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 */ /* Setup the actual download */