Jeff Latimer : ws2_32: IPv6 functionality for WSAAddressToStringW.

Alexandre Julliard julliard at winehq.org
Fri Jul 17 09:03:42 CDT 2009


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

Author: Jeff Latimer <lats at yless4u.com.au>
Date:   Fri Jul 17 20:25:59 2009 +1000

ws2_32: IPv6 functionality for WSAAddressToStringW.

---

 dlls/ws2_32/socket.c     |   34 +++++++++++-----------------------
 dlls/ws2_32/tests/sock.c |   15 +++------------
 2 files changed, 14 insertions(+), 35 deletions(-)

diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index 0df61c7..96be7ca 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -5001,42 +5001,30 @@ INT WINAPI WSAAddressToStringA( LPSOCKADDR sockaddr, DWORD len,
  *
  * NOTES
  *  The 'info' parameter is ignored.
- *
- * BUGS
- *  Only supports AF_INET addresses.
  */
 INT WINAPI WSAAddressToStringW( LPSOCKADDR sockaddr, DWORD len,
                                 LPWSAPROTOCOL_INFOW info, LPWSTR string,
                                 LPDWORD lenstr )
 {
-    DWORD size;
-    WCHAR buffer[22]; /* 12 digits + 3 dots + ':' + 5 digits + '\0' */
-    static const WCHAR format[] = { '%','u','.','%','u','.','%','u','.','%','u',':','%','u',0 };
-    WCHAR *p;
+    INT   ret;
+    DWORD size, sizew;
+    WCHAR buffer[54]; /* 32 digits + 7':' + '[' + '%" + 5 digits + ']:' + 5 digits + '\0' */
+    CHAR bufAddr[54];
 
-    TRACE( "(%p, %x, %p, %p, %p)\n", sockaddr, len, info, string, lenstr );
-
-    if (!sockaddr || len < sizeof(SOCKADDR_IN)) return SOCKET_ERROR;
-    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;
+    TRACE( "(%p, %d, %p, %p, %p)\n", sockaddr, len, info, string, lenstr );
 
-    sprintfW( buffer, format,
-              (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 ) );
+    size = *lenstr;
+    ret = WSAAddressToStringA(sockaddr, len, NULL, bufAddr, &size);
 
-    p = strchrW( buffer, ':' );
-    if (!((SOCKADDR_IN *)sockaddr)->sin_port) *p = 0;
+    if (ret) return ret;
 
-    size = strlenW( buffer ) + 1;
+    sizew = sizeof( buffer );
+    MultiByteToWideChar( CP_ACP, 0, bufAddr, size, buffer, sizew );
 
     if (*lenstr <  size)
     {
         *lenstr = size;
+        WSASetLastError(WSAEFAULT);
         return SOCKET_ERROR;
     }
 
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index 2e3729d..b1db361 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -1575,13 +1575,9 @@ static void test_WSAAddressToStringW(void)
     memcpy (sockaddr6.sin6_addr.s6_addr, addr6_1, sizeof(addr6_1));
 
     ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len );
-  todo_wine
-  {
     ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
-
     ok( !lstrcmpW( address6, expect6_1 ), "Wrong string returned\n" );
     ok( len == sizeof(expect6_1)/sizeof(WCHAR), "Got %d\n", len);
-  }
 
     /* Test a longer IPv6 address */
     len = sizeof(address6)/sizeof(WCHAR);
@@ -1592,13 +1588,10 @@ static void test_WSAAddressToStringW(void)
     memcpy (sockaddr6.sin6_addr.s6_addr, addr6_2, sizeof(addr6_2));
 
     ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len );
-  todo_wine
-  {
     ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
 
     ok( !lstrcmpW( address6, expect6_2 ), "Wrong string returned\n" );
     ok( len == sizeof(expect6_2)/sizeof(WCHAR), "Got %d\n", len);
-  }
 
     /* Test IPv6 address and port number */
     len = sizeof(address6)/sizeof(WCHAR);
@@ -1609,10 +1602,9 @@ static void test_WSAAddressToStringW(void)
     memcpy (sockaddr6.sin6_addr.s6_addr, addr6_3, sizeof(addr6_3));
 
     ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len );
+    ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
   todo_wine
   {
-    ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
-
     ok( !lstrcmpW( address6, expect6_3 ), "Wrong string returned\n" );
     ok( len == sizeof(expect6_3)/sizeof(WCHAR), "Got %d\n", len);
   }
@@ -1626,9 +1618,9 @@ static void test_WSAAddressToStringW(void)
     memcpy (sockaddr6.sin6_addr.s6_addr, addr6_3, sizeof(addr6_3));
 
     ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len );
+    ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
   todo_wine
   {
-    ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
     ok( !lstrcmpW( address6, expect6_3_2 ), "Wrong string returned\n" );
     ok( len == sizeof(expect6_3_2)/sizeof(WCHAR), "Got %d\n", len);
   }
@@ -1642,10 +1634,9 @@ static void test_WSAAddressToStringW(void)
     memcpy (sockaddr6.sin6_addr.s6_addr, addr6_3, sizeof(addr6_3));
 
     ret = WSAAddressToStringW( (SOCKADDR*)&sockaddr6, sizeof(sockaddr6), NULL, address6, &len );
+    ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
   todo_wine
   {
-    ok( !ret, "WSAAddressToStringW() failed unexpectedly: %d\n", WSAGetLastError() );
-
     ok( !lstrcmpW( address6, expect6_3_3 ), "Wrong string returned\n" );
     ok( len == sizeof(expect6_3_3)/sizeof(WCHAR), "Got %d\n", len);
   }




More information about the wine-cvs mailing list