# HG changeset patch # User Bruno Haible # Date 1151594216 0 # Node ID 5c4cc6c7a8c0bc14c05c11f84932a129811db5fd # Parent fda12264b6e274a47c19e07b69b1747fbfd2309f Various small tweaks. diff --git a/lib/ChangeLog b/lib/ChangeLog --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,12 @@ +2006-06-28 Bruno Haible + + * getaddrinfo.h: Fix POSIX URL. + * getaddrinfo.c (WIN32_NATIVE): New macro. Use it instead of _WIN32. + (use_win32_p): Make static. + (getaddrinfo): Reject service name if it is empty or does not consist + solely of decimal digits, or if its value is > 65535. + (getnameinfo): Remove useless casts. + 2006-06-28 Derek R. Price * savedir.c (CLOSEDIR): Remove. All uses changed to closedir. diff --git a/lib/getaddrinfo.c b/lib/getaddrinfo.c --- a/lib/getaddrinfo.c +++ b/lib/getaddrinfo.c @@ -40,11 +40,15 @@ #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); @@ -53,7 +57,8 @@ 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; @@ -128,7 +133,7 @@ }; #endif -#ifdef _WIN32 +#ifdef WIN32_NATIVE if (use_win32_p ()) return getaddrinfo_ptr (nodename, servname, hints, res); #endif @@ -162,8 +167,10 @@ 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); } @@ -285,7 +292,7 @@ void freeaddrinfo (struct addrinfo *ai) { -#ifdef _WIN32 +#ifdef WIN32_NATIVE if (use_win32_p ()) return freeaddrinfo_ptr (ai); #endif @@ -307,7 +314,7 @@ 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); @@ -347,7 +354,6 @@ #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; @@ -357,7 +363,6 @@ #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; diff --git a/lib/getaddrinfo.h b/lib/getaddrinfo.h --- a/lib/getaddrinfo.h +++ b/lib/getaddrinfo.h @@ -134,7 +134,7 @@ # if !HAVE_DECL_GETNAMEINFO /* Convert socket address to printable node and service names. For more details, see the POSIX:2001 specification - . */ + . */ extern int getnameinfo(const struct sockaddr *restrict sa, socklen_t salen, char *restrict node, socklen_t nodelen, char *restrict service, socklen_t servicelen,