--- curl-7.21.3/include/curl/multi.h~ 2010-09-18 23:00:21.000000000 +0200 +++ curl-7.21.3/include/curl/multi.h 2010-12-16 09:17:03.909735667 +0100 @@ -132,6 +132,17 @@ fd_set *write_fd_set, fd_set *exc_fd_set, int *max_fd); + /* 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() --- curl-7.21.3/lib/multi.c~ 2010-12-15 10:04:43.000000000 +0100 +++ curl-7.21.3/lib/multi.c 2010-12-16 09:20:29.652705567 +0100 @@ -42,6 +42,7 @@ #include "timeval.h" #include "http.h" #include "warnless.h" +#include "select.h" #define _MPRINTF_REPLACE /* use our functions only */ #include @@ -930,6 +931,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 Curl_one_easy *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->easy.next; + while(easy != &multi->easy) { + 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->easy.next; + while(easy != &multi->easy) { + 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 Curl_one_easy *easy)