From 4d7ce6c1f91c2f8da1be6ace4ba45325e59d7c19 Mon Sep 17 00:00:00 2001 From: Tor Lillqvist Date: Tue, 14 Jun 2005 09:02:29 +0000 Subject: [PATCH] Check also for inet_ntop(). Pre-cache knowledge that we do have 2005-06-13 Tor Lillqvist * configure.in: Check also for inet_ntop(). Pre-cache knowledge that we do have inet_pton() and inet_ntop() on Windows (because we implement them ourselves in soup-dns.c). * libsoup/soup-dns.c (inet_pton, inet_ntop): Fix the Win32 implementations, they were completely bogus. (soup_dns_ntop): Make it compile if HAVE_INET_NTOP. --- ChangeLog | 10 ++++++++ configure.in | 4 +++- libsoup/soup-dns.c | 69 ++++++++++++++++++++++++++++++++++-------------------- 3 files changed, 57 insertions(+), 26 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6a8d937..f26c60a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2005-06-13 Tor Lillqvist + + * configure.in: Check also for inet_ntop(). Pre-cache knowledge + that we do have inet_pton() and inet_ntop() on Windows (because we + implement them ourselves in soup-dns.c). + + * libsoup/soup-dns.c (inet_pton, inet_ntop): Fix the Win32 + implementations, they were completely bogus. + (soup_dns_ntop): Make it compile if HAVE_INET_NTOP. + 2005-06-08 Dan Winship * libsoup/soup-connection-ntlm.c (ntlm_authorize_pre): Fix this to diff --git a/configure.in b/configure.in index fb1d70e..f2f5133 100644 --- a/configure.in +++ b/configure.in @@ -89,6 +89,8 @@ case "$host" in os_win32=yes AC_CACHE_VAL(ac_cv_func_getaddrinfo, [ac_cv_func_getaddrinfo=yes]) AC_CACHE_VAL(ac_cv_func_getnameinfo, [ac_cv_func_getnameinfo=yes]) + AC_CACHE_VAL(ac_cv_func_inet_pton, [ac_cv_func_inet_pton=yes]) + AC_CACHE_VAL(ac_cv_func_inet_ntop, [ac_cv_func_inet_ntop=yes]) AC_CACHE_VAL(soup_cv_ipv6, [soup_cv_ipv6=yes]) ;; *) @@ -105,7 +107,7 @@ dnl ********************************* AC_CHECK_FUNC(socket, , AC_CHECK_LIB(socket, socket)) AC_CHECK_FUNC(gethostbyname, , AC_CHECK_LIB(nsl, gethostbyname)) -AC_CHECK_FUNCS(inet_pton inet_aton getaddrinfo getnameinfo) +AC_CHECK_FUNCS(inet_pton inet_ntop inet_aton getaddrinfo getnameinfo) AC_CACHE_CHECK(IPv6 support, soup_cv_ipv6, [ AC_EGREP_HEADER(sockaddr_in6, netinet/in.h, soup_cv_ipv6=yes, soup_cv_ipv6=no) diff --git a/libsoup/soup-dns.c b/libsoup/soup-dns.c index c8bf0bb..876ea43 100644 --- a/libsoup/soup-dns.c +++ b/libsoup/soup-dns.c @@ -40,55 +40,74 @@ #ifdef G_OS_WIN32 static int -inet_pton (int af, - const char *src, - void *dst) +inet_pton(int af, const char* src, void* dst) { int address_length; + struct sockaddr_storage sa; + struct sockaddr_in *sin = (struct sockaddr_in *)&sa; + struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&sa; switch (af) { case AF_INET: address_length = sizeof (struct sockaddr_in); break; - + case AF_INET6: address_length = sizeof (struct sockaddr_in6); break; - + default: - g_assert_not_reached (); - g_error ("invalid address family"); + return -1; } - - return (WSAStringToAddress ((LPTSTR) src, af, NULL, - dst, &address_length) == 0); + + if (WSAStringToAddress ((LPTSTR) src, af, NULL, (LPSOCKADDR) &sa, &address_length) == 0) { + switch (af) { + case AF_INET: + memcpy (dst, &sin->sin_addr, sizeof (struct in_addr)); + break; + + case AF_INET6: + memcpy (dst, &sin6->sin6_addr, sizeof (struct in6_addr)); + break; + } + return 1; + } + + return 0; } -static int -inet_ntop (int af, - const void *src, - char *dst, - int cnt) +static const char* +inet_ntop(int af, const void* src, char* dst, size_t size) { int address_length; - DWORD string_length = cnt; - + DWORD string_length = size; + struct sockaddr_storage sa; + struct sockaddr_in *sin = (struct sockaddr_in *)&sa; + struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&sa; + + memset (&sa, 0, sizeof (sa)); switch (af) { case AF_INET: address_length = sizeof (struct sockaddr_in); + sin->sin_family = af; + memcpy (&sin->sin_addr, src, sizeof (struct in_addr)); break; - + case AF_INET6: address_length = sizeof (struct sockaddr_in6); + sin6->sin6_family = af; + memcpy (&sin6->sin6_addr, src, sizeof (struct in6_addr)); break; - + default: - g_assert_not_reached (); - g_error ("invalid address family"); + return NULL; } - - return (WSAAddressToString ((LPSOCKADDR) src, address_length, NULL, - dst, &string_length) == 0); + + if (WSAAddressToString ((LPSOCKADDR) &sa, address_length, NULL, + dst, &string_length) == 0) + return dst; + + return NULL; } #endif @@ -248,7 +267,7 @@ soup_dns_ntop (struct sockaddr *sa) #ifdef HAVE_INET_NTOP char buffer[INET_ADDRSTRLEN]; - inet_ntop (family, &sin->sin_addr, buffer, sizeof (buffer)); + inet_ntop (AF_INET, &sin->sin_addr, buffer, sizeof (buffer)); return g_strdup (buffer); #else return g_strdup (inet_ntoa (sin->sin_addr)); -- 2.7.4