reactos/sdk/lib/dnslib/hostent.c

97 lines
2.5 KiB
C

/*
* 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);
}
}