#include "strdup.h"
-#ifdef _WIN32
-typedef void WSAAPI (*freeaddrinfo_func) (struct addrinfo*);
+#if defined _WIN32 || defined __WIN32__
+# define WIN32_NATIVE
+#endif
+
+#ifdef WIN32_NATIVE
typedef int WSAAPI (*getaddrinfo_func) (const char*, const char*,
const struct addrinfo*,
struct addrinfo**);
+typedef void WSAAPI (*freeaddrinfo_func) (struct addrinfo*);
typedef int WSAAPI (*getnameinfo_func) (const struct sockaddr*,
socklen_t, char*, DWORD,
char*, DWORD, int);
static freeaddrinfo_func freeaddrinfo_ptr = NULL;
static getnameinfo_func getnameinfo_ptr = NULL;
-int use_win32_p (void)
+static int
+use_win32_p (void)
{
static int done = 0;
HMODULE h;
};
#endif
-#ifdef _WIN32
+#ifdef WIN32_NATIVE
if (use_win32_p ())
return getaddrinfo_ptr (nodename, servname, hints, res);
#endif
if (!se)
{
char *c;
+ if (!(*servname >= '0' && *servname <= '9'))
+ return EAI_NONAME;
port = strtoul (servname, &c, 10);
- if (*c)
+ if (*c || port > 0xffff)
return EAI_NONAME;
port = htons (port);
}
void
freeaddrinfo (struct addrinfo *ai)
{
-#ifdef _WIN32
+#ifdef WIN32_NATIVE
if (use_win32_p ())
return freeaddrinfo_ptr (ai);
#endif
char *restrict service, socklen_t servicelen,
int flags)
{
-#if _WIN32
+#if WIN32_NATIVE
if (use_win32_p ())
return getnameinfo_ptr (sa, salen, node, nodelen,
service, servicelen, flags);
#if HAVE_IPV4
case AF_INET:
if (!inet_ntop (AF_INET,
- (const void *)
&(((const struct sockaddr_in *) sa)->sin_addr),
node, nodelen))
return EAI_SYSTEM;
#if HAVE_IPV6
case AF_INET6:
if (!inet_ntop (AF_INET6,
- (const void *)
&(((const struct sockaddr_in6 *) sa)->sin6_addr),
node, nodelen))
return EAI_SYSTEM;