]> granicus.if.org Git - curl/commitdiff
better select() function detection that works
authorYang Tse <yangsita@gmail.com>
Mon, 19 May 2008 16:57:56 +0000 (16:57 +0000)
committerYang Tse <yangsita@gmail.com>
Mon, 19 May 2008 16:57:56 +0000 (16:57 +0000)
even when cross compiling a Windows target.

acinclude.m4
configure.ac

index 23f6bad486d4aa1851f4806f21edd5d032b395dc..721260b44e8b02c20d99f7befeb5ee5a2f2a552a 100644 (file)
@@ -1978,6 +1978,204 @@ AC_DEFUN([CURL_CHECK_LIBS_CLOCK_GETTIME_MONOTONIC], [
   #
 ]) dnl AC_DEFUN
 
+
+dnl CURL_CHECK_FUNC_SELECT
+dnl -------------------------------------------------
+dnl Test if the socket select() function is available,
+dnl and check its return type and the types of its
+dnl arguments. If the function succeeds HAVE_SELECT
+dnl will be defined, defining the types of the
+dnl arguments in SELECT_TYPE_ARG1, SELECT_TYPE_ARG234
+dnl and SELECT_TYPE_ARG5, defining the type of the
+dnl function return value in SELECT_TYPE_RETV, and
+dnl also defining the type qualifier of fifth argument
+dnl in SELECT_QUAL_ARG5.
+
+AC_DEFUN([CURL_CHECK_FUNC_SELECT], [
+  AC_REQUIRE([CURL_CHECK_STRUCT_TIMEVAL])dnl
+  AC_CHECK_HEADERS(sys/select.h sys/socket.h)
+  #
+  AC_MSG_CHECKING([for select])
+  AC_TRY_LINK([
+#undef inline
+#ifdef HAVE_WINDOWS_H
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+#include <windows.h>
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#else
+#ifdef HAVE_WINSOCK_H
+#include <winsock.h>
+#endif
+#endif
+#endif
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#ifdef TIME_WITH_SYS_TIME
+#include <time.h>
+#endif
+#else
+#ifdef HAVE_TIME_H
+#include <time.h>
+#endif
+#endif
+#ifndef HAVE_WINDOWS_H
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#endif
+    ],[
+      select(0, 0, 0, 0, 0);
+    ],[
+      AC_MSG_RESULT([yes])
+      curl_cv_select="yes"
+    ],[
+      AC_MSG_RESULT([no])
+      curl_cv_select="no"
+  ])
+  #
+  if test "$curl_cv_select" = "yes"; then
+    AC_CACHE_CHECK([types of args and return type for select],
+      [curl_cv_func_select_args], [
+      curl_cv_func_select_args="unknown"
+      for sel_retv in 'int' 'ssize_t'; do
+        for sel_arg1 in 'int' 'ssize_t' 'size_t' 'unsigned long int' 'unsigned int'; do
+          for sel_arg234 in 'fd_set *' 'int *' 'void *'; do
+            for sel_arg5 in 'struct timeval *' 'const struct timeval *'; do
+              AC_COMPILE_IFELSE([
+                AC_LANG_PROGRAM([
+#undef inline
+#ifdef HAVE_WINDOWS_H
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+#include <windows.h>
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#else
+#ifdef HAVE_WINSOCK_H
+#include <winsock.h>
+#endif
+#endif
+#define SELECTCALLCONV PASCAL
+#endif
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#ifdef TIME_WITH_SYS_TIME
+#include <time.h>
+#endif
+#else
+#ifdef HAVE_TIME_H
+#include <time.h>
+#endif
+#endif
+#ifndef HAVE_WINDOWS_H
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#define SELECTCALLCONV
+#endif
+#ifndef HAVE_STRUCT_TIMEVAL
+                  struct timeval {
+                    long tv_sec;
+                    long tv_usec;
+                  };
+#endif
+                  extern $sel_retv SELECTCALLCONV select($sel_arg1,
+                                                         $sel_arg234,
+                                                         $sel_arg234,
+                                                         $sel_arg234,
+                                                         $sel_arg5);
+                ],[
+                  $sel_arg1   nfds=0;
+                  $sel_arg234 rfds=0;
+                  $sel_arg234 wfds=0;
+                  $sel_arg234 efds=0;
+                  $sel_retv res = select(nfds, rfds, wfds, efds, 0);
+                ])
+              ],[
+                 curl_cv_func_select_args="$sel_arg1,$sel_arg234,$sel_arg5,$sel_retv"
+                 break 4
+              ])
+            done
+          done
+        done
+      done
+    ]) # AC_CACHE_CHECK
+    if test "$curl_cv_func_select_args" = "unknown"; then
+      AC_MSG_WARN([Cannot find proper types to use for select args])
+      AC_MSG_WARN([HAVE_SELECT will not be defined])
+    else
+      select_prev_IFS=$IFS; IFS=','
+      set dummy `echo "$curl_cv_func_select_args" | sed 's/\*/\*/g'`
+      IFS=$select_prev_IFS
+      shift
+      #
+      sel_qual_type_arg5=$[3]
+      #
+      AC_DEFINE_UNQUOTED(SELECT_TYPE_ARG1, $[1],
+        [Define to the type of arg 1 for select.])
+      AC_DEFINE_UNQUOTED(SELECT_TYPE_ARG234, $[2],
+        [Define to the type of args 2, 3 and 4 for select.])
+      AC_DEFINE_UNQUOTED(SELECT_TYPE_RETV, $[4],
+        [Define to the function return type for select.])
+      #
+      prev_sh_opts=$-
+      #
+      case $prev_sh_opts in
+        *f*)
+          ;;
+        *)
+          set -f
+          ;;
+      esac
+      #
+      case "$sel_qual_type_arg5" in
+        const*)
+          sel_qual_arg5=const
+          sel_type_arg5=`echo $sel_qual_type_arg5 | sed 's/^const //'`
+        ;;
+        *)
+          sel_qual_arg5=
+          sel_type_arg5=$sel_qual_type_arg5
+        ;;
+      esac
+      #
+      AC_DEFINE_UNQUOTED(SELECT_QUAL_ARG5, $sel_qual_arg5,
+        [Define to the type qualifier of arg 5 for select.])
+      AC_DEFINE_UNQUOTED(SELECT_TYPE_ARG5, $sel_type_arg5,
+        [Define to the type of arg 5 for select.])
+      #
+      case $prev_sh_opts in
+        *f*)
+          ;;
+        *)
+          set +f
+          ;;
+      esac
+      #
+      AC_DEFINE_UNQUOTED(HAVE_SELECT, 1,
+        [Define to 1 if you have the select function.])
+      ac_cv_func_select="yes"
+    fi
+  fi
+]) # AC_DEFUN
+
+
 dnl ************************************************************
 dnl check for "localhost", if it doesn't exist, we can't do the
 dnl gethostbyname_r tests!
