From c27d2d4b93624b2e7d291b77667ff2d98da3cea7 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Mon, 29 Sep 2008 13:21:21 +0000 Subject: - Ian Lynagh provided a patch that now makes CURLOPT_RANGE work fine for SFTP downloads! --- lib/ssh.c | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/ssh.c b/lib/ssh.c index b968dcf36..005eb265f 100644 --- a/lib/ssh.c +++ b/lib/ssh.c @@ -101,6 +101,7 @@ #include "inet_ntop.h" #include "parsedate.h" /* for the week day and month names */ #include "sockaddr.h" /* required for Curl_sockaddr_storage */ +#include "strtoofft.h" #include "multiif.h" #define _MPRINTF_REPLACE /* use our functions only */ @@ -1631,9 +1632,35 @@ static CURLcode ssh_statemach_act(struct connectdata *conn) data->req.maxdownload = -1; } else { - data->req.size = attrs.filesize; - data->req.maxdownload = attrs.filesize; - Curl_pgrsSetDownloadSize(data, attrs.filesize); + curl_off_t size; + + size = attrs.filesize; + if(conn->data->state.use_range) { + curl_off_t from, to; + char *ptr; + char *ptr2; + + from=curlx_strtoofft(conn->data->state.range, &ptr, 0); + while(ptr && *ptr && (isspace((int)*ptr) || (*ptr=='-'))) + ptr++; + to=curlx_strtoofft(ptr, &ptr2, 0); + if ((ptr == ptr2) /* no "to" value given */ + || (to > size)) { + to = size; + } + if (from > to) { + from = to; + size = 0; + } + else { + size = to - from + 1; + } + + libssh2_sftp_seek(conn->proto.sshc.sftp_handle, from); + } + data->req.size = size; + data->req.maxdownload = size; + Curl_pgrsSetDownloadSize(data, size); } /* We can resume if we can seek to the resume position */ -- cgit v1.2.3