cURL / Mailing Lists / curl-library / Single Mail

curl-library

Sample code throws at execution

From: Eric Schwarz <master.universe_at_gmx.at>
Date: Thu, 10 Dec 2009 15:49:00 +0100

Hi,

after some trouble I got libCurl building and linking with a sample I
fetched from the net (http://curl.haxx.se/libcurl/c/ftpget.html).

I am building with VS2008 Pro.

When executing the sample program from within the VS the program throws.

VS says

"Unhandled exception at 0x77231ffe in Test.exe: 0xC0000005: Access
violation reading location 0x4601877a."

Obviously it has to do something with the cleanup functions.

When commenting them out the program finishes as desired.

Please find below the code which brings libCurl Sample to crash.

/*****************************************************************************
  * _ _ ____ _
  * Project ___| | | | _ \| |
  * / __| | | | |_) | |
  * | (__| |_| | _ <| |___
  * \___|\___/|_| \_\_____|
  *
  * $Id: ftpget.c,v 1.8 2008/05/22 21:20:09 danf Exp $
  */

#include <stdio.h>

#include <curl/curl.h>
#include <curl/types.h>
#include <curl/easy.h>

/*
  * This is an example showing how to get a single file from an FTP server.
  * It delays the actual destination file creation until the first write
  * callback so that it won't create an empty file in case the remote file
  * doesn't exist or something else fails.
  */

struct FtpFile {
   const char *filename;
   FILE *stream;
};

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 main(void)
{
   CURL *curl;
   CURLcode res;
   struct FtpFile ftpfile={
     "curl.tar.gz", /* name to store the file as if succesful */
     NULL
   };

   curl_global_init(CURL_GLOBAL_DEFAULT);

   curl = curl_easy_init();
   if(curl) {
     /*
      * Get curl 7.9.2 from sunet.se's FTP site. curl 7.9.2 is most
likely not
      * present there by the time you read this, so you'd better replace the
      * URL with one that works!
      */
     curl_easy_setopt(curl, CURLOPT_URL,
                      
"ftp://ftp.sunet.se/pub/www/utilities/curl/curl-7.9.2.tar.gz");
     /* Define our callback to get called when there's data to be written */
     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);
     /* Set a pointer to our struct to pass to the callback */
     curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile);

     /* Switch on full protocol/debug output */
     curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

     res = curl_easy_perform(curl);

     /* always cleanup */
     curl_easy_cleanup(curl);

     if(CURLE_OK != res) {
       /* we failed */
       fprintf(stderr, "curl told us %d\n", res);
     }
   }

   if(ftpfile.stream)
     fclose(ftpfile.stream); /* close the local file */

   curl_global_cleanup();

   return 0;
}

Thanks a lot for your assistance.

Regards,
--eric
-------------------------------------------------------------------
List admin: http://cool.haxx.se/list/listinfo/curl-library
Etiquette: http://curl.haxx.se/mail/etiquette.html
Received on 2009-12-10