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.
8 /* INCLUDES ******************************************************************/
11 /* DATA **********************************************************************/
13 /* FUNCTIONS *****************************************************************/
17 DnsAddrArray_Create(ULONG Count
)
19 PDNS_ARRAY DnsAddrArray
;
21 /* Allocate space for the array and the addresses within it */
22 DnsAddrArray
= Dns_AllocZero(sizeof(DNS_ARRAY
) +
23 (Count
* sizeof(DNS_ADDRESS
)));
25 /* Write the allocated address count */
26 if (DnsAddrArray
) DnsAddrArray
->AllocatedAddresses
= Count
;
34 DnsAddrArray_Free(IN PDNS_ARRAY DnsAddrArray
)
36 /* Just free the entire array */
37 Dns_Free(DnsAddrArray
);
42 DnsAddrArray_AddIp4(IN PDNS_ARRAY DnsAddrArray
,
46 DNS_ADDRESS DnsAddress
;
48 /* Build the DNS Address */
49 DnsAddr_BuildFromIp4(&DnsAddress
, Address
, 0);
51 /* Add it to the array */
52 return DnsAddrArray_AddAddr(DnsAddrArray
, &DnsAddress
, 0, AddressType
);
57 DnsAddrArray_AddAddr(IN PDNS_ARRAY DnsAddrArray
,
58 IN PDNS_ADDRESS DnsAddress
,
59 IN WORD AddressFamily OPTIONAL
,
60 IN DWORD AddressType OPTIONAL
)
62 /* Make sure we have an array */
63 if (!DnsAddrArray
) return FALSE
;
65 /* Check if we should validate the Address Family */
69 if (AddressFamily
!= DnsAddress
->AddressFamily
) return TRUE
;
72 /* Check if we should validate the Address Type */
75 /* Make sure that this array contains this type of addresses */
76 if (!DnsAddrArray_ContainsAddr(DnsAddrArray
, DnsAddress
, AddressType
))
78 /* Won't be adding it */
83 /* Make sure we have space in the array */
84 if (DnsAddrArray
->AllocatedAddresses
< DnsAddrArray
->UsedAddresses
)
89 /* Now add the address */
90 RtlCopyMemory(&DnsAddrArray
->Addresses
[DnsAddrArray
->UsedAddresses
],
100 DnsAddr_BuildFromIp4(IN PDNS_ADDRESS DnsAddress
,
104 /* Clear the address */
105 RtlZeroMemory(DnsAddress
, sizeof(DNS_ADDRESS
));
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
);
116 DnsAddr_BuildFromIp6(IN PDNS_ADDRESS DnsAddress
,
117 IN PIN6_ADDR Address
,
121 /* Clear the address */
122 RtlZeroMemory(DnsAddress
, sizeof(DNS_ADDRESS
));
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
);
134 DnsAddr_BuildFromAtm(IN PDNS_ADDRESS DnsAddress
,
135 IN DWORD AddressType
,
136 IN PVOID AddressData
)
140 /* Clear the address */
141 RtlZeroMemory(DnsAddress
, sizeof(DNS_ADDRESS
));
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
);
149 DnsAddress
->AtmAddress
= Address
;
150 DnsAddress
->AddressLength
= sizeof(ATM_ADDRESS
);
155 DnsAddr_BuildFromDnsRecord(IN PDNS_RECORD DnsRecord
,
156 OUT PDNS_ADDRESS DnsAddr
)
158 /* Check what kind of record this is */
159 switch(DnsRecord
->wType
)
163 /* Create the DNS Address */
164 DnsAddr_BuildFromIp4(DnsAddr
,
165 *(PIN_ADDR
)&DnsRecord
->Data
.A
.IpAddress
,
171 /* Create the DNS Address */
172 DnsAddr_BuildFromIp6(DnsAddr
,
173 (PIN6_ADDR
)&DnsRecord
->Data
.AAAA
.Ip6Address
,
174 DnsRecord
->dwReserved
,
180 /* Create the DNS Address */
181 DnsAddr_BuildFromAtm(DnsAddr
,
182 DnsRecord
->Data
.Atma
.AddressType
,
183 &DnsRecord
->Data
.Atma
.Address
);
193 DnsAddrArray_ContainsAddr(IN PDNS_ARRAY DnsAddrArray
,
194 IN PDNS_ADDRESS DnsAddress
,
195 IN DWORD AddressType
)