X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c9bccf239c1506c7eea0bddea44d9e4b76ad1d93..4e916e61ea24c165fb55e78172f1093bf7481b48:/src/common/sckaddr.cpp diff --git a/src/common/sckaddr.cpp b/src/common/sckaddr.cpp index 6f7601842e..b706132e5c 100644 --- a/src/common/sckaddr.cpp +++ b/src/common/sckaddr.cpp @@ -46,6 +46,8 @@ #include "wx/private/socket.h" #include "wx/private/sckaddr.h" +#include + #ifdef __UNIX__ #include #include @@ -74,7 +76,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxUNIXaddress, wxSockAddress) // ============================================================================ // TODO: use POSIX getaddrinfo() (also available in Winsock 2) for simplicity -// and IPv6 support +// and to use the same code for IPv4 and IPv6 support #ifdef __WXMSW__ #define HAVE_INET_ADDR @@ -85,6 +87,23 @@ IMPLEMENT_DYNAMIC_CLASS(wxUNIXaddress, wxSockAddress) // under MSW getxxxbyname() functions are MT-safe (but not reentrant) so // we don't need to serialize calls to them #define wxHAS_MT_SAFE_GETBY_FUNCS + + #if wxUSE_IPV6 + // this header does dynamic dispatching of getaddrinfo/freeaddrinfo() + // by implementing them in its own code if the system versions are not + // available (as is the case for anything < XP) + // + // NB: if this is not available for the other compilers (so far tested + // with MSVC only) we should just use wxDynamicLibrary "manually" + #ifdef __VISUALC__ + // disable a warning occurring in Microsoft own version of this file + #pragma warning(disable:4706) + #endif + #include + #ifdef __VISUALC__ + #pragma warning(default:4706) + #endif + #endif #endif // __WXMSW__ // we assume that we have gethostbyaddr_r() if and only if we have @@ -102,20 +121,34 @@ IMPLEMENT_DYNAMIC_CLASS(wxUNIXaddress, wxSockAddress) #endif // the _r functions need the extra buffer parameter but unfortunately its type -// differs between different systems +// differs between different systems and for the systems which use opaque +// structs for it (at least AIX and OpenBSD) it must be zero-filled before +// being passed to the system functions #ifdef HAVE_FUNC_GETHOSTBYNAME_R_3 - typedef hostent_data wxGethostBuf; + struct wxGethostBuf : hostent_data + { + wxGethostBuf() + { + memset(this, 0, sizeof(hostent_data)); + } + }; #else typedef char wxGethostBuf[1024]; #endif -#ifdef HAVE_FUNC_GETSERVBYNAME_R_3 - typedef servent_data wxGetservBuf; +#ifdef HAVE_FUNC_GETSERVBYNAME_R_4 + struct wxGetservBuf : servent_data + { + wxGethostBuf() + { + memset(this, 0, sizeof(servent_data)); + } + }; #else typedef char wxGetservBuf[1024]; #endif -#ifdef wxHAS_MT_SAFE_GETBY_FUNCS +#if defined(wxHAS_MT_SAFE_GETBY_FUNCS) || !wxUSE_THREADS #define wxLOCK_GETBY_MUTEX(name) #else // may need mutexes to protect getxxxbyxxx() calls #if defined(HAVE_GETHOSTBYNAME) || \ @@ -350,7 +383,7 @@ servent *deepCopyServent(servent *s, servent *wxGetservbyname_r(const char *port, const char *protocol, servent *serv, - wxGetservBuf buffer, + wxGetservBuf& buffer, int size) { servent *se; @@ -359,7 +392,8 @@ servent *wxGetservbyname_r(const char *port, #elif defined(HAVE_FUNC_GETSERVBYNAME_R_5) se = getservbyname_r(port, protocol, serv, buffer, size); #elif defined(HAVE_FUNC_GETSERVBYNAME_R_4) - se = getservbyname_r(port, protocol, serv, &buffer); + if ( getservbyname_r(port, protocol, serv, &buffer) != 0 ) + return NULL; #elif defined(HAVE_GETSERVBYNAME) wxLOCK_GETBY_MUTEX(serv); @@ -688,6 +722,16 @@ wxString wxSockAddressImpl::GetPath() const // wxSockAddress // ---------------------------------------------------------------------------- +const sockaddr *wxSockAddress::GetAddressData() const +{ + return GetAddress().GetAddr(); +} + +int wxSockAddress::GetAddressDataLen() const +{ + return GetAddress().GetLen(); +} + void wxSockAddress::Init() { if ( !wxSocketBase::IsInitialized() )