1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS DNS Shared Library
4 * FILE: lib/dnslib/dnsaddr.c
5 * PURPOSE: Functions dealing with DNS_ADDRESS and DNS_ARRAY addresses.
6 */
7
8 /* INCLUDES ******************************************************************/
9 #include "precomp.h"
10
11 /* DATA **********************************************************************/
12
13 /* FUNCTIONS *****************************************************************/
14
15 PDNS_ARRAY
16 WINAPI
DnsAddrArray_Create(ULONG Count)17 DnsAddrArray_Create(ULONG Count)
18 {
19 PDNS_ARRAY DnsAddrArray;
20
21 /* Allocate space for the array and the addresses within it */
22 DnsAddrArray = Dns_AllocZero(sizeof(DNS_ARRAY) +
23 (Count * sizeof(DNS_ADDRESS)));
24
25 /* Write the allocated address count */
26 if (DnsAddrArray) DnsAddrArray->AllocatedAddresses = Count;
27
28 /* Return it */
29 return DnsAddrArray;
30 }
31
32 VOID
33 WINAPI
DnsAddrArray_Free(IN PDNS_ARRAY DnsAddrArray)34 DnsAddrArray_Free(IN PDNS_ARRAY DnsAddrArray)
35 {
36 /* Just free the entire array */
37 Dns_Free(DnsAddrArray);
38 }
39
40 BOOL
41 WINAPI
DnsAddrArray_AddIp4(IN PDNS_ARRAY DnsAddrArray,IN IN_ADDR Address,IN DWORD AddressType)42 DnsAddrArray_AddIp4(IN PDNS_ARRAY DnsAddrArray,
43 IN IN_ADDR Address,
44 IN DWORD AddressType)
45 {
46 DNS_ADDRESS DnsAddress;
47
48 /* Build the DNS Address */
49 DnsAddr_BuildFromIp4(&DnsAddress, Address, 0);
50
51 /* Add it to the array */
52 return DnsAddrArray_AddAddr(DnsAddrArray, &DnsAddress, 0, AddressType);
53 }
54
55 BOOL
56 WINAPI
DnsAddrArray_AddAddr(IN PDNS_ARRAY DnsAddrArray,IN PDNS_ADDRESS DnsAddress,IN WORD AddressFamily OPTIONAL,IN DWORD AddressType OPTIONAL)57 DnsAddrArray_AddAddr(IN PDNS_ARRAY DnsAddrArray,
58 IN PDNS_ADDRESS DnsAddress,
59 IN WORD AddressFamily OPTIONAL,
60 IN DWORD AddressType OPTIONAL)
61 {
62 /* Make sure we have an array */
63 if (!DnsAddrArray) return FALSE;
64
65 /* Check if we should validate the Address Family */
66 if (AddressFamily)
67 {
68 /* Validate it */
69 if (AddressFamily != DnsAddress->AddressFamily) return TRUE;
70 }
71
72 /* Check if we should validate the Address Type */
73 if (AddressType)
74 {
75 /* Make sure that this array contains this type of addresses */
76 if (!DnsAddrArray_ContainsAddr(DnsAddrArray, DnsAddress, AddressType))
77 {
78 /* Won't be adding it */
79 return TRUE;
80 }
81 }
82
83 /* Make sure we have space in the array */
84 if (DnsAddrArray->AllocatedAddresses < DnsAddrArray->UsedAddresses)
85 {
86 return FALSE;
87 }
88
89 /* Now add the address */
90 RtlCopyMemory(&DnsAddrArray->Addresses[DnsAddrArray->UsedAddresses],
91 DnsAddress,
92 sizeof(DNS_ADDRESS));
93
94 /* Return success */
95 return TRUE;
96 }
97
98 VOID
99 WINAPI
DnsAddr_BuildFromIp4(IN PDNS_ADDRESS DnsAddress,IN IN_ADDR Address,IN WORD Port)100 DnsAddr_BuildFromIp4(IN PDNS_ADDRESS DnsAddress,
101 IN IN_ADDR Address,
102 IN WORD Port)
103 {
104 /* Clear the address */
105 RtlZeroMemory(DnsAddress, sizeof(DNS_ADDRESS));
106
107 /* Write data */
108 DnsAddress->Ip4Address.sin_family = AF_INET;
109 DnsAddress->Ip4Address.sin_port = Port;
110 DnsAddress->Ip4Address.sin_addr = Address;
111 DnsAddress->AddressLength = sizeof(SOCKADDR_IN);
112 }
113
114 VOID
115 WINAPI
DnsAddr_BuildFromIp6(IN PDNS_ADDRESS DnsAddress,IN PIN6_ADDR Address,IN ULONG ScopeId,IN WORD Port)116 DnsAddr_BuildFromIp6(IN PDNS_ADDRESS DnsAddress,
117 IN PIN6_ADDR Address,
118 IN ULONG ScopeId,
119 IN WORD Port)
120 {
121 /* Clear the address */
122 RtlZeroMemory(DnsAddress, sizeof(DNS_ADDRESS));
123
124 /* Write data */
125 DnsAddress->Ip6Address.sin6_family = AF_INET6;
126 DnsAddress->Ip6Address.sin6_port = Port;
127 DnsAddress->Ip6Address.sin6_addr = *Address;
128 DnsAddress->Ip6Address.sin6_scope_id = ScopeId;
129 DnsAddress->AddressLength = sizeof(SOCKADDR_IN6);
130 }
131
132 VOID
133 WINAPI
DnsAddr_BuildFromAtm(IN PDNS_ADDRESS DnsAddress,IN DWORD AddressType,IN PVOID AddressData)134 DnsAddr_BuildFromAtm(IN PDNS_ADDRESS DnsAddress,
135 IN DWORD AddressType,
136 IN PVOID AddressData)
137 {
138 ATM_ADDRESS Address;
139
140 /* Clear the address */
141 RtlZeroMemory(DnsAddress, sizeof(DNS_ADDRESS));
142
143 /* Build an ATM Address */
144 Address.AddressType = AddressType;
145 Address.NumofDigits = DNS_ATMA_MAX_ADDR_LENGTH;
146 RtlCopyMemory(&Address.Addr, AddressData, DNS_ATMA_MAX_ADDR_LENGTH);
147
148 /* Write data */
149 DnsAddress->AtmAddress = Address;
150 DnsAddress->AddressLength = sizeof(ATM_ADDRESS);
151 }
152
153 BOOLEAN
154 WINAPI
DnsAddr_BuildFromDnsRecord(IN PDNS_RECORD DnsRecord,OUT PDNS_ADDRESS DnsAddr)155 DnsAddr_BuildFromDnsRecord(IN PDNS_RECORD DnsRecord,
156 OUT PDNS_ADDRESS DnsAddr)
157 {
158 /* Check what kind of record this is */
159 switch(DnsRecord->wType)
160 {
161 /* IPv4 */
162 case DNS_TYPE_A:
163 /* Create the DNS Address */
164 DnsAddr_BuildFromIp4(DnsAddr,
165 *(PIN_ADDR)&DnsRecord->Data.A.IpAddress,
166 0);
167 break;
168
169 /* IPv6 */
170 case DNS_TYPE_AAAA:
171 /* Create the DNS Address */
172 DnsAddr_BuildFromIp6(DnsAddr,
173 (PIN6_ADDR)&DnsRecord->Data.AAAA.Ip6Address,
174 DnsRecord->dwReserved,
175 0);
176 break;
177
178 /* ATM */
179 case DNS_TYPE_ATMA:
180 /* Create the DNS Address */
181 DnsAddr_BuildFromAtm(DnsAddr,
182 DnsRecord->Data.Atma.AddressType,
183 &DnsRecord->Data.Atma.Address);
184 break;
185 }
186
187 /* Done! */
188 return TRUE;
189 }
190
191 BOOL
192 WINAPI
DnsAddrArray_ContainsAddr(IN PDNS_ARRAY DnsAddrArray,IN PDNS_ADDRESS DnsAddress,IN DWORD AddressType)193 DnsAddrArray_ContainsAddr(IN PDNS_ARRAY DnsAddrArray,
194 IN PDNS_ADDRESS DnsAddress,
195 IN DWORD AddressType)
196 {
197 /* FIXME */
198 return TRUE;
199 }
200
201