Improved configure detection of number of arguments for getservbyport_r
authorYang Tse <yangsita@gmail.com>
Wed, 16 Jul 2008 12:26:09 +0000 (12:26 +0000)
committerYang Tse <yangsita@gmail.com>
Wed, 16 Jul 2008 12:26:09 +0000 (12:26 +0000)
CHANGES
RELEASE-NOTES
acinclude.m4

diff --git a/CHANGES b/CHANGES
index a937853..91430ac 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,9 @@
   Changelog for the c-ares project
 
+* Jul 16 2008 (Yang Tse)
+- Improved configure detection of number of arguments for getservbyport_r.
+  Detection is now based on compilation checks instead of linker ones.
+
 * Jul 15 2008 (Yang Tse)
 - Introduce definition of _REENTRANT symbol in setup.h to improve library
   usability.  Previously the configure process only used the AC_SYS_LARGEFILE
index 16f7320..faff00d 100644 (file)
@@ -7,6 +7,7 @@ This is what's new and changed in the c-ares 1.5.3 release:
  o allow --enable-largefile and --disable-largefile configurations
  o configure process no longer needs nor checks size of curl_off_t
  o library will now be built with _REENTRANT symbol defined
+ o Improved configure detection of number of arguments for getservbyport_r
 
 Thanks go to these friendly people for their efforts and contributions:
 
index 79da24b..bd39985 100644 (file)
@@ -1803,68 +1803,116 @@ dnl Test if the getservbyport_r function is available,
 dnl and find out how many parameters it takes.
 
 AC_DEFUN([CARES_CHECK_GETSERVBYPORT_R], [
-  AC_MSG_CHECKING([how many arguments getservbyport_r takes])
-  ac_func_getservbyport_r="unknown"
-
+  AC_CHECK_HEADERS(sys/types.h netdb.h)
+  #
+  AC_MSG_CHECKING([for getservbyport_r])
   AC_LINK_IFELSE([
-    AC_LANG_PROGRAM([[
-#include <netdb.h>
-    ]],[[
-      int p1, p5;
-      char *p2, p4[4096];
-      struct servent *p3, *p6;
-      getservbyport_r(p1, p2, p3, p4, p5, &p6);
-    ]])
+    AC_LANG_FUNC_LINK_TRY([getservbyport_r])
+  ],[
+    AC_MSG_RESULT([yes])
+    cares_cv_getservbyport_r="yes"
   ],[
-    ac_func_getservbyport_r="6"
+    AC_MSG_RESULT([no])
+    cares_cv_getservbyport_r="no"
   ])
-
-  if test "$ac_func_getservbyport_r" = "unknown"; then
+  #
+  if test "$cares_cv_getservbyport_r" != "yes"; then
+    AC_MSG_CHECKING([deeper for getservbyport_r])
     AC_LINK_IFELSE([
       AC_LANG_PROGRAM([[
-#include <netdb.h>
       ]],[[
-        int p1, p5;
-        char *p2, p4[4096];
-        struct servent *p3;
-        getservbyport_r(p1, p2, p3, p4, p5);
+        getservbyport_r();
       ]])
     ],[
-      ac_func_getservbyport_r="5"
+      AC_MSG_RESULT([yes])
+      cares_cv_getservbyport_r="yes"
+    ],[
+      AC_MSG_RESULT([but still no])
+      cares_cv_getservbyport_r="no"
     ])
   fi
-
-  if test "$ac_func_getservbyport_r" = "unknown"; then
-    AC_LINK_IFELSE([
+  #
+  if test "$cares_cv_getservbyport_r" = "yes"; then
+    AC_MSG_CHECKING([how many arguments getservbyport_r takes])
+    cares_cv_getservbyport_r_nargs="unknown"
+    #
+    AC_COMPILE_IFELSE([
       AC_LANG_PROGRAM([[
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_NETDB_H
 #include <netdb.h>
+#endif
       ]],[[
-        int p1;
-        char *p2;
-        struct servent *p3;
-        struct servent_data p4;
-        getservbyport_r(p1, p2, p3, &p4);
+        int p1, p5;
+        char *p2, p4[4096];
+        struct servent *p3, *p6;
+        getservbyport_r(p1, p2, p3, p4, p5, &p6);
       ]])
     ],[
-      ac_func_getservbyport_r="4"
+      cares_cv_getservbyport_r_nargs="6"
     ])
-  fi
-
-  if test "$ac_func_getservbyport_r" = "unknown"; then
-    AC_MSG_RESULT([not found])
-  else
-    AC_MSG_RESULT($ac_func_getservbyport_r)
-    AC_DEFINE(HAVE_GETSERVBYPORT_R, 1,
-      [Specifies whether getservbyport_r is present])
-    AC_DEFINE_UNQUOTED(GETSERVBYPORT_R_ARGS, $ac_func_getservbyport_r,
-      [Specifies the number of arguments to getservbyport_r])
-    if test "$ac_func_getservbyport_r" = "4" ; then
-      AC_DEFINE(GETSERVBYPORT_R_BUFSIZE, sizeof(struct servent_data),
-        [Specifies the size of the buffer to pass to getservbyport_r])
+    #
+    if test "$cares_cv_getservbyport_r_nargs" = "unknown"; then
+      AC_COMPILE_IFELSE([
+        AC_LANG_PROGRAM([[
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+        ]],[[
+          int p1, p5;
+          char *p2, p4[4096];
+          struct servent *p3;
+          getservbyport_r(p1, p2, p3, p4, p5);
+        ]])
+      ],[
+        cares_cv_getservbyport_r_nargs="5"
+      ])
+    fi
+    #
+    if test "$cares_cv_getservbyport_r_nargs" = "unknown"; then
+      AC_COMPILE_IFELSE([
+        AC_LANG_PROGRAM([[
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+        ]],[[
+          int p1;
+          char *p2;
+          struct servent *p3;
+          struct servent_data p4;
+          getservbyport_r(p1, p2, p3, &p4);
+        ]])
+      ],[
+        cares_cv_getservbyport_r_nargs="4"
+      ])
+    fi
+    #
+    AC_MSG_RESULT([$cares_cv_getservbyport_r_nargs])
+    #
+    if test "$cares_cv_getservbyport_r_nargs" = "unknown"; then
+      AC_MSG_WARN([HAVE_GETSERVBYPORT_R will not be defined])
     else
-      AC_DEFINE(GETSERVBYPORT_R_BUFSIZE, 4096,
-        [Specifies the size of the buffer to pass to getservbyport_r])
+      AC_DEFINE(HAVE_GETSERVBYPORT_R, 1,
+        [Specifies whether getservbyport_r is present])
+      AC_DEFINE_UNQUOTED(GETSERVBYPORT_R_ARGS, $cares_cv_getservbyport_r_nargs,
+        [Specifies the number of arguments to getservbyport_r])
+      if test "$cares_cv_getservbyport_r_nargs" = "4" ; then
+        AC_DEFINE(GETSERVBYPORT_R_BUFSIZE, sizeof(struct servent_data),
+          [Specifies the size of the buffer to pass to getservbyport_r])
+      else
+        AC_DEFINE(GETSERVBYPORT_R_BUFSIZE, 4096,
+          [Specifies the size of the buffer to pass to getservbyport_r])
+      fi
     fi
+    #
   fi
 ])