[RTL]
authorThomas Faber <thomas.faber@reactos.org>
Sat, 7 Feb 2015 10:07:24 +0000 (10:07 +0000)
committerThomas Faber <thomas.faber@reactos.org>
Sat, 7 Feb 2015 10:07:24 +0000 (10:07 +0000)
- Implement RtlIpv4StringToAddressA and RtlIpv4StringToAddressExA using their -W counterparts
CORE-6490

svn path=/trunk/; revision=66187

reactos/lib/rtl/network.c

index d8d4436..197b5fb 100644 (file)
@@ -131,31 +131,70 @@ RtlIpv4AddressToStringExW(IN struct in_addr *Address,
 }
 
 /*
- * @unimplemented
+ * @implemented
  */
 NTSTATUS
 NTAPI
-RtlIpv4StringToAddressA(IN PCSTR String,
-                        IN BOOLEAN Strict,
-                        OUT PCSTR *Terminator,
-                        OUT struct in_addr *Addr)
+RtlIpv4StringToAddressA(
+    _In_ PCSTR String,
+    _In_ BOOLEAN Strict,
+    _Out_ PCSTR *Terminator,
+    _Out_ struct in_addr *Addr)
 {
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
+    NTSTATUS Status;
+    ANSI_STRING AddressA;
+    UNICODE_STRING AddressW;
+    PCWSTR TerminatorW = NULL;
+
+    Status = RtlInitAnsiStringEx(&AddressA, String);
+    if (!NT_SUCCESS(Status))
+        return Status;
+
+    Status = RtlAnsiStringToUnicodeString(&AddressW, &AddressA, TRUE);
+    if (!NT_SUCCESS(Status))
+        return Status;
+
+    Status = RtlIpv4StringToAddressW(AddressW.Buffer,
+                                     Strict,
+                                     &TerminatorW,
+                                     Addr);
+
+    ASSERT(TerminatorW >= AddressW.Buffer);
+    *Terminator = String + (TerminatorW - AddressW.Buffer);
+
+    RtlFreeUnicodeString(&AddressW);
+
+    return Status;
 }
 
 /*
-* @unimplemented
-*/
+ * @implemented
+ */
 NTSTATUS
 NTAPI
-RtlIpv4StringToAddressExA(IN PCSTR AddressString,
-                          IN BOOLEAN Strict,
-                          OUT struct in_addr *Address,
-                          OUT PUSHORT Port)
+RtlIpv4StringToAddressExA(
+    _In_ PCSTR AddressString,
+    _In_ BOOLEAN Strict,
+    _Out_ struct in_addr *Address,
+    _Out_ PUSHORT Port)
 {
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
+    NTSTATUS Status;
+    ANSI_STRING AddressA;
+    UNICODE_STRING AddressW;
+
+    Status = RtlInitAnsiStringEx(&AddressA, AddressString);
+    if (!NT_SUCCESS(Status))
+        return Status;
+
+    Status = RtlAnsiStringToUnicodeString(&AddressW, &AddressA, TRUE);
+    if (!NT_SUCCESS(Status))
+        return Status;
+
+    Status = RtlIpv4StringToAddressExW(AddressW.Buffer, Strict, Address, Port);
+
+    RtlFreeUnicodeString(&AddressW);
+
+    return Status;
 }
 
 /*