index cdd2d9fcc8e6edb85ddca1b5db986508edff8c9a..3f4e6acc92e4a12fff5c86544666983c4c4335e3 100644 (file)
@@ -1992,7 +1992,7 @@ TYPE_SIG_ATOMIC_T
 
 AC_TYPE_SIGNAL
 
-AC_FUNC_SELECT_ARGTYPES
+CURL_CHECK_FUNC_SELECT
 
 CURL_CHECK_FUNC_RECV
 
@@ -2013,7 +2013,6 @@ case $host in
 esac
 AC_CHECK_FUNCS( strtoll \
                 socket \
-                select \
                 strdup \
                 strstr \
                 strcasestr \
@@ -2067,37 +2066,6 @@ if test "x$skipcheck" != "xyes"; then
 fi
 )
 
-dnl For some reason, the check above doesn't properly detect select() with
-dnl Msys/Mingw
-if test "$ac_cv_func_select" = "no"; then
-  AC_MSG_CHECKING([for select in $winsock_LIB])
-  AC_TRY_LINK([
-#undef inline
-#ifdef HAVE_WINDOWS_H
-#ifndef WIN32_LEAN_AND_MEAN
-#define WIN32_LEAN_AND_MEAN
-#endif
-#include <windows.h>
-#ifdef HAVE_WINSOCK2_H
-#include <winsock2.h>
-#else
-#ifdef HAVE_WINSOCK_H
-#include <winsock.h>
-#endif
-#endif
-#endif
-    ],[
-      select(0,(fd_set *)NULL,(fd_set *)NULL,(fd_set *)NULL,(struct timeval *)NULL);
-    ],[
-      AC_MSG_RESULT([yes])
-      HAVE_SELECT="1"
-      AC_DEFINE_UNQUOTED(HAVE_SELECT, 1,
-        [Define to 1 if you have the select function.])
-    ],[
-      AC_MSG_ERROR([You can't compile without a select])
-  ])
-fi
-
 dnl sigsetjmp() might be a macro and no function so if it isn't found already
 dnl we make an extra check here!
 if test "$ac_cv_func_sigsetjmp" != "yes"; then