*
* Example source code to show how the callback function can be used to
* download data into a chunk of memory instead of storing it in a file.
- *
- * This exact source code has not been verified to work.
*/
#include <stdio.h>
#include <string.h>
#include <curl/curl.h>
-#include <curl/types.h>
-#include <curl/easy.h>
struct MemoryStruct {
char *memory;
size_t size;
};
-static void *myrealloc(void *ptr, size_t size);
-
-static void *myrealloc(void *ptr, size_t size)
-{
- /* There might be a realloc() out there that doesn't like reallocing
- NULL pointers, so we take care of it here */
- if(ptr)
- return realloc(ptr, size);
- else
- return malloc(size);
-}
static size_t
WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data)
size_t realsize = size * nmemb;
struct MemoryStruct *mem = (struct MemoryStruct *)data;
- mem->memory = myrealloc(mem->memory, mem->size + realsize + 1);
- if (mem->memory) {
- memcpy(&(mem->memory[mem->size]), ptr, realsize);
- mem->size += realsize;
- mem->memory[mem->size] = 0;
+ mem->memory = realloc(mem->memory, mem->size + realsize + 1);
+ if (mem->memory == NULL) {
+ /* out of memory! */
+ printf("not enough memory (realloc returned NULL)\n");
+ exit(EXIT_FAILURE);
}
+
+ memcpy(&(mem->memory[mem->size]), ptr, realsize);
+ mem->size += realsize;
+ mem->memory[mem->size] = 0;
+
return realsize;
}
+
int main(int argc, char **argv)
{
CURL *curl_handle;
struct MemoryStruct chunk;
- chunk.memory=NULL; /* we expect realloc(NULL, size) to work */
+ chunk.memory = malloc(1); /* will be grown as needed by the realloc above */
chunk.size = 0; /* no data at this point */
curl_global_init(CURL_GLOBAL_ALL);
* you're done with it, you should free() it as a nice application.
*/
+ printf("%lu bytes retrieved\n", chunk.size);
+
if(chunk.memory)
free(chunk.memory);