Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS DNS Shared Library * FILE: lib/dnslib/dnsaddr.c * PURPOSE: Functions dealing with DNS_ADDRESS and DNS_ARRAY addresses. */
/* INCLUDES ******************************************************************/#include "precomp.h"
/* DATA **********************************************************************/
/* FUNCTIONS *****************************************************************/
PDNS_ARRAYWINAPIDnsAddrArray_Create(ULONG Count){ PDNS_ARRAY DnsAddrArray;
/* Allocate space for the array and the addresses within it */ DnsAddrArray = Dns_AllocZero(sizeof(DNS_ARRAY) + (Count * sizeof(DNS_ADDRESS)));
/* Write the allocated address count */ if (DnsAddrArray) DnsAddrArray->AllocatedAddresses = Count;
/* Return it */ return DnsAddrArray;}
VOIDWINAPIDnsAddrArray_Free(IN PDNS_ARRAY DnsAddrArray){ /* Just free the entire array */ Dns_Free(DnsAddrArray);}
BOOLWINAPIDnsAddrArray_AddIp4(IN PDNS_ARRAY DnsAddrArray, IN IN_ADDR Address, IN DWORD AddressType){ DNS_ADDRESS DnsAddress;
/* Build the DNS Address */ DnsAddr_BuildFromIp4(&DnsAddress, Address, 0);
/* Add it to the array */ return DnsAddrArray_AddAddr(DnsAddrArray, &DnsAddress, 0, AddressType);}
BOOLWINAPIDnsAddrArray_AddAddr(IN PDNS_ARRAY DnsAddrArray, IN PDNS_ADDRESS DnsAddress, IN WORD AddressFamily OPTIONAL, IN DWORD AddressType OPTIONAL){ /* Make sure we have an array */ if (!DnsAddrArray) return FALSE;
/* Check if we should validate the Address Family */ if (AddressFamily) { /* Validate it */ if (AddressFamily != DnsAddress->AddressFamily) return TRUE; }
/* Check if we should validate the Address Type */ if (AddressType) { /* Make sure that this array contains this type of addresses */ if (!DnsAddrArray_ContainsAddr(DnsAddrArray, DnsAddress, AddressType)) { /* Won't be adding it */ return TRUE; } }
/* Make sure we have space in the array */ if (DnsAddrArray->AllocatedAddresses < DnsAddrArray->UsedAddresses) { return FALSE; }
/* Now add the address */ RtlCopyMemory(&DnsAddrArray->Addresses[DnsAddrArray->UsedAddresses], DnsAddress, sizeof(DNS_ADDRESS));
/* Return success */ return TRUE;}
VOIDWINAPIDnsAddr_BuildFromIp4(IN PDNS_ADDRESS DnsAddress, IN IN_ADDR Address, IN WORD Port){ /* Clear the address */ RtlZeroMemory(DnsAddress, sizeof(DNS_ADDRESS));
/* Write data */ DnsAddress->Ip4Address.sin_family = AF_INET; DnsAddress->Ip4Address.sin_port = Port; DnsAddress->Ip4Address.sin_addr = Address; DnsAddress->AddressLength = sizeof(SOCKADDR_IN);}
VOIDWINAPIDnsAddr_BuildFromIp6(IN PDNS_ADDRESS DnsAddress, IN PIN6_ADDR Address, IN ULONG ScopeId, IN WORD Port){ /* Clear the address */ RtlZeroMemory(DnsAddress, sizeof(DNS_ADDRESS));
/* Write data */ DnsAddress->Ip6Address.sin6_family = AF_INET6; DnsAddress->Ip6Address.sin6_port = Port; DnsAddress->Ip6Address.sin6_addr = *Address; DnsAddress->Ip6Address.sin6_scope_id = ScopeId; DnsAddress->AddressLength = sizeof(SOCKADDR_IN6);}
VOIDWINAPIDnsAddr_BuildFromAtm(IN PDNS_ADDRESS DnsAddress, IN DWORD AddressType, IN PVOID AddressData){ ATM_ADDRESS Address;
/* Clear the address */ RtlZeroMemory(DnsAddress, sizeof(DNS_ADDRESS));
/* Build an ATM Address */ Address.AddressType = AddressType; Address.NumofDigits = DNS_ATMA_MAX_ADDR_LENGTH; RtlCopyMemory(&Address.Addr, AddressData, DNS_ATMA_MAX_ADDR_LENGTH);
/* Write data */ DnsAddress->AtmAddress = Address; DnsAddress->AddressLength = sizeof(ATM_ADDRESS);}
BOOLEANWINAPIDnsAddr_BuildFromDnsRecord(IN PDNS_RECORD DnsRecord, OUT PDNS_ADDRESS DnsAddr){ /* Check what kind of record this is */ switch(DnsRecord->wType) { /* IPv4 */ case DNS_TYPE_A: /* Create the DNS Address */ DnsAddr_BuildFromIp4(DnsAddr, *(PIN_ADDR)&DnsRecord->Data.A.IpAddress, 0); break;
/* IPv6 */ case DNS_TYPE_AAAA: /* Create the DNS Address */ DnsAddr_BuildFromIp6(DnsAddr, (PIN6_ADDR)&DnsRecord->Data.AAAA.Ip6Address, DnsRecord->dwReserved, 0); break;
/* ATM */ case DNS_TYPE_ATMA: /* Create the DNS Address */ DnsAddr_BuildFromAtm(DnsAddr, DnsRecord->Data.Atma.AddressType, &DnsRecord->Data.Atma.Address); break; }
/* Done! */ return TRUE;}
BOOLWINAPIDnsAddrArray_ContainsAddr(IN PDNS_ARRAY DnsAddrArray, IN PDNS_ADDRESS DnsAddress, IN DWORD AddressType){ /* FIXME */ return TRUE;}