X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/169f96cdf78ca9f2691194df9b79771cc54889fe..769c3372a2bd68c45d1a4afc8462d3b7939decb1:/src/common/sckaddr.cpp diff --git a/src/common/sckaddr.cpp b/src/common/sckaddr.cpp index fa142eb5f7..67ca3fbcdf 100644 --- a/src/common/sckaddr.cpp +++ b/src/common/sckaddr.cpp @@ -31,6 +31,7 @@ #include "wx/object.h" #include "wx/log.h" #include "wx/intl.h" + #include "wx/thread.h" #include #include @@ -48,7 +49,7 @@ #include -#ifdef __UNIX__ +#if defined(__UNIX__) && !defined(__CYGWIN__) #include #include #endif // __UNIX__ @@ -81,8 +82,12 @@ IMPLEMENT_DYNAMIC_CLASS(wxUNIXaddress, wxSockAddress) #ifdef __WXMSW__ #define HAVE_INET_ADDR + #ifndef HAVE_GETHOSTBYNAME #define HAVE_GETHOSTBYNAME + #endif + #ifndef HAVE_GETSERVBYNAME #define HAVE_GETSERVBYNAME + #endif // under MSW getxxxbyname() functions are MT-safe (but not reentrant) so // we don't need to serialize calls to them @@ -121,20 +126,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) || \ @@ -369,7 +388,7 @@ servent *deepCopyServent(servent *s, servent *wxGetservbyname_r(const char *port, const char *protocol, servent *serv, - wxGetservBuf buffer, + wxGetservBuf& buffer, int size) { servent *se; @@ -378,7 +397,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); @@ -493,7 +513,7 @@ bool wxSockAddressImpl::SetHostName4(const wxString& name) if ( !addr ) return false; - const wxUTF8Buf namebuf(name.utf8_str()); + const wxScopedCharBuffer namebuf(name.utf8_str()); // first check if this is an address in quad dotted notation #if defined(HAVE_INET_ATON) @@ -680,7 +700,7 @@ bool wxSockAddressImpl::SetPath(const wxString& path) if ( !addr ) return false; - const wxUTF8Buf buf(path.utf8_str()); + const wxScopedCharBuffer buf(path.utf8_str()); if ( strlen(buf) >= UNIX_PATH_MAX ) return false; @@ -707,9 +727,19 @@ 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() ) + if ( wxIsMainThread() && !wxSocketBase::IsInitialized() ) { // we must do it before using any socket functions (void)wxSocketBase::Initialize(); @@ -848,7 +878,7 @@ wxString wxIPV4address::IPAddress() const return wxString::Format ( - "%lu.%lu.%lu.%lu", + "%u.%u.%u.%u", (addr >> 24) & 0xff, (addr >> 16) & 0xff, (addr >> 8) & 0xff,