curl-users
unable to download zip files completely using SFTP.
Date: Tue, 10 Mar 2009 10:23:03 +0530 (IST)
hello,
i have written a code to download compressed (.zip) files using SFTP.
It seems that zip file is not downloading complete file. size of source file and destination file is different.
source file size is : 5103167 bytes
downloaded file size is : 5095424 bytes
difference in size is : 7743 bytes.
after download if i try to gunzip the downloaded file i get following error :
gunzip: <filename>.gz: unexpected end of file
code snippet :
static size_t my_fwrite (void *buffer, size_t size, size_t nmemb, void *stream)
{
struct FtpFile *out = (struct FtpFile *) stream;
if (out && !out->stream) {
/* open file for writing */
out->stream = fopen (out->filename, "wb");
if (!out->stream) {
return (-1); /* failure, can't open file to write */
}
}
return ( fwrite (buffer, size, nmemb, out->stream));
}
int cmdGetFile (LoggerPtr loggerCxx, const char *username, const char *password,
const char *hostip,
const char *srcFile,
const char *destFile, int resumeFlag,
int largeFile /* =0 */)
{
CURL *curl = NULL;
CURLcode res = CURLE_OK;
/* get the file size of the local file */
struct stat file_info;
if (stat (destFile, &file_info) == -1) {
EMS_LOG (loggerCxx, "Couldnt open '" << destFile << "': " <<
strerror (errno) << " resuming download from start")
file_info.st_size = 0;
}
else {
EMS_LOG (
loggerCxx, "Resuming download of '" << destFile << "': " << " from " <<
file_info.st_size)
}
struct FtpFile ftpfile;
ftpfile.filename = destFile;
ftpfile.stream = NULL;
curl_global_init (CURL_GLOBAL_ALL);
curl = curl_easy_init ();
if (curl) {
string url = string ("sftp://") + hostip + srcFile;
string userpwd = username + string (":") + password;
curl_easy_setopt (curl, CURLOPT_URL, url.c_str ());
curl_easy_setopt (curl, CURLOPT_TRANSFERTEXT, 1);
curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, my_fwrite);
curl_easy_setopt (curl, CURLOPT_WRITEDATA, &ftpfile);
curl_easy_setopt (curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt (curl, CURLOPT_USERPWD, userpwd.c_str ());
if (resumeFlag == 1) {
curl_easy_setopt (
curl, (largeFile) ? CURLOPT_RESUME_FROM_LARGE : CURLOPT_RESUME_FROM,
file_info.st_size);
}
/* Now run off and do what you've been told! */
res = curl_easy_perform (curl);
EMS_LOG (loggerCxx, "Curl returned: (" << res << ") " << curl_easy_strerror (res))
/* always cleanup */
curl_easy_cleanup (curl);
}
curl_global_cleanup ();
return int(res);
}
int main(int argc, char **argv)
{
cmdGetFile("userName", "password", "10.4.7.22", "sourcefile.gz", "destfile.gz", 0, 0);
return 0;
}
I am compiling above code on solaris platform.
CURL version : 7.19.0 (SFTP enabled)
LIBSSH2 version : 1.0
OPENSSL version : 0.9.7g
Thanks,
Rajashri Bhor.
________________________________
Add more friends to your messenger and enjoy! Invite them now.
Add more friends to your messenger and enjoy! Go to http://messenger.yahoo.com/invite/
-------------------------------------------------------------------
List admin: http://cool.haxx.se/cgi-bin/mailman/listinfo/curl-users
FAQ: http://curl.haxx.se/docs/faq.html
Etiquette: http://curl.haxx.se/mail/etiquette.html
Received on 2009-03-10