--- include/curl/multi.h.orig 2013-06-23 04:32:16.000000000 +0800 +++ include/curl/multi.h 2013-08-18 01:15:02.455786067 +0800 @@ -161,6 +161,19 @@ int *ret); /* + * Name: curl_multi_select() + * + * Desc: Calls select() or poll() internally so app can call + * curl_multi_perform() as soon as one of them is ready. This is to + * fix FD_SETSIZE problem curl_multi_fdset() has. + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_select(CURLM *multi_handle, + int timeout_ms, + int *ret); + + /* * Name: curl_multi_perform() * * Desc: When the app thinks there's data available for curl it calls this --- lib/multi.c.orig 2013-08-10 05:41:42.000000000 +0800 +++ lib/multi.c 2013-08-18 01:15:02.458784982 +0800 @@ -922,6 +922,80 @@ return CURLM_OK; } +CURLMcode curl_multi_select(CURLM *multi_handle, int timeout_ms, int *ret) { + struct Curl_multi *multi=(struct Curl_multi *)multi_handle; + struct SessionHandle *easy; + curl_socket_t sockbunch[MAX_SOCKSPEREASYHANDLE]; + int bitmap; + int i; + unsigned int nfds = 0; + struct pollfd *ufds; + int nret = -1; + + if(!GOOD_MULTI_HANDLE(multi)) + return CURLM_BAD_HANDLE; + + easy=multi->easyp->next; + while(easy != &multi->easyp) { + bitmap = multi_getsock(easy, sockbunch, MAX_SOCKSPEREASYHANDLE); + + for(i=0; i< MAX_SOCKSPEREASYHANDLE; i++) { + curl_socket_t s = CURL_SOCKET_BAD; + + if(bitmap & GETSOCK_READSOCK(i)) { + ++nfds; + s = sockbunch[i]; + } + if(bitmap & GETSOCK_WRITESOCK(i)) { + ++nfds; + s = sockbunch[i]; + } + if(s == CURL_SOCKET_BAD) { + break; + } + } + + easy = easy->next; /* check next handle */ + } + + ufds = (struct pollfd *)malloc(nfds * sizeof(struct pollfd)); + nfds = 0; + + easy=multi->easyp->next; + while(easy != &multi->easyp) { + bitmap = multi_getsock(easy, sockbunch, MAX_SOCKSPEREASYHANDLE); + + for(i=0; i< MAX_SOCKSPEREASYHANDLE; i++) { + curl_socket_t s = CURL_SOCKET_BAD; + + if(bitmap & GETSOCK_READSOCK(i)) { + ufds[nfds].fd = sockbunch[i]; + ufds[nfds].events = POLLIN; + ++nfds; + s = sockbunch[i]; + } + if(bitmap & GETSOCK_WRITESOCK(i)) { + ufds[nfds].fd = sockbunch[i]; + ufds[nfds].events = POLLOUT; + ++nfds; + s = sockbunch[i]; + } + if(s == CURL_SOCKET_BAD) { + break; + } + } + + easy = easy->next; /* check next handle */ + } + + nret = Curl_poll(ufds, nfds, timeout_ms); + free(ufds); + if (ret) { + *ret = nret; + } + return CURLM_OK; +} + static CURLMcode multi_runsingle(struct Curl_multi *multi, struct timeval now, struct SessionHandle *easy)