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, ®ion);
1574*00b67f09SDavid van Moolenbroek
1575*00b67f09SDavid van Moolenbroek dns_name_init(&dns_name2, NULL);
1576*00b67f09SDavid van Moolenbroek dns_name_fromregion(&dns_name2, ®ion);
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