+#if defined( WIN32 ) && !defined( UNDER_CE )
+ /*
+ * Here is the kind of kludge you need to keep binary compatibility among
+ * varying OS versions...
+ */
+typedef int (WSAAPI * GETNAMEINFO) ( const struct sockaddr FAR *, socklen_t,
+ char FAR *, DWORD, char FAR *, DWORD, int );
+typedef int (WSAAPI * GETADDRINFO) (const char FAR *, const char FAR *,
+ const struct addrinfo FAR *,
+ struct addrinfo FAR * FAR *);
+
+typedef void (WSAAPI * FREEADDRINFO) ( struct addrinfo FAR * );
+
+static int WSAAPI _ws2_getnameinfo_bind ( const struct sockaddr FAR *, socklen_t,
+ char FAR *, DWORD, char FAR *, DWORD, int );
+static int WSAAPI _ws2_getaddrinfo_bind (const char FAR *, const char FAR *,
+ const struct addrinfo FAR *,
+ struct addrinfo FAR * FAR *);
+
+static GETNAMEINFO ws2_getnameinfo = _ws2_getnameinfo_bind;
+static GETADDRINFO ws2_getaddrinfo = _ws2_getaddrinfo_bind;
+static FREEADDRINFO ws2_freeaddrinfo;
+
+static FARPROC ws2_find_api (LPCTSTR name)
+{
+ FARPROC f = NULL;
+
+ HMODULE m = GetModuleHandle (TEXT("WS2_32"));
+ if (m != NULL)
+ f = GetProcAddress (m, name);
+
+ if (f == NULL)
+ {
+ /* Windows 2K IPv6 preview */
+ m = LoadLibrary (TEXT("WSHIP6"));
+ if (m != NULL)
+ f = GetProcAddress (m, name);
+ }
+
+ return f;
+}
+
+static WSAAPI int _ws2_getnameinfo_bind( const struct sockaddr FAR * sa, socklen_t salen,
+ char FAR *host, DWORD hostlen, char FAR *serv, DWORD servlen, int flags )
+{
+ GETNAMEINFO entry = (GETNAMEINFO)ws2_find_api (TEXT("getnameinfo"));
+ int result;
+
+ if (entry == NULL)
+ {
+ /* not found, use replacement API instead */
+ entry = getnameinfo;
+
+ }
+ /* call API before replacing function pointer to avoid crash */
+ result = entry (sa, salen, host, hostlen, serv, servlen, flags);
+ ws2_getnameinfo = entry;
+ return result;
+}
+#undef getnameinfo
+#define getnameinfo ws2_getnameinfo
+
+static WSAAPI int _ws2_getaddrinfo_bind(const char FAR *node, const char FAR *service,
+ const struct addrinfo FAR *hints, struct addrinfo FAR * FAR *res)
+{
+ GETADDRINFO entry;
+ FREEADDRINFO freentry;
+ int result;
+
+ entry = (GETADDRINFO)ws2_find_api (TEXT("getaddrinfo"));
+ freentry = (FREEADDRINFO)ws2_find_api (TEXT("freeaddrinfo"));
+
+ if ((entry == NULL) || (freentry == NULL))
+ {
+ /* not found, use replacement API instead */
+ entry = getaddrinfo;
+ freentry = freeaddrinfo;
+ }
+ /* call API before replacing function pointer to avoid crash */
+ result = entry (node, service, hints, res);
+ ws2_freeaddrinfo = freentry;
+ ws2_getaddrinfo = entry;
+ return result;
+}
+#undef getaddrinfo
+#undef freeaddrinfo
+#define getaddrinfo ws2_getaddrinfo
+#define freeaddrinfo ws2_freeaddrinfo
+#define HAVE_GETADDRINFO
+#endif
+
+