From: hniksic Date: Tue, 9 Aug 2005 12:45:45 +0000 (-0700) Subject: [svn] Handle IPv4 addresses in inet_ntop. X-Git-Tag: v1.13~741 X-Git-Url: http://sjero.net/git/?p=wget;a=commitdiff_plain;h=dd8eafb6c9ee042bdd71ebd84d8115a8c46e0dac [svn] Handle IPv4 addresses in inet_ntop. --- diff --git a/src/ChangeLog b/src/ChangeLog index 762ad73a..6b9f90ca 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2005-08-09 Hrvoje Niksic + + * mswindows.c (inet_ntop): Also handle IPv4 addresses for + completeness. + 2005-08-09 Hrvoje Niksic * http.c (gethttp): Don't read more than the amount of data diff --git a/src/mswindows.c b/src/mswindows.c index 17d14a73..e160e958 100644 --- a/src/mswindows.c +++ b/src/mswindows.c @@ -799,22 +799,39 @@ windows_strerror (int err) } #ifdef ENABLE_IPV6 -/* An IPv6-only inet_ntop that prints with WSAAddressToString. (Wget - uses inet_ntoa for IPv4 addresses -- see print_address.) Prototype - complies with POSIX 1003.1-2004. */ +/* An inet_ntop implementation that uses WSAAddressToString. + Prototype complies with POSIX 1003.1-2004. This is only used under + IPv6 because Wget prints IPv4 addresses using inet_ntoa. */ const char * inet_ntop (int af, const void *src, char *dst, socklen_t cnt) { - struct sockaddr_in6 sin6; + /* struct sockaddr can't accomodate struct sockaddr_in6. */ + union { + struct sockaddr_in6 sin6; + struct sockaddr_in sin; + } sa; DWORD dstlen = cnt; + size_t srcsize; - 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) + xzero (sa); + switch (af) + { + case AF_INET: + sa.sin.sin_family = AF_INET; + sa.sin.sin_addr = *(struct in_addr *) src; + srcsize = sizeof (sa.sin); + break; + case AF_INET6: + sa.sin6.sin6_family = AF_INET6; + sa.sin6.sin6_addr = *(struct in6_addr *) src; + srcsize = sizeof (sa.sin6); + break; + default: + abort (); + } + + if (WSAAddressToString ((struct sockaddr *) &sa, srcsize, NULL, dst, &dstlen) != 0) { errno = WSAGetLastError(); return NULL;