#include <curl/curl.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>

#define NUM_OPER	1000

struct MemoryStruct
{
    char *memory;
    size_t size;
};

static size_t writeMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data)
{
    register int realsize;
    struct MemoryStruct *mem;

    realsize = size * nmemb;
    mem = (struct MemoryStruct *) data;
    mem->memory = (char *)realloc(mem->memory, mem->size + realsize + 1);
	printf("memcbk: curr-> %d, new-> %d\n", mem->size, realsize);

    if (mem->memory)
    {
        memcpy(&(mem->memory[mem->size]), ptr, realsize);
        mem->size += realsize;
        mem->memory[mem->size] = 0;
    }
    return realsize;
}

void foo()
{
	int count;
	struct MemoryStruct mem;
	int res;
	CURL *curl = curl_easy_init();

	for( count=0; count < NUM_OPER; count++ )
	{
		printf("listing: %d\n", count);
		mem.memory = NULL;
		mem.size = NULL;

		curl_easy_setopt(curl, CURLOPT_URL, "ftp://username:passwd@hostname/emptydirpath");
		curl_easy_setopt( curl, CURLOPT_WRITEFUNCTION, writeMemoryCallback );

    	//curl_easy_setopt(curl, CURLOPT_VERBOSE, TRUE);
		curl_easy_setopt(curl, CURLOPT_FTPLISTONLY, TRUE);
		curl_easy_setopt( curl, CURLOPT_FILE, &mem );

		res = curl_easy_perform( curl );
		printf( "#%d curl returned %d\n", count, res );
		if( res != CURLE_OK )
		{
			printf("ERROR: could not download - %d\n", res);
			if(mem.memory)
				free(mem.memory);
			curl_easy_cleanup( curl );
			return;
		}

		curl_easy_setopt( curl, CURLOPT_WRITEFUNCTION, NULL );
		curl_easy_setopt( curl, CURLOPT_FILE, NULL );
		curl_easy_setopt( curl, CURLOPT_FTPLISTONLY, FALSE );
		if( mem.memory )
			free( mem.memory );
		sleep(1);
	}

	curl_easy_cleanup( curl );
}

int main(int argc, char *argv[])
{

	curl_global_init(CURL_GLOBAL_DEFAULT);
	foo();
	curl_global_cleanup();

	return 0;
}


