#include <stdio.h>

#ifdef _WIN32
#include <winsock2.h>
#else
#include <sys/types.h>
#include <sys/select.h>
#endif

#include <curl/curl.h>

int perform(CURLM * multi)
{
	int handles;
	CURLMcode code;
    fd_set fdread;
    fd_set fdwrite;
    fd_set fdexcep;
    int maxfd;
	CURLMsg * msg;
	int msgcount;

	for (;;)
	{
		code = curl_multi_perform(multi, &handles);
		if (0 == handles)
		{
			msg = curl_multi_info_read(multi, &msgcount);
			if (msg && (CURLMSG_DONE == msg->msg))
			{
				return CURLE_OK == msg->data.result;
			}
			return 0;
		}
		switch (code)
		{
			case CURLM_OK:
			{
				break;
			}
			case CURLM_CALL_MULTI_PERFORM:
			{
				continue;
			}
			default:
			{
				return 0;
			}
		}
		FD_ZERO(&fdread);
		FD_ZERO(&fdwrite);
		FD_ZERO(&fdexcep);
		curl_multi_fdset(multi, &fdread, &fdwrite, &fdexcep, &maxfd);
		select(maxfd + 1, &fdread, &fdwrite, &fdexcep, 0);
	}
}

size_t WriteFunction(void *ptr, size_t size, size_t nmemb, void *stream)
{
	return fwrite(ptr, size, nmemb, (FILE*)stream);
}

int main(int argc, char **argv)
{
	CURLM * multi;
	CURL * easy;
	FILE * file1;
	FILE * file2;

	curl_global_init(CURL_GLOBAL_ALL);
	multi = curl_multi_init();
	easy = curl_easy_init();

	file1 = fopen("welcome.msg", "w");
	file2 = fopen("index.html", "w");

	curl_easy_setopt(easy, CURLOPT_WRITEFUNCTION, WriteFunction);
	curl_easy_setopt(easy, CURLOPT_WRITEDATA, file1);
	curl_easy_setopt(easy, CURLOPT_URL, "ftp://ftp.kernel.org/welcome.msg");

	curl_multi_add_handle(multi, easy);
	if (perform(multi))
		printf("OK: welcome.msg retrieved successfully\n");
	else
		printf("ERROR: welcome.msg retrieve failed\n");

	fclose(file1);

	curl_multi_remove_handle(multi, easy);
	curl_easy_reset(easy);

	curl_easy_setopt(easy, CURLOPT_WRITEFUNCTION, WriteFunction);
	curl_easy_setopt(easy, CURLOPT_WRITEDATA, file2);
	curl_easy_setopt(easy, CURLOPT_URL, "ftp://server-not-exists/pub/index.html");

	curl_multi_add_handle(multi, easy);

	if (perform(multi))
		printf("ERROR: index.html retrieved successfully\n");
	else
		printf("OK: index.html retrieve failed\n");
	
	fclose(file2);

	curl_multi_remove_handle(multi, easy);
	curl_easy_cleanup(easy);
	curl_multi_cleanup(multi);

	curl_global_cleanup();

	printf("Finished!\n");

	return 0;
}
