void glibcurl_init() { int fd; /* Create source object for curl file descriptors, and hook it into the default main context. */ curlSrc = (CurlGSource*)g_source_new(&curlFuncs, sizeof(CurlGSource)); g_source_attach(&curlSrc->source, NULL); /* Init rest of our data */ memset(&curlSrc->lastPollFd, 0, sizeof(curlSrc->lastPollFd)); for (fd = 1; fd <= GLIBCURL_FDMAX; ++fd) curlSrc->lastPollFd[fd].fd = fd; curlSrc->lastPollFdMax = 0; curlSrc->callPerform = 0; /* Init libcurl */ curl_global_init(CURL_GLOBAL_ALL); curlSrc->multiHandle = curl_multi_init(); curl_multi_setopt(curlSrc->multiHandle, CURLMOPT_MAXCONNECTS, 4); g_source_set_priority((GSource*)glibcurl_handle(), G_PRIORITY_DEFAULT_IDLE); D((stderr, "events: R=%x W=%x X=%x\n", GLIBCURL_READ, GLIBCURL_WRITE, GLIBCURL_EXC)); s_numEasyHandles = 0; s_currTimeout = 0; s_timeAtLastDispatch.tv_sec = 0; s_timeAtLastDispatch.tv_nsec = 0; }
void curlCallback(void* data) { CURLMsg* msg; int inQueue; /* putchar(' '); */ while (1) { msg = curl_multi_info_read(glibcurl_handle(), &inQueue); if (msg == 0) break; if (msg->msg != CURLMSG_DONE) continue; /* Cause the above call to g_main_loop_run() to terminate once all requests are finished. */ if (--numRunning == 0) g_main_loop_quit((GMainLoop*)data); } }