Another try at socklen_t: just check for it, and otherwise use int.
[rsync/rsync.git] / aclocal.m4
index d583b52..a1256ae 100644 (file)
@@ -40,7 +40,7 @@ AC_DEFUN(AC_SYS_LARGEFILE_TEST_INCLUDES,
 
 dnl Internal subroutine of AC_SYS_LARGEFILE.
 dnl AC_SYS_LARGEFILE_MACRO_VALUE(C-MACRO, VALUE, CACHE-VAR, COMMENT, INCLUDES, FUNCTION-BODY)
-AC_DEFUN(AC_SYS_LARGEFILE_MACRO_VALUE,
+AC_DEFUN([AC_SYS_LARGEFILE_MACRO_VALUE],
   [AC_CACHE_CHECK([for $1 value needed for large files], $3,
      [$3=no
       AC_TRY_COMPILE(AC_SYS_LARGEFILE_TEST_INCLUDES
@@ -58,7 +58,7 @@ $5
      AC_DEFINE_UNQUOTED([$1], [$]$3, [$4])
    fi])
 
-AC_DEFUN(AC_SYS_LARGEFILE,
+AC_DEFUN([AC_SYS_LARGEFILE],
   [AC_ARG_ENABLE(largefile,
      [  --disable-largefile     omit support for large files])
    if test "$enable_largefile" != no; then
@@ -96,3 +96,62 @@ AC_DEFUN(AC_SYS_LARGEFILE,
        [#include <stdio.h>], [return !ftello;])
    fi
   ])
+
+dnl Check for socklen_t: historically on BSD it is an int, and in
+dnl POSIX 1g it is a type of its own, but some platforms use different
+dnl types for the argument to getsockopt, getpeername, etc.  So we
+dnl have to test to find something that will work.
+
+dnl This is no good, because passing the wrong pointer on C compilers is
+dnl likely to only generate a warning, not an error.  We don't call this at
+dnl the moment.
+
+AC_DEFUN([TYPE_SOCKLEN_T],
+[
+   AC_MSG_CHECKING([for socklen_t])
+   AC_CACHE_VAL([lftp_cv_socklen_t],
+   [
+      lftp_cv_socklen_t=no
+      AC_TRY_COMPILE([
+         #include <sys/types.h>
+         #include <sys/socket.h>
+      ],
+      [
+        socklen_t len;
+        getpeername(0,0,&len);
+      ],
+      [
+         lftp_cv_socklen_t=yes
+      ])
+   ])
+   AC_MSG_RESULT($lftp_cv_socklen_t)
+   if test $lftp_cv_socklen_t = no; then
+      AC_MSG_CHECKING([for socklen_t equivalent])
+      AC_CACHE_VAL([lftp_cv_socklen_t_equiv],
+      [
+         lftp_cv_socklen_t_equiv=int
+         AC_LANG_SAVE
+         for t in int size_t unsigned long "unsigned long"; do
+            AC_TRY_COMPILE([
+               #include <sys/types.h>
+               #include <sys/socket.h>
+            ],
+            [
+              $t len;
+              getpeername(0,0,&len);
+            ],
+            [
+               lftp_cv_socklen_t_equiv="$t"
+               break
+            ],
+           [
+               AC_MSG_ERROR([Cannot find a type to use in place of socklen_t])
+           ])
+         done
+      ])
+      AC_MSG_RESULT($lftp_cv_socklen_t_equiv)
+      AC_DEFINE_UNQUOTED(socklen_t, $lftp_cv_socklen_t_equiv,
+                       [type to use in place of socklen_t if not defined])
+   fi
+])
+