]> granicus.if.org Git - curl/commitdiff
when using select() instead of poll, skip the test if the number of
authorYang Tse <yangsita@gmail.com>
Wed, 31 Jan 2007 15:34:53 +0000 (15:34 +0000)
committerYang Tse <yangsita@gmail.com>
Wed, 31 Jan 2007 15:34:53 +0000 (15:34 +0000)
open file descriptors is greater than FD_SETSIZE minus SAFETY_MARGIN,
also skip the test if any of the open file descriptors has a number
greater than FD_SETSIZE minus SAFETY_MARGIN.

tests/libtest/lib518.c
tests/libtest/lib537.c

index 47cea8244128f0ecba9a11da93fb1c07eb6b0341..368b902ae59675733d869ae3b408aeb15601e9ba 100644 (file)
@@ -360,16 +360,31 @@ static int rlimit(int keep_open)
    * with an indication that select limit would be exceeded.
    */
 
-  sprintf(strbuff2, fmt, num_open.rlim_max);
-  sprintf(strbuff, "fds open %s > select limit %d",
-          strbuff2, FD_SETSIZE);
-  store_errmsg(strbuff, 0);
-  fprintf(stderr, "%s\n", msgbuff);
-  close_file_descriptors();
-  free(memchunk);
-  return -10;
+  num_open.rlim_cur = FD_SETSIZE - SAFETY_MARGIN;
+  if (num_open.rlim_max > num_open.rlim_cur) {
+    sprintf(strbuff, "select limit is FD_SETSIZE %d", FD_SETSIZE);
+    store_errmsg(strbuff, 0);
+    fprintf(stderr, "%s\n", msgbuff);
+    close_file_descriptors();
+    free(memchunk);
+    return -10;
+  }
 
-#endif
+  num_open.rlim_cur = FD_SETSIZE - SAFETY_MARGIN;
+  for (rl.rlim_cur = 0;
+       rl.rlim_cur < num_open.rlim_max;
+       rl.rlim_cur++) {
+    if (fd[rl.rlim_cur] > num_open.rlim_cur) {
+      sprintf(strbuff, "select limit is FD_SETSIZE %d", FD_SETSIZE);
+      store_errmsg(strbuff, 0);
+      fprintf(stderr, "%s\n", msgbuff);
+      close_file_descriptors();
+      free(memchunk);
+      return -11;
+    }
+  }
+
+#endif /* using a FD_SETSIZE bound select() */
 
   /* free the chunk of memory we were reserving so that it
      becomes becomes available to the test */
index 6fd9c1097d825e2f8d5423a6d263fc4130e8f591..fb2482083176e015d6fd9baf0a33d3365a9dd742 100644 (file)
 #include <string.h>
 #endif
 
+#if !defined(HAVE_POLL_FINE)    && \
+    !defined(CURL_HAVE_WSAPOLL) && \
+    !defined(USE_WINSOCK)       && \
+    !defined(TPF)               && \
+    !defined(FD_SETSIZE)
+#error "this test requires FD_SETSIZE"
+#endif
+
 #define SAFETY_MARGIN (10)
 
 #if defined(WIN32) || defined(_WIN32) || defined(MSDOS)
@@ -356,16 +364,31 @@ static int rlimit(int keep_open)
    * with an indication that select limit would be exceeded.
    */
 
-  sprintf(strbuff1, fmt, num_open.rlim_max);
-  sprintf(strbuff, "fds open %s > select limit %d",
-          strbuff1, FD_SETSIZE);
-  store_errmsg(strbuff, 0);
-  fprintf(stderr, "%s\n", msgbuff);
-  close_file_descriptors();
-  free(memchunk);
-  return -8;
+  num_open.rlim_cur = FD_SETSIZE - SAFETY_MARGIN;
+  if (num_open.rlim_max > num_open.rlim_cur) {
+    sprintf(strbuff, "select limit is FD_SETSIZE %d", FD_SETSIZE);
+    store_errmsg(strbuff, 0);
+    fprintf(stderr, "%s\n", msgbuff);
+    close_file_descriptors();
+    free(memchunk);
+    return -8;
+  }
 
-#endif
+  num_open.rlim_cur = FD_SETSIZE - SAFETY_MARGIN;
+  for (rl.rlim_cur = 0;
+       rl.rlim_cur < num_open.rlim_max;
+       rl.rlim_cur++) {
+    if (fd[rl.rlim_cur] > num_open.rlim_cur) {
+      sprintf(strbuff, "select limit is FD_SETSIZE %d", FD_SETSIZE);
+      store_errmsg(strbuff, 0);
+      fprintf(stderr, "%s\n", msgbuff);
+      close_file_descriptors();
+      free(memchunk);
+      return -9;
+    }
+  }
+
+#endif /* using a FD_SETSIZE bound select() */
 
   /* free the chunk of memory we were reserving so that it
      becomes becomes available to the test */