From e38c88e458ae6bc6734bb041b6293636d2305f00 Mon Sep 17 00:00:00 2001 From: hniksic Date: Thu, 30 Jun 2005 06:48:10 -0700 Subject: [PATCH] [svn] Implement inet_ntop on Windows. --- src/ChangeLog | 10 ++++++++++ src/host.c | 16 ++++------------ src/mswindows.c | 25 +++++++++++++++++++++++++ src/mswindows.h | 3 +-- 4 files changed, 40 insertions(+), 14 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index ee4ebffd..95c48edc 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,13 @@ +2005-06-30 Hrvoje Niksic + + * host.c (pretty_print_address): Handle error result from + inet_ntop. + +2005-06-30 Gisle Vanem + + * mswindows.c (inet_ntop): New function. Print IPv6 addresses + using WSAAddressToString. + 2005-06-27 Hrvoje Niksic * progress.c (dot_update): Remove unused variable row_qty. diff --git a/src/host.c b/src/host.c index 6bf6514a..46dfee8d 100644 --- a/src/host.c +++ b/src/host.c @@ -418,18 +418,10 @@ pretty_print_address (const ip_address *addr) #ifdef ENABLE_IPV6 case IPV6_ADDRESS: { - static char buf[128]; - inet_ntop (AF_INET6, &ADDRESS_IPV6_IN6_ADDR (addr), buf, sizeof (buf)); -#if 0 -#ifdef HAVE_SOCKADDR_IN6_SCOPE_ID - { - /* append "%SCOPE_ID" for all ?non-global? addresses */ - char *p = buf + strlen (buf); - *p++ = '%'; - number_to_string (p, ADDRESS_IPV6_SCOPE (addr)); - } -#endif -#endif + static char buf[64]; + if (!inet_ntop (AF_INET6, &ADDRESS_IPV6_IN6_ADDR (addr), + buf, sizeof (buf))) + snprintf (buf, sizeof buf, "[error: %s]", strerror (errno)); buf[sizeof (buf) - 1] = '\0'; return buf; } diff --git a/src/mswindows.c b/src/mswindows.c index e61e9b8d..2890274b 100644 --- a/src/mswindows.c +++ b/src/mswindows.c @@ -848,3 +848,28 @@ windows_strerror (int err) return buf; } } + +#ifdef ENABLE_IPV6 +/* An IPv6-only inet_ntop that prints with WSAAddressToString. (Wget + uses inet_ntoa for IPv4 addresses -- see pretty_print_address.) + Prototype complies with POSIX 1003.1-2004. */ + +const char * +inet_ntop (int af, const void *src, char *dst, socklen_t cnt) +{ + struct sockaddr_in6 sin6; + DWORD dstlen = cnt; + + assert (af == AF_INET6); + xzero (sin6); + sin6.sin6_family = AF_INET6; + sin6.sin6_addr = *(struct in6_addr *) src; + if (WSAAddressToString ((struct sockaddr *) &sin6, sizeof (sin6), + NULL, dst, &dstlen) != 0) + { + errno = WSAGetLastError(); + return NULL; + } + return (const char *) dst; +} +#endif diff --git a/src/mswindows.h b/src/mswindows.h index fbf04ff2..15edcf0d 100644 --- a/src/mswindows.h +++ b/src/mswindows.h @@ -134,8 +134,7 @@ __int64 str_to_int64 (const char *, char **, int); /* Additional declarations needed for IPv6: */ #ifdef ENABLE_IPV6 -/* Missing declaration? */ -extern const char *inet_ntop (int, const void *, char *, size_t); +const char *inet_ntop (int, const void *, char *, socklen_t); /* MinGW 3.7 (or older) prototypes gai_strerror(), but is missing from all import libraries. */ # ifdef __MINGW32__ -- 2.39.2