[PATCH 1/5] ws2_32: Move address/string conversion functions to protocol.c.

Zebediah Figura z.figura12 at gmail.com
Mon May 3 21:42:50 CDT 2021


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/ws2_32/protocol.c | 369 ++++++++++++++++++++++++++++++++++++
 dlls/ws2_32/socket.c   | 411 -----------------------------------------
 2 files changed, 369 insertions(+), 411 deletions(-)

diff --git a/dlls/ws2_32/protocol.c b/dlls/ws2_32/protocol.c
index 2cb6ef4be1c..fe30f26db53 100644
--- a/dlls/ws2_32/protocol.c
+++ b/dlls/ws2_32/protocol.c
@@ -1653,3 +1653,372 @@ struct WS_servent * WINAPI WS_getservbyport( int port, const char *proto )
     TRACE( "%d (i.e. port %d), %s ret %p\n", port, (int)ntohl(port), debugstr_a(proto), retval );
     return retval;
 }
+
+
+/***********************************************************************
+ *      inet_ntoa   (ws2_32.12)
+ */
+char * WINAPI WS_inet_ntoa( struct WS_in_addr in )
+{
+    unsigned int long_ip = ntohl( in.WS_s_addr );
+    struct per_thread_data *data = get_per_thread_data();
+
+    sprintf( data->ntoa_buffer, "%u.%u.%u.%u",
+             (long_ip >> 24) & 0xff,
+             (long_ip >> 16) & 0xff,
+             (long_ip >> 8) & 0xff,
+             long_ip & 0xff );
+
+    return data->ntoa_buffer;
+}
+
+
+/***********************************************************************
+ *      inet_ntop   (ws2_32.@)
+ */
+const char * WINAPI WS_inet_ntop( int family, void *addr, char *buffer, SIZE_T len )
+{
+    NTSTATUS status;
+    ULONG size = min( len, (ULONG)-1 );
+
+    TRACE( "family %d, addr %p, buffer %p, len %ld\n", family, addr, buffer, len );
+    if (!buffer)
+    {
+        SetLastError( STATUS_INVALID_PARAMETER );
+        return NULL;
+    }
+
+    switch (family)
+    {
+    case WS_AF_INET:
+    {
+        status = RtlIpv4AddressToStringExA( (IN_ADDR *)addr, 0, buffer, &size );
+        break;
+    }
+    case WS_AF_INET6:
+    {
+        status = RtlIpv6AddressToStringExA( (IN6_ADDR *)addr, 0, 0, buffer, &size );
+        break;
+    }
+    default:
+        SetLastError( WSAEAFNOSUPPORT );
+        return NULL;
+    }
+
+    if (status == STATUS_SUCCESS) return buffer;
+    SetLastError( STATUS_INVALID_PARAMETER );
+    return NULL;
+}
+
+/***********************************************************************
+ *      inet_pton   (ws2_32.@)
+ */
+int WINAPI WS_inet_pton( int family, const char *addr, void *buffer )
+{
+    NTSTATUS status;
+    const char *terminator;
+
+    TRACE( "family %d, addr %s, buffer %p\n", family, debugstr_a(addr), buffer );
+
+    if (!addr || !buffer)
+    {
+        SetLastError( WSAEFAULT );
+        return -1;
+    }
+
+    switch (family)
+    {
+    case WS_AF_INET:
+        status = RtlIpv4StringToAddressA(addr, TRUE, &terminator, buffer);
+        break;
+    case WS_AF_INET6:
+        status = RtlIpv6StringToAddressA(addr, &terminator, buffer);
+        break;
+    default:
+        SetLastError( WSAEAFNOSUPPORT );
+        return -1;
+    }
+
+    return (status == STATUS_SUCCESS && *terminator == 0);
+}
+
+/***********************************************************************
+ *      InetPtonW   (ws2_32.@)
+ */
+int WINAPI InetPtonW( int family, const WCHAR *addr, void *buffer )
+{
+    char *addrA;
+    int len;
+    INT ret;
+
+    TRACE( "family %d, addr %s, buffer %p\n", family, debugstr_w(addr), buffer );
+
+    if (!addr)
+    {
+        SetLastError(WSAEFAULT);
+        return SOCKET_ERROR;
+    }
+
+    len = WideCharToMultiByte( CP_ACP, 0, addr, -1, NULL, 0, NULL, NULL );
+    if (!(addrA = HeapAlloc( GetProcessHeap(), 0, len )))
+    {
+        SetLastError( WSA_NOT_ENOUGH_MEMORY );
+        return -1;
+    }
+    WideCharToMultiByte( CP_ACP, 0, addr, -1, addrA, len, NULL, NULL );
+
+    ret = WS_inet_pton( family, addrA, buffer );
+    if (!ret) SetLastError( WSAEINVAL );
+
+    HeapFree( GetProcessHeap(), 0, addrA );
+    return ret;
+}
+
+/***********************************************************************
+ *      InetNtopW   (ws2_32.@)
+ */
+const WCHAR * WINAPI InetNtopW( int family, void *addr, WCHAR *buffer, SIZE_T len )
+{
+    char bufferA[WS_INET6_ADDRSTRLEN];
+    PWSTR ret = NULL;
+
+    TRACE( "family %d, addr %p, buffer %p, len %ld\n", family, addr, buffer, len );
+
+    if (WS_inet_ntop( family, addr, bufferA, sizeof(bufferA) ))
+    {
+        if (MultiByteToWideChar( CP_ACP, 0, bufferA, -1, buffer, len ))
+            ret = buffer;
+        else
+            SetLastError( ERROR_INVALID_PARAMETER );
+    }
+    return ret;
+}
+
+
+/***********************************************************************
+ *      WSAStringToAddressA   (ws2_32.@)
+ */
+int WINAPI WSAStringToAddressA( char *string, int family, WSAPROTOCOL_INFOA *protocol_info,
+                                struct WS_sockaddr *addr, int *addr_len )
+{
+    NTSTATUS status;
+
+    TRACE( "string %s, family %u\n", debugstr_a(string), family );
+
+    if (!addr || !addr_len) return -1;
+
+    if (!string)
+    {
+        SetLastError( WSAEINVAL );
+        return -1;
+    }
+
+    if (protocol_info)
+        FIXME( "ignoring protocol_info\n" );
+
+    switch (family)
+    {
+    case WS_AF_INET:
+    {
+        struct WS_sockaddr_in *addr4 = (struct WS_sockaddr_in *)addr;
+
+        if (*addr_len < sizeof(struct WS_sockaddr_in))
+        {
+            *addr_len = sizeof(struct WS_sockaddr_in);
+            SetLastError( WSAEFAULT );
+            return -1;
+        }
+        memset( addr, 0, sizeof(struct WS_sockaddr_in) );
+
+        status = RtlIpv4StringToAddressExA( string, FALSE, &addr4->sin_addr, &addr4->sin_port );
+        if (status != STATUS_SUCCESS)
+        {
+            SetLastError( WSAEINVAL );
+            return -1;
+        }
+        addr4->sin_family = WS_AF_INET;
+        *addr_len = sizeof(struct WS_sockaddr_in);
+        return 0;
+    }
+    case WS_AF_INET6:
+    {
+        struct WS_sockaddr_in6 *addr6 = (struct WS_sockaddr_in6 *)addr;
+
+        if (*addr_len < sizeof(struct WS_sockaddr_in6))
+        {
+            *addr_len = sizeof(struct WS_sockaddr_in6);
+            SetLastError( WSAEFAULT );
+            return -1;
+        }
+        memset( addr, 0, sizeof(struct WS_sockaddr_in6) );
+
+        status = RtlIpv6StringToAddressExA( string, &addr6->sin6_addr, &addr6->sin6_scope_id, &addr6->sin6_port );
+        if (status != STATUS_SUCCESS)
+        {
+            SetLastError( WSAEINVAL );
+            return -1;
+        }
+        addr6->sin6_family = WS_AF_INET6;
+        *addr_len = sizeof(struct WS_sockaddr_in6);
+        return 0;
+    }
+    default:
+        /* According to MSDN, only AF_INET and AF_INET6 are supported. */
+        TRACE( "Unsupported address family specified: %d.\n", family );
+        SetLastError( WSAEINVAL );
+        return -1;
+    }
+}
+
+
+/***********************************************************************
+ *      WSAStringToAddressW   (ws2_32.@)
+ */
+int WINAPI WSAStringToAddressW( WCHAR *string, int family, WSAPROTOCOL_INFOW *protocol_info,
+                                struct WS_sockaddr *addr, int *addr_len )
+{
+    WSAPROTOCOL_INFOA infoA;
+    WSAPROTOCOL_INFOA *protocol_infoA = NULL;
+    int sizeA, ret;
+    char *stringA;
+
+    TRACE( "string %s, family %u\n", debugstr_w(string), family );
+
+    if (!addr || !addr_len) return -1;
+
+    if (protocol_info)
+    {
+        protocol_infoA = &infoA;
+        memcpy( protocol_infoA, protocol_info, FIELD_OFFSET( WSAPROTOCOL_INFOA, szProtocol ) );
+
+        if (!WideCharToMultiByte( CP_ACP, 0, protocol_info->szProtocol, -1, protocol_infoA->szProtocol,
+                                  sizeof(protocol_infoA->szProtocol), NULL, NULL ))
+        {
+            SetLastError( WSAEINVAL );
+            return -1;
+        }
+    }
+
+    if (!string)
+    {
+        SetLastError( WSAEINVAL );
+        return -1;
+    }
+
+    sizeA = WideCharToMultiByte( CP_ACP, 0, string, -1, NULL, 0, NULL, NULL );
+    if (!(stringA = HeapAlloc( GetProcessHeap(), 0, sizeA )))
+    {
+        SetLastError( WSA_NOT_ENOUGH_MEMORY );
+        return -1;
+    }
+    WideCharToMultiByte( CP_ACP, 0, string, -1, stringA, sizeA, NULL, NULL );
+    ret = WSAStringToAddressA( stringA, family, protocol_infoA, addr, addr_len );
+    HeapFree( GetProcessHeap(), 0, stringA );
+    return ret;
+}
+
+
+/***********************************************************************
+ *      WSAAddressToStringA   (ws2_32.@)
+ */
+int WINAPI WSAAddressToStringA( struct WS_sockaddr *addr, DWORD addr_len,
+                                WSAPROTOCOL_INFOA *info, char *string, DWORD *string_len )
+{
+    char buffer[54]; /* 32 digits + 7':' + '[' + '%" + 5 digits + ']:' + 5 digits + '\0' */
+    DWORD size;
+
+    TRACE( "addr %s\n", debugstr_sockaddr(addr) );
+
+    if (!addr) return SOCKET_ERROR;
+    if (!string || !string_len) return SOCKET_ERROR;
+
+    switch (addr->sa_family)
+    {
+    case WS_AF_INET:
+    {
+        const struct WS_sockaddr_in *addr4 = (const struct WS_sockaddr_in *)addr;
+        unsigned int long_ip = ntohl( addr4->sin_addr.WS_s_addr );
+        char *p;
+
+        if (addr_len < sizeof(struct WS_sockaddr_in)) return -1;
+        sprintf( buffer, "%u.%u.%u.%u:%u",
+                 (long_ip >> 24) & 0xff,
+                 (long_ip >> 16) & 0xff,
+                 (long_ip >> 8) & 0xff,
+                 long_ip & 0xff,
+                 ntohs( addr4->sin_port ) );
+
+        p = strchr( buffer, ':' );
+        if (!addr4->sin_port) *p = 0;
+        break;
+    }
+    case WS_AF_INET6:
+    {
+        struct WS_sockaddr_in6 *addr6 = (struct WS_sockaddr_in6 *)addr;
+        size_t len;
+
+        buffer[0] = 0;
+        if (addr_len < sizeof(struct WS_sockaddr_in6)) return -1;
+        if (addr6->sin6_port)
+            strcpy( buffer, "[" );
+        len = strlen( buffer );
+        if (!WS_inet_ntop( WS_AF_INET6, &addr6->sin6_addr, &buffer[len], sizeof(buffer) - len ))
+        {
+            SetLastError( WSAEINVAL );
+            return -1;
+        }
+        if (addr6->sin6_scope_id)
+            sprintf( buffer + strlen( buffer ), "%%%u", addr6->sin6_scope_id );
+        if (addr6->sin6_port)
+            sprintf( buffer + strlen( buffer ), "]:%u", ntohs( addr6->sin6_port ) );
+        break;
+    }
+
+    default:
+        SetLastError( WSAEINVAL );
+        return -1;
+    }
+
+    size = strlen( buffer ) + 1;
+
+    if (*string_len < size)
+    {
+        *string_len = size;
+        SetLastError( WSAEFAULT );
+        return -1;
+    }
+
+    TRACE( "=> %s, %u bytes\n", debugstr_a(buffer), size );
+    *string_len = size;
+    strcpy( string, buffer );
+    return 0;
+}
+
+
+/***********************************************************************
+ *      WSAAddressToStringW   (ws2_32.@)
+ */
+int WINAPI WSAAddressToStringW( struct WS_sockaddr *addr, DWORD addr_len,
+                                WSAPROTOCOL_INFOW *info, WCHAR *string, DWORD *string_len )
+{
+    INT ret;
+    char buf[54]; /* 32 digits + 7':' + '[' + '%" + 5 digits + ']:' + 5 digits + '\0' */
+
+    TRACE( "(%p, %d, %p, %p, %p)\n", addr, addr_len, info, string, string_len );
+
+    if ((ret = WSAAddressToStringA( addr, addr_len, NULL, buf, string_len ))) return ret;
+
+    MultiByteToWideChar( CP_ACP, 0, buf, *string_len, string, *string_len );
+    TRACE( "=> %s, %u chars\n", debugstr_w(string), *string_len );
+    return 0;
+}
+
+
+/***********************************************************************
+ *      inet_addr   (ws2_32.11)
+ */
+WS_u_long WINAPI WS_inet_addr( const char *cp )
+{
+    if (!cp) return INADDR_NONE;
+    return inet_addr( cp );
+}
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index 2776e2f0014..3d930d13bb6 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -40,10 +40,6 @@
 # define sipx_node       sipx_addr.x_host.c_host
 #endif  /* __FreeBSD__ */
 
-#ifndef INADDR_NONE
-#define INADDR_NONE ~0UL
-#endif
-
 #if !defined(TCP_KEEPIDLE) && defined(TCP_KEEPALIVE)
 /* TCP_KEEPALIVE is the Mac OS name for TCP_KEEPIDLE */
 #define TCP_KEEPIDLE TCP_KEEPALIVE
@@ -3896,16 +3892,6 @@ int WINAPI WSAHtons(SOCKET s, WS_u_short hostshort, WS_u_short *lpnetshort)
 }
 
 
-/***********************************************************************
- *		inet_addr		(WS2_32.11)
- */
-WS_u_long WINAPI WS_inet_addr(const char *cp)
-{
-    if (!cp) return INADDR_NONE;
-    return inet_addr(cp);
-}
-
-
 /***********************************************************************
  *		ntohl			(WS2_32.14)
  */
@@ -3924,23 +3910,6 @@ WS_u_short WINAPI WS_ntohs(WS_u_short netshort)
 }
 
 
-/***********************************************************************
- *		inet_ntoa		(WS2_32.12)
- */
-char* WINAPI WS_inet_ntoa(struct WS_in_addr in)
-{
-    unsigned int long_ip = ntohl(in.WS_s_addr);
-    struct per_thread_data *data = get_per_thread_data();
-
-    sprintf( data->ntoa_buffer, "%u.%u.%u.%u",
-            (long_ip >> 24) & 0xff,
-            (long_ip >> 16) & 0xff,
-            (long_ip >> 8) & 0xff,
-            long_ip & 0xff);
-
-    return data->ntoa_buffer;
-}
-
 static const char *debugstr_wsaioctl(DWORD code)
 {
     const char *name = NULL, *buf_type, *family;
@@ -6449,386 +6418,6 @@ int WINAPI WSARemoveServiceClass(LPGUID info)
     return SOCKET_ERROR;
 }
 
-/***********************************************************************
- *              inet_ntop                      (WS2_32.@)
- */
-PCSTR WINAPI WS_inet_ntop( INT family, PVOID addr, PSTR buffer, SIZE_T len )
-{
-    NTSTATUS status;
-    ULONG size = min( len, (ULONG)-1 );
-
-    TRACE("family %d, addr (%p), buffer (%p), len %ld\n", family, addr, buffer, len);
-    if (!buffer)
-    {
-        SetLastError( STATUS_INVALID_PARAMETER );
-        return NULL;
-    }
-
-    switch (family)
-    {
-    case WS_AF_INET:
-    {
-        status = RtlIpv4AddressToStringExA( (IN_ADDR *)addr, 0, buffer, &size );
-        break;
-    }
-    case WS_AF_INET6:
-    {
-        status = RtlIpv6AddressToStringExA( (IN6_ADDR *)addr, 0, 0, buffer, &size );
-        break;
-    }
-    default:
-        SetLastError( WSAEAFNOSUPPORT );
-        return NULL;
-    }
-
-    if (status == STATUS_SUCCESS) return buffer;
-    SetLastError( STATUS_INVALID_PARAMETER );
-    return NULL;
-}
-
-/***********************************************************************
-*              inet_pton                      (WS2_32.@)
-*/
-INT WINAPI WS_inet_pton(INT family, const char *addr, void *buffer)
-{
-    NTSTATUS status;
-    const char *terminator;
-
-    TRACE("family %d, addr %s, buffer (%p)\n", family, debugstr_a(addr), buffer);
-
-    if (!addr || !buffer)
-    {
-        SetLastError(WSAEFAULT);
-        return SOCKET_ERROR;
-    }
-
-    switch (family)
-    {
-    case WS_AF_INET:
-        status = RtlIpv4StringToAddressA(addr, TRUE, &terminator, buffer);
-        break;
-    case WS_AF_INET6:
-        status = RtlIpv6StringToAddressA(addr, &terminator, buffer);
-        break;
-    default:
-        SetLastError(WSAEAFNOSUPPORT);
-        return SOCKET_ERROR;
-    }
-
-    return (status == STATUS_SUCCESS && *terminator == 0);
-}
-
-/***********************************************************************
-*              InetPtonW                      (WS2_32.@)
-*/
-INT WINAPI InetPtonW(INT family, PCWSTR addr, PVOID buffer)
-{
-    char *addrA;
-    int len;
-    INT ret;
-
-    TRACE("family %d, addr %s, buffer (%p)\n", family, debugstr_w(addr), buffer);
-
-    if (!addr)
-    {
-        SetLastError(WSAEFAULT);
-        return SOCKET_ERROR;
-    }
-
-    len = WideCharToMultiByte(CP_ACP, 0, addr, -1, NULL, 0, NULL, NULL);
-    if (!(addrA = HeapAlloc(GetProcessHeap(), 0, len)))
-    {
-        SetLastError(WSA_NOT_ENOUGH_MEMORY);
-        return SOCKET_ERROR;
-    }
-    WideCharToMultiByte(CP_ACP, 0, addr, -1, addrA, len, NULL, NULL);
-
-    ret = WS_inet_pton(family, addrA, buffer);
-    if (!ret) SetLastError(WSAEINVAL);
-
-    HeapFree(GetProcessHeap(), 0, addrA);
-    return ret;
-}
-
-/***********************************************************************
- *              InetNtopW                      (WS2_32.@)
- */
-PCWSTR WINAPI InetNtopW(INT family, PVOID addr, PWSTR buffer, SIZE_T len)
-{
-    char bufferA[WS_INET6_ADDRSTRLEN];
-    PWSTR ret = NULL;
-
-    TRACE("family %d, addr (%p), buffer (%p), len %ld\n", family, addr, buffer, len);
-
-    if (WS_inet_ntop(family, addr, bufferA, sizeof(bufferA)))
-    {
-        if (MultiByteToWideChar(CP_ACP, 0, bufferA, -1, buffer, len))
-            ret = buffer;
-        else
-            SetLastError(ERROR_INVALID_PARAMETER);
-    }
-    return ret;
-}
-
-/***********************************************************************
- *              WSAStringToAddressA                      (WS2_32.80)
- */
-INT WINAPI WSAStringToAddressA(LPSTR AddressString,
-                               INT AddressFamily,
-                               LPWSAPROTOCOL_INFOA lpProtocolInfo,
-                               LPSOCKADDR lpAddress,
-                               LPINT lpAddressLength)
-{
-    INT res=0;
-    NTSTATUS status;
-
-    TRACE( "(%s, %x, %p, %p, %p)\n", debugstr_a(AddressString), AddressFamily,
-           lpProtocolInfo, lpAddress, lpAddressLength );
-
-    if (!lpAddressLength || !lpAddress) return SOCKET_ERROR;
-
-    if (!AddressString)
-    {
-        SetLastError(WSAEINVAL);
-        return SOCKET_ERROR;
-    }
-
-    if (lpProtocolInfo)
-        FIXME("ProtocolInfo not implemented.\n");
-
-    switch(AddressFamily)
-    {
-    case WS_AF_INET:
-    {
-        SOCKADDR_IN *addr4 = (SOCKADDR_IN *)lpAddress;
-
-        /* If lpAddressLength is too small, tell caller the size we need */
-        if (*lpAddressLength < sizeof(SOCKADDR_IN))
-        {
-            *lpAddressLength = sizeof(SOCKADDR_IN);
-            res = WSAEFAULT;
-            break;
-        }
-        memset(lpAddress, 0, sizeof(SOCKADDR_IN));
-
-        status = RtlIpv4StringToAddressExA(AddressString, FALSE, &addr4->sin_addr, &addr4->sin_port);
-        if (status != STATUS_SUCCESS)
-        {
-            res = WSAEINVAL;
-            break;
-        }
-        addr4->sin_family = WS_AF_INET;
-        *lpAddressLength = sizeof(SOCKADDR_IN);
-        break;
-    }
-    case WS_AF_INET6:
-    {
-        SOCKADDR_IN6 *addr6 = (SOCKADDR_IN6 *)lpAddress;
-
-        /* If lpAddressLength is too small, tell caller the size we need */
-        if (*lpAddressLength < sizeof(SOCKADDR_IN6))
-        {
-            *lpAddressLength = sizeof(SOCKADDR_IN6);
-            res = WSAEFAULT;
-            break;
-        }
-        memset(lpAddress, 0, sizeof(SOCKADDR_IN6));
-
-        status = RtlIpv6StringToAddressExA(AddressString, &addr6->sin6_addr, &addr6->sin6_scope_id, &addr6->sin6_port);
-        if (status != STATUS_SUCCESS)
-        {
-            res = WSAEINVAL;
-            break;
-        }
-        addr6->sin6_family = WS_AF_INET6;
-        *lpAddressLength = sizeof(SOCKADDR_IN6);
-        break;
-    }
-    default:
-        /* According to MSDN, only AF_INET and AF_INET6 are supported. */
-        TRACE("Unsupported address family specified: %d.\n", AddressFamily);
-        res = WSAEINVAL;
-    }
-
-    if (!res) return 0;
-    SetLastError(res);
-    return SOCKET_ERROR;
-}
-
-/***********************************************************************
- *              WSAStringToAddressW                      (WS2_32.81)
- *
- * FIXME: Does anybody know if this function allows using Hebrew/Arabic/Chinese... digits?
- * If this should be the case, it would be required to map these digits
- * to Unicode digits (0-9) using FoldString first.
- */
-INT WINAPI WSAStringToAddressW(LPWSTR AddressString,
-                               INT AddressFamily,
-                               LPWSAPROTOCOL_INFOW lpProtocolInfo,
-                               LPSOCKADDR lpAddress,
-                               LPINT lpAddressLength)
-{
-    INT sBuffer,res=0;
-    LPSTR workBuffer=NULL;
-    WSAPROTOCOL_INFOA infoA;
-    LPWSAPROTOCOL_INFOA lpProtoInfoA = NULL;
-
-    TRACE( "(%s, %x, %p, %p, %p)\n", debugstr_w(AddressString), AddressFamily, lpProtocolInfo,
-           lpAddress, lpAddressLength );
-
-    if (!lpAddressLength || !lpAddress) return SOCKET_ERROR;
-
-    /* if ProtocolInfo is available - convert to ANSI variant */
-    if (lpProtocolInfo)
-    {
-        lpProtoInfoA = &infoA;
-        memcpy( lpProtoInfoA, lpProtocolInfo, FIELD_OFFSET( WSAPROTOCOL_INFOA, szProtocol ) );
-
-        if (!WideCharToMultiByte( CP_ACP, 0, lpProtocolInfo->szProtocol, -1,
-                                  lpProtoInfoA->szProtocol, WSAPROTOCOL_LEN+1, NULL, NULL ))
-        {
-            SetLastError(WSAEINVAL);
-            return SOCKET_ERROR;
-        }
-    }
-
-    if (AddressString)
-    {
-        /* Translate AddressString to ANSI code page - assumes that only
-           standard digits 0-9 are used with this API call */
-        sBuffer = WideCharToMultiByte( CP_ACP, 0, AddressString, -1, NULL, 0, NULL, NULL );
-        workBuffer = HeapAlloc( GetProcessHeap(), 0, sBuffer );
-
-        if (workBuffer)
-        {
-            WideCharToMultiByte( CP_ACP, 0, AddressString, -1, workBuffer, sBuffer, NULL, NULL );
-            res = WSAStringToAddressA(workBuffer,AddressFamily,lpProtoInfoA,
-                                      lpAddress,lpAddressLength);
-            HeapFree( GetProcessHeap(), 0, workBuffer );
-            return res;
-        }
-        else
-            res = WSA_NOT_ENOUGH_MEMORY;
-    }
-    else
-        res = WSAEINVAL;
-
-    SetLastError(res);
-    return SOCKET_ERROR;
-}
-
-/***********************************************************************
- *              WSAAddressToStringA                      (WS2_32.27)
- *
- *  See WSAAddressToStringW
- */
-INT WINAPI WSAAddressToStringA( LPSOCKADDR sockaddr, DWORD len,
-                                LPWSAPROTOCOL_INFOA info, LPSTR string,
-                                LPDWORD lenstr )
-{
-    DWORD size;
-    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 );
-
-    if (!sockaddr) return SOCKET_ERROR;
-    if (!string || !lenstr) return SOCKET_ERROR;
-
-    switch(sockaddr->sa_family)
-    {
-    case WS_AF_INET:
-    {
-        unsigned int long_ip = ntohl(((SOCKADDR_IN *)sockaddr)->sin_addr.WS_s_addr);
-        if (len < sizeof(SOCKADDR_IN)) return SOCKET_ERROR;
-        sprintf( buffer, "%u.%u.%u.%u:%u",
-               (long_ip >> 24) & 0xff,
-               (long_ip >> 16) & 0xff,
-               (long_ip >> 8) & 0xff,
-               long_ip & 0xff,
-               ntohs( ((SOCKADDR_IN *)sockaddr)->sin_port ) );
-
-        p = strchr( buffer, ':' );
-        if (!((SOCKADDR_IN *)sockaddr)->sin_port) *p = 0;
-        break;
-    }
-    case WS_AF_INET6:
-    {
-        struct WS_sockaddr_in6 *sockaddr6 = (LPSOCKADDR_IN6) sockaddr;
-        size_t slen;
-
-        buffer[0] = 0;
-        if (len < sizeof(SOCKADDR_IN6)) return SOCKET_ERROR;
-        if ((sockaddr6->sin6_port))
-            strcpy(buffer, "[");
-        slen = strlen(buffer);
-        if (!WS_inet_ntop(WS_AF_INET6, &sockaddr6->sin6_addr, &buffer[slen], sizeof(buffer) - slen))
-        {
-            SetLastError(WSAEINVAL);
-            return SOCKET_ERROR;
-        }
-        if ((sockaddr6->sin6_scope_id))
-            sprintf(buffer+strlen(buffer), "%%%u", sockaddr6->sin6_scope_id);
-        if ((sockaddr6->sin6_port))
-            sprintf(buffer+strlen(buffer), "]:%u", ntohs(sockaddr6->sin6_port));
-        break;
-    }
-
-    default:
-        SetLastError(WSAEINVAL);
-        return SOCKET_ERROR;
-    }
-
-    size = strlen( buffer ) + 1;
-
-    if (*lenstr <  size)
-    {
-        *lenstr = size;
-        SetLastError(WSAEFAULT);
-        return SOCKET_ERROR;
-    }
-
-    TRACE("=> %s,%u bytes\n", debugstr_a(buffer), size);
-    *lenstr = size;
-    strcpy( string, buffer );
-    return 0;
-}
-
-/***********************************************************************
- *              WSAAddressToStringW                      (WS2_32.28)
- *
- * Convert a sockaddr address into a readable address string. 
- *
- * PARAMS
- *  sockaddr [I]    Pointer to a sockaddr structure.
- *  len      [I]    Size of the sockaddr structure.
- *  info     [I]    Pointer to a WSAPROTOCOL_INFOW structure (optional).
- *  string   [I/O]  Pointer to a buffer to receive the address string.
- *  lenstr   [I/O]  Size of the receive buffer in WCHARs.
- *
- * RETURNS
- *  Success: 0
- *  Failure: SOCKET_ERROR
- *
- * NOTES
- *  The 'info' parameter is ignored.
- */
-INT WINAPI WSAAddressToStringW( LPSOCKADDR sockaddr, DWORD len,
-                                LPWSAPROTOCOL_INFOW info, LPWSTR string,
-                                LPDWORD lenstr )
-{
-    INT ret;
-    char buf[54]; /* 32 digits + 7':' + '[' + '%" + 5 digits + ']:' + 5 digits + '\0' */
-
-    TRACE( "(%p, %d, %p, %p, %p)\n", sockaddr, len, info, string, lenstr );
-
-    if ((ret = WSAAddressToStringA(sockaddr, len, NULL, buf, lenstr))) return ret;
-
-    MultiByteToWideChar(CP_ACP, 0, buf, *lenstr, string, *lenstr);
-    TRACE("=> %s,%u chars\n", debugstr_w(string), *lenstr);
-    return 0;
-}
-
 /***********************************************************************
  *              WSAEnumNameSpaceProvidersA                  (WS2_32.34)
  */
-- 
2.30.2




More information about the wine-devel mailing list