xref: /minix3/external/bsd/bind/dist/bin/tests/system/lwresd/lwtest.c (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: lwtest.c,v 1.7 2014/12/10 04:37:54 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek  * Copyright (C) 2004, 2007, 2008, 2012, 2013  Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek  * Copyright (C) 2000-2002  Internet Software Consortium.
6*00b67f09SDavid van Moolenbroek  *
7*00b67f09SDavid van Moolenbroek  * Permission to use, copy, modify, and/or distribute this software for any
8*00b67f09SDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
9*00b67f09SDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
10*00b67f09SDavid van Moolenbroek  *
11*00b67f09SDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
12*00b67f09SDavid van Moolenbroek  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
13*00b67f09SDavid van Moolenbroek  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
14*00b67f09SDavid van Moolenbroek  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15*00b67f09SDavid van Moolenbroek  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
16*00b67f09SDavid van Moolenbroek  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*00b67f09SDavid van Moolenbroek  * PERFORMANCE OF THIS SOFTWARE.
18*00b67f09SDavid van Moolenbroek  */
19*00b67f09SDavid van Moolenbroek 
20*00b67f09SDavid van Moolenbroek /* Id: lwtest.c,v 1.32 2008/04/02 02:37:42 marka Exp  */
21*00b67f09SDavid van Moolenbroek 
22*00b67f09SDavid van Moolenbroek #include <config.h>
23*00b67f09SDavid van Moolenbroek 
24*00b67f09SDavid van Moolenbroek #include <assert.h>
25*00b67f09SDavid van Moolenbroek #include <stdlib.h>
26*00b67f09SDavid van Moolenbroek 
27*00b67f09SDavid van Moolenbroek #include <isc/net.h>
28*00b67f09SDavid van Moolenbroek #include <isc/string.h>
29*00b67f09SDavid van Moolenbroek 
30*00b67f09SDavid van Moolenbroek #include <lwres/lwres.h>
31*00b67f09SDavid van Moolenbroek #include <lwres/netdb.h>
32*00b67f09SDavid van Moolenbroek #include <lwres/net.h>
33*00b67f09SDavid van Moolenbroek 
34*00b67f09SDavid van Moolenbroek /*
35*00b67f09SDavid van Moolenbroek  * XXX getnameinfo errors, which don't appear to be standard.
36*00b67f09SDavid van Moolenbroek  */
37*00b67f09SDavid van Moolenbroek #define ENI_NOSERVNAME  1
38*00b67f09SDavid van Moolenbroek #define ENI_NOHOSTNAME  2
39*00b67f09SDavid van Moolenbroek #define ENI_MEMORY      3
40*00b67f09SDavid van Moolenbroek #define ENI_SYSTEM      4
41*00b67f09SDavid van Moolenbroek #define ENI_FAMILY      5
42*00b67f09SDavid van Moolenbroek #define ENI_SALEN       6
43*00b67f09SDavid van Moolenbroek #define ENI_NOSOCKET    7
44*00b67f09SDavid van Moolenbroek 
45*00b67f09SDavid van Moolenbroek static int fails = 0;
46*00b67f09SDavid van Moolenbroek 
47*00b67f09SDavid van Moolenbroek static void
CHECK(lwres_result_t val,const char * msg)48*00b67f09SDavid van Moolenbroek CHECK(lwres_result_t val, const char *msg) {
49*00b67f09SDavid van Moolenbroek 	if (val != 0) {
50*00b67f09SDavid van Moolenbroek 		printf("I:%s returned %d\n", msg, val);
51*00b67f09SDavid van Moolenbroek 		exit(1);
52*00b67f09SDavid van Moolenbroek 	}
53*00b67f09SDavid van Moolenbroek }
54*00b67f09SDavid van Moolenbroek 
55*00b67f09SDavid van Moolenbroek static unsigned char TESTSTRING[] =
56*00b67f09SDavid van Moolenbroek 	"This is a test.  This is only a test.  !!!";
57*00b67f09SDavid van Moolenbroek 
58*00b67f09SDavid van Moolenbroek static lwres_context_t *ctx;
59*00b67f09SDavid van Moolenbroek 
60*00b67f09SDavid van Moolenbroek static void
test_noop(void)61*00b67f09SDavid van Moolenbroek test_noop(void) {
62*00b67f09SDavid van Moolenbroek 	lwres_result_t ret;
63*00b67f09SDavid van Moolenbroek 	lwres_lwpacket_t pkt, pkt2;
64*00b67f09SDavid van Moolenbroek 	lwres_nooprequest_t nooprequest, *nooprequest2;
65*00b67f09SDavid van Moolenbroek 	lwres_noopresponse_t noopresponse, *noopresponse2;
66*00b67f09SDavid van Moolenbroek 	lwres_buffer_t b;
67*00b67f09SDavid van Moolenbroek 
68*00b67f09SDavid van Moolenbroek 	pkt.pktflags = 0;
69*00b67f09SDavid van Moolenbroek 	pkt.serial = 0x11223344;
70*00b67f09SDavid van Moolenbroek 	pkt.recvlength = 0x55667788;
71*00b67f09SDavid van Moolenbroek 	pkt.result = 0;
72*00b67f09SDavid van Moolenbroek 
73*00b67f09SDavid van Moolenbroek 	nooprequest.datalength = strlen((char *)TESTSTRING);
74*00b67f09SDavid van Moolenbroek 	nooprequest.data = TESTSTRING;
75*00b67f09SDavid van Moolenbroek 	ret = lwres_nooprequest_render(ctx, &nooprequest, &pkt, &b);
76*00b67f09SDavid van Moolenbroek 	CHECK(ret, "lwres_nooprequest_render");
77*00b67f09SDavid van Moolenbroek 
78*00b67f09SDavid van Moolenbroek 	/*
79*00b67f09SDavid van Moolenbroek 	 * Now, parse it into a new structure.
80*00b67f09SDavid van Moolenbroek 	 */
81*00b67f09SDavid van Moolenbroek 	lwres_buffer_first(&b);
82*00b67f09SDavid van Moolenbroek 	ret = lwres_lwpacket_parseheader(&b, &pkt2);
83*00b67f09SDavid van Moolenbroek 	CHECK(ret, "lwres_lwpacket_parseheader");
84*00b67f09SDavid van Moolenbroek 
85*00b67f09SDavid van Moolenbroek 	nooprequest2 = NULL;
86*00b67f09SDavid van Moolenbroek 	ret = lwres_nooprequest_parse(ctx, &b, &pkt2, &nooprequest2);
87*00b67f09SDavid van Moolenbroek 	CHECK(ret, "lwres_nooprequest_parse");
88*00b67f09SDavid van Moolenbroek 
89*00b67f09SDavid van Moolenbroek 	assert(nooprequest.datalength == nooprequest2->datalength);
90*00b67f09SDavid van Moolenbroek 	assert(memcmp(nooprequest.data, nooprequest2->data,
91*00b67f09SDavid van Moolenbroek 		       nooprequest.datalength) == 0);
92*00b67f09SDavid van Moolenbroek 
93*00b67f09SDavid van Moolenbroek 	lwres_nooprequest_free(ctx, &nooprequest2);
94*00b67f09SDavid van Moolenbroek 
95*00b67f09SDavid van Moolenbroek 	lwres_context_freemem(ctx, b.base, b.length);
96*00b67f09SDavid van Moolenbroek 	b.base = NULL;
97*00b67f09SDavid van Moolenbroek 	b.length = 0;
98*00b67f09SDavid van Moolenbroek 
99*00b67f09SDavid van Moolenbroek 	pkt.pktflags = 0;
100*00b67f09SDavid van Moolenbroek 	pkt.serial = 0x11223344;
101*00b67f09SDavid van Moolenbroek 	pkt.recvlength = 0x55667788;
102*00b67f09SDavid van Moolenbroek 	pkt.result = 0xdeadbeef;
103*00b67f09SDavid van Moolenbroek 
104*00b67f09SDavid van Moolenbroek 	noopresponse.datalength = strlen((char *)TESTSTRING);
105*00b67f09SDavid van Moolenbroek 	noopresponse.data = TESTSTRING;
106*00b67f09SDavid van Moolenbroek 	ret = lwres_noopresponse_render(ctx, &noopresponse, &pkt, &b);
107*00b67f09SDavid van Moolenbroek 	CHECK(ret, "lwres_noopresponse_render");
108*00b67f09SDavid van Moolenbroek 
109*00b67f09SDavid van Moolenbroek 	/*
110*00b67f09SDavid van Moolenbroek 	 * Now, parse it into a new structure.
111*00b67f09SDavid van Moolenbroek 	 */
112*00b67f09SDavid van Moolenbroek 	lwres_buffer_first(&b);
113*00b67f09SDavid van Moolenbroek 	ret = lwres_lwpacket_parseheader(&b, &pkt2);
114*00b67f09SDavid van Moolenbroek 	CHECK(ret, "lwres_lwpacket_parseheader");
115*00b67f09SDavid van Moolenbroek 
116*00b67f09SDavid van Moolenbroek 	noopresponse2 = NULL;
117*00b67f09SDavid van Moolenbroek 	ret = lwres_noopresponse_parse(ctx, &b, &pkt2, &noopresponse2);
118*00b67f09SDavid van Moolenbroek 	CHECK(ret, "lwres_noopresponse_parse");
119*00b67f09SDavid van Moolenbroek 
120*00b67f09SDavid van Moolenbroek 	assert(noopresponse.datalength == noopresponse2->datalength);
121*00b67f09SDavid van Moolenbroek 	assert(memcmp(noopresponse.data, noopresponse2->data,
122*00b67f09SDavid van Moolenbroek 		       noopresponse.datalength) == 0);
123*00b67f09SDavid van Moolenbroek 
124*00b67f09SDavid van Moolenbroek 	lwres_noopresponse_free(ctx, &noopresponse2);
125*00b67f09SDavid van Moolenbroek 
126*00b67f09SDavid van Moolenbroek 	lwres_context_freemem(ctx, b.base, b.length);
127*00b67f09SDavid van Moolenbroek 	b.base = NULL;
128*00b67f09SDavid van Moolenbroek 	b.length = 0;
129*00b67f09SDavid van Moolenbroek }
130*00b67f09SDavid van Moolenbroek 
131*00b67f09SDavid van Moolenbroek static void
test_gabn(const char * target,lwres_result_t expected,const char * address,lwres_uint32_t af)132*00b67f09SDavid van Moolenbroek test_gabn(const char *target, lwres_result_t expected, const char *address,
133*00b67f09SDavid van Moolenbroek 	  lwres_uint32_t af)
134*00b67f09SDavid van Moolenbroek {
135*00b67f09SDavid van Moolenbroek 	lwres_gabnresponse_t *res;
136*00b67f09SDavid van Moolenbroek 	unsigned char addrbuf[16];
137*00b67f09SDavid van Moolenbroek 	lwres_addr_t *addr;
138*00b67f09SDavid van Moolenbroek 	char outbuf[64];
139*00b67f09SDavid van Moolenbroek 	unsigned int len;
140*00b67f09SDavid van Moolenbroek 	lwres_result_t ret;
141*00b67f09SDavid van Moolenbroek 
142*00b67f09SDavid van Moolenbroek 	res = NULL;
143*00b67f09SDavid van Moolenbroek 	ret = lwres_getaddrsbyname(ctx, target,
144*00b67f09SDavid van Moolenbroek 				   LWRES_ADDRTYPE_V4 | LWRES_ADDRTYPE_V6,
145*00b67f09SDavid van Moolenbroek 				   &res);
146*00b67f09SDavid van Moolenbroek 	if (ret != expected) {
147*00b67f09SDavid van Moolenbroek 		printf("I:gabn(%s) failed: %d\n", target, ret);
148*00b67f09SDavid van Moolenbroek 		if (res != NULL)
149*00b67f09SDavid van Moolenbroek 			lwres_gabnresponse_free(ctx, &res);
150*00b67f09SDavid van Moolenbroek 		fails++;
151*00b67f09SDavid van Moolenbroek 		return;
152*00b67f09SDavid van Moolenbroek 	}
153*00b67f09SDavid van Moolenbroek 	if (ret == LWRES_R_SUCCESS) {
154*00b67f09SDavid van Moolenbroek 		if (af == LWRES_ADDRTYPE_V4) {
155*00b67f09SDavid van Moolenbroek 			len = 4;
156*00b67f09SDavid van Moolenbroek 			ret = inet_pton(AF_INET, address, addrbuf);
157*00b67f09SDavid van Moolenbroek 			assert(ret == 1);
158*00b67f09SDavid van Moolenbroek 		} else {
159*00b67f09SDavid van Moolenbroek 			len = 16;
160*00b67f09SDavid van Moolenbroek 			ret = inet_pton(AF_INET6, address, addrbuf);
161*00b67f09SDavid van Moolenbroek 			assert(ret == 1);
162*00b67f09SDavid van Moolenbroek 		}
163*00b67f09SDavid van Moolenbroek 		addr = LWRES_LIST_HEAD(res->addrs);
164*00b67f09SDavid van Moolenbroek 		if (addr == NULL) {
165*00b67f09SDavid van Moolenbroek 			printf("I:gabn(%s) returned empty list\n", target);
166*00b67f09SDavid van Moolenbroek 			fails++;
167*00b67f09SDavid van Moolenbroek 			return;
168*00b67f09SDavid van Moolenbroek 		}
169*00b67f09SDavid van Moolenbroek 		while (addr != NULL) {
170*00b67f09SDavid van Moolenbroek 			if (addr->family != af || addr->length != len ||
171*00b67f09SDavid van Moolenbroek 			    memcmp(addr->address, addrbuf, len) == 0)
172*00b67f09SDavid van Moolenbroek 				break;
173*00b67f09SDavid van Moolenbroek 			addr = LWRES_LIST_NEXT(addr, link);
174*00b67f09SDavid van Moolenbroek 		}
175*00b67f09SDavid van Moolenbroek 		if (addr == NULL) {
176*00b67f09SDavid van Moolenbroek 			addr = LWRES_LIST_HEAD(res->addrs);
177*00b67f09SDavid van Moolenbroek 			if (addr->family == LWRES_ADDRTYPE_V4)
178*00b67f09SDavid van Moolenbroek 				(void)inet_ntop(AF_INET, addr->address,
179*00b67f09SDavid van Moolenbroek 						outbuf, sizeof(outbuf));
180*00b67f09SDavid van Moolenbroek 			else
181*00b67f09SDavid van Moolenbroek 				(void)inet_ntop(AF_INET6, addr->address,
182*00b67f09SDavid van Moolenbroek 						outbuf, sizeof(outbuf));
183*00b67f09SDavid van Moolenbroek 			printf("I:gabn(%s) returned %s, expected %s\n",
184*00b67f09SDavid van Moolenbroek 				target, outbuf, address);
185*00b67f09SDavid van Moolenbroek 			fails++;
186*00b67f09SDavid van Moolenbroek 			return;
187*00b67f09SDavid van Moolenbroek 		}
188*00b67f09SDavid van Moolenbroek 	}
189*00b67f09SDavid van Moolenbroek 	if (res != NULL)
190*00b67f09SDavid van Moolenbroek 		lwres_gabnresponse_free(ctx, &res);
191*00b67f09SDavid van Moolenbroek }
192*00b67f09SDavid van Moolenbroek 
193*00b67f09SDavid van Moolenbroek static void
test_gnba(const char * target,lwres_uint32_t af,lwres_result_t expected,const char * name)194*00b67f09SDavid van Moolenbroek test_gnba(const char *target, lwres_uint32_t af, lwres_result_t expected,
195*00b67f09SDavid van Moolenbroek 	  const char *name)
196*00b67f09SDavid van Moolenbroek {
197*00b67f09SDavid van Moolenbroek 	lwres_gnbaresponse_t *res;
198*00b67f09SDavid van Moolenbroek 	lwres_result_t ret;
199*00b67f09SDavid van Moolenbroek 	unsigned char addrbuf[16];
200*00b67f09SDavid van Moolenbroek 	unsigned int len;
201*00b67f09SDavid van Moolenbroek 
202*00b67f09SDavid van Moolenbroek 	if (af == LWRES_ADDRTYPE_V4) {
203*00b67f09SDavid van Moolenbroek 		len = 4;
204*00b67f09SDavid van Moolenbroek 		ret = inet_pton(AF_INET, target, addrbuf);
205*00b67f09SDavid van Moolenbroek 		assert(ret == 1);
206*00b67f09SDavid van Moolenbroek 	} else {
207*00b67f09SDavid van Moolenbroek 		len = 16;
208*00b67f09SDavid van Moolenbroek 		ret = inet_pton(AF_INET6, target, addrbuf);
209*00b67f09SDavid van Moolenbroek 		assert(ret == 1);
210*00b67f09SDavid van Moolenbroek 	}
211*00b67f09SDavid van Moolenbroek 
212*00b67f09SDavid van Moolenbroek 	res = NULL;
213*00b67f09SDavid van Moolenbroek 	ret = lwres_getnamebyaddr(ctx, af, len, addrbuf, &res);
214*00b67f09SDavid van Moolenbroek 	if (ret != expected) {
215*00b67f09SDavid van Moolenbroek 		printf("I:gnba(%s) failed: %d\n", target, ret);
216*00b67f09SDavid van Moolenbroek 		if (res != NULL)
217*00b67f09SDavid van Moolenbroek 			lwres_gnbaresponse_free(ctx, &res);
218*00b67f09SDavid van Moolenbroek 		fails++;
219*00b67f09SDavid van Moolenbroek 		return;
220*00b67f09SDavid van Moolenbroek 	}
221*00b67f09SDavid van Moolenbroek 	if (ret == LWRES_R_SUCCESS && strcasecmp(res->realname, name) != 0) {
222*00b67f09SDavid van Moolenbroek 		 printf("I:gnba(%s) returned %s, expected %s\n",
223*00b67f09SDavid van Moolenbroek 			target, res->realname, name);
224*00b67f09SDavid van Moolenbroek 		 fails++;
225*00b67f09SDavid van Moolenbroek 		 return;
226*00b67f09SDavid van Moolenbroek 	}
227*00b67f09SDavid van Moolenbroek 	if (res != NULL)
228*00b67f09SDavid van Moolenbroek 		lwres_gnbaresponse_free(ctx, &res);
229*00b67f09SDavid van Moolenbroek }
230*00b67f09SDavid van Moolenbroek 
231*00b67f09SDavid van Moolenbroek static void
test_gethostbyname(const char * name,const char * address)232*00b67f09SDavid van Moolenbroek test_gethostbyname(const char *name, const char *address) {
233*00b67f09SDavid van Moolenbroek 	struct hostent *hp;
234*00b67f09SDavid van Moolenbroek 	unsigned char addrbuf[16];
235*00b67f09SDavid van Moolenbroek 	int ret;
236*00b67f09SDavid van Moolenbroek 
237*00b67f09SDavid van Moolenbroek 	hp = gethostbyname(name);
238*00b67f09SDavid van Moolenbroek 	if (hp == NULL) {
239*00b67f09SDavid van Moolenbroek 		if (address == NULL && h_errno == HOST_NOT_FOUND)
240*00b67f09SDavid van Moolenbroek 			return;
241*00b67f09SDavid van Moolenbroek 		else if (h_errno != HOST_NOT_FOUND) {
242*00b67f09SDavid van Moolenbroek 			printf("I:gethostbyname(%s) failed: %s\n",
243*00b67f09SDavid van Moolenbroek 			       name, hstrerror(h_errno));
244*00b67f09SDavid van Moolenbroek 			fails++;
245*00b67f09SDavid van Moolenbroek 			return;
246*00b67f09SDavid van Moolenbroek 		} else {
247*00b67f09SDavid van Moolenbroek 			printf("I:gethostbyname(%s) returned not found\n",
248*00b67f09SDavid van Moolenbroek 			       name);
249*00b67f09SDavid van Moolenbroek 			fails++;
250*00b67f09SDavid van Moolenbroek 			return;
251*00b67f09SDavid van Moolenbroek 		}
252*00b67f09SDavid van Moolenbroek 	} else {
253*00b67f09SDavid van Moolenbroek 		ret = inet_pton(AF_INET, address, addrbuf);
254*00b67f09SDavid van Moolenbroek 		assert(ret == 1);
255*00b67f09SDavid van Moolenbroek 		if (memcmp(hp->h_addr_list[0], addrbuf, hp->h_length) != 0) {
256*00b67f09SDavid van Moolenbroek 			char outbuf[16];
257*00b67f09SDavid van Moolenbroek 			(void)inet_ntop(AF_INET, hp->h_addr_list[0],
258*00b67f09SDavid van Moolenbroek 					outbuf, sizeof(outbuf));
259*00b67f09SDavid van Moolenbroek 			printf("I:gethostbyname(%s) returned %s, "
260*00b67f09SDavid van Moolenbroek 			       "expected %s\n", name, outbuf, address);
261*00b67f09SDavid van Moolenbroek 			fails++;
262*00b67f09SDavid van Moolenbroek 			return;
263*00b67f09SDavid van Moolenbroek 		}
264*00b67f09SDavid van Moolenbroek 	}
265*00b67f09SDavid van Moolenbroek }
266*00b67f09SDavid van Moolenbroek 
267*00b67f09SDavid van Moolenbroek static void
test_gethostbyname2(const char * name,const char * address,int af)268*00b67f09SDavid van Moolenbroek test_gethostbyname2(const char *name, const char *address, int af) {
269*00b67f09SDavid van Moolenbroek 	struct hostent *hp;
270*00b67f09SDavid van Moolenbroek 	unsigned char addrbuf[16];
271*00b67f09SDavid van Moolenbroek 	int len, ret;
272*00b67f09SDavid van Moolenbroek 
273*00b67f09SDavid van Moolenbroek 	hp = gethostbyname2(name, af);
274*00b67f09SDavid van Moolenbroek 	if (hp == NULL) {
275*00b67f09SDavid van Moolenbroek 		if (address == NULL && h_errno == HOST_NOT_FOUND)
276*00b67f09SDavid van Moolenbroek 			return;
277*00b67f09SDavid van Moolenbroek 		else if (h_errno != HOST_NOT_FOUND) {
278*00b67f09SDavid van Moolenbroek 			printf("I:gethostbyname(%s) failed: %s\n",
279*00b67f09SDavid van Moolenbroek 			       name, hstrerror(h_errno));
280*00b67f09SDavid van Moolenbroek 			fails++;
281*00b67f09SDavid van Moolenbroek 			return;
282*00b67f09SDavid van Moolenbroek 		} else {
283*00b67f09SDavid van Moolenbroek 			printf("I:gethostbyname(%s) returned not found\n",
284*00b67f09SDavid van Moolenbroek 			       name);
285*00b67f09SDavid van Moolenbroek 			fails++;
286*00b67f09SDavid van Moolenbroek 			return;
287*00b67f09SDavid van Moolenbroek 		}
288*00b67f09SDavid van Moolenbroek 	} else {
289*00b67f09SDavid van Moolenbroek 		if (af == AF_INET)
290*00b67f09SDavid van Moolenbroek 			len = 4;
291*00b67f09SDavid van Moolenbroek 		else
292*00b67f09SDavid van Moolenbroek 			len = 16;
293*00b67f09SDavid van Moolenbroek 		ret = inet_pton(af, address, addrbuf);
294*00b67f09SDavid van Moolenbroek 		assert(ret == 1);
295*00b67f09SDavid van Moolenbroek 		if (hp->h_addrtype != af) {
296*00b67f09SDavid van Moolenbroek 			printf("I:gethostbyname(%s) returned wrong family\n",
297*00b67f09SDavid van Moolenbroek 			       name);
298*00b67f09SDavid van Moolenbroek 			fails++;
299*00b67f09SDavid van Moolenbroek 			return;
300*00b67f09SDavid van Moolenbroek 		}
301*00b67f09SDavid van Moolenbroek 		if (len != (int)hp->h_length ||
302*00b67f09SDavid van Moolenbroek 		    memcmp(hp->h_addr_list[0], addrbuf, hp->h_length) != 0)
303*00b67f09SDavid van Moolenbroek 		{
304*00b67f09SDavid van Moolenbroek 			char outbuf[16];
305*00b67f09SDavid van Moolenbroek 			(void)inet_ntop(af, hp->h_addr_list[0],
306*00b67f09SDavid van Moolenbroek 					outbuf, sizeof(outbuf));
307*00b67f09SDavid van Moolenbroek 			printf("I:gethostbyname(%s) returned %s, "
308*00b67f09SDavid van Moolenbroek 			       "expected %s\n", name, outbuf, address);
309*00b67f09SDavid van Moolenbroek 			fails++;
310*00b67f09SDavid van Moolenbroek 			return;
311*00b67f09SDavid van Moolenbroek 		}
312*00b67f09SDavid van Moolenbroek 	}
313*00b67f09SDavid van Moolenbroek }
314*00b67f09SDavid van Moolenbroek 
315*00b67f09SDavid van Moolenbroek static void
test_getipnodebyname(const char * name,const char * address,int af,int v4map,int all)316*00b67f09SDavid van Moolenbroek test_getipnodebyname(const char *name, const char *address, int af,
317*00b67f09SDavid van Moolenbroek 		     int v4map, int all)
318*00b67f09SDavid van Moolenbroek {
319*00b67f09SDavid van Moolenbroek 	struct hostent *hp;
320*00b67f09SDavid van Moolenbroek 	unsigned char addrbuf[16];
321*00b67f09SDavid van Moolenbroek 	int len, ret;
322*00b67f09SDavid van Moolenbroek 	int error_num;
323*00b67f09SDavid van Moolenbroek 	int flags = 0;
324*00b67f09SDavid van Moolenbroek 
325*00b67f09SDavid van Moolenbroek 	if (v4map)
326*00b67f09SDavid van Moolenbroek 		flags |= AI_V4MAPPED;
327*00b67f09SDavid van Moolenbroek 	if (all)
328*00b67f09SDavid van Moolenbroek 		flags |= AI_ALL;
329*00b67f09SDavid van Moolenbroek 
330*00b67f09SDavid van Moolenbroek 	hp = getipnodebyname(name, af, flags, &error_num);
331*00b67f09SDavid van Moolenbroek 	if (hp == NULL) {
332*00b67f09SDavid van Moolenbroek 		if (address == NULL && error_num == HOST_NOT_FOUND)
333*00b67f09SDavid van Moolenbroek 			return;
334*00b67f09SDavid van Moolenbroek 		else if (error_num != HOST_NOT_FOUND) {
335*00b67f09SDavid van Moolenbroek 			printf("I:getipnodebyname(%s) failed: %d\n",
336*00b67f09SDavid van Moolenbroek 			       name, error_num);
337*00b67f09SDavid van Moolenbroek 			fails++;
338*00b67f09SDavid van Moolenbroek 			return;
339*00b67f09SDavid van Moolenbroek 		} else {
340*00b67f09SDavid van Moolenbroek 			printf("I:getipnodebyname(%s) returned not found\n",
341*00b67f09SDavid van Moolenbroek 			       name);
342*00b67f09SDavid van Moolenbroek 			fails++;
343*00b67f09SDavid van Moolenbroek 			return;
344*00b67f09SDavid van Moolenbroek 		}
345*00b67f09SDavid van Moolenbroek 	} else {
346*00b67f09SDavid van Moolenbroek 		if (af == AF_INET)
347*00b67f09SDavid van Moolenbroek 			len = 4;
348*00b67f09SDavid van Moolenbroek 		else
349*00b67f09SDavid van Moolenbroek 			len = 16;
350*00b67f09SDavid van Moolenbroek 		ret = inet_pton(af, address, addrbuf);
351*00b67f09SDavid van Moolenbroek 		assert(ret == 1);
352*00b67f09SDavid van Moolenbroek 		if (hp->h_addrtype != af) {
353*00b67f09SDavid van Moolenbroek 			printf("I:getipnodebyname(%s) returned wrong family\n",
354*00b67f09SDavid van Moolenbroek 			       name);
355*00b67f09SDavid van Moolenbroek 			freehostent(hp);
356*00b67f09SDavid van Moolenbroek 			fails++;
357*00b67f09SDavid van Moolenbroek 			return;
358*00b67f09SDavid van Moolenbroek 		}
359*00b67f09SDavid van Moolenbroek 		if (len != (int)hp->h_length ||
360*00b67f09SDavid van Moolenbroek 		    memcmp(hp->h_addr_list[0], addrbuf, hp->h_length) != 0)
361*00b67f09SDavid van Moolenbroek 		{
362*00b67f09SDavid van Moolenbroek 			char outbuf[16];
363*00b67f09SDavid van Moolenbroek 			(void)inet_ntop(af, hp->h_addr_list[0],
364*00b67f09SDavid van Moolenbroek 					outbuf, sizeof(outbuf));
365*00b67f09SDavid van Moolenbroek 			printf("I:getipnodebyname(%s) returned %s, "
366*00b67f09SDavid van Moolenbroek 			       "expected %s\n", name, outbuf, address);
367*00b67f09SDavid van Moolenbroek 			freehostent(hp);
368*00b67f09SDavid van Moolenbroek 			fails++;
369*00b67f09SDavid van Moolenbroek 			return;
370*00b67f09SDavid van Moolenbroek 		}
371*00b67f09SDavid van Moolenbroek 		freehostent(hp);
372*00b67f09SDavid van Moolenbroek 	}
373*00b67f09SDavid van Moolenbroek }
374*00b67f09SDavid van Moolenbroek 
375*00b67f09SDavid van Moolenbroek static void
test_gethostbyaddr(const char * address,int af,const char * name)376*00b67f09SDavid van Moolenbroek test_gethostbyaddr(const char *address, int af, const char *name) {
377*00b67f09SDavid van Moolenbroek 	struct hostent *hp;
378*00b67f09SDavid van Moolenbroek 	char addrbuf[16];
379*00b67f09SDavid van Moolenbroek 	int len, ret;
380*00b67f09SDavid van Moolenbroek 
381*00b67f09SDavid van Moolenbroek 	if (af == AF_INET)
382*00b67f09SDavid van Moolenbroek 		len = 4;
383*00b67f09SDavid van Moolenbroek 	else
384*00b67f09SDavid van Moolenbroek 		len = 16;
385*00b67f09SDavid van Moolenbroek 	ret = inet_pton(af, address, addrbuf);
386*00b67f09SDavid van Moolenbroek 	assert(ret == 1);
387*00b67f09SDavid van Moolenbroek 
388*00b67f09SDavid van Moolenbroek 	hp = gethostbyaddr(addrbuf, len, af);
389*00b67f09SDavid van Moolenbroek 
390*00b67f09SDavid van Moolenbroek 	if (hp == NULL) {
391*00b67f09SDavid van Moolenbroek 		if (name == NULL && h_errno == HOST_NOT_FOUND)
392*00b67f09SDavid van Moolenbroek 			return;
393*00b67f09SDavid van Moolenbroek 		else if (h_errno != HOST_NOT_FOUND) {
394*00b67f09SDavid van Moolenbroek 			printf("I:gethostbyaddr(%s) failed: %s\n",
395*00b67f09SDavid van Moolenbroek 			       address, hstrerror(h_errno));
396*00b67f09SDavid van Moolenbroek 			fails++;
397*00b67f09SDavid van Moolenbroek 			return;
398*00b67f09SDavid van Moolenbroek 		} else {
399*00b67f09SDavid van Moolenbroek 			printf("I:gethostbyaddr(%s) returned not found\n",
400*00b67f09SDavid van Moolenbroek 			       address);
401*00b67f09SDavid van Moolenbroek 			fails++;
402*00b67f09SDavid van Moolenbroek 			return;
403*00b67f09SDavid van Moolenbroek 		}
404*00b67f09SDavid van Moolenbroek 	} else {
405*00b67f09SDavid van Moolenbroek 		if (name != NULL && strcmp(hp->h_name, name) != 0) {
406*00b67f09SDavid van Moolenbroek 			printf("I:gethostbyname(%s) returned %s, "
407*00b67f09SDavid van Moolenbroek 			       "expected %s\n", address, hp->h_name, name);
408*00b67f09SDavid van Moolenbroek 			fails++;
409*00b67f09SDavid van Moolenbroek 			return;
410*00b67f09SDavid van Moolenbroek 		}
411*00b67f09SDavid van Moolenbroek 	}
412*00b67f09SDavid van Moolenbroek }
413*00b67f09SDavid van Moolenbroek 
414*00b67f09SDavid van Moolenbroek static void
test_getipnodebyaddr(const char * address,int af,const char * name)415*00b67f09SDavid van Moolenbroek test_getipnodebyaddr(const char *address, int af, const char *name) {
416*00b67f09SDavid van Moolenbroek 	struct hostent *hp;
417*00b67f09SDavid van Moolenbroek 	char addrbuf[16];
418*00b67f09SDavid van Moolenbroek 	int len, ret;
419*00b67f09SDavid van Moolenbroek 	int error_num;
420*00b67f09SDavid van Moolenbroek 
421*00b67f09SDavid van Moolenbroek 	if (af == AF_INET)
422*00b67f09SDavid van Moolenbroek 		len = 4;
423*00b67f09SDavid van Moolenbroek 	else
424*00b67f09SDavid van Moolenbroek 		len = 16;
425*00b67f09SDavid van Moolenbroek 	ret = inet_pton(af, address, addrbuf);
426*00b67f09SDavid van Moolenbroek 	assert(ret == 1);
427*00b67f09SDavid van Moolenbroek 
428*00b67f09SDavid van Moolenbroek 	hp = getipnodebyaddr(addrbuf, len, af, &error_num);
429*00b67f09SDavid van Moolenbroek 
430*00b67f09SDavid van Moolenbroek 	if (hp == NULL) {
431*00b67f09SDavid van Moolenbroek 		if (name == NULL && error_num == HOST_NOT_FOUND)
432*00b67f09SDavid van Moolenbroek 			return;
433*00b67f09SDavid van Moolenbroek 		else if (error_num != HOST_NOT_FOUND) {
434*00b67f09SDavid van Moolenbroek 			printf("I:getipnodebyaddr(%s) failed: %d\n",
435*00b67f09SDavid van Moolenbroek 			       address, error_num);
436*00b67f09SDavid van Moolenbroek 			fails++;
437*00b67f09SDavid van Moolenbroek 			return;
438*00b67f09SDavid van Moolenbroek 		} else {
439*00b67f09SDavid van Moolenbroek 			printf("I:getipnodebyaddr(%s) returned not found\n",
440*00b67f09SDavid van Moolenbroek 			       address);
441*00b67f09SDavid van Moolenbroek 			fails++;
442*00b67f09SDavid van Moolenbroek 			return;
443*00b67f09SDavid van Moolenbroek 		}
444*00b67f09SDavid van Moolenbroek 	} else {
445*00b67f09SDavid van Moolenbroek 		if (name != NULL && strcmp(hp->h_name, name) != 0) {
446*00b67f09SDavid van Moolenbroek 			printf("I:getipnodebyaddr(%s) returned %s, "
447*00b67f09SDavid van Moolenbroek 			       "expected %s\n", address, hp->h_name, name);
448*00b67f09SDavid van Moolenbroek 			freehostent(hp);
449*00b67f09SDavid van Moolenbroek 			fails++;
450*00b67f09SDavid van Moolenbroek 			return;
451*00b67f09SDavid van Moolenbroek 		}
452*00b67f09SDavid van Moolenbroek 		freehostent(hp);
453*00b67f09SDavid van Moolenbroek 	}
454*00b67f09SDavid van Moolenbroek }
455*00b67f09SDavid van Moolenbroek 
456*00b67f09SDavid van Moolenbroek static void
test_getaddrinfo(const char * name,int af,int v4ok,int v6ok,const char * address)457*00b67f09SDavid van Moolenbroek test_getaddrinfo(const char *name, int af, int v4ok, int v6ok,
458*00b67f09SDavid van Moolenbroek 		   const char *address)
459*00b67f09SDavid van Moolenbroek {
460*00b67f09SDavid van Moolenbroek 	unsigned int len;
461*00b67f09SDavid van Moolenbroek 	int ret;
462*00b67f09SDavid van Moolenbroek 	struct addrinfo *ai;
463*00b67f09SDavid van Moolenbroek 	struct addrinfo hint;
464*00b67f09SDavid van Moolenbroek 	unsigned char addrbuf[16];
465*00b67f09SDavid van Moolenbroek 
466*00b67f09SDavid van Moolenbroek 	if (v4ok == 1 && v6ok== 1) {
467*00b67f09SDavid van Moolenbroek 		ret = getaddrinfo(name, NULL, NULL, &ai);
468*00b67f09SDavid van Moolenbroek 	} else {
469*00b67f09SDavid van Moolenbroek 		memset(&hint, 0, sizeof(hint));
470*00b67f09SDavid van Moolenbroek 		if (v4ok)
471*00b67f09SDavid van Moolenbroek 			hint.ai_family = AF_INET;
472*00b67f09SDavid van Moolenbroek 		else
473*00b67f09SDavid van Moolenbroek 			hint.ai_family = AF_INET6;
474*00b67f09SDavid van Moolenbroek 		ret = getaddrinfo(name, NULL, &hint, &ai);
475*00b67f09SDavid van Moolenbroek 	}
476*00b67f09SDavid van Moolenbroek 	if (ret != 0) {
477*00b67f09SDavid van Moolenbroek 		if (address == NULL && ret == EAI_NODATA)
478*00b67f09SDavid van Moolenbroek 			return;
479*00b67f09SDavid van Moolenbroek 		else if (ret != EAI_NODATA) {
480*00b67f09SDavid van Moolenbroek 			printf("I:getaddrinfo(%s,%d,%d) failed: %s\n",
481*00b67f09SDavid van Moolenbroek 			       name, v4ok, v6ok, gai_strerror(ret));
482*00b67f09SDavid van Moolenbroek 			fails++;
483*00b67f09SDavid van Moolenbroek 			return;
484*00b67f09SDavid van Moolenbroek 		} else {
485*00b67f09SDavid van Moolenbroek 			printf("I:getaddrinfo(%s,%d,%d) returned not found\n",
486*00b67f09SDavid van Moolenbroek 			       name, v4ok, v6ok);
487*00b67f09SDavid van Moolenbroek 			fails++;
488*00b67f09SDavid van Moolenbroek 			return;
489*00b67f09SDavid van Moolenbroek 		}
490*00b67f09SDavid van Moolenbroek 	} else {
491*00b67f09SDavid van Moolenbroek 		if (af == AF_INET)
492*00b67f09SDavid van Moolenbroek 			len = sizeof(struct sockaddr_in);
493*00b67f09SDavid van Moolenbroek 		else
494*00b67f09SDavid van Moolenbroek 			len = sizeof(struct sockaddr_in6);
495*00b67f09SDavid van Moolenbroek 		ret = inet_pton(af, address, addrbuf);
496*00b67f09SDavid van Moolenbroek 		assert(ret == 1);
497*00b67f09SDavid van Moolenbroek 		if (ai->ai_family != af) {
498*00b67f09SDavid van Moolenbroek 			printf("I:getaddrinfo(%s) returned wrong family\n",
499*00b67f09SDavid van Moolenbroek 			       name);
500*00b67f09SDavid van Moolenbroek 			fails++;
501*00b67f09SDavid van Moolenbroek 			freeaddrinfo(ai);
502*00b67f09SDavid van Moolenbroek 			return;
503*00b67f09SDavid van Moolenbroek 		}
504*00b67f09SDavid van Moolenbroek 		if (len != (unsigned int) ai->ai_addrlen) {
505*00b67f09SDavid van Moolenbroek 			char outbuf[16];
506*00b67f09SDavid van Moolenbroek 			(void)inet_ntop(af, ai->ai_addr,
507*00b67f09SDavid van Moolenbroek 					outbuf, sizeof(outbuf));
508*00b67f09SDavid van Moolenbroek 			printf("I:getaddrinfo(%s) returned %lub, "
509*00b67f09SDavid van Moolenbroek 			       "expected %ub\n", name,
510*00b67f09SDavid van Moolenbroek 				(unsigned long)ai->ai_addrlen, len);
511*00b67f09SDavid van Moolenbroek 			fails++;
512*00b67f09SDavid van Moolenbroek 			freeaddrinfo(ai);
513*00b67f09SDavid van Moolenbroek 			return;
514*00b67f09SDavid van Moolenbroek 		} else if (af == AF_INET) {
515*00b67f09SDavid van Moolenbroek 			struct sockaddr_in *sin;
516*00b67f09SDavid van Moolenbroek 			sin = (struct sockaddr_in *) ai->ai_addr;
517*00b67f09SDavid van Moolenbroek 			if (memcmp(&sin->sin_addr.s_addr, addrbuf, 4) != 0) {
518*00b67f09SDavid van Moolenbroek 				char outbuf[16];
519*00b67f09SDavid van Moolenbroek 				(void)inet_ntop(af, &sin->sin_addr.s_addr,
520*00b67f09SDavid van Moolenbroek 						outbuf, sizeof(outbuf));
521*00b67f09SDavid van Moolenbroek 				printf("I:getaddrinfo(%s) returned %s, "
522*00b67f09SDavid van Moolenbroek 				       "expected %s\n", name, outbuf, address);
523*00b67f09SDavid van Moolenbroek 				fails++;
524*00b67f09SDavid van Moolenbroek 				freeaddrinfo(ai);
525*00b67f09SDavid van Moolenbroek 				return;
526*00b67f09SDavid van Moolenbroek 			}
527*00b67f09SDavid van Moolenbroek 		} else {
528*00b67f09SDavid van Moolenbroek 			struct sockaddr_in6 *sin6;
529*00b67f09SDavid van Moolenbroek 			sin6 = (struct sockaddr_in6 *) ai->ai_addr;
530*00b67f09SDavid van Moolenbroek 			if (memcmp(sin6->sin6_addr.s6_addr, addrbuf, 16) != 0)
531*00b67f09SDavid van Moolenbroek 			{
532*00b67f09SDavid van Moolenbroek 				char outbuf[16];
533*00b67f09SDavid van Moolenbroek 				(void)inet_ntop(af, &sin6->sin6_addr.s6_addr,
534*00b67f09SDavid van Moolenbroek 						outbuf, sizeof(outbuf));
535*00b67f09SDavid van Moolenbroek 				printf("I:getaddrinfo(%s) returned %s, "
536*00b67f09SDavid van Moolenbroek 				       "expected %s\n", name, outbuf, address);
537*00b67f09SDavid van Moolenbroek 				fails++;
538*00b67f09SDavid van Moolenbroek 				freeaddrinfo(ai);
539*00b67f09SDavid van Moolenbroek 				return;
540*00b67f09SDavid van Moolenbroek 			}
541*00b67f09SDavid van Moolenbroek 		}
542*00b67f09SDavid van Moolenbroek 		freeaddrinfo(ai);
543*00b67f09SDavid van Moolenbroek 	}
544*00b67f09SDavid van Moolenbroek }
545*00b67f09SDavid van Moolenbroek 
546*00b67f09SDavid van Moolenbroek static void
test_getnameinfo(const char * address,int af,const char * name)547*00b67f09SDavid van Moolenbroek test_getnameinfo(const char *address, int af, const char *name) {
548*00b67f09SDavid van Moolenbroek 	int ret;
549*00b67f09SDavid van Moolenbroek 	struct sockaddr_in sin;
550*00b67f09SDavid van Moolenbroek 	struct sockaddr_in6 sin6;
551*00b67f09SDavid van Moolenbroek 	struct sockaddr *sa;
552*00b67f09SDavid van Moolenbroek 	int salen;
553*00b67f09SDavid van Moolenbroek 	char host[1025];
554*00b67f09SDavid van Moolenbroek 
555*00b67f09SDavid van Moolenbroek 	if (af == AF_INET) {
556*00b67f09SDavid van Moolenbroek 		memset(&sin, 0, sizeof(sin));
557*00b67f09SDavid van Moolenbroek 		ret = inet_pton(AF_INET, address, &sin.sin_addr.s_addr);
558*00b67f09SDavid van Moolenbroek 		assert(ret == 1);
559*00b67f09SDavid van Moolenbroek 		sin.sin_family = AF_INET;
560*00b67f09SDavid van Moolenbroek #ifdef LWRES_PLATFORM_HAVESALEN
561*00b67f09SDavid van Moolenbroek 		sin.sin_len = sizeof(sin);
562*00b67f09SDavid van Moolenbroek #endif
563*00b67f09SDavid van Moolenbroek 		sa = (struct sockaddr *) &sin;
564*00b67f09SDavid van Moolenbroek 		salen = sizeof(sin);
565*00b67f09SDavid van Moolenbroek 	} else {
566*00b67f09SDavid van Moolenbroek 		memset(&sin6, 0, sizeof(sin6));
567*00b67f09SDavid van Moolenbroek 		ret = inet_pton(AF_INET6, address, sin6.sin6_addr.s6_addr);
568*00b67f09SDavid van Moolenbroek 		assert(ret == 1);
569*00b67f09SDavid van Moolenbroek 		sin6.sin6_family = AF_INET6;
570*00b67f09SDavid van Moolenbroek #ifdef LWRES_PLATFORM_HAVESALEN
571*00b67f09SDavid van Moolenbroek 		sin6.sin6_len = sizeof(sin6);
572*00b67f09SDavid van Moolenbroek #endif
573*00b67f09SDavid van Moolenbroek 		sa = (struct sockaddr *) &sin6;
574*00b67f09SDavid van Moolenbroek 		salen = sizeof(sin6);
575*00b67f09SDavid van Moolenbroek 	}
576*00b67f09SDavid van Moolenbroek 	sa->sa_family = af;
577*00b67f09SDavid van Moolenbroek 
578*00b67f09SDavid van Moolenbroek 	ret = getnameinfo(sa, salen, host, sizeof(host), NULL, 0, NI_NAMEREQD);
579*00b67f09SDavid van Moolenbroek 
580*00b67f09SDavid van Moolenbroek 	if (ret != 0) {
581*00b67f09SDavid van Moolenbroek 		if (name == NULL && ret == ENI_NOHOSTNAME)
582*00b67f09SDavid van Moolenbroek 			return;
583*00b67f09SDavid van Moolenbroek 		else if (ret != ENI_NOHOSTNAME) {
584*00b67f09SDavid van Moolenbroek 			printf("I:getnameinfo(%s) failed: %d\n",
585*00b67f09SDavid van Moolenbroek 			       address, ret);
586*00b67f09SDavid van Moolenbroek 			fails++;
587*00b67f09SDavid van Moolenbroek 			return;
588*00b67f09SDavid van Moolenbroek 		} else {
589*00b67f09SDavid van Moolenbroek 			printf("I:getnameinfo(%s) returned not found\n",
590*00b67f09SDavid van Moolenbroek 			       address);
591*00b67f09SDavid van Moolenbroek 			fails++;
592*00b67f09SDavid van Moolenbroek 			return;
593*00b67f09SDavid van Moolenbroek 		}
594*00b67f09SDavid van Moolenbroek 	} else {
595*00b67f09SDavid van Moolenbroek 		if (name == NULL) {
596*00b67f09SDavid van Moolenbroek 			printf("I:getnameinfo(%s) returned %s, "
597*00b67f09SDavid van Moolenbroek 			       "expected NULL\n", address, host);
598*00b67f09SDavid van Moolenbroek 			fails++;
599*00b67f09SDavid van Moolenbroek 			return;
600*00b67f09SDavid van Moolenbroek 		} else if (strcmp(host, name) != 0) {
601*00b67f09SDavid van Moolenbroek 			printf("I:getnameinfo(%s) returned %s, expected %s\n",
602*00b67f09SDavid van Moolenbroek 			       address, host, name);
603*00b67f09SDavid van Moolenbroek 			fails++;
604*00b67f09SDavid van Moolenbroek 			return;
605*00b67f09SDavid van Moolenbroek 		}
606*00b67f09SDavid van Moolenbroek 	}
607*00b67f09SDavid van Moolenbroek }
608*00b67f09SDavid van Moolenbroek 
609*00b67f09SDavid van Moolenbroek static void
test_getrrsetbyname(const char * name,int rdclass,int rdtype,unsigned int nrdatas,unsigned int nsigs,int should_pass)610*00b67f09SDavid van Moolenbroek test_getrrsetbyname(const char *name, int rdclass, int rdtype,
611*00b67f09SDavid van Moolenbroek 		    unsigned int nrdatas, unsigned int nsigs,
612*00b67f09SDavid van Moolenbroek 		    int should_pass)
613*00b67f09SDavid van Moolenbroek {
614*00b67f09SDavid van Moolenbroek 	int ret;
615*00b67f09SDavid van Moolenbroek 	struct rrsetinfo *rrinfo = NULL;
616*00b67f09SDavid van Moolenbroek 	ret = getrrsetbyname(name, rdclass, rdtype, 0, &rrinfo);
617*00b67f09SDavid van Moolenbroek 	if (ret != 0 && should_pass == 1) {
618*00b67f09SDavid van Moolenbroek 		printf("I:getrrsetbyname(%s, %d) failed\n", name, rdtype);
619*00b67f09SDavid van Moolenbroek 		fails++;
620*00b67f09SDavid van Moolenbroek 		return;
621*00b67f09SDavid van Moolenbroek 	} else if (ret == 0 && should_pass == 0) {
622*00b67f09SDavid van Moolenbroek 		printf("I:getrrsetbyname(%s, %d) unexpectedly succeeded\n",
623*00b67f09SDavid van Moolenbroek 			name, rdtype);
624*00b67f09SDavid van Moolenbroek 		fails++;
625*00b67f09SDavid van Moolenbroek 		freerrset(rrinfo);
626*00b67f09SDavid van Moolenbroek 		return;
627*00b67f09SDavid van Moolenbroek 	} else if (ret != 0)
628*00b67f09SDavid van Moolenbroek 		return;
629*00b67f09SDavid van Moolenbroek 	if (rrinfo->rri_nrdatas != nrdatas) {
630*00b67f09SDavid van Moolenbroek 		printf("I:getrrsetbyname(%s, %d): got %d rr, expected %d\n",
631*00b67f09SDavid van Moolenbroek 			name, rdtype, rrinfo->rri_nrdatas, nrdatas);
632*00b67f09SDavid van Moolenbroek 		fails++;
633*00b67f09SDavid van Moolenbroek 	}
634*00b67f09SDavid van Moolenbroek 	if (rrinfo->rri_nsigs != nsigs) {
635*00b67f09SDavid van Moolenbroek 		printf("I:getrrsetbyname(%s, %d): got %d sig, expected %d\n",
636*00b67f09SDavid van Moolenbroek 			name, rdtype, rrinfo->rri_nsigs, nsigs);
637*00b67f09SDavid van Moolenbroek 		fails++;
638*00b67f09SDavid van Moolenbroek 	}
639*00b67f09SDavid van Moolenbroek 	freerrset(rrinfo);
640*00b67f09SDavid van Moolenbroek 	return;
641*00b67f09SDavid van Moolenbroek }
642*00b67f09SDavid van Moolenbroek 
643*00b67f09SDavid van Moolenbroek int
main(void)644*00b67f09SDavid van Moolenbroek main(void) {
645*00b67f09SDavid van Moolenbroek 	lwres_result_t ret;
646*00b67f09SDavid van Moolenbroek 
647*00b67f09SDavid van Moolenbroek 	lwres_udp_port = 9210;
648*00b67f09SDavid van Moolenbroek 	lwres_resolv_conf = "resolv.conf";
649*00b67f09SDavid van Moolenbroek 
650*00b67f09SDavid van Moolenbroek 	ret = lwres_context_create(&ctx, NULL, NULL, NULL, 0);
651*00b67f09SDavid van Moolenbroek 	CHECK(ret, "lwres_context_create");
652*00b67f09SDavid van Moolenbroek 
653*00b67f09SDavid van Moolenbroek 	ret = lwres_conf_parse(ctx, "resolv.conf");
654*00b67f09SDavid van Moolenbroek 	CHECK(ret, "lwres_conf_parse");
655*00b67f09SDavid van Moolenbroek 
656*00b67f09SDavid van Moolenbroek 	test_noop();
657*00b67f09SDavid van Moolenbroek 
658*00b67f09SDavid van Moolenbroek 	test_gabn("a.example1", LWRES_R_SUCCESS, "10.0.1.1",
659*00b67f09SDavid van Moolenbroek 		  LWRES_ADDRTYPE_V4);
660*00b67f09SDavid van Moolenbroek 	test_gabn("a.example1.", LWRES_R_SUCCESS, "10.0.1.1",
661*00b67f09SDavid van Moolenbroek 		  LWRES_ADDRTYPE_V4);
662*00b67f09SDavid van Moolenbroek 	test_gabn("a.example2", LWRES_R_SUCCESS, "10.0.2.1",
663*00b67f09SDavid van Moolenbroek 		  LWRES_ADDRTYPE_V4);
664*00b67f09SDavid van Moolenbroek 	test_gabn("a.example2.", LWRES_R_SUCCESS, "10.0.2.1",
665*00b67f09SDavid van Moolenbroek 		  LWRES_ADDRTYPE_V4);
666*00b67f09SDavid van Moolenbroek 	test_gabn("a.example3", LWRES_R_NOTFOUND, NULL, LWRES_ADDRTYPE_V4);
667*00b67f09SDavid van Moolenbroek 	test_gabn("a.example3.", LWRES_R_NOTFOUND, NULL, LWRES_ADDRTYPE_V4);
668*00b67f09SDavid van Moolenbroek 	test_gabn("a", LWRES_R_SUCCESS, "10.0.1.1", LWRES_ADDRTYPE_V4);
669*00b67f09SDavid van Moolenbroek 	test_gabn("a.", LWRES_R_NOTFOUND, NULL, LWRES_ADDRTYPE_V4);
670*00b67f09SDavid van Moolenbroek 
671*00b67f09SDavid van Moolenbroek 	test_gabn("a2", LWRES_R_SUCCESS, "10.0.1.1", LWRES_ADDRTYPE_V4);
672*00b67f09SDavid van Moolenbroek 	test_gabn("a3", LWRES_R_NOTFOUND, NULL, LWRES_ADDRTYPE_V4);
673*00b67f09SDavid van Moolenbroek 
674*00b67f09SDavid van Moolenbroek 	test_gabn("b.example1", LWRES_R_SUCCESS,
675*00b67f09SDavid van Moolenbroek 		  "eeee:eeee:eeee:eeee:ffff:ffff:ffff:ffff",
676*00b67f09SDavid van Moolenbroek 		  LWRES_ADDRTYPE_V6);
677*00b67f09SDavid van Moolenbroek 	test_gabn("b.example1.", LWRES_R_SUCCESS,
678*00b67f09SDavid van Moolenbroek 		  "eeee:eeee:eeee:eeee:ffff:ffff:ffff:ffff",
679*00b67f09SDavid van Moolenbroek 		  LWRES_ADDRTYPE_V6);
680*00b67f09SDavid van Moolenbroek 	test_gabn("b.example2", LWRES_R_SUCCESS,
681*00b67f09SDavid van Moolenbroek 		  "eeee:eeee:eeee:eeee:ffff:ffff:ffff:ffff",
682*00b67f09SDavid van Moolenbroek 		  LWRES_ADDRTYPE_V6);
683*00b67f09SDavid van Moolenbroek 	test_gabn("b.example2.", LWRES_R_SUCCESS,
684*00b67f09SDavid van Moolenbroek 		  "eeee:eeee:eeee:eeee:ffff:ffff:ffff:ffff",
685*00b67f09SDavid van Moolenbroek 		  LWRES_ADDRTYPE_V6);
686*00b67f09SDavid van Moolenbroek 	test_gabn("b.example3", LWRES_R_NOTFOUND, NULL, LWRES_ADDRTYPE_V6);
687*00b67f09SDavid van Moolenbroek 	test_gabn("b.example3.", LWRES_R_NOTFOUND, NULL, LWRES_ADDRTYPE_V6);
688*00b67f09SDavid van Moolenbroek 	test_gabn("b", LWRES_R_SUCCESS,
689*00b67f09SDavid van Moolenbroek 		  "eeee:eeee:eeee:eeee:ffff:ffff:ffff:ffff",
690*00b67f09SDavid van Moolenbroek 		  LWRES_ADDRTYPE_V6);
691*00b67f09SDavid van Moolenbroek 	test_gabn("b.", LWRES_R_NOTFOUND, NULL, LWRES_ADDRTYPE_V6);
692*00b67f09SDavid van Moolenbroek 
693*00b67f09SDavid van Moolenbroek 	test_gabn("d.example1", LWRES_R_NOTFOUND, NULL, LWRES_ADDRTYPE_V6);
694*00b67f09SDavid van Moolenbroek 
695*00b67f09SDavid van Moolenbroek 	test_gabn("x", LWRES_R_SUCCESS, "10.1.10.1", LWRES_ADDRTYPE_V4);
696*00b67f09SDavid van Moolenbroek 	test_gabn("x.", LWRES_R_SUCCESS, "10.1.10.1", LWRES_ADDRTYPE_V4);
697*00b67f09SDavid van Moolenbroek 
698*00b67f09SDavid van Moolenbroek 	test_gnba("10.10.10.1", LWRES_ADDRTYPE_V4, LWRES_R_SUCCESS,
699*00b67f09SDavid van Moolenbroek 		  "ipv4.example");
700*00b67f09SDavid van Moolenbroek 	test_gnba("10.10.10.17", LWRES_ADDRTYPE_V4, LWRES_R_NOTFOUND,
701*00b67f09SDavid van Moolenbroek 		  NULL);
702*00b67f09SDavid van Moolenbroek 	test_gnba("0123:4567:89ab:cdef:0123:4567:89ab:cdef",
703*00b67f09SDavid van Moolenbroek 		  LWRES_ADDRTYPE_V6, LWRES_R_SUCCESS, "ip6.int.example");
704*00b67f09SDavid van Moolenbroek 	test_gnba("0123:4567:89ab:cdef:0123:4567:89ab:cde0",
705*00b67f09SDavid van Moolenbroek 		  LWRES_ADDRTYPE_V6, LWRES_R_NOTFOUND, NULL);
706*00b67f09SDavid van Moolenbroek 	test_gnba("1123:4567:89ab:cdef:0123:4567:89ab:cdef",
707*00b67f09SDavid van Moolenbroek 		  LWRES_ADDRTYPE_V6, LWRES_R_SUCCESS, "ip6.arpa.example");
708*00b67f09SDavid van Moolenbroek 	test_gnba("1123:4567:89ab:cdef:0123:4567:89ab:cde0",
709*00b67f09SDavid van Moolenbroek 		  LWRES_ADDRTYPE_V6, LWRES_R_NOTFOUND, NULL);
710*00b67f09SDavid van Moolenbroek 
711*00b67f09SDavid van Moolenbroek 	test_gethostbyname("a.example1.", "10.0.1.1");
712*00b67f09SDavid van Moolenbroek 	test_gethostbyname("q.example1.", NULL);
713*00b67f09SDavid van Moolenbroek 
714*00b67f09SDavid van Moolenbroek 	test_gethostbyname2("a.example1.", "10.0.1.1", AF_INET);
715*00b67f09SDavid van Moolenbroek 	test_gethostbyname2("b.example1.",
716*00b67f09SDavid van Moolenbroek 			    "eeee:eeee:eeee:eeee:ffff:ffff:ffff:ffff",
717*00b67f09SDavid van Moolenbroek 			    AF_INET6);
718*00b67f09SDavid van Moolenbroek 	test_gethostbyname2("q.example1.", NULL, AF_INET);
719*00b67f09SDavid van Moolenbroek 
720*00b67f09SDavid van Moolenbroek 	test_getipnodebyname("a.example1.", "10.0.1.1", AF_INET, 0, 0);
721*00b67f09SDavid van Moolenbroek 	test_getipnodebyname("b.example1.",
722*00b67f09SDavid van Moolenbroek 			     "eeee:eeee:eeee:eeee:ffff:ffff:ffff:ffff",
723*00b67f09SDavid van Moolenbroek 			     AF_INET6, 0, 0);
724*00b67f09SDavid van Moolenbroek 	test_getipnodebyname("a.example1.",
725*00b67f09SDavid van Moolenbroek 			     "::ffff:10.0.1.1", AF_INET6, 1, 0);
726*00b67f09SDavid van Moolenbroek 	test_getipnodebyname("a.example1.",
727*00b67f09SDavid van Moolenbroek 			     "::ffff:10.0.1.1", AF_INET6, 1, 1);
728*00b67f09SDavid van Moolenbroek 	test_getipnodebyname("b.example1.",
729*00b67f09SDavid van Moolenbroek 			     "eeee:eeee:eeee:eeee:ffff:ffff:ffff:ffff",
730*00b67f09SDavid van Moolenbroek 			     AF_INET6, 1, 1);
731*00b67f09SDavid van Moolenbroek 	test_getipnodebyname("q.example1.", NULL, AF_INET, 0, 0);
732*00b67f09SDavid van Moolenbroek 
733*00b67f09SDavid van Moolenbroek 	test_gethostbyaddr("10.10.10.1", AF_INET, "ipv4.example");
734*00b67f09SDavid van Moolenbroek 	test_gethostbyaddr("10.10.10.17", AF_INET, NULL);
735*00b67f09SDavid van Moolenbroek 	test_gethostbyaddr("0123:4567:89ab:cdef:0123:4567:89ab:cdef",
736*00b67f09SDavid van Moolenbroek 			   AF_INET6, "ip6.int.example");
737*00b67f09SDavid van Moolenbroek 	test_gethostbyaddr("1123:4567:89ab:cdef:0123:4567:89ab:cdef",
738*00b67f09SDavid van Moolenbroek 			   AF_INET6, "ip6.arpa.example");
739*00b67f09SDavid van Moolenbroek 
740*00b67f09SDavid van Moolenbroek 	test_getipnodebyaddr("10.10.10.1", AF_INET, "ipv4.example");
741*00b67f09SDavid van Moolenbroek 	test_getipnodebyaddr("10.10.10.17", AF_INET, NULL);
742*00b67f09SDavid van Moolenbroek 	test_getipnodebyaddr("0123:4567:89ab:cdef:0123:4567:89ab:cdef",
743*00b67f09SDavid van Moolenbroek 			     AF_INET6, "ip6.int.example");
744*00b67f09SDavid van Moolenbroek 	test_getipnodebyaddr("1123:4567:89ab:cdef:0123:4567:89ab:cdef",
745*00b67f09SDavid van Moolenbroek 			     AF_INET6, "ip6.arpa.example");
746*00b67f09SDavid van Moolenbroek 
747*00b67f09SDavid van Moolenbroek 	test_getaddrinfo("a.example1.", AF_INET, 1, 1, "10.0.1.1");
748*00b67f09SDavid van Moolenbroek 	test_getaddrinfo("a.example1.", AF_INET, 1, 0, "10.0.1.1");
749*00b67f09SDavid van Moolenbroek 	test_getaddrinfo("a.example1.", AF_INET, 0, 1, NULL);
750*00b67f09SDavid van Moolenbroek 	test_getaddrinfo("b.example1.", AF_INET6, 1, 1,
751*00b67f09SDavid van Moolenbroek 			 "eeee:eeee:eeee:eeee:ffff:ffff:ffff:ffff");
752*00b67f09SDavid van Moolenbroek 	test_getaddrinfo("b.example1.", AF_INET6, 1, 0, NULL);
753*00b67f09SDavid van Moolenbroek 	test_getaddrinfo("b.example1.", AF_INET6, 0, 1,
754*00b67f09SDavid van Moolenbroek 			 "eeee:eeee:eeee:eeee:ffff:ffff:ffff:ffff");
755*00b67f09SDavid van Moolenbroek 
756*00b67f09SDavid van Moolenbroek 	test_getnameinfo("10.10.10.1", AF_INET, "ipv4.example");
757*00b67f09SDavid van Moolenbroek 	test_getnameinfo("10.10.10.17", AF_INET, NULL);
758*00b67f09SDavid van Moolenbroek 	test_getnameinfo("0123:4567:89ab:cdef:0123:4567:89ab:cdef",
759*00b67f09SDavid van Moolenbroek 			 AF_INET6, "ip6.int.example");
760*00b67f09SDavid van Moolenbroek 	test_getnameinfo("1123:4567:89ab:cdef:0123:4567:89ab:cdef",
761*00b67f09SDavid van Moolenbroek 			 AF_INET6, "ip6.arpa.example");
762*00b67f09SDavid van Moolenbroek 	test_getnameinfo("1122:3344:5566:7788:99aa:bbcc:ddee:ff00",
763*00b67f09SDavid van Moolenbroek 			 AF_INET6, "dname.example1");
764*00b67f09SDavid van Moolenbroek 
765*00b67f09SDavid van Moolenbroek 	test_getrrsetbyname("a", 1, 1, 1, 0, 1);
766*00b67f09SDavid van Moolenbroek 	test_getrrsetbyname("a.example1.", 1, 1, 1, 0, 1);
767*00b67f09SDavid van Moolenbroek 	test_getrrsetbyname("e.example1.", 1, 1, 1, 1, 1);
768*00b67f09SDavid van Moolenbroek 	test_getrrsetbyname("e.example1.", 1, 255, 1, 1, 0);
769*00b67f09SDavid van Moolenbroek 	test_getrrsetbyname("e.example1.", 1, 2, 1, 1, 1);
770*00b67f09SDavid van Moolenbroek 	test_getrrsetbyname("e.example1.", 1, 46, 2, 0, 1);
771*00b67f09SDavid van Moolenbroek 	test_getrrsetbyname("", 1, 1, 0, 0, 0);
772*00b67f09SDavid van Moolenbroek 
773*00b67f09SDavid van Moolenbroek 	if (fails == 0)
774*00b67f09SDavid van Moolenbroek 		printf("I:ok\n");
775*00b67f09SDavid van Moolenbroek 	return (fails);
776*00b67f09SDavid van Moolenbroek }
777