]> granicus.if.org Git - curl/commitdiff
check for poll() as it is done for other functions
authorYang Tse <yangsita@gmail.com>
Fri, 13 Feb 2009 05:49:58 +0000 (05:49 +0000)
committerYang Tse <yangsita@gmail.com>
Fri, 13 Feb 2009 05:49:58 +0000 (05:49 +0000)
configure.ac
m4/curl-functions.m4

index 4a383ffea1813eb8ae9c9d0d27e59960b20721fe..f817991219f7cc414867ff92e5043c03607d56f0 100644 (file)
@@ -2033,6 +2033,7 @@ CURL_CHECK_FUNC_IOCTL
 CURL_CHECK_FUNC_IOCTLSOCKET
 CURL_CHECK_FUNC_IOCTLSOCKET_CAMEL
 CURL_CHECK_FUNC_LOCALTIME_R
+CURL_CHECK_FUNC_POLL
 CURL_CHECK_FUNC_SETSOCKOPT
 CURL_CHECK_FUNC_SIGACTION
 CURL_CHECK_FUNC_SIGINTERRUPT
@@ -2078,7 +2079,6 @@ AC_CHECK_FUNCS([basename \
   inet_addr \
   perror \
   pipe \
-  poll \
   setlocale \
   setmode \
   setrlimit \
@@ -2135,45 +2135,6 @@ if test "$ipv6" = "yes"; then
   CURL_CHECK_NI_WITHSCOPEID
 fi
 
-AC_MSG_CHECKING([if we are Mac OS X (to disable poll)])
-disable_poll=no
-case $host in
-  *-*-darwin*)
-    disable_poll="yes";
-    ;;
-  *)
-    ;;
-esac
-AC_MSG_RESULT($disable_poll)
-
-if test "$disable_poll" = "no"; then
-
-  dnl poll() might be badly emulated, as in Mac OS X 10.3 (and other BSDs?) and
-  dnl to find out we make an extra check here!
-  if test "$ac_cv_func_poll" = "yes"; then
-    AC_MSG_CHECKING([if poll works with NULL inputs])
-    AC_RUN_IFELSE([
-#ifdef HAVE_SYS_POLL_H
-#include <sys/poll.h>
-#elif defined(HAVE_POLL_H)
-#include <poll.h>
-#endif
-
-  int main(void)
-  {
-    /* make this return 0 == timeout since there's nothing to read from */
-    return poll((void *)0, 0, 10 /*ms*/);
-  }
-],
-    AC_MSG_RESULT(yes)
-    AC_DEFINE(HAVE_POLL_FINE, 1, [If you have a fine poll]),
-    AC_MSG_RESULT(no),
-    AC_MSG_RESULT(cross-compiling assumes yes)
-    AC_DEFINE(HAVE_POLL_FINE, 1, [If you have a fine poll])
-    ) dnl end of AC_RUN_IFELSE
-  fi dnl poll() was found
-fi dnl poll()-check is not disabled
-
 dnl ************************************************************
 dnl enable non-blocking communications
 dnl
index 4935879bcd049f7d947cff508651a57f3304fbd7..b0489b8a48ee1e153e5fec1460f6c8f4b6f255ca 100644 (file)
@@ -22,7 +22,7 @@
 #***************************************************************************
 
 # File version for 'aclocal' use. Keep it a single number.
-# serial 43
+# serial 45
 
 
 dnl CURL_INCLUDES_ARPA_INET
@@ -124,6 +124,30 @@ curl_includes_netdb="\
 ])
 
 
+dnl CURL_INCLUDES_POLL
+dnl -------------------------------------------------
+dnl Set up variable with list of headers that must be
+dnl included when poll.h is to be included.
+
+AC_DEFUN([CURL_INCLUDES_POLL], [
+curl_includes_poll="\
+/* includes start */
+#ifdef HAVE_SYS_TYPES_H
+#  include <sys/types.h>
+#endif
+#ifdef HAVE_POLL_H
+#  include <poll.h>
+#endif
+#ifdef HAVE_SYS_POLL_H
+#  include <sys/poll.h>
+#endif
+/* includes end */"
+  AC_CHECK_HEADERS(
+    sys/types.h poll.h sys/poll.h,
+    [], [], [$curl_includes_poll])
+])
+
+
 dnl CURL_INCLUDES_SETJMP
 dnl -------------------------------------------------
 dnl Set up variable with list of headers that must be
@@ -3108,6 +3132,132 @@ AC_DEFUN([CURL_CHECK_FUNC_LOCALTIME_R], [
 ])
 
 
