From: Christoph von Wittich Date: Sat, 29 May 2010 17:33:37 +0000 (+0000) Subject: [WS2_32] X-Git-Tag: backups/header-work@57446~11^2~198 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=2489a60f61d9883e808318297ec8c81076f0ed35;hp=08ca572fc4b96f1684fa17b19e408ee17e1347bb [WS2_32] implement WSAAddressToStringA/W (taken from wine) svn path=/trunk/; revision=47419 --- diff --git a/reactos/dll/win32/ws2_32/misc/ns.c b/reactos/dll/win32/ws2_32/misc/ns.c index fee4f032868..04e5b4bc5e2 100644 --- a/reactos/dll/win32/ws2_32/misc/ns.c +++ b/reactos/dll/win32/ws2_32/misc/ns.c @@ -32,10 +32,44 @@ WSAAddressToStringA(IN LPSOCKADDR lpsaAddress, OUT LPSTR lpszAddressString, IN OUT LPDWORD lpdwAddressStringLength) { - UNIMPLEMENTED + DWORD size; + CHAR buffer[54]; /* 32 digits + 7':' + '[' + '%" + 5 digits + ']:' + 5 digits + '\0' */ + CHAR *p; - WSASetLastError(WSASYSCALLFAILURE); - return SOCKET_ERROR; + if (!lpsaAddress) return SOCKET_ERROR; + if (!lpszAddressString || !lpdwAddressStringLength) return SOCKET_ERROR; + + switch(lpsaAddress->sa_family) + { + case AF_INET: + if (dwAddressLength < sizeof(SOCKADDR_IN)) return SOCKET_ERROR; + sprintf( buffer, "%u.%u.%u.%u:%u", + (unsigned int)(ntohl( ((SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr ) >> 24 & 0xff), + (unsigned int)(ntohl( ((SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr ) >> 16 & 0xff), + (unsigned int)(ntohl( ((SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr ) >> 8 & 0xff), + (unsigned int)(ntohl( ((SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr ) & 0xff), + ntohs( ((SOCKADDR_IN *)lpsaAddress)->sin_port ) ); + + p = strchr( buffer, ':' ); + if (!((SOCKADDR_IN *)lpsaAddress)->sin_port) *p = 0; + break; + default: + WSASetLastError(WSAEINVAL); + return SOCKET_ERROR; + } + + size = strlen( buffer ) + 1; + + if (*lpdwAddressStringLength < size) + { + *lpdwAddressStringLength = size; + WSASetLastError(WSAEFAULT); + return SOCKET_ERROR; + } + + *lpdwAddressStringLength = size; + strcpy( lpszAddressString, buffer ); + return 0; } @@ -50,10 +84,28 @@ WSAAddressToStringW(IN LPSOCKADDR lpsaAddress, OUT LPWSTR lpszAddressString, IN OUT LPDWORD lpdwAddressStringLength) { - UNIMPLEMENTED + INT ret; + DWORD size; + WCHAR buffer[54]; /* 32 digits + 7':' + '[' + '%" + 5 digits + ']:' + 5 digits + '\0' */ + CHAR bufAddr[54]; - WSASetLastError(WSASYSCALLFAILURE); - return SOCKET_ERROR; + size = *lpdwAddressStringLength; + ret = WSAAddressToStringA(lpsaAddress, dwAddressLength, NULL, bufAddr, &size); + + if (ret) return ret; + + MultiByteToWideChar( CP_ACP, 0, bufAddr, size, buffer, sizeof( buffer )/sizeof(WCHAR)); + + if (*lpdwAddressStringLength < size) + { + *lpdwAddressStringLength = size; + WSASetLastError(WSAEFAULT); + return SOCKET_ERROR; + } + + *lpdwAddressStringLength = size; + lstrcpyW( lpszAddressString, buffer ); + return 0; }