]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/sckaddr.cpp
simpler define handling
[wxWidgets.git] / src / common / sckaddr.cpp
index ab3c0cdee80e3983f3dddcf6a005fa8d22157308..b706132e5c7201b5a9808422b5539e5bb60f9114 100644 (file)
@@ -46,6 +46,8 @@
 #include "wx/private/socket.h"
 #include "wx/private/sckaddr.h"
 
 #include "wx/private/socket.h"
 #include "wx/private/sckaddr.h"
 
+#include <errno.h>
+
 #ifdef __UNIX__
     #include <netdb.h>
     #include <arpa/inet.h>
 #ifdef __UNIX__
     #include <netdb.h>
     #include <arpa/inet.h>
@@ -119,20 +121,34 @@ IMPLEMENT_DYNAMIC_CLASS(wxUNIXaddress, wxSockAddress)
 #endif
 
 // the _r functions need the extra buffer parameter but unfortunately its type
 #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
 #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
 
 #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
 
 #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) || \
     #define wxLOCK_GETBY_MUTEX(name)
 #else // may need mutexes to protect getxxxbyxxx() calls
     #if defined(HAVE_GETHOSTBYNAME) || \
@@ -367,7 +383,7 @@ servent *deepCopyServent(servent *s,
 servent *wxGetservbyname_r(const char *port,
                            const char *protocol,
                            servent *serv,
 servent *wxGetservbyname_r(const char *port,
                            const char *protocol,
                            servent *serv,
-                           wxGetservBuf buffer,
+                           wxGetservBuf& buffer,
                            int size)
 {
     servent *se;
                            int size)
 {
     servent *se;
@@ -376,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)
 #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);
 
 #elif defined(HAVE_GETSERVBYNAME)
     wxLOCK_GETBY_MUTEX(serv);
 
@@ -705,6 +722,16 @@ wxString wxSockAddressImpl::GetPath() const
 // wxSockAddress
 // ----------------------------------------------------------------------------
 
 // wxSockAddress
 // ----------------------------------------------------------------------------
 
+const sockaddr *wxSockAddress::GetAddressData() const
+{
+    return GetAddress().GetAddr();
+}
+
+int wxSockAddress::GetAddressDataLen() const
+{
+    return GetAddress().GetLen();
+}
+
 void wxSockAddress::Init()
 {
     if ( !wxSocketBase::IsInitialized() )
 void wxSockAddress::Init()
 {
     if ( !wxSocketBase::IsInitialized() )