+dnl CURL_CHECK_FUNC_POLL
+dnl -------------------------------------------------
+dnl Verify if poll is available, prototyped, can
+dnl be compiled and seems to work. If all of these are
+dnl true, and usage has not been previously disallowed
+dnl with shell variable curl_disallow_poll, then
+dnl HAVE_POLL will be defined.
+
+AC_DEFUN([CURL_CHECK_FUNC_POLL], [
+  AC_REQUIRE([CURL_INCLUDES_STDLIB])dnl
+  AC_REQUIRE([CURL_INCLUDES_POLL])dnl
+  #
+  tst_links_poll="unknown"
+  tst_proto_poll="unknown"
+  tst_compi_poll="unknown"
+  tst_works_poll="unknown"
+  tst_allow_poll="unknown"
+  #
+  case $host_os in
+    darwin*)
+      dnl poll does not work on this platform
+      curl_disallow_poll="yes"
+      ;;
+  esac
+  #
+  AC_MSG_CHECKING([if poll can be linked])
+  AC_LINK_IFELSE([
+    AC_LANG_PROGRAM([[
+      $curl_includes_poll
+    ]],[[
+      if(0 != poll(0, 0, 0))
+        return 1;
+    ]])
+  ],[
+    AC_MSG_RESULT([yes])
+    tst_links_poll="yes"
+  ],[
+    AC_MSG_RESULT([no])
+    tst_links_poll="no"
+  ])
+  #
+  if test "$tst_links_poll" = "yes"; then
+    AC_MSG_CHECKING([if poll is prototyped])
+    AC_EGREP_CPP([poll],[
+      $curl_includes_poll
+    ],[
+      AC_MSG_RESULT([yes])
+      tst_proto_poll="yes"
+    ],[
+      AC_MSG_RESULT([no])
+      tst_proto_poll="no"
+    ])
+  fi
+  #
+  if test "$tst_proto_poll" = "yes"; then
+    AC_MSG_CHECKING([if poll is compilable])
+    AC_COMPILE_IFELSE([
+      AC_LANG_PROGRAM([[
+        $curl_includes_poll
+      ]],[[
+        if(0 != poll(0, 0, 0))
+          return 1;
+      ]])
+    ],[
+      AC_MSG_RESULT([yes])
+      tst_compi_poll="yes"
+    ],[
+      AC_MSG_RESULT([no])
+      tst_compi_poll="no"
+    ])
+  fi
+  #
+  dnl only do runtime verification when not cross-compiling
+  if test "x$cross_compiling" != "xyes" &&
+    test "$tst_compi_poll" = "yes"; then
+    AC_MSG_CHECKING([if poll seems to work])
+    AC_RUN_IFELSE([
+      AC_LANG_PROGRAM([[
+        $curl_includes_stdlib
+        $curl_includes_poll
+      ]],[[
+        if(0 != poll(0, 0, 10))
+          exit(1); /* fail */
+        else
+          exit(0);
+      ]])
+    ],[
+      AC_MSG_RESULT([yes])
+      tst_works_poll="yes"
+    ],[
+      AC_MSG_RESULT([no])
+      tst_works_poll="no"
+    ])
+  fi
+  #
+  if test "$tst_compi_poll" = "yes" &&
+    test "$tst_works_poll" != "no"; then
+    AC_MSG_CHECKING([if poll usage allowed])
+    if test "x$curl_disallow_poll" != "xyes"; then
+      AC_MSG_RESULT([yes])
+      tst_allow_poll="yes"
+    else
+      AC_MSG_RESULT([no])
+      tst_allow_poll="no"
+    fi
+  fi
+  #
+  AC_MSG_CHECKING([if poll might be used])
+  if test "$tst_links_poll" = "yes" &&
+     test "$tst_proto_poll" = "yes" &&
+     test "$tst_compi_poll" = "yes" &&
+     test "$tst_allow_poll" = "yes" &&
+     test "$tst_works_poll" != "no"; then
+    AC_MSG_RESULT([yes])
+    AC_DEFINE_UNQUOTED(HAVE_POLL, 1,
+      [Define to 1 if you have a working poll function.])
+    AC_DEFINE_UNQUOTED(HAVE_POLL_FINE, 1,
+      [If you have a fine poll])
+    ac_cv_func_poll="yes"
+  else
+    AC_MSG_RESULT([no])
+    ac_cv_func_poll="no"
+  fi
+])
+
+
 dnl CURL_CHECK_FUNC_SETSOCKOPT
 dnl -------------------------------------------------
 dnl Verify if setsockopt is available, prototyped, and