--- 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)
