diff options
author | Daniel Stenberg <daniel@haxx.se> | 2008-09-29 13:21:21 +0000 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2008-09-29 13:21:21 +0000 |
commit | c27d2d4b93624b2e7d291b77667ff2d98da3cea7 (patch) | |
tree | 11afd146aa26bc6dc2407f60e8b9beea1cfc9ccc /lib/ssh.c | |
parent | 003afef541263a4ab4f1005b6ce16dda14cf8aee (diff) | |
download | curl-c27d2d4b93624b2e7d291b77667ff2d98da3cea7.tar.gz |
- Ian Lynagh provided a patch that now makes CURLOPT_RANGE work fine for SFTP
downloads!
Diffstat (limited to 'lib/ssh.c')
-rw-r--r-- | lib/ssh.c | 33 |
1 files changed, 30 insertions, 3 deletions
@@ -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 */ |