--- /dev/null
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS DNS Shared Library
+ * FILE: lib/dnslib/hostent.c
+ * PURPOSE: Functions for dealing with Host Entry structures
+ */
+
+/* INCLUDES ******************************************************************/
+#include "precomp.h"
+
+/* DATA **********************************************************************/
+
+/* FUNCTIONS *****************************************************************/
+
+PHOSTENT
+WINAPI
+Hostent_Init(IN PVOID *Buffer,
+ IN WORD AddressFamily,
+ IN ULONG AddressSize,
+ IN ULONG AddressCount,
+ IN ULONG AliasCount)
+{
+ PHOSTENT Hostent;
+ ULONG_PTR BufferPosition = (ULONG_PTR)*Buffer;
+
+ /* Align the hostent on the buffer's 4 byte boundary */
+ BufferPosition += 3 & ~3;
+
+ /* Set up the basic data */
+ Hostent = (PHOSTENT)BufferPosition;
+ Hostent->h_length = (WORD)AddressSize;
+ Hostent->h_addrtype = AddressFamily;
+
+ /* Put aliases after Hostent */
+ Hostent->h_aliases = (PCHAR*)((ULONG_PTR)(Hostent + 1) & ~3);
+
+ /* Zero it out */
+ RtlZeroMemory(Hostent->h_aliases, AliasCount * sizeof(PCHAR));
+
+ /* Put addresses after aliases */
+ Hostent->h_addr_list = (PCHAR*)
+ ((ULONG_PTR)Hostent->h_aliases +
+ (AliasCount * sizeof(PCHAR)) + sizeof(PCHAR));
+
+ /* Update the location */
+ BufferPosition = (ULONG_PTR)Hostent->h_addr_list +
+ ((AddressCount * sizeof(PCHAR)) + sizeof(PCHAR));
+
+ /* Send it back */
+ *Buffer = (PVOID)BufferPosition;
+
+ /* Return the hostent */
+ return Hostent;
+}
+
+VOID
+WINAPI
+Dns_PtrArrayToOffsetArray(PCHAR *List,
+ ULONG_PTR Base)
+{
+ /* Loop every pointer in the list */
+ do
+ {
+ /* Update the pointer */
+ *List = (PCHAR)((ULONG_PTR)*List - Base);
+ } while(*List++);
+}
+
+VOID
+WINAPI
+Hostent_ConvertToOffsets(IN PHOSTENT Hostent)
+{
+ /* Do we have a name? */
+ if (Hostent->h_name)
+ {
+ /* Update it */
+ Hostent->h_name -= (ULONG_PTR)Hostent;
+ }
+
+ /* Do we have aliases? */
+ if (Hostent->h_aliases)
+ {
+ /* Update the pointer */
+ Hostent->h_aliases -= (ULONG_PTR)Hostent;
+
+ /* Fix them up */
+ Dns_PtrArrayToOffsetArray(Hostent->h_aliases, (ULONG_PTR)Hostent);
+ }
+
+ /* Do we have addresses? */
+ if (Hostent->h_addr_list)
+ {
+ /* Fix them up */
+ Dns_PtrArrayToOffsetArray(Hostent->h_addr_list, (ULONG_PTR)Hostent);
+ }
+}
+