From e34eecdad0a20a1db7975355a614c9a2fd4b4f66 Mon Sep 17 00:00:00 2001 From: Michael Gernoth Date: Thu, 31 Mar 2005 10:49:59 +0000 Subject: [PATCH] Real fix for socklen_t git-svn-id: svn://svn.code.sf.net/p/rdesktop/code/trunk/rdesktop@871 423420c4-83ab-492f-b58f-81f9feb106b5 --- configure.ac | 47 +++++++++++++++++++++++++++++++++++++++++++++++ tcp.c | 2 +- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 5a26ce1..fcb1a97 100644 --- a/configure.ac +++ b/configure.ac @@ -342,6 +342,53 @@ size_t iconv(); UTILS_FUNC_ICONV LIBS="$LIBS $LIBICONV" +# +# socklen_t +# from curl + +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. +AC_DEFUN([TYPE_SOCKLEN_T], +[ + AC_CHECK_TYPE([socklen_t], ,[ + AC_MSG_CHECKING([for socklen_t equivalent]) + AC_CACHE_VAL([socklen_t_equiv], + [ + # Systems have either "struct sockaddr *" or + # "void *" as the second argument to getpeername + socklen_t_equiv= + for arg2 in "struct sockaddr" void; do + for t in int size_t unsigned long "unsigned long"; do + AC_TRY_COMPILE([ + #include + #include + + int getpeername (int, $arg2 *, $t *); + ],[ + $t len; + getpeername(0,0,&len); + ],[ + socklen_t_equiv="$t" + break + ]) + done + done + + if test "x$socklen_t_equiv" = x; then + AC_MSG_ERROR([Cannot find a type to use in place of socklen_t]) + fi + ]) + AC_MSG_RESULT($socklen_t_equiv) + AC_DEFINE_UNQUOTED(socklen_t, $socklen_t_equiv, + [type to use in place of socklen_t if not defined])], + [#include +#include ]) +]) + +TYPE_SOCKLEN_T + # # IPv6 # diff --git a/tcp.c b/tcp.c index 6cd5007..21b7539 100644 --- a/tcp.c +++ b/tcp.c @@ -232,7 +232,7 @@ tcp_get_address() { static char ipaddr[32]; struct sockaddr_in sockaddr; - int len = sizeof(sockaddr); + socklen_t len = sizeof(sockaddr); if (getsockname(sock, (struct sockaddr *) &sockaddr, &len) == 0) { unsigned char *ip = (unsigned char *) &sockaddr.sin_addr;