xref: /minix3/external/bsd/bind/dist/bin/tests/names/t_names.c (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: t_names.c,v 1.9 2014/12/10 04:37:53 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek  * Copyright (C) 2004-2009, 2011-2014  Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek  * Copyright (C) 1998-2003  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: t_names.c,v 1.52 2011/03/12 04:59:46 tbox Exp  */
21*00b67f09SDavid van Moolenbroek 
22*00b67f09SDavid van Moolenbroek #include <config.h>
23*00b67f09SDavid van Moolenbroek 
24*00b67f09SDavid van Moolenbroek #include <ctype.h>
25*00b67f09SDavid van Moolenbroek #include <stdlib.h>
26*00b67f09SDavid van Moolenbroek 
27*00b67f09SDavid van Moolenbroek #include <isc/buffer.h>
28*00b67f09SDavid van Moolenbroek #include <isc/mem.h>
29*00b67f09SDavid van Moolenbroek #include <isc/string.h>
30*00b67f09SDavid van Moolenbroek 
31*00b67f09SDavid van Moolenbroek #include <dns/compress.h>
32*00b67f09SDavid van Moolenbroek #include <dns/fixedname.h>
33*00b67f09SDavid van Moolenbroek #include <dns/name.h>
34*00b67f09SDavid van Moolenbroek #include <dns/result.h>
35*00b67f09SDavid van Moolenbroek 
36*00b67f09SDavid van Moolenbroek #include <tests/t_api.h>
37*00b67f09SDavid van Moolenbroek 
38*00b67f09SDavid van Moolenbroek #define	MAXTOKS		16
39*00b67f09SDavid van Moolenbroek #define	BUFLEN		256
40*00b67f09SDavid van Moolenbroek #define	BIGBUFLEN	4096
41*00b67f09SDavid van Moolenbroek 
42*00b67f09SDavid van Moolenbroek static char	*Tokens[MAXTOKS + 1];
43*00b67f09SDavid van Moolenbroek 
44*00b67f09SDavid van Moolenbroek 
45*00b67f09SDavid van Moolenbroek #ifdef	NEED_PBUF
46*00b67f09SDavid van Moolenbroek 
47*00b67f09SDavid van Moolenbroek /*%
48*00b67f09SDavid van Moolenbroek  * get a hex formatted dns message from a data
49*00b67f09SDavid van Moolenbroek  * file into an isc_buffer_t
50*00b67f09SDavid van Moolenbroek  * caller supplies data storage and the isc_buffer
51*00b67f09SDavid van Moolenbroek  * we read the file, convert, setup the buffer
52*00b67f09SDavid van Moolenbroek  * and return the data length
53*00b67f09SDavid van Moolenbroek  */
54*00b67f09SDavid van Moolenbroek 
55*00b67f09SDavid van Moolenbroek static char *
ctoh(unsigned char c)56*00b67f09SDavid van Moolenbroek ctoh(unsigned char c) {
57*00b67f09SDavid van Moolenbroek 	int		val;
58*00b67f09SDavid van Moolenbroek 	static char	buf[3];
59*00b67f09SDavid van Moolenbroek 
60*00b67f09SDavid van Moolenbroek 	val = (c >> 4) & 0x0f;
61*00b67f09SDavid van Moolenbroek 	if ((0 <= val) && (val <= 9))
62*00b67f09SDavid van Moolenbroek 		buf[0] = '0' + val;
63*00b67f09SDavid van Moolenbroek 	else if ((10 <= val) && (val <= 16))
64*00b67f09SDavid van Moolenbroek 		buf[0] = 'a' + val - 10;
65*00b67f09SDavid van Moolenbroek 	val = c & 0x0f;
66*00b67f09SDavid van Moolenbroek 	if ((0 <= val) && (val <= 9))
67*00b67f09SDavid van Moolenbroek 		buf[1] = '0' + val;
68*00b67f09SDavid van Moolenbroek 	else if ((10 <= val) && (val <= 16))
69*00b67f09SDavid van Moolenbroek 		buf[1] = 'a' + val - 10;
70*00b67f09SDavid van Moolenbroek 	buf[2] = '\0';
71*00b67f09SDavid van Moolenbroek 	return (buf);
72*00b67f09SDavid van Moolenbroek }
73*00b67f09SDavid van Moolenbroek 
74*00b67f09SDavid van Moolenbroek static void
pbuf(isc_buffer_t * pbuf)75*00b67f09SDavid van Moolenbroek pbuf(isc_buffer_t *pbuf) {
76*00b67f09SDavid van Moolenbroek 	size_t		len;
77*00b67f09SDavid van Moolenbroek 	unsigned char	*p;
78*00b67f09SDavid van Moolenbroek 
79*00b67f09SDavid van Moolenbroek 	len = 0;
80*00b67f09SDavid van Moolenbroek 	p = pbuf->base;
81*00b67f09SDavid van Moolenbroek 	while (len < pbuf->length) {
82*00b67f09SDavid van Moolenbroek 		printf("%s", ctoh(*p));
83*00b67f09SDavid van Moolenbroek 		++p;
84*00b67f09SDavid van Moolenbroek 		++len;
85*00b67f09SDavid van Moolenbroek 		if ((len % 40) == 0)
86*00b67f09SDavid van Moolenbroek 			printf("\n");
87*00b67f09SDavid van Moolenbroek 	}
88*00b67f09SDavid van Moolenbroek }
89*00b67f09SDavid van Moolenbroek 
90*00b67f09SDavid van Moolenbroek #endif	/* NEED_PBUF */
91*00b67f09SDavid van Moolenbroek 
92*00b67f09SDavid van Moolenbroek /*%
93*00b67f09SDavid van Moolenbroek  * Compare data at buf with data in hex representation at exp_data,
94*00b67f09SDavid van Moolenbroek  * of length exp_data_len, for equality.
95*00b67f09SDavid van Moolenbroek  * Return 0 if equal, else non-zero.
96*00b67f09SDavid van Moolenbroek  */
97*00b67f09SDavid van Moolenbroek 
98*00b67f09SDavid van Moolenbroek static int
chkdata(unsigned char * buf,size_t buflen,char * exp_data,size_t exp_data_len)99*00b67f09SDavid van Moolenbroek chkdata(unsigned char *buf, size_t buflen, char *exp_data,
100*00b67f09SDavid van Moolenbroek 	size_t exp_data_len)
101*00b67f09SDavid van Moolenbroek {
102*00b67f09SDavid van Moolenbroek 	int		result;
103*00b67f09SDavid van Moolenbroek 	unsigned char	*p;
104*00b67f09SDavid van Moolenbroek 	unsigned char	*v;
105*00b67f09SDavid van Moolenbroek 	char		*q;
106*00b67f09SDavid van Moolenbroek 	unsigned char	*data;
107*00b67f09SDavid van Moolenbroek 	size_t		cnt;
108*00b67f09SDavid van Moolenbroek 
109*00b67f09SDavid van Moolenbroek 	if (buflen == exp_data_len) {
110*00b67f09SDavid van Moolenbroek 		data = (unsigned char *)malloc(exp_data_len *
111*00b67f09SDavid van Moolenbroek 					       sizeof(unsigned char));
112*00b67f09SDavid van Moolenbroek 		if (data == NULL) {
113*00b67f09SDavid van Moolenbroek 			t_info("malloc failed unexpectedly\n");
114*00b67f09SDavid van Moolenbroek 			return (-1);
115*00b67f09SDavid van Moolenbroek 		}
116*00b67f09SDavid van Moolenbroek 
117*00b67f09SDavid van Moolenbroek 		/*
118*00b67f09SDavid van Moolenbroek 		 * First convert exp_data from hex format.
119*00b67f09SDavid van Moolenbroek 		 */
120*00b67f09SDavid van Moolenbroek 		p = data;
121*00b67f09SDavid van Moolenbroek 		q = exp_data;
122*00b67f09SDavid van Moolenbroek 		cnt = 0;
123*00b67f09SDavid van Moolenbroek 		while (cnt < exp_data_len) {
124*00b67f09SDavid van Moolenbroek 
125*00b67f09SDavid van Moolenbroek 			if (('0' <= *q) && (*q <= '9'))
126*00b67f09SDavid van Moolenbroek 				*p = *q - '0';
127*00b67f09SDavid van Moolenbroek 			else if (('a' <= *q) && (*q <= 'f'))
128*00b67f09SDavid van Moolenbroek 				*p = *q - 'a' + 10;
129*00b67f09SDavid van Moolenbroek 			else if (('A' <= *q) && (*q <= 'F'))
130*00b67f09SDavid van Moolenbroek 				*p = *q - 'A' + 10;
131*00b67f09SDavid van Moolenbroek 			else {
132*00b67f09SDavid van Moolenbroek 				t_info("malformed comparison data\n");
133*00b67f09SDavid van Moolenbroek 				free(data);
134*00b67f09SDavid van Moolenbroek 				return (-1);
135*00b67f09SDavid van Moolenbroek 			}
136*00b67f09SDavid van Moolenbroek 			++q;
137*00b67f09SDavid van Moolenbroek 
138*00b67f09SDavid van Moolenbroek 			*p <<= 4;
139*00b67f09SDavid van Moolenbroek 
140*00b67f09SDavid van Moolenbroek 			if (('0' <= *q) && (*q <= '9'))
141*00b67f09SDavid van Moolenbroek 				*p |= ((*q - '0') & 0x0f);
142*00b67f09SDavid van Moolenbroek 			else if (('a' <= *q) && (*q <= 'f'))
143*00b67f09SDavid van Moolenbroek 				*p |= ((*q - 'a' + 10) & 0x0f);
144*00b67f09SDavid van Moolenbroek 			else if (('A' <= *q) && (*q <= 'F'))
145*00b67f09SDavid van Moolenbroek 				*p |= ((*q - 'A' + 10) & 0x0f);
146*00b67f09SDavid van Moolenbroek 			else {
147*00b67f09SDavid van Moolenbroek 				t_info("malformed comparison data\n");
148*00b67f09SDavid van Moolenbroek 				free(data);
149*00b67f09SDavid van Moolenbroek 				return (-1);
150*00b67f09SDavid van Moolenbroek 			}
151*00b67f09SDavid van Moolenbroek 			++p;
152*00b67f09SDavid van Moolenbroek 			++q;
153*00b67f09SDavid van Moolenbroek 			++cnt;
154*00b67f09SDavid van Moolenbroek 		}
155*00b67f09SDavid van Moolenbroek 
156*00b67f09SDavid van Moolenbroek 		/*
157*00b67f09SDavid van Moolenbroek 		 * Now compare data.
158*00b67f09SDavid van Moolenbroek 		 */
159*00b67f09SDavid van Moolenbroek 		p = buf;
160*00b67f09SDavid van Moolenbroek 		v = data;
161*00b67f09SDavid van Moolenbroek 		for (cnt = 0; cnt < exp_data_len; ++cnt) {
162*00b67f09SDavid van Moolenbroek 			if (*p != *v)
163*00b67f09SDavid van Moolenbroek 				break;
164*00b67f09SDavid van Moolenbroek 			++p;
165*00b67f09SDavid van Moolenbroek 			++v;
166*00b67f09SDavid van Moolenbroek 		}
167*00b67f09SDavid van Moolenbroek 		if (cnt == exp_data_len)
168*00b67f09SDavid van Moolenbroek 			result = 0;
169*00b67f09SDavid van Moolenbroek 		else {
170*00b67f09SDavid van Moolenbroek 			t_info("bad data at position %lu, "
171*00b67f09SDavid van Moolenbroek 			       "got 0x%.2x, expected 0x%.2x\n",
172*00b67f09SDavid van Moolenbroek 			       (unsigned long)cnt, *p, *v);
173*00b67f09SDavid van Moolenbroek 			result = (int)cnt + 1;
174*00b67f09SDavid van Moolenbroek 		}
175*00b67f09SDavid van Moolenbroek 		(void)free(data);
176*00b67f09SDavid van Moolenbroek 	} else {
177*00b67f09SDavid van Moolenbroek 		t_info("data length error, expected %lu, got %lu\n",
178*00b67f09SDavid van Moolenbroek 			(unsigned long)exp_data_len, (unsigned long)buflen);
179*00b67f09SDavid van Moolenbroek 		result = (int)(exp_data_len - buflen);
180*00b67f09SDavid van Moolenbroek 	}
181*00b67f09SDavid van Moolenbroek 	return (result);
182*00b67f09SDavid van Moolenbroek }
183*00b67f09SDavid van Moolenbroek 
184*00b67f09SDavid van Moolenbroek /*%
185*00b67f09SDavid van Moolenbroek  * Get a hex formatted dns message from a data file into an isc_buffer_t.
186*00b67f09SDavid van Moolenbroek  * Caller supplies data storage and the isc_buffer.  We read the file, convert,
187*00b67f09SDavid van Moolenbroek  * setup the buffer and return the data length.
188*00b67f09SDavid van Moolenbroek  */
189*00b67f09SDavid van Moolenbroek static int
getmsg(char * datafile_name,isc_buffer_t * pbuf)190*00b67f09SDavid van Moolenbroek getmsg(char *datafile_name, isc_buffer_t *pbuf)
191*00b67f09SDavid van Moolenbroek {
192*00b67f09SDavid van Moolenbroek 	int			c;
193*00b67f09SDavid van Moolenbroek 	unsigned int		len;
194*00b67f09SDavid van Moolenbroek 	unsigned int		cnt;
195*00b67f09SDavid van Moolenbroek 	unsigned char		*p;
196*00b67f09SDavid van Moolenbroek 	FILE			*fp;
197*00b67f09SDavid van Moolenbroek 	unsigned int		buflen;
198*00b67f09SDavid van Moolenbroek 
199*00b67f09SDavid van Moolenbroek 	fp = fopen(datafile_name, "r");
200*00b67f09SDavid van Moolenbroek 	if (fp == NULL) {
201*00b67f09SDavid van Moolenbroek 		t_info("No such file %s\n", datafile_name);
202*00b67f09SDavid van Moolenbroek 		return (0);
203*00b67f09SDavid van Moolenbroek 	}
204*00b67f09SDavid van Moolenbroek 
205*00b67f09SDavid van Moolenbroek 	p = isc_buffer_used(pbuf);
206*00b67f09SDavid van Moolenbroek 	buflen = isc_buffer_availablelength(pbuf);
207*00b67f09SDavid van Moolenbroek 	cnt = 0;
208*00b67f09SDavid van Moolenbroek 	len = 0;
209*00b67f09SDavid van Moolenbroek 	while ((c = getc(fp)) != EOF) {
210*00b67f09SDavid van Moolenbroek 		unsigned int		val;
211*00b67f09SDavid van Moolenbroek 		if (	(c == ' ') || (c == '\t') ||
212*00b67f09SDavid van Moolenbroek 			(c == '\r') || (c == '\n'))
213*00b67f09SDavid van Moolenbroek 				continue;
214*00b67f09SDavid van Moolenbroek 		if (c == '#') {
215*00b67f09SDavid van Moolenbroek 			while ((c = getc(fp)) != '\n')
216*00b67f09SDavid van Moolenbroek 				;
217*00b67f09SDavid van Moolenbroek 			continue;
218*00b67f09SDavid van Moolenbroek 		}
219*00b67f09SDavid van Moolenbroek 		if (('0' <= c) && (c <= '9'))
220*00b67f09SDavid van Moolenbroek 			val = c - '0';
221*00b67f09SDavid van Moolenbroek 		else if (('a' <= c) && (c <= 'f'))
222*00b67f09SDavid van Moolenbroek 			val = c - 'a' + 10;
223*00b67f09SDavid van Moolenbroek 		else if (('A' <= c) && (c <= 'F'))
224*00b67f09SDavid van Moolenbroek 			val = c - 'A'+ 10;
225*00b67f09SDavid van Moolenbroek 		else {
226*00b67f09SDavid van Moolenbroek 			(void)fclose(fp);
227*00b67f09SDavid van Moolenbroek 			t_info("Bad format in datafile\n");
228*00b67f09SDavid van Moolenbroek 			return (0);
229*00b67f09SDavid van Moolenbroek 		}
230*00b67f09SDavid van Moolenbroek 		if ((len % 2) == 0) {
231*00b67f09SDavid van Moolenbroek 			*p = (val << 4);
232*00b67f09SDavid van Moolenbroek 		} else {
233*00b67f09SDavid van Moolenbroek 			*p += val;
234*00b67f09SDavid van Moolenbroek 			++p;
235*00b67f09SDavid van Moolenbroek 			++cnt;
236*00b67f09SDavid van Moolenbroek 			if (cnt >= buflen) {
237*00b67f09SDavid van Moolenbroek 				/*
238*00b67f09SDavid van Moolenbroek 				 * Buffer too small.
239*00b67f09SDavid van Moolenbroek 				 */
240*00b67f09SDavid van Moolenbroek 				(void)fclose(fp);
241*00b67f09SDavid van Moolenbroek 				t_info("Buffer overflow error\n");
242*00b67f09SDavid van Moolenbroek 				return (0);
243*00b67f09SDavid van Moolenbroek 			}
244*00b67f09SDavid van Moolenbroek 		}
245*00b67f09SDavid van Moolenbroek 		++len;
246*00b67f09SDavid van Moolenbroek 	}
247*00b67f09SDavid van Moolenbroek 	(void)fclose(fp);
248*00b67f09SDavid van Moolenbroek 
249*00b67f09SDavid van Moolenbroek 	if (len % 2) {
250*00b67f09SDavid van Moolenbroek 		t_info("Bad format in %s\n", datafile_name);
251*00b67f09SDavid van Moolenbroek 		return (0);
252*00b67f09SDavid van Moolenbroek 	}
253*00b67f09SDavid van Moolenbroek 
254*00b67f09SDavid van Moolenbroek 	*p = '\0';
255*00b67f09SDavid van Moolenbroek 	isc_buffer_add(pbuf, cnt);
256*00b67f09SDavid van Moolenbroek 	return (cnt);
257*00b67f09SDavid van Moolenbroek }
258*00b67f09SDavid van Moolenbroek 
259*00b67f09SDavid van Moolenbroek static int
bustline(char * line,char ** toks)260*00b67f09SDavid van Moolenbroek bustline(char *line, char **toks) {
261*00b67f09SDavid van Moolenbroek 	int	cnt;
262*00b67f09SDavid van Moolenbroek 	char	*p;
263*00b67f09SDavid van Moolenbroek 
264*00b67f09SDavid van Moolenbroek 	cnt = 0;
265*00b67f09SDavid van Moolenbroek 	if (line && *line) {
266*00b67f09SDavid van Moolenbroek 		while ((p = strtok(line, "\t")) && (cnt < MAXTOKS)) {
267*00b67f09SDavid van Moolenbroek 			*toks++ = p;
268*00b67f09SDavid van Moolenbroek 			line = NULL;
269*00b67f09SDavid van Moolenbroek 			++cnt;
270*00b67f09SDavid van Moolenbroek 		}
271*00b67f09SDavid van Moolenbroek 	}
272*00b67f09SDavid van Moolenbroek 	return (cnt);
273*00b67f09SDavid van Moolenbroek }
274*00b67f09SDavid van Moolenbroek 
275*00b67f09SDavid van Moolenbroek 
276*00b67f09SDavid van Moolenbroek #ifdef	NEED_HNAME_TO_TNAME
277*00b67f09SDavid van Moolenbroek 
278*00b67f09SDavid van Moolenbroek /*%
279*00b67f09SDavid van Moolenbroek  * convert a name from hex representation to text form
280*00b67f09SDavid van Moolenbroek  * format of hex notation is:
281*00b67f09SDavid van Moolenbroek  * %xXXXXXXXX
282*00b67f09SDavid van Moolenbroek  */
283*00b67f09SDavid van Moolenbroek 
284*00b67f09SDavid van Moolenbroek static int
hname_to_tname(char * src,char * target,size_t len)285*00b67f09SDavid van Moolenbroek hname_to_tname(char *src, char *target, size_t len) {
286*00b67f09SDavid van Moolenbroek 	int		i;
287*00b67f09SDavid van Moolenbroek 	int		c;
288*00b67f09SDavid van Moolenbroek 	unsigned int	val;
289*00b67f09SDavid van Moolenbroek 	size_t		srclen;
290*00b67f09SDavid van Moolenbroek 	char		*p;
291*00b67f09SDavid van Moolenbroek 	char		*q;
292*00b67f09SDavid van Moolenbroek 
293*00b67f09SDavid van Moolenbroek 	p = src;
294*00b67f09SDavid van Moolenbroek 	srclen = strlen(p);
295*00b67f09SDavid van Moolenbroek 	if ((srclen >= 2) && ((*p != '%') || (*(p+1) != 'x'))) {
296*00b67f09SDavid van Moolenbroek 		/*
297*00b67f09SDavid van Moolenbroek 		 * No conversion needed.
298*00b67f09SDavid van Moolenbroek 		 */
299*00b67f09SDavid van Moolenbroek 		if (srclen >= len)
300*00b67f09SDavid van Moolenbroek 			return (1);
301*00b67f09SDavid van Moolenbroek 		memmove(target, src, srclen + 1);
302*00b67f09SDavid van Moolenbroek 		return (0);
303*00b67f09SDavid van Moolenbroek 	}
304*00b67f09SDavid van Moolenbroek 
305*00b67f09SDavid van Moolenbroek 	i = 0;
306*00b67f09SDavid van Moolenbroek 	p += 2;
307*00b67f09SDavid van Moolenbroek 	q = target;
308*00b67f09SDavid van Moolenbroek 	while (*p) {
309*00b67f09SDavid van Moolenbroek 		c = *p;
310*00b67f09SDavid van Moolenbroek 		if (('0' < c) && (c <= '9'))
311*00b67f09SDavid van Moolenbroek 			val = c - '0';
312*00b67f09SDavid van Moolenbroek 		else if (('a' <= c) && (c <= 'z'))
313*00b67f09SDavid van Moolenbroek 			val = c + 10 - 'a';
314*00b67f09SDavid van Moolenbroek 		else if (('A' <= c) && (c <= 'Z'))
315*00b67f09SDavid van Moolenbroek 			val = c + 10 - 'A';
316*00b67f09SDavid van Moolenbroek 		else {
317*00b67f09SDavid van Moolenbroek 			return (1);
318*00b67f09SDavid van Moolenbroek 		}
319*00b67f09SDavid van Moolenbroek 		if (i % 2) {
320*00b67f09SDavid van Moolenbroek 			*q |= val;
321*00b67f09SDavid van Moolenbroek 			++q;
322*00b67f09SDavid van Moolenbroek 		} else
323*00b67f09SDavid van Moolenbroek 			*q = (val << 4);
324*00b67f09SDavid van Moolenbroek 		++i;
325*00b67f09SDavid van Moolenbroek 		++p;
326*00b67f09SDavid van Moolenbroek 	}
327*00b67f09SDavid van Moolenbroek 	if (i % 2) {
328*00b67f09SDavid van Moolenbroek 		return (1);
329*00b67f09SDavid van Moolenbroek 	} else {
330*00b67f09SDavid van Moolenbroek 		*q = '\0';
331*00b67f09SDavid van Moolenbroek 		return (0);
332*00b67f09SDavid van Moolenbroek 	}
333*00b67f09SDavid van Moolenbroek }
334*00b67f09SDavid van Moolenbroek 
335*00b67f09SDavid van Moolenbroek #endif	/* NEED_HNAME_TO_TNAME */
336*00b67f09SDavid van Moolenbroek 
337*00b67f09SDavid van Moolenbroek static const char *a3 =	"dns_name_init initializes 'name' to the empty name";
338*00b67f09SDavid van Moolenbroek 
339*00b67f09SDavid van Moolenbroek static void
t_dns_name_init(void)340*00b67f09SDavid van Moolenbroek t_dns_name_init(void) {
341*00b67f09SDavid van Moolenbroek 	int		rval;
342*00b67f09SDavid van Moolenbroek 	int		result;
343*00b67f09SDavid van Moolenbroek 	dns_name_t	name;
344*00b67f09SDavid van Moolenbroek 	unsigned char	offsets[1];
345*00b67f09SDavid van Moolenbroek 
346*00b67f09SDavid van Moolenbroek 	rval = 0;
347*00b67f09SDavid van Moolenbroek 	t_assert("dns_name_init", 1, T_REQUIRED, "%s", a3);
348*00b67f09SDavid van Moolenbroek 
349*00b67f09SDavid van Moolenbroek 	dns_name_init(&name, offsets);
350*00b67f09SDavid van Moolenbroek 	/* magic is hidden in name.c ...
351*00b67f09SDavid van Moolenbroek 	if (name.magic != NAME_MAGIC) {
352*00b67f09SDavid van Moolenbroek 		t_info("name.magic is not set to NAME_MAGIC\n");
353*00b67f09SDavid van Moolenbroek 		++rval;
354*00b67f09SDavid van Moolenbroek 	}
355*00b67f09SDavid van Moolenbroek 	*/
356*00b67f09SDavid van Moolenbroek 	if (name.ndata != NULL) {
357*00b67f09SDavid van Moolenbroek 		t_info("name.ndata is not NULL\n");
358*00b67f09SDavid van Moolenbroek 		++rval;
359*00b67f09SDavid van Moolenbroek 	}
360*00b67f09SDavid van Moolenbroek 	if (name.length != 0) {
361*00b67f09SDavid van Moolenbroek 		t_info("name.length is not 0\n");
362*00b67f09SDavid van Moolenbroek 		++rval;
363*00b67f09SDavid van Moolenbroek 	}
364*00b67f09SDavid van Moolenbroek 	if (name.labels != 0) {
365*00b67f09SDavid van Moolenbroek 		t_info("name.labels is not 0\n");
366*00b67f09SDavid van Moolenbroek 		++rval;
367*00b67f09SDavid van Moolenbroek 	}
368*00b67f09SDavid van Moolenbroek 	if (name.attributes != 0) {
369*00b67f09SDavid van Moolenbroek 		t_info("name.attributes is not 0\n");
370*00b67f09SDavid van Moolenbroek 		++rval;
371*00b67f09SDavid van Moolenbroek 	}
372*00b67f09SDavid van Moolenbroek 	if (name.offsets != offsets) {
373*00b67f09SDavid van Moolenbroek 		t_info("name.offsets is incorrect\n");
374*00b67f09SDavid van Moolenbroek 		++rval;
375*00b67f09SDavid van Moolenbroek 	}
376*00b67f09SDavid van Moolenbroek 	if (name.buffer != NULL) {
377*00b67f09SDavid van Moolenbroek 		t_info("name.buffer is not NULL\n");
378*00b67f09SDavid van Moolenbroek 		++rval;
379*00b67f09SDavid van Moolenbroek 	}
380*00b67f09SDavid van Moolenbroek 
381*00b67f09SDavid van Moolenbroek 	if (rval == 0)
382*00b67f09SDavid van Moolenbroek 		result = T_PASS;
383*00b67f09SDavid van Moolenbroek 	else
384*00b67f09SDavid van Moolenbroek 		result = T_FAIL;
385*00b67f09SDavid van Moolenbroek 	t_result(result);
386*00b67f09SDavid van Moolenbroek }
387*00b67f09SDavid van Moolenbroek 
388*00b67f09SDavid van Moolenbroek static const char *a4 =	"dns_name_invalidate invalidates 'name'";
389*00b67f09SDavid van Moolenbroek 
390*00b67f09SDavid van Moolenbroek static void
t_dns_name_invalidate(void)391*00b67f09SDavid van Moolenbroek t_dns_name_invalidate(void) {
392*00b67f09SDavid van Moolenbroek 	int		rval;
393*00b67f09SDavid van Moolenbroek 	int		result;
394*00b67f09SDavid van Moolenbroek 	dns_name_t	name;
395*00b67f09SDavid van Moolenbroek 	unsigned char	offsets[1];
396*00b67f09SDavid van Moolenbroek 
397*00b67f09SDavid van Moolenbroek 	t_assert("dns_name_invalidate", 1, T_REQUIRED, "%s", a4);
398*00b67f09SDavid van Moolenbroek 
399*00b67f09SDavid van Moolenbroek 	rval = 0;
400*00b67f09SDavid van Moolenbroek 	dns_name_init(&name, offsets);
401*00b67f09SDavid van Moolenbroek 	dns_name_invalidate(&name);
402*00b67f09SDavid van Moolenbroek 
403*00b67f09SDavid van Moolenbroek 	/* magic is hidden in name.c ...
404*00b67f09SDavid van Moolenbroek 	if (name.magic != 0) {
405*00b67f09SDavid van Moolenbroek 		t_info("name.magic is not set to NAME_MAGIC\n");
406*00b67f09SDavid van Moolenbroek 		++rval;
407*00b67f09SDavid van Moolenbroek 	}
408*00b67f09SDavid van Moolenbroek 	*/
409*00b67f09SDavid van Moolenbroek 	if (name.ndata != NULL) {
410*00b67f09SDavid van Moolenbroek 		t_info("name.ndata is not NULL\n");
411*00b67f09SDavid van Moolenbroek 		++rval;
412*00b67f09SDavid van Moolenbroek 	}
413*00b67f09SDavid van Moolenbroek 	if (name.length != 0) {
414*00b67f09SDavid van Moolenbroek 		t_info("name.length is not 0\n");
415*00b67f09SDavid van Moolenbroek 		++rval;
416*00b67f09SDavid van Moolenbroek 	}
417*00b67f09SDavid van Moolenbroek 	if (name.labels != 0) {
418*00b67f09SDavid van Moolenbroek 		t_info("name.labels is not 0\n");
419*00b67f09SDavid van Moolenbroek 		++rval;
420*00b67f09SDavid van Moolenbroek 	}
421*00b67f09SDavid van Moolenbroek 	if (name.attributes != 0) {
422*00b67f09SDavid van Moolenbroek 		t_info("name.attributes is not 0\n");
423*00b67f09SDavid van Moolenbroek 		++rval;
424*00b67f09SDavid van Moolenbroek 	}
425*00b67f09SDavid van Moolenbroek 	if (name.offsets != NULL) {
426*00b67f09SDavid van Moolenbroek 		t_info("name.offsets is not NULL\n");
427*00b67f09SDavid van Moolenbroek 		++rval;
428*00b67f09SDavid van Moolenbroek 	}
429*00b67f09SDavid van Moolenbroek 	if (name.buffer != NULL) {
430*00b67f09SDavid van Moolenbroek 		t_info("name.buffer is not NULL\n");
431*00b67f09SDavid van Moolenbroek 		++rval;
432*00b67f09SDavid van Moolenbroek 	}
433*00b67f09SDavid van Moolenbroek 
434*00b67f09SDavid van Moolenbroek 	if (rval == 0)
435*00b67f09SDavid van Moolenbroek 		result = T_PASS;
436*00b67f09SDavid van Moolenbroek 	else
437*00b67f09SDavid van Moolenbroek 		result = T_FAIL;
438*00b67f09SDavid van Moolenbroek 	t_result(result);
439*00b67f09SDavid van Moolenbroek }
440*00b67f09SDavid van Moolenbroek 
441*00b67f09SDavid van Moolenbroek static const char *a5 =	"dns_name_setbuffer dedicates a buffer for use "
442*00b67f09SDavid van Moolenbroek 			"with 'name'";
443*00b67f09SDavid van Moolenbroek 
444*00b67f09SDavid van Moolenbroek static void
t_dns_name_setbuffer(void)445*00b67f09SDavid van Moolenbroek t_dns_name_setbuffer(void) {
446*00b67f09SDavid van Moolenbroek 	int		result;
447*00b67f09SDavid van Moolenbroek 	unsigned char	junk[BUFLEN];
448*00b67f09SDavid van Moolenbroek 	dns_name_t	name;
449*00b67f09SDavid van Moolenbroek 	isc_buffer_t	buffer;
450*00b67f09SDavid van Moolenbroek 
451*00b67f09SDavid van Moolenbroek 	t_assert("dns_name_setbuffer", 1, T_REQUIRED, "%s", a5);
452*00b67f09SDavid van Moolenbroek 
453*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&buffer, junk, BUFLEN);
454*00b67f09SDavid van Moolenbroek 	dns_name_init(&name, NULL);
455*00b67f09SDavid van Moolenbroek 	dns_name_setbuffer(&name, &buffer);
456*00b67f09SDavid van Moolenbroek 	if (name.buffer == &buffer)
457*00b67f09SDavid van Moolenbroek 		result = T_PASS;
458*00b67f09SDavid van Moolenbroek 	else
459*00b67f09SDavid van Moolenbroek 		result = T_FAIL;
460*00b67f09SDavid van Moolenbroek 
461*00b67f09SDavid van Moolenbroek 	t_result(result);
462*00b67f09SDavid van Moolenbroek }
463*00b67f09SDavid van Moolenbroek 
464*00b67f09SDavid van Moolenbroek static const char *a6 =	"dns_name_hasbuffer returns ISC_TRUE if 'name' has a "
465*00b67f09SDavid van Moolenbroek 			"dedicated buffer, otherwise it returns ISC_FALSE";
466*00b67f09SDavid van Moolenbroek 
467*00b67f09SDavid van Moolenbroek static void
t_dns_name_hasbuffer(void)468*00b67f09SDavid van Moolenbroek t_dns_name_hasbuffer(void) {
469*00b67f09SDavid van Moolenbroek 	int		result;
470*00b67f09SDavid van Moolenbroek 	int		rval;
471*00b67f09SDavid van Moolenbroek 	unsigned char	junk[BUFLEN];
472*00b67f09SDavid van Moolenbroek 	dns_name_t	name;
473*00b67f09SDavid van Moolenbroek 	isc_buffer_t	buffer;
474*00b67f09SDavid van Moolenbroek 
475*00b67f09SDavid van Moolenbroek 	t_assert("dns_name_hasbuffer", 1, T_REQUIRED, "%s", a6);
476*00b67f09SDavid van Moolenbroek 
477*00b67f09SDavid van Moolenbroek 	rval = 0;
478*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&buffer, junk, BUFLEN);
479*00b67f09SDavid van Moolenbroek 	dns_name_init(&name, NULL);
480*00b67f09SDavid van Moolenbroek 	if (dns_name_hasbuffer(&name) != ISC_FALSE)
481*00b67f09SDavid van Moolenbroek 		++rval;
482*00b67f09SDavid van Moolenbroek 	dns_name_setbuffer(&name, &buffer);
483*00b67f09SDavid van Moolenbroek 	if (dns_name_hasbuffer(&name) != ISC_TRUE)
484*00b67f09SDavid van Moolenbroek 		++rval;
485*00b67f09SDavid van Moolenbroek 	if (rval == 0)
486*00b67f09SDavid van Moolenbroek 		result = T_PASS;
487*00b67f09SDavid van Moolenbroek 	else
488*00b67f09SDavid van Moolenbroek 		result = T_FAIL;
489*00b67f09SDavid van Moolenbroek 
490*00b67f09SDavid van Moolenbroek 	t_result(result);
491*00b67f09SDavid van Moolenbroek }
492*00b67f09SDavid van Moolenbroek 
493*00b67f09SDavid van Moolenbroek static const char *a7 =	"dns_name_isabsolute returns ISC_TRUE if 'name' ends "
494*00b67f09SDavid van Moolenbroek 			"in the root label";
495*00b67f09SDavid van Moolenbroek 
496*00b67f09SDavid van Moolenbroek static int
test_dns_name_isabsolute(char * test_name,isc_boolean_t expected)497*00b67f09SDavid van Moolenbroek test_dns_name_isabsolute(char *test_name, isc_boolean_t expected) {
498*00b67f09SDavid van Moolenbroek 	dns_name_t	name;
499*00b67f09SDavid van Moolenbroek 	isc_buffer_t	buf;
500*00b67f09SDavid van Moolenbroek 	isc_buffer_t	binbuf;
501*00b67f09SDavid van Moolenbroek 	unsigned char	junk[BUFLEN];
502*00b67f09SDavid van Moolenbroek 	int		len;
503*00b67f09SDavid van Moolenbroek 	int		rval;
504*00b67f09SDavid van Moolenbroek 	isc_boolean_t	isabs_p;
505*00b67f09SDavid van Moolenbroek 	isc_result_t	result;
506*00b67f09SDavid van Moolenbroek 
507*00b67f09SDavid van Moolenbroek 	rval = T_UNRESOLVED;
508*00b67f09SDavid van Moolenbroek 
509*00b67f09SDavid van Moolenbroek 	t_info("testing name %s\n", test_name);
510*00b67f09SDavid van Moolenbroek 	len = strlen(test_name);
511*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&buf, test_name, len);
512*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&buf, len);
513*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&binbuf, &junk[0], BUFLEN);
514*00b67f09SDavid van Moolenbroek 	dns_name_init(&name, NULL);
515*00b67f09SDavid van Moolenbroek 	dns_name_setbuffer(&name, &binbuf);
516*00b67f09SDavid van Moolenbroek 	result = dns_name_fromtext(&name,  &buf, NULL, 0, NULL);
517*00b67f09SDavid van Moolenbroek 	if (result == ISC_R_SUCCESS) {
518*00b67f09SDavid van Moolenbroek 		isabs_p = dns_name_isabsolute(&name);
519*00b67f09SDavid van Moolenbroek 		if (isabs_p == expected)
520*00b67f09SDavid van Moolenbroek 			rval = T_PASS;
521*00b67f09SDavid van Moolenbroek 		else
522*00b67f09SDavid van Moolenbroek 			rval = T_FAIL;
523*00b67f09SDavid van Moolenbroek 	} else {
524*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromtext %s failed, result = %s\n",
525*00b67f09SDavid van Moolenbroek 				test_name, dns_result_totext(result));
526*00b67f09SDavid van Moolenbroek 	}
527*00b67f09SDavid van Moolenbroek 	return (rval);
528*00b67f09SDavid van Moolenbroek }
529*00b67f09SDavid van Moolenbroek 
530*00b67f09SDavid van Moolenbroek static void
t_dns_name_isabsolute(void)531*00b67f09SDavid van Moolenbroek t_dns_name_isabsolute(void) {
532*00b67f09SDavid van Moolenbroek 	int	line;
533*00b67f09SDavid van Moolenbroek 	int	cnt;
534*00b67f09SDavid van Moolenbroek 	int	result;
535*00b67f09SDavid van Moolenbroek 	char	*p;
536*00b67f09SDavid van Moolenbroek 	FILE	*fp;
537*00b67f09SDavid van Moolenbroek 
538*00b67f09SDavid van Moolenbroek 	t_assert("dns_name_isabsolute", 1, T_REQUIRED, "%s", a7);
539*00b67f09SDavid van Moolenbroek 
540*00b67f09SDavid van Moolenbroek 	result = T_UNRESOLVED;
541*00b67f09SDavid van Moolenbroek 	fp = fopen("dns_name_isabsolute_data", "r");
542*00b67f09SDavid van Moolenbroek 	if (fp != NULL) {
543*00b67f09SDavid van Moolenbroek 		line = 0;
544*00b67f09SDavid van Moolenbroek 		while ((p = t_fgetbs(fp)) != NULL) {
545*00b67f09SDavid van Moolenbroek 
546*00b67f09SDavid van Moolenbroek 			++line;
547*00b67f09SDavid van Moolenbroek 
548*00b67f09SDavid van Moolenbroek 			/*
549*00b67f09SDavid van Moolenbroek 			 * Skip comment lines.
550*00b67f09SDavid van Moolenbroek 			 */
551*00b67f09SDavid van Moolenbroek 			if ((isspace((unsigned char)*p)) || (*p == '#')) {
552*00b67f09SDavid van Moolenbroek 				(void)free(p);
553*00b67f09SDavid van Moolenbroek 				continue;
554*00b67f09SDavid van Moolenbroek 			}
555*00b67f09SDavid van Moolenbroek 
556*00b67f09SDavid van Moolenbroek 			cnt = bustline(p, Tokens);
557*00b67f09SDavid van Moolenbroek 			if (cnt == 2) {
558*00b67f09SDavid van Moolenbroek 				/*
559*00b67f09SDavid van Moolenbroek 				 * label, bitpos, expected value.
560*00b67f09SDavid van Moolenbroek 				 */
561*00b67f09SDavid van Moolenbroek 				result = test_dns_name_isabsolute(Tokens[0],
562*00b67f09SDavid van Moolenbroek 								atoi(Tokens[1])
563*00b67f09SDavid van Moolenbroek 								  == 0 ?
564*00b67f09SDavid van Moolenbroek 								  ISC_FALSE :
565*00b67f09SDavid van Moolenbroek 								  ISC_TRUE);
566*00b67f09SDavid van Moolenbroek 			} else {
567*00b67f09SDavid van Moolenbroek 				t_info("bad datafile format at line %d\n",
568*00b67f09SDavid van Moolenbroek 				       line);
569*00b67f09SDavid van Moolenbroek 			}
570*00b67f09SDavid van Moolenbroek 
571*00b67f09SDavid van Moolenbroek 			(void)free(p);
572*00b67f09SDavid van Moolenbroek 			t_result(result);
573*00b67f09SDavid van Moolenbroek 		}
574*00b67f09SDavid van Moolenbroek 		(void)fclose(fp);
575*00b67f09SDavid van Moolenbroek 	} else {
576*00b67f09SDavid van Moolenbroek 		t_info("Missing datafile dns_name_isabsolute_data\n");
577*00b67f09SDavid van Moolenbroek 		t_result(result);
578*00b67f09SDavid van Moolenbroek 	}
579*00b67f09SDavid van Moolenbroek }
580*00b67f09SDavid van Moolenbroek 
581*00b67f09SDavid van Moolenbroek static const char *a8 =	"dns_name_hash(name, case_sensitive) returns "
582*00b67f09SDavid van Moolenbroek 		"a hash of 'name' which is case_sensitive if case_sensitive "
583*00b67f09SDavid van Moolenbroek 		"is true";
584*00b67f09SDavid van Moolenbroek 
585*00b67f09SDavid van Moolenbroek /*%
586*00b67f09SDavid van Moolenbroek  * a9 merged with a8.
587*00b67f09SDavid van Moolenbroek  */
588*00b67f09SDavid van Moolenbroek 
589*00b67f09SDavid van Moolenbroek static int
test_dns_name_hash(char * test_name1,char * test_name2,isc_boolean_t csh_match,isc_boolean_t cish_match)590*00b67f09SDavid van Moolenbroek test_dns_name_hash(char *test_name1, char *test_name2,
591*00b67f09SDavid van Moolenbroek 		isc_boolean_t csh_match, isc_boolean_t cish_match) {
592*00b67f09SDavid van Moolenbroek 	int		rval;
593*00b67f09SDavid van Moolenbroek 	int		failures;
594*00b67f09SDavid van Moolenbroek 	isc_boolean_t	match;
595*00b67f09SDavid van Moolenbroek 	unsigned int	hash1;
596*00b67f09SDavid van Moolenbroek 	unsigned int	hash2;
597*00b67f09SDavid van Moolenbroek 	dns_fixedname_t	fixed1;
598*00b67f09SDavid van Moolenbroek 	dns_fixedname_t	fixed2;
599*00b67f09SDavid van Moolenbroek 	dns_name_t	*dns_name1;
600*00b67f09SDavid van Moolenbroek 	dns_name_t	*dns_name2;
601*00b67f09SDavid van Moolenbroek 	isc_result_t	result;
602*00b67f09SDavid van Moolenbroek 
603*00b67f09SDavid van Moolenbroek 	rval = T_UNRESOLVED;
604*00b67f09SDavid van Moolenbroek 	failures = 0;
605*00b67f09SDavid van Moolenbroek 
606*00b67f09SDavid van Moolenbroek 	t_info("testing names %s and %s\n", test_name1, test_name2);
607*00b67f09SDavid van Moolenbroek 
608*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&fixed1);
609*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&fixed2);
610*00b67f09SDavid van Moolenbroek 	dns_name1 = dns_fixedname_name(&fixed1);
611*00b67f09SDavid van Moolenbroek 	dns_name2 = dns_fixedname_name(&fixed2);
612*00b67f09SDavid van Moolenbroek 	result = dns_name_fromstring2(dns_name1, test_name1, NULL, 0, NULL);
613*00b67f09SDavid van Moolenbroek 	if (result == ISC_R_SUCCESS) {
614*00b67f09SDavid van Moolenbroek 		result = dns_name_fromstring2(dns_name2, test_name2, NULL,
615*00b67f09SDavid van Moolenbroek 					      0, NULL);
616*00b67f09SDavid van Moolenbroek 		if (result == ISC_R_SUCCESS) {
617*00b67f09SDavid van Moolenbroek 			hash1 = dns_name_hash(dns_name1, ISC_TRUE);
618*00b67f09SDavid van Moolenbroek 			hash2 = dns_name_hash(dns_name2, ISC_TRUE);
619*00b67f09SDavid van Moolenbroek 			match = ISC_FALSE;
620*00b67f09SDavid van Moolenbroek 			if (hash1 == hash2)
621*00b67f09SDavid van Moolenbroek 				match = ISC_TRUE;
622*00b67f09SDavid van Moolenbroek 			if (match != csh_match) {
623*00b67f09SDavid van Moolenbroek 				++failures;
624*00b67f09SDavid van Moolenbroek 				t_info("hash mismatch when ISC_TRUE\n");
625*00b67f09SDavid van Moolenbroek 			}
626*00b67f09SDavid van Moolenbroek 			hash1 = dns_name_hash(dns_name1, ISC_FALSE);
627*00b67f09SDavid van Moolenbroek 			hash2 = dns_name_hash(dns_name2, ISC_FALSE);
628*00b67f09SDavid van Moolenbroek 			match = ISC_FALSE;
629*00b67f09SDavid van Moolenbroek 			if (hash1 == hash2)
630*00b67f09SDavid van Moolenbroek 				match = ISC_TRUE;
631*00b67f09SDavid van Moolenbroek 			if (match != cish_match) {
632*00b67f09SDavid van Moolenbroek 				++failures;
633*00b67f09SDavid van Moolenbroek 				t_info("hash mismatch when ISC_FALSE\n");
634*00b67f09SDavid van Moolenbroek 			}
635*00b67f09SDavid van Moolenbroek 			if (failures == 0)
636*00b67f09SDavid van Moolenbroek 				rval = T_PASS;
637*00b67f09SDavid van Moolenbroek 			else
638*00b67f09SDavid van Moolenbroek 				rval = T_FAIL;
639*00b67f09SDavid van Moolenbroek 		} else {
640*00b67f09SDavid van Moolenbroek 			t_info("dns_name_fromstring2 %s failed, result = %s\n",
641*00b67f09SDavid van Moolenbroek 				test_name2, dns_result_totext(result));
642*00b67f09SDavid van Moolenbroek 		}
643*00b67f09SDavid van Moolenbroek 	} else {
644*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromstring2 %s failed, result = %s\n",
645*00b67f09SDavid van Moolenbroek 				test_name1, dns_result_totext(result));
646*00b67f09SDavid van Moolenbroek 	}
647*00b67f09SDavid van Moolenbroek 	return (rval);
648*00b67f09SDavid van Moolenbroek }
649*00b67f09SDavid van Moolenbroek 
650*00b67f09SDavid van Moolenbroek static void
t_dns_name_hash(void)651*00b67f09SDavid van Moolenbroek t_dns_name_hash(void) {
652*00b67f09SDavid van Moolenbroek 	int	line;
653*00b67f09SDavid van Moolenbroek 	int	cnt;
654*00b67f09SDavid van Moolenbroek 	int	result;
655*00b67f09SDavid van Moolenbroek 	char	*p;
656*00b67f09SDavid van Moolenbroek 	FILE	*fp;
657*00b67f09SDavid van Moolenbroek 
658*00b67f09SDavid van Moolenbroek 	t_assert("dns_name_hash", 1, T_REQUIRED, "%s", a8);
659*00b67f09SDavid van Moolenbroek 
660*00b67f09SDavid van Moolenbroek 	result = T_UNRESOLVED;
661*00b67f09SDavid van Moolenbroek 	fp = fopen("dns_name_hash_data", "r");
662*00b67f09SDavid van Moolenbroek 	if (fp != NULL) {
663*00b67f09SDavid van Moolenbroek 		line = 0;
664*00b67f09SDavid van Moolenbroek 		while ((p = t_fgetbs(fp)) != NULL) {
665*00b67f09SDavid van Moolenbroek 
666*00b67f09SDavid van Moolenbroek 			++line;
667*00b67f09SDavid van Moolenbroek 
668*00b67f09SDavid van Moolenbroek 			/*
669*00b67f09SDavid van Moolenbroek 			 * Skip comment lines.
670*00b67f09SDavid van Moolenbroek 			 */
671*00b67f09SDavid van Moolenbroek 			if ((isspace((unsigned char)*p)) || (*p == '#')) {
672*00b67f09SDavid van Moolenbroek 				(void)free(p);
673*00b67f09SDavid van Moolenbroek 				continue;
674*00b67f09SDavid van Moolenbroek 			}
675*00b67f09SDavid van Moolenbroek 
676*00b67f09SDavid van Moolenbroek 			cnt = bustline(p, Tokens);
677*00b67f09SDavid van Moolenbroek 			if (cnt == 4) {
678*00b67f09SDavid van Moolenbroek 				/*
679*00b67f09SDavid van Moolenbroek 				 * name1, name2, exp match value if
680*00b67f09SDavid van Moolenbroek 				 * case_sensitive true,
681*00b67f09SDavid van Moolenbroek 				 * exp match value of case_sensitive false
682*00b67f09SDavid van Moolenbroek 				 */
683*00b67f09SDavid van Moolenbroek 				result = test_dns_name_hash(
684*00b67f09SDavid van Moolenbroek 						Tokens[0],
685*00b67f09SDavid van Moolenbroek 						Tokens[1],
686*00b67f09SDavid van Moolenbroek 						atoi(Tokens[2]) == 0 ?
687*00b67f09SDavid van Moolenbroek 							ISC_FALSE : ISC_TRUE,
688*00b67f09SDavid van Moolenbroek 						atoi(Tokens[3]) == 0 ?
689*00b67f09SDavid van Moolenbroek 							ISC_FALSE : ISC_TRUE);
690*00b67f09SDavid van Moolenbroek 			} else {
691*00b67f09SDavid van Moolenbroek 				t_info("bad datafile format at line %d\n",
692*00b67f09SDavid van Moolenbroek 						line);
693*00b67f09SDavid van Moolenbroek 			}
694*00b67f09SDavid van Moolenbroek 
695*00b67f09SDavid van Moolenbroek 			(void)free(p);
696*00b67f09SDavid van Moolenbroek 			t_result(result);
697*00b67f09SDavid van Moolenbroek 		}
698*00b67f09SDavid van Moolenbroek 		(void)fclose(fp);
699*00b67f09SDavid van Moolenbroek 	} else {
700*00b67f09SDavid van Moolenbroek 		t_info("Missing datafile dns_name_hash_data\n");
701*00b67f09SDavid van Moolenbroek 		t_result(result);
702*00b67f09SDavid van Moolenbroek 	}
703*00b67f09SDavid van Moolenbroek }
704*00b67f09SDavid van Moolenbroek 
705*00b67f09SDavid van Moolenbroek static const char *a10 =
706*00b67f09SDavid van Moolenbroek 		"dns_name_fullcompare(name1, name2, orderp, nlabelsp) "
707*00b67f09SDavid van Moolenbroek 		"returns the DNSSEC ordering relationship between name1 and "
708*00b67f09SDavid van Moolenbroek 		"name2, sets orderp to -1 if name1 < name2, to 0 if "
709*00b67f09SDavid van Moolenbroek 		"name1 == name2, or to 1 if name1 > name2, sets nlabelsp "
710*00b67f09SDavid van Moolenbroek 		"to the number of labels name1 and name2 have in common, "
711*00b67f09SDavid van Moolenbroek 		"and sets nbitsp to the number of bits name1 and name2 "
712*00b67f09SDavid van Moolenbroek 		"have in common";
713*00b67f09SDavid van Moolenbroek 
714*00b67f09SDavid van Moolenbroek /*%
715*00b67f09SDavid van Moolenbroek  * a11 thru a22 merged into a10.
716*00b67f09SDavid van Moolenbroek  */
717*00b67f09SDavid van Moolenbroek static const char *
dns_namereln_to_text(dns_namereln_t reln)718*00b67f09SDavid van Moolenbroek dns_namereln_to_text(dns_namereln_t reln) {
719*00b67f09SDavid van Moolenbroek 	const char *p;
720*00b67f09SDavid van Moolenbroek 
721*00b67f09SDavid van Moolenbroek 	if (reln == dns_namereln_contains)
722*00b67f09SDavid van Moolenbroek 		p = "contains";
723*00b67f09SDavid van Moolenbroek 	else if (reln == dns_namereln_subdomain)
724*00b67f09SDavid van Moolenbroek 		p = "subdomain";
725*00b67f09SDavid van Moolenbroek 	else if (reln == dns_namereln_equal)
726*00b67f09SDavid van Moolenbroek 		p = "equal";
727*00b67f09SDavid van Moolenbroek 	else if (reln == dns_namereln_none)
728*00b67f09SDavid van Moolenbroek 		p = "none";
729*00b67f09SDavid van Moolenbroek 	else if (reln == dns_namereln_commonancestor)
730*00b67f09SDavid van Moolenbroek 		p = "commonancestor";
731*00b67f09SDavid van Moolenbroek 	else
732*00b67f09SDavid van Moolenbroek 		p = "unknown";
733*00b67f09SDavid van Moolenbroek 
734*00b67f09SDavid van Moolenbroek 	return (p);
735*00b67f09SDavid van Moolenbroek }
736*00b67f09SDavid van Moolenbroek 
737*00b67f09SDavid van Moolenbroek static int
test_dns_name_fullcompare(char * name1,char * name2,dns_namereln_t exp_dns_reln,int exp_order,int exp_nlabels)738*00b67f09SDavid van Moolenbroek test_dns_name_fullcompare(char *name1, char *name2,
739*00b67f09SDavid van Moolenbroek 			  dns_namereln_t exp_dns_reln,
740*00b67f09SDavid van Moolenbroek 			  int exp_order, int exp_nlabels)
741*00b67f09SDavid van Moolenbroek {
742*00b67f09SDavid van Moolenbroek 	int		result;
743*00b67f09SDavid van Moolenbroek 	int		nfails;
744*00b67f09SDavid van Moolenbroek 	int		order;
745*00b67f09SDavid van Moolenbroek 	unsigned int	nlabels;
746*00b67f09SDavid van Moolenbroek 	dns_fixedname_t fixed1;
747*00b67f09SDavid van Moolenbroek 	dns_fixedname_t fixed2;
748*00b67f09SDavid van Moolenbroek 	dns_name_t	*dns_name1;
749*00b67f09SDavid van Moolenbroek 	dns_name_t	*dns_name2;
750*00b67f09SDavid van Moolenbroek 	isc_result_t	dns_result;
751*00b67f09SDavid van Moolenbroek 	dns_namereln_t	dns_reln;
752*00b67f09SDavid van Moolenbroek 
753*00b67f09SDavid van Moolenbroek 	nfails = 0;
754*00b67f09SDavid van Moolenbroek 	result = T_UNRESOLVED;
755*00b67f09SDavid van Moolenbroek 
756*00b67f09SDavid van Moolenbroek 
757*00b67f09SDavid van Moolenbroek 	t_info("testing names %s and %s for relation %s\n", name1, name2,
758*00b67f09SDavid van Moolenbroek 	       dns_namereln_to_text(exp_dns_reln));
759*00b67f09SDavid van Moolenbroek 
760*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&fixed1);
761*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&fixed2);
762*00b67f09SDavid van Moolenbroek 	dns_name1 = dns_fixedname_name(&fixed1);
763*00b67f09SDavid van Moolenbroek 	dns_name2 = dns_fixedname_name(&fixed2);
764*00b67f09SDavid van Moolenbroek 	dns_result = dns_name_fromstring2(dns_name1, name1, NULL, 0, NULL);
765*00b67f09SDavid van Moolenbroek 	if (dns_result == ISC_R_SUCCESS) {
766*00b67f09SDavid van Moolenbroek 		dns_result = dns_name_fromstring2(dns_name2, name2, NULL,
767*00b67f09SDavid van Moolenbroek 						  0, NULL);
768*00b67f09SDavid van Moolenbroek 		if (dns_result == ISC_R_SUCCESS) {
769*00b67f09SDavid van Moolenbroek 			dns_reln = dns_name_fullcompare(dns_name1, dns_name2,
770*00b67f09SDavid van Moolenbroek 					&order, &nlabels);
771*00b67f09SDavid van Moolenbroek 
772*00b67f09SDavid van Moolenbroek 			if (dns_reln != exp_dns_reln) {
773*00b67f09SDavid van Moolenbroek 				++nfails;
774*00b67f09SDavid van Moolenbroek 				t_info("expected relationship of %s, got %s\n",
775*00b67f09SDavid van Moolenbroek 					dns_namereln_to_text(exp_dns_reln),
776*00b67f09SDavid van Moolenbroek 					dns_namereln_to_text(dns_reln));
777*00b67f09SDavid van Moolenbroek 			}
778*00b67f09SDavid van Moolenbroek 			/*
779*00b67f09SDavid van Moolenbroek 			 * Normalize order.
780*00b67f09SDavid van Moolenbroek 			 */
781*00b67f09SDavid van Moolenbroek 			if (order < 0)
782*00b67f09SDavid van Moolenbroek 				order = -1;
783*00b67f09SDavid van Moolenbroek 			else if (order > 0)
784*00b67f09SDavid van Moolenbroek 				order = 1;
785*00b67f09SDavid van Moolenbroek 			if (order != exp_order) {
786*00b67f09SDavid van Moolenbroek 				++nfails;
787*00b67f09SDavid van Moolenbroek 				t_info("expected ordering %d, got %d\n",
788*00b67f09SDavid van Moolenbroek 						exp_order, order);
789*00b67f09SDavid van Moolenbroek 			}
790*00b67f09SDavid van Moolenbroek 			if ((exp_nlabels >= 0) &&
791*00b67f09SDavid van Moolenbroek 			    (nlabels != (unsigned int)exp_nlabels)) {
792*00b67f09SDavid van Moolenbroek 				++nfails;
793*00b67f09SDavid van Moolenbroek 				t_info("expecting %d labels, got %d\n",
794*00b67f09SDavid van Moolenbroek 				       exp_nlabels, nlabels);
795*00b67f09SDavid van Moolenbroek 			}
796*00b67f09SDavid van Moolenbroek 			if (nfails == 0)
797*00b67f09SDavid van Moolenbroek 				result = T_PASS;
798*00b67f09SDavid van Moolenbroek 			else
799*00b67f09SDavid van Moolenbroek 				result = T_FAIL;
800*00b67f09SDavid van Moolenbroek 		} else {
801*00b67f09SDavid van Moolenbroek 			t_info("dns_name_fromstring2 failed, result == %s\n",
802*00b67f09SDavid van Moolenbroek 			       dns_result_totext(result));
803*00b67f09SDavid van Moolenbroek 		}
804*00b67f09SDavid van Moolenbroek 	} else {
805*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromstring2 failed, result == %s\n",
806*00b67f09SDavid van Moolenbroek 		       dns_result_totext(result));
807*00b67f09SDavid van Moolenbroek 	}
808*00b67f09SDavid van Moolenbroek 
809*00b67f09SDavid van Moolenbroek 	return (result);
810*00b67f09SDavid van Moolenbroek }
811*00b67f09SDavid van Moolenbroek 
812*00b67f09SDavid van Moolenbroek static void
t_dns_name_fullcompare(void)813*00b67f09SDavid van Moolenbroek t_dns_name_fullcompare(void) {
814*00b67f09SDavid van Moolenbroek 	int		line;
815*00b67f09SDavid van Moolenbroek 	int		cnt;
816*00b67f09SDavid van Moolenbroek 	int		result;
817*00b67f09SDavid van Moolenbroek 	char		*p;
818*00b67f09SDavid van Moolenbroek 	FILE		*fp;
819*00b67f09SDavid van Moolenbroek 	dns_namereln_t	reln;
820*00b67f09SDavid van Moolenbroek 
821*00b67f09SDavid van Moolenbroek 	t_assert("dns_name_fullcompare", 1, T_REQUIRED, "%s", a10);
822*00b67f09SDavid van Moolenbroek 
823*00b67f09SDavid van Moolenbroek 	result = T_UNRESOLVED;
824*00b67f09SDavid van Moolenbroek 	fp = fopen("dns_name_fullcompare_data", "r");
825*00b67f09SDavid van Moolenbroek 	if (fp != NULL) {
826*00b67f09SDavid van Moolenbroek 		line = 0;
827*00b67f09SDavid van Moolenbroek 		while ((p = t_fgetbs(fp)) != NULL) {
828*00b67f09SDavid van Moolenbroek 			++line;
829*00b67f09SDavid van Moolenbroek 
830*00b67f09SDavid van Moolenbroek 			/*
831*00b67f09SDavid van Moolenbroek 			 * Skip comment lines.
832*00b67f09SDavid van Moolenbroek 			 */
833*00b67f09SDavid van Moolenbroek 			if ((isspace((unsigned char)*p)) || (*p == '#')) {
834*00b67f09SDavid van Moolenbroek 				(void)free(p);
835*00b67f09SDavid van Moolenbroek 				continue;
836*00b67f09SDavid van Moolenbroek 			}
837*00b67f09SDavid van Moolenbroek 
838*00b67f09SDavid van Moolenbroek 			cnt = bustline(p, Tokens);
839*00b67f09SDavid van Moolenbroek 			if (cnt == 6) {
840*00b67f09SDavid van Moolenbroek 				/*
841*00b67f09SDavid van Moolenbroek 				 * name1, name2, exp_reln, exp_order,
842*00b67f09SDavid van Moolenbroek 				 * exp_nlabels
843*00b67f09SDavid van Moolenbroek 				 */
844*00b67f09SDavid van Moolenbroek 				if (!strcmp(Tokens[2], "none"))
845*00b67f09SDavid van Moolenbroek 					reln = dns_namereln_none;
846*00b67f09SDavid van Moolenbroek 				else if (!strcmp(Tokens[2], "contains"))
847*00b67f09SDavid van Moolenbroek 					reln = dns_namereln_contains;
848*00b67f09SDavid van Moolenbroek 				else if (!strcmp(Tokens[2], "subdomain"))
849*00b67f09SDavid van Moolenbroek 					reln = dns_namereln_subdomain;
850*00b67f09SDavid van Moolenbroek 				else if (!strcmp(Tokens[2], "equal"))
851*00b67f09SDavid van Moolenbroek 					reln = dns_namereln_equal;
852*00b67f09SDavid van Moolenbroek 				else if (!strcmp(Tokens[2], "commonancestor"))
853*00b67f09SDavid van Moolenbroek 					reln = dns_namereln_commonancestor;
854*00b67f09SDavid van Moolenbroek 				else {
855*00b67f09SDavid van Moolenbroek 					t_info("bad format at line %d\n", line);
856*00b67f09SDavid van Moolenbroek 					(void)free(p);
857*00b67f09SDavid van Moolenbroek 					continue;
858*00b67f09SDavid van Moolenbroek 				}
859*00b67f09SDavid van Moolenbroek 				result = test_dns_name_fullcompare(
860*00b67f09SDavid van Moolenbroek 						Tokens[0],
861*00b67f09SDavid van Moolenbroek 						Tokens[1],
862*00b67f09SDavid van Moolenbroek 						reln,
863*00b67f09SDavid van Moolenbroek 						atoi(Tokens[3]),
864*00b67f09SDavid van Moolenbroek 						atoi(Tokens[4]));
865*00b67f09SDavid van Moolenbroek 			} else {
866*00b67f09SDavid van Moolenbroek 				t_info("bad format at line %d\n", line);
867*00b67f09SDavid van Moolenbroek 			}
868*00b67f09SDavid van Moolenbroek 
869*00b67f09SDavid van Moolenbroek 			(void)free(p);
870*00b67f09SDavid van Moolenbroek 			t_result(result);
871*00b67f09SDavid van Moolenbroek 		}
872*00b67f09SDavid van Moolenbroek 		(void)fclose(fp);
873*00b67f09SDavid van Moolenbroek 	} else {
874*00b67f09SDavid van Moolenbroek 		t_info("Missing datafile dns_name_fullcompare_data\n");
875*00b67f09SDavid van Moolenbroek 		t_result(result);
876*00b67f09SDavid van Moolenbroek 	}
877*00b67f09SDavid van Moolenbroek }
878*00b67f09SDavid van Moolenbroek 
879*00b67f09SDavid van Moolenbroek static const char *a23 =
880*00b67f09SDavid van Moolenbroek 		"dns_name_compare(name1, name2) returns information about "
881*00b67f09SDavid van Moolenbroek 		"the relative ordering under the DNSSEC ordering relationship "
882*00b67f09SDavid van Moolenbroek 		"of name1 and name2";
883*00b67f09SDavid van Moolenbroek 
884*00b67f09SDavid van Moolenbroek /*%
885*00b67f09SDavid van Moolenbroek  * a24 thru a29 merged into a23.
886*00b67f09SDavid van Moolenbroek  */
887*00b67f09SDavid van Moolenbroek 
888*00b67f09SDavid van Moolenbroek static int
test_dns_name_compare(char * name1,char * name2,int exp_order)889*00b67f09SDavid van Moolenbroek test_dns_name_compare(char *name1, char *name2, int exp_order) {
890*00b67f09SDavid van Moolenbroek 	int		result;
891*00b67f09SDavid van Moolenbroek 	int		order;
892*00b67f09SDavid van Moolenbroek 	isc_result_t	dns_result;
893*00b67f09SDavid van Moolenbroek 	dns_fixedname_t fixed1;
894*00b67f09SDavid van Moolenbroek 	dns_fixedname_t fixed2;
895*00b67f09SDavid van Moolenbroek 	dns_name_t	*dns_name1;
896*00b67f09SDavid van Moolenbroek 	dns_name_t	*dns_name2;
897*00b67f09SDavid van Moolenbroek 
898*00b67f09SDavid van Moolenbroek 	result = T_UNRESOLVED;
899*00b67f09SDavid van Moolenbroek 
900*00b67f09SDavid van Moolenbroek 	t_info("testing %s %s %s\n", name1,
901*00b67f09SDavid van Moolenbroek 	       exp_order == 0 ? "==": (exp_order == -1 ? "<" : ">"),
902*00b67f09SDavid van Moolenbroek 	       name2);
903*00b67f09SDavid van Moolenbroek 
904*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&fixed1);
905*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&fixed2);
906*00b67f09SDavid van Moolenbroek 	dns_name1 = dns_fixedname_name(&fixed1);
907*00b67f09SDavid van Moolenbroek 	dns_name2 = dns_fixedname_name(&fixed2);
908*00b67f09SDavid van Moolenbroek 	dns_result = dns_name_fromstring2(dns_name1, name1, NULL, 0, NULL);
909*00b67f09SDavid van Moolenbroek 	if (dns_result == ISC_R_SUCCESS) {
910*00b67f09SDavid van Moolenbroek 		dns_result = dns_name_fromstring2(dns_name2, name2, NULL,
911*00b67f09SDavid van Moolenbroek 						  0, NULL);
912*00b67f09SDavid van Moolenbroek 		if (dns_result == ISC_R_SUCCESS) {
913*00b67f09SDavid van Moolenbroek 			order = dns_name_compare(dns_name1, dns_name2);
914*00b67f09SDavid van Moolenbroek 			/*
915*00b67f09SDavid van Moolenbroek 			 * Normalize order.
916*00b67f09SDavid van Moolenbroek 			 */
917*00b67f09SDavid van Moolenbroek 			if (order < 0)
918*00b67f09SDavid van Moolenbroek 				order = -1;
919*00b67f09SDavid van Moolenbroek 			else if (order > 0)
920*00b67f09SDavid van Moolenbroek 				order = 1;
921*00b67f09SDavid van Moolenbroek 			if (order != exp_order) {
922*00b67f09SDavid van Moolenbroek 				t_info("expected order of %d, got %d\n",
923*00b67f09SDavid van Moolenbroek 				       exp_order, order);
924*00b67f09SDavid van Moolenbroek 				result = T_FAIL;
925*00b67f09SDavid van Moolenbroek 			} else
926*00b67f09SDavid van Moolenbroek 				result = T_PASS;
927*00b67f09SDavid van Moolenbroek 		} else {
928*00b67f09SDavid van Moolenbroek 			t_info("dns_name_fromstring2 failed, result == %s\n",
929*00b67f09SDavid van Moolenbroek 					dns_result_totext(result));
930*00b67f09SDavid van Moolenbroek 		}
931*00b67f09SDavid van Moolenbroek 	} else {
932*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromstring2 failed, result == %s\n",
933*00b67f09SDavid van Moolenbroek 				dns_result_totext(result));
934*00b67f09SDavid van Moolenbroek 	}
935*00b67f09SDavid van Moolenbroek 
936*00b67f09SDavid van Moolenbroek 	return (result);
937*00b67f09SDavid van Moolenbroek }
938*00b67f09SDavid van Moolenbroek 
939*00b67f09SDavid van Moolenbroek static void
t_dns_name_compare(void)940*00b67f09SDavid van Moolenbroek t_dns_name_compare(void) {
941*00b67f09SDavid van Moolenbroek 	int		line;
942*00b67f09SDavid van Moolenbroek 	int		cnt;
943*00b67f09SDavid van Moolenbroek 	int		result;
944*00b67f09SDavid van Moolenbroek 	char		*p;
945*00b67f09SDavid van Moolenbroek 	FILE		*fp;
946*00b67f09SDavid van Moolenbroek 
947*00b67f09SDavid van Moolenbroek 	t_assert("dns_name_compare", 1, T_REQUIRED, "%s", a23);
948*00b67f09SDavid van Moolenbroek 
949*00b67f09SDavid van Moolenbroek 	result = T_UNRESOLVED;
950*00b67f09SDavid van Moolenbroek 	fp = fopen("dns_name_compare_data", "r");
951*00b67f09SDavid van Moolenbroek 	if (fp != NULL) {
952*00b67f09SDavid van Moolenbroek 		line = 0;
953*00b67f09SDavid van Moolenbroek 		while ((p = t_fgetbs(fp)) != NULL) {
954*00b67f09SDavid van Moolenbroek 
955*00b67f09SDavid van Moolenbroek 			++line;
956*00b67f09SDavid van Moolenbroek 
957*00b67f09SDavid van Moolenbroek 			/*
958*00b67f09SDavid van Moolenbroek 			 * Skip comment lines.
959*00b67f09SDavid van Moolenbroek 			 */
960*00b67f09SDavid van Moolenbroek 			if ((isspace((unsigned char)*p)) || (*p == '#')) {
961*00b67f09SDavid van Moolenbroek 				(void)free(p);
962*00b67f09SDavid van Moolenbroek 				continue;
963*00b67f09SDavid van Moolenbroek 			}
964*00b67f09SDavid van Moolenbroek 
965*00b67f09SDavid van Moolenbroek 			cnt = bustline(p, Tokens);
966*00b67f09SDavid van Moolenbroek 			if (cnt == 3) {
967*00b67f09SDavid van Moolenbroek 				/*
968*00b67f09SDavid van Moolenbroek 				 * name1, name2, order.
969*00b67f09SDavid van Moolenbroek 				 */
970*00b67f09SDavid van Moolenbroek 				result = test_dns_name_compare(
971*00b67f09SDavid van Moolenbroek 						Tokens[0],
972*00b67f09SDavid van Moolenbroek 						Tokens[1],
973*00b67f09SDavid van Moolenbroek 						atoi(Tokens[2]));
974*00b67f09SDavid van Moolenbroek 			} else {
975*00b67f09SDavid van Moolenbroek 				t_info("bad datafile format at line %d\n",
976*00b67f09SDavid van Moolenbroek 				       line);
977*00b67f09SDavid van Moolenbroek 			}
978*00b67f09SDavid van Moolenbroek 
979*00b67f09SDavid van Moolenbroek 			(void)free(p);
980*00b67f09SDavid van Moolenbroek 			t_result(result);
981*00b67f09SDavid van Moolenbroek 		}
982*00b67f09SDavid van Moolenbroek 		(void)fclose(fp);
983*00b67f09SDavid van Moolenbroek 	} else {
984*00b67f09SDavid van Moolenbroek 		t_info("Missing datafile dns_name_compare_data\n");
985*00b67f09SDavid van Moolenbroek 		t_result(result);
986*00b67f09SDavid van Moolenbroek 	}
987*00b67f09SDavid van Moolenbroek }
988*00b67f09SDavid van Moolenbroek 
989*00b67f09SDavid van Moolenbroek static const char *a30 =
990*00b67f09SDavid van Moolenbroek 		"dns_name_rdatacompare(name1, name2) returns information "
991*00b67f09SDavid van Moolenbroek 		"about the relative ordering of name1 and name2 as if they "
992*00b67f09SDavid van Moolenbroek 		"are part of rdata in DNSSEC canonical form";
993*00b67f09SDavid van Moolenbroek 
994*00b67f09SDavid van Moolenbroek /*%
995*00b67f09SDavid van Moolenbroek  * a31, a32 merged into a30.
996*00b67f09SDavid van Moolenbroek  */
997*00b67f09SDavid van Moolenbroek 
998*00b67f09SDavid van Moolenbroek static int
test_dns_name_rdatacompare(char * name1,char * name2,int exp_order)999*00b67f09SDavid van Moolenbroek test_dns_name_rdatacompare(char *name1, char *name2, int exp_order) {
1000*00b67f09SDavid van Moolenbroek 	int		result;
1001*00b67f09SDavid van Moolenbroek 	int		order;
1002*00b67f09SDavid van Moolenbroek 	isc_result_t	dns_result;
1003*00b67f09SDavid van Moolenbroek 	dns_fixedname_t fixed1;
1004*00b67f09SDavid van Moolenbroek 	dns_fixedname_t fixed2;
1005*00b67f09SDavid van Moolenbroek 	dns_name_t	*dns_name1;
1006*00b67f09SDavid van Moolenbroek 	dns_name_t	*dns_name2;
1007*00b67f09SDavid van Moolenbroek 
1008*00b67f09SDavid van Moolenbroek 	result = T_UNRESOLVED;
1009*00b67f09SDavid van Moolenbroek 
1010*00b67f09SDavid van Moolenbroek 	t_info("testing %s %s %s\n", name1,
1011*00b67f09SDavid van Moolenbroek 	       exp_order == 0 ? "==": (exp_order == -1 ? "<" : ">"), name2);
1012*00b67f09SDavid van Moolenbroek 
1013*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&fixed1);
1014*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&fixed2);
1015*00b67f09SDavid van Moolenbroek 	dns_name1 = dns_fixedname_name(&fixed1);
1016*00b67f09SDavid van Moolenbroek 	dns_name2 = dns_fixedname_name(&fixed2);
1017*00b67f09SDavid van Moolenbroek 	dns_result = dns_name_fromstring2(dns_name1, name1, NULL, 0, NULL);
1018*00b67f09SDavid van Moolenbroek 	if (dns_result == ISC_R_SUCCESS) {
1019*00b67f09SDavid van Moolenbroek 		dns_result = dns_name_fromstring2(dns_name2, name2, NULL,
1020*00b67f09SDavid van Moolenbroek 						  0, NULL);
1021*00b67f09SDavid van Moolenbroek 		if (dns_result == ISC_R_SUCCESS) {
1022*00b67f09SDavid van Moolenbroek 			order = dns_name_rdatacompare(dns_name1, dns_name2);
1023*00b67f09SDavid van Moolenbroek 			/*
1024*00b67f09SDavid van Moolenbroek 			 * Normalize order.
1025*00b67f09SDavid van Moolenbroek 			 */
1026*00b67f09SDavid van Moolenbroek 			if (order < 0)
1027*00b67f09SDavid van Moolenbroek 				order = -1;
1028*00b67f09SDavid van Moolenbroek 			else if (order > 0)
1029*00b67f09SDavid van Moolenbroek 				order = 1;
1030*00b67f09SDavid van Moolenbroek 			if (order != exp_order) {
1031*00b67f09SDavid van Moolenbroek 				t_info("expected order of %d, got %d\n",
1032*00b67f09SDavid van Moolenbroek 				       exp_order, order);
1033*00b67f09SDavid van Moolenbroek 				result = T_FAIL;
1034*00b67f09SDavid van Moolenbroek 			} else
1035*00b67f09SDavid van Moolenbroek 				result = T_PASS;
1036*00b67f09SDavid van Moolenbroek 		} else {
1037*00b67f09SDavid van Moolenbroek 			t_info("dns_name_fromstring2 failed, result == %s\n",
1038*00b67f09SDavid van Moolenbroek 			       dns_result_totext(result));
1039*00b67f09SDavid van Moolenbroek 		}
1040*00b67f09SDavid van Moolenbroek 	} else {
1041*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromstring2 failed, result == %s\n",
1042*00b67f09SDavid van Moolenbroek 		       dns_result_totext(result));
1043*00b67f09SDavid van Moolenbroek 	}
1044*00b67f09SDavid van Moolenbroek 
1045*00b67f09SDavid van Moolenbroek 	return (result);
1046*00b67f09SDavid van Moolenbroek }
1047*00b67f09SDavid van Moolenbroek 
1048*00b67f09SDavid van Moolenbroek static void
t_dns_name_rdatacompare(void)1049*00b67f09SDavid van Moolenbroek t_dns_name_rdatacompare(void) {
1050*00b67f09SDavid van Moolenbroek 	int		line;
1051*00b67f09SDavid van Moolenbroek 	int		cnt;
1052*00b67f09SDavid van Moolenbroek 	int		result;
1053*00b67f09SDavid van Moolenbroek 	char		*p;
1054*00b67f09SDavid van Moolenbroek 	FILE		*fp;
1055*00b67f09SDavid van Moolenbroek 
1056*00b67f09SDavid van Moolenbroek 	t_assert("dns_name_rdatacompare", 1, T_REQUIRED, "%s", a30);
1057*00b67f09SDavid van Moolenbroek 
1058*00b67f09SDavid van Moolenbroek 	result = T_UNRESOLVED;
1059*00b67f09SDavid van Moolenbroek 	fp = fopen("dns_name_rdatacompare_data", "r");
1060*00b67f09SDavid van Moolenbroek 	if (fp != NULL) {
1061*00b67f09SDavid van Moolenbroek 		line = 0;
1062*00b67f09SDavid van Moolenbroek 		while ((p = t_fgetbs(fp)) != NULL) {
1063*00b67f09SDavid van Moolenbroek 
1064*00b67f09SDavid van Moolenbroek 			++line;
1065*00b67f09SDavid van Moolenbroek 
1066*00b67f09SDavid van Moolenbroek 			/*
1067*00b67f09SDavid van Moolenbroek 			 * Skip comment lines.
1068*00b67f09SDavid van Moolenbroek 			 */
1069*00b67f09SDavid van Moolenbroek 			if ((isspace((unsigned char)*p)) || (*p == '#')) {
1070*00b67f09SDavid van Moolenbroek 				(void)free(p);
1071*00b67f09SDavid van Moolenbroek 				continue;
1072*00b67f09SDavid van Moolenbroek 			}
1073*00b67f09SDavid van Moolenbroek 
1074*00b67f09SDavid van Moolenbroek 			cnt = bustline(p, Tokens);
1075*00b67f09SDavid van Moolenbroek 			if (cnt == 3) {
1076*00b67f09SDavid van Moolenbroek 				/*
1077*00b67f09SDavid van Moolenbroek 				 * name1, name2, order.
1078*00b67f09SDavid van Moolenbroek 				 */
1079*00b67f09SDavid van Moolenbroek 				result = test_dns_name_rdatacompare(
1080*00b67f09SDavid van Moolenbroek 						Tokens[0],
1081*00b67f09SDavid van Moolenbroek 						Tokens[1],
1082*00b67f09SDavid van Moolenbroek 						atoi(Tokens[2]));
1083*00b67f09SDavid van Moolenbroek 			} else {
1084*00b67f09SDavid van Moolenbroek 				t_info("bad datafile format at line %d\n",
1085*00b67f09SDavid van Moolenbroek 				       line);
1086*00b67f09SDavid van Moolenbroek 			}
1087*00b67f09SDavid van Moolenbroek 
1088*00b67f09SDavid van Moolenbroek 			(void)free(p);
1089*00b67f09SDavid van Moolenbroek 			t_result(result);
1090*00b67f09SDavid van Moolenbroek 		}
1091*00b67f09SDavid van Moolenbroek 		(void)fclose(fp);
1092*00b67f09SDavid van Moolenbroek 	} else {
1093*00b67f09SDavid van Moolenbroek 		t_info("Missing datafile dns_name_rdatacompare_data\n");
1094*00b67f09SDavid van Moolenbroek 		t_result(result);
1095*00b67f09SDavid van Moolenbroek 	}
1096*00b67f09SDavid van Moolenbroek }
1097*00b67f09SDavid van Moolenbroek 
1098*00b67f09SDavid van Moolenbroek 
1099*00b67f09SDavid van Moolenbroek static const char *a33 =
1100*00b67f09SDavid van Moolenbroek 		"when name1 is a subdomain of name2, "
1101*00b67f09SDavid van Moolenbroek 		"dns_name_issubdomain(name1, name2) returns true, "
1102*00b67f09SDavid van Moolenbroek 		"otherwise it returns false.";
1103*00b67f09SDavid van Moolenbroek 
1104*00b67f09SDavid van Moolenbroek /*%
1105*00b67f09SDavid van Moolenbroek  * a34 merged into a33.
1106*00b67f09SDavid van Moolenbroek  */
1107*00b67f09SDavid van Moolenbroek 
1108*00b67f09SDavid van Moolenbroek static int
test_dns_name_issubdomain(char * name1,char * name2,isc_boolean_t exp_rval)1109*00b67f09SDavid van Moolenbroek test_dns_name_issubdomain(char *name1, char *name2, isc_boolean_t exp_rval) {
1110*00b67f09SDavid van Moolenbroek 	int		result;
1111*00b67f09SDavid van Moolenbroek 	isc_boolean_t	rval;
1112*00b67f09SDavid van Moolenbroek 	isc_result_t	dns_result;
1113*00b67f09SDavid van Moolenbroek 	dns_fixedname_t fixed1;
1114*00b67f09SDavid van Moolenbroek 	dns_fixedname_t fixed2;
1115*00b67f09SDavid van Moolenbroek 	dns_name_t	*dns_name1;
1116*00b67f09SDavid van Moolenbroek 	dns_name_t	*dns_name2;
1117*00b67f09SDavid van Moolenbroek 
1118*00b67f09SDavid van Moolenbroek 	result = T_UNRESOLVED;
1119*00b67f09SDavid van Moolenbroek 
1120*00b67f09SDavid van Moolenbroek 	t_info("testing %s %s a subdomain of %s\n", name1,
1121*00b67f09SDavid van Moolenbroek 	       exp_rval == 0 ? "is not" : "is", name2);
1122*00b67f09SDavid van Moolenbroek 
1123*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&fixed1);
1124*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&fixed2);
1125*00b67f09SDavid van Moolenbroek 	dns_name1 = dns_fixedname_name(&fixed1);
1126*00b67f09SDavid van Moolenbroek 	dns_name2 = dns_fixedname_name(&fixed2);
1127*00b67f09SDavid van Moolenbroek 	dns_result = dns_name_fromstring2(dns_name1, name1, NULL, 0, NULL);
1128*00b67f09SDavid van Moolenbroek 	if (dns_result == ISC_R_SUCCESS) {
1129*00b67f09SDavid van Moolenbroek 		dns_result = dns_name_fromstring2(dns_name2, name2, NULL,
1130*00b67f09SDavid van Moolenbroek 						  0, NULL);
1131*00b67f09SDavid van Moolenbroek 		if (dns_result == ISC_R_SUCCESS) {
1132*00b67f09SDavid van Moolenbroek 			rval = dns_name_issubdomain(dns_name1, dns_name2);
1133*00b67f09SDavid van Moolenbroek 
1134*00b67f09SDavid van Moolenbroek 			if (rval != exp_rval) {
1135*00b67f09SDavid van Moolenbroek 				t_info("expected return value of %s, got %s\n",
1136*00b67f09SDavid van Moolenbroek 				       exp_rval == ISC_TRUE ? "true" : "false",
1137*00b67f09SDavid van Moolenbroek 				       rval == ISC_TRUE ? "true" : "false");
1138*00b67f09SDavid van Moolenbroek 				result = T_FAIL;
1139*00b67f09SDavid van Moolenbroek 			} else
1140*00b67f09SDavid van Moolenbroek 				result = T_PASS;
1141*00b67f09SDavid van Moolenbroek 		} else {
1142*00b67f09SDavid van Moolenbroek 			t_info("dns_name_fromstring2 failed, result == %s\n",
1143*00b67f09SDavid van Moolenbroek 			       dns_result_totext(result));
1144*00b67f09SDavid van Moolenbroek 		}
1145*00b67f09SDavid van Moolenbroek 	} else {
1146*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromstring2 failed, result == %s\n",
1147*00b67f09SDavid van Moolenbroek 		       dns_result_totext(result));
1148*00b67f09SDavid van Moolenbroek 	}
1149*00b67f09SDavid van Moolenbroek 
1150*00b67f09SDavid van Moolenbroek 	return (result);
1151*00b67f09SDavid van Moolenbroek }
1152*00b67f09SDavid van Moolenbroek 
1153*00b67f09SDavid van Moolenbroek static void
t_dns_name_issubdomain(void)1154*00b67f09SDavid van Moolenbroek t_dns_name_issubdomain(void) {
1155*00b67f09SDavid van Moolenbroek 	int		line;
1156*00b67f09SDavid van Moolenbroek 	int		cnt;
1157*00b67f09SDavid van Moolenbroek 	int		result;
1158*00b67f09SDavid van Moolenbroek 	char		*p;
1159*00b67f09SDavid van Moolenbroek 	FILE		*fp;
1160*00b67f09SDavid van Moolenbroek 
1161*00b67f09SDavid van Moolenbroek 	t_assert("dns_name_issubdomain", 1, T_REQUIRED, "%s", a33);
1162*00b67f09SDavid van Moolenbroek 
1163*00b67f09SDavid van Moolenbroek 	result = T_UNRESOLVED;
1164*00b67f09SDavid van Moolenbroek 	fp = fopen("dns_name_issubdomain_data", "r");
1165*00b67f09SDavid van Moolenbroek 	if (fp != NULL) {
1166*00b67f09SDavid van Moolenbroek 		line = 0;
1167*00b67f09SDavid van Moolenbroek 		while ((p = t_fgetbs(fp)) != NULL) {
1168*00b67f09SDavid van Moolenbroek 
1169*00b67f09SDavid van Moolenbroek 			++line;
1170*00b67f09SDavid van Moolenbroek 
1171*00b67f09SDavid van Moolenbroek 			/*
1172*00b67f09SDavid van Moolenbroek 			 * Skip comment lines.
1173*00b67f09SDavid van Moolenbroek 			 */
1174*00b67f09SDavid van Moolenbroek 			if ((isspace((unsigned char)*p)) || (*p == '#')) {
1175*00b67f09SDavid van Moolenbroek 				(void)free(p);
1176*00b67f09SDavid van Moolenbroek 				continue;
1177*00b67f09SDavid van Moolenbroek 			}
1178*00b67f09SDavid van Moolenbroek 
1179*00b67f09SDavid van Moolenbroek 			cnt = bustline(p, Tokens);
1180*00b67f09SDavid van Moolenbroek 			if (cnt == 3) {
1181*00b67f09SDavid van Moolenbroek 				/*
1182*00b67f09SDavid van Moolenbroek 				 * name1, name2, issubdomain_p.
1183*00b67f09SDavid van Moolenbroek 				 */
1184*00b67f09SDavid van Moolenbroek 				result = test_dns_name_issubdomain(
1185*00b67f09SDavid van Moolenbroek 						Tokens[0],
1186*00b67f09SDavid van Moolenbroek 						Tokens[1],
1187*00b67f09SDavid van Moolenbroek 						atoi(Tokens[2]) == 0 ?
1188*00b67f09SDavid van Moolenbroek 						ISC_FALSE : ISC_TRUE);
1189*00b67f09SDavid van Moolenbroek 			} else {
1190*00b67f09SDavid van Moolenbroek 				t_info("bad datafile format at line %d\n",
1191*00b67f09SDavid van Moolenbroek 				       line);
1192*00b67f09SDavid van Moolenbroek 			}
1193*00b67f09SDavid van Moolenbroek 
1194*00b67f09SDavid van Moolenbroek 			(void)free(p);
1195*00b67f09SDavid van Moolenbroek 			t_result(result);
1196*00b67f09SDavid van Moolenbroek 		}
1197*00b67f09SDavid van Moolenbroek 		(void)fclose(fp);
1198*00b67f09SDavid van Moolenbroek 	} else {
1199*00b67f09SDavid van Moolenbroek 		t_info("Missing datafile dns_name_issubdomain_data\n");
1200*00b67f09SDavid van Moolenbroek 		t_result(result);
1201*00b67f09SDavid van Moolenbroek 	}
1202*00b67f09SDavid van Moolenbroek }
1203*00b67f09SDavid van Moolenbroek 
1204*00b67f09SDavid van Moolenbroek static const char *a35 =
1205*00b67f09SDavid van Moolenbroek 		"dns_name_countlabels(name) returns the number "
1206*00b67f09SDavid van Moolenbroek 		"of labels in name";
1207*00b67f09SDavid van Moolenbroek 
1208*00b67f09SDavid van Moolenbroek static int
test_dns_name_countlabels(char * test_name,unsigned int exp_nlabels)1209*00b67f09SDavid van Moolenbroek test_dns_name_countlabels(char *test_name, unsigned int exp_nlabels) {
1210*00b67f09SDavid van Moolenbroek 	int		result;
1211*00b67f09SDavid van Moolenbroek 	unsigned int	nlabels;
1212*00b67f09SDavid van Moolenbroek 	isc_result_t	dns_result;
1213*00b67f09SDavid van Moolenbroek 	dns_fixedname_t	fixed;
1214*00b67f09SDavid van Moolenbroek 	dns_name_t	*dns_name;
1215*00b67f09SDavid van Moolenbroek 
1216*00b67f09SDavid van Moolenbroek 	result = T_UNRESOLVED;
1217*00b67f09SDavid van Moolenbroek 
1218*00b67f09SDavid van Moolenbroek 	t_info("testing %s\n", test_name);
1219*00b67f09SDavid van Moolenbroek 
1220*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&fixed);
1221*00b67f09SDavid van Moolenbroek 	dns_name = dns_fixedname_name(&fixed);
1222*00b67f09SDavid van Moolenbroek 	dns_result = dns_name_fromstring2(dns_name, test_name, NULL, 0, NULL);
1223*00b67f09SDavid van Moolenbroek 	if (dns_result == ISC_R_SUCCESS) {
1224*00b67f09SDavid van Moolenbroek 		nlabels = dns_name_countlabels(dns_name);
1225*00b67f09SDavid van Moolenbroek 
1226*00b67f09SDavid van Moolenbroek 		if (nlabels != exp_nlabels) {
1227*00b67f09SDavid van Moolenbroek 			t_info("expected %d, got %d\n", exp_nlabels, nlabels);
1228*00b67f09SDavid van Moolenbroek 			result = T_FAIL;
1229*00b67f09SDavid van Moolenbroek 		} else
1230*00b67f09SDavid van Moolenbroek 			result = T_PASS;
1231*00b67f09SDavid van Moolenbroek 	} else {
1232*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromstring2 failed, result == %s\n",
1233*00b67f09SDavid van Moolenbroek 		       dns_result_totext(dns_result));
1234*00b67f09SDavid van Moolenbroek 	}
1235*00b67f09SDavid van Moolenbroek 
1236*00b67f09SDavid van Moolenbroek 	return (result);
1237*00b67f09SDavid van Moolenbroek }
1238*00b67f09SDavid van Moolenbroek 
1239*00b67f09SDavid van Moolenbroek static void
t_dns_name_countlabels(void)1240*00b67f09SDavid van Moolenbroek t_dns_name_countlabels(void) {
1241*00b67f09SDavid van Moolenbroek 	int		line;
1242*00b67f09SDavid van Moolenbroek 	int		cnt;
1243*00b67f09SDavid van Moolenbroek 	int		result;
1244*00b67f09SDavid van Moolenbroek 	char		*p;
1245*00b67f09SDavid van Moolenbroek 	FILE		*fp;
1246*00b67f09SDavid van Moolenbroek 
1247*00b67f09SDavid van Moolenbroek 	t_assert("dns_name_countlabels", 1, T_REQUIRED, "%s", a35);
1248*00b67f09SDavid van Moolenbroek 
1249*00b67f09SDavid van Moolenbroek 	result = T_UNRESOLVED;
1250*00b67f09SDavid van Moolenbroek 	fp = fopen("dns_name_countlabels_data", "r");
1251*00b67f09SDavid van Moolenbroek 	if (fp != NULL) {
1252*00b67f09SDavid van Moolenbroek 		line = 0;
1253*00b67f09SDavid van Moolenbroek 		while ((p = t_fgetbs(fp)) != NULL) {
1254*00b67f09SDavid van Moolenbroek 
1255*00b67f09SDavid van Moolenbroek 			++line;
1256*00b67f09SDavid van Moolenbroek 
1257*00b67f09SDavid van Moolenbroek 			/*
1258*00b67f09SDavid van Moolenbroek 			 * Skip comment lines.
1259*00b67f09SDavid van Moolenbroek 			 */
1260*00b67f09SDavid van Moolenbroek 			if ((isspace((unsigned char)*p)) || (*p == '#')) {
1261*00b67f09SDavid van Moolenbroek 				(void)free(p);
1262*00b67f09SDavid van Moolenbroek 				continue;
1263*00b67f09SDavid van Moolenbroek 			}
1264*00b67f09SDavid van Moolenbroek 
1265*00b67f09SDavid van Moolenbroek 			cnt = bustline(p, Tokens);
1266*00b67f09SDavid van Moolenbroek 			if (cnt == 2) {
1267*00b67f09SDavid van Moolenbroek 				/*
1268*00b67f09SDavid van Moolenbroek 				 * name, nlabels.
1269*00b67f09SDavid van Moolenbroek 				 */
1270*00b67f09SDavid van Moolenbroek 				result = test_dns_name_countlabels(Tokens[0],
1271*00b67f09SDavid van Moolenbroek 							      atoi(Tokens[1]));
1272*00b67f09SDavid van Moolenbroek 			} else {
1273*00b67f09SDavid van Moolenbroek 				t_info("bad format at line %d\n", line);
1274*00b67f09SDavid van Moolenbroek 			}
1275*00b67f09SDavid van Moolenbroek 
1276*00b67f09SDavid van Moolenbroek 			(void)free(p);
1277*00b67f09SDavid van Moolenbroek 			t_result(result);
1278*00b67f09SDavid van Moolenbroek 		}
1279*00b67f09SDavid van Moolenbroek 		(void)fclose(fp);
1280*00b67f09SDavid van Moolenbroek 	} else {
1281*00b67f09SDavid van Moolenbroek 		t_info("Missing datafile dns_name_countlabels_data\n");
1282*00b67f09SDavid van Moolenbroek 		t_result(result);
1283*00b67f09SDavid van Moolenbroek 	}
1284*00b67f09SDavid van Moolenbroek }
1285*00b67f09SDavid van Moolenbroek 
1286*00b67f09SDavid van Moolenbroek static const char *a36 =
1287*00b67f09SDavid van Moolenbroek 		"when n is less than the number of labels in name, "
1288*00b67f09SDavid van Moolenbroek 		"dns_name_getlabel(name, n, labelp) initializes labelp "
1289*00b67f09SDavid van Moolenbroek 		"to point to the nth label in name";
1290*00b67f09SDavid van Moolenbroek 
1291*00b67f09SDavid van Moolenbroek /*%
1292*00b67f09SDavid van Moolenbroek  * The strategy here is two take two dns names with a shared label in
1293*00b67f09SDavid van Moolenbroek  * different positions, get the two labels and compare them for equality.
1294*00b67f09SDavid van Moolenbroek  * If they don't match, dns_name_getlabel failed.
1295*00b67f09SDavid van Moolenbroek  */
1296*00b67f09SDavid van Moolenbroek 
1297*00b67f09SDavid van Moolenbroek static int
test_dns_name_getlabel(char * test_name1,int label1_pos,char * test_name2,int label2_pos)1298*00b67f09SDavid van Moolenbroek test_dns_name_getlabel(char *test_name1, int label1_pos, char *test_name2,
1299*00b67f09SDavid van Moolenbroek 		       int label2_pos)
1300*00b67f09SDavid van Moolenbroek {
1301*00b67f09SDavid van Moolenbroek 	int		result;
1302*00b67f09SDavid van Moolenbroek 	int		nfails;
1303*00b67f09SDavid van Moolenbroek 	unsigned int	cnt;
1304*00b67f09SDavid van Moolenbroek 	unsigned char	*p;
1305*00b67f09SDavid van Moolenbroek 	unsigned char	*q;
1306*00b67f09SDavid van Moolenbroek 	dns_fixedname_t fixed1;
1307*00b67f09SDavid van Moolenbroek 	dns_fixedname_t fixed2;
1308*00b67f09SDavid van Moolenbroek 	dns_name_t	*dns_name1;
1309*00b67f09SDavid van Moolenbroek 	dns_name_t	*dns_name2;
1310*00b67f09SDavid van Moolenbroek 	dns_label_t	dns_label1;
1311*00b67f09SDavid van Moolenbroek 	dns_label_t	dns_label2;
1312*00b67f09SDavid van Moolenbroek 	isc_result_t	dns_result;
1313*00b67f09SDavid van Moolenbroek 
1314*00b67f09SDavid van Moolenbroek 	nfails = 0;
1315*00b67f09SDavid van Moolenbroek 	result = T_UNRESOLVED;
1316*00b67f09SDavid van Moolenbroek 
1317*00b67f09SDavid van Moolenbroek 	t_info("testing with %s and %s\n", test_name1, test_name2);
1318*00b67f09SDavid van Moolenbroek 
1319*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&fixed1);
1320*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&fixed2);
1321*00b67f09SDavid van Moolenbroek 	dns_name1 = dns_fixedname_name(&fixed1);
1322*00b67f09SDavid van Moolenbroek 	dns_name2 = dns_fixedname_name(&fixed2);
1323*00b67f09SDavid van Moolenbroek 	dns_result = dns_name_fromstring2(dns_name1, test_name1, NULL,
1324*00b67f09SDavid van Moolenbroek 					  0, NULL);
1325*00b67f09SDavid van Moolenbroek 	if (dns_result == ISC_R_SUCCESS) {
1326*00b67f09SDavid van Moolenbroek 		dns_result = dns_name_fromstring2(dns_name2, test_name2, NULL,
1327*00b67f09SDavid van Moolenbroek 						  0, NULL);
1328*00b67f09SDavid van Moolenbroek 		if (dns_result == ISC_R_SUCCESS) {
1329*00b67f09SDavid van Moolenbroek 			dns_name_getlabel(dns_name1, label1_pos, &dns_label1);
1330*00b67f09SDavid van Moolenbroek 			dns_name_getlabel(dns_name2, label2_pos, &dns_label2);
1331*00b67f09SDavid van Moolenbroek 			if (dns_label1.length != dns_label2.length) {
1332*00b67f09SDavid van Moolenbroek 				t_info("label lengths differ\n");
1333*00b67f09SDavid van Moolenbroek 				++nfails;
1334*00b67f09SDavid van Moolenbroek 			}
1335*00b67f09SDavid van Moolenbroek 			p = dns_label1.base;
1336*00b67f09SDavid van Moolenbroek 			q = dns_label2.base;
1337*00b67f09SDavid van Moolenbroek 			for (cnt = 0; cnt < dns_label1.length; ++cnt) {
1338*00b67f09SDavid van Moolenbroek 				if (*p++ != *q++) {
1339*00b67f09SDavid van Moolenbroek 					t_info("labels differ at position %d",
1340*00b67f09SDavid van Moolenbroek 					       cnt);
1341*00b67f09SDavid van Moolenbroek 					++nfails;
1342*00b67f09SDavid van Moolenbroek 				}
1343*00b67f09SDavid van Moolenbroek 			}
1344*00b67f09SDavid van Moolenbroek 			if (nfails == 0)
1345*00b67f09SDavid van Moolenbroek 				result = T_PASS;
1346*00b67f09SDavid van Moolenbroek 			else
1347*00b67f09SDavid van Moolenbroek 				result = T_FAIL;
1348*00b67f09SDavid van Moolenbroek 		} else {
1349*00b67f09SDavid van Moolenbroek 			t_info("dns_name_fromstring2 failed, result == %s",
1350*00b67f09SDavid van Moolenbroek 			       dns_result_totext(result));
1351*00b67f09SDavid van Moolenbroek 		}
1352*00b67f09SDavid van Moolenbroek 	} else {
1353*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromstring2 failed, result == %s",
1354*00b67f09SDavid van Moolenbroek 		       dns_result_totext(result));
1355*00b67f09SDavid van Moolenbroek 	}
1356*00b67f09SDavid van Moolenbroek 	return (result);
1357*00b67f09SDavid van Moolenbroek }
1358*00b67f09SDavid van Moolenbroek 
1359*00b67f09SDavid van Moolenbroek static void
t_dns_name_getlabel(void)1360*00b67f09SDavid van Moolenbroek t_dns_name_getlabel(void) {
1361*00b67f09SDavid van Moolenbroek 	int		line;
1362*00b67f09SDavid van Moolenbroek 	int		cnt;
1363*00b67f09SDavid van Moolenbroek 	int		result;
1364*00b67f09SDavid van Moolenbroek 	char		*p;
1365*00b67f09SDavid van Moolenbroek 	FILE		*fp;
1366*00b67f09SDavid van Moolenbroek 
1367*00b67f09SDavid van Moolenbroek 	t_assert("dns_name_getlabel", 1, T_REQUIRED, "%s", a36);
1368*00b67f09SDavid van Moolenbroek 
1369*00b67f09SDavid van Moolenbroek 	result = T_UNRESOLVED;
1370*00b67f09SDavid van Moolenbroek 	fp = fopen("dns_name_getlabel_data", "r");
1371*00b67f09SDavid van Moolenbroek 	if (fp != NULL) {
1372*00b67f09SDavid van Moolenbroek 		line = 0;
1373*00b67f09SDavid van Moolenbroek 		while ((p = t_fgetbs(fp)) != NULL) {
1374*00b67f09SDavid van Moolenbroek 
1375*00b67f09SDavid van Moolenbroek 			++line;
1376*00b67f09SDavid van Moolenbroek 
1377*00b67f09SDavid van Moolenbroek 			/*
1378*00b67f09SDavid van Moolenbroek 			 * Skip comment lines.
1379*00b67f09SDavid van Moolenbroek 			 */
1380*00b67f09SDavid van Moolenbroek 			if ((isspace((unsigned char)*p)) || (*p == '#')) {
1381*00b67f09SDavid van Moolenbroek 				(void)free(p);
1382*00b67f09SDavid van Moolenbroek 				continue;
1383*00b67f09SDavid van Moolenbroek 			}
1384*00b67f09SDavid van Moolenbroek 
1385*00b67f09SDavid van Moolenbroek 			cnt = bustline(p, Tokens);
1386*00b67f09SDavid van Moolenbroek 			if (cnt == 4) {
1387*00b67f09SDavid van Moolenbroek 				/*
1388*00b67f09SDavid van Moolenbroek 				 * name1, name2, nlabels.
1389*00b67f09SDavid van Moolenbroek 				 */
1390*00b67f09SDavid van Moolenbroek 				result = test_dns_name_getlabel(Tokens[0],
1391*00b67f09SDavid van Moolenbroek 							      atoi(Tokens[1]),
1392*00b67f09SDavid van Moolenbroek 								   Tokens[2],
1393*00b67f09SDavid van Moolenbroek 							      atoi(Tokens[3]));
1394*00b67f09SDavid van Moolenbroek 			} else {
1395*00b67f09SDavid van Moolenbroek 				t_info("bad format at line %d\n", line);
1396*00b67f09SDavid van Moolenbroek 			}
1397*00b67f09SDavid van Moolenbroek 
1398*00b67f09SDavid van Moolenbroek 			(void)free(p);
1399*00b67f09SDavid van Moolenbroek 			t_result(result);
1400*00b67f09SDavid van Moolenbroek 		}
1401*00b67f09SDavid van Moolenbroek 		(void)fclose(fp);
1402*00b67f09SDavid van Moolenbroek 	} else {
1403*00b67f09SDavid van Moolenbroek 		t_info("Missing datafile dns_name_getlabel_data\n");
1404*00b67f09SDavid van Moolenbroek 		t_result(result);
1405*00b67f09SDavid van Moolenbroek 	}
1406*00b67f09SDavid van Moolenbroek }
1407*00b67f09SDavid van Moolenbroek 
1408*00b67f09SDavid van Moolenbroek static const char *a37 =
1409*00b67f09SDavid van Moolenbroek 		"when source contains at least first + n labels, "
1410*00b67f09SDavid van Moolenbroek 		"dns_name_getlabelsequence(source, first, n, target) "
1411*00b67f09SDavid van Moolenbroek 		"initializes target to point to the n label sequence of "
1412*00b67f09SDavid van Moolenbroek 		"labels in source starting with first";
1413*00b67f09SDavid van Moolenbroek 
1414*00b67f09SDavid van Moolenbroek /*%
1415*00b67f09SDavid van Moolenbroek  * We adopt a similiar strategy to that used by the dns_name_getlabel test.
1416*00b67f09SDavid van Moolenbroek  */
1417*00b67f09SDavid van Moolenbroek 
1418*00b67f09SDavid van Moolenbroek static int
test_dns_name_getlabelsequence(char * test_name1,int label1_start,char * test_name2,int label2_start,int range)1419*00b67f09SDavid van Moolenbroek test_dns_name_getlabelsequence(char *test_name1, int label1_start,
1420*00b67f09SDavid van Moolenbroek 			       char *test_name2, int label2_start, int range)
1421*00b67f09SDavid van Moolenbroek {
1422*00b67f09SDavid van Moolenbroek 	int		result;
1423*00b67f09SDavid van Moolenbroek 	int		nfails;
1424*00b67f09SDavid van Moolenbroek 	unsigned int	cnt;
1425*00b67f09SDavid van Moolenbroek 	unsigned char	*p;
1426*00b67f09SDavid van Moolenbroek 	unsigned char	*q;
1427*00b67f09SDavid van Moolenbroek 	dns_fixedname_t fixed1;
1428*00b67f09SDavid van Moolenbroek 	dns_fixedname_t fixed2;
1429*00b67f09SDavid van Moolenbroek 	dns_name_t	*dns_name1;
1430*00b67f09SDavid van Moolenbroek 	dns_name_t	*dns_name2;
1431*00b67f09SDavid van Moolenbroek 	dns_name_t	dns_targetname1;
1432*00b67f09SDavid van Moolenbroek 	dns_name_t	dns_targetname2;
1433*00b67f09SDavid van Moolenbroek 	isc_result_t	dns_result;
1434*00b67f09SDavid van Moolenbroek 	isc_buffer_t	buffer1;
1435*00b67f09SDavid van Moolenbroek 	isc_buffer_t	buffer2;
1436*00b67f09SDavid van Moolenbroek 	unsigned char	junk1[BUFLEN];
1437*00b67f09SDavid van Moolenbroek 	unsigned char	junk2[BUFLEN];
1438*00b67f09SDavid van Moolenbroek 
1439*00b67f09SDavid van Moolenbroek 	nfails = 0;
1440*00b67f09SDavid van Moolenbroek 	result = T_UNRESOLVED;
1441*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&fixed1);
1442*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&fixed2);
1443*00b67f09SDavid van Moolenbroek 	dns_name1 = dns_fixedname_name(&fixed1);
1444*00b67f09SDavid van Moolenbroek 	dns_name2 = dns_fixedname_name(&fixed2);
1445*00b67f09SDavid van Moolenbroek 	dns_result = dns_name_fromstring2(dns_name1, test_name1, NULL,
1446*00b67f09SDavid van Moolenbroek 					  0, NULL);
1447*00b67f09SDavid van Moolenbroek 	if (dns_result == ISC_R_SUCCESS) {
1448*00b67f09SDavid van Moolenbroek 		dns_result = dns_name_fromstring2(dns_name2, test_name2, NULL,
1449*00b67f09SDavid van Moolenbroek 						  0, NULL);
1450*00b67f09SDavid van Moolenbroek 		if (dns_result == ISC_R_SUCCESS) {
1451*00b67f09SDavid van Moolenbroek 			t_info("testing %s %s\n", test_name1, test_name2);
1452*00b67f09SDavid van Moolenbroek 			dns_name_init(&dns_targetname1, NULL);
1453*00b67f09SDavid van Moolenbroek 			dns_name_init(&dns_targetname2, NULL);
1454*00b67f09SDavid van Moolenbroek 			dns_name_getlabelsequence(dns_name1, label1_start,
1455*00b67f09SDavid van Moolenbroek 						  range, &dns_targetname1);
1456*00b67f09SDavid van Moolenbroek 			dns_name_getlabelsequence(dns_name2, label2_start,
1457*00b67f09SDavid van Moolenbroek 						  range, &dns_targetname2);
1458*00b67f09SDavid van Moolenbroek 
1459*00b67f09SDavid van Moolenbroek 			/*
1460*00b67f09SDavid van Moolenbroek 			 * Now convert both targets to text for comparison.
1461*00b67f09SDavid van Moolenbroek 			 */
1462*00b67f09SDavid van Moolenbroek 			isc_buffer_init(&buffer1, junk1, BUFLEN);
1463*00b67f09SDavid van Moolenbroek 			isc_buffer_init(&buffer2, junk2, BUFLEN);
1464*00b67f09SDavid van Moolenbroek 			dns_name_totext(&dns_targetname1, ISC_TRUE, &buffer1);
1465*00b67f09SDavid van Moolenbroek 			dns_name_totext(&dns_targetname2, ISC_TRUE, &buffer2);
1466*00b67f09SDavid van Moolenbroek 			if (buffer1.used == buffer2.used) {
1467*00b67f09SDavid van Moolenbroek 				p = buffer1.base;
1468*00b67f09SDavid van Moolenbroek 				q = buffer2.base;
1469*00b67f09SDavid van Moolenbroek 				for (cnt = 0; cnt < buffer1.used; ++cnt) {
1470*00b67f09SDavid van Moolenbroek 					if (*p != *q) {
1471*00b67f09SDavid van Moolenbroek 						++nfails;
1472*00b67f09SDavid van Moolenbroek 						t_info("names differ at %d\n",
1473*00b67f09SDavid van Moolenbroek 						       cnt);
1474*00b67f09SDavid van Moolenbroek 						break;
1475*00b67f09SDavid van Moolenbroek 					}
1476*00b67f09SDavid van Moolenbroek 					++p; ++q;
1477*00b67f09SDavid van Moolenbroek 				}
1478*00b67f09SDavid van Moolenbroek 			} else {
1479*00b67f09SDavid van Moolenbroek 				++nfails;
1480*00b67f09SDavid van Moolenbroek 				t_info("lengths differ\n");
1481*00b67f09SDavid van Moolenbroek 			}
1482*00b67f09SDavid van Moolenbroek 			if (nfails == 0)
1483*00b67f09SDavid van Moolenbroek 				result = T_PASS;
1484*00b67f09SDavid van Moolenbroek 			else
1485*00b67f09SDavid van Moolenbroek 				result = T_FAIL;
1486*00b67f09SDavid van Moolenbroek 		} else {
1487*00b67f09SDavid van Moolenbroek 			t_info("dns_name_fromstring2 failed, result == %s",
1488*00b67f09SDavid van Moolenbroek 			       dns_result_totext(dns_result));
1489*00b67f09SDavid van Moolenbroek 		}
1490*00b67f09SDavid van Moolenbroek 	} else {
1491*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromstring2 failed, result == %s",
1492*00b67f09SDavid van Moolenbroek 		       dns_result_totext(dns_result));
1493*00b67f09SDavid van Moolenbroek 	}
1494*00b67f09SDavid van Moolenbroek 	return (result);
1495*00b67f09SDavid van Moolenbroek }
1496*00b67f09SDavid van Moolenbroek 
1497*00b67f09SDavid van Moolenbroek static void
t_dns_name_getlabelsequence(void)1498*00b67f09SDavid van Moolenbroek t_dns_name_getlabelsequence(void) {
1499*00b67f09SDavid van Moolenbroek 	int		line;
1500*00b67f09SDavid van Moolenbroek 	int		cnt;
1501*00b67f09SDavid van Moolenbroek 	int		result;
1502*00b67f09SDavid van Moolenbroek 	char		*p;
1503*00b67f09SDavid van Moolenbroek 	FILE		*fp;
1504*00b67f09SDavid van Moolenbroek 
1505*00b67f09SDavid van Moolenbroek 	t_assert("dns_name_getlabelsequence", 1, T_REQUIRED, "%s", a37);
1506*00b67f09SDavid van Moolenbroek 
1507*00b67f09SDavid van Moolenbroek 	result = T_UNRESOLVED;
1508*00b67f09SDavid van Moolenbroek 	fp = fopen("dns_name_getlabelsequence_data", "r");
1509*00b67f09SDavid van Moolenbroek 	if (fp != NULL) {
1510*00b67f09SDavid van Moolenbroek 		line = 0;
1511*00b67f09SDavid van Moolenbroek 		while ((p = t_fgetbs(fp)) != NULL) {
1512*00b67f09SDavid van Moolenbroek 
1513*00b67f09SDavid van Moolenbroek 			++line;
1514*00b67f09SDavid van Moolenbroek 
1515*00b67f09SDavid van Moolenbroek 			/*
1516*00b67f09SDavid van Moolenbroek 			 * Skip comment lines.
1517*00b67f09SDavid van Moolenbroek 			 */
1518*00b67f09SDavid van Moolenbroek 			if ((isspace((unsigned char)*p)) || (*p == '#')) {
1519*00b67f09SDavid van Moolenbroek 				(void)free(p);
1520*00b67f09SDavid van Moolenbroek 				continue;
1521*00b67f09SDavid van Moolenbroek 			}
1522*00b67f09SDavid van Moolenbroek 
1523*00b67f09SDavid van Moolenbroek 			cnt = bustline(p, Tokens);
1524*00b67f09SDavid van Moolenbroek 			if (cnt == 5) {
1525*00b67f09SDavid van Moolenbroek 				/*
1526*00b67f09SDavid van Moolenbroek 				 * name1, name2, nlabels.
1527*00b67f09SDavid van Moolenbroek 				 */
1528*00b67f09SDavid van Moolenbroek 				result = test_dns_name_getlabelsequence(
1529*00b67f09SDavid van Moolenbroek 								   Tokens[0],
1530*00b67f09SDavid van Moolenbroek 							      atoi(Tokens[1]),
1531*00b67f09SDavid van Moolenbroek 								   Tokens[2],
1532*00b67f09SDavid van Moolenbroek 							      atoi(Tokens[3]),
1533*00b67f09SDavid van Moolenbroek 							      atoi(Tokens[4]));
1534*00b67f09SDavid van Moolenbroek 			} else {
1535*00b67f09SDavid van Moolenbroek 				t_info("bad format at line %d\n", line);
1536*00b67f09SDavid van Moolenbroek 			}
1537*00b67f09SDavid van Moolenbroek 
1538*00b67f09SDavid van Moolenbroek 			(void)free(p);
1539*00b67f09SDavid van Moolenbroek 			t_result(result);
1540*00b67f09SDavid van Moolenbroek 		}
1541*00b67f09SDavid van Moolenbroek 		(void)fclose(fp);
1542*00b67f09SDavid van Moolenbroek 	} else {
1543*00b67f09SDavid van Moolenbroek 		t_info("Missing datafile dns_name_getlabelsequence_data\n");
1544*00b67f09SDavid van Moolenbroek 		t_result(result);
1545*00b67f09SDavid van Moolenbroek 	}
1546*00b67f09SDavid van Moolenbroek }
1547*00b67f09SDavid van Moolenbroek 
1548*00b67f09SDavid van Moolenbroek static const char *a38 =
1549*00b67f09SDavid van Moolenbroek 		"dns_name_fromregion(name, region) converts a DNS name "
1550*00b67f09SDavid van Moolenbroek 		"from a region representation to a name representation";
1551*00b67f09SDavid van Moolenbroek 
1552*00b67f09SDavid van Moolenbroek static int
test_dns_name_fromregion(char * test_name)1553*00b67f09SDavid van Moolenbroek test_dns_name_fromregion(char *test_name) {
1554*00b67f09SDavid van Moolenbroek 	int		result;
1555*00b67f09SDavid van Moolenbroek 	int		order;
1556*00b67f09SDavid van Moolenbroek 	unsigned int	nlabels;
1557*00b67f09SDavid van Moolenbroek 	isc_result_t	dns_result;
1558*00b67f09SDavid van Moolenbroek 	dns_fixedname_t fixed1;
1559*00b67f09SDavid van Moolenbroek 	dns_name_t	*dns_name1;
1560*00b67f09SDavid van Moolenbroek 	dns_name_t	dns_name2;
1561*00b67f09SDavid van Moolenbroek 	dns_namereln_t	dns_namereln;
1562*00b67f09SDavid van Moolenbroek 	isc_region_t	region;
1563*00b67f09SDavid van Moolenbroek 
1564*00b67f09SDavid van Moolenbroek 	result = T_UNRESOLVED;
1565*00b67f09SDavid van Moolenbroek 
1566*00b67f09SDavid van Moolenbroek 	t_info("testing %s\n", test_name);
1567*00b67f09SDavid van Moolenbroek 
1568*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&fixed1);
1569*00b67f09SDavid van Moolenbroek 	dns_name1 = dns_fixedname_name(&fixed1);
1570*00b67f09SDavid van Moolenbroek 	dns_result = dns_name_fromstring2(dns_name1, test_name, NULL, 0, NULL);
1571*00b67f09SDavid van Moolenbroek 	if (dns_result == ISC_R_SUCCESS) {
1572*00b67f09SDavid van Moolenbroek 
1573*00b67f09SDavid van Moolenbroek 		dns_name_toregion(dns_name1, &region);
1574*00b67f09SDavid van Moolenbroek 
1575*00b67f09SDavid van Moolenbroek 		dns_name_init(&dns_name2, NULL);
1576*00b67f09SDavid van Moolenbroek 		dns_name_fromregion(&dns_name2, &region);
1577*00b67f09SDavid van Moolenbroek 		dns_namereln = dns_name_fullcompare(dns_name1, &dns_name2,
1578*00b67f09SDavid van Moolenbroek 						    &order, &nlabels);
1579*00b67f09SDavid van Moolenbroek 		if (dns_namereln == dns_namereln_equal)
1580*00b67f09SDavid van Moolenbroek 			result = T_PASS;
1581*00b67f09SDavid van Moolenbroek 		else
1582*00b67f09SDavid van Moolenbroek 			result = T_FAIL;
1583*00b67f09SDavid van Moolenbroek 	} else {
1584*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromstring2 failed, result == %s\n",
1585*00b67f09SDavid van Moolenbroek 		       dns_result_totext(result));
1586*00b67f09SDavid van Moolenbroek 	}
1587*00b67f09SDavid van Moolenbroek 	return (result);
1588*00b67f09SDavid van Moolenbroek }
1589*00b67f09SDavid van Moolenbroek 
1590*00b67f09SDavid van Moolenbroek static void
t_dns_name_fromregion(void)1591*00b67f09SDavid van Moolenbroek t_dns_name_fromregion(void) {
1592*00b67f09SDavid van Moolenbroek 	int		line;
1593*00b67f09SDavid van Moolenbroek 	int		cnt;
1594*00b67f09SDavid van Moolenbroek 	int		result;
1595*00b67f09SDavid van Moolenbroek 	char		*p;
1596*00b67f09SDavid van Moolenbroek 	FILE		*fp;
1597*00b67f09SDavid van Moolenbroek 
1598*00b67f09SDavid van Moolenbroek 	t_assert("dns_name_fromregion", 1, T_REQUIRED, "%s", a38);
1599*00b67f09SDavid van Moolenbroek 
1600*00b67f09SDavid van Moolenbroek 	result = T_UNRESOLVED;
1601*00b67f09SDavid van Moolenbroek 	fp = fopen("dns_name_fromregion_data", "r");
1602*00b67f09SDavid van Moolenbroek 	if (fp != NULL) {
1603*00b67f09SDavid van Moolenbroek 		line = 0;
1604*00b67f09SDavid van Moolenbroek 		while ((p = t_fgetbs(fp)) != NULL) {
1605*00b67f09SDavid van Moolenbroek 
1606*00b67f09SDavid van Moolenbroek 			++line;
1607*00b67f09SDavid van Moolenbroek 
1608*00b67f09SDavid van Moolenbroek 			/*
1609*00b67f09SDavid van Moolenbroek 			 * Skip comment lines.
1610*00b67f09SDavid van Moolenbroek 			 */
1611*00b67f09SDavid van Moolenbroek 			if ((isspace((unsigned char)*p)) || (*p == '#')) {
1612*00b67f09SDavid van Moolenbroek 				(void)free(p);
1613*00b67f09SDavid van Moolenbroek 				continue;
1614*00b67f09SDavid van Moolenbroek 			}
1615*00b67f09SDavid van Moolenbroek 
1616*00b67f09SDavid van Moolenbroek 			cnt = bustline(p, Tokens);
1617*00b67f09SDavid van Moolenbroek 			if (cnt == 1) {
1618*00b67f09SDavid van Moolenbroek 				/*
1619*00b67f09SDavid van Moolenbroek 				 * test_name.
1620*00b67f09SDavid van Moolenbroek 				 */
1621*00b67f09SDavid van Moolenbroek 				result = test_dns_name_fromregion(Tokens[0]);
1622*00b67f09SDavid van Moolenbroek 			} else {
1623*00b67f09SDavid van Moolenbroek 				t_info("bad format at line %d\n", line);
1624*00b67f09SDavid van Moolenbroek 			}
1625*00b67f09SDavid van Moolenbroek 
1626*00b67f09SDavid van Moolenbroek 			(void)free(p);
1627*00b67f09SDavid van Moolenbroek 			t_result(result);
1628*00b67f09SDavid van Moolenbroek 		}
1629*00b67f09SDavid van Moolenbroek 		(void)fclose(fp);
1630*00b67f09SDavid van Moolenbroek 	} else {
1631*00b67f09SDavid van Moolenbroek 		t_info("Missing datafile dns_name_fromregion_data\n");
1632*00b67f09SDavid van Moolenbroek 		t_result(result);
1633*00b67f09SDavid van Moolenbroek 	}
1634*00b67f09SDavid van Moolenbroek }
1635*00b67f09SDavid van Moolenbroek 
1636*00b67f09SDavid van Moolenbroek static const char *a39 =
1637*00b67f09SDavid van Moolenbroek 		"dns_name_toregion(name, region) converts a DNS name "
1638*00b67f09SDavid van Moolenbroek 		"from a region representation to a name representation";
1639*00b67f09SDavid van Moolenbroek 
1640*00b67f09SDavid van Moolenbroek static void
t_dns_name_toregion(void)1641*00b67f09SDavid van Moolenbroek t_dns_name_toregion(void) {
1642*00b67f09SDavid van Moolenbroek 	int		line;
1643*00b67f09SDavid van Moolenbroek 	int		cnt;
1644*00b67f09SDavid van Moolenbroek 	int		result;
1645*00b67f09SDavid van Moolenbroek 	char		*p;
1646*00b67f09SDavid van Moolenbroek 	FILE		*fp;
1647*00b67f09SDavid van Moolenbroek 
1648*00b67f09SDavid van Moolenbroek 	t_assert("dns_name_toregion", 1, T_REQUIRED, "%s", a39);
1649*00b67f09SDavid van Moolenbroek 
1650*00b67f09SDavid van Moolenbroek 	result = T_UNRESOLVED;
1651*00b67f09SDavid van Moolenbroek 	fp = fopen("dns_name_toregion_data", "r");
1652*00b67f09SDavid van Moolenbroek 	if (fp != NULL) {
1653*00b67f09SDavid van Moolenbroek 		line = 0;
1654*00b67f09SDavid van Moolenbroek 		while ((p = t_fgetbs(fp)) != NULL) {
1655*00b67f09SDavid van Moolenbroek 
1656*00b67f09SDavid van Moolenbroek 			++line;
1657*00b67f09SDavid van Moolenbroek 
1658*00b67f09SDavid van Moolenbroek 			/*
1659*00b67f09SDavid van Moolenbroek 			 * Skip comment lines.
1660*00b67f09SDavid van Moolenbroek 			 */
1661*00b67f09SDavid van Moolenbroek 			if ((isspace((unsigned char)*p)) || (*p == '#')) {
1662*00b67f09SDavid van Moolenbroek 				(void)free(p);
1663*00b67f09SDavid van Moolenbroek 				continue;
1664*00b67f09SDavid van Moolenbroek 			}
1665*00b67f09SDavid van Moolenbroek 
1666*00b67f09SDavid van Moolenbroek 			cnt = bustline(p, Tokens);
1667*00b67f09SDavid van Moolenbroek 			if (cnt == 1) {
1668*00b67f09SDavid van Moolenbroek 				/*
1669*00b67f09SDavid van Moolenbroek 				 * test_name.
1670*00b67f09SDavid van Moolenbroek 				 */
1671*00b67f09SDavid van Moolenbroek 				result = test_dns_name_fromregion(Tokens[0]);
1672*00b67f09SDavid van Moolenbroek 			} else {
1673*00b67f09SDavid van Moolenbroek 				t_info("bad format at line %d\n", line);
1674*00b67f09SDavid van Moolenbroek 			}
1675*00b67f09SDavid van Moolenbroek 
1676*00b67f09SDavid van Moolenbroek 			(void)free(p);
1677*00b67f09SDavid van Moolenbroek 			t_result(result);
1678*00b67f09SDavid van Moolenbroek 		}
1679*00b67f09SDavid van Moolenbroek 		(void)fclose(fp);
1680*00b67f09SDavid van Moolenbroek 	} else {
1681*00b67f09SDavid van Moolenbroek 		t_info("Missing datafile dns_name_toregion_data\n");
1682*00b67f09SDavid van Moolenbroek 		t_result(result);
1683*00b67f09SDavid van Moolenbroek 	}
1684*00b67f09SDavid van Moolenbroek }
1685*00b67f09SDavid van Moolenbroek 
1686*00b67f09SDavid van Moolenbroek static const char *a40 =
1687*00b67f09SDavid van Moolenbroek 		"dns_name_fromtext(name, source, origin, downcase, target) "
1688*00b67f09SDavid van Moolenbroek 		"converts the textual representation of a DNS name at source "
1689*00b67f09SDavid van Moolenbroek 		"into uncompressed wire form at target, appending origin to "
1690*00b67f09SDavid van Moolenbroek 		"the converted name if origin is non-NULL and converting "
1691*00b67f09SDavid van Moolenbroek 		"upper case to lower case during conversion "
1692*00b67f09SDavid van Moolenbroek 		"if downcase is true.";
1693*00b67f09SDavid van Moolenbroek 
1694*00b67f09SDavid van Moolenbroek static int
test_dns_name_fromtext(char * test_name1,char * test_name2,char * test_origin,unsigned int downcase)1695*00b67f09SDavid van Moolenbroek test_dns_name_fromtext(char *test_name1, char *test_name2, char *test_origin,
1696*00b67f09SDavid van Moolenbroek 		       unsigned int downcase)
1697*00b67f09SDavid van Moolenbroek {
1698*00b67f09SDavid van Moolenbroek 	int		result;
1699*00b67f09SDavid van Moolenbroek 	int		order;
1700*00b67f09SDavid van Moolenbroek 	unsigned int	nlabels;
1701*00b67f09SDavid van Moolenbroek 	unsigned char	junk1[BUFLEN];
1702*00b67f09SDavid van Moolenbroek 	unsigned char	junk2[BUFLEN];
1703*00b67f09SDavid van Moolenbroek 	unsigned char	junk3[BUFLEN];
1704*00b67f09SDavid van Moolenbroek 	isc_buffer_t	binbuf1;
1705*00b67f09SDavid van Moolenbroek 	isc_buffer_t	binbuf2;
1706*00b67f09SDavid van Moolenbroek 	isc_buffer_t	binbuf3;
1707*00b67f09SDavid van Moolenbroek 	isc_buffer_t	txtbuf1;
1708*00b67f09SDavid van Moolenbroek 	isc_buffer_t	txtbuf2;
1709*00b67f09SDavid van Moolenbroek 	isc_buffer_t	txtbuf3;
1710*00b67f09SDavid van Moolenbroek 	dns_name_t	dns_name1;
1711*00b67f09SDavid van Moolenbroek 	dns_name_t	dns_name2;
1712*00b67f09SDavid van Moolenbroek 	dns_name_t	dns_name3;
1713*00b67f09SDavid van Moolenbroek 	isc_result_t	dns_result;
1714*00b67f09SDavid van Moolenbroek 	dns_namereln_t	dns_namereln;
1715*00b67f09SDavid van Moolenbroek 
1716*00b67f09SDavid van Moolenbroek 	t_info("testing %s %s %s\n", test_name1, test_name2, test_origin);
1717*00b67f09SDavid van Moolenbroek 
1718*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&binbuf1, junk1, BUFLEN);
1719*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&binbuf2, junk2, BUFLEN);
1720*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&binbuf3, junk3, BUFLEN);
1721*00b67f09SDavid van Moolenbroek 
1722*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&txtbuf1, test_name1, strlen(test_name1));
1723*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&txtbuf1, strlen(test_name1));
1724*00b67f09SDavid van Moolenbroek 
1725*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&txtbuf2, test_name2, strlen(test_name2));
1726*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&txtbuf2, strlen(test_name2));
1727*00b67f09SDavid van Moolenbroek 
1728*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&txtbuf3, test_origin, strlen(test_origin));
1729*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&txtbuf3, strlen(test_origin));
1730*00b67f09SDavid van Moolenbroek 	dns_name_init(&dns_name1, NULL);
1731*00b67f09SDavid van Moolenbroek 	dns_name_init(&dns_name2, NULL);
1732*00b67f09SDavid van Moolenbroek 	dns_name_init(&dns_name3, NULL);
1733*00b67f09SDavid van Moolenbroek 	dns_name_setbuffer(&dns_name1, &binbuf1);
1734*00b67f09SDavid van Moolenbroek 	dns_name_setbuffer(&dns_name2, &binbuf2);
1735*00b67f09SDavid van Moolenbroek 	dns_name_setbuffer(&dns_name3, &binbuf3);
1736*00b67f09SDavid van Moolenbroek 
1737*00b67f09SDavid van Moolenbroek 	dns_result = dns_name_fromtext(&dns_name3,  &txtbuf3, NULL, 0,
1738*00b67f09SDavid van Moolenbroek 				       &binbuf3);
1739*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1740*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromtext(dns_name3) failed, result == %s\n",
1741*00b67f09SDavid van Moolenbroek 			dns_result_totext(dns_result));
1742*00b67f09SDavid van Moolenbroek 		return (T_FAIL);
1743*00b67f09SDavid van Moolenbroek 	}
1744*00b67f09SDavid van Moolenbroek 
1745*00b67f09SDavid van Moolenbroek 	dns_result = dns_name_fromtext(&dns_name1, &txtbuf1, &dns_name3,
1746*00b67f09SDavid van Moolenbroek 				       downcase, &binbuf1);
1747*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1748*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromtext(dns_name1) failed, result == %s\n",
1749*00b67f09SDavid van Moolenbroek 		       dns_result_totext(dns_result));
1750*00b67f09SDavid van Moolenbroek 		return (T_FAIL);
1751*00b67f09SDavid van Moolenbroek 	}
1752*00b67f09SDavid van Moolenbroek 
1753*00b67f09SDavid van Moolenbroek 	dns_result = dns_name_fromtext(&dns_name2,  &txtbuf2, NULL, 0,
1754*00b67f09SDavid van Moolenbroek 				       &binbuf2);
1755*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1756*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromtext(dns_name2) failed, result == %s\n",
1757*00b67f09SDavid van Moolenbroek 		       dns_result_totext(dns_result));
1758*00b67f09SDavid van Moolenbroek 		return (T_FAIL);
1759*00b67f09SDavid van Moolenbroek 	}
1760*00b67f09SDavid van Moolenbroek 
1761*00b67f09SDavid van Moolenbroek 	dns_namereln = dns_name_fullcompare(&dns_name1, &dns_name2, &order,
1762*00b67f09SDavid van Moolenbroek 					    &nlabels);
1763*00b67f09SDavid van Moolenbroek 
1764*00b67f09SDavid van Moolenbroek 	if (dns_namereln == dns_namereln_equal)
1765*00b67f09SDavid van Moolenbroek 		result = T_PASS;
1766*00b67f09SDavid van Moolenbroek 	else {
1767*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fullcompare returned %s\n",
1768*00b67f09SDavid van Moolenbroek 		       dns_namereln_to_text(dns_namereln));
1769*00b67f09SDavid van Moolenbroek 		result = T_FAIL;
1770*00b67f09SDavid van Moolenbroek 	}
1771*00b67f09SDavid van Moolenbroek 
1772*00b67f09SDavid van Moolenbroek 	return (result);
1773*00b67f09SDavid van Moolenbroek }
1774*00b67f09SDavid van Moolenbroek 
1775*00b67f09SDavid van Moolenbroek static void
t_dns_name_fromtext(void)1776*00b67f09SDavid van Moolenbroek t_dns_name_fromtext(void) {
1777*00b67f09SDavid van Moolenbroek 	int		line;
1778*00b67f09SDavid van Moolenbroek 	int		cnt;
1779*00b67f09SDavid van Moolenbroek 	int		result;
1780*00b67f09SDavid van Moolenbroek 	char		*p;
1781*00b67f09SDavid van Moolenbroek 	FILE		*fp;
1782*00b67f09SDavid van Moolenbroek 
1783*00b67f09SDavid van Moolenbroek 	t_assert("dns_name_fromtext", 1, T_REQUIRED, "%s", a40);
1784*00b67f09SDavid van Moolenbroek 
1785*00b67f09SDavid van Moolenbroek 	result = T_UNRESOLVED;
1786*00b67f09SDavid van Moolenbroek 	fp = fopen("dns_name_fromtext_data", "r");
1787*00b67f09SDavid van Moolenbroek 	if (fp != NULL) {
1788*00b67f09SDavid van Moolenbroek 		line = 0;
1789*00b67f09SDavid van Moolenbroek 		while ((p = t_fgetbs(fp)) != NULL) {
1790*00b67f09SDavid van Moolenbroek 
1791*00b67f09SDavid van Moolenbroek 			++line;
1792*00b67f09SDavid van Moolenbroek 
1793*00b67f09SDavid van Moolenbroek 			/*
1794*00b67f09SDavid van Moolenbroek 			 * Skip comment lines.
1795*00b67f09SDavid van Moolenbroek 			 */
1796*00b67f09SDavid van Moolenbroek 			if ((isspace((unsigned char)*p)) || (*p == '#')) {
1797*00b67f09SDavid van Moolenbroek 				(void)free(p);
1798*00b67f09SDavid van Moolenbroek 				continue;
1799*00b67f09SDavid van Moolenbroek 			}
1800*00b67f09SDavid van Moolenbroek 
1801*00b67f09SDavid van Moolenbroek 			cnt = bustline(p, Tokens);
1802*00b67f09SDavid van Moolenbroek 			if (cnt == 4) {
1803*00b67f09SDavid van Moolenbroek 				/*
1804*00b67f09SDavid van Moolenbroek 				 * test_name1, test_name2, test_origin,
1805*00b67f09SDavid van Moolenbroek 				 * downcase.
1806*00b67f09SDavid van Moolenbroek 				 */
1807*00b67f09SDavid van Moolenbroek 				result = test_dns_name_fromtext(Tokens[0],
1808*00b67f09SDavid van Moolenbroek 								Tokens[1],
1809*00b67f09SDavid van Moolenbroek 								Tokens[2],
1810*00b67f09SDavid van Moolenbroek 							   atoi(Tokens[3])
1811*00b67f09SDavid van Moolenbroek 								== 0 ?
1812*00b67f09SDavid van Moolenbroek 								0 :
1813*00b67f09SDavid van Moolenbroek 							     DNS_NAME_DOWNCASE);
1814*00b67f09SDavid van Moolenbroek 			} else {
1815*00b67f09SDavid van Moolenbroek 				t_info("bad format at line %d\n", line);
1816*00b67f09SDavid van Moolenbroek 			}
1817*00b67f09SDavid van Moolenbroek 
1818*00b67f09SDavid van Moolenbroek 			(void)free(p);
1819*00b67f09SDavid van Moolenbroek 			t_result(result);
1820*00b67f09SDavid van Moolenbroek 		}
1821*00b67f09SDavid van Moolenbroek 		(void)fclose(fp);
1822*00b67f09SDavid van Moolenbroek 	} else {
1823*00b67f09SDavid van Moolenbroek 		t_info("Missing datafile dns_name_fromtext\n");
1824*00b67f09SDavid van Moolenbroek 		t_result(result);
1825*00b67f09SDavid van Moolenbroek 	}
1826*00b67f09SDavid van Moolenbroek }
1827*00b67f09SDavid van Moolenbroek 
1828*00b67f09SDavid van Moolenbroek static const char *a41 =
1829*00b67f09SDavid van Moolenbroek 		"dns_name_totext(name, omit_final_dot, target) converts "
1830*00b67f09SDavid van Moolenbroek 		"the DNS name 'name' in wire format to textual format "
1831*00b67f09SDavid van Moolenbroek 		"at target, and adds a final '.' to the name if "
1832*00b67f09SDavid van Moolenbroek 		"omit_final_dot is false";
1833*00b67f09SDavid van Moolenbroek 
1834*00b67f09SDavid van Moolenbroek static int
test_dns_name_totext(char * test_name,isc_boolean_t omit_final)1835*00b67f09SDavid van Moolenbroek test_dns_name_totext(char *test_name, isc_boolean_t omit_final) {
1836*00b67f09SDavid van Moolenbroek 	int		result;
1837*00b67f09SDavid van Moolenbroek 	int		len;
1838*00b67f09SDavid van Moolenbroek 	int		order;
1839*00b67f09SDavid van Moolenbroek 	unsigned int	nlabels;
1840*00b67f09SDavid van Moolenbroek 	unsigned char	junk1[BUFLEN];
1841*00b67f09SDavid van Moolenbroek 	unsigned char	junk2[BUFLEN];
1842*00b67f09SDavid van Moolenbroek 	unsigned char	junk3[BUFLEN];
1843*00b67f09SDavid van Moolenbroek 	isc_buffer_t	buf1;
1844*00b67f09SDavid van Moolenbroek 	isc_buffer_t	buf2;
1845*00b67f09SDavid van Moolenbroek 	isc_buffer_t	buf3;
1846*00b67f09SDavid van Moolenbroek 	dns_name_t	dns_name1;
1847*00b67f09SDavid van Moolenbroek 	dns_name_t	dns_name2;
1848*00b67f09SDavid van Moolenbroek 	isc_result_t	dns_result;
1849*00b67f09SDavid van Moolenbroek 	dns_namereln_t	dns_namereln;
1850*00b67f09SDavid van Moolenbroek 
1851*00b67f09SDavid van Moolenbroek 	t_info("testing %s\n", test_name);
1852*00b67f09SDavid van Moolenbroek 
1853*00b67f09SDavid van Moolenbroek 	len = strlen(test_name);
1854*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&buf1, test_name, len);
1855*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&buf1, len);
1856*00b67f09SDavid van Moolenbroek 
1857*00b67f09SDavid van Moolenbroek 	dns_name_init(&dns_name1, NULL);
1858*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&buf2, junk2, BUFLEN);
1859*00b67f09SDavid van Moolenbroek 
1860*00b67f09SDavid van Moolenbroek 	/*
1861*00b67f09SDavid van Moolenbroek 	 * Out of the data file to dns_name1.
1862*00b67f09SDavid van Moolenbroek 	 */
1863*00b67f09SDavid van Moolenbroek 	dns_result = dns_name_fromtext(&dns_name1, &buf1, NULL, 0, &buf2);
1864*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1865*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromtext failed, result == %s\n",
1866*00b67f09SDavid van Moolenbroek 		       dns_result_totext(dns_result));
1867*00b67f09SDavid van Moolenbroek 		return (T_UNRESOLVED);
1868*00b67f09SDavid van Moolenbroek 	}
1869*00b67f09SDavid van Moolenbroek 
1870*00b67f09SDavid van Moolenbroek 	/*
1871*00b67f09SDavid van Moolenbroek 	 * From dns_name1 into a text buffer.
1872*00b67f09SDavid van Moolenbroek 	 */
1873*00b67f09SDavid van Moolenbroek 	isc_buffer_invalidate(&buf1);
1874*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&buf1, junk1, BUFLEN);
1875*00b67f09SDavid van Moolenbroek 	dns_result = dns_name_totext(&dns_name1, omit_final, &buf1);
1876*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1877*00b67f09SDavid van Moolenbroek 		t_info("dns_name_totext failed, result == %s\n",
1878*00b67f09SDavid van Moolenbroek 		       dns_result_totext(dns_result));
1879*00b67f09SDavid van Moolenbroek 		return (T_FAIL);
1880*00b67f09SDavid van Moolenbroek 	}
1881*00b67f09SDavid van Moolenbroek 
1882*00b67f09SDavid van Moolenbroek 	/*
1883*00b67f09SDavid van Moolenbroek 	 * From the text buffer into dns_name2.
1884*00b67f09SDavid van Moolenbroek 	 */
1885*00b67f09SDavid van Moolenbroek 	dns_name_init(&dns_name2, NULL);
1886*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&buf3, junk3, BUFLEN);
1887*00b67f09SDavid van Moolenbroek 	dns_result = dns_name_fromtext(&dns_name2, &buf1, NULL, 0, &buf3);
1888*00b67f09SDavid van Moolenbroek 	if (dns_result != ISC_R_SUCCESS) {
1889*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromtext failed, result == %s\n",
1890*00b67f09SDavid van Moolenbroek 		       dns_result_totext(dns_result));
1891*00b67f09SDavid van Moolenbroek 		return (T_UNRESOLVED);
1892*00b67f09SDavid van Moolenbroek 	}
1893*00b67f09SDavid van Moolenbroek 
1894*00b67f09SDavid van Moolenbroek 	dns_namereln = dns_name_fullcompare(&dns_name1, &dns_name2,
1895*00b67f09SDavid van Moolenbroek 					    &order, &nlabels);
1896*00b67f09SDavid van Moolenbroek 	if (dns_namereln == dns_namereln_equal)
1897*00b67f09SDavid van Moolenbroek 		result = T_PASS;
1898*00b67f09SDavid van Moolenbroek 	else {
1899*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fullcompare returned %s\n",
1900*00b67f09SDavid van Moolenbroek 		       dns_namereln_to_text(dns_namereln));
1901*00b67f09SDavid van Moolenbroek 		result = T_FAIL;
1902*00b67f09SDavid van Moolenbroek 	}
1903*00b67f09SDavid van Moolenbroek 
1904*00b67f09SDavid van Moolenbroek 	return (result);
1905*00b67f09SDavid van Moolenbroek }
1906*00b67f09SDavid van Moolenbroek 
1907*00b67f09SDavid van Moolenbroek static void
t_dns_name_totext(void)1908*00b67f09SDavid van Moolenbroek t_dns_name_totext(void) {
1909*00b67f09SDavid van Moolenbroek 	int		line;
1910*00b67f09SDavid van Moolenbroek 	int		cnt;
1911*00b67f09SDavid van Moolenbroek 	int		result;
1912*00b67f09SDavid van Moolenbroek 	char		*p;
1913*00b67f09SDavid van Moolenbroek 	FILE		*fp;
1914*00b67f09SDavid van Moolenbroek 
1915*00b67f09SDavid van Moolenbroek 	t_assert("dns_name_totext", 1, T_REQUIRED, "%s", a41);
1916*00b67f09SDavid van Moolenbroek 
1917*00b67f09SDavid van Moolenbroek 	result = T_UNRESOLVED;
1918*00b67f09SDavid van Moolenbroek 	fp = fopen("dns_name_totext_data", "r");
1919*00b67f09SDavid van Moolenbroek 	if (fp != NULL) {
1920*00b67f09SDavid van Moolenbroek 		line = 0;
1921*00b67f09SDavid van Moolenbroek 		while ((p = t_fgetbs(fp)) != NULL) {
1922*00b67f09SDavid van Moolenbroek 
1923*00b67f09SDavid van Moolenbroek 			++line;
1924*00b67f09SDavid van Moolenbroek 
1925*00b67f09SDavid van Moolenbroek 			/*
1926*00b67f09SDavid van Moolenbroek 			 * Skip comment lines.
1927*00b67f09SDavid van Moolenbroek 			 */
1928*00b67f09SDavid van Moolenbroek 			if ((isspace((unsigned char)*p)) || (*p == '#')) {
1929*00b67f09SDavid van Moolenbroek 				(void)free(p);
1930*00b67f09SDavid van Moolenbroek 				continue;
1931*00b67f09SDavid van Moolenbroek 			}
1932*00b67f09SDavid van Moolenbroek 
1933*00b67f09SDavid van Moolenbroek 			cnt = bustline(p, Tokens);
1934*00b67f09SDavid van Moolenbroek 			if (cnt == 2) {
1935*00b67f09SDavid van Moolenbroek 				/*
1936*00b67f09SDavid van Moolenbroek 				 * test_name, omit_final.
1937*00b67f09SDavid van Moolenbroek 				 */
1938*00b67f09SDavid van Moolenbroek 				result = test_dns_name_totext(Tokens[0],
1939*00b67f09SDavid van Moolenbroek 							 atoi(Tokens[1]) == 0 ?
1940*00b67f09SDavid van Moolenbroek 							      ISC_FALSE :
1941*00b67f09SDavid van Moolenbroek 							      ISC_TRUE);
1942*00b67f09SDavid van Moolenbroek 			} else {
1943*00b67f09SDavid van Moolenbroek 				t_info("bad format at line %d\n", line);
1944*00b67f09SDavid van Moolenbroek 			}
1945*00b67f09SDavid van Moolenbroek 
1946*00b67f09SDavid van Moolenbroek 			(void)free(p);
1947*00b67f09SDavid van Moolenbroek 			t_result(result);
1948*00b67f09SDavid van Moolenbroek 		}
1949*00b67f09SDavid van Moolenbroek 		(void)fclose(fp);
1950*00b67f09SDavid van Moolenbroek 	} else {
1951*00b67f09SDavid van Moolenbroek 		t_info("Missing datafile dns_name_totext\n");
1952*00b67f09SDavid van Moolenbroek 		t_result(result);
1953*00b67f09SDavid van Moolenbroek 	}
1954*00b67f09SDavid van Moolenbroek }
1955*00b67f09SDavid van Moolenbroek 
1956*00b67f09SDavid van Moolenbroek static const char *a42 =
1957*00b67f09SDavid van Moolenbroek 		"dns_name_fromwire(name, source, dctx, downcase, target) "
1958*00b67f09SDavid van Moolenbroek 		"converts the possibly compressed DNS name 'name' in wire "
1959*00b67f09SDavid van Moolenbroek 		"format to canonicalized form at target, performing upper to "
1960*00b67f09SDavid van Moolenbroek 		"lower case conversion if downcase is true, and returns "
1961*00b67f09SDavid van Moolenbroek 		"ISC_R_SUCCESS";
1962*00b67f09SDavid van Moolenbroek 
1963*00b67f09SDavid van Moolenbroek #if 0
1964*00b67f09SDavid van Moolenbroek 	/*
1965*00b67f09SDavid van Moolenbroek 	 * XXXRTH these tests appear to be broken, so I have
1966*00b67f09SDavid van Moolenbroek 	 * disabled them.
1967*00b67f09SDavid van Moolenbroek 	 */
1968*00b67f09SDavid van Moolenbroek static const char *a43 =
1969*00b67f09SDavid van Moolenbroek 		"when a label length is invalid, dns_name_fromwire() "
1970*00b67f09SDavid van Moolenbroek 		"returns DNS_R_FORMERR";
1971*00b67f09SDavid van Moolenbroek 
1972*00b67f09SDavid van Moolenbroek static const char *a44 =
1973*00b67f09SDavid van Moolenbroek 		"when a label type is invalid, dns_name_fromwire() "
1974*00b67f09SDavid van Moolenbroek 		"returns DNS_R_BADLABELTYPE";
1975*00b67f09SDavid van Moolenbroek #endif
1976*00b67f09SDavid van Moolenbroek 
1977*00b67f09SDavid van Moolenbroek static const char *a45 =
1978*00b67f09SDavid van Moolenbroek 		"when a name length is invalid, dns_name_fromwire() "
1979*00b67f09SDavid van Moolenbroek 		"returns DNS_R_FORMERR";
1980*00b67f09SDavid van Moolenbroek 
1981*00b67f09SDavid van Moolenbroek static const char *a46 =
1982*00b67f09SDavid van Moolenbroek 		"when a compression type is invalid, dns_name_fromwire() "
1983*00b67f09SDavid van Moolenbroek 		"returns DNS_R_DISALLOWED";
1984*00b67f09SDavid van Moolenbroek 
1985*00b67f09SDavid van Moolenbroek static const char *a47 =
1986*00b67f09SDavid van Moolenbroek 		"when a bad compression pointer is encountered, "
1987*00b67f09SDavid van Moolenbroek 		"dns_name_fromwire() returns DNS_R_BADPOINTER";
1988*00b67f09SDavid van Moolenbroek 
1989*00b67f09SDavid van Moolenbroek static const char *a48 =
1990*00b67f09SDavid van Moolenbroek 		"when input ends unexpected, dns_name_fromwire() "
1991*00b67f09SDavid van Moolenbroek 		"returns ISC_R_UNEXPECTEDEND";
1992*00b67f09SDavid van Moolenbroek 
1993*00b67f09SDavid van Moolenbroek static const char *a49 =
1994*00b67f09SDavid van Moolenbroek 		"when there is not enough space in target, "
1995*00b67f09SDavid van Moolenbroek 		"dns_name_fromwire(name, source, dcts, downcase, target) "
1996*00b67f09SDavid van Moolenbroek 		"returns ISC_R_NOSPACE";
1997*00b67f09SDavid van Moolenbroek 
1998*00b67f09SDavid van Moolenbroek static int
test_dns_name_fromwire(char * datafile_name,int testname_offset,int downcase,unsigned int dc_method,char * exp_name,isc_result_t exp_result,size_t buflen)1999*00b67f09SDavid van Moolenbroek test_dns_name_fromwire(char *datafile_name, int testname_offset, int downcase,
2000*00b67f09SDavid van Moolenbroek 		       unsigned int dc_method, char *exp_name,
2001*00b67f09SDavid van Moolenbroek 		       isc_result_t exp_result, size_t buflen)
2002*00b67f09SDavid van Moolenbroek {
2003*00b67f09SDavid van Moolenbroek 	int			result;
2004*00b67f09SDavid van Moolenbroek 	int			order;
2005*00b67f09SDavid van Moolenbroek 	unsigned int		nlabels;
2006*00b67f09SDavid van Moolenbroek 	int			len;
2007*00b67f09SDavid van Moolenbroek 	unsigned char		buf1[BIGBUFLEN];
2008*00b67f09SDavid van Moolenbroek 	char			buf2[BUFLEN];
2009*00b67f09SDavid van Moolenbroek 	isc_buffer_t		iscbuf1;
2010*00b67f09SDavid van Moolenbroek 	isc_buffer_t		iscbuf2;
2011*00b67f09SDavid van Moolenbroek 	dns_fixedname_t		fixed2;
2012*00b67f09SDavid van Moolenbroek 	dns_name_t		dns_name1;
2013*00b67f09SDavid van Moolenbroek 	dns_name_t		*dns_name2;
2014*00b67f09SDavid van Moolenbroek 	isc_result_t		dns_result;
2015*00b67f09SDavid van Moolenbroek 	dns_namereln_t		dns_namereln;
2016*00b67f09SDavid van Moolenbroek 	dns_decompress_t	dctx;
2017*00b67f09SDavid van Moolenbroek 
2018*00b67f09SDavid van Moolenbroek 	t_info("testing using %s\n", datafile_name);
2019*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&iscbuf1, buf1, sizeof(buf1));
2020*00b67f09SDavid van Moolenbroek 	len = getmsg(datafile_name, &iscbuf1);
2021*00b67f09SDavid van Moolenbroek 	if (len == 0)
2022*00b67f09SDavid van Moolenbroek 		return (T_FAIL);
2023*00b67f09SDavid van Moolenbroek 
2024*00b67f09SDavid van Moolenbroek 	isc_buffer_setactive(&iscbuf1, len);
2025*00b67f09SDavid van Moolenbroek 	iscbuf1.current = testname_offset;
2026*00b67f09SDavid van Moolenbroek 
2027*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&iscbuf2, buf2, (unsigned int)buflen);
2028*00b67f09SDavid van Moolenbroek 	dns_name_init(&dns_name1, NULL);
2029*00b67f09SDavid van Moolenbroek 	dns_decompress_init(&dctx, -1, DNS_DECOMPRESS_STRICT);
2030*00b67f09SDavid van Moolenbroek 	dns_decompress_setmethods(&dctx, dc_method);
2031*00b67f09SDavid van Moolenbroek 	dns_result = dns_name_fromwire(&dns_name1, &iscbuf1,
2032*00b67f09SDavid van Moolenbroek 				       &dctx, downcase ? ISC_TRUE : ISC_FALSE,
2033*00b67f09SDavid van Moolenbroek 				       &iscbuf2);
2034*00b67f09SDavid van Moolenbroek 
2035*00b67f09SDavid van Moolenbroek 	if ((dns_result == exp_result) && (exp_result == ISC_R_SUCCESS)) {
2036*00b67f09SDavid van Moolenbroek 
2037*00b67f09SDavid van Moolenbroek 		dns_fixedname_init(&fixed2);
2038*00b67f09SDavid van Moolenbroek 		dns_name2 = dns_fixedname_name(&fixed2);
2039*00b67f09SDavid van Moolenbroek 		dns_result = dns_name_fromstring2(dns_name2, exp_name, NULL,
2040*00b67f09SDavid van Moolenbroek 						  0, NULL);
2041*00b67f09SDavid van Moolenbroek 		if (dns_result == ISC_R_SUCCESS) {
2042*00b67f09SDavid van Moolenbroek 			dns_namereln = dns_name_fullcompare(&dns_name1,
2043*00b67f09SDavid van Moolenbroek 							    dns_name2,
2044*00b67f09SDavid van Moolenbroek 							    &order, &nlabels);
2045*00b67f09SDavid van Moolenbroek 			if (dns_namereln != dns_namereln_equal) {
2046*00b67f09SDavid van Moolenbroek 				t_info("dns_name_fullcompare  returned %s\n",
2047*00b67f09SDavid van Moolenbroek 				       dns_namereln_to_text(dns_namereln));
2048*00b67f09SDavid van Moolenbroek 				result = T_FAIL;
2049*00b67f09SDavid van Moolenbroek 			} else {
2050*00b67f09SDavid van Moolenbroek 				result = T_PASS;
2051*00b67f09SDavid van Moolenbroek 			}
2052*00b67f09SDavid van Moolenbroek 		} else {
2053*00b67f09SDavid van Moolenbroek 			t_info("dns_name_fromtext %s failed, result = %s\n",
2054*00b67f09SDavid van Moolenbroek 			       exp_name, dns_result_totext(dns_result));
2055*00b67f09SDavid van Moolenbroek 			result = T_UNRESOLVED;
2056*00b67f09SDavid van Moolenbroek 		}
2057*00b67f09SDavid van Moolenbroek 	} else if (dns_result == exp_result) {
2058*00b67f09SDavid van Moolenbroek 		result = T_PASS;
2059*00b67f09SDavid van Moolenbroek 	} else {
2060*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromwire returned %s\n",
2061*00b67f09SDavid van Moolenbroek 		       dns_result_totext(dns_result));
2062*00b67f09SDavid van Moolenbroek 		result = T_FAIL;
2063*00b67f09SDavid van Moolenbroek 	}
2064*00b67f09SDavid van Moolenbroek 
2065*00b67f09SDavid van Moolenbroek 	return (result);
2066*00b67f09SDavid van Moolenbroek }
2067*00b67f09SDavid van Moolenbroek 
2068*00b67f09SDavid van Moolenbroek static void
t_dns_name_fromwire_x(const char * testfile,size_t buflen)2069*00b67f09SDavid van Moolenbroek t_dns_name_fromwire_x(const char *testfile, size_t buflen) {
2070*00b67f09SDavid van Moolenbroek 	int		line;
2071*00b67f09SDavid van Moolenbroek 	int		cnt;
2072*00b67f09SDavid van Moolenbroek 	int		result;
2073*00b67f09SDavid van Moolenbroek 	unsigned int	dc_method;
2074*00b67f09SDavid van Moolenbroek 	isc_result_t	exp_result;
2075*00b67f09SDavid van Moolenbroek 	char		*p;
2076*00b67f09SDavid van Moolenbroek 	char		*tok;
2077*00b67f09SDavid van Moolenbroek 	FILE		*fp;
2078*00b67f09SDavid van Moolenbroek 
2079*00b67f09SDavid van Moolenbroek 	result = T_UNRESOLVED;
2080*00b67f09SDavid van Moolenbroek 	fp = fopen(testfile, "r");
2081*00b67f09SDavid van Moolenbroek 	if (fp != NULL) {
2082*00b67f09SDavid van Moolenbroek 		line = 0;
2083*00b67f09SDavid van Moolenbroek 		while ((p = t_fgetbs(fp)) != NULL) {
2084*00b67f09SDavid van Moolenbroek 
2085*00b67f09SDavid van Moolenbroek 			++line;
2086*00b67f09SDavid van Moolenbroek 
2087*00b67f09SDavid van Moolenbroek 			/*
2088*00b67f09SDavid van Moolenbroek 			 * Skip comment lines.
2089*00b67f09SDavid van Moolenbroek 			 */
2090*00b67f09SDavid van Moolenbroek 			if ((isspace((unsigned char)*p)) || (*p == '#')) {
2091*00b67f09SDavid van Moolenbroek 				(void)free(p);
2092*00b67f09SDavid van Moolenbroek 				continue;
2093*00b67f09SDavid van Moolenbroek 			}
2094*00b67f09SDavid van Moolenbroek 
2095*00b67f09SDavid van Moolenbroek 			cnt = bustline(p, Tokens);
2096*00b67f09SDavid van Moolenbroek 			if (cnt == 6) {
2097*00b67f09SDavid van Moolenbroek 				/*
2098*00b67f09SDavid van Moolenbroek 				 *	datafile_name, testname_offset,
2099*00b67f09SDavid van Moolenbroek 				 *	downcase, dc_method,
2100*00b67f09SDavid van Moolenbroek 				 *	exp_name, exp_result.
2101*00b67f09SDavid van Moolenbroek 				 */
2102*00b67f09SDavid van Moolenbroek 
2103*00b67f09SDavid van Moolenbroek 				tok = Tokens[5];
2104*00b67f09SDavid van Moolenbroek 				exp_result = ISC_R_SUCCESS;
2105*00b67f09SDavid van Moolenbroek 				if (! strcmp(tok, "ISC_R_SUCCESS"))
2106*00b67f09SDavid van Moolenbroek 					exp_result = ISC_R_SUCCESS;
2107*00b67f09SDavid van Moolenbroek 				else if (! strcmp(tok, "ISC_R_NOSPACE"))
2108*00b67f09SDavid van Moolenbroek 					exp_result = ISC_R_NOSPACE;
2109*00b67f09SDavid van Moolenbroek 				else if (! strcmp(tok, "DNS_R_BADLABELTYPE"))
2110*00b67f09SDavid van Moolenbroek 					exp_result = DNS_R_BADLABELTYPE;
2111*00b67f09SDavid van Moolenbroek 				else if (! strcmp(tok, "DNS_R_FORMERR"))
2112*00b67f09SDavid van Moolenbroek 					exp_result = DNS_R_FORMERR;
2113*00b67f09SDavid van Moolenbroek 				else if (! strcmp(tok, "DNS_R_BADPOINTER"))
2114*00b67f09SDavid van Moolenbroek 					exp_result = DNS_R_BADPOINTER;
2115*00b67f09SDavid van Moolenbroek 				else if (! strcmp(tok, "ISC_R_UNEXPECTEDEND"))
2116*00b67f09SDavid van Moolenbroek 					exp_result = ISC_R_UNEXPECTEDEND;
2117*00b67f09SDavid van Moolenbroek 				else if (! strcmp(tok, "DNS_R_TOOMANYHOPS"))
2118*00b67f09SDavid van Moolenbroek 					exp_result = DNS_R_TOOMANYHOPS;
2119*00b67f09SDavid van Moolenbroek 				else if (! strcmp(tok, "DNS_R_DISALLOWED"))
2120*00b67f09SDavid van Moolenbroek 					exp_result = DNS_R_DISALLOWED;
2121*00b67f09SDavid van Moolenbroek 				else if (! strcmp(tok, "DNS_R_NAMETOOLONG"))
2122*00b67f09SDavid van Moolenbroek 					exp_result = DNS_R_NAMETOOLONG;
2123*00b67f09SDavid van Moolenbroek 
2124*00b67f09SDavid van Moolenbroek 				tok = Tokens[3];
2125*00b67f09SDavid van Moolenbroek 				dc_method = DNS_COMPRESS_NONE;
2126*00b67f09SDavid van Moolenbroek 				if (! strcmp(tok, "DNS_COMPRESS_GLOBAL14"))
2127*00b67f09SDavid van Moolenbroek 					dc_method = DNS_COMPRESS_GLOBAL14;
2128*00b67f09SDavid van Moolenbroek 				else if (! strcmp(tok, "DNS_COMPRESS_ALL"))
2129*00b67f09SDavid van Moolenbroek 					dc_method = DNS_COMPRESS_ALL;
2130*00b67f09SDavid van Moolenbroek 
2131*00b67f09SDavid van Moolenbroek 				result = test_dns_name_fromwire(Tokens[0],
2132*00b67f09SDavid van Moolenbroek 							   atoi(Tokens[1]),
2133*00b67f09SDavid van Moolenbroek 							   atoi(Tokens[2]),
2134*00b67f09SDavid van Moolenbroek 								dc_method,
2135*00b67f09SDavid van Moolenbroek 								Tokens[4],
2136*00b67f09SDavid van Moolenbroek 								exp_result,
2137*00b67f09SDavid van Moolenbroek 								buflen);
2138*00b67f09SDavid van Moolenbroek 			} else {
2139*00b67f09SDavid van Moolenbroek 				t_info("bad format at line %d\n", line);
2140*00b67f09SDavid van Moolenbroek 			}
2141*00b67f09SDavid van Moolenbroek 
2142*00b67f09SDavid van Moolenbroek 			(void)free(p);
2143*00b67f09SDavid van Moolenbroek 			t_result(result);
2144*00b67f09SDavid van Moolenbroek 		}
2145*00b67f09SDavid van Moolenbroek 		(void)fclose(fp);
2146*00b67f09SDavid van Moolenbroek 	} else {
2147*00b67f09SDavid van Moolenbroek 		t_info("Missing datafile %s\n", testfile);
2148*00b67f09SDavid van Moolenbroek 		t_result(result);
2149*00b67f09SDavid van Moolenbroek 	}
2150*00b67f09SDavid van Moolenbroek }
2151*00b67f09SDavid van Moolenbroek 
2152*00b67f09SDavid van Moolenbroek static void
t_dns_name_fromwire(void)2153*00b67f09SDavid van Moolenbroek t_dns_name_fromwire(void) {
2154*00b67f09SDavid van Moolenbroek 	t_assert("dns_name_fromwire", 1, T_REQUIRED, "%s", a42);
2155*00b67f09SDavid van Moolenbroek 	t_dns_name_fromwire_x("dns_name_fromwire_1_data", BUFLEN);
2156*00b67f09SDavid van Moolenbroek 
2157*00b67f09SDavid van Moolenbroek #if 0
2158*00b67f09SDavid van Moolenbroek 	/*
2159*00b67f09SDavid van Moolenbroek 	 * XXXRTH these tests appear to be broken, so I have
2160*00b67f09SDavid van Moolenbroek 	 * disabled them.
2161*00b67f09SDavid van Moolenbroek 	 */
2162*00b67f09SDavid van Moolenbroek 	t_assert("dns_name_fromwire", 2, T_REQUIRED, "%s", a43);
2163*00b67f09SDavid van Moolenbroek 	t_dns_name_fromwire_x("dns_name_fromwire_2_data", BUFLEN);
2164*00b67f09SDavid van Moolenbroek 
2165*00b67f09SDavid van Moolenbroek 	t_assert("dns_name_fromwire", 3, T_REQUIRED, "%s", a44);
2166*00b67f09SDavid van Moolenbroek 	t_dns_name_fromwire_x("dns_name_fromwire_3_data", BUFLEN);
2167*00b67f09SDavid van Moolenbroek #endif
2168*00b67f09SDavid van Moolenbroek 
2169*00b67f09SDavid van Moolenbroek 	t_assert("dns_name_fromwire", 4, T_REQUIRED, "%s", a45);
2170*00b67f09SDavid van Moolenbroek 	t_dns_name_fromwire_x("dns_name_fromwire_4_data", BUFLEN);
2171*00b67f09SDavid van Moolenbroek 
2172*00b67f09SDavid van Moolenbroek 	t_assert("dns_name_fromwire", 5, T_REQUIRED, "%s", a46);
2173*00b67f09SDavid van Moolenbroek 	t_dns_name_fromwire_x("dns_name_fromwire_5_data", BUFLEN);
2174*00b67f09SDavid van Moolenbroek 
2175*00b67f09SDavid van Moolenbroek 	t_assert("dns_name_fromwire", 6, T_REQUIRED, "%s", a47);
2176*00b67f09SDavid van Moolenbroek 	t_dns_name_fromwire_x("dns_name_fromwire_6_data", BUFLEN);
2177*00b67f09SDavid van Moolenbroek 
2178*00b67f09SDavid van Moolenbroek 	t_assert("dns_name_fromwire", 7, T_REQUIRED, "%s", a48);
2179*00b67f09SDavid van Moolenbroek 	t_dns_name_fromwire_x("dns_name_fromwire_7_data", BUFLEN);
2180*00b67f09SDavid van Moolenbroek 
2181*00b67f09SDavid van Moolenbroek 	t_assert("dns_name_fromwire", 9, T_REQUIRED, "%s", a49);
2182*00b67f09SDavid van Moolenbroek 	t_dns_name_fromwire_x("dns_name_fromwire_8_data", 2);
2183*00b67f09SDavid van Moolenbroek }
2184*00b67f09SDavid van Moolenbroek 
2185*00b67f09SDavid van Moolenbroek 
2186*00b67f09SDavid van Moolenbroek static const char *a51 =
2187*00b67f09SDavid van Moolenbroek 		"dns_name_towire(name, cctx, target) converts the DNS name "
2188*00b67f09SDavid van Moolenbroek 		"'name' into wire format, compresses it as specified "
2189*00b67f09SDavid van Moolenbroek 		"by the compression context cctx, stores the result in "
2190*00b67f09SDavid van Moolenbroek 		"target and returns DNS_SUCCESS";
2191*00b67f09SDavid van Moolenbroek 
2192*00b67f09SDavid van Moolenbroek static const char *a52 =
2193*00b67f09SDavid van Moolenbroek 		"when not enough space exists in target, "
2194*00b67f09SDavid van Moolenbroek 		"dns_name_towire(name, cctx, target) returns ISC_R_NOSPACE";
2195*00b67f09SDavid van Moolenbroek 
2196*00b67f09SDavid van Moolenbroek static int
test_dns_name_towire(char * testname,unsigned int dc_method,char * exp_data,size_t exp_data_len,isc_result_t exp_result,size_t buflen)2197*00b67f09SDavid van Moolenbroek test_dns_name_towire(char *testname, unsigned int dc_method, char *exp_data,
2198*00b67f09SDavid van Moolenbroek 		     size_t exp_data_len, isc_result_t exp_result,
2199*00b67f09SDavid van Moolenbroek 		     size_t buflen)
2200*00b67f09SDavid van Moolenbroek {
2201*00b67f09SDavid van Moolenbroek 	int			result;
2202*00b67f09SDavid van Moolenbroek 	int			val;
2203*00b67f09SDavid van Moolenbroek 	int			len;
2204*00b67f09SDavid van Moolenbroek 	unsigned char		buf2[BUFLEN];
2205*00b67f09SDavid van Moolenbroek 	unsigned char		buf3[BUFLEN];
2206*00b67f09SDavid van Moolenbroek 	isc_buffer_t		iscbuf1;
2207*00b67f09SDavid van Moolenbroek 	isc_buffer_t		iscbuf2;
2208*00b67f09SDavid van Moolenbroek 	isc_buffer_t		iscbuf3;
2209*00b67f09SDavid van Moolenbroek 	dns_name_t		dns_name;
2210*00b67f09SDavid van Moolenbroek 	isc_result_t		dns_result;
2211*00b67f09SDavid van Moolenbroek 	isc_result_t		isc_result;
2212*00b67f09SDavid van Moolenbroek 	dns_compress_t		cctx;
2213*00b67f09SDavid van Moolenbroek 	isc_mem_t		*mctx;
2214*00b67f09SDavid van Moolenbroek 
2215*00b67f09SDavid van Moolenbroek 	t_info("testing using %s\n", testname);
2216*00b67f09SDavid van Moolenbroek 
2217*00b67f09SDavid van Moolenbroek 	result = T_UNRESOLVED;
2218*00b67f09SDavid van Moolenbroek 	mctx = NULL;
2219*00b67f09SDavid van Moolenbroek 
2220*00b67f09SDavid van Moolenbroek 	isc_result = isc_mem_create(0, 0, &mctx);
2221*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
2222*00b67f09SDavid van Moolenbroek 		t_info("isc_mem_create failed\n");
2223*00b67f09SDavid van Moolenbroek 		return (result);
2224*00b67f09SDavid van Moolenbroek 	}
2225*00b67f09SDavid van Moolenbroek 	dns_compress_init(&cctx, -1, mctx);
2226*00b67f09SDavid van Moolenbroek 	dns_compress_setmethods(&cctx, dc_method);
2227*00b67f09SDavid van Moolenbroek 	dns_name_init(&dns_name, NULL);
2228*00b67f09SDavid van Moolenbroek 	len = strlen(testname);
2229*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&iscbuf1, testname, len);
2230*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&iscbuf1, len);
2231*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&iscbuf2, buf2, BUFLEN);
2232*00b67f09SDavid van Moolenbroek 	dns_result = dns_name_fromtext(&dns_name, &iscbuf1, NULL, 0, &iscbuf2);
2233*00b67f09SDavid van Moolenbroek 	if (dns_result == ISC_R_SUCCESS) {
2234*00b67f09SDavid van Moolenbroek 	  isc_buffer_init(&iscbuf3, buf3, (unsigned int)buflen);
2235*00b67f09SDavid van Moolenbroek 		dns_result = dns_name_towire(&dns_name, &cctx, &iscbuf3);
2236*00b67f09SDavid van Moolenbroek 		if (dns_result == exp_result) {
2237*00b67f09SDavid van Moolenbroek 			if (exp_result == ISC_R_SUCCESS) {
2238*00b67f09SDavid van Moolenbroek 				/*
2239*00b67f09SDavid van Moolenbroek 				 * Compare results with expected data.
2240*00b67f09SDavid van Moolenbroek 				 */
2241*00b67f09SDavid van Moolenbroek 				val = chkdata(buf3, iscbuf3.used, exp_data,
2242*00b67f09SDavid van Moolenbroek 					      exp_data_len);
2243*00b67f09SDavid van Moolenbroek 				if (val == 0)
2244*00b67f09SDavid van Moolenbroek 					result = T_PASS;
2245*00b67f09SDavid van Moolenbroek 				else
2246*00b67f09SDavid van Moolenbroek 					result = T_FAIL;
2247*00b67f09SDavid van Moolenbroek 			} else
2248*00b67f09SDavid van Moolenbroek 				result = T_PASS;
2249*00b67f09SDavid van Moolenbroek 		} else {
2250*00b67f09SDavid van Moolenbroek 			t_info("dns_name_towire unexpectedly returned %s\n",
2251*00b67f09SDavid van Moolenbroek 			       dns_result_totext(dns_result));
2252*00b67f09SDavid van Moolenbroek 			result = T_FAIL;
2253*00b67f09SDavid van Moolenbroek 		}
2254*00b67f09SDavid van Moolenbroek 	} else {
2255*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromtext %s failed, result = %s\n",
2256*00b67f09SDavid van Moolenbroek 				testname, dns_result_totext(dns_result));
2257*00b67f09SDavid van Moolenbroek 	}
2258*00b67f09SDavid van Moolenbroek 	return (result);
2259*00b67f09SDavid van Moolenbroek }
2260*00b67f09SDavid van Moolenbroek 
2261*00b67f09SDavid van Moolenbroek static void
t_dns_name_towire_x(const char * testfile,size_t buflen)2262*00b67f09SDavid van Moolenbroek t_dns_name_towire_x(const char *testfile, size_t buflen) {
2263*00b67f09SDavid van Moolenbroek 	int		line;
2264*00b67f09SDavid van Moolenbroek 	int		cnt;
2265*00b67f09SDavid van Moolenbroek 	int		result;
2266*00b67f09SDavid van Moolenbroek 	unsigned int	dc_method;
2267*00b67f09SDavid van Moolenbroek 	isc_result_t	exp_result;
2268*00b67f09SDavid van Moolenbroek 	size_t		exp_data_len;
2269*00b67f09SDavid van Moolenbroek 	char		*p;
2270*00b67f09SDavid van Moolenbroek 	FILE		*fp;
2271*00b67f09SDavid van Moolenbroek 
2272*00b67f09SDavid van Moolenbroek 	result = T_UNRESOLVED;
2273*00b67f09SDavid van Moolenbroek 	fp = fopen(testfile, "r");
2274*00b67f09SDavid van Moolenbroek 	if (fp != NULL) {
2275*00b67f09SDavid van Moolenbroek 		line = 0;
2276*00b67f09SDavid van Moolenbroek 		while ((p = t_fgetbs(fp)) != NULL) {
2277*00b67f09SDavid van Moolenbroek 
2278*00b67f09SDavid van Moolenbroek 			++line;
2279*00b67f09SDavid van Moolenbroek 
2280*00b67f09SDavid van Moolenbroek 			/*
2281*00b67f09SDavid van Moolenbroek 			 * Skip comment lines.
2282*00b67f09SDavid van Moolenbroek 			 */
2283*00b67f09SDavid van Moolenbroek 			if ((isspace((unsigned char)*p)) || (*p == '#')) {
2284*00b67f09SDavid van Moolenbroek 				(void)free(p);
2285*00b67f09SDavid van Moolenbroek 				continue;
2286*00b67f09SDavid van Moolenbroek 			}
2287*00b67f09SDavid van Moolenbroek 
2288*00b67f09SDavid van Moolenbroek 			cnt = bustline(p, Tokens);
2289*00b67f09SDavid van Moolenbroek 			if (cnt == 5) {
2290*00b67f09SDavid van Moolenbroek 				/*
2291*00b67f09SDavid van Moolenbroek 				 *	testname, dc_method,
2292*00b67f09SDavid van Moolenbroek 				 *	exp_data, exp_data_len,
2293*00b67f09SDavid van Moolenbroek 				 *	exp_result.
2294*00b67f09SDavid van Moolenbroek 				 */
2295*00b67f09SDavid van Moolenbroek 
2296*00b67f09SDavid van Moolenbroek 				dc_method = t_dc_method_fromtext(Tokens[3]);
2297*00b67f09SDavid van Moolenbroek 				exp_result = t_dns_result_fromtext(Tokens[4]);
2298*00b67f09SDavid van Moolenbroek 				exp_data_len = strtoul(Tokens[3], NULL, 10);
2299*00b67f09SDavid van Moolenbroek 
2300*00b67f09SDavid van Moolenbroek 				result = test_dns_name_towire(Tokens[0],
2301*00b67f09SDavid van Moolenbroek 							      dc_method,
2302*00b67f09SDavid van Moolenbroek 							      Tokens[2],
2303*00b67f09SDavid van Moolenbroek 							      exp_data_len,
2304*00b67f09SDavid van Moolenbroek 							      exp_result,
2305*00b67f09SDavid van Moolenbroek 							      buflen);
2306*00b67f09SDavid van Moolenbroek 			} else {
2307*00b67f09SDavid van Moolenbroek 				t_info("bad format at line %d\n", line);
2308*00b67f09SDavid van Moolenbroek 			}
2309*00b67f09SDavid van Moolenbroek 
2310*00b67f09SDavid van Moolenbroek 			(void)free(p);
2311*00b67f09SDavid van Moolenbroek 			t_result(result);
2312*00b67f09SDavid van Moolenbroek 		}
2313*00b67f09SDavid van Moolenbroek 		(void)fclose(fp);
2314*00b67f09SDavid van Moolenbroek 	} else {
2315*00b67f09SDavid van Moolenbroek 		t_info("Missing datafile %s\n", testfile);
2316*00b67f09SDavid van Moolenbroek 		t_result(result);
2317*00b67f09SDavid van Moolenbroek 	}
2318*00b67f09SDavid van Moolenbroek }
2319*00b67f09SDavid van Moolenbroek 
2320*00b67f09SDavid van Moolenbroek static void
t_dns_name_towire_1(void)2321*00b67f09SDavid van Moolenbroek t_dns_name_towire_1(void) {
2322*00b67f09SDavid van Moolenbroek 	t_assert("dns_name_towire", 1, T_REQUIRED, "%s", a51);
2323*00b67f09SDavid van Moolenbroek 	t_dns_name_towire_x("dns_name_towire_1_data", BUFLEN);
2324*00b67f09SDavid van Moolenbroek }
2325*00b67f09SDavid van Moolenbroek 
2326*00b67f09SDavid van Moolenbroek static void
t_dns_name_towire_2(void)2327*00b67f09SDavid van Moolenbroek t_dns_name_towire_2(void) {
2328*00b67f09SDavid van Moolenbroek 	t_assert("dns_name_towire", 2, T_REQUIRED, "%s", a52);
2329*00b67f09SDavid van Moolenbroek 	t_dns_name_towire_x("dns_name_towire_2_data", 2);
2330*00b67f09SDavid van Moolenbroek }
2331*00b67f09SDavid van Moolenbroek 
2332*00b67f09SDavid van Moolenbroek static void
t_dns_name_towire(void)2333*00b67f09SDavid van Moolenbroek t_dns_name_towire(void) {
2334*00b67f09SDavid van Moolenbroek 	t_dns_name_towire_1();
2335*00b67f09SDavid van Moolenbroek 	t_dns_name_towire_2();
2336*00b67f09SDavid van Moolenbroek }
2337*00b67f09SDavid van Moolenbroek 
2338*00b67f09SDavid van Moolenbroek #if 0 /* This is silly.  A test should either exist, or not, but not
2339*00b67f09SDavid van Moolenbroek        * one that just returns "UNTESTED."
2340*00b67f09SDavid van Moolenbroek        */
2341*00b67f09SDavid van Moolenbroek static const char *a53 =
2342*00b67f09SDavid van Moolenbroek 		"dns_name_concatenate(prefix, suffix, name, target) "
2343*00b67f09SDavid van Moolenbroek 		"concatenates prefix and suffix, stores the result "
2344*00b67f09SDavid van Moolenbroek 		"in target, canonicalizes any bitstring labels "
2345*00b67f09SDavid van Moolenbroek 		"and returns ISC_R_SUCCESS";
2346*00b67f09SDavid van Moolenbroek 
2347*00b67f09SDavid van Moolenbroek static void
2348*00b67f09SDavid van Moolenbroek t_dns_name_concatenate(void) {
2349*00b67f09SDavid van Moolenbroek 	t_assert("dns_name_concatenate", 1, T_REQUIRED, "%s", a53);
2350*00b67f09SDavid van Moolenbroek 	t_result(T_UNTESTED);
2351*00b67f09SDavid van Moolenbroek }
2352*00b67f09SDavid van Moolenbroek #endif
2353*00b67f09SDavid van Moolenbroek 
2354*00b67f09SDavid van Moolenbroek testspec_t T_testlist[] = {
2355*00b67f09SDavid van Moolenbroek 	{	(PFV) t_dns_name_init,		"dns_name_init"		},
2356*00b67f09SDavid van Moolenbroek 	{	(PFV) t_dns_name_invalidate,	"dns_name_invalidate"	},
2357*00b67f09SDavid van Moolenbroek 	{	(PFV) t_dns_name_setbuffer,	"dns_name_setbuffer"	},
2358*00b67f09SDavid van Moolenbroek 	{	(PFV) t_dns_name_hasbuffer,	"dns_name_hasbuffer"	},
2359*00b67f09SDavid van Moolenbroek 	{	(PFV) t_dns_name_isabsolute,	"dns_name_isabsolute"	},
2360*00b67f09SDavid van Moolenbroek 	{	(PFV) t_dns_name_hash,		"dns_name_hash"		},
2361*00b67f09SDavid van Moolenbroek 	{	(PFV) t_dns_name_fullcompare,	"dns_name_fullcompare"	},
2362*00b67f09SDavid van Moolenbroek 	{	(PFV) t_dns_name_compare,	"dns_name_compare"	},
2363*00b67f09SDavid van Moolenbroek 	{	(PFV) t_dns_name_rdatacompare,	"dns_name_rdatacompare"	},
2364*00b67f09SDavid van Moolenbroek 	{	(PFV) t_dns_name_issubdomain,	"dns_name_issubdomain"	},
2365*00b67f09SDavid van Moolenbroek 	{	(PFV) t_dns_name_countlabels,	"dns_name_countlabels"	},
2366*00b67f09SDavid van Moolenbroek 	{	(PFV) t_dns_name_getlabel,	"dns_name_getlabel"	},
2367*00b67f09SDavid van Moolenbroek 	{	(PFV) t_dns_name_getlabelsequence, "dns_name_getlabelsequence" },
2368*00b67f09SDavid van Moolenbroek 	{	(PFV) t_dns_name_fromregion,	"dns_name_fromregion"	},
2369*00b67f09SDavid van Moolenbroek 	{	(PFV) t_dns_name_toregion,	"dns_name_toregion"	},
2370*00b67f09SDavid van Moolenbroek 	{	(PFV) t_dns_name_fromwire,	"dns_name_fromwire"	},
2371*00b67f09SDavid van Moolenbroek 	{	(PFV) t_dns_name_towire,	"dns_name_towire"	},
2372*00b67f09SDavid van Moolenbroek 	{	(PFV) t_dns_name_fromtext,	"dns_name_fromtext"	},
2373*00b67f09SDavid van Moolenbroek 	{	(PFV) t_dns_name_totext,	"dns_name_totext"	},
2374*00b67f09SDavid van Moolenbroek #if 0
2375*00b67f09SDavid van Moolenbroek 	{	(PFV) t_dns_name_concatenate,	"dns_name_concatenate"	},
2376*00b67f09SDavid van Moolenbroek #endif
2377*00b67f09SDavid van Moolenbroek 	{	(PFV) 0,			NULL			}
2378*00b67f09SDavid van Moolenbroek };
2379*00b67f09SDavid van Moolenbroek 
2380*00b67f09SDavid van Moolenbroek #ifdef WIN32
2381*00b67f09SDavid van Moolenbroek int
main(int argc,char ** argv)2382*00b67f09SDavid van Moolenbroek main(int argc, char **argv) {
2383*00b67f09SDavid van Moolenbroek 	t_settests(T_testlist);
2384*00b67f09SDavid van Moolenbroek 	return (t_main(argc, argv));
2385*00b67f09SDavid van Moolenbroek }
2386*00b67f09SDavid van Moolenbroek #endif
2387