]> git.saurik.com Git - wxWidgets.git/commitdiff
Detect thread-safe versions of gethostbyname/gethostbyaddr/getservbyname
authorStefan Neis <Stefan.Neis@t-online.de>
Sun, 27 Nov 2005 17:46:39 +0000 (17:46 +0000)
committerStefan Neis <Stefan.Neis@t-online.de>
Sun, 27 Nov 2005 17:46:39 +0000 (17:46 +0000)
        and how many arguments they use.
Detect thread-safe versions of localtime/gmtime and readdir.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@36267 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

aclocal.m4
build/aclocal/ac_raf_func_which_getservbyname_r.m4 [new file with mode: 0644]
build/aclocal/ax_func_which_gethostbyname_r.m4 [new file with mode: 0644]
configure.in
setup.h.in

index 67793d4d2c82419ee4209db84dede1e3e72f06f4..b0f534195927fdb23aca613716a7fe539b4e1772 100644 (file)
@@ -18,4 +18,6 @@ m4_include([build/aclocal/gtk-2.0.m4])
 m4_include([build/aclocal/gtk.m4])
 m4_include([build/aclocal/pkg.m4])
 m4_include([build/aclocal/sdl.m4])
+m4_include([build/aclocal/ax_func_which_gethostbyname_r.m4])
+m4_include([build/aclocal/ac_raf_func_which_getservbyname_r.m4])
 m4_include([acinclude.m4])
diff --git a/build/aclocal/ac_raf_func_which_getservbyname_r.m4 b/build/aclocal/ac_raf_func_which_getservbyname_r.m4
new file mode 100644 (file)
index 0000000..2aef740
--- /dev/null
@@ -0,0 +1,75 @@
+dnl @synopsis AC_raf_FUNC_WHICH_GETSERVBYNAME_R
+dnl
+dnl Provides a test to determine the correct way to call
+dnl getservbyname_r:
+dnl
+dnl  - defines HAVE_FUNC_GETSERVBYNAME_R_6 if it needs 6 arguments (e.g linux)
+dnl  - defines HAVE_FUNC_GETSERVBYNAME_R_5 if it needs 5 arguments (e.g. solaris)
+dnl  - defines HAVE_FUNC_GETSERVBYNAME_R_4 if it needs 4 arguments (e.g. osf/1)
+dnl
+dnl An example use can be found at
+dnl http://raf.org/autoconf/net_getservbyname.c
+dnl
+dnl Based on Caolan McNamara's gethostbyname_r macro. Based on David
+dnl Arnold's autoconf suggestion in the threads faq.
+dnl
+dnl @category Misc
+dnl @author raf <raf@raf.org>
+dnl @version 2001-08-20
+dnl @license GPLWithACException
+
+AC_DEFUN([AC_raf_FUNC_WHICH_GETSERVBYNAME_R],
+[AC_CACHE_CHECK(for getservbyname_r, ac_cv_func_which_getservbyname_r, [
+AC_CHECK_FUNC(getservbyname_r, [
+        AC_TRY_COMPILE([
+#               include <netdb.h>
+        ],      [
+
+        char *name;
+        char *proto;
+        struct servent *se;
+        struct servent_data data;
+        (void) getservbyname_r(name, proto, se, &data);
+
+                ],ac_cv_func_which_getservbyname_r=four,
+                        [
+  AC_TRY_COMPILE([
+#   include <netdb.h>
+  ], [
+        char *name;
+        char *proto;
+        struct servent *se, *res;
+        char buffer[2048];
+        int buflen = 2048;
+        (void) getservbyname_r(name, proto, se, buffer, buflen, &res)
+  ],ac_cv_func_which_getservbyname_r=six,
+
+  [
+  AC_TRY_COMPILE([
+#   include <netdb.h>
+  ], [
+        char *name;
+        char *proto;
+        struct servent *se;
+        char buffer[2048];
+        int buflen = 2048;
+        (void) getservbyname_r(name, proto, se, buffer, buflen)
+  ],ac_cv_func_which_getservbyname_r=five,ac_cv_func_which_getservbyname_r=no)
+
+  ]
+
+  )
+                        ]
+                )]
+        ,ac_cv_func_which_getservbyname_r=no)])
+
+if test $ac_cv_func_which_getservbyname_r = six; then
+  AC_DEFINE(HAVE_FUNC_GETSERVBYNAME_R_6)
+elif test $ac_cv_func_which_getservbyname_r = five; then
+  AC_DEFINE(HAVE_FUNC_GETSERVBYNAME_R_5)
+elif test $ac_cv_func_which_getservbyname_r = four; then
+  AC_DEFINE(HAVE_FUNC_GETSERVBYNAME_R_4)
+
+fi
+
+])
diff --git a/build/aclocal/ax_func_which_gethostbyname_r.m4 b/build/aclocal/ax_func_which_gethostbyname_r.m4
new file mode 100644 (file)
index 0000000..b71519e
--- /dev/null
@@ -0,0 +1,155 @@
+dnl @synopsis AX_FUNC_WHICH_GETHOSTBYNAME_R
+dnl
+dnl Determines which historical variant of the gethostbyname_r() call
+dnl (taking three, five, or six arguments) is available on the system
+dnl and defines one of the following macros accordingly:
+dnl
+dnl   HAVE_FUNC_GETHOSTBYNAME_R_6
+dnl   HAVE_FUNC_GETHOSTBYNAME_R_5
+dnl   HAVE_FUNC_GETHOSTBYNAME_R_3
+dnl
+dnl If used in conjunction with gethostname.c, the API demonstrated in
+dnl test.c can be used regardless of which gethostbyname_r() is
+dnl available. These example files can be found at
+dnl http://www.csn.ul.ie/~caolan/publink/gethostbyname_r
+dnl
+dnl based on David Arnold's autoconf suggestion in the threads faq
+dnl
+dnl Originally named "AC_caolan_FUNC_WHICH_GETHOSTBYNAME_R". Rewritten
+dnl for Autoconf 2.5x by Daniel Richard G.
+dnl
+dnl @category InstalledPackages
+dnl @author Caolan McNamara <caolan@skynet.ie>
+dnl @author Daniel Richard G. <skunk@iskunk.org>
+dnl @version 2005-01-21
+dnl @license GPLWithACException
+
+AC_DEFUN([AX_FUNC_WHICH_GETHOSTBYNAME_R], [
+
+    AC_LANG_PUSH(C)
+    AC_MSG_CHECKING([how many arguments gethostbyname_r() takes])
+
+    AC_CACHE_VAL(ac_cv_func_which_gethostbyname_r, [
+
+################################################################
+
+ac_cv_func_which_gethostbyname_r=unknown
+
+#
+# ONE ARGUMENT (sanity check)
+#
+
+# This should fail, as there is no variant of gethostbyname_r() that takes
+# a single argument. If it actually compiles, then we can assume that
+# netdb.h is not declaring the function, and the compiler is thereby
+# assuming an implicit prototype. In which case, we're out of luck.
+#
+AC_COMPILE_IFELSE(
+    AC_LANG_PROGRAM(
+       [[#include <netdb.h>]],
+       [[
+           char *name = "www.gnu.org";
+           (void)gethostbyname_r(name) /* ; */
+       ]]),
+    ac_cv_func_which_gethostbyname_r=no)
+
+#
+# SIX ARGUMENTS
+# (e.g. Linux)
+#
+
+if test "$ac_cv_func_which_gethostbyname_r" = "unknown"; then
+
+AC_COMPILE_IFELSE(
+    AC_LANG_PROGRAM(
+       [[#include <netdb.h>]],
+       [[
+           char *name = "www.gnu.org";
+           struct hostent ret, *retp;
+           char buf@<:@1024@:>@;
+           int buflen = 1024;
+           int my_h_errno;
+           (void)gethostbyname_r(name, &ret, buf, buflen, &retp, &my_h_errno) /* ; */
+       ]]),
+    ac_cv_func_which_gethostbyname_r=six)
+
+fi
+
+#
+# FIVE ARGUMENTS
+# (e.g. Solaris)
+#
+
+if test "$ac_cv_func_which_gethostbyname_r" = "unknown"; then
+
+AC_COMPILE_IFELSE(
+    AC_LANG_PROGRAM(
+       [[#include <netdb.h>]],
+       [[
+           char *name = "www.gnu.org";
+           struct hostent ret;
+           char buf@<:@1024@:>@;
+           int buflen = 1024;
+           int my_h_errno;
+           (void)gethostbyname_r(name, &ret, buf, buflen, &my_h_errno) /* ; */
+       ]]),
+    ac_cv_func_which_gethostbyname_r=five)
+
+fi
+
+#
+# THREE ARGUMENTS
+# (e.g. AIX, HP-UX, Tru64)
+#
+
+if test "$ac_cv_func_which_gethostbyname_r" = "unknown"; then
+
+AC_COMPILE_IFELSE(
+    AC_LANG_PROGRAM(
+       [[#include <netdb.h>]],
+       [[
+           char *name = "www.gnu.org";
+           struct hostent ret;
+           struct hostent_data data;
+           (void)gethostbyname_r(name, &ret, &data) /* ; */
+       ]]),
+    ac_cv_func_which_gethostbyname_r=three)
+
+fi
+
+################################################################
+
+]) dnl end AC_CACHE_VAL
+
+case "$ac_cv_func_which_gethostbyname_r" in
+    three)
+    AC_MSG_RESULT([three])
+    AC_DEFINE(HAVE_FUNC_GETHOSTBYNAME_R_3)
+    ;;
+
+    five)
+    AC_MSG_RESULT([five])
+    AC_DEFINE(HAVE_FUNC_GETHOSTBYNAME_R_5)
+    ;;
+
+    six)
+    AC_MSG_RESULT([six])
+    AC_DEFINE(HAVE_FUNC_GETHOSTBYNAME_R_6)
+    ;;
+
+    no)
+    AC_MSG_RESULT([cannot find function declaration in netdb.h])
+    ;;
+
+    unknown)
+    AC_MSG_RESULT([can't tell])
+    ;;
+
+    *)
+    AC_MSG_ERROR([internal error])
+    ;;
+esac
+
+AC_LANG_POP(C)
+
+]) dnl end AC_DEFUN
index ff87146c59f23907e239d67b736dfd3f6ca51f1b..364b486c107e853b95794e630785016c6269125e 100644 (file)
@@ -4969,6 +4969,52 @@ else
     fi
 fi
 
+AC_CHECK_FUNC(localtime_r, [ AC_DEFINE(HAVE_LOCALTIME_R) ])
+AC_SUBST(HAVE_LOCALTIME_R)
+AC_CHECK_FUNC(gmtime_r, [ AC_DEFINE(HAVE_GMTIME_R) ])
+AC_SUBST(HAVE_GMTIME_R)
+AC_CHECK_FUNC(readdir_r, [ AC_DEFINE(HAVE_READDIR_R) ])
+AC_SUBST(HAVE_READDIR_R)
+dnl By preference, use getaddrinfo which avoids thread safety issues.
+dnl If that is not available, check for gethostbyname_r/gethostbyaddr_r
+dnl and getservbyname_r
+AC_CHECK_FUNC(getaddrinfo, AC_DEFINE(HAVE_GETADDRINFO),
+    dnl no getaddrinfo, so check for gethostbyname_r and
+    dnl related functions (taken from python's configure.in)
+    dnl sigh -- gethostbyname_r is a mess; it can have 3, 5 or 6 arguments
+    [ AX_FUNC_WHICH_GETHOSTBYNAME_R
+      if test "x$ac_cv_func_which_gethostbyname_r" = "xno" -o \
+             "x$ac_cv_func_which_gethostbyname_r" = "xunknown" ; then
+          AC_CHECK_FUNC(gethostbyname, [ AC_DEFINE(HAVE_GETHOSTBYNAME) ])
+      fi
+      AC_SUBST(HAVE_FUNC_GETHOSTBYNAME_R_6)
+      AC_SUBST(HAVE_FUNC_GETHOSTBYNAME_R_5)
+      AC_SUBST(HAVE_FUNC_GETHOSTBYNAME_R_3)
+      AC_SUBST(HAVE_GETHOSTBYNAME)
+      dnl A similar test for getservbyname_r
+      dnl I'm tempted to just not do this test which is taking much time and
+      dnl do something similar as for gethostbyaddr_r, but OTOH the macro
+      dnl doing the test already exists, so using it is easy enough.     - SN
+      AC_raf_FUNC_WHICH_GETSERVBYNAME_R
+      if test "x$ac_cv_func_which_getservbyname_r" = "xno" -o \
+             "x$ac_cv_func_which_getservbyname_r" = "xunknown" ; then
+          AC_CHECK_FUNCS(getservbyname,[ AC_DEFINE(HAVE_GETSERVBYNAME) ])
+      fi
+      AC_SUBST(HAVE_FUNC_GETSERVBYNAME_R_6)
+      AC_SUBST(HAVE_FUNC_GETSERVBYNAME_R_5)
+      AC_SUBST(HAVE_FUNC_GETSERVBYNAME_R_4)
+      AC_SUBST(HAVE_GETSERVBYNAME)
+      dnl For gethostbyaddr_r, we currently do no separate test, instead, we
+      dnl silently assume it's available exactly if gethostbyname_r is
+      dnl available and always requires two more arguments than
+      dnl gethostbyname_r.
+      dnl (also, I'm lazy and there no m4 file that's ready for use for this
+      dnl  function, although it should be easy to rewrite the gethostbyname_r
+      dnl  check to fit this case, if it's really needed.                - SN )
+    ]
+)
+
+
 if test "$wxUSE_THREADS" = "yes"; then
   AC_DEFINE(wxUSE_THREADS)
 
index 06c81b950861c2a09d7185d1f184a4f8e85c3d77..6619e61c00260bb7c682cc10ea958d659faf5e1f 100644 (file)
 /* Define if you have BSD flock() function. */
 #undef HAVE_FLOCK
 
+/* Define if you have a gethostbyname_r function taking 6 arguments. */
+#undef HAVE_FUNC_GETHOSTBYNAME_R_6
+
+/* Define if you have a gethostbyname_r function taking 5 arguments. */
+#undef HAVE_FUNC_GETHOSTBYNAME_R_5
+
+/* Define if you have a gethostbyname_r function taking 3 arguments. */
+#undef HAVE_FUNC_GETHOSTBYNAME_R_3
+
+/* Define if you only have a gethostbyname function */
+#undef HAVE_GETHOSTBYNAME
+
 /* Define if you have the gethostname function.  */
 #undef HAVE_GETHOSTNAME
 
+/* Define if you have a getservbyname_r function taking 6 arguments. */
+#undef HAVE_FUNC_GETSERVBYNAME_R_6
+
+/* Define if you have a getservbyname_r function taking 5 arguments. */
+#undef HAVE_FUNC_GETSERVBYNAME_R_5
+
+/* Define if you have a getservbyname_r function taking 4 arguments. */
+#undef HAVE_FUNC_GETSERVBYNAME_R_4
+
+/* Define if you only have a getservbyname function */
+#undef HAVE_GETSERVBYNAME
+
+/* Define if you have the gmtime_r function.  */
+#undef HAVE_GMTIME_R
+
 /* Define if you have the inet_addr function.  */
 #undef HAVE_INET_ADDR
 
 /* Define if you have the inet_aton function.  */
 #undef HAVE_INET_ATON
 
+/* Define if you have the localtime_r function.  */
+#undef HAVE_LOCALTIME_R
+
 /* Define if you have the mktemp function.  */
 #undef HAVE_MKTEMP
 
 /* Define if you have the putenv function.  */
 #undef HAVE_PUTENV
 
+/* Define if you have the readdir_r function.  */
+#undef HAVE_READDIR_R
+
 /* Define if you have the setenv function.  */
 #undef HAVE_SETENV