+2006-06-28 Bruno Haible <bruno@clisp.org>
+
+ * 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 <derek@ximbiot.com>
* savedir.c (CLOSEDIR): Remove. All uses changed to closedir.
#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;
# if !HAVE_DECL_GETNAMEINFO
/* Convert socket address to printable node and service names.
For more details, see the POSIX:2001 specification
- <http://www.opengroup.org/susv3xsh/gai_strerror.html>. */
+ <http://www.opengroup.org/susv3xsh/getnameinfo.html>. */
extern int getnameinfo(const struct sockaddr *restrict sa, socklen_t salen,
char *restrict node, socklen_t nodelen,
char *restrict service, socklen_t servicelen,