Some platforms that use socklen_t don't use it for the fifth argument to
getsockopt. Do a separate test and define SOCKOPTLEN_T appropriately. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@31159 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
61
configure.in
61
configure.in
@@ -5043,6 +5043,67 @@ if test "$wxUSE_SOCKETS" = "yes" ; then
|
|||||||
else
|
else
|
||||||
AC_DEFINE_UNQUOTED(SOCKLEN_T, $wx_cv_type_getsockname3)
|
AC_DEFINE_UNQUOTED(SOCKLEN_T, $wx_cv_type_getsockname3)
|
||||||
fi
|
fi
|
||||||
|
dnl Do this again for getsockopt as it may be different
|
||||||
|
AC_CACHE_CHECK([what is the type of the fifth argument of getsockopt],
|
||||||
|
wx_cv_type_getsockopt5,
|
||||||
|
[
|
||||||
|
AC_TRY_COMPILE(
|
||||||
|
[
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
],
|
||||||
|
[
|
||||||
|
socklen_t len;
|
||||||
|
getsockopt(0, 0, 0, 0, &len);
|
||||||
|
],
|
||||||
|
wx_cv_type_getsockopt5=socklen_t,
|
||||||
|
[
|
||||||
|
dnl the compiler will compile the version with size_t
|
||||||
|
dnl even if the real type of the last parameter is int
|
||||||
|
dnl but it should give at least a warning about
|
||||||
|
dnl converting between incompatible pointer types, so
|
||||||
|
dnl try to use it to get the correct behaviour at
|
||||||
|
dnl least with gcc (otherwise we'd always use size_t)
|
||||||
|
CFLAGS_OLD="$CFLAGS"
|
||||||
|
if test "$GCC" = yes ; then
|
||||||
|
CFLAGS="$CFLAGS -Werror"
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_TRY_COMPILE(
|
||||||
|
[
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
],
|
||||||
|
[
|
||||||
|
size_t len;
|
||||||
|
getsockopt(0, 0, 0, 0, &len);
|
||||||
|
],
|
||||||
|
wx_cv_type_getsockopt5=size_t,
|
||||||
|
AC_TRY_COMPILE(
|
||||||
|
[
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
],
|
||||||
|
[
|
||||||
|
int len;
|
||||||
|
getsockopt(0, 0, 0, 0, &len);
|
||||||
|
],
|
||||||
|
wx_cv_type_getsockopt5=int,
|
||||||
|
wx_cv_type_getsockopt5=unknown
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
CFLAGS="$CFLAGS_OLD"
|
||||||
|
]
|
||||||
|
)
|
||||||
|
])
|
||||||
|
|
||||||
|
if test "$wx_cv_type_getsockopt5" = "unknown"; then
|
||||||
|
wxUSE_SOCKETS=no
|
||||||
|
AC_MSG_WARN([Couldn't find socklen_t synonym for this system])
|
||||||
|
else
|
||||||
|
AC_DEFINE_UNQUOTED(SOCKOPTLEN_T, $wx_cv_type_getsockopt5)
|
||||||
|
fi
|
||||||
AC_LANG_POP
|
AC_LANG_POP
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
@@ -117,14 +117,12 @@ int _System soclose(int);
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#else
|
|
||||||
/* undefine for OSX - its really an int */
|
|
||||||
# ifdef __DARWIN__
|
|
||||||
# undef SOCKLEN_T
|
|
||||||
# define SOCKLEN_T int
|
|
||||||
# endif
|
|
||||||
#endif /* SOCKLEN_T */
|
#endif /* SOCKLEN_T */
|
||||||
|
|
||||||
|
#ifndef SOCKOPTLEN_T
|
||||||
|
#define SOCKOPTLEN_T SOCKLEN_T
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* MSW defines this, Unices don't.
|
* MSW defines this, Unices don't.
|
||||||
*/
|
*/
|
||||||
@@ -698,7 +696,7 @@ GSocketError GSocket::Connect(GSocketStream stream)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
SOCKLEN_T len = sizeof(error);
|
SOCKOPTLEN_T len = sizeof(error);
|
||||||
|
|
||||||
getsockopt(m_fd, SOL_SOCKET, SO_ERROR, (char*) &error, &len);
|
getsockopt(m_fd, SOL_SOCKET, SO_ERROR, (char*) &error, &len);
|
||||||
|
|
||||||
@@ -983,7 +981,7 @@ GSocketEventFlags GSocket::Select(GSocketEventFlags flags)
|
|||||||
if (m_establishing && !m_server)
|
if (m_establishing && !m_server)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
SOCKLEN_T len = sizeof(error);
|
SOCKOPTLEN_T len = sizeof(error);
|
||||||
|
|
||||||
m_establishing = false;
|
m_establishing = false;
|
||||||
|
|
||||||
@@ -1138,7 +1136,7 @@ void GSocket::UnsetCallback(GSocketEventFlags flags)
|
|||||||
GSocketError GSocket::GetSockOpt(int level, int optname,
|
GSocketError GSocket::GetSockOpt(int level, int optname,
|
||||||
void *optval, int *optlen)
|
void *optval, int *optlen)
|
||||||
{
|
{
|
||||||
if (getsockopt(m_fd, level, optname, (char*)optval, (SOCKLEN_T*)optlen) == 0)
|
if (getsockopt(m_fd, level, optname, (char*)optval, (SOCKOPTLEN_T*)optlen) == 0)
|
||||||
{
|
{
|
||||||
return GSOCK_NOERROR;
|
return GSOCK_NOERROR;
|
||||||
}
|
}
|
||||||
@@ -1405,7 +1403,7 @@ void GSocket::Detected_Write()
|
|||||||
if (m_establishing && !m_server)
|
if (m_establishing && !m_server)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
SOCKLEN_T len = sizeof(error);
|
SOCKOPTLEN_T len = sizeof(error);
|
||||||
|
|
||||||
m_establishing = false;
|
m_establishing = false;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user