]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/sckaddr.cpp
Reorganize wxCollapsiblePane event and layout code under GTK+
[wxWidgets.git] / src / common / sckaddr.cpp
index 6f7601842ebdee0e5c72196e17ae9bd822ef7a05..9e2b8682e748692f8b2704605be2bba5e428d975 100644 (file)
@@ -46,6 +46,8 @@
 #include "wx/private/socket.h"
 #include "wx/private/sckaddr.h"
 
+#include <errno.h>
+
 #ifdef __UNIX__
     #include <netdb.h>
     #include <arpa/inet.h>
@@ -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 <wspiapi.h>
+        #ifdef __VISUALC__
+            #pragma warning(default:4706)
+        #endif
+    #endif
 #endif // __WXMSW__
 
 // we assume that we have gethostbyaddr_r() if and only if we have
@@ -102,15 +121,29 @@ 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;
+    struct wxGetservBuf : servent_data
+    {
+        wxGethostBuf()
+        {
+            memset(this, 0, sizeof(servent_data));
+        }
+    };
 #else
     typedef char wxGetservBuf[1024];
 #endif