https://git.reactos.org/?p=reactos.git;a=commitdiff;h=454de56c6b8ca47b47e6ec21f7d9a8f2715673b2

commit 454de56c6b8ca47b47e6ec21f7d9a8f2715673b2
Author:     Baruch Rutman <petero...@gmail.com>
AuthorDate: Sat Apr 20 22:30:01 2024 +0300
Commit:     Hermès BÉLUSCA - MAÏTO <hermes.belusca-ma...@reactos.org>
CommitDate: Sat Nov 2 21:57:28 2024 +0100

    [WS2_32] Add inet_pton, inet_ntop
---
 dll/win32/ws2_32/src/addrconv.c | 140 ++++++++++++++++++++++++++++++++++++++++
 dll/win32/ws2_32/ws2_32.spec    |   4 ++
 sdk/include/psdk/ws2tcpip.h     |   4 +-
 3 files changed, 146 insertions(+), 2 deletions(-)

diff --git a/dll/win32/ws2_32/src/addrconv.c b/dll/win32/ws2_32/src/addrconv.c
index 3cfca497a47..fa459a073f3 100644
--- a/dll/win32/ws2_32/src/addrconv.c
+++ b/dll/win32/ws2_32/src/addrconv.c
@@ -492,3 +492,143 @@ WSANtohs(IN SOCKET s,
     return SOCKET_ERROR;
 }
 
+PCSTR
+WSAAPI
+inet_ntop(
+    _In_ INT Family,
+    _In_ const VOID *pAddr,
+    _Out_writes_(StringBufSize) PSTR pStringBuf,
+    _In_ size_t StringBufSize)
+{
+    NTSTATUS Status;
+    ULONG BufSize = StringBufSize;
+
+    switch (Family)
+    {
+        case AF_INET:
+            Status = RtlIpv4AddressToStringExA(pAddr, 0, pStringBuf, &BufSize);
+            break;
+        case AF_INET6:
+            Status = RtlIpv6AddressToStringExA(pAddr, 0, 0, pStringBuf, 
&BufSize);
+            break;
+        default:
+            SetLastError(WSAEAFNOSUPPORT);
+            return NULL;
+    }
+
+    if (!NT_SUCCESS(Status)) 
+    {
+        SetLastError(WSAEINVAL);
+        return NULL;
+    }
+
+    return pStringBuf;
+}
+
+PCWSTR
+WSAAPI
+InetNtopW(
+    _In_ INT Family,
+    _In_ const VOID *pAddr,
+    _Out_writes_(StringBufSize) PWSTR pStringBuf,
+    _In_ size_t StringBufSize)
+{
+    NTSTATUS Status;
+    ULONG BufSize = StringBufSize;
+
+    switch (Family)
+    {
+        case AF_INET:
+            Status = RtlIpv4AddressToStringExW(pAddr, 0, pStringBuf, &BufSize);
+            break;
+        case AF_INET6:
+            Status = RtlIpv6AddressToStringExW(pAddr, 0, 0, pStringBuf, 
&BufSize);
+            break;
+        default:
+            SetLastError(WSAEAFNOSUPPORT);
+            return NULL;
+    }
+
+    if (!NT_SUCCESS(Status)) 
+    {
+        SetLastError(WSAEINVAL);
+        return NULL;
+    }
+
+    return pStringBuf;
+}
+
+INT
+WSAAPI
+inet_pton(
+    _In_ INT Family,
+    _In_ PCSTR pszAddrString,
+    _Out_writes_bytes_(sizeof(IN_ADDR6)) PVOID pAddrBuf)
+{
+    NTSTATUS Status;
+    PCSTR ch;
+
+    if (!pszAddrString || !pAddrBuf)
+    {
+        SetLastError(WSAEFAULT);
+        return -1;
+    }
+
+    switch (Family)
+    {
+        case AF_INET:
+            Status = RtlIpv4StringToAddressA(pszAddrString, TRUE, &ch, 
pAddrBuf);
+            break;
+        case AF_INET6:
+            Status = RtlIpv6StringToAddressA(pszAddrString, &ch, pAddrBuf);
+            break;
+        default:
+            SetLastError(WSAEAFNOSUPPORT);
+            return -1;
+    }
+
+    if (!NT_SUCCESS(Status) || (*ch != 0)) 
+    {
+        return 0;
+    }
+
+    return 1;
+}
+
+INT
+WSAAPI
+InetPtonW(
+    _In_ INT Family,
+    _In_ PCWSTR pszAddrString,
+    _Out_writes_bytes_(sizeof(IN_ADDR6)) PVOID pAddrBuf)
+{
+    NTSTATUS Status;
+    PCWSTR ch;
+
+    if (!pszAddrString || !pAddrBuf)
+    {
+        SetLastError(WSAEFAULT);
+        return -1;
+    }
+
+    switch (Family)
+    {
+        case AF_INET:
+            Status = RtlIpv4StringToAddressW(pszAddrString, TRUE, &ch, 
pAddrBuf);
+            break;
+        case AF_INET6:
+            Status = RtlIpv6StringToAddressW(pszAddrString, &ch, pAddrBuf);
+            break;
+        default:
+            SetLastError(WSAEAFNOSUPPORT);
+            return -1;
+    }
+
+    if (!NT_SUCCESS(Status) || (*ch != 0)) 
+    {
+        SetLastError(WSAEINVAL); /* Only unicode version sets this error */
+        return 0;
+    }
+
+    return 1;
+}
diff --git a/dll/win32/ws2_32/ws2_32.spec b/dll/win32/ws2_32/ws2_32.spec
index e0e14b7e68e..84e5680349e 100644
--- a/dll/win32/ws2_32/ws2_32.spec
+++ b/dll/win32/ws2_32/ws2_32.spec
@@ -115,3 +115,7 @@
 23  stdcall  socket(long long long)
 @ stdcall GetAddrInfoW(wstr wstr ptr ptr)
 @ stdcall GetNameInfoW(ptr long wstr long wstr long long)
+@ stdcall -version=0x600+ inet_ntop(long ptr ptr long)
+@ stdcall -version=0x600+ InetNtopW(long ptr ptr long)
+@ stdcall -version=0x600+ inet_pton(long str ptr)
+@ stdcall -version=0x600+ InetPtonW(long wstr ptr)
diff --git a/sdk/include/psdk/ws2tcpip.h b/sdk/include/psdk/ws2tcpip.h
index 8d8aaa75add..b28e89c9bef 100644
--- a/sdk/include/psdk/ws2tcpip.h
+++ b/sdk/include/psdk/ws2tcpip.h
@@ -451,7 +451,7 @@ PCSTR
 WSAAPI
 inet_ntop(
   _In_ INT Family,
-  _In_ PVOID pAddr,
+  _In_ const VOID *pAddr,
   _Out_writes_(StringBufSize) PSTR pStringBuf,
   _In_ size_t StringBufSize);
 
@@ -459,7 +459,7 @@ PCWSTR
 WSAAPI
 InetNtopW(
   _In_ INT Family,
-  _In_ PVOID pAddr,
+  _In_ const VOID *pAddr,
   _Out_writes_(StringBufSize) PWSTR pStringBuf,
   _In_ size_t StringBufSize);
 

Reply via email to