Jeff Latimer : ws2_32: IPv6 functionality for WSAAddressToStringA.

Alexandre Julliard julliard at winehq.org
Wed Apr 29 10:20:21 CDT 2009


Module: wine
Branch: master
Commit: 2fa64f52e7cdd3065d86d1ccbc7d50bdd6701fd9
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=2fa64f52e7cdd3065d86d1ccbc7d50bdd6701fd9

Author: Jeff Latimer <lats at yless4u.com.au>
Date:   Mon Apr 27 20:49:19 2009 +1000

ws2_32: IPv6 functionality for WSAAddressToStringA.

---

 dlls/ws2_32/socket.c     |   39 +++++++++++++++++++++++++++++----------
 dlls/ws2_32/tests/sock.c |   12 +++---------
 2 files changed, 32 insertions(+), 19 deletions(-)

diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index 01ebd7c..dddc9af 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -4922,7 +4922,7 @@ INT WINAPI WSAAddressToStringA( LPSOCKADDR sockaddr, DWORD len,
                                 LPDWORD lenstr )
 {
     DWORD size;
-    CHAR buffer[22]; /* 12 digits + 3 dots + ':' + 5 digits + '\0' */
+    CHAR buffer[54]; /* 32 digits + 7':' + '[' + '%" + 5 digits + ']:' + 5 digits + '\0' */
     CHAR *p;
 
     TRACE( "(%p, %d, %p, %p, %p)\n", sockaddr, len, info, string, lenstr );
@@ -4931,17 +4931,36 @@ INT WINAPI WSAAddressToStringA( LPSOCKADDR sockaddr, DWORD len,
     if (!string || !lenstr) return SOCKET_ERROR;
 
     /* sin_family is guaranteed to be the first u_short */
-    if (((SOCKADDR_IN *)sockaddr)->sin_family != AF_INET) return SOCKET_ERROR;
+    switch(((SOCKADDR_IN *)sockaddr)->sin_family)
+    {
+    case WS_AF_INET:
+        sprintf( buffer, "%u.%u.%u.%u:%u",
+               (unsigned int)(ntohl( ((SOCKADDR_IN *)sockaddr)->sin_addr.WS_s_addr ) >> 24 & 0xff),
+               (unsigned int)(ntohl( ((SOCKADDR_IN *)sockaddr)->sin_addr.WS_s_addr ) >> 16 & 0xff),
+               (unsigned int)(ntohl( ((SOCKADDR_IN *)sockaddr)->sin_addr.WS_s_addr ) >> 8 & 0xff),
+               (unsigned int)(ntohl( ((SOCKADDR_IN *)sockaddr)->sin_addr.WS_s_addr ) & 0xff),
+               ntohs( ((SOCKADDR_IN *)sockaddr)->sin_port ) );
+
+        p = strchr( buffer, ':' );
+        if (!((SOCKADDR_IN *)sockaddr)->sin_port) *p = 0;
+        break;
 
-    sprintf( buffer, "%u.%u.%u.%u:%u",
-             (unsigned int)(ntohl( ((SOCKADDR_IN *)sockaddr)->sin_addr.WS_s_addr ) >> 24 & 0xff),
-             (unsigned int)(ntohl( ((SOCKADDR_IN *)sockaddr)->sin_addr.WS_s_addr ) >> 16 & 0xff),
-             (unsigned int)(ntohl( ((SOCKADDR_IN *)sockaddr)->sin_addr.WS_s_addr ) >> 8 & 0xff),
-             (unsigned int)(ntohl( ((SOCKADDR_IN *)sockaddr)->sin_addr.WS_s_addr ) & 0xff),
-             ntohs( ((SOCKADDR_IN *)sockaddr)->sin_port ) );
+    case WS_AF_INET6:
+    {
+        struct WS_sockaddr_in6 *sockaddr6 = (LPSOCKADDR_IN6) sockaddr;
 
-    p = strchr( buffer, ':' );
-    if (!((SOCKADDR_IN *)sockaddr)->sin_port) *p = 0;
+        if (!WS_inet_ntop(WS_AF_INET6, &sockaddr6->sin6_addr, buffer, sizeof(buffer)))
+        {
+            WSASetLastError(WSAEINVAL);
+            return SOCKET_ERROR;
+        }
+        break;
+    }
+
+    default:
+        WSASetLastError(WSAEINVAL);
+        return SOCKET_ERROR;
+    }
 
     size = strlen( buffer ) + 1;
 
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index 358eabd..54ffee7 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -1371,12 +1371,9 @@ static void test_WSAAddressToStringA(void)
     memcpy (sockaddr6.sin6_addr.s6_addr, addr6_1, sizeof(addr6_1));
 
     ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len );
-  todo_wine
-  {
     ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
     ok( !strcmp( address6, expect6_1 ), "Expected: %s, got: %s\n", expect6_1, address6 );
     ok( len == sizeof(expect6_1), "Got size %d\n", len);
-  }
 
     /* Test a longer IPv6 address */
     len = sizeof(address6);
@@ -1387,12 +1384,9 @@ static void test_WSAAddressToStringA(void)
     memcpy (sockaddr6.sin6_addr.s6_addr, addr6_2, sizeof(addr6_2));
 
     ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len );
-  todo_wine
-  {
     ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
     ok( !strcmp( address6, expect6_2 ), "Expected: %s, got: %s\n", expect6_2, address6 );
     ok( len == sizeof(expect6_2), "Got size %d\n", len);
-  }
 
     /* Test IPv6 address and port number */
     len = sizeof(address6);
@@ -1403,9 +1397,9 @@ static void test_WSAAddressToStringA(void)
     memcpy (sockaddr6.sin6_addr.s6_addr, addr6_3, sizeof(addr6_3));
 
     ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len );
+    ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
   todo_wine
   {
-    ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
     ok( !strcmp( address6, expect6_3 ), "Expected: %s, got: %s\n", expect6_3, address6 );
     ok( len == sizeof(expect6_3), "Got size %d\n", len);
   }
@@ -1419,9 +1413,9 @@ static void test_WSAAddressToStringA(void)
     memcpy (sockaddr6.sin6_addr.s6_addr, addr6_3, sizeof(addr6_3));
 
     ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len );
+    ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
   todo_wine
   {
-    ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
     ok( !strcmp( address6, expect6_3_2 ), "Expected: %s, got: %s\n", expect6_3_2, address6 );
     ok( len == sizeof(expect6_3_2), "Got size %d\n", len);
   }
@@ -1435,9 +1429,9 @@ static void test_WSAAddressToStringA(void)
     memcpy (sockaddr6.sin6_addr.s6_addr, addr6_3, sizeof(addr6_3));
 
     ret = WSAAddressToStringA( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len );
+    ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
   todo_wine
   {
-    ok( !ret, "WSAAddressToStringA() failed unexpectedly: %d\n", WSAGetLastError() );
     ok( !strcmp( address6, expect6_3_3 ), "Expected: %s, got: %s\n", expect6_3_3, address6 );
     ok( len == sizeof(expect6_3_3), "Got size %d\n", len);
   }




More information about the wine-cvs mailing list