Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygendnsaddr.c
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS DNS Shared Library 00004 * FILE: lib/dnslib/dnsaddr.c 00005 * PURPOSE: Functions dealing with DNS_ADDRESS and DNS_ARRAY addresses. 00006 */ 00007 00008 /* INCLUDES ******************************************************************/ 00009 #include "precomp.h" 00010 00011 /* DATA **********************************************************************/ 00012 00013 /* FUNCTIONS *****************************************************************/ 00014 00015 PDNS_ARRAY 00016 WINAPI 00017 DnsAddrArray_Create(ULONG Count) 00018 { 00019 PDNS_ARRAY DnsAddrArray; 00020 00021 /* Allocate space for the array and the addresses within it */ 00022 DnsAddrArray = Dns_AllocZero(sizeof(DNS_ARRAY) + 00023 (Count * sizeof(DNS_ADDRESS))); 00024 00025 /* Write the allocated address count */ 00026 if (DnsAddrArray) DnsAddrArray->AllocatedAddresses = Count; 00027 00028 /* Return it */ 00029 return DnsAddrArray; 00030 } 00031 00032 VOID 00033 WINAPI 00034 DnsAddrArray_Free(IN PDNS_ARRAY DnsAddrArray) 00035 { 00036 /* Just free the entire array */ 00037 Dns_Free(DnsAddrArray); 00038 } 00039 00040 BOOL 00041 WINAPI 00042 DnsAddrArray_AddIp4(IN PDNS_ARRAY DnsAddrArray, 00043 IN IN_ADDR Address, 00044 IN DWORD AddressType) 00045 { 00046 DNS_ADDRESS DnsAddress; 00047 00048 /* Build the DNS Address */ 00049 DnsAddr_BuildFromIp4(&DnsAddress, Address, 0); 00050 00051 /* Add it to the array */ 00052 return DnsAddrArray_AddAddr(DnsAddrArray, &DnsAddress, 0, AddressType); 00053 } 00054 00055 BOOL 00056 WINAPI 00057 DnsAddrArray_AddAddr(IN PDNS_ARRAY DnsAddrArray, 00058 IN PDNS_ADDRESS DnsAddress, 00059 IN WORD AddressFamily OPTIONAL, 00060 IN DWORD AddressType OPTIONAL) 00061 { 00062 /* Make sure we have an array */ 00063 if (!DnsAddrArray) return FALSE; 00064 00065 /* Check if we should validate the Address Family */ 00066 if (AddressFamily) 00067 { 00068 /* Validate it */ 00069 if (AddressFamily != DnsAddress->AddressFamily) return TRUE; 00070 } 00071 00072 /* Check if we should validate the Address Type */ 00073 if (AddressType) 00074 { 00075 /* Make sure that this array contains this type of addresses */ 00076 if (!DnsAddrArray_ContainsAddr(DnsAddrArray, DnsAddress, AddressType)) 00077 { 00078 /* Won't be adding it */ 00079 return TRUE; 00080 } 00081 } 00082 00083 /* Make sure we have space in the array */ 00084 if (DnsAddrArray->AllocatedAddresses < DnsAddrArray->UsedAddresses) 00085 { 00086 return FALSE; 00087 } 00088 00089 /* Now add the address */ 00090 RtlCopyMemory(&DnsAddrArray->Addresses[DnsAddrArray->UsedAddresses], 00091 DnsAddress, 00092 sizeof(DNS_ADDRESS)); 00093 00094 /* Return success */ 00095 return TRUE; 00096 } 00097 00098 VOID 00099 WINAPI 00100 DnsAddr_BuildFromIp4(IN PDNS_ADDRESS DnsAddress, 00101 IN IN_ADDR Address, 00102 IN WORD Port) 00103 { 00104 /* Clear the address */ 00105 RtlZeroMemory(DnsAddress, sizeof(DNS_ADDRESS)); 00106 00107 /* Write data */ 00108 DnsAddress->Ip4Address.sin_family = AF_INET; 00109 DnsAddress->Ip4Address.sin_port = Port; 00110 DnsAddress->Ip4Address.sin_addr = Address; 00111 DnsAddress->AddressLength = sizeof(SOCKADDR_IN); 00112 } 00113 00114 VOID 00115 WINAPI 00116 DnsAddr_BuildFromIp6(IN PDNS_ADDRESS DnsAddress, 00117 IN PIN6_ADDR Address, 00118 IN ULONG ScopeId, 00119 IN WORD Port) 00120 { 00121 /* Clear the address */ 00122 RtlZeroMemory(DnsAddress, sizeof(DNS_ADDRESS)); 00123 00124 /* Write data */ 00125 DnsAddress->Ip6Address.sin6_family = AF_INET6; 00126 DnsAddress->Ip6Address.sin6_port = Port; 00127 DnsAddress->Ip6Address.sin6_addr = *Address; 00128 DnsAddress->Ip6Address.sin6_scope_id = ScopeId; 00129 DnsAddress->AddressLength = sizeof(SOCKADDR_IN6); 00130 } 00131 00132 VOID 00133 WINAPI 00134 DnsAddr_BuildFromAtm(IN PDNS_ADDRESS DnsAddress, 00135 IN DWORD AddressType, 00136 IN PVOID AddressData) 00137 { 00138 ATM_ADDRESS Address; 00139 00140 /* Clear the address */ 00141 RtlZeroMemory(DnsAddress, sizeof(DNS_ADDRESS)); 00142 00143 /* Build an ATM Address */ 00144 Address.AddressType = AddressType; 00145 Address.NumofDigits = DNS_ATMA_MAX_ADDR_LENGTH; 00146 RtlCopyMemory(&Address.Addr, AddressData, DNS_ATMA_MAX_ADDR_LENGTH); 00147 00148 /* Write data */ 00149 DnsAddress->AtmAddress = Address; 00150 DnsAddress->AddressLength = sizeof(ATM_ADDRESS); 00151 } 00152 00153 BOOLEAN 00154 WINAPI 00155 DnsAddr_BuildFromDnsRecord(IN PDNS_RECORD DnsRecord, 00156 OUT PDNS_ADDRESS DnsAddr) 00157 { 00158 /* Check what kind of record this is */ 00159 switch(DnsRecord->wType) 00160 { 00161 /* IPv4 */ 00162 case DNS_TYPE_A: 00163 /* Create the DNS Address */ 00164 DnsAddr_BuildFromIp4(DnsAddr, 00165 *(PIN_ADDR)&DnsRecord->Data.A.IpAddress, 00166 0); 00167 break; 00168 00169 /* IPv6 */ 00170 case DNS_TYPE_AAAA: 00171 /* Create the DNS Address */ 00172 DnsAddr_BuildFromIp6(DnsAddr, 00173 (PIN6_ADDR)&DnsRecord->Data.AAAA.Ip6Address, 00174 DnsRecord->dwReserved, 00175 0); 00176 break; 00177 00178 /* ATM */ 00179 case DNS_TYPE_ATMA: 00180 /* Create the DNS Address */ 00181 DnsAddr_BuildFromAtm(DnsAddr, 00182 DnsRecord->Data.Atma.AddressType, 00183 &DnsRecord->Data.Atma.Address); 00184 break; 00185 } 00186 00187 /* Done! */ 00188 return TRUE; 00189 } 00190 00191 BOOL 00192 WINAPI 00193 DnsAddrArray_ContainsAddr(IN PDNS_ARRAY DnsAddrArray, 00194 IN PDNS_ADDRESS DnsAddress, 00195 IN DWORD AddressType) 00196 { 00197 /* FIXME */ 00198 return TRUE; 00199 } 00200 Generated on Fri May 25 2012 04:34:28 for ReactOS by
1.7.6.1
|