xref: /freebsd/lib/libcasper/services/cap_dns/tests/dns_test.c (revision 5c2bc3db201a4fe8d7911cf816bea104d5dc2138)
1d3bfc725SMariusz Zaborski /*-
2*4d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
328b6f7c8SMariusz Zaborski  *
4d3bfc725SMariusz Zaborski  * Copyright (c) 2013 The FreeBSD Foundation
5d3bfc725SMariusz Zaborski  *
6d3bfc725SMariusz Zaborski  * This software was developed by Pawel Jakub Dawidek under sponsorship from
7d3bfc725SMariusz Zaborski  * the FreeBSD Foundation.
8d3bfc725SMariusz Zaborski  *
9d3bfc725SMariusz Zaborski  * Redistribution and use in source and binary forms, with or without
10d3bfc725SMariusz Zaborski  * modification, are permitted provided that the following conditions
11d3bfc725SMariusz Zaborski  * are met:
12d3bfc725SMariusz Zaborski  * 1. Redistributions of source code must retain the above copyright
13d3bfc725SMariusz Zaborski  *    notice, this list of conditions and the following disclaimer.
14d3bfc725SMariusz Zaborski  * 2. Redistributions in binary form must reproduce the above copyright
15d3bfc725SMariusz Zaborski  *    notice, this list of conditions and the following disclaimer in the
16d3bfc725SMariusz Zaborski  *    documentation and/or other materials provided with the distribution.
17d3bfc725SMariusz Zaborski  *
18d3bfc725SMariusz Zaborski  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
19d3bfc725SMariusz Zaborski  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20d3bfc725SMariusz Zaborski  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21d3bfc725SMariusz Zaborski  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
22d3bfc725SMariusz Zaborski  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23d3bfc725SMariusz Zaborski  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24d3bfc725SMariusz Zaborski  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25d3bfc725SMariusz Zaborski  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26d3bfc725SMariusz Zaborski  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27d3bfc725SMariusz Zaborski  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28d3bfc725SMariusz Zaborski  * SUCH DAMAGE.
29d3bfc725SMariusz Zaborski  */
30d3bfc725SMariusz Zaborski 
31d3bfc725SMariusz Zaborski #include <sys/capsicum.h>
32ceb36bc9SMariusz Zaborski #include <sys/nv.h>
33d3bfc725SMariusz Zaborski 
34d3bfc725SMariusz Zaborski #include <arpa/inet.h>
35d3bfc725SMariusz Zaborski #include <netinet/in.h>
36d3bfc725SMariusz Zaborski 
37d3bfc725SMariusz Zaborski #include <assert.h>
38d3bfc725SMariusz Zaborski #include <err.h>
39d3bfc725SMariusz Zaborski #include <errno.h>
40d3bfc725SMariusz Zaborski #include <netdb.h>
41d3bfc725SMariusz Zaborski #include <stdio.h>
42d3bfc725SMariusz Zaborski #include <stdlib.h>
43d3bfc725SMariusz Zaborski #include <string.h>
44d3bfc725SMariusz Zaborski #include <unistd.h>
45d3bfc725SMariusz Zaborski 
46d3bfc725SMariusz Zaborski #include <libcasper.h>
47d3bfc725SMariusz Zaborski #include <casper/cap_dns.h>
48d3bfc725SMariusz Zaborski 
49615bf03eSMark Johnston #include <atf-c.h>
50d3bfc725SMariusz Zaborski 
51d3bfc725SMariusz Zaborski #define	GETHOSTBYNAME			0x01
52d3bfc725SMariusz Zaborski #define	GETHOSTBYNAME2_AF_INET		0x02
53d3bfc725SMariusz Zaborski #define	GETHOSTBYNAME2_AF_INET6		0x04
54d3bfc725SMariusz Zaborski #define	GETHOSTBYADDR_AF_INET		0x08
55d3bfc725SMariusz Zaborski #define	GETHOSTBYADDR_AF_INET6		0x10
56d3bfc725SMariusz Zaborski #define	GETADDRINFO_AF_UNSPEC		0x20
57d3bfc725SMariusz Zaborski #define	GETADDRINFO_AF_INET		0x40
58d3bfc725SMariusz Zaborski #define	GETADDRINFO_AF_INET6		0x80
59d3bfc725SMariusz Zaborski 
60d3bfc725SMariusz Zaborski static bool
61d3bfc725SMariusz Zaborski addrinfo_compare(struct addrinfo *ai0, struct addrinfo *ai1)
62d3bfc725SMariusz Zaborski {
63d3bfc725SMariusz Zaborski 	struct addrinfo *at0, *at1;
64d3bfc725SMariusz Zaborski 
65d3bfc725SMariusz Zaborski 	if (ai0 == NULL && ai1 == NULL)
66d3bfc725SMariusz Zaborski 		return (true);
67d3bfc725SMariusz Zaborski 	if (ai0 == NULL || ai1 == NULL)
68d3bfc725SMariusz Zaborski 		return (false);
69d3bfc725SMariusz Zaborski 
70d3bfc725SMariusz Zaborski 	at0 = ai0;
71d3bfc725SMariusz Zaborski 	at1 = ai1;
72d3bfc725SMariusz Zaborski 	while (true) {
73d3bfc725SMariusz Zaborski 		if ((at0->ai_flags == at1->ai_flags) &&
74d3bfc725SMariusz Zaborski 		    (at0->ai_family == at1->ai_family) &&
75d3bfc725SMariusz Zaborski 		    (at0->ai_socktype == at1->ai_socktype) &&
76d3bfc725SMariusz Zaborski 		    (at0->ai_protocol == at1->ai_protocol) &&
77d3bfc725SMariusz Zaborski 		    (at0->ai_addrlen == at1->ai_addrlen) &&
78d3bfc725SMariusz Zaborski 		    (memcmp(at0->ai_addr, at1->ai_addr,
79d3bfc725SMariusz Zaborski 			at0->ai_addrlen) == 0)) {
80d3bfc725SMariusz Zaborski 			if (at0->ai_canonname != NULL &&
81d3bfc725SMariusz Zaborski 			    at1->ai_canonname != NULL) {
82d3bfc725SMariusz Zaborski 				if (strcmp(at0->ai_canonname,
83d3bfc725SMariusz Zaborski 				    at1->ai_canonname) != 0) {
84d3bfc725SMariusz Zaborski 					return (false);
85d3bfc725SMariusz Zaborski 				}
86d3bfc725SMariusz Zaborski 			}
87d3bfc725SMariusz Zaborski 
88d3bfc725SMariusz Zaborski 			if (at0->ai_canonname == NULL &&
89d3bfc725SMariusz Zaborski 			    at1->ai_canonname != NULL) {
90d3bfc725SMariusz Zaborski 				return (false);
91d3bfc725SMariusz Zaborski 			}
92d3bfc725SMariusz Zaborski 			if (at0->ai_canonname != NULL &&
93d3bfc725SMariusz Zaborski 			    at1->ai_canonname == NULL) {
94d3bfc725SMariusz Zaborski 				return (false);
95d3bfc725SMariusz Zaborski 			}
96d3bfc725SMariusz Zaborski 
97d3bfc725SMariusz Zaborski 			if (at0->ai_next == NULL && at1->ai_next == NULL)
98d3bfc725SMariusz Zaborski 				return (true);
99d3bfc725SMariusz Zaborski 			if (at0->ai_next == NULL || at1->ai_next == NULL)
100d3bfc725SMariusz Zaborski 				return (false);
101d3bfc725SMariusz Zaborski 
102d3bfc725SMariusz Zaborski 			at0 = at0->ai_next;
103d3bfc725SMariusz Zaborski 			at1 = at1->ai_next;
104d3bfc725SMariusz Zaborski 		} else {
105d3bfc725SMariusz Zaborski 			return (false);
106d3bfc725SMariusz Zaborski 		}
107d3bfc725SMariusz Zaborski 	}
108d3bfc725SMariusz Zaborski 
109d3bfc725SMariusz Zaborski 	/* NOTREACHED */
110d3bfc725SMariusz Zaborski 	fprintf(stderr, "Dead code reached in addrinfo_compare()\n");
111d3bfc725SMariusz Zaborski 	exit(1);
112d3bfc725SMariusz Zaborski }
113d3bfc725SMariusz Zaborski 
114d3bfc725SMariusz Zaborski static bool
115d3bfc725SMariusz Zaborski hostent_aliases_compare(char **aliases0, char **aliases1)
116d3bfc725SMariusz Zaborski {
117d3bfc725SMariusz Zaborski 	int i0, i1;
118d3bfc725SMariusz Zaborski 
119d3bfc725SMariusz Zaborski 	if (aliases0 == NULL && aliases1 == NULL)
120d3bfc725SMariusz Zaborski 		return (true);
121d3bfc725SMariusz Zaborski 	if (aliases0 == NULL || aliases1 == NULL)
122d3bfc725SMariusz Zaborski 		return (false);
123d3bfc725SMariusz Zaborski 
124d3bfc725SMariusz Zaborski 	for (i0 = 0; aliases0[i0] != NULL; i0++) {
125d3bfc725SMariusz Zaborski 		for (i1 = 0; aliases1[i1] != NULL; i1++) {
126d3bfc725SMariusz Zaborski 			if (strcmp(aliases0[i0], aliases1[i1]) == 0)
127d3bfc725SMariusz Zaborski 				break;
128d3bfc725SMariusz Zaborski 		}
129d3bfc725SMariusz Zaborski 		if (aliases1[i1] == NULL)
130d3bfc725SMariusz Zaborski 			return (false);
131d3bfc725SMariusz Zaborski 	}
132d3bfc725SMariusz Zaborski 
133d3bfc725SMariusz Zaborski 	return (true);
134d3bfc725SMariusz Zaborski }
135d3bfc725SMariusz Zaborski 
136d3bfc725SMariusz Zaborski static bool
137d3bfc725SMariusz Zaborski hostent_addr_list_compare(char **addr_list0, char **addr_list1, int length)
138d3bfc725SMariusz Zaborski {
139d3bfc725SMariusz Zaborski 	int i0, i1;
140d3bfc725SMariusz Zaborski 
141d3bfc725SMariusz Zaborski 	if (addr_list0 == NULL && addr_list1 == NULL)
142d3bfc725SMariusz Zaborski 		return (true);
143d3bfc725SMariusz Zaborski 	if (addr_list0 == NULL || addr_list1 == NULL)
144d3bfc725SMariusz Zaborski 		return (false);
145d3bfc725SMariusz Zaborski 
146d3bfc725SMariusz Zaborski 	for (i0 = 0; addr_list0[i0] != NULL; i0++) {
147d3bfc725SMariusz Zaborski 		for (i1 = 0; addr_list1[i1] != NULL; i1++) {
148d3bfc725SMariusz Zaborski 			if (memcmp(addr_list0[i0], addr_list1[i1], length) == 0)
149d3bfc725SMariusz Zaborski 				break;
150d3bfc725SMariusz Zaborski 		}
151d3bfc725SMariusz Zaborski 		if (addr_list1[i1] == NULL)
152d3bfc725SMariusz Zaborski 			return (false);
153d3bfc725SMariusz Zaborski 	}
154d3bfc725SMariusz Zaborski 
155d3bfc725SMariusz Zaborski 	return (true);
156d3bfc725SMariusz Zaborski }
157d3bfc725SMariusz Zaborski 
158d3bfc725SMariusz Zaborski static bool
159d3bfc725SMariusz Zaborski hostent_compare(const struct hostent *hp0, const struct hostent *hp1)
160d3bfc725SMariusz Zaborski {
161d3bfc725SMariusz Zaborski 
162d3bfc725SMariusz Zaborski 	if (hp0 == NULL && hp1 != NULL)
163d3bfc725SMariusz Zaborski 		return (true);
164d3bfc725SMariusz Zaborski 
165d3bfc725SMariusz Zaborski 	if (hp0 == NULL || hp1 == NULL)
166d3bfc725SMariusz Zaborski 		return (false);
167d3bfc725SMariusz Zaborski 
168d3bfc725SMariusz Zaborski 	if (hp0->h_name != NULL || hp1->h_name != NULL) {
169d3bfc725SMariusz Zaborski 		if (hp0->h_name == NULL || hp1->h_name == NULL)
170d3bfc725SMariusz Zaborski 			return (false);
171d3bfc725SMariusz Zaborski 		if (strcmp(hp0->h_name, hp1->h_name) != 0)
172d3bfc725SMariusz Zaborski 			return (false);
173d3bfc725SMariusz Zaborski 	}
174d3bfc725SMariusz Zaborski 
175d3bfc725SMariusz Zaborski 	if (!hostent_aliases_compare(hp0->h_aliases, hp1->h_aliases))
176d3bfc725SMariusz Zaborski 		return (false);
177d3bfc725SMariusz Zaborski 	if (!hostent_aliases_compare(hp1->h_aliases, hp0->h_aliases))
178d3bfc725SMariusz Zaborski 		return (false);
179d3bfc725SMariusz Zaborski 
180d3bfc725SMariusz Zaborski 	if (hp0->h_addrtype != hp1->h_addrtype)
181d3bfc725SMariusz Zaborski 		return (false);
182d3bfc725SMariusz Zaborski 
183d3bfc725SMariusz Zaborski 	if (hp0->h_length != hp1->h_length)
184d3bfc725SMariusz Zaborski 		return (false);
185d3bfc725SMariusz Zaborski 
186d3bfc725SMariusz Zaborski 	if (!hostent_addr_list_compare(hp0->h_addr_list, hp1->h_addr_list,
187d3bfc725SMariusz Zaborski 	    hp0->h_length)) {
188d3bfc725SMariusz Zaborski 		return (false);
189d3bfc725SMariusz Zaborski 	}
190d3bfc725SMariusz Zaborski 	if (!hostent_addr_list_compare(hp1->h_addr_list, hp0->h_addr_list,
191d3bfc725SMariusz Zaborski 	    hp0->h_length)) {
192d3bfc725SMariusz Zaborski 		return (false);
193d3bfc725SMariusz Zaborski 	}
194d3bfc725SMariusz Zaborski 
195d3bfc725SMariusz Zaborski 	return (true);
196d3bfc725SMariusz Zaborski }
197d3bfc725SMariusz Zaborski 
198615bf03eSMark Johnston static void
199615bf03eSMark Johnston runtest(cap_channel_t *capdns, unsigned int expected)
200d3bfc725SMariusz Zaborski {
201615bf03eSMark Johnston 	unsigned int result, failure;
202d3bfc725SMariusz Zaborski 	struct addrinfo *ais, *aic, hints, *hintsp;
203d3bfc725SMariusz Zaborski 	struct hostent *hps, *hpc;
204d3bfc725SMariusz Zaborski 	struct in_addr ip4;
205d3bfc725SMariusz Zaborski 	struct in6_addr ip6;
206615bf03eSMark Johnston 	int caperr, syserr;
207d3bfc725SMariusz Zaborski 
208615bf03eSMark Johnston 	failure = result = 0;
209d3bfc725SMariusz Zaborski 
210d3bfc725SMariusz Zaborski 	hps = gethostbyname("example.com");
211615bf03eSMark Johnston 	if (hps == NULL) {
212615bf03eSMark Johnston 		failure |= GETHOSTBYNAME;
213d3bfc725SMariusz Zaborski 		fprintf(stderr, "Unable to resolve %s IPv4.\n", "example.com");
214615bf03eSMark Johnston 	} else {
215d3bfc725SMariusz Zaborski 		hpc = cap_gethostbyname(capdns, "example.com");
216d3bfc725SMariusz Zaborski 		if (hostent_compare(hps, hpc))
217d3bfc725SMariusz Zaborski 			result |= GETHOSTBYNAME;
218615bf03eSMark Johnston 	}
219d3bfc725SMariusz Zaborski 
220d3bfc725SMariusz Zaborski 	hps = gethostbyname2("example.com", AF_INET);
221615bf03eSMark Johnston 	if (hps == NULL) {
222615bf03eSMark Johnston 		failure |= GETHOSTBYNAME2_AF_INET;
223d3bfc725SMariusz Zaborski 		fprintf(stderr, "Unable to resolve %s IPv4.\n", "example.com");
224615bf03eSMark Johnston 	} else {
225d3bfc725SMariusz Zaborski 		hpc = cap_gethostbyname2(capdns, "example.com", AF_INET);
226d3bfc725SMariusz Zaborski 		if (hostent_compare(hps, hpc))
227d3bfc725SMariusz Zaborski 			result |= GETHOSTBYNAME2_AF_INET;
228615bf03eSMark Johnston 	}
229d3bfc725SMariusz Zaborski 
230d3bfc725SMariusz Zaborski 	hps = gethostbyname2("example.com", AF_INET6);
231615bf03eSMark Johnston 	if (hps == NULL) {
232615bf03eSMark Johnston 		failure |= GETHOSTBYNAME2_AF_INET6;
233d3bfc725SMariusz Zaborski 		fprintf(stderr, "Unable to resolve %s IPv6.\n", "example.com");
234615bf03eSMark Johnston 	} else {
235d3bfc725SMariusz Zaborski 		hpc = cap_gethostbyname2(capdns, "example.com", AF_INET6);
236d3bfc725SMariusz Zaborski 		if (hostent_compare(hps, hpc))
237d3bfc725SMariusz Zaborski 			result |= GETHOSTBYNAME2_AF_INET6;
238615bf03eSMark Johnston 	}
239d3bfc725SMariusz Zaborski 
240d3bfc725SMariusz Zaborski 	hints.ai_flags = 0;
241d3bfc725SMariusz Zaborski 	hints.ai_family = AF_UNSPEC;
242d3bfc725SMariusz Zaborski 	hints.ai_socktype = 0;
243d3bfc725SMariusz Zaborski 	hints.ai_protocol = 0;
244d3bfc725SMariusz Zaborski 	hints.ai_addrlen = 0;
245d3bfc725SMariusz Zaborski 	hints.ai_addr = NULL;
246d3bfc725SMariusz Zaborski 	hints.ai_canonname = NULL;
247d3bfc725SMariusz Zaborski 	hints.ai_next = NULL;
248d3bfc725SMariusz Zaborski 
249d3bfc725SMariusz Zaborski 	hintsp = &hints;
250d3bfc725SMariusz Zaborski 
251615bf03eSMark Johnston 	syserr = getaddrinfo("freebsd.org", "25", hintsp, &ais);
252615bf03eSMark Johnston 	if (syserr != 0) {
253615bf03eSMark Johnston 		failure |= GETADDRINFO_AF_UNSPEC;
254d3bfc725SMariusz Zaborski 		fprintf(stderr,
255d3bfc725SMariusz Zaborski 		    "Unable to issue [system] getaddrinfo() for AF_UNSPEC: %s\n",
256615bf03eSMark Johnston 		    gai_strerror(syserr));
257615bf03eSMark Johnston 	} else {
258615bf03eSMark Johnston 		caperr = cap_getaddrinfo(capdns, "freebsd.org", "25", hintsp,
259615bf03eSMark Johnston 		    &aic);
260615bf03eSMark Johnston 		if (caperr == 0) {
261d3bfc725SMariusz Zaborski 			if (addrinfo_compare(ais, aic))
262d3bfc725SMariusz Zaborski 				result |= GETADDRINFO_AF_UNSPEC;
263d3bfc725SMariusz Zaborski 			freeaddrinfo(ais);
264d3bfc725SMariusz Zaborski 			freeaddrinfo(aic);
265d3bfc725SMariusz Zaborski 		}
266615bf03eSMark Johnston 	}
267d3bfc725SMariusz Zaborski 
268d3bfc725SMariusz Zaborski 	hints.ai_family = AF_INET;
269615bf03eSMark Johnston 	syserr = getaddrinfo("freebsd.org", "25", hintsp, &ais);
270615bf03eSMark Johnston 	if (syserr != 0) {
271615bf03eSMark Johnston 		failure |= GETADDRINFO_AF_INET;
272d3bfc725SMariusz Zaborski 		fprintf(stderr,
273d3bfc725SMariusz Zaborski 		    "Unable to issue [system] getaddrinfo() for AF_UNSPEC: %s\n",
274615bf03eSMark Johnston 		    gai_strerror(syserr));
275615bf03eSMark Johnston 	} else {
276615bf03eSMark Johnston 		caperr = cap_getaddrinfo(capdns, "freebsd.org", "25", hintsp,
277615bf03eSMark Johnston 		    &aic);
278615bf03eSMark Johnston 		if (caperr == 0) {
279d3bfc725SMariusz Zaborski 			if (addrinfo_compare(ais, aic))
280d3bfc725SMariusz Zaborski 				result |= GETADDRINFO_AF_INET;
281d3bfc725SMariusz Zaborski 			freeaddrinfo(ais);
282d3bfc725SMariusz Zaborski 			freeaddrinfo(aic);
283d3bfc725SMariusz Zaborski 		}
284615bf03eSMark Johnston 	}
285d3bfc725SMariusz Zaborski 
286d3bfc725SMariusz Zaborski 	hints.ai_family = AF_INET6;
287615bf03eSMark Johnston 	syserr = getaddrinfo("freebsd.org", "25", hintsp, &ais);
288615bf03eSMark Johnston 	if (syserr != 0) {
289615bf03eSMark Johnston 		failure |= GETADDRINFO_AF_INET6;
290d3bfc725SMariusz Zaborski 		fprintf(stderr,
291d3bfc725SMariusz Zaborski 		    "Unable to issue [system] getaddrinfo() for AF_UNSPEC: %s\n",
292615bf03eSMark Johnston 		    gai_strerror(syserr));
293615bf03eSMark Johnston 	} else {
294615bf03eSMark Johnston 		caperr = cap_getaddrinfo(capdns, "freebsd.org", "25", hintsp,
295615bf03eSMark Johnston 		    &aic);
296615bf03eSMark Johnston 		if (caperr == 0) {
297d3bfc725SMariusz Zaborski 			if (addrinfo_compare(ais, aic))
298d3bfc725SMariusz Zaborski 				result |= GETADDRINFO_AF_INET6;
299d3bfc725SMariusz Zaborski 			freeaddrinfo(ais);
300d3bfc725SMariusz Zaborski 			freeaddrinfo(aic);
301d3bfc725SMariusz Zaborski 		}
302615bf03eSMark Johnston 	}
303d3bfc725SMariusz Zaborski 
304191d976fSEnji Cooper 	/* XXX: hardcoded addresses for "google-public-dns-a.google.com". */
305191d976fSEnji Cooper #define	GOOGLE_DNS_IPV4	"8.8.8.8"
306191d976fSEnji Cooper #define	GOOGLE_DNS_IPV6	"2001:4860:4860::8888"
307191d976fSEnji Cooper 
308191d976fSEnji Cooper 	inet_pton(AF_INET, GOOGLE_DNS_IPV4, &ip4);
309d3bfc725SMariusz Zaborski 	hps = gethostbyaddr(&ip4, sizeof(ip4), AF_INET);
310615bf03eSMark Johnston 	if (hps == NULL) {
311615bf03eSMark Johnston 		failure |= GETHOSTBYADDR_AF_INET;
312191d976fSEnji Cooper 		fprintf(stderr, "Unable to resolve %s.\n", GOOGLE_DNS_IPV4);
313615bf03eSMark Johnston 	} else {
314d3bfc725SMariusz Zaborski 		hpc = cap_gethostbyaddr(capdns, &ip4, sizeof(ip4), AF_INET);
315d3bfc725SMariusz Zaborski 		if (hostent_compare(hps, hpc))
316d3bfc725SMariusz Zaborski 			result |= GETHOSTBYADDR_AF_INET;
317615bf03eSMark Johnston 	}
318d3bfc725SMariusz Zaborski 
319191d976fSEnji Cooper 	inet_pton(AF_INET6, GOOGLE_DNS_IPV6, &ip6);
320d3bfc725SMariusz Zaborski 	hps = gethostbyaddr(&ip6, sizeof(ip6), AF_INET6);
321d3bfc725SMariusz Zaborski 	if (hps == NULL) {
322615bf03eSMark Johnston 		failure |= GETHOSTBYADDR_AF_INET6;
323191d976fSEnji Cooper 		fprintf(stderr, "Unable to resolve %s.\n", GOOGLE_DNS_IPV6);
324615bf03eSMark Johnston 	} else {
325d3bfc725SMariusz Zaborski 		hpc = cap_gethostbyaddr(capdns, &ip6, sizeof(ip6), AF_INET6);
326615bf03eSMark Johnston 		if (hostent_compare(hps, hpc)) {
327615bf03eSMark Johnston 			caperr = h_errno;
328d3bfc725SMariusz Zaborski 			result |= GETHOSTBYADDR_AF_INET6;
329615bf03eSMark Johnston 		}
330d3bfc725SMariusz Zaborski 	}
331d3bfc725SMariusz Zaborski 
332615bf03eSMark Johnston 	/*
333615bf03eSMark Johnston 	 * If we had any failures, make sure that all lookups failed.  If some
334615bf03eSMark Johnston 	 * succeeded and some failed, there's a problem with the test or the DNS
335615bf03eSMark Johnston 	 * and we should not fail silently.
336615bf03eSMark Johnston 	 */
337615bf03eSMark Johnston 	if (failure != 0) {
338615bf03eSMark Johnston 		ATF_REQUIRE_MSG(failure == (GETHOSTBYNAME |
339615bf03eSMark Johnston 		    GETHOSTBYNAME2_AF_INET | GETHOSTBYNAME2_AF_INET6 |
340615bf03eSMark Johnston 		    GETADDRINFO_AF_UNSPEC | GETADDRINFO_AF_INET |
341615bf03eSMark Johnston 		    GETADDRINFO_AF_INET6 |
342615bf03eSMark Johnston 		    GETHOSTBYADDR_AF_INET | GETHOSTBYADDR_AF_INET6),
343615bf03eSMark Johnston 		    "expected all tests to fail, got 0x%x", failure);
344615bf03eSMark Johnston 		atf_tc_skip(
345615bf03eSMark Johnston 		    "no name lookups succeeded, tests require Internet access");
346615bf03eSMark Johnston 	}
347615bf03eSMark Johnston 	ATF_REQUIRE_MSG(result == expected,
348615bf03eSMark Johnston 	    "expected 0x%x, got 0x%x", expected, result);
349615bf03eSMark Johnston }
350d3bfc725SMariusz Zaborski 
351615bf03eSMark Johnston static cap_channel_t *
352615bf03eSMark Johnston cap_dns_init(void)
353615bf03eSMark Johnston {
354615bf03eSMark Johnston 	cap_channel_t *capcas, *capdns;
355d3bfc725SMariusz Zaborski 
356d3bfc725SMariusz Zaborski 	capcas = cap_init();
357615bf03eSMark Johnston 	ATF_REQUIRE(capcas != NULL);
358d3bfc725SMariusz Zaborski 
359615bf03eSMark Johnston 	capdns = cap_service_open(capcas, "system.dns");
360615bf03eSMark Johnston 	ATF_REQUIRE(capdns != NULL);
361d3bfc725SMariusz Zaborski 
362d3bfc725SMariusz Zaborski 	cap_close(capcas);
363d3bfc725SMariusz Zaborski 
364615bf03eSMark Johnston 	return (capdns);
365615bf03eSMark Johnston }
366d3bfc725SMariusz Zaborski 
367615bf03eSMark Johnston ATF_TC(dns_no_limits);
368615bf03eSMark Johnston ATF_TC_HEAD(dns_no_limits, tc)
369615bf03eSMark Johnston {
370615bf03eSMark Johnston }
371615bf03eSMark Johnston ATF_TC_BODY(dns_no_limits, tc)
372615bf03eSMark Johnston {
373615bf03eSMark Johnston 	cap_channel_t *capdns;
374615bf03eSMark Johnston 
375615bf03eSMark Johnston 	capdns = cap_dns_init();
376615bf03eSMark Johnston 
377615bf03eSMark Johnston 	runtest(capdns,
378d3bfc725SMariusz Zaborski 	    (GETHOSTBYNAME | GETHOSTBYNAME2_AF_INET | GETHOSTBYNAME2_AF_INET6 |
379d3bfc725SMariusz Zaborski 	     GETHOSTBYADDR_AF_INET | GETHOSTBYADDR_AF_INET6 |
380615bf03eSMark Johnston 	     GETADDRINFO_AF_UNSPEC | GETADDRINFO_AF_INET |
381615bf03eSMark Johnston 	     GETADDRINFO_AF_INET6));
382d3bfc725SMariusz Zaborski 
383615bf03eSMark Johnston 	cap_close(capdns);
384615bf03eSMark Johnston }
385d3bfc725SMariusz Zaborski 
386615bf03eSMark Johnston ATF_TC(dns_all_limits);
387615bf03eSMark Johnston ATF_TC_HEAD(dns_all_limits, tc)
388615bf03eSMark Johnston {
389615bf03eSMark Johnston }
390615bf03eSMark Johnston ATF_TC_BODY(dns_all_limits, tc)
391615bf03eSMark Johnston {
392615bf03eSMark Johnston 	cap_channel_t *capdns;
393615bf03eSMark Johnston 	const char *types[2];
394615bf03eSMark Johnston 	int families[2];
395615bf03eSMark Johnston 
396615bf03eSMark Johnston 	capdns = cap_dns_init();
397d3bfc725SMariusz Zaborski 
398752d135eSMariusz Zaborski 	types[0] = "NAME2ADDR";
399752d135eSMariusz Zaborski 	types[1] = "ADDR2NAME";
400615bf03eSMark Johnston 	ATF_REQUIRE(cap_dns_type_limit(capdns, types, 2) == 0);
401d3bfc725SMariusz Zaborski 	families[0] = AF_INET;
402d3bfc725SMariusz Zaborski 	families[1] = AF_INET6;
403615bf03eSMark Johnston 	ATF_REQUIRE(cap_dns_family_limit(capdns, families, 2) == 0);
404615bf03eSMark Johnston 	ATF_REQUIRE_ERRNO(ENOTCAPABLE,
405615bf03eSMark Johnston 	    cap_dns_family_limit(capdns, NULL, 0) == -1);
406615bf03eSMark Johnston 	ATF_REQUIRE_ERRNO(ENOTCAPABLE,
407615bf03eSMark Johnston 	    cap_dns_type_limit(capdns, NULL, 0) == -1);
408d3bfc725SMariusz Zaborski 
409615bf03eSMark Johnston 	runtest(capdns,
410d3bfc725SMariusz Zaborski 	    (GETHOSTBYNAME | GETHOSTBYNAME2_AF_INET | GETHOSTBYNAME2_AF_INET6 |
411d3bfc725SMariusz Zaborski 	     GETHOSTBYADDR_AF_INET | GETHOSTBYADDR_AF_INET6 |
412d3bfc725SMariusz Zaborski 	     GETADDRINFO_AF_INET | GETADDRINFO_AF_INET6));
413d3bfc725SMariusz Zaborski 
414d3bfc725SMariusz Zaborski 	cap_close(capdns);
415615bf03eSMark Johnston }
416d3bfc725SMariusz Zaborski 
417615bf03eSMark Johnston ATF_TC(dns_name_limit);
418615bf03eSMark Johnston ATF_TC_HEAD(dns_name_limit, tc)
419615bf03eSMark Johnston {
420615bf03eSMark Johnston }
421615bf03eSMark Johnston ATF_TC_BODY(dns_name_limit, tc)
422615bf03eSMark Johnston {
423615bf03eSMark Johnston 	cap_channel_t *capdns;
424615bf03eSMark Johnston 	const char *types[2];
425615bf03eSMark Johnston 	int families[2];
426d3bfc725SMariusz Zaborski 
427615bf03eSMark Johnston 	capdns = cap_dns_init();
428d3bfc725SMariusz Zaborski 
429752d135eSMariusz Zaborski 	types[0] = "NAME2ADDR";
430615bf03eSMark Johnston 	ATF_REQUIRE(cap_dns_type_limit(capdns, types, 1) == 0);
431752d135eSMariusz Zaborski 	types[1] = "ADDR2NAME";
432615bf03eSMark Johnston 	ATF_REQUIRE_ERRNO(ENOTCAPABLE,
433615bf03eSMark Johnston 	    cap_dns_type_limit(capdns, types, 2) == -1);
434752d135eSMariusz Zaborski 	types[0] = "ADDR2NAME";
435615bf03eSMark Johnston 	ATF_REQUIRE_ERRNO(ENOTCAPABLE,
436615bf03eSMark Johnston 	    cap_dns_type_limit(capdns, types, 1) == -1);
437d3bfc725SMariusz Zaborski 	families[0] = AF_INET;
438d3bfc725SMariusz Zaborski 	families[1] = AF_INET6;
439615bf03eSMark Johnston 	ATF_REQUIRE(cap_dns_family_limit(capdns, families, 2) == 0);
440d3bfc725SMariusz Zaborski 
441615bf03eSMark Johnston 	runtest(capdns,
442577dff6aSMariusz Zaborski 	    (GETHOSTBYNAME | GETHOSTBYNAME2_AF_INET | GETHOSTBYNAME2_AF_INET6 |
443577dff6aSMariusz Zaborski 	    GETADDRINFO_AF_INET | GETADDRINFO_AF_INET6));
444d3bfc725SMariusz Zaborski 
445d3bfc725SMariusz Zaborski 	cap_close(capdns);
446615bf03eSMark Johnston }
447d3bfc725SMariusz Zaborski 
448615bf03eSMark Johnston ATF_TC(dns_addr_limit);
449615bf03eSMark Johnston ATF_TC_HEAD(dns_addr_limit, tc)
450615bf03eSMark Johnston {
451615bf03eSMark Johnston }
452615bf03eSMark Johnston ATF_TC_BODY(dns_addr_limit, tc)
453615bf03eSMark Johnston {
454615bf03eSMark Johnston 	cap_channel_t *capdns;
455615bf03eSMark Johnston 	const char *types[2];
456615bf03eSMark Johnston 	int families[2];
457d3bfc725SMariusz Zaborski 
458615bf03eSMark Johnston 	capdns = cap_dns_init();
459d3bfc725SMariusz Zaborski 
460752d135eSMariusz Zaborski 	types[0] = "ADDR2NAME";
461615bf03eSMark Johnston 	ATF_REQUIRE(cap_dns_type_limit(capdns, types, 1) == 0);
462752d135eSMariusz Zaborski 	types[1] = "NAME2ADDR";
463615bf03eSMark Johnston 	ATF_REQUIRE_ERRNO(ENOTCAPABLE,
464615bf03eSMark Johnston 	    cap_dns_type_limit(capdns, types, 2) == -1);
465752d135eSMariusz Zaborski 	types[0] = "NAME2ADDR";
466615bf03eSMark Johnston 	ATF_REQUIRE_ERRNO(ENOTCAPABLE,
467615bf03eSMark Johnston 	    cap_dns_type_limit(capdns, types, 1) == -1);
468d3bfc725SMariusz Zaborski 	families[0] = AF_INET;
469d3bfc725SMariusz Zaborski 	families[1] = AF_INET6;
470615bf03eSMark Johnston 	ATF_REQUIRE(cap_dns_family_limit(capdns, families, 2) == 0);
471d3bfc725SMariusz Zaborski 
472615bf03eSMark Johnston 	runtest(capdns,
473577dff6aSMariusz Zaborski 	    (GETHOSTBYADDR_AF_INET | GETHOSTBYADDR_AF_INET6));
474615bf03eSMark Johnston 
475d3bfc725SMariusz Zaborski 	cap_close(capdns);
476615bf03eSMark Johnston }
477d3bfc725SMariusz Zaborski 
478615bf03eSMark Johnston ATF_TC(dns_inet_limit);
479615bf03eSMark Johnston ATF_TC_HEAD(dns_inet_limit, tc)
480615bf03eSMark Johnston {
481615bf03eSMark Johnston }
482615bf03eSMark Johnston ATF_TC_BODY(dns_inet_limit, tc)
483615bf03eSMark Johnston {
484615bf03eSMark Johnston 	cap_channel_t *capdns;
485615bf03eSMark Johnston 	const char *types[2];
486615bf03eSMark Johnston 	int families[2];
487d3bfc725SMariusz Zaborski 
488615bf03eSMark Johnston 	capdns = cap_dns_init();
489d3bfc725SMariusz Zaborski 
490752d135eSMariusz Zaborski 	types[0] = "NAME2ADDR";
491752d135eSMariusz Zaborski 	types[1] = "ADDR2NAME";
492615bf03eSMark Johnston 	ATF_REQUIRE(cap_dns_type_limit(capdns, types, 2) == 0);
493d3bfc725SMariusz Zaborski 	families[0] = AF_INET;
494615bf03eSMark Johnston 	ATF_REQUIRE(cap_dns_family_limit(capdns, families, 1) == 0);
495d3bfc725SMariusz Zaborski 	families[1] = AF_INET6;
496615bf03eSMark Johnston 	ATF_REQUIRE_ERRNO(ENOTCAPABLE,
497615bf03eSMark Johnston 	    cap_dns_family_limit(capdns, families, 2) == -1);
498d3bfc725SMariusz Zaborski 	families[0] = AF_INET6;
499615bf03eSMark Johnston 	ATF_REQUIRE_ERRNO(ENOTCAPABLE,
500615bf03eSMark Johnston 	    cap_dns_family_limit(capdns, families, 1) == -1);
501d3bfc725SMariusz Zaborski 
502615bf03eSMark Johnston 	runtest(capdns,
503d3bfc725SMariusz Zaborski 	    (GETHOSTBYNAME | GETHOSTBYNAME2_AF_INET | GETHOSTBYADDR_AF_INET |
504d3bfc725SMariusz Zaborski 	    GETADDRINFO_AF_INET));
505d3bfc725SMariusz Zaborski 
506d3bfc725SMariusz Zaborski 	cap_close(capdns);
507615bf03eSMark Johnston }
508d3bfc725SMariusz Zaborski 
509615bf03eSMark Johnston ATF_TC(dns_inet6_limit);
510615bf03eSMark Johnston ATF_TC_HEAD(dns_inet6_limit, tc)
511615bf03eSMark Johnston {
512615bf03eSMark Johnston }
513615bf03eSMark Johnston ATF_TC_BODY(dns_inet6_limit, tc)
514615bf03eSMark Johnston {
515615bf03eSMark Johnston 	cap_channel_t *capdns;
516615bf03eSMark Johnston 	const char *types[2];
517615bf03eSMark Johnston 	int families[2];
518d3bfc725SMariusz Zaborski 
519615bf03eSMark Johnston 	capdns = cap_dns_init();
520d3bfc725SMariusz Zaborski 
521752d135eSMariusz Zaborski 	types[0] = "NAME2ADDR";
522752d135eSMariusz Zaborski 	types[1] = "ADDR2NAME";
523615bf03eSMark Johnston 	ATF_REQUIRE(cap_dns_type_limit(capdns, types, 2) == 0);
524d3bfc725SMariusz Zaborski 	families[0] = AF_INET6;
525615bf03eSMark Johnston 	ATF_REQUIRE(cap_dns_family_limit(capdns, families, 1) == 0);
526d3bfc725SMariusz Zaborski 	families[1] = AF_INET;
527615bf03eSMark Johnston 	ATF_REQUIRE_ERRNO(ENOTCAPABLE,
528615bf03eSMark Johnston 	    cap_dns_family_limit(capdns, families, 2) == -1);
529d3bfc725SMariusz Zaborski 	families[0] = AF_INET;
530615bf03eSMark Johnston 	ATF_REQUIRE_ERRNO(ENOTCAPABLE,
531615bf03eSMark Johnston 	    cap_dns_family_limit(capdns, families, 1) == -1);
532d3bfc725SMariusz Zaborski 
533615bf03eSMark Johnston 	runtest(capdns,
534d3bfc725SMariusz Zaborski 	    (GETHOSTBYNAME2_AF_INET6 | GETHOSTBYADDR_AF_INET6 |
535d3bfc725SMariusz Zaborski 	    GETADDRINFO_AF_INET6));
536d3bfc725SMariusz Zaborski 
537d3bfc725SMariusz Zaborski 	cap_close(capdns);
538615bf03eSMark Johnston }
539d3bfc725SMariusz Zaborski 
540615bf03eSMark Johnston ATF_TC(dns_name_inet_limit);
541615bf03eSMark Johnston ATF_TC_HEAD(dns_name_inet_limit, tc)
542615bf03eSMark Johnston {
543615bf03eSMark Johnston }
544615bf03eSMark Johnston ATF_TC_BODY(dns_name_inet_limit, tc)
545615bf03eSMark Johnston {
546615bf03eSMark Johnston 	cap_channel_t *capdns;
547615bf03eSMark Johnston 	const char *types[2];
548615bf03eSMark Johnston 	int families[2];
549d3bfc725SMariusz Zaborski 
550615bf03eSMark Johnston 	capdns = cap_dns_init();
551d3bfc725SMariusz Zaborski 
552752d135eSMariusz Zaborski 	types[0] = "NAME2ADDR";
553752d135eSMariusz Zaborski 	types[1] = "ADDR2NAME";
554615bf03eSMark Johnston 	ATF_REQUIRE(cap_dns_type_limit(capdns, types, 2) == 0);
555d3bfc725SMariusz Zaborski 	families[0] = AF_INET;
556d3bfc725SMariusz Zaborski 	families[1] = AF_INET6;
557615bf03eSMark Johnston 	ATF_REQUIRE(cap_dns_family_limit(capdns, families, 2) == 0);
558752d135eSMariusz Zaborski 	types[0] = "NAME2ADDR";
559615bf03eSMark Johnston 	ATF_REQUIRE(cap_dns_type_limit(capdns, types, 1) == 0);
560752d135eSMariusz Zaborski 	types[1] = "ADDR2NAME";
561615bf03eSMark Johnston 	ATF_REQUIRE_ERRNO(ENOTCAPABLE,
562615bf03eSMark Johnston 	    cap_dns_type_limit(capdns, types, 2) == -1);
563752d135eSMariusz Zaborski 	types[0] = "ADDR2NAME";
564615bf03eSMark Johnston 	ATF_REQUIRE_ERRNO(ENOTCAPABLE,
565615bf03eSMark Johnston 	    cap_dns_type_limit(capdns, types, 1) == -1);
566d3bfc725SMariusz Zaborski 	families[0] = AF_INET;
567615bf03eSMark Johnston 	ATF_REQUIRE(cap_dns_family_limit(capdns, families, 1) == 0);
568d3bfc725SMariusz Zaborski 	families[1] = AF_INET6;
569615bf03eSMark Johnston 	ATF_REQUIRE_ERRNO(ENOTCAPABLE,
570615bf03eSMark Johnston 	    cap_dns_family_limit(capdns, families, 2) == -1);
571d3bfc725SMariusz Zaborski 	families[0] = AF_INET6;
572615bf03eSMark Johnston 	ATF_REQUIRE_ERRNO(ENOTCAPABLE,
573615bf03eSMark Johnston 	    cap_dns_family_limit(capdns, families, 1) == -1);
574d3bfc725SMariusz Zaborski 
575615bf03eSMark Johnston 	runtest(capdns,
576577dff6aSMariusz Zaborski 	    (GETHOSTBYNAME | GETHOSTBYNAME2_AF_INET | GETADDRINFO_AF_INET));
577d3bfc725SMariusz Zaborski 
578d3bfc725SMariusz Zaborski 	cap_close(capdns);
579615bf03eSMark Johnston }
580d3bfc725SMariusz Zaborski 
581615bf03eSMark Johnston ATF_TC(dns_name_inet6_limit);
582615bf03eSMark Johnston ATF_TC_HEAD(dns_name_inet6_limit, tc)
583615bf03eSMark Johnston {
584615bf03eSMark Johnston }
585615bf03eSMark Johnston ATF_TC_BODY(dns_name_inet6_limit, tc)
586615bf03eSMark Johnston {
587615bf03eSMark Johnston 	cap_channel_t *capdns;
588615bf03eSMark Johnston 	const char *types[2];
589615bf03eSMark Johnston 	int families[2];
590d3bfc725SMariusz Zaborski 
591615bf03eSMark Johnston 	capdns = cap_dns_init();
592d3bfc725SMariusz Zaborski 
593752d135eSMariusz Zaborski 	types[0] = "NAME2ADDR";
594752d135eSMariusz Zaborski 	types[1] = "ADDR2NAME";
595615bf03eSMark Johnston 	ATF_REQUIRE(cap_dns_type_limit(capdns, types, 2) == 0);
596d3bfc725SMariusz Zaborski 	families[0] = AF_INET6;
597d3bfc725SMariusz Zaborski 	families[1] = AF_INET;
598615bf03eSMark Johnston 	ATF_REQUIRE(cap_dns_family_limit(capdns, families, 2) == 0);
599615bf03eSMark Johnston 	types[0] = "NAME2ADDR";
600615bf03eSMark Johnston 	ATF_REQUIRE(cap_dns_type_limit(capdns, types, 1) == 0);
601615bf03eSMark Johnston 	types[1] = "ADDR2NAME";
602615bf03eSMark Johnston 	ATF_REQUIRE_ERRNO(ENOTCAPABLE,
603615bf03eSMark Johnston 	    cap_dns_type_limit(capdns, types, 2) == -1);
604615bf03eSMark Johnston 	types[0] = "ADDR2NAME";
605615bf03eSMark Johnston 	ATF_REQUIRE_ERRNO(ENOTCAPABLE,
606615bf03eSMark Johnston 	    cap_dns_type_limit(capdns, types, 1) == -1);
607615bf03eSMark Johnston 	families[0] = AF_INET6;
608615bf03eSMark Johnston 	ATF_REQUIRE(cap_dns_family_limit(capdns, families, 1) == 0);
609615bf03eSMark Johnston 	families[1] = AF_INET;
610615bf03eSMark Johnston 	ATF_REQUIRE_ERRNO(ENOTCAPABLE,
611615bf03eSMark Johnston 	    cap_dns_family_limit(capdns, families, 2) == -1);
612d3bfc725SMariusz Zaborski 	families[0] = AF_INET;
613615bf03eSMark Johnston 	ATF_REQUIRE_ERRNO(ENOTCAPABLE,
614615bf03eSMark Johnston 	    cap_dns_family_limit(capdns, families, 1) == -1);
615d3bfc725SMariusz Zaborski 
616615bf03eSMark Johnston 	runtest(capdns,
617577dff6aSMariusz Zaborski 	    (GETHOSTBYNAME2_AF_INET6 | GETADDRINFO_AF_INET6));
618d3bfc725SMariusz Zaborski 
619d3bfc725SMariusz Zaborski 	cap_close(capdns);
620615bf03eSMark Johnston }
621d3bfc725SMariusz Zaborski 
622615bf03eSMark Johnston ATF_TC(dns_addr_inet_limit);
623615bf03eSMark Johnston ATF_TC_HEAD(dns_addr_inet_limit, tc)
624615bf03eSMark Johnston {
625615bf03eSMark Johnston }
626615bf03eSMark Johnston ATF_TC_BODY(dns_addr_inet_limit, tc)
627615bf03eSMark Johnston {
628615bf03eSMark Johnston 	cap_channel_t *capdns;
629615bf03eSMark Johnston 	const char *types[2];
630615bf03eSMark Johnston 	int families[2];
631d3bfc725SMariusz Zaborski 
632615bf03eSMark Johnston 	capdns = cap_dns_init();
633d3bfc725SMariusz Zaborski 
634752d135eSMariusz Zaborski 	types[0] = "NAME2ADDR";
635752d135eSMariusz Zaborski 	types[1] = "ADDR2NAME";
636615bf03eSMark Johnston 	ATF_REQUIRE(cap_dns_type_limit(capdns, types, 2) == 0);
637d3bfc725SMariusz Zaborski 	families[0] = AF_INET;
638d3bfc725SMariusz Zaborski 	families[1] = AF_INET6;
639615bf03eSMark Johnston 	ATF_REQUIRE(cap_dns_family_limit(capdns, families, 2) == 0);
640752d135eSMariusz Zaborski 	types[0] = "ADDR2NAME";
641615bf03eSMark Johnston 	ATF_REQUIRE(cap_dns_type_limit(capdns, types, 1) == 0);
642752d135eSMariusz Zaborski 	types[1] = "NAME2ADDR";
643615bf03eSMark Johnston 	ATF_REQUIRE_ERRNO(ENOTCAPABLE,
644615bf03eSMark Johnston 	    cap_dns_type_limit(capdns, types, 2) == -1);
645752d135eSMariusz Zaborski 	types[0] = "NAME2ADDR";
646615bf03eSMark Johnston 	ATF_REQUIRE_ERRNO(ENOTCAPABLE,
647615bf03eSMark Johnston 	    cap_dns_type_limit(capdns, types, 1) == -1);
648d3bfc725SMariusz Zaborski 	families[0] = AF_INET;
649615bf03eSMark Johnston 	ATF_REQUIRE(cap_dns_family_limit(capdns, families, 1) == 0);
650d3bfc725SMariusz Zaborski 	families[1] = AF_INET6;
651615bf03eSMark Johnston 	ATF_REQUIRE_ERRNO(ENOTCAPABLE,
652615bf03eSMark Johnston 	    cap_dns_family_limit(capdns, families, 2) == -1);
653d3bfc725SMariusz Zaborski 	families[0] = AF_INET6;
654615bf03eSMark Johnston 	ATF_REQUIRE_ERRNO(ENOTCAPABLE,
655615bf03eSMark Johnston 	    cap_dns_family_limit(capdns, families, 1) == -1);
656d3bfc725SMariusz Zaborski 
657615bf03eSMark Johnston 	runtest(capdns, GETHOSTBYADDR_AF_INET);
658d3bfc725SMariusz Zaborski 
659d3bfc725SMariusz Zaborski 	cap_close(capdns);
660615bf03eSMark Johnston }
661d3bfc725SMariusz Zaborski 
662615bf03eSMark Johnston ATF_TC(dns_addr_inet6_limit);
663615bf03eSMark Johnston ATF_TC_HEAD(dns_addr_inet6_limit, tc)
664615bf03eSMark Johnston {
665615bf03eSMark Johnston }
666615bf03eSMark Johnston ATF_TC_BODY(dns_addr_inet6_limit, tc)
667615bf03eSMark Johnston {
668615bf03eSMark Johnston 	cap_channel_t *capdns;
669615bf03eSMark Johnston 	const char *types[2];
670615bf03eSMark Johnston 	int families[2];
671d3bfc725SMariusz Zaborski 
672615bf03eSMark Johnston 	capdns = cap_dns_init();
673d3bfc725SMariusz Zaborski 
674752d135eSMariusz Zaborski 	types[0] = "NAME2ADDR";
675752d135eSMariusz Zaborski 	types[1] = "ADDR2NAME";
676615bf03eSMark Johnston 	ATF_REQUIRE(cap_dns_type_limit(capdns, types, 2) == 0);
677d3bfc725SMariusz Zaborski 	families[0] = AF_INET6;
678d3bfc725SMariusz Zaborski 	families[1] = AF_INET;
679615bf03eSMark Johnston 	ATF_REQUIRE(cap_dns_family_limit(capdns, families, 2) == 0);
680752d135eSMariusz Zaborski 	types[0] = "ADDR2NAME";
681615bf03eSMark Johnston 	ATF_REQUIRE(cap_dns_type_limit(capdns, types, 1) == 0);
682615bf03eSMark Johnston 	types[1] = "NAME2ADDR";
683615bf03eSMark Johnston 	ATF_REQUIRE_ERRNO(ENOTCAPABLE,
684615bf03eSMark Johnston 	    cap_dns_type_limit(capdns, types, 2) == -1);
685615bf03eSMark Johnston 	types[0] = "NAME2ADDR";
686615bf03eSMark Johnston 	ATF_REQUIRE_ERRNO(ENOTCAPABLE,
687615bf03eSMark Johnston 	    cap_dns_type_limit(capdns, types, 1) == -1);
688d3bfc725SMariusz Zaborski 	families[0] = AF_INET6;
689615bf03eSMark Johnston 	ATF_REQUIRE(cap_dns_family_limit(capdns, families, 1) == 0);
690615bf03eSMark Johnston 	families[1] = AF_INET;
691615bf03eSMark Johnston 	ATF_REQUIRE_ERRNO(ENOTCAPABLE,
692615bf03eSMark Johnston 	    cap_dns_family_limit(capdns, families, 2) == -1);
693615bf03eSMark Johnston 	families[0] = AF_INET;
694615bf03eSMark Johnston 	ATF_REQUIRE_ERRNO(ENOTCAPABLE,
695615bf03eSMark Johnston 	    cap_dns_family_limit(capdns, families, 1) == -1);
696d3bfc725SMariusz Zaborski 
697615bf03eSMark Johnston 	runtest(capdns, GETHOSTBYADDR_AF_INET6);
698d3bfc725SMariusz Zaborski 
699d3bfc725SMariusz Zaborski 	cap_close(capdns);
700615bf03eSMark Johnston }
701d3bfc725SMariusz Zaborski 
702615bf03eSMark Johnston ATF_TP_ADD_TCS(tp)
703615bf03eSMark Johnston {
704615bf03eSMark Johnston 	ATF_TP_ADD_TC(tp, dns_no_limits);
705615bf03eSMark Johnston 	ATF_TP_ADD_TC(tp, dns_all_limits);
706615bf03eSMark Johnston 	ATF_TP_ADD_TC(tp, dns_name_limit);
707615bf03eSMark Johnston 	ATF_TP_ADD_TC(tp, dns_addr_limit);
708615bf03eSMark Johnston 	ATF_TP_ADD_TC(tp, dns_inet_limit);
709615bf03eSMark Johnston 	ATF_TP_ADD_TC(tp, dns_inet6_limit);
710615bf03eSMark Johnston 	ATF_TP_ADD_TC(tp, dns_name_inet_limit);
711615bf03eSMark Johnston 	ATF_TP_ADD_TC(tp, dns_name_inet6_limit);
712615bf03eSMark Johnston 	ATF_TP_ADD_TC(tp, dns_addr_inet_limit);
713615bf03eSMark Johnston 	ATF_TP_ADD_TC(tp, dns_addr_inet6_limit);
714d3bfc725SMariusz Zaborski 
715615bf03eSMark Johnston 	return atf_no_error();
716d3bfc725SMariusz Zaborski }
717