From 7efb4c68d9c9097953b6403fd4e8439072a4cd75 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Thu, 29 Jun 2006 15:16:56 +0000 Subject: [PATCH] Various small tweaks. --- lib/ChangeLog | 9 +++++++++ lib/getaddrinfo.c | 23 ++++++++++++++--------- lib/getaddrinfo.h | 2 +- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/lib/ChangeLog b/lib/ChangeLog index e2f13308c4..8ede6b46ce 100644 --- 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 index a058949a40..ccc9d2ad55 100644 --- 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 getaddrinfo_func getaddrinfo_ptr = NULL; 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 @@ getaddrinfo (const char *restrict nodename, }; #endif -#ifdef _WIN32 +#ifdef WIN32_NATIVE if (use_win32_p ()) return getaddrinfo_ptr (nodename, servname, hints, res); #endif @@ -162,8 +167,10 @@ getaddrinfo (const char *restrict nodename, 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 @@ getaddrinfo (const char *restrict nodename, void freeaddrinfo (struct addrinfo *ai) { -#ifdef _WIN32 +#ifdef WIN32_NATIVE if (use_win32_p ()) return freeaddrinfo_ptr (ai); #endif @@ -307,7 +314,7 @@ int getnameinfo(const struct sockaddr *restrict sa, socklen_t salen, 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 @@ int getnameinfo(const struct sockaddr *restrict sa, socklen_t salen, #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 @@ int getnameinfo(const struct sockaddr *restrict sa, socklen_t salen, #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 index 72aa8628be..bbf71f22e4 100644 --- a/lib/getaddrinfo.h +++ b/lib/getaddrinfo.h @@ -134,7 +134,7 @@ extern const char *gai_strerror (int ecode); # 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, -- 2.30.2