1*00b67f09SDavid van Moolenbroek /* $NetBSD: t_db.c,v 1.7 2014/12/10 04:37:53 christos Exp $ */
2*00b67f09SDavid van Moolenbroek
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek * Copyright (C) 2004, 2005, 2007, 2009, 2011-2013 Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek * Copyright (C) 1999-2001 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_db.c,v 1.41 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/entropy.h>
28*00b67f09SDavid van Moolenbroek #include <isc/hash.h>
29*00b67f09SDavid van Moolenbroek #include <isc/mem.h>
30*00b67f09SDavid van Moolenbroek #include <isc/string.h>
31*00b67f09SDavid van Moolenbroek #include <isc/util.h>
32*00b67f09SDavid van Moolenbroek
33*00b67f09SDavid van Moolenbroek #include <dns/db.h>
34*00b67f09SDavid van Moolenbroek #include <dns/fixedname.h>
35*00b67f09SDavid van Moolenbroek #include <dns/rdata.h>
36*00b67f09SDavid van Moolenbroek #include <dns/rdataclass.h>
37*00b67f09SDavid van Moolenbroek #include <dns/rdatatype.h>
38*00b67f09SDavid van Moolenbroek #include <dns/rdatalist.h>
39*00b67f09SDavid van Moolenbroek #include <dns/rdataset.h>
40*00b67f09SDavid van Moolenbroek #include <dns/result.h>
41*00b67f09SDavid van Moolenbroek
42*00b67f09SDavid van Moolenbroek #include <tests/t_api.h>
43*00b67f09SDavid van Moolenbroek
44*00b67f09SDavid van Moolenbroek static isc_result_t
t_create(const char * db_type,const char * origin,const char * class,const char * model,isc_mem_t * mctx,dns_db_t ** db)45*00b67f09SDavid van Moolenbroek t_create(const char *db_type, const char *origin, const char *class,
46*00b67f09SDavid van Moolenbroek const char *model, isc_mem_t *mctx, dns_db_t **db)
47*00b67f09SDavid van Moolenbroek {
48*00b67f09SDavid van Moolenbroek int len;
49*00b67f09SDavid van Moolenbroek isc_result_t dns_result;
50*00b67f09SDavid van Moolenbroek dns_dbtype_t dbtype;
51*00b67f09SDavid van Moolenbroek isc_textregion_t region;
52*00b67f09SDavid van Moolenbroek isc_buffer_t origin_buffer;
53*00b67f09SDavid van Moolenbroek dns_fixedname_t dns_origin;
54*00b67f09SDavid van Moolenbroek dns_rdataclass_t rdataclass;
55*00b67f09SDavid van Moolenbroek
56*00b67f09SDavid van Moolenbroek
57*00b67f09SDavid van Moolenbroek dbtype = dns_dbtype_zone;
58*00b67f09SDavid van Moolenbroek if (strcasecmp(model, "cache") == 0)
59*00b67f09SDavid van Moolenbroek dbtype = dns_dbtype_cache;
60*00b67f09SDavid van Moolenbroek
61*00b67f09SDavid van Moolenbroek dns_fixedname_init(&dns_origin);
62*00b67f09SDavid van Moolenbroek len = strlen(origin);
63*00b67f09SDavid van Moolenbroek isc_buffer_constinit(&origin_buffer, origin, len);
64*00b67f09SDavid van Moolenbroek isc_buffer_add(&origin_buffer, len);
65*00b67f09SDavid van Moolenbroek dns_result = dns_name_fromtext(dns_fixedname_name(&dns_origin),
66*00b67f09SDavid van Moolenbroek &origin_buffer, NULL, 0, NULL);
67*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
68*00b67f09SDavid van Moolenbroek t_info("dns_name_fromtext failed %s\n",
69*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
70*00b67f09SDavid van Moolenbroek return(dns_result);
71*00b67f09SDavid van Moolenbroek }
72*00b67f09SDavid van Moolenbroek
73*00b67f09SDavid van Moolenbroek DE_CONST(class, region.base);
74*00b67f09SDavid van Moolenbroek region.length = strlen(class);
75*00b67f09SDavid van Moolenbroek dns_result = dns_rdataclass_fromtext(&rdataclass, ®ion);
76*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
77*00b67f09SDavid van Moolenbroek t_info("dns_rdataclass_fromtext failed %s\n",
78*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
79*00b67f09SDavid van Moolenbroek return(dns_result);
80*00b67f09SDavid van Moolenbroek }
81*00b67f09SDavid van Moolenbroek
82*00b67f09SDavid van Moolenbroek dns_result = dns_db_create(mctx, db_type,
83*00b67f09SDavid van Moolenbroek dns_fixedname_name(&dns_origin),
84*00b67f09SDavid van Moolenbroek dbtype, rdataclass, 0, NULL, db);
85*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS)
86*00b67f09SDavid van Moolenbroek t_info("dns_db_create failed %s\n",
87*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
88*00b67f09SDavid van Moolenbroek
89*00b67f09SDavid van Moolenbroek return(dns_result);
90*00b67f09SDavid van Moolenbroek
91*00b67f09SDavid van Moolenbroek }
92*00b67f09SDavid van Moolenbroek
93*00b67f09SDavid van Moolenbroek static int
t_dns_db_load(char ** av)94*00b67f09SDavid van Moolenbroek t_dns_db_load(char **av) {
95*00b67f09SDavid van Moolenbroek char *filename;
96*00b67f09SDavid van Moolenbroek char *db_type;
97*00b67f09SDavid van Moolenbroek char *origin;
98*00b67f09SDavid van Moolenbroek char *model;
99*00b67f09SDavid van Moolenbroek char *class;
100*00b67f09SDavid van Moolenbroek char *expected_load_result;
101*00b67f09SDavid van Moolenbroek char *findname;
102*00b67f09SDavid van Moolenbroek char *find_type;
103*00b67f09SDavid van Moolenbroek char *expected_find_result;
104*00b67f09SDavid van Moolenbroek
105*00b67f09SDavid van Moolenbroek int result;
106*00b67f09SDavid van Moolenbroek int len;
107*00b67f09SDavid van Moolenbroek dns_db_t *db;
108*00b67f09SDavid van Moolenbroek isc_result_t dns_result;
109*00b67f09SDavid van Moolenbroek isc_result_t isc_result;
110*00b67f09SDavid van Moolenbroek isc_mem_t *mctx;
111*00b67f09SDavid van Moolenbroek isc_entropy_t *ectx;
112*00b67f09SDavid van Moolenbroek dns_dbnode_t *nodep;
113*00b67f09SDavid van Moolenbroek isc_textregion_t textregion;
114*00b67f09SDavid van Moolenbroek isc_buffer_t findname_buffer;
115*00b67f09SDavid van Moolenbroek dns_fixedname_t dns_findname;
116*00b67f09SDavid van Moolenbroek dns_fixedname_t dns_foundname;
117*00b67f09SDavid van Moolenbroek dns_rdataset_t rdataset;
118*00b67f09SDavid van Moolenbroek dns_rdatatype_t rdatatype;
119*00b67f09SDavid van Moolenbroek dns_dbversion_t *versionp;
120*00b67f09SDavid van Moolenbroek isc_result_t exp_load_result;
121*00b67f09SDavid van Moolenbroek isc_result_t exp_find_result;
122*00b67f09SDavid van Moolenbroek
123*00b67f09SDavid van Moolenbroek db = NULL;
124*00b67f09SDavid van Moolenbroek mctx = NULL;
125*00b67f09SDavid van Moolenbroek ectx = NULL;
126*00b67f09SDavid van Moolenbroek filename = T_ARG(0);
127*00b67f09SDavid van Moolenbroek db_type = T_ARG(1);
128*00b67f09SDavid van Moolenbroek origin = T_ARG(2);
129*00b67f09SDavid van Moolenbroek model = T_ARG(3);
130*00b67f09SDavid van Moolenbroek class = T_ARG(4);
131*00b67f09SDavid van Moolenbroek expected_load_result = T_ARG(5);
132*00b67f09SDavid van Moolenbroek findname = T_ARG(6);
133*00b67f09SDavid van Moolenbroek find_type = T_ARG(7);
134*00b67f09SDavid van Moolenbroek expected_find_result = T_ARG(8);
135*00b67f09SDavid van Moolenbroek
136*00b67f09SDavid van Moolenbroek t_info("testing using file %s and name %s\n", filename, findname);
137*00b67f09SDavid van Moolenbroek
138*00b67f09SDavid van Moolenbroek exp_load_result = t_dns_result_fromtext(expected_load_result);
139*00b67f09SDavid van Moolenbroek exp_find_result = t_dns_result_fromtext(expected_find_result);
140*00b67f09SDavid van Moolenbroek
141*00b67f09SDavid van Moolenbroek isc_result = isc_mem_create(0, 0, &mctx);
142*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
143*00b67f09SDavid van Moolenbroek t_info("isc_mem_create failed %s\n",
144*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
145*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
146*00b67f09SDavid van Moolenbroek }
147*00b67f09SDavid van Moolenbroek
148*00b67f09SDavid van Moolenbroek isc_result = isc_entropy_create(mctx, &ectx);
149*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
150*00b67f09SDavid van Moolenbroek t_info("isc_entropy_create failed %s\n",
151*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
152*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
153*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
154*00b67f09SDavid van Moolenbroek }
155*00b67f09SDavid van Moolenbroek
156*00b67f09SDavid van Moolenbroek isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
157*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
158*00b67f09SDavid van Moolenbroek t_info("isc_hash_create failed %s\n",
159*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
160*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
161*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
162*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
163*00b67f09SDavid van Moolenbroek }
164*00b67f09SDavid van Moolenbroek
165*00b67f09SDavid van Moolenbroek dns_result = t_create(db_type, origin, class, model, mctx, &db);
166*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
167*00b67f09SDavid van Moolenbroek isc_hash_destroy();
168*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
169*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
170*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
171*00b67f09SDavid van Moolenbroek }
172*00b67f09SDavid van Moolenbroek
173*00b67f09SDavid van Moolenbroek dns_result = dns_db_load(db, filename);
174*00b67f09SDavid van Moolenbroek if (dns_result != exp_load_result) {
175*00b67f09SDavid van Moolenbroek t_info("dns_db_load returned %s, expected %s\n",
176*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result),
177*00b67f09SDavid van Moolenbroek dns_result_totext(exp_load_result));
178*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
179*00b67f09SDavid van Moolenbroek isc_hash_destroy();
180*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
181*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
182*00b67f09SDavid van Moolenbroek return(T_FAIL);
183*00b67f09SDavid van Moolenbroek }
184*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
185*00b67f09SDavid van Moolenbroek result = T_PASS;
186*00b67f09SDavid van Moolenbroek goto cleanup_db;
187*00b67f09SDavid van Moolenbroek }
188*00b67f09SDavid van Moolenbroek
189*00b67f09SDavid van Moolenbroek dns_fixedname_init(&dns_findname);
190*00b67f09SDavid van Moolenbroek len = strlen(findname);
191*00b67f09SDavid van Moolenbroek isc_buffer_init(&findname_buffer, findname, len);
192*00b67f09SDavid van Moolenbroek isc_buffer_add(&findname_buffer, len);
193*00b67f09SDavid van Moolenbroek dns_result = dns_name_fromtext(dns_fixedname_name(&dns_findname),
194*00b67f09SDavid van Moolenbroek &findname_buffer, NULL, 0, NULL);
195*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
196*00b67f09SDavid van Moolenbroek t_info("dns_name_fromtext failed %s\n",
197*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
198*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
199*00b67f09SDavid van Moolenbroek isc_hash_destroy();
200*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
201*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
202*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
203*00b67f09SDavid van Moolenbroek }
204*00b67f09SDavid van Moolenbroek
205*00b67f09SDavid van Moolenbroek textregion.base = find_type;
206*00b67f09SDavid van Moolenbroek textregion.length = strlen(find_type);
207*00b67f09SDavid van Moolenbroek dns_result = dns_rdatatype_fromtext(&rdatatype, &textregion);
208*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
209*00b67f09SDavid van Moolenbroek t_info("dns_rdatatype_fromtext %s failed %s\n",
210*00b67f09SDavid van Moolenbroek find_type,
211*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
212*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
213*00b67f09SDavid van Moolenbroek isc_hash_destroy();
214*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
215*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
216*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
217*00b67f09SDavid van Moolenbroek }
218*00b67f09SDavid van Moolenbroek
219*00b67f09SDavid van Moolenbroek versionp = NULL;
220*00b67f09SDavid van Moolenbroek dns_fixedname_init(&dns_foundname);
221*00b67f09SDavid van Moolenbroek dns_rdataset_init(&rdataset);
222*00b67f09SDavid van Moolenbroek if (dns_db_iszone(db))
223*00b67f09SDavid van Moolenbroek dns_db_currentversion(db, &versionp);
224*00b67f09SDavid van Moolenbroek nodep = NULL;
225*00b67f09SDavid van Moolenbroek
226*00b67f09SDavid van Moolenbroek dns_result = dns_db_find(db,
227*00b67f09SDavid van Moolenbroek dns_fixedname_name(&dns_findname),
228*00b67f09SDavid van Moolenbroek versionp,
229*00b67f09SDavid van Moolenbroek rdatatype,
230*00b67f09SDavid van Moolenbroek DNS_DBFIND_GLUEOK,
231*00b67f09SDavid van Moolenbroek 0,
232*00b67f09SDavid van Moolenbroek &nodep,
233*00b67f09SDavid van Moolenbroek dns_fixedname_name(&dns_foundname),
234*00b67f09SDavid van Moolenbroek &rdataset, NULL);
235*00b67f09SDavid van Moolenbroek
236*00b67f09SDavid van Moolenbroek if (dns_result != exp_find_result) {
237*00b67f09SDavid van Moolenbroek t_info("dns_db_find returned %s, expected %s\n",
238*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result),
239*00b67f09SDavid van Moolenbroek dns_result_totext(exp_find_result));
240*00b67f09SDavid van Moolenbroek result = T_FAIL;
241*00b67f09SDavid van Moolenbroek } else {
242*00b67f09SDavid van Moolenbroek result = T_PASS;
243*00b67f09SDavid van Moolenbroek }
244*00b67f09SDavid van Moolenbroek
245*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_NOTFOUND) {
246*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
247*00b67f09SDavid van Moolenbroek if (dns_rdataset_isassociated(&rdataset))
248*00b67f09SDavid van Moolenbroek dns_rdataset_disassociate(&rdataset);
249*00b67f09SDavid van Moolenbroek }
250*00b67f09SDavid van Moolenbroek
251*00b67f09SDavid van Moolenbroek if (dns_db_iszone(db))
252*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &versionp, ISC_FALSE);
253*00b67f09SDavid van Moolenbroek cleanup_db:
254*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
255*00b67f09SDavid van Moolenbroek isc_hash_destroy();
256*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
257*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
258*00b67f09SDavid van Moolenbroek return(result);
259*00b67f09SDavid van Moolenbroek }
260*00b67f09SDavid van Moolenbroek
261*00b67f09SDavid van Moolenbroek static const char *a1 =
262*00b67f09SDavid van Moolenbroek "A call to dns_db_load(db, filename) loads the contents of "
263*00b67f09SDavid van Moolenbroek "the database in filename into db.";
264*00b67f09SDavid van Moolenbroek
265*00b67f09SDavid van Moolenbroek static void
t1(void)266*00b67f09SDavid van Moolenbroek t1(void) {
267*00b67f09SDavid van Moolenbroek int result;
268*00b67f09SDavid van Moolenbroek
269*00b67f09SDavid van Moolenbroek t_assert("dns_db_load", 1, T_REQUIRED, "%s", a1);
270*00b67f09SDavid van Moolenbroek result = t_eval("dns_db_load_data", t_dns_db_load, 9);
271*00b67f09SDavid van Moolenbroek t_result(result);
272*00b67f09SDavid van Moolenbroek }
273*00b67f09SDavid van Moolenbroek
274*00b67f09SDavid van Moolenbroek
275*00b67f09SDavid van Moolenbroek static const char *a2 =
276*00b67f09SDavid van Moolenbroek "When the database db has cache semantics, a call to "
277*00b67f09SDavid van Moolenbroek "dns_db_iscache(db) returns ISC_TRUE.";
278*00b67f09SDavid van Moolenbroek
279*00b67f09SDavid van Moolenbroek static int
t_dns_db_zc_x(char * filename,char * db_type,char * origin,char * class,dns_dbtype_t dbtype,isc_boolean_t (* cf)(dns_db_t *),isc_boolean_t exp_result)280*00b67f09SDavid van Moolenbroek t_dns_db_zc_x(char *filename, char *db_type, char *origin, char *class,
281*00b67f09SDavid van Moolenbroek dns_dbtype_t dbtype, isc_boolean_t(*cf)(dns_db_t *),
282*00b67f09SDavid van Moolenbroek isc_boolean_t exp_result)
283*00b67f09SDavid van Moolenbroek {
284*00b67f09SDavid van Moolenbroek int result;
285*00b67f09SDavid van Moolenbroek int len;
286*00b67f09SDavid van Moolenbroek dns_db_t *db;
287*00b67f09SDavid van Moolenbroek isc_result_t dns_result;
288*00b67f09SDavid van Moolenbroek isc_result_t isc_result;
289*00b67f09SDavid van Moolenbroek isc_mem_t *mctx;
290*00b67f09SDavid van Moolenbroek isc_entropy_t *ectx;
291*00b67f09SDavid van Moolenbroek dns_rdataclass_t rdataclass;
292*00b67f09SDavid van Moolenbroek isc_textregion_t textregion;
293*00b67f09SDavid van Moolenbroek isc_buffer_t origin_buffer;
294*00b67f09SDavid van Moolenbroek dns_fixedname_t dns_origin;
295*00b67f09SDavid van Moolenbroek
296*00b67f09SDavid van Moolenbroek db = NULL;
297*00b67f09SDavid van Moolenbroek mctx = NULL;
298*00b67f09SDavid van Moolenbroek ectx = NULL;
299*00b67f09SDavid van Moolenbroek
300*00b67f09SDavid van Moolenbroek t_info("testing using file %s\n", filename);
301*00b67f09SDavid van Moolenbroek
302*00b67f09SDavid van Moolenbroek dns_fixedname_init(&dns_origin);
303*00b67f09SDavid van Moolenbroek len = strlen(origin);
304*00b67f09SDavid van Moolenbroek isc_buffer_init(&origin_buffer, origin, len);
305*00b67f09SDavid van Moolenbroek isc_buffer_add(&origin_buffer, len);
306*00b67f09SDavid van Moolenbroek dns_result = dns_name_fromtext(dns_fixedname_name(&dns_origin),
307*00b67f09SDavid van Moolenbroek &origin_buffer, NULL, 0, NULL);
308*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
309*00b67f09SDavid van Moolenbroek t_info("dns_name_fromtext failed %s\n",
310*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
311*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
312*00b67f09SDavid van Moolenbroek }
313*00b67f09SDavid van Moolenbroek
314*00b67f09SDavid van Moolenbroek textregion.base = class;
315*00b67f09SDavid van Moolenbroek textregion.length = strlen(class);
316*00b67f09SDavid van Moolenbroek dns_result = dns_rdataclass_fromtext(&rdataclass, &textregion);
317*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
318*00b67f09SDavid van Moolenbroek t_info("dns_rdataclass_fromtext failed %s\n",
319*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
320*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
321*00b67f09SDavid van Moolenbroek }
322*00b67f09SDavid van Moolenbroek
323*00b67f09SDavid van Moolenbroek isc_result = isc_mem_create(0, 0, &mctx);
324*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
325*00b67f09SDavid van Moolenbroek t_info("isc_mem_create failed %s\n",
326*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
327*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
328*00b67f09SDavid van Moolenbroek }
329*00b67f09SDavid van Moolenbroek
330*00b67f09SDavid van Moolenbroek isc_result = isc_entropy_create(mctx, &ectx);
331*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
332*00b67f09SDavid van Moolenbroek t_info("isc_entropy_create failed %s\n",
333*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
334*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
335*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
336*00b67f09SDavid van Moolenbroek }
337*00b67f09SDavid van Moolenbroek
338*00b67f09SDavid van Moolenbroek isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
339*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
340*00b67f09SDavid van Moolenbroek t_info("isc_hash_create failed %s\n",
341*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
342*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
343*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
344*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
345*00b67f09SDavid van Moolenbroek }
346*00b67f09SDavid van Moolenbroek
347*00b67f09SDavid van Moolenbroek dns_result = dns_db_create(mctx, db_type,
348*00b67f09SDavid van Moolenbroek dns_fixedname_name(&dns_origin),
349*00b67f09SDavid van Moolenbroek dbtype, rdataclass, 0, NULL, &db);
350*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
351*00b67f09SDavid van Moolenbroek t_info("dns_db_create failed %s\n",
352*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
353*00b67f09SDavid van Moolenbroek isc_hash_destroy();
354*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
355*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
356*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
357*00b67f09SDavid van Moolenbroek }
358*00b67f09SDavid van Moolenbroek
359*00b67f09SDavid van Moolenbroek dns_result = dns_db_load(db, filename);
360*00b67f09SDavid van Moolenbroek if (dns_result == ISC_R_SUCCESS) {
361*00b67f09SDavid van Moolenbroek if ((*cf)(db) == exp_result)
362*00b67f09SDavid van Moolenbroek result = T_PASS;
363*00b67f09SDavid van Moolenbroek else
364*00b67f09SDavid van Moolenbroek result = T_FAIL;
365*00b67f09SDavid van Moolenbroek } else {
366*00b67f09SDavid van Moolenbroek t_info("dns_db_load failed %s\n",
367*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
368*00b67f09SDavid van Moolenbroek result = T_FAIL;
369*00b67f09SDavid van Moolenbroek }
370*00b67f09SDavid van Moolenbroek
371*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
372*00b67f09SDavid van Moolenbroek isc_hash_destroy();
373*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
374*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
375*00b67f09SDavid van Moolenbroek return(result);
376*00b67f09SDavid van Moolenbroek }
377*00b67f09SDavid van Moolenbroek
378*00b67f09SDavid van Moolenbroek static int
test_dns_db_zc_x(const char * filename,dns_dbtype_t dbtype,isc_boolean_t (* cf)(dns_db_t *),isc_boolean_t exp_result)379*00b67f09SDavid van Moolenbroek test_dns_db_zc_x(const char *filename, dns_dbtype_t dbtype,
380*00b67f09SDavid van Moolenbroek isc_boolean_t(*cf)(dns_db_t *), isc_boolean_t exp_result)
381*00b67f09SDavid van Moolenbroek {
382*00b67f09SDavid van Moolenbroek
383*00b67f09SDavid van Moolenbroek FILE *fp;
384*00b67f09SDavid van Moolenbroek char *p;
385*00b67f09SDavid van Moolenbroek int line;
386*00b67f09SDavid van Moolenbroek int cnt;
387*00b67f09SDavid van Moolenbroek int result;
388*00b67f09SDavid van Moolenbroek int nfails;
389*00b67f09SDavid van Moolenbroek int nprobs;
390*00b67f09SDavid van Moolenbroek char *tokens[T_MAXTOKS];
391*00b67f09SDavid van Moolenbroek
392*00b67f09SDavid van Moolenbroek nfails = 0;
393*00b67f09SDavid van Moolenbroek nprobs = 0;
394*00b67f09SDavid van Moolenbroek
395*00b67f09SDavid van Moolenbroek fp = fopen(filename, "r");
396*00b67f09SDavid van Moolenbroek if (fp != NULL) {
397*00b67f09SDavid van Moolenbroek line = 0;
398*00b67f09SDavid van Moolenbroek while ((p = t_fgetbs(fp)) != NULL) {
399*00b67f09SDavid van Moolenbroek
400*00b67f09SDavid van Moolenbroek ++line;
401*00b67f09SDavid van Moolenbroek
402*00b67f09SDavid van Moolenbroek /*
403*00b67f09SDavid van Moolenbroek * Skip comment lines.
404*00b67f09SDavid van Moolenbroek */
405*00b67f09SDavid van Moolenbroek if ((isspace((unsigned char)*p)) || (*p == '#')) {
406*00b67f09SDavid van Moolenbroek (void)free(p);
407*00b67f09SDavid van Moolenbroek continue;
408*00b67f09SDavid van Moolenbroek }
409*00b67f09SDavid van Moolenbroek
410*00b67f09SDavid van Moolenbroek cnt = t_bustline(p, tokens);
411*00b67f09SDavid van Moolenbroek if (cnt == 4) {
412*00b67f09SDavid van Moolenbroek result = t_dns_db_zc_x(tokens[0], /* file */
413*00b67f09SDavid van Moolenbroek tokens[1], /* type */
414*00b67f09SDavid van Moolenbroek tokens[2], /* origin */
415*00b67f09SDavid van Moolenbroek tokens[3], /* class */
416*00b67f09SDavid van Moolenbroek dbtype, /* cache */
417*00b67f09SDavid van Moolenbroek cf, /* check func */
418*00b67f09SDavid van Moolenbroek exp_result);/* expect */
419*00b67f09SDavid van Moolenbroek if (result != T_PASS) {
420*00b67f09SDavid van Moolenbroek if (result == T_FAIL)
421*00b67f09SDavid van Moolenbroek ++nfails;
422*00b67f09SDavid van Moolenbroek else
423*00b67f09SDavid van Moolenbroek ++nprobs;
424*00b67f09SDavid van Moolenbroek }
425*00b67f09SDavid van Moolenbroek } else {
426*00b67f09SDavid van Moolenbroek t_info("bad format in %s at line %d\n",
427*00b67f09SDavid van Moolenbroek filename, line);
428*00b67f09SDavid van Moolenbroek ++nprobs;
429*00b67f09SDavid van Moolenbroek }
430*00b67f09SDavid van Moolenbroek
431*00b67f09SDavid van Moolenbroek (void)free(p);
432*00b67f09SDavid van Moolenbroek }
433*00b67f09SDavid van Moolenbroek (void)fclose(fp);
434*00b67f09SDavid van Moolenbroek } else {
435*00b67f09SDavid van Moolenbroek t_info("Missing datafile %s\n", filename);
436*00b67f09SDavid van Moolenbroek ++nprobs;
437*00b67f09SDavid van Moolenbroek }
438*00b67f09SDavid van Moolenbroek
439*00b67f09SDavid van Moolenbroek result = T_UNRESOLVED;
440*00b67f09SDavid van Moolenbroek
441*00b67f09SDavid van Moolenbroek if (nfails == 0 && nprobs == 0)
442*00b67f09SDavid van Moolenbroek result = T_PASS;
443*00b67f09SDavid van Moolenbroek else if (nfails)
444*00b67f09SDavid van Moolenbroek result = T_FAIL;
445*00b67f09SDavid van Moolenbroek
446*00b67f09SDavid van Moolenbroek return(result);
447*00b67f09SDavid van Moolenbroek }
448*00b67f09SDavid van Moolenbroek
449*00b67f09SDavid van Moolenbroek static void
t2(void)450*00b67f09SDavid van Moolenbroek t2(void) {
451*00b67f09SDavid van Moolenbroek int result;
452*00b67f09SDavid van Moolenbroek
453*00b67f09SDavid van Moolenbroek t_assert("dns_db_iscache", 2, T_REQUIRED, "%s", a2);
454*00b67f09SDavid van Moolenbroek result = test_dns_db_zc_x("dns_db_iscache_1_data",
455*00b67f09SDavid van Moolenbroek dns_dbtype_cache, dns_db_iscache, ISC_TRUE);
456*00b67f09SDavid van Moolenbroek t_result(result);
457*00b67f09SDavid van Moolenbroek }
458*00b67f09SDavid van Moolenbroek
459*00b67f09SDavid van Moolenbroek
460*00b67f09SDavid van Moolenbroek static const char *a3 =
461*00b67f09SDavid van Moolenbroek "When the database db has zone semantics, a call to "
462*00b67f09SDavid van Moolenbroek "dns_db_iscache(db) returns ISC_FALSE.";
463*00b67f09SDavid van Moolenbroek
464*00b67f09SDavid van Moolenbroek
465*00b67f09SDavid van Moolenbroek static void
t3(void)466*00b67f09SDavid van Moolenbroek t3(void) {
467*00b67f09SDavid van Moolenbroek int result;
468*00b67f09SDavid van Moolenbroek
469*00b67f09SDavid van Moolenbroek t_assert("dns_db_iscache", 3, T_REQUIRED, "%s", a3);
470*00b67f09SDavid van Moolenbroek result = test_dns_db_zc_x("dns_db_iscache_2_data",
471*00b67f09SDavid van Moolenbroek dns_dbtype_zone, dns_db_iscache, ISC_FALSE);
472*00b67f09SDavid van Moolenbroek t_result(result);
473*00b67f09SDavid van Moolenbroek }
474*00b67f09SDavid van Moolenbroek
475*00b67f09SDavid van Moolenbroek
476*00b67f09SDavid van Moolenbroek static const char *a4 =
477*00b67f09SDavid van Moolenbroek "When the database db has zone semantics, a call to "
478*00b67f09SDavid van Moolenbroek "dns_db_iszone(db) returns ISC_TRUE.";
479*00b67f09SDavid van Moolenbroek
480*00b67f09SDavid van Moolenbroek
481*00b67f09SDavid van Moolenbroek static void
t4(void)482*00b67f09SDavid van Moolenbroek t4(void) {
483*00b67f09SDavid van Moolenbroek int result;
484*00b67f09SDavid van Moolenbroek
485*00b67f09SDavid van Moolenbroek t_assert("dns_db_iszone", 4, T_REQUIRED, "%s", a4);
486*00b67f09SDavid van Moolenbroek result = test_dns_db_zc_x("dns_db_iszone_1_data",
487*00b67f09SDavid van Moolenbroek dns_dbtype_zone, dns_db_iszone, ISC_TRUE);
488*00b67f09SDavid van Moolenbroek t_result(result);
489*00b67f09SDavid van Moolenbroek }
490*00b67f09SDavid van Moolenbroek
491*00b67f09SDavid van Moolenbroek
492*00b67f09SDavid van Moolenbroek static const char *a5 =
493*00b67f09SDavid van Moolenbroek "When the database db has cache semantics, a call to "
494*00b67f09SDavid van Moolenbroek "dns_db_iszone(db) returns ISC_FALSE.";
495*00b67f09SDavid van Moolenbroek
496*00b67f09SDavid van Moolenbroek static void
t5(void)497*00b67f09SDavid van Moolenbroek t5(void) {
498*00b67f09SDavid van Moolenbroek int result;
499*00b67f09SDavid van Moolenbroek
500*00b67f09SDavid van Moolenbroek t_assert("dns_db_iszone", 5, T_REQUIRED, "%s", a5);
501*00b67f09SDavid van Moolenbroek result = test_dns_db_zc_x("dns_db_iszone_2_data",
502*00b67f09SDavid van Moolenbroek dns_dbtype_cache, dns_db_iszone, ISC_FALSE);
503*00b67f09SDavid van Moolenbroek t_result(result);
504*00b67f09SDavid van Moolenbroek }
505*00b67f09SDavid van Moolenbroek
506*00b67f09SDavid van Moolenbroek static int
t_dns_db_origin(char ** av)507*00b67f09SDavid van Moolenbroek t_dns_db_origin(char **av) {
508*00b67f09SDavid van Moolenbroek
509*00b67f09SDavid van Moolenbroek char *filename;
510*00b67f09SDavid van Moolenbroek char *origin;
511*00b67f09SDavid van Moolenbroek
512*00b67f09SDavid van Moolenbroek int result;
513*00b67f09SDavid van Moolenbroek int len;
514*00b67f09SDavid van Moolenbroek int order;
515*00b67f09SDavid van Moolenbroek isc_result_t dns_result;
516*00b67f09SDavid van Moolenbroek isc_result_t isc_result;
517*00b67f09SDavid van Moolenbroek isc_mem_t *mctx;
518*00b67f09SDavid van Moolenbroek isc_entropy_t *ectx;
519*00b67f09SDavid van Moolenbroek dns_db_t *db;
520*00b67f09SDavid van Moolenbroek dns_fixedname_t dns_origin;
521*00b67f09SDavid van Moolenbroek dns_fixedname_t dns_dborigin;
522*00b67f09SDavid van Moolenbroek isc_buffer_t origin_buffer;
523*00b67f09SDavid van Moolenbroek
524*00b67f09SDavid van Moolenbroek db = NULL;
525*00b67f09SDavid van Moolenbroek mctx = NULL;
526*00b67f09SDavid van Moolenbroek ectx = NULL;
527*00b67f09SDavid van Moolenbroek
528*00b67f09SDavid van Moolenbroek filename = T_ARG(0);
529*00b67f09SDavid van Moolenbroek origin = T_ARG(1);
530*00b67f09SDavid van Moolenbroek
531*00b67f09SDavid van Moolenbroek t_info("testing with database %s and origin %s\n",
532*00b67f09SDavid van Moolenbroek filename, origin);
533*00b67f09SDavid van Moolenbroek
534*00b67f09SDavid van Moolenbroek isc_result = isc_mem_create(0, 0, &mctx);
535*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
536*00b67f09SDavid van Moolenbroek t_info("isc_mem_create failed %s\n",
537*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
538*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
539*00b67f09SDavid van Moolenbroek }
540*00b67f09SDavid van Moolenbroek
541*00b67f09SDavid van Moolenbroek isc_result = isc_entropy_create(mctx, &ectx);
542*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
543*00b67f09SDavid van Moolenbroek t_info("isc_entropy_create failed %s\n",
544*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
545*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
546*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
547*00b67f09SDavid van Moolenbroek }
548*00b67f09SDavid van Moolenbroek
549*00b67f09SDavid van Moolenbroek isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
550*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
551*00b67f09SDavid van Moolenbroek t_info("isc_hash_create failed %s\n",
552*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
553*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
554*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
555*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
556*00b67f09SDavid van Moolenbroek }
557*00b67f09SDavid van Moolenbroek
558*00b67f09SDavid van Moolenbroek dns_result = t_create("rbt", origin, "in", "isc_true", mctx, &db);
559*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
560*00b67f09SDavid van Moolenbroek t_info("t_create failed %s\n",
561*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
562*00b67f09SDavid van Moolenbroek isc_hash_destroy();
563*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
564*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
565*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
566*00b67f09SDavid van Moolenbroek }
567*00b67f09SDavid van Moolenbroek dns_fixedname_init(&dns_origin);
568*00b67f09SDavid van Moolenbroek dns_fixedname_init(&dns_dborigin);
569*00b67f09SDavid van Moolenbroek
570*00b67f09SDavid van Moolenbroek len = strlen(origin);
571*00b67f09SDavid van Moolenbroek isc_buffer_init(&origin_buffer, origin, len);
572*00b67f09SDavid van Moolenbroek isc_buffer_add(&origin_buffer, len);
573*00b67f09SDavid van Moolenbroek
574*00b67f09SDavid van Moolenbroek dns_result = dns_db_load(db, filename);
575*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
576*00b67f09SDavid van Moolenbroek t_info("dns_db_load failed %s\n",
577*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
578*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
579*00b67f09SDavid van Moolenbroek isc_hash_destroy();
580*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
581*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
582*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
583*00b67f09SDavid van Moolenbroek }
584*00b67f09SDavid van Moolenbroek
585*00b67f09SDavid van Moolenbroek dns_result = dns_name_fromtext(dns_fixedname_name(&dns_origin),
586*00b67f09SDavid van Moolenbroek &origin_buffer, NULL, 0, NULL);
587*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
588*00b67f09SDavid van Moolenbroek t_info("dns_name_fromtext failed %s\n",
589*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
590*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
591*00b67f09SDavid van Moolenbroek isc_hash_destroy();
592*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
593*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
594*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
595*00b67f09SDavid van Moolenbroek }
596*00b67f09SDavid van Moolenbroek order = dns_name_compare(dns_fixedname_name(&dns_origin),
597*00b67f09SDavid van Moolenbroek dns_db_origin(db));
598*00b67f09SDavid van Moolenbroek if (order == 0) {
599*00b67f09SDavid van Moolenbroek result = T_PASS;
600*00b67f09SDavid van Moolenbroek } else {
601*00b67f09SDavid van Moolenbroek t_info("dns_name_compare returned %d\n", order);
602*00b67f09SDavid van Moolenbroek result = T_FAIL;
603*00b67f09SDavid van Moolenbroek }
604*00b67f09SDavid van Moolenbroek
605*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
606*00b67f09SDavid van Moolenbroek isc_hash_destroy();
607*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
608*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
609*00b67f09SDavid van Moolenbroek return(result);
610*00b67f09SDavid van Moolenbroek
611*00b67f09SDavid van Moolenbroek }
612*00b67f09SDavid van Moolenbroek
613*00b67f09SDavid van Moolenbroek static const char *a6 =
614*00b67f09SDavid van Moolenbroek "A call to dns_db_origin(db) returns the origin of the database.";
615*00b67f09SDavid van Moolenbroek
616*00b67f09SDavid van Moolenbroek static void
t6(void)617*00b67f09SDavid van Moolenbroek t6(void) {
618*00b67f09SDavid van Moolenbroek int result;
619*00b67f09SDavid van Moolenbroek
620*00b67f09SDavid van Moolenbroek t_assert("dns_db_origin", 6, T_REQUIRED, "%s", a6);
621*00b67f09SDavid van Moolenbroek result = t_eval("dns_db_origin_data", t_dns_db_origin, 2);
622*00b67f09SDavid van Moolenbroek t_result(result);
623*00b67f09SDavid van Moolenbroek }
624*00b67f09SDavid van Moolenbroek
625*00b67f09SDavid van Moolenbroek
626*00b67f09SDavid van Moolenbroek static const char *a7 =
627*00b67f09SDavid van Moolenbroek "A call to dns_db_class(db) returns the class of the database.";
628*00b67f09SDavid van Moolenbroek
629*00b67f09SDavid van Moolenbroek
630*00b67f09SDavid van Moolenbroek #define CLASSBUFLEN 256
631*00b67f09SDavid van Moolenbroek
632*00b67f09SDavid van Moolenbroek static int
t_dns_db_class(char ** av)633*00b67f09SDavid van Moolenbroek t_dns_db_class(char **av) {
634*00b67f09SDavid van Moolenbroek
635*00b67f09SDavid van Moolenbroek char *filename;
636*00b67f09SDavid van Moolenbroek char *class;
637*00b67f09SDavid van Moolenbroek
638*00b67f09SDavid van Moolenbroek int result;
639*00b67f09SDavid van Moolenbroek isc_result_t dns_result;
640*00b67f09SDavid van Moolenbroek isc_result_t isc_result;
641*00b67f09SDavid van Moolenbroek isc_mem_t *mctx;
642*00b67f09SDavid van Moolenbroek isc_entropy_t *ectx;
643*00b67f09SDavid van Moolenbroek dns_db_t *db;
644*00b67f09SDavid van Moolenbroek dns_rdataclass_t rdataclass;
645*00b67f09SDavid van Moolenbroek dns_rdataclass_t db_rdataclass;
646*00b67f09SDavid van Moolenbroek isc_textregion_t textregion;
647*00b67f09SDavid van Moolenbroek
648*00b67f09SDavid van Moolenbroek filename = T_ARG(0);
649*00b67f09SDavid van Moolenbroek class = T_ARG(1);
650*00b67f09SDavid van Moolenbroek db = NULL;
651*00b67f09SDavid van Moolenbroek mctx = NULL;
652*00b67f09SDavid van Moolenbroek ectx = NULL;
653*00b67f09SDavid van Moolenbroek
654*00b67f09SDavid van Moolenbroek t_info("testing with database %s and class %s\n",
655*00b67f09SDavid van Moolenbroek filename, class);
656*00b67f09SDavid van Moolenbroek
657*00b67f09SDavid van Moolenbroek textregion.base = class;
658*00b67f09SDavid van Moolenbroek textregion.length = strlen(class);
659*00b67f09SDavid van Moolenbroek dns_result = dns_rdataclass_fromtext(&rdataclass, &textregion);
660*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
661*00b67f09SDavid van Moolenbroek t_info("dns_rdataclass_fromtext failed %s\n",
662*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
663*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
664*00b67f09SDavid van Moolenbroek }
665*00b67f09SDavid van Moolenbroek
666*00b67f09SDavid van Moolenbroek isc_result = isc_mem_create(0, 0, &mctx);
667*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
668*00b67f09SDavid van Moolenbroek t_info("isc_mem_create failed %s\n",
669*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
670*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
671*00b67f09SDavid van Moolenbroek }
672*00b67f09SDavid van Moolenbroek
673*00b67f09SDavid van Moolenbroek isc_result = isc_entropy_create(mctx, &ectx);
674*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
675*00b67f09SDavid van Moolenbroek t_info("isc_entropy_create failed %s\n",
676*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
677*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
678*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
679*00b67f09SDavid van Moolenbroek }
680*00b67f09SDavid van Moolenbroek
681*00b67f09SDavid van Moolenbroek isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
682*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
683*00b67f09SDavid van Moolenbroek t_info("isc_hash_create failed %s\n",
684*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
685*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
686*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
687*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
688*00b67f09SDavid van Moolenbroek }
689*00b67f09SDavid van Moolenbroek
690*00b67f09SDavid van Moolenbroek dns_result = t_create("rbt", ".", class, "isc_true", mctx, &db);
691*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
692*00b67f09SDavid van Moolenbroek t_info("t_create failed %s\n",
693*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
694*00b67f09SDavid van Moolenbroek isc_hash_destroy();
695*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
696*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
697*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
698*00b67f09SDavid van Moolenbroek }
699*00b67f09SDavid van Moolenbroek
700*00b67f09SDavid van Moolenbroek dns_result = dns_db_load(db, filename);
701*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
702*00b67f09SDavid van Moolenbroek t_info("dns_db_load failed %s\n",
703*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
704*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
705*00b67f09SDavid van Moolenbroek isc_hash_destroy();
706*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
707*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
708*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
709*00b67f09SDavid van Moolenbroek }
710*00b67f09SDavid van Moolenbroek
711*00b67f09SDavid van Moolenbroek db_rdataclass = dns_db_class(db);
712*00b67f09SDavid van Moolenbroek if (db_rdataclass == rdataclass)
713*00b67f09SDavid van Moolenbroek result = T_PASS;
714*00b67f09SDavid van Moolenbroek else {
715*00b67f09SDavid van Moolenbroek char classbuf[DNS_RDATACLASS_FORMATSIZE];
716*00b67f09SDavid van Moolenbroek dns_rdataclass_format(db_rdataclass,
717*00b67f09SDavid van Moolenbroek classbuf, sizeof(classbuf));
718*00b67f09SDavid van Moolenbroek t_info("dns_db_class returned %s, expected %s\n",
719*00b67f09SDavid van Moolenbroek classbuf, class);
720*00b67f09SDavid van Moolenbroek result = T_FAIL;
721*00b67f09SDavid van Moolenbroek }
722*00b67f09SDavid van Moolenbroek
723*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
724*00b67f09SDavid van Moolenbroek isc_hash_destroy();
725*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
726*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
727*00b67f09SDavid van Moolenbroek return(result);
728*00b67f09SDavid van Moolenbroek
729*00b67f09SDavid van Moolenbroek }
730*00b67f09SDavid van Moolenbroek static void
t7(void)731*00b67f09SDavid van Moolenbroek t7(void) {
732*00b67f09SDavid van Moolenbroek int result;
733*00b67f09SDavid van Moolenbroek
734*00b67f09SDavid van Moolenbroek t_assert("dns_db_class", 7, T_REQUIRED, "%s", a7);
735*00b67f09SDavid van Moolenbroek result = t_eval("dns_db_class_data", t_dns_db_class, 2);
736*00b67f09SDavid van Moolenbroek t_result(result);
737*00b67f09SDavid van Moolenbroek }
738*00b67f09SDavid van Moolenbroek
739*00b67f09SDavid van Moolenbroek
740*00b67f09SDavid van Moolenbroek static const char *a8 =
741*00b67f09SDavid van Moolenbroek "A call to dns_db_currentversion() opens the current "
742*00b67f09SDavid van Moolenbroek "version for reading.";
743*00b67f09SDavid van Moolenbroek
744*00b67f09SDavid van Moolenbroek static int
t_dns_db_currentversion(char ** av)745*00b67f09SDavid van Moolenbroek t_dns_db_currentversion(char **av) {
746*00b67f09SDavid van Moolenbroek char *filename;
747*00b67f09SDavid van Moolenbroek char *db_type;
748*00b67f09SDavid van Moolenbroek char *origin;
749*00b67f09SDavid van Moolenbroek char *class;
750*00b67f09SDavid van Moolenbroek char *model;
751*00b67f09SDavid van Moolenbroek char *findname;
752*00b67f09SDavid van Moolenbroek char *findtype;
753*00b67f09SDavid van Moolenbroek
754*00b67f09SDavid van Moolenbroek int result;
755*00b67f09SDavid van Moolenbroek int len;
756*00b67f09SDavid van Moolenbroek dns_db_t *db;
757*00b67f09SDavid van Moolenbroek isc_result_t dns_result;
758*00b67f09SDavid van Moolenbroek isc_result_t isc_result;
759*00b67f09SDavid van Moolenbroek isc_mem_t *mctx;
760*00b67f09SDavid van Moolenbroek isc_entropy_t *ectx;
761*00b67f09SDavid van Moolenbroek dns_dbnode_t *nodep;
762*00b67f09SDavid van Moolenbroek isc_textregion_t textregion;
763*00b67f09SDavid van Moolenbroek isc_buffer_t findname_buffer;
764*00b67f09SDavid van Moolenbroek dns_fixedname_t dns_findname;
765*00b67f09SDavid van Moolenbroek dns_fixedname_t dns_foundname;
766*00b67f09SDavid van Moolenbroek dns_rdataset_t rdataset;
767*00b67f09SDavid van Moolenbroek dns_rdatatype_t rdatatype;
768*00b67f09SDavid van Moolenbroek dns_dbversion_t *cversionp;
769*00b67f09SDavid van Moolenbroek dns_dbversion_t *nversionp;
770*00b67f09SDavid van Moolenbroek
771*00b67f09SDavid van Moolenbroek filename = T_ARG(0);
772*00b67f09SDavid van Moolenbroek db_type = T_ARG(1);
773*00b67f09SDavid van Moolenbroek origin = T_ARG(2);
774*00b67f09SDavid van Moolenbroek class = T_ARG(3);
775*00b67f09SDavid van Moolenbroek model = T_ARG(4);
776*00b67f09SDavid van Moolenbroek findname = T_ARG(5);
777*00b67f09SDavid van Moolenbroek findtype = T_ARG(6);
778*00b67f09SDavid van Moolenbroek db = NULL;
779*00b67f09SDavid van Moolenbroek mctx = NULL;
780*00b67f09SDavid van Moolenbroek ectx = NULL;
781*00b67f09SDavid van Moolenbroek
782*00b67f09SDavid van Moolenbroek t_info("testing using file %s and name %s\n", filename, findname);
783*00b67f09SDavid van Moolenbroek
784*00b67f09SDavid van Moolenbroek isc_result = isc_mem_create(0, 0, &mctx);
785*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
786*00b67f09SDavid van Moolenbroek t_info("isc_mem_create failed %s\n",
787*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
788*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
789*00b67f09SDavid van Moolenbroek }
790*00b67f09SDavid van Moolenbroek
791*00b67f09SDavid van Moolenbroek isc_result = isc_entropy_create(mctx, &ectx);
792*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
793*00b67f09SDavid van Moolenbroek t_info("isc_entropy_create failed %s\n",
794*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
795*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
796*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
797*00b67f09SDavid van Moolenbroek }
798*00b67f09SDavid van Moolenbroek
799*00b67f09SDavid van Moolenbroek isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
800*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
801*00b67f09SDavid van Moolenbroek t_info("isc_hash_create failed %s\n",
802*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
803*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
804*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
805*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
806*00b67f09SDavid van Moolenbroek }
807*00b67f09SDavid van Moolenbroek
808*00b67f09SDavid van Moolenbroek dns_result = t_create(db_type, origin, class, model, mctx, &db);
809*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
810*00b67f09SDavid van Moolenbroek isc_hash_destroy();
811*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
812*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
813*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
814*00b67f09SDavid van Moolenbroek }
815*00b67f09SDavid van Moolenbroek
816*00b67f09SDavid van Moolenbroek dns_result = dns_db_load(db, filename);
817*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
818*00b67f09SDavid van Moolenbroek t_info("dns_db_load returned %s\n",
819*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
820*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
821*00b67f09SDavid van Moolenbroek isc_hash_destroy();
822*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
823*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
824*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
825*00b67f09SDavid van Moolenbroek }
826*00b67f09SDavid van Moolenbroek
827*00b67f09SDavid van Moolenbroek dns_fixedname_init(&dns_findname);
828*00b67f09SDavid van Moolenbroek len = strlen(findname);
829*00b67f09SDavid van Moolenbroek isc_buffer_init(&findname_buffer, findname, len);
830*00b67f09SDavid van Moolenbroek isc_buffer_add(&findname_buffer, len);
831*00b67f09SDavid van Moolenbroek dns_result = dns_name_fromtext(dns_fixedname_name(&dns_findname),
832*00b67f09SDavid van Moolenbroek &findname_buffer, NULL, 0, NULL);
833*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
834*00b67f09SDavid van Moolenbroek t_info("dns_name_fromtext failed %s\n",
835*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
836*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
837*00b67f09SDavid van Moolenbroek isc_hash_destroy();
838*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
839*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
840*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
841*00b67f09SDavid van Moolenbroek }
842*00b67f09SDavid van Moolenbroek
843*00b67f09SDavid van Moolenbroek textregion.base = findtype;
844*00b67f09SDavid van Moolenbroek textregion.length = strlen(findtype);
845*00b67f09SDavid van Moolenbroek dns_result = dns_rdatatype_fromtext(&rdatatype, &textregion);
846*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
847*00b67f09SDavid van Moolenbroek t_info("dns_rdatatype_fromtext %s failed %s\n",
848*00b67f09SDavid van Moolenbroek findtype,
849*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
850*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
851*00b67f09SDavid van Moolenbroek isc_hash_destroy();
852*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
853*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
854*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
855*00b67f09SDavid van Moolenbroek }
856*00b67f09SDavid van Moolenbroek
857*00b67f09SDavid van Moolenbroek /*
858*00b67f09SDavid van Moolenbroek * find a name we know is there
859*00b67f09SDavid van Moolenbroek */
860*00b67f09SDavid van Moolenbroek
861*00b67f09SDavid van Moolenbroek cversionp = NULL;
862*00b67f09SDavid van Moolenbroek dns_fixedname_init(&dns_foundname);
863*00b67f09SDavid van Moolenbroek dns_rdataset_init(&rdataset);
864*00b67f09SDavid van Moolenbroek dns_db_currentversion(db, &cversionp);
865*00b67f09SDavid van Moolenbroek nodep = NULL;
866*00b67f09SDavid van Moolenbroek
867*00b67f09SDavid van Moolenbroek dns_result = dns_db_find(db,
868*00b67f09SDavid van Moolenbroek dns_fixedname_name(&dns_findname),
869*00b67f09SDavid van Moolenbroek cversionp,
870*00b67f09SDavid van Moolenbroek rdatatype,
871*00b67f09SDavid van Moolenbroek 0,
872*00b67f09SDavid van Moolenbroek 0,
873*00b67f09SDavid van Moolenbroek &nodep,
874*00b67f09SDavid van Moolenbroek dns_fixedname_name(&dns_foundname),
875*00b67f09SDavid van Moolenbroek &rdataset, NULL);
876*00b67f09SDavid van Moolenbroek
877*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
878*00b67f09SDavid van Moolenbroek t_info("unable to find %s using current version\n", findname);
879*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &cversionp, ISC_FALSE);
880*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
881*00b67f09SDavid van Moolenbroek isc_hash_destroy();
882*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
883*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
884*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
885*00b67f09SDavid van Moolenbroek }
886*00b67f09SDavid van Moolenbroek
887*00b67f09SDavid van Moolenbroek /*
888*00b67f09SDavid van Moolenbroek * create a new version
889*00b67f09SDavid van Moolenbroek * delete the found rdataset in the new version
890*00b67f09SDavid van Moolenbroek * attempt to find the rdataset again and expect the find to fail
891*00b67f09SDavid van Moolenbroek * close/commit the new version
892*00b67f09SDavid van Moolenbroek * attempt to find the rdataset in the current version and
893*00b67f09SDavid van Moolenbroek * expect the find to succeed
894*00b67f09SDavid van Moolenbroek */
895*00b67f09SDavid van Moolenbroek
896*00b67f09SDavid van Moolenbroek nversionp = NULL;
897*00b67f09SDavid van Moolenbroek dns_result = dns_db_newversion(db, &nversionp);
898*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
899*00b67f09SDavid van Moolenbroek t_info("dns_db_newversion failed %s\n",
900*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
901*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
902*00b67f09SDavid van Moolenbroek dns_rdataset_disassociate(&rdataset);
903*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &cversionp, ISC_FALSE);
904*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
905*00b67f09SDavid van Moolenbroek isc_hash_destroy();
906*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
907*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
908*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
909*00b67f09SDavid van Moolenbroek }
910*00b67f09SDavid van Moolenbroek
911*00b67f09SDavid van Moolenbroek /*
912*00b67f09SDavid van Moolenbroek * Delete the found rdataset in the new version.
913*00b67f09SDavid van Moolenbroek */
914*00b67f09SDavid van Moolenbroek dns_result = dns_db_deleterdataset(db, nodep, nversionp, rdatatype, 0);
915*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
916*00b67f09SDavid van Moolenbroek t_info("dns_db_deleterdataset failed %s\n",
917*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
918*00b67f09SDavid van Moolenbroek dns_rdataset_disassociate(&rdataset);
919*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
920*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &nversionp, ISC_FALSE);
921*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &cversionp, ISC_FALSE);
922*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
923*00b67f09SDavid van Moolenbroek isc_hash_destroy();
924*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
925*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
926*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
927*00b67f09SDavid van Moolenbroek }
928*00b67f09SDavid van Moolenbroek
929*00b67f09SDavid van Moolenbroek /*
930*00b67f09SDavid van Moolenbroek * Don't need these now.
931*00b67f09SDavid van Moolenbroek */
932*00b67f09SDavid van Moolenbroek dns_rdataset_disassociate(&rdataset);
933*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
934*00b67f09SDavid van Moolenbroek nodep = NULL;
935*00b67f09SDavid van Moolenbroek
936*00b67f09SDavid van Moolenbroek /*
937*00b67f09SDavid van Moolenbroek * Find the deleted rdataset and expect it to fail.
938*00b67f09SDavid van Moolenbroek */
939*00b67f09SDavid van Moolenbroek dns_result = dns_db_find(db,
940*00b67f09SDavid van Moolenbroek dns_fixedname_name(&dns_findname),
941*00b67f09SDavid van Moolenbroek nversionp,
942*00b67f09SDavid van Moolenbroek rdatatype,
943*00b67f09SDavid van Moolenbroek 0,
944*00b67f09SDavid van Moolenbroek 0,
945*00b67f09SDavid van Moolenbroek &nodep,
946*00b67f09SDavid van Moolenbroek dns_fixedname_name(&dns_foundname),
947*00b67f09SDavid van Moolenbroek &rdataset, NULL);
948*00b67f09SDavid van Moolenbroek
949*00b67f09SDavid van Moolenbroek if ((dns_result != ISC_R_NOTFOUND) && (dns_result != DNS_R_NXDOMAIN)) {
950*00b67f09SDavid van Moolenbroek t_info("unexpectedly found %s using current version\n",
951*00b67f09SDavid van Moolenbroek findname);
952*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &cversionp, ISC_FALSE);
953*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &nversionp, ISC_FALSE);
954*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
955*00b67f09SDavid van Moolenbroek isc_hash_destroy();
956*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
957*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
958*00b67f09SDavid van Moolenbroek return(T_FAIL);
959*00b67f09SDavid van Moolenbroek }
960*00b67f09SDavid van Moolenbroek
961*00b67f09SDavid van Moolenbroek /*
962*00b67f09SDavid van Moolenbroek * Close/commit the new version.
963*00b67f09SDavid van Moolenbroek */
964*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &nversionp, ISC_TRUE);
965*00b67f09SDavid van Moolenbroek
966*00b67f09SDavid van Moolenbroek /*
967*00b67f09SDavid van Moolenbroek * Find the deleted rdata in the current version.
968*00b67f09SDavid van Moolenbroek */
969*00b67f09SDavid van Moolenbroek dns_result = dns_db_find(db, dns_fixedname_name(&dns_findname),
970*00b67f09SDavid van Moolenbroek cversionp, rdatatype, DNS_DBFIND_GLUEOK,
971*00b67f09SDavid van Moolenbroek 0, &nodep, dns_fixedname_name(&dns_foundname),
972*00b67f09SDavid van Moolenbroek &rdataset, NULL);
973*00b67f09SDavid van Moolenbroek
974*00b67f09SDavid van Moolenbroek /*
975*00b67f09SDavid van Moolenbroek * And expect it to succeed.
976*00b67f09SDavid van Moolenbroek */
977*00b67f09SDavid van Moolenbroek if (dns_result == ISC_R_SUCCESS) {
978*00b67f09SDavid van Moolenbroek result = T_PASS;
979*00b67f09SDavid van Moolenbroek } else {
980*00b67f09SDavid van Moolenbroek t_info("cound not find %s using current version\n", findname);
981*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &cversionp, ISC_FALSE);
982*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
983*00b67f09SDavid van Moolenbroek isc_hash_destroy();
984*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
985*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
986*00b67f09SDavid van Moolenbroek result = T_FAIL;
987*00b67f09SDavid van Moolenbroek }
988*00b67f09SDavid van Moolenbroek
989*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
990*00b67f09SDavid van Moolenbroek dns_rdataset_disassociate(&rdataset);
991*00b67f09SDavid van Moolenbroek
992*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &cversionp, ISC_FALSE);
993*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
994*00b67f09SDavid van Moolenbroek isc_hash_destroy();
995*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
996*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
997*00b67f09SDavid van Moolenbroek
998*00b67f09SDavid van Moolenbroek return(result);
999*00b67f09SDavid van Moolenbroek }
1000*00b67f09SDavid van Moolenbroek
1001*00b67f09SDavid van Moolenbroek static void
t8(void)1002*00b67f09SDavid van Moolenbroek t8(void) {
1003*00b67f09SDavid van Moolenbroek int result;
1004*00b67f09SDavid van Moolenbroek
1005*00b67f09SDavid van Moolenbroek t_assert("dns_db_currentversion", 8, T_REQUIRED, "%s", a8);
1006*00b67f09SDavid van Moolenbroek result = t_eval("dns_db_currentversion_data",
1007*00b67f09SDavid van Moolenbroek t_dns_db_currentversion, 7);
1008*00b67f09SDavid van Moolenbroek t_result(result);
1009*00b67f09SDavid van Moolenbroek }
1010*00b67f09SDavid van Moolenbroek
1011*00b67f09SDavid van Moolenbroek static const char *a9 =
1012*00b67f09SDavid van Moolenbroek "A call to dns_db_newversion() opens a new version for "
1013*00b67f09SDavid van Moolenbroek "reading and writing.";
1014*00b67f09SDavid van Moolenbroek
1015*00b67f09SDavid van Moolenbroek static int
t_dns_db_newversion(char ** av)1016*00b67f09SDavid van Moolenbroek t_dns_db_newversion(char **av) {
1017*00b67f09SDavid van Moolenbroek
1018*00b67f09SDavid van Moolenbroek char *filename;
1019*00b67f09SDavid van Moolenbroek char *db_type;
1020*00b67f09SDavid van Moolenbroek char *origin;
1021*00b67f09SDavid van Moolenbroek char *class;
1022*00b67f09SDavid van Moolenbroek char *model;
1023*00b67f09SDavid van Moolenbroek char *newname;
1024*00b67f09SDavid van Moolenbroek char *newtype;
1025*00b67f09SDavid van Moolenbroek
1026*00b67f09SDavid van Moolenbroek int result;
1027*00b67f09SDavid van Moolenbroek int len;
1028*00b67f09SDavid van Moolenbroek int rval;
1029*00b67f09SDavid van Moolenbroek dns_db_t *db;
1030*00b67f09SDavid van Moolenbroek isc_result_t dns_result;
1031*00b67f09SDavid van Moolenbroek isc_result_t isc_result;
1032*00b67f09SDavid van Moolenbroek isc_mem_t *mctx;
1033*00b67f09SDavid van Moolenbroek isc_entropy_t *ectx;
1034*00b67f09SDavid van Moolenbroek dns_dbnode_t *nodep;
1035*00b67f09SDavid van Moolenbroek dns_dbnode_t *found_nodep;
1036*00b67f09SDavid van Moolenbroek isc_textregion_t textregion;
1037*00b67f09SDavid van Moolenbroek isc_buffer_t newname_buffer;
1038*00b67f09SDavid van Moolenbroek dns_fixedname_t dns_newname;
1039*00b67f09SDavid van Moolenbroek dns_fixedname_t dns_foundname;
1040*00b67f09SDavid van Moolenbroek dns_rdata_t added_rdata = DNS_RDATA_INIT;
1041*00b67f09SDavid van Moolenbroek const char * added_rdata_data;
1042*00b67f09SDavid van Moolenbroek dns_rdataset_t added_rdataset;
1043*00b67f09SDavid van Moolenbroek dns_rdata_t found_rdata = DNS_RDATA_INIT;
1044*00b67f09SDavid van Moolenbroek dns_rdataset_t found_rdataset;
1045*00b67f09SDavid van Moolenbroek dns_rdatatype_t rdatatype;
1046*00b67f09SDavid van Moolenbroek dns_rdataclass_t rdataclass;
1047*00b67f09SDavid van Moolenbroek dns_dbversion_t *nversionp;
1048*00b67f09SDavid van Moolenbroek dns_rdatalist_t rdatalist;
1049*00b67f09SDavid van Moolenbroek
1050*00b67f09SDavid van Moolenbroek filename = T_ARG(0);
1051*00b67f09SDavid van Moolenbroek db_type = T_ARG(1);
1052*00b67f09SDavid van Moolenbroek origin = T_ARG(2);
1053*00b67f09SDavid van Moolenbroek class = T_ARG(3);
1054*00b67f09SDavid van Moolenbroek model = T_ARG(4);
1055*00b67f09SDavid van Moolenbroek newname = T_ARG(5);
1056*00b67f09SDavid van Moolenbroek newtype = T_ARG(6);
1057*00b67f09SDavid van Moolenbroek db = NULL;
1058*00b67f09SDavid van Moolenbroek mctx = NULL;
1059*00b67f09SDavid van Moolenbroek ectx = NULL;
1060*00b67f09SDavid van Moolenbroek
1061*00b67f09SDavid van Moolenbroek /*
1062*00b67f09SDavid van Moolenbroek * Open a new version, add some data, commit it,
1063*00b67f09SDavid van Moolenbroek * close it, open a new version, and check that changes
1064*00b67f09SDavid van Moolenbroek * are present.
1065*00b67f09SDavid van Moolenbroek */
1066*00b67f09SDavid van Moolenbroek
1067*00b67f09SDavid van Moolenbroek t_info("testing using file %s and name %s\n", filename, newname);
1068*00b67f09SDavid van Moolenbroek
1069*00b67f09SDavid van Moolenbroek isc_result = isc_mem_create(0, 0, &mctx);
1070*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
1071*00b67f09SDavid van Moolenbroek t_info("isc_mem_create failed %s\n",
1072*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
1073*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1074*00b67f09SDavid van Moolenbroek }
1075*00b67f09SDavid van Moolenbroek
1076*00b67f09SDavid van Moolenbroek isc_result = isc_entropy_create(mctx, &ectx);
1077*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
1078*00b67f09SDavid van Moolenbroek t_info("isc_entropy_create failed %s\n",
1079*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
1080*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1081*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1082*00b67f09SDavid van Moolenbroek }
1083*00b67f09SDavid van Moolenbroek
1084*00b67f09SDavid van Moolenbroek isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
1085*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
1086*00b67f09SDavid van Moolenbroek t_info("isc_hash_create failed %s\n",
1087*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
1088*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1089*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1090*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1091*00b67f09SDavid van Moolenbroek }
1092*00b67f09SDavid van Moolenbroek
1093*00b67f09SDavid van Moolenbroek dns_result = t_create(db_type, origin, class, model, mctx, &db);
1094*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1095*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1096*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1097*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1098*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1099*00b67f09SDavid van Moolenbroek }
1100*00b67f09SDavid van Moolenbroek
1101*00b67f09SDavid van Moolenbroek dns_result = dns_db_load(db, filename);
1102*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1103*00b67f09SDavid van Moolenbroek t_info("dns_db_load returned %s\n",
1104*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1105*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1106*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1107*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1108*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1109*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1110*00b67f09SDavid van Moolenbroek }
1111*00b67f09SDavid van Moolenbroek
1112*00b67f09SDavid van Moolenbroek /*
1113*00b67f09SDavid van Moolenbroek * Add a new name.
1114*00b67f09SDavid van Moolenbroek */
1115*00b67f09SDavid van Moolenbroek
1116*00b67f09SDavid van Moolenbroek dns_fixedname_init(&dns_newname);
1117*00b67f09SDavid van Moolenbroek len = strlen(newname);
1118*00b67f09SDavid van Moolenbroek isc_buffer_init(&newname_buffer, newname, len);
1119*00b67f09SDavid van Moolenbroek isc_buffer_add(&newname_buffer, len);
1120*00b67f09SDavid van Moolenbroek dns_result = dns_name_fromtext(dns_fixedname_name(&dns_newname),
1121*00b67f09SDavid van Moolenbroek &newname_buffer, NULL, 0, NULL);
1122*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1123*00b67f09SDavid van Moolenbroek t_info("dns_name_fromtext failed %s\n",
1124*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1125*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1126*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1127*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1128*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1129*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1130*00b67f09SDavid van Moolenbroek }
1131*00b67f09SDavid van Moolenbroek
1132*00b67f09SDavid van Moolenbroek nodep = NULL;
1133*00b67f09SDavid van Moolenbroek dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_newname),
1134*00b67f09SDavid van Moolenbroek ISC_TRUE, &nodep);
1135*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1136*00b67f09SDavid van Moolenbroek t_info("dns_db_findnode failed %s\n",
1137*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1138*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1139*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1140*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1141*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1142*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1143*00b67f09SDavid van Moolenbroek }
1144*00b67f09SDavid van Moolenbroek
1145*00b67f09SDavid van Moolenbroek /*
1146*00b67f09SDavid van Moolenbroek * Open a new version and associate some rdata with the new name.
1147*00b67f09SDavid van Moolenbroek */
1148*00b67f09SDavid van Moolenbroek
1149*00b67f09SDavid van Moolenbroek textregion.base = newtype;
1150*00b67f09SDavid van Moolenbroek textregion.length = strlen(newtype);
1151*00b67f09SDavid van Moolenbroek dns_result = dns_rdatatype_fromtext(&rdatatype, &textregion);
1152*00b67f09SDavid van Moolenbroek
1153*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1154*00b67f09SDavid van Moolenbroek t_info("dns_rdatatype_fromtext %s failed %s\n",
1155*00b67f09SDavid van Moolenbroek newtype,
1156*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1157*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
1158*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1159*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1160*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1161*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1162*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1163*00b67f09SDavid van Moolenbroek }
1164*00b67f09SDavid van Moolenbroek
1165*00b67f09SDavid van Moolenbroek textregion.base = class;
1166*00b67f09SDavid van Moolenbroek textregion.length = strlen(class);
1167*00b67f09SDavid van Moolenbroek dns_result = dns_rdataclass_fromtext(&rdataclass, &textregion);
1168*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1169*00b67f09SDavid van Moolenbroek t_info("dns_rdataclass_fromtext failed %s\n",
1170*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1171*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
1172*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1173*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1174*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1175*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1176*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1177*00b67f09SDavid van Moolenbroek }
1178*00b67f09SDavid van Moolenbroek
1179*00b67f09SDavid van Moolenbroek dns_rdata_init(&added_rdata);
1180*00b67f09SDavid van Moolenbroek added_rdata_data = "\x10\x00\x00\x01";
1181*00b67f09SDavid van Moolenbroek DE_CONST(added_rdata_data, added_rdata.data);
1182*00b67f09SDavid van Moolenbroek added_rdata.length = 4;
1183*00b67f09SDavid van Moolenbroek added_rdata.rdclass = rdataclass;
1184*00b67f09SDavid van Moolenbroek added_rdata.type = rdatatype;
1185*00b67f09SDavid van Moolenbroek
1186*00b67f09SDavid van Moolenbroek dns_rdataset_init(&added_rdataset);
1187*00b67f09SDavid van Moolenbroek rdatalist.type = rdatatype;
1188*00b67f09SDavid van Moolenbroek rdatalist.covers = 0;
1189*00b67f09SDavid van Moolenbroek rdatalist.rdclass = rdataclass;
1190*00b67f09SDavid van Moolenbroek rdatalist.ttl = 0;
1191*00b67f09SDavid van Moolenbroek ISC_LIST_INIT(rdatalist.rdata);
1192*00b67f09SDavid van Moolenbroek ISC_LIST_APPEND(rdatalist.rdata, &added_rdata, link);
1193*00b67f09SDavid van Moolenbroek
1194*00b67f09SDavid van Moolenbroek dns_result = dns_rdatalist_tordataset(&rdatalist, &added_rdataset);
1195*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1196*00b67f09SDavid van Moolenbroek t_info("dns_rdatalist_tordataset failed %s\n",
1197*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1198*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
1199*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1200*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1201*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1202*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1203*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1204*00b67f09SDavid van Moolenbroek }
1205*00b67f09SDavid van Moolenbroek
1206*00b67f09SDavid van Moolenbroek nversionp = NULL;
1207*00b67f09SDavid van Moolenbroek dns_result = dns_db_newversion(db, &nversionp);
1208*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1209*00b67f09SDavid van Moolenbroek t_info("dns_db_newversion failed %s\n",
1210*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1211*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
1212*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1213*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1214*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1215*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1216*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1217*00b67f09SDavid van Moolenbroek }
1218*00b67f09SDavid van Moolenbroek
1219*00b67f09SDavid van Moolenbroek dns_result = dns_db_addrdataset(db, nodep, nversionp, 0,
1220*00b67f09SDavid van Moolenbroek &added_rdataset, 0, NULL);
1221*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1222*00b67f09SDavid van Moolenbroek t_info("dns_db_addrdataset failed %s\n",
1223*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1224*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &nversionp, ISC_FALSE);
1225*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
1226*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1227*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1228*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1229*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1230*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1231*00b67f09SDavid van Moolenbroek }
1232*00b67f09SDavid van Moolenbroek
1233*00b67f09SDavid van Moolenbroek /*
1234*00b67f09SDavid van Moolenbroek * Close and commit the version.
1235*00b67f09SDavid van Moolenbroek */
1236*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &nversionp, ISC_TRUE);
1237*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
1238*00b67f09SDavid van Moolenbroek if (dns_rdataset_isassociated(&added_rdataset))
1239*00b67f09SDavid van Moolenbroek dns_rdataset_disassociate(&added_rdataset);
1240*00b67f09SDavid van Moolenbroek nodep = NULL;
1241*00b67f09SDavid van Moolenbroek
1242*00b67f09SDavid van Moolenbroek /*
1243*00b67f09SDavid van Moolenbroek * Open a new version and find the data we added.
1244*00b67f09SDavid van Moolenbroek */
1245*00b67f09SDavid van Moolenbroek dns_fixedname_init(&dns_foundname);
1246*00b67f09SDavid van Moolenbroek dns_rdataset_init(&found_rdataset);
1247*00b67f09SDavid van Moolenbroek nversionp = NULL;
1248*00b67f09SDavid van Moolenbroek found_nodep = NULL;
1249*00b67f09SDavid van Moolenbroek dns_db_newversion(db, &nversionp);
1250*00b67f09SDavid van Moolenbroek
1251*00b67f09SDavid van Moolenbroek /*
1252*00b67f09SDavid van Moolenbroek * Find the recently added name and rdata.
1253*00b67f09SDavid van Moolenbroek */
1254*00b67f09SDavid van Moolenbroek dns_result = dns_db_find(db, dns_fixedname_name(&dns_newname),
1255*00b67f09SDavid van Moolenbroek nversionp, rdatatype, 0, 0, &found_nodep,
1256*00b67f09SDavid van Moolenbroek dns_fixedname_name(&dns_foundname),
1257*00b67f09SDavid van Moolenbroek &found_rdataset, NULL);
1258*00b67f09SDavid van Moolenbroek
1259*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1260*00b67f09SDavid van Moolenbroek /* XXXWPK - NXRRSET ??? reference counts ??? */
1261*00b67f09SDavid van Moolenbroek t_info("dns_db_find failed %s\n",
1262*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1263*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &nversionp, ISC_FALSE);
1264*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &found_nodep);
1265*00b67f09SDavid van Moolenbroek if (dns_rdataset_isassociated(&found_rdataset))
1266*00b67f09SDavid van Moolenbroek dns_rdataset_disassociate(&found_rdataset);
1267*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1268*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1269*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1270*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1271*00b67f09SDavid van Moolenbroek return(T_FAIL);
1272*00b67f09SDavid van Moolenbroek }
1273*00b67f09SDavid van Moolenbroek
1274*00b67f09SDavid van Moolenbroek dns_result = dns_rdataset_first(&found_rdataset);
1275*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1276*00b67f09SDavid van Moolenbroek t_info("dns_rdataset_first failed %s\n",
1277*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1278*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
1279*00b67f09SDavid van Moolenbroek if (dns_rdataset_isassociated(&found_rdataset))
1280*00b67f09SDavid van Moolenbroek dns_rdataset_disassociate(&found_rdataset);
1281*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &nversionp, ISC_FALSE);
1282*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1283*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1284*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1285*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1286*00b67f09SDavid van Moolenbroek return(T_FAIL);
1287*00b67f09SDavid van Moolenbroek }
1288*00b67f09SDavid van Moolenbroek
1289*00b67f09SDavid van Moolenbroek /*
1290*00b67f09SDavid van Moolenbroek * Now make sure its what we expect.
1291*00b67f09SDavid van Moolenbroek */
1292*00b67f09SDavid van Moolenbroek dns_rdata_init(&found_rdata);
1293*00b67f09SDavid van Moolenbroek dns_rdataset_current(&found_rdataset, &found_rdata);
1294*00b67f09SDavid van Moolenbroek rval = dns_rdata_compare(&added_rdata, &found_rdata);
1295*00b67f09SDavid van Moolenbroek if (rval == 0) {
1296*00b67f09SDavid van Moolenbroek result = T_PASS;
1297*00b67f09SDavid van Moolenbroek } else {
1298*00b67f09SDavid van Moolenbroek t_info("dns_rdata_compare returned %d\n", rval);
1299*00b67f09SDavid van Moolenbroek result = T_FAIL;
1300*00b67f09SDavid van Moolenbroek }
1301*00b67f09SDavid van Moolenbroek
1302*00b67f09SDavid van Moolenbroek /*
1303*00b67f09SDavid van Moolenbroek * Don't need these now.
1304*00b67f09SDavid van Moolenbroek */
1305*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &nversionp, ISC_FALSE);
1306*00b67f09SDavid van Moolenbroek if (dns_rdataset_isassociated(&found_rdataset))
1307*00b67f09SDavid van Moolenbroek dns_rdataset_disassociate(&found_rdataset);
1308*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &found_nodep);
1309*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1310*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1311*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1312*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1313*00b67f09SDavid van Moolenbroek
1314*00b67f09SDavid van Moolenbroek return(result);
1315*00b67f09SDavid van Moolenbroek }
1316*00b67f09SDavid van Moolenbroek
1317*00b67f09SDavid van Moolenbroek static void
t9(void)1318*00b67f09SDavid van Moolenbroek t9(void) {
1319*00b67f09SDavid van Moolenbroek int result;
1320*00b67f09SDavid van Moolenbroek
1321*00b67f09SDavid van Moolenbroek t_assert("dns_db_newversion", 9, T_REQUIRED, "%s", a9);
1322*00b67f09SDavid van Moolenbroek result = t_eval("dns_db_newversion_data", t_dns_db_newversion, 7);
1323*00b67f09SDavid van Moolenbroek t_result(result);
1324*00b67f09SDavid van Moolenbroek }
1325*00b67f09SDavid van Moolenbroek
1326*00b67f09SDavid van Moolenbroek static const char *a10 =
1327*00b67f09SDavid van Moolenbroek "When versionp points to a read-write version and commit is "
1328*00b67f09SDavid van Moolenbroek "ISC_TRUE, a call to dns_db_closeversion(db, versionp, commit) "
1329*00b67f09SDavid van Moolenbroek "causes all changes made in the version to take effect, "
1330*00b67f09SDavid van Moolenbroek "and returns ISC_R_SUCCESS.";
1331*00b67f09SDavid van Moolenbroek
1332*00b67f09SDavid van Moolenbroek static int
t_dns_db_closeversion_1(char ** av)1333*00b67f09SDavid van Moolenbroek t_dns_db_closeversion_1(char **av) {
1334*00b67f09SDavid van Moolenbroek char *filename;
1335*00b67f09SDavid van Moolenbroek char *db_type;
1336*00b67f09SDavid van Moolenbroek char *origin;
1337*00b67f09SDavid van Moolenbroek char *class;
1338*00b67f09SDavid van Moolenbroek char *model;
1339*00b67f09SDavid van Moolenbroek char *new_name;
1340*00b67f09SDavid van Moolenbroek char *new_type;
1341*00b67f09SDavid van Moolenbroek char *existing_name;
1342*00b67f09SDavid van Moolenbroek char *existing_type;
1343*00b67f09SDavid van Moolenbroek
1344*00b67f09SDavid van Moolenbroek int result;
1345*00b67f09SDavid van Moolenbroek int len;
1346*00b67f09SDavid van Moolenbroek int rval;
1347*00b67f09SDavid van Moolenbroek int nfails;
1348*00b67f09SDavid van Moolenbroek dns_db_t *db;
1349*00b67f09SDavid van Moolenbroek isc_result_t dns_result;
1350*00b67f09SDavid van Moolenbroek isc_result_t isc_result;
1351*00b67f09SDavid van Moolenbroek isc_mem_t *mctx;
1352*00b67f09SDavid van Moolenbroek isc_entropy_t *ectx;
1353*00b67f09SDavid van Moolenbroek dns_dbnode_t *nodep;
1354*00b67f09SDavid van Moolenbroek isc_textregion_t textregion;
1355*00b67f09SDavid van Moolenbroek isc_buffer_t name_buffer;
1356*00b67f09SDavid van Moolenbroek dns_fixedname_t dns_newname;
1357*00b67f09SDavid van Moolenbroek dns_fixedname_t dns_foundname;
1358*00b67f09SDavid van Moolenbroek dns_fixedname_t dns_existingname;
1359*00b67f09SDavid van Moolenbroek dns_rdata_t added_rdata = DNS_RDATA_INIT;
1360*00b67f09SDavid van Moolenbroek const char * added_rdata_data;
1361*00b67f09SDavid van Moolenbroek dns_rdataset_t added_rdataset;
1362*00b67f09SDavid van Moolenbroek dns_rdata_t found_rdata = DNS_RDATA_INIT;
1363*00b67f09SDavid van Moolenbroek dns_rdataset_t found_rdataset;
1364*00b67f09SDavid van Moolenbroek dns_rdatatype_t new_rdatatype;
1365*00b67f09SDavid van Moolenbroek dns_rdatatype_t existing_rdatatype;
1366*00b67f09SDavid van Moolenbroek dns_rdataclass_t rdataclass;
1367*00b67f09SDavid van Moolenbroek dns_dbversion_t *nversionp;
1368*00b67f09SDavid van Moolenbroek dns_dbversion_t *cversionp;
1369*00b67f09SDavid van Moolenbroek dns_rdatalist_t rdatalist;
1370*00b67f09SDavid van Moolenbroek
1371*00b67f09SDavid van Moolenbroek filename = T_ARG(0);
1372*00b67f09SDavid van Moolenbroek db_type = T_ARG(1);
1373*00b67f09SDavid van Moolenbroek origin = T_ARG(2);
1374*00b67f09SDavid van Moolenbroek class = T_ARG(3);
1375*00b67f09SDavid van Moolenbroek model = T_ARG(4);
1376*00b67f09SDavid van Moolenbroek new_name = T_ARG(5);
1377*00b67f09SDavid van Moolenbroek new_type = T_ARG(6);
1378*00b67f09SDavid van Moolenbroek existing_name = T_ARG(7);
1379*00b67f09SDavid van Moolenbroek existing_type = T_ARG(8);
1380*00b67f09SDavid van Moolenbroek
1381*00b67f09SDavid van Moolenbroek nfails = 0;
1382*00b67f09SDavid van Moolenbroek db = NULL;
1383*00b67f09SDavid van Moolenbroek mctx = NULL;
1384*00b67f09SDavid van Moolenbroek ectx = NULL;
1385*00b67f09SDavid van Moolenbroek
1386*00b67f09SDavid van Moolenbroek /*
1387*00b67f09SDavid van Moolenbroek * Open a new version, add some data,
1388*00b67f09SDavid van Moolenbroek * remove some data, close with commit, open the current
1389*00b67f09SDavid van Moolenbroek * version and check that changes are present.
1390*00b67f09SDavid van Moolenbroek */
1391*00b67f09SDavid van Moolenbroek
1392*00b67f09SDavid van Moolenbroek t_info("testing using file %s and name %s\n", filename, new_name);
1393*00b67f09SDavid van Moolenbroek
1394*00b67f09SDavid van Moolenbroek isc_result = isc_mem_create(0, 0, &mctx);
1395*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
1396*00b67f09SDavid van Moolenbroek t_info("isc_mem_create failed %s\n",
1397*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
1398*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1399*00b67f09SDavid van Moolenbroek }
1400*00b67f09SDavid van Moolenbroek
1401*00b67f09SDavid van Moolenbroek isc_result = isc_entropy_create(mctx, &ectx);
1402*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
1403*00b67f09SDavid van Moolenbroek t_info("isc_entropy_create failed %s\n",
1404*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
1405*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1406*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1407*00b67f09SDavid van Moolenbroek }
1408*00b67f09SDavid van Moolenbroek
1409*00b67f09SDavid van Moolenbroek isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
1410*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
1411*00b67f09SDavid van Moolenbroek t_info("isc_hash_create failed %s\n",
1412*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
1413*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1414*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1415*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1416*00b67f09SDavid van Moolenbroek }
1417*00b67f09SDavid van Moolenbroek
1418*00b67f09SDavid van Moolenbroek dns_result = t_create(db_type, origin, class, model, mctx, &db);
1419*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1420*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1421*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1422*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1423*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1424*00b67f09SDavid van Moolenbroek }
1425*00b67f09SDavid van Moolenbroek
1426*00b67f09SDavid van Moolenbroek dns_result = dns_db_load(db, filename);
1427*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1428*00b67f09SDavid van Moolenbroek t_info("dns_db_load returned %s\n",
1429*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1430*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1431*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1432*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1433*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1434*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1435*00b67f09SDavid van Moolenbroek }
1436*00b67f09SDavid van Moolenbroek
1437*00b67f09SDavid van Moolenbroek /*
1438*00b67f09SDavid van Moolenbroek * Remove all rdata for an existing name.
1439*00b67f09SDavid van Moolenbroek */
1440*00b67f09SDavid van Moolenbroek
1441*00b67f09SDavid van Moolenbroek dns_fixedname_init(&dns_existingname);
1442*00b67f09SDavid van Moolenbroek len = strlen(existing_name);
1443*00b67f09SDavid van Moolenbroek isc_buffer_init(&name_buffer, existing_name, len);
1444*00b67f09SDavid van Moolenbroek isc_buffer_add(&name_buffer, len);
1445*00b67f09SDavid van Moolenbroek dns_result = dns_name_fromtext(dns_fixedname_name(&dns_existingname),
1446*00b67f09SDavid van Moolenbroek &name_buffer, NULL, 0, NULL);
1447*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1448*00b67f09SDavid van Moolenbroek t_info("dns_name_fromtext failed %s\n",
1449*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1450*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1451*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1452*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1453*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1454*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1455*00b67f09SDavid van Moolenbroek }
1456*00b67f09SDavid van Moolenbroek
1457*00b67f09SDavid van Moolenbroek textregion.base = existing_type;
1458*00b67f09SDavid van Moolenbroek textregion.length = strlen(existing_type);
1459*00b67f09SDavid van Moolenbroek dns_result = dns_rdatatype_fromtext(&existing_rdatatype, &textregion);
1460*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1461*00b67f09SDavid van Moolenbroek t_info("dns_rdatatype_fromtext %s failed %s\n",
1462*00b67f09SDavid van Moolenbroek existing_type,
1463*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1464*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
1465*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1466*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1467*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1468*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1469*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1470*00b67f09SDavid van Moolenbroek }
1471*00b67f09SDavid van Moolenbroek
1472*00b67f09SDavid van Moolenbroek nodep = NULL;
1473*00b67f09SDavid van Moolenbroek dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_existingname),
1474*00b67f09SDavid van Moolenbroek ISC_FALSE, &nodep);
1475*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1476*00b67f09SDavid van Moolenbroek t_info("dns_db_findnode %s\n",
1477*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1478*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1479*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1480*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1481*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1482*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1483*00b67f09SDavid van Moolenbroek }
1484*00b67f09SDavid van Moolenbroek
1485*00b67f09SDavid van Moolenbroek /* open a new version */
1486*00b67f09SDavid van Moolenbroek nversionp = NULL;
1487*00b67f09SDavid van Moolenbroek dns_result = dns_db_newversion(db, &nversionp);
1488*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1489*00b67f09SDavid van Moolenbroek t_info("dns_db_newversion failed %s\n",
1490*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1491*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
1492*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1493*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1494*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1495*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1496*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1497*00b67f09SDavid van Moolenbroek }
1498*00b67f09SDavid van Moolenbroek
1499*00b67f09SDavid van Moolenbroek dns_result = dns_db_deleterdataset(db, nodep, nversionp,
1500*00b67f09SDavid van Moolenbroek existing_rdatatype, 0);
1501*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1502*00b67f09SDavid van Moolenbroek t_info("dns_db_deleterdataset failed %s\n",
1503*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1504*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &nversionp, ISC_FALSE);
1505*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
1506*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1507*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1508*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1509*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1510*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1511*00b67f09SDavid van Moolenbroek }
1512*00b67f09SDavid van Moolenbroek
1513*00b67f09SDavid van Moolenbroek /*
1514*00b67f09SDavid van Moolenbroek * add a new name and associate some rdata with it
1515*00b67f09SDavid van Moolenbroek */
1516*00b67f09SDavid van Moolenbroek
1517*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
1518*00b67f09SDavid van Moolenbroek nodep = NULL;
1519*00b67f09SDavid van Moolenbroek
1520*00b67f09SDavid van Moolenbroek dns_fixedname_init(&dns_newname);
1521*00b67f09SDavid van Moolenbroek len = strlen(new_name);
1522*00b67f09SDavid van Moolenbroek isc_buffer_init(&name_buffer, new_name, len);
1523*00b67f09SDavid van Moolenbroek isc_buffer_add(&name_buffer, len);
1524*00b67f09SDavid van Moolenbroek dns_result = dns_name_fromtext(dns_fixedname_name(&dns_newname),
1525*00b67f09SDavid van Moolenbroek &name_buffer, NULL, 0, NULL);
1526*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1527*00b67f09SDavid van Moolenbroek t_info("dns_name_fromtext failed %s\n",
1528*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1529*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &nversionp, ISC_FALSE);
1530*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1531*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1532*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1533*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1534*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1535*00b67f09SDavid van Moolenbroek }
1536*00b67f09SDavid van Moolenbroek
1537*00b67f09SDavid van Moolenbroek dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_newname),
1538*00b67f09SDavid van Moolenbroek ISC_TRUE, &nodep);
1539*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1540*00b67f09SDavid van Moolenbroek t_info("dns_db_findnode failed %s\n",
1541*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1542*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &nversionp, ISC_FALSE);
1543*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1544*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1545*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1546*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1547*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1548*00b67f09SDavid van Moolenbroek }
1549*00b67f09SDavid van Moolenbroek
1550*00b67f09SDavid van Moolenbroek /*
1551*00b67f09SDavid van Moolenbroek * associate some rdata with the new name
1552*00b67f09SDavid van Moolenbroek */
1553*00b67f09SDavid van Moolenbroek
1554*00b67f09SDavid van Moolenbroek textregion.base = new_type;
1555*00b67f09SDavid van Moolenbroek textregion.length = strlen(new_type);
1556*00b67f09SDavid van Moolenbroek dns_result = dns_rdatatype_fromtext(&new_rdatatype, &textregion);
1557*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1558*00b67f09SDavid van Moolenbroek t_info("dns_rdatatype_fromtext %s failed %s\n",
1559*00b67f09SDavid van Moolenbroek new_type,
1560*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1561*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
1562*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1563*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1564*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1565*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1566*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1567*00b67f09SDavid van Moolenbroek }
1568*00b67f09SDavid van Moolenbroek
1569*00b67f09SDavid van Moolenbroek textregion.base = class;
1570*00b67f09SDavid van Moolenbroek textregion.length = strlen(class);
1571*00b67f09SDavid van Moolenbroek dns_result = dns_rdataclass_fromtext(&rdataclass, &textregion);
1572*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1573*00b67f09SDavid van Moolenbroek t_info("dns_rdataclass_fromtext failed %s\n",
1574*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1575*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
1576*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1577*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1578*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1579*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1580*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1581*00b67f09SDavid van Moolenbroek }
1582*00b67f09SDavid van Moolenbroek
1583*00b67f09SDavid van Moolenbroek dns_rdata_init(&added_rdata);
1584*00b67f09SDavid van Moolenbroek added_rdata_data = "\x10\x00\x00\x01";
1585*00b67f09SDavid van Moolenbroek DE_CONST(added_rdata_data, added_rdata.data);
1586*00b67f09SDavid van Moolenbroek added_rdata.length = 4;
1587*00b67f09SDavid van Moolenbroek added_rdata.rdclass = rdataclass;
1588*00b67f09SDavid van Moolenbroek added_rdata.type = new_rdatatype;
1589*00b67f09SDavid van Moolenbroek
1590*00b67f09SDavid van Moolenbroek dns_rdataset_init(&added_rdataset);
1591*00b67f09SDavid van Moolenbroek rdatalist.type = new_rdatatype;
1592*00b67f09SDavid van Moolenbroek rdatalist.covers = 0;
1593*00b67f09SDavid van Moolenbroek rdatalist.rdclass = rdataclass;
1594*00b67f09SDavid van Moolenbroek rdatalist.ttl = 0;
1595*00b67f09SDavid van Moolenbroek ISC_LIST_INIT(rdatalist.rdata);
1596*00b67f09SDavid van Moolenbroek ISC_LIST_APPEND(rdatalist.rdata, &added_rdata, link);
1597*00b67f09SDavid van Moolenbroek
1598*00b67f09SDavid van Moolenbroek dns_result = dns_rdatalist_tordataset(&rdatalist, &added_rdataset);
1599*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1600*00b67f09SDavid van Moolenbroek t_info("dns_rdatalist_tordataset failed %s\n",
1601*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1602*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
1603*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1604*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1605*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1606*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1607*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1608*00b67f09SDavid van Moolenbroek }
1609*00b67f09SDavid van Moolenbroek
1610*00b67f09SDavid van Moolenbroek dns_result = dns_db_addrdataset(db, nodep, nversionp, 0,
1611*00b67f09SDavid van Moolenbroek &added_rdataset, 0, NULL);
1612*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1613*00b67f09SDavid van Moolenbroek t_info("dns_db_addrdataset failed %s\n",
1614*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1615*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &nversionp, ISC_FALSE);
1616*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
1617*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1618*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1619*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1620*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1621*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1622*00b67f09SDavid van Moolenbroek }
1623*00b67f09SDavid van Moolenbroek
1624*00b67f09SDavid van Moolenbroek /* close and commit the version */
1625*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &nversionp, ISC_TRUE);
1626*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
1627*00b67f09SDavid van Moolenbroek nodep = NULL;
1628*00b67f09SDavid van Moolenbroek
1629*00b67f09SDavid van Moolenbroek /* open the current version and check changes */
1630*00b67f09SDavid van Moolenbroek dns_fixedname_init(&dns_foundname);
1631*00b67f09SDavid van Moolenbroek dns_rdataset_init(&found_rdataset);
1632*00b67f09SDavid van Moolenbroek cversionp = NULL;
1633*00b67f09SDavid van Moolenbroek dns_db_currentversion(db, &cversionp);
1634*00b67f09SDavid van Moolenbroek
1635*00b67f09SDavid van Moolenbroek /* find the recently added name and rdata */
1636*00b67f09SDavid van Moolenbroek dns_result = dns_db_find(db,
1637*00b67f09SDavid van Moolenbroek dns_fixedname_name(&dns_newname),
1638*00b67f09SDavid van Moolenbroek cversionp,
1639*00b67f09SDavid van Moolenbroek new_rdatatype,
1640*00b67f09SDavid van Moolenbroek 0,
1641*00b67f09SDavid van Moolenbroek 0,
1642*00b67f09SDavid van Moolenbroek &nodep,
1643*00b67f09SDavid van Moolenbroek dns_fixedname_name(&dns_foundname),
1644*00b67f09SDavid van Moolenbroek &found_rdataset, NULL);
1645*00b67f09SDavid van Moolenbroek
1646*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1647*00b67f09SDavid van Moolenbroek /* XXXWPK NXRRSET ??? reference counting ??? */
1648*00b67f09SDavid van Moolenbroek t_info("dns_db_find failed %s\n",
1649*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1650*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &cversionp, ISC_FALSE);
1651*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
1652*00b67f09SDavid van Moolenbroek if (dns_rdataset_isassociated(&found_rdataset))
1653*00b67f09SDavid van Moolenbroek dns_rdataset_disassociate(&found_rdataset);
1654*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1655*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1656*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1657*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1658*00b67f09SDavid van Moolenbroek return(T_FAIL);
1659*00b67f09SDavid van Moolenbroek }
1660*00b67f09SDavid van Moolenbroek
1661*00b67f09SDavid van Moolenbroek dns_result = dns_rdataset_first(&found_rdataset);
1662*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1663*00b67f09SDavid van Moolenbroek t_info("dns_rdataset_first failed %s\n",
1664*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1665*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
1666*00b67f09SDavid van Moolenbroek if (dns_rdataset_isassociated(&found_rdataset))
1667*00b67f09SDavid van Moolenbroek dns_rdataset_disassociate(&found_rdataset);
1668*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &cversionp, ISC_FALSE);
1669*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1670*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1671*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1672*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1673*00b67f09SDavid van Moolenbroek return(T_FAIL);
1674*00b67f09SDavid van Moolenbroek }
1675*00b67f09SDavid van Moolenbroek
1676*00b67f09SDavid van Moolenbroek /*
1677*00b67f09SDavid van Moolenbroek * Now make sure its what we expect.
1678*00b67f09SDavid van Moolenbroek */
1679*00b67f09SDavid van Moolenbroek dns_rdata_init(&found_rdata);
1680*00b67f09SDavid van Moolenbroek dns_rdataset_current(&found_rdataset, &found_rdata);
1681*00b67f09SDavid van Moolenbroek rval = dns_rdata_compare(&added_rdata, &found_rdata);
1682*00b67f09SDavid van Moolenbroek if (rval != 0) {
1683*00b67f09SDavid van Moolenbroek t_info("dns_rdata_compare returned %d\n", rval);
1684*00b67f09SDavid van Moolenbroek ++nfails;
1685*00b67f09SDavid van Moolenbroek }
1686*00b67f09SDavid van Moolenbroek
1687*00b67f09SDavid van Moolenbroek /*
1688*00b67f09SDavid van Moolenbroek * Now check the rdata deletion.
1689*00b67f09SDavid van Moolenbroek */
1690*00b67f09SDavid van Moolenbroek
1691*00b67f09SDavid van Moolenbroek if (dns_rdataset_isassociated(&found_rdataset))
1692*00b67f09SDavid van Moolenbroek dns_rdataset_disassociate(&found_rdataset);
1693*00b67f09SDavid van Moolenbroek dns_rdataset_init(&found_rdataset);
1694*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
1695*00b67f09SDavid van Moolenbroek nodep = NULL;
1696*00b67f09SDavid van Moolenbroek dns_fixedname_init(&dns_foundname);
1697*00b67f09SDavid van Moolenbroek
1698*00b67f09SDavid van Moolenbroek dns_result = dns_db_find(db, dns_fixedname_name(&dns_existingname),
1699*00b67f09SDavid van Moolenbroek cversionp, existing_rdatatype,
1700*00b67f09SDavid van Moolenbroek 0, 0, &nodep,
1701*00b67f09SDavid van Moolenbroek dns_fixedname_name(&dns_foundname),
1702*00b67f09SDavid van Moolenbroek &found_rdataset, NULL);
1703*00b67f09SDavid van Moolenbroek
1704*00b67f09SDavid van Moolenbroek
1705*00b67f09SDavid van Moolenbroek if ((dns_result != ISC_R_NOTFOUND) && (dns_result != DNS_R_NXDOMAIN)) {
1706*00b67f09SDavid van Moolenbroek dns_rdataset_disassociate(&found_rdataset);
1707*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
1708*00b67f09SDavid van Moolenbroek t_info("dns_db_find %s returned %s\n", existing_name,
1709*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1710*00b67f09SDavid van Moolenbroek ++nfails;
1711*00b67f09SDavid van Moolenbroek }
1712*00b67f09SDavid van Moolenbroek
1713*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &cversionp, ISC_FALSE);
1714*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1715*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1716*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1717*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1718*00b67f09SDavid van Moolenbroek
1719*00b67f09SDavid van Moolenbroek if (nfails == 0)
1720*00b67f09SDavid van Moolenbroek result = T_PASS;
1721*00b67f09SDavid van Moolenbroek else
1722*00b67f09SDavid van Moolenbroek result = T_FAIL;
1723*00b67f09SDavid van Moolenbroek
1724*00b67f09SDavid van Moolenbroek return(result);
1725*00b67f09SDavid van Moolenbroek }
1726*00b67f09SDavid van Moolenbroek
1727*00b67f09SDavid van Moolenbroek static void
t10(void)1728*00b67f09SDavid van Moolenbroek t10(void) {
1729*00b67f09SDavid van Moolenbroek int result;
1730*00b67f09SDavid van Moolenbroek
1731*00b67f09SDavid van Moolenbroek t_assert("dns_db_closeversion", 10, T_REQUIRED, "%s", a10);
1732*00b67f09SDavid van Moolenbroek result = t_eval("dns_db_closeversion_1_data",
1733*00b67f09SDavid van Moolenbroek t_dns_db_closeversion_1, 9);
1734*00b67f09SDavid van Moolenbroek t_result(result);
1735*00b67f09SDavid van Moolenbroek }
1736*00b67f09SDavid van Moolenbroek
1737*00b67f09SDavid van Moolenbroek static const char *a11 =
1738*00b67f09SDavid van Moolenbroek "When versionp points to a read-write version and commit is "
1739*00b67f09SDavid van Moolenbroek "ISC_FALSE, a call to dns_db_closeversion(db, versionp, commit) "
1740*00b67f09SDavid van Moolenbroek "causes all changes made in the version to to be rolled back, "
1741*00b67f09SDavid van Moolenbroek "and returns ISC_R_SUCCESS.";
1742*00b67f09SDavid van Moolenbroek
1743*00b67f09SDavid van Moolenbroek static int
t_dns_db_closeversion_2(char ** av)1744*00b67f09SDavid van Moolenbroek t_dns_db_closeversion_2(char **av) {
1745*00b67f09SDavid van Moolenbroek char *filename;
1746*00b67f09SDavid van Moolenbroek char *db_type;
1747*00b67f09SDavid van Moolenbroek char *origin;
1748*00b67f09SDavid van Moolenbroek char *class;
1749*00b67f09SDavid van Moolenbroek char *model;
1750*00b67f09SDavid van Moolenbroek char *new_name;
1751*00b67f09SDavid van Moolenbroek char *new_type;
1752*00b67f09SDavid van Moolenbroek char *existing_name;
1753*00b67f09SDavid van Moolenbroek char *existing_type;
1754*00b67f09SDavid van Moolenbroek
1755*00b67f09SDavid van Moolenbroek int result;
1756*00b67f09SDavid van Moolenbroek int len;
1757*00b67f09SDavid van Moolenbroek int rval;
1758*00b67f09SDavid van Moolenbroek int nfails;
1759*00b67f09SDavid van Moolenbroek dns_db_t *db;
1760*00b67f09SDavid van Moolenbroek isc_result_t dns_result;
1761*00b67f09SDavid van Moolenbroek isc_result_t isc_result;
1762*00b67f09SDavid van Moolenbroek isc_mem_t *mctx;
1763*00b67f09SDavid van Moolenbroek isc_entropy_t *ectx;
1764*00b67f09SDavid van Moolenbroek dns_dbnode_t *nodep;
1765*00b67f09SDavid van Moolenbroek isc_textregion_t textregion;
1766*00b67f09SDavid van Moolenbroek isc_buffer_t name_buffer;
1767*00b67f09SDavid van Moolenbroek dns_fixedname_t dns_newname;
1768*00b67f09SDavid van Moolenbroek dns_fixedname_t dns_foundname;
1769*00b67f09SDavid van Moolenbroek dns_fixedname_t dns_existingname;
1770*00b67f09SDavid van Moolenbroek dns_rdata_t added_rdata = DNS_RDATA_INIT;
1771*00b67f09SDavid van Moolenbroek const char * added_rdata_data;
1772*00b67f09SDavid van Moolenbroek dns_rdataset_t added_rdataset;
1773*00b67f09SDavid van Moolenbroek dns_rdata_t found_rdata = DNS_RDATA_INIT;
1774*00b67f09SDavid van Moolenbroek dns_rdataset_t found_rdataset;
1775*00b67f09SDavid van Moolenbroek dns_rdatatype_t new_rdatatype;
1776*00b67f09SDavid van Moolenbroek dns_rdatatype_t existing_rdatatype;
1777*00b67f09SDavid van Moolenbroek dns_rdataclass_t rdataclass;
1778*00b67f09SDavid van Moolenbroek dns_dbversion_t *nversionp;
1779*00b67f09SDavid van Moolenbroek dns_dbversion_t *cversionp;
1780*00b67f09SDavid van Moolenbroek dns_rdatalist_t rdatalist;
1781*00b67f09SDavid van Moolenbroek
1782*00b67f09SDavid van Moolenbroek filename = T_ARG(0);
1783*00b67f09SDavid van Moolenbroek db_type = T_ARG(1);
1784*00b67f09SDavid van Moolenbroek origin = T_ARG(2);
1785*00b67f09SDavid van Moolenbroek class = T_ARG(3);
1786*00b67f09SDavid van Moolenbroek model = T_ARG(4);
1787*00b67f09SDavid van Moolenbroek new_name = T_ARG(5);
1788*00b67f09SDavid van Moolenbroek new_type = T_ARG(6);
1789*00b67f09SDavid van Moolenbroek existing_name = T_ARG(7);
1790*00b67f09SDavid van Moolenbroek existing_type = T_ARG(8);
1791*00b67f09SDavid van Moolenbroek
1792*00b67f09SDavid van Moolenbroek nfails = 0;
1793*00b67f09SDavid van Moolenbroek db = NULL;
1794*00b67f09SDavid van Moolenbroek mctx = NULL;
1795*00b67f09SDavid van Moolenbroek ectx = NULL;
1796*00b67f09SDavid van Moolenbroek
1797*00b67f09SDavid van Moolenbroek /*
1798*00b67f09SDavid van Moolenbroek * Open a new version, add some data,
1799*00b67f09SDavid van Moolenbroek * remove some data, close with commit, open the current
1800*00b67f09SDavid van Moolenbroek * version and check that changes are present.
1801*00b67f09SDavid van Moolenbroek */
1802*00b67f09SDavid van Moolenbroek
1803*00b67f09SDavid van Moolenbroek t_info("testing using file %s and name %s\n", filename, new_name);
1804*00b67f09SDavid van Moolenbroek
1805*00b67f09SDavid van Moolenbroek isc_result = isc_mem_create(0, 0, &mctx);
1806*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
1807*00b67f09SDavid van Moolenbroek t_info("isc_mem_create failed %s\n",
1808*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
1809*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1810*00b67f09SDavid van Moolenbroek }
1811*00b67f09SDavid van Moolenbroek
1812*00b67f09SDavid van Moolenbroek isc_result = isc_entropy_create(mctx, &ectx);
1813*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
1814*00b67f09SDavid van Moolenbroek t_info("isc_entropy_create failed %s\n",
1815*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
1816*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1817*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1818*00b67f09SDavid van Moolenbroek }
1819*00b67f09SDavid van Moolenbroek
1820*00b67f09SDavid van Moolenbroek isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
1821*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
1822*00b67f09SDavid van Moolenbroek t_info("isc_hash_create failed %s\n",
1823*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
1824*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1825*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1826*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1827*00b67f09SDavid van Moolenbroek }
1828*00b67f09SDavid van Moolenbroek
1829*00b67f09SDavid van Moolenbroek dns_result = t_create(db_type, origin, class, model, mctx, &db);
1830*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1831*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1832*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1833*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1834*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1835*00b67f09SDavid van Moolenbroek }
1836*00b67f09SDavid van Moolenbroek
1837*00b67f09SDavid van Moolenbroek dns_result = dns_db_load(db, filename);
1838*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1839*00b67f09SDavid van Moolenbroek t_info("dns_db_load returned %s\n",
1840*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1841*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1842*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1843*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1844*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1845*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1846*00b67f09SDavid van Moolenbroek }
1847*00b67f09SDavid van Moolenbroek
1848*00b67f09SDavid van Moolenbroek /*
1849*00b67f09SDavid van Moolenbroek * Remove all rdata for an existing name.
1850*00b67f09SDavid van Moolenbroek */
1851*00b67f09SDavid van Moolenbroek
1852*00b67f09SDavid van Moolenbroek dns_fixedname_init(&dns_existingname);
1853*00b67f09SDavid van Moolenbroek len = strlen(existing_name);
1854*00b67f09SDavid van Moolenbroek isc_buffer_init(&name_buffer, existing_name, len);
1855*00b67f09SDavid van Moolenbroek isc_buffer_add(&name_buffer, len);
1856*00b67f09SDavid van Moolenbroek dns_result = dns_name_fromtext(dns_fixedname_name(&dns_existingname),
1857*00b67f09SDavid van Moolenbroek &name_buffer, NULL, 0, NULL);
1858*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1859*00b67f09SDavid van Moolenbroek t_info("dns_name_fromtext failed %s\n",
1860*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1861*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1862*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1863*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1864*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1865*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1866*00b67f09SDavid van Moolenbroek }
1867*00b67f09SDavid van Moolenbroek
1868*00b67f09SDavid van Moolenbroek textregion.base = existing_type;
1869*00b67f09SDavid van Moolenbroek textregion.length = strlen(existing_type);
1870*00b67f09SDavid van Moolenbroek dns_result = dns_rdatatype_fromtext(&existing_rdatatype, &textregion);
1871*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1872*00b67f09SDavid van Moolenbroek t_info("dns_rdatatype_fromtext %s failed %s\n",
1873*00b67f09SDavid van Moolenbroek existing_type,
1874*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1875*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
1876*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1877*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1878*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1879*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1880*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1881*00b67f09SDavid van Moolenbroek }
1882*00b67f09SDavid van Moolenbroek
1883*00b67f09SDavid van Moolenbroek nodep = NULL;
1884*00b67f09SDavid van Moolenbroek dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_existingname),
1885*00b67f09SDavid van Moolenbroek ISC_FALSE, &nodep);
1886*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1887*00b67f09SDavid van Moolenbroek t_info("dns_db_findnode %s\n",
1888*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1889*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1890*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1891*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1892*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1893*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1894*00b67f09SDavid van Moolenbroek }
1895*00b67f09SDavid van Moolenbroek
1896*00b67f09SDavid van Moolenbroek /*
1897*00b67f09SDavid van Moolenbroek * Open a new version.
1898*00b67f09SDavid van Moolenbroek */
1899*00b67f09SDavid van Moolenbroek nversionp = NULL;
1900*00b67f09SDavid van Moolenbroek dns_result = dns_db_newversion(db, &nversionp);
1901*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1902*00b67f09SDavid van Moolenbroek t_info("dns_db_newversion failed %s\n",
1903*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1904*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
1905*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1906*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1907*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1908*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1909*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1910*00b67f09SDavid van Moolenbroek }
1911*00b67f09SDavid van Moolenbroek
1912*00b67f09SDavid van Moolenbroek dns_result = dns_db_deleterdataset(db, nodep, nversionp,
1913*00b67f09SDavid van Moolenbroek existing_rdatatype, 0);
1914*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1915*00b67f09SDavid van Moolenbroek t_info("dns_db_deleterdataset failed %s\n",
1916*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1917*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &nversionp, ISC_FALSE);
1918*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
1919*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1920*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1921*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1922*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1923*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1924*00b67f09SDavid van Moolenbroek }
1925*00b67f09SDavid van Moolenbroek
1926*00b67f09SDavid van Moolenbroek /*
1927*00b67f09SDavid van Moolenbroek * add a new name and associate some rdata with it
1928*00b67f09SDavid van Moolenbroek */
1929*00b67f09SDavid van Moolenbroek
1930*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
1931*00b67f09SDavid van Moolenbroek nodep = NULL;
1932*00b67f09SDavid van Moolenbroek
1933*00b67f09SDavid van Moolenbroek dns_fixedname_init(&dns_newname);
1934*00b67f09SDavid van Moolenbroek len = strlen(new_name);
1935*00b67f09SDavid van Moolenbroek isc_buffer_init(&name_buffer, new_name, len);
1936*00b67f09SDavid van Moolenbroek isc_buffer_add(&name_buffer, len);
1937*00b67f09SDavid van Moolenbroek dns_result = dns_name_fromtext(dns_fixedname_name(&dns_newname),
1938*00b67f09SDavid van Moolenbroek &name_buffer, NULL, 0, NULL);
1939*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1940*00b67f09SDavid van Moolenbroek t_info("dns_name_fromtext failed %s\n",
1941*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1942*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &nversionp, ISC_FALSE);
1943*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1944*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1945*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1946*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1947*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1948*00b67f09SDavid van Moolenbroek }
1949*00b67f09SDavid van Moolenbroek
1950*00b67f09SDavid van Moolenbroek dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_newname),
1951*00b67f09SDavid van Moolenbroek ISC_TRUE, &nodep);
1952*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1953*00b67f09SDavid van Moolenbroek t_info("dns_db_findnode failed %s\n",
1954*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1955*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &nversionp, ISC_FALSE);
1956*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1957*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1958*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1959*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1960*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1961*00b67f09SDavid van Moolenbroek }
1962*00b67f09SDavid van Moolenbroek
1963*00b67f09SDavid van Moolenbroek textregion.base = new_type;
1964*00b67f09SDavid van Moolenbroek textregion.length = strlen(new_type);
1965*00b67f09SDavid van Moolenbroek dns_result = dns_rdatatype_fromtext(&new_rdatatype, &textregion);
1966*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1967*00b67f09SDavid van Moolenbroek t_info("dns_rdatatype_fromtext %s failed %s\n",
1968*00b67f09SDavid van Moolenbroek new_type, dns_result_totext(dns_result));
1969*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
1970*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1971*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1972*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1973*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1974*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1975*00b67f09SDavid van Moolenbroek }
1976*00b67f09SDavid van Moolenbroek
1977*00b67f09SDavid van Moolenbroek textregion.base = class;
1978*00b67f09SDavid van Moolenbroek textregion.length = strlen(class);
1979*00b67f09SDavid van Moolenbroek dns_result = dns_rdataclass_fromtext(&rdataclass, &textregion);
1980*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
1981*00b67f09SDavid van Moolenbroek t_info("dns_rdataclass_fromtext failed %s\n",
1982*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
1983*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
1984*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
1985*00b67f09SDavid van Moolenbroek isc_hash_destroy();
1986*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
1987*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
1988*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
1989*00b67f09SDavid van Moolenbroek }
1990*00b67f09SDavid van Moolenbroek
1991*00b67f09SDavid van Moolenbroek dns_rdata_init(&added_rdata);
1992*00b67f09SDavid van Moolenbroek added_rdata_data = "\x10\x00\x00\x01";
1993*00b67f09SDavid van Moolenbroek DE_CONST(added_rdata_data, added_rdata.data);
1994*00b67f09SDavid van Moolenbroek added_rdata.length = 4;
1995*00b67f09SDavid van Moolenbroek added_rdata.rdclass = rdataclass;
1996*00b67f09SDavid van Moolenbroek added_rdata.type = new_rdatatype;
1997*00b67f09SDavid van Moolenbroek
1998*00b67f09SDavid van Moolenbroek dns_rdataset_init(&added_rdataset);
1999*00b67f09SDavid van Moolenbroek rdatalist.type = new_rdatatype;
2000*00b67f09SDavid van Moolenbroek rdatalist.covers = 0;
2001*00b67f09SDavid van Moolenbroek rdatalist.rdclass = rdataclass;
2002*00b67f09SDavid van Moolenbroek rdatalist.ttl = 0;
2003*00b67f09SDavid van Moolenbroek ISC_LIST_INIT(rdatalist.rdata);
2004*00b67f09SDavid van Moolenbroek ISC_LIST_APPEND(rdatalist.rdata, &added_rdata, link);
2005*00b67f09SDavid van Moolenbroek
2006*00b67f09SDavid van Moolenbroek dns_result = dns_rdatalist_tordataset(&rdatalist, &added_rdataset);
2007*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
2008*00b67f09SDavid van Moolenbroek t_info("dns_rdatalist_tordataset failed %s\n",
2009*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
2010*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
2011*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
2012*00b67f09SDavid van Moolenbroek isc_hash_destroy();
2013*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
2014*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2015*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
2016*00b67f09SDavid van Moolenbroek }
2017*00b67f09SDavid van Moolenbroek
2018*00b67f09SDavid van Moolenbroek dns_result = dns_db_addrdataset(db, nodep, nversionp, 0,
2019*00b67f09SDavid van Moolenbroek &added_rdataset, 0, NULL);
2020*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
2021*00b67f09SDavid van Moolenbroek t_info("dns_db_addrdataset failed %s\n",
2022*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
2023*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &nversionp, ISC_FALSE);
2024*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
2025*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
2026*00b67f09SDavid van Moolenbroek isc_hash_destroy();
2027*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
2028*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2029*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
2030*00b67f09SDavid van Moolenbroek }
2031*00b67f09SDavid van Moolenbroek
2032*00b67f09SDavid van Moolenbroek /*
2033*00b67f09SDavid van Moolenbroek * Check that our changes took.
2034*00b67f09SDavid van Moolenbroek */
2035*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
2036*00b67f09SDavid van Moolenbroek nodep = NULL;
2037*00b67f09SDavid van Moolenbroek dns_fixedname_init(&dns_foundname);
2038*00b67f09SDavid van Moolenbroek dns_rdataset_init(&found_rdataset);
2039*00b67f09SDavid van Moolenbroek
2040*00b67f09SDavid van Moolenbroek /*
2041*00b67f09SDavid van Moolenbroek * Find the recently added name and rdata.
2042*00b67f09SDavid van Moolenbroek */
2043*00b67f09SDavid van Moolenbroek dns_result = dns_db_find(db, dns_fixedname_name(&dns_newname),
2044*00b67f09SDavid van Moolenbroek nversionp, new_rdatatype, 0, 0, &nodep,
2045*00b67f09SDavid van Moolenbroek dns_fixedname_name(&dns_foundname),
2046*00b67f09SDavid van Moolenbroek &found_rdataset, NULL);
2047*00b67f09SDavid van Moolenbroek
2048*00b67f09SDavid van Moolenbroek if ((dns_result == ISC_R_NOTFOUND) ||
2049*00b67f09SDavid van Moolenbroek (dns_result == DNS_R_NXDOMAIN) ||
2050*00b67f09SDavid van Moolenbroek (dns_result == DNS_R_NXRRSET)) {
2051*00b67f09SDavid van Moolenbroek
2052*00b67f09SDavid van Moolenbroek t_info("dns_db_find failed %s\n",
2053*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
2054*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &nversionp, ISC_FALSE);
2055*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
2056*00b67f09SDavid van Moolenbroek if (dns_rdataset_isassociated(&found_rdataset))
2057*00b67f09SDavid van Moolenbroek dns_rdataset_disassociate(&found_rdataset);
2058*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
2059*00b67f09SDavid van Moolenbroek isc_hash_destroy();
2060*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
2061*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2062*00b67f09SDavid van Moolenbroek return(T_FAIL);
2063*00b67f09SDavid van Moolenbroek }
2064*00b67f09SDavid van Moolenbroek
2065*00b67f09SDavid van Moolenbroek dns_result = dns_rdataset_first(&found_rdataset);
2066*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
2067*00b67f09SDavid van Moolenbroek t_info("dns_rdataset_first failed %s\n",
2068*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
2069*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
2070*00b67f09SDavid van Moolenbroek if (dns_rdataset_isassociated(&found_rdataset))
2071*00b67f09SDavid van Moolenbroek dns_rdataset_disassociate(&found_rdataset);
2072*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &nversionp, ISC_FALSE);
2073*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
2074*00b67f09SDavid van Moolenbroek isc_hash_destroy();
2075*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
2076*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2077*00b67f09SDavid van Moolenbroek return(T_FAIL);
2078*00b67f09SDavid van Moolenbroek }
2079*00b67f09SDavid van Moolenbroek
2080*00b67f09SDavid van Moolenbroek /*
2081*00b67f09SDavid van Moolenbroek * Now make sure its what we expect.
2082*00b67f09SDavid van Moolenbroek */
2083*00b67f09SDavid van Moolenbroek dns_rdata_init(&found_rdata);
2084*00b67f09SDavid van Moolenbroek dns_rdataset_current(&found_rdataset, &found_rdata);
2085*00b67f09SDavid van Moolenbroek rval = dns_rdata_compare(&added_rdata, &found_rdata);
2086*00b67f09SDavid van Moolenbroek if (rval != 0) {
2087*00b67f09SDavid van Moolenbroek t_info("dns_rdata_compare returned %d\n", rval);
2088*00b67f09SDavid van Moolenbroek ++nfails;
2089*00b67f09SDavid van Moolenbroek }
2090*00b67f09SDavid van Moolenbroek
2091*00b67f09SDavid van Moolenbroek /*
2092*00b67f09SDavid van Moolenbroek * Now check the rdata deletion.
2093*00b67f09SDavid van Moolenbroek */
2094*00b67f09SDavid van Moolenbroek if (dns_rdataset_isassociated(&found_rdataset))
2095*00b67f09SDavid van Moolenbroek dns_rdataset_disassociate(&found_rdataset);
2096*00b67f09SDavid van Moolenbroek dns_rdataset_init(&found_rdataset);
2097*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
2098*00b67f09SDavid van Moolenbroek nodep = NULL;
2099*00b67f09SDavid van Moolenbroek dns_fixedname_init(&dns_foundname);
2100*00b67f09SDavid van Moolenbroek
2101*00b67f09SDavid van Moolenbroek dns_result = dns_db_find(db,
2102*00b67f09SDavid van Moolenbroek dns_fixedname_name(&dns_existingname),
2103*00b67f09SDavid van Moolenbroek nversionp,
2104*00b67f09SDavid van Moolenbroek existing_rdatatype,
2105*00b67f09SDavid van Moolenbroek 0,
2106*00b67f09SDavid van Moolenbroek 0,
2107*00b67f09SDavid van Moolenbroek &nodep,
2108*00b67f09SDavid van Moolenbroek dns_fixedname_name(&dns_foundname),
2109*00b67f09SDavid van Moolenbroek &found_rdataset, NULL);
2110*00b67f09SDavid van Moolenbroek
2111*00b67f09SDavid van Moolenbroek
2112*00b67f09SDavid van Moolenbroek if ((dns_result != ISC_R_NOTFOUND) && (dns_result != DNS_R_NXDOMAIN)) {
2113*00b67f09SDavid van Moolenbroek t_info("dns_db_find %s returned %s\n", existing_name,
2114*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
2115*00b67f09SDavid van Moolenbroek if (dns_rdataset_isassociated(&found_rdataset))
2116*00b67f09SDavid van Moolenbroek dns_rdataset_disassociate(&found_rdataset);
2117*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
2118*00b67f09SDavid van Moolenbroek ++nfails;
2119*00b67f09SDavid van Moolenbroek }
2120*00b67f09SDavid van Moolenbroek
2121*00b67f09SDavid van Moolenbroek
2122*00b67f09SDavid van Moolenbroek /*
2123*00b67f09SDavid van Moolenbroek * Close the version without a commit.
2124*00b67f09SDavid van Moolenbroek */
2125*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &nversionp, ISC_FALSE);
2126*00b67f09SDavid van Moolenbroek
2127*00b67f09SDavid van Moolenbroek /*
2128*00b67f09SDavid van Moolenbroek * Open the current version and check changes.
2129*00b67f09SDavid van Moolenbroek */
2130*00b67f09SDavid van Moolenbroek dns_fixedname_init(&dns_foundname);
2131*00b67f09SDavid van Moolenbroek dns_rdataset_init(&found_rdataset);
2132*00b67f09SDavid van Moolenbroek cversionp = NULL;
2133*00b67f09SDavid van Moolenbroek dns_db_currentversion(db, &cversionp);
2134*00b67f09SDavid van Moolenbroek
2135*00b67f09SDavid van Moolenbroek /*
2136*00b67f09SDavid van Moolenbroek * Find the recently added name and rdata.
2137*00b67f09SDavid van Moolenbroek */
2138*00b67f09SDavid van Moolenbroek dns_result = dns_db_find(db,
2139*00b67f09SDavid van Moolenbroek dns_fixedname_name(&dns_newname),
2140*00b67f09SDavid van Moolenbroek cversionp,
2141*00b67f09SDavid van Moolenbroek new_rdatatype,
2142*00b67f09SDavid van Moolenbroek 0,
2143*00b67f09SDavid van Moolenbroek 0,
2144*00b67f09SDavid van Moolenbroek &nodep,
2145*00b67f09SDavid van Moolenbroek dns_fixedname_name(&dns_foundname),
2146*00b67f09SDavid van Moolenbroek &found_rdataset, NULL);
2147*00b67f09SDavid van Moolenbroek
2148*00b67f09SDavid van Moolenbroek if ((dns_result != ISC_R_NOTFOUND) && (dns_result != DNS_R_NXDOMAIN)) {
2149*00b67f09SDavid van Moolenbroek t_info("dns_db_find %s returned %s\n", new_name,
2150*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
2151*00b67f09SDavid van Moolenbroek dns_rdataset_disassociate(&found_rdataset);
2152*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
2153*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &cversionp, ISC_FALSE);
2154*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
2155*00b67f09SDavid van Moolenbroek isc_hash_destroy();
2156*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
2157*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2158*00b67f09SDavid van Moolenbroek return(T_FAIL);
2159*00b67f09SDavid van Moolenbroek }
2160*00b67f09SDavid van Moolenbroek
2161*00b67f09SDavid van Moolenbroek /*
2162*00b67f09SDavid van Moolenbroek * Now check the rdata deletion.
2163*00b67f09SDavid van Moolenbroek */
2164*00b67f09SDavid van Moolenbroek nodep = NULL;
2165*00b67f09SDavid van Moolenbroek dns_rdataset_init(&found_rdataset);
2166*00b67f09SDavid van Moolenbroek dns_fixedname_init(&dns_foundname);
2167*00b67f09SDavid van Moolenbroek
2168*00b67f09SDavid van Moolenbroek dns_result = dns_db_find(db, dns_fixedname_name(&dns_existingname),
2169*00b67f09SDavid van Moolenbroek cversionp, existing_rdatatype, 0, 0,
2170*00b67f09SDavid van Moolenbroek &nodep, dns_fixedname_name(&dns_foundname),
2171*00b67f09SDavid van Moolenbroek &found_rdataset, NULL);
2172*00b67f09SDavid van Moolenbroek
2173*00b67f09SDavid van Moolenbroek
2174*00b67f09SDavid van Moolenbroek if ((dns_result == ISC_R_NOTFOUND) ||
2175*00b67f09SDavid van Moolenbroek (dns_result == DNS_R_NXDOMAIN) ||
2176*00b67f09SDavid van Moolenbroek (dns_result == DNS_R_NXRRSET)) {
2177*00b67f09SDavid van Moolenbroek
2178*00b67f09SDavid van Moolenbroek t_info("dns_db_find %s returned %s\n", existing_name,
2179*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
2180*00b67f09SDavid van Moolenbroek dns_rdataset_disassociate(&found_rdataset);
2181*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
2182*00b67f09SDavid van Moolenbroek ++nfails;
2183*00b67f09SDavid van Moolenbroek }
2184*00b67f09SDavid van Moolenbroek
2185*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
2186*00b67f09SDavid van Moolenbroek dns_rdataset_disassociate(&found_rdataset);
2187*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &cversionp, ISC_FALSE);
2188*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
2189*00b67f09SDavid van Moolenbroek isc_hash_destroy();
2190*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
2191*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2192*00b67f09SDavid van Moolenbroek
2193*00b67f09SDavid van Moolenbroek if (nfails == 0)
2194*00b67f09SDavid van Moolenbroek result = T_PASS;
2195*00b67f09SDavid van Moolenbroek else
2196*00b67f09SDavid van Moolenbroek result = T_FAIL;
2197*00b67f09SDavid van Moolenbroek
2198*00b67f09SDavid van Moolenbroek return(result);
2199*00b67f09SDavid van Moolenbroek }
2200*00b67f09SDavid van Moolenbroek
2201*00b67f09SDavid van Moolenbroek static void
t11(void)2202*00b67f09SDavid van Moolenbroek t11(void) {
2203*00b67f09SDavid van Moolenbroek int result;
2204*00b67f09SDavid van Moolenbroek
2205*00b67f09SDavid van Moolenbroek t_assert("dns_db_closeversion", 11, T_REQUIRED, "%s", a11);
2206*00b67f09SDavid van Moolenbroek result = t_eval("dns_db_closeversion_2_data",
2207*00b67f09SDavid van Moolenbroek t_dns_db_closeversion_2, 9);
2208*00b67f09SDavid van Moolenbroek t_result(result);
2209*00b67f09SDavid van Moolenbroek }
2210*00b67f09SDavid van Moolenbroek
2211*00b67f09SDavid van Moolenbroek static const char *a12 =
2212*00b67f09SDavid van Moolenbroek "A call to dns_db_expirenode() marks as stale all records at node "
2213*00b67f09SDavid van Moolenbroek "which expire at or before 'now'. If 'now' is zero, then the current "
2214*00b67f09SDavid van Moolenbroek "time will be used.";
2215*00b67f09SDavid van Moolenbroek
2216*00b67f09SDavid van Moolenbroek static int
t_dns_db_expirenode(char ** av)2217*00b67f09SDavid van Moolenbroek t_dns_db_expirenode(char **av) {
2218*00b67f09SDavid van Moolenbroek char *filename;
2219*00b67f09SDavid van Moolenbroek char *db_type;
2220*00b67f09SDavid van Moolenbroek char *origin;
2221*00b67f09SDavid van Moolenbroek char *class;
2222*00b67f09SDavid van Moolenbroek char *existing_name;
2223*00b67f09SDavid van Moolenbroek char *node_xtime;
2224*00b67f09SDavid van Moolenbroek char *find_xtime;
2225*00b67f09SDavid van Moolenbroek char *exp_find_result;
2226*00b67f09SDavid van Moolenbroek
2227*00b67f09SDavid van Moolenbroek int result;
2228*00b67f09SDavid van Moolenbroek int len;
2229*00b67f09SDavid van Moolenbroek dns_db_t *db;
2230*00b67f09SDavid van Moolenbroek isc_result_t dns_result;
2231*00b67f09SDavid van Moolenbroek isc_result_t exp_result;
2232*00b67f09SDavid van Moolenbroek isc_result_t isc_result;
2233*00b67f09SDavid van Moolenbroek isc_mem_t *mctx;
2234*00b67f09SDavid van Moolenbroek isc_entropy_t *ectx;
2235*00b67f09SDavid van Moolenbroek dns_dbnode_t *nodep;
2236*00b67f09SDavid van Moolenbroek isc_buffer_t name_buffer;
2237*00b67f09SDavid van Moolenbroek dns_fixedname_t dns_foundname;
2238*00b67f09SDavid van Moolenbroek dns_fixedname_t dns_existingname;
2239*00b67f09SDavid van Moolenbroek isc_stdtime_t node_expire_time;
2240*00b67f09SDavid van Moolenbroek isc_stdtime_t find_expire_time;
2241*00b67f09SDavid van Moolenbroek isc_stdtime_t now;
2242*00b67f09SDavid van Moolenbroek dns_rdataset_t rdataset;
2243*00b67f09SDavid van Moolenbroek
2244*00b67f09SDavid van Moolenbroek filename = T_ARG(0);
2245*00b67f09SDavid van Moolenbroek db_type = T_ARG(1);
2246*00b67f09SDavid van Moolenbroek origin = T_ARG(2);
2247*00b67f09SDavid van Moolenbroek class = T_ARG(3);
2248*00b67f09SDavid van Moolenbroek existing_name = T_ARG(4);
2249*00b67f09SDavid van Moolenbroek node_xtime = T_ARG(5);
2250*00b67f09SDavid van Moolenbroek find_xtime = T_ARG(6);
2251*00b67f09SDavid van Moolenbroek exp_find_result = T_ARG(7);
2252*00b67f09SDavid van Moolenbroek mctx = NULL;
2253*00b67f09SDavid van Moolenbroek ectx = NULL;
2254*00b67f09SDavid van Moolenbroek
2255*00b67f09SDavid van Moolenbroek /*
2256*00b67f09SDavid van Moolenbroek * Find a node, mark it as stale, do a dns_db_find on the name and
2257*00b67f09SDavid van Moolenbroek * expect it to fail.
2258*00b67f09SDavid van Moolenbroek */
2259*00b67f09SDavid van Moolenbroek
2260*00b67f09SDavid van Moolenbroek t_info("testing using file %s and name %s\n", filename, existing_name);
2261*00b67f09SDavid van Moolenbroek
2262*00b67f09SDavid van Moolenbroek node_expire_time = (isc_stdtime_t) strtol(node_xtime, NULL, 10);
2263*00b67f09SDavid van Moolenbroek find_expire_time = (isc_stdtime_t) strtol(find_xtime, NULL, 10);
2264*00b67f09SDavid van Moolenbroek exp_result = t_dns_result_fromtext(exp_find_result);
2265*00b67f09SDavid van Moolenbroek
2266*00b67f09SDavid van Moolenbroek isc_stdtime_get(&now);
2267*00b67f09SDavid van Moolenbroek
2268*00b67f09SDavid van Moolenbroek dns_fixedname_init(&dns_existingname);
2269*00b67f09SDavid van Moolenbroek len = strlen(existing_name);
2270*00b67f09SDavid van Moolenbroek isc_buffer_init(&name_buffer, existing_name, len);
2271*00b67f09SDavid van Moolenbroek isc_buffer_add(&name_buffer, len);
2272*00b67f09SDavid van Moolenbroek dns_result = dns_name_fromtext(dns_fixedname_name(&dns_existingname),
2273*00b67f09SDavid van Moolenbroek &name_buffer, NULL, 0, NULL);
2274*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
2275*00b67f09SDavid van Moolenbroek t_info("dns_name_fromtext failed %s\n",
2276*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
2277*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
2278*00b67f09SDavid van Moolenbroek }
2279*00b67f09SDavid van Moolenbroek
2280*00b67f09SDavid van Moolenbroek isc_result = isc_mem_create(0, 0, &mctx);
2281*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
2282*00b67f09SDavid van Moolenbroek t_info("isc_mem_create failed %s\n",
2283*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
2284*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
2285*00b67f09SDavid van Moolenbroek }
2286*00b67f09SDavid van Moolenbroek
2287*00b67f09SDavid van Moolenbroek isc_result = isc_entropy_create(mctx, &ectx);
2288*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
2289*00b67f09SDavid van Moolenbroek t_info("isc_entropy_create failed %s\n",
2290*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
2291*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2292*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
2293*00b67f09SDavid van Moolenbroek }
2294*00b67f09SDavid van Moolenbroek
2295*00b67f09SDavid van Moolenbroek isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
2296*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
2297*00b67f09SDavid van Moolenbroek t_info("isc_hash_create failed %s\n",
2298*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
2299*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
2300*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2301*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
2302*00b67f09SDavid van Moolenbroek }
2303*00b67f09SDavid van Moolenbroek
2304*00b67f09SDavid van Moolenbroek db = NULL;
2305*00b67f09SDavid van Moolenbroek dns_result = t_create(db_type, origin, class, "cache", mctx, &db);
2306*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
2307*00b67f09SDavid van Moolenbroek isc_hash_destroy();
2308*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
2309*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2310*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
2311*00b67f09SDavid van Moolenbroek }
2312*00b67f09SDavid van Moolenbroek
2313*00b67f09SDavid van Moolenbroek dns_result = dns_db_load(db, filename);
2314*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
2315*00b67f09SDavid van Moolenbroek t_info("dns_db_load returned %s\n",
2316*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
2317*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
2318*00b67f09SDavid van Moolenbroek isc_hash_destroy();
2319*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
2320*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2321*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
2322*00b67f09SDavid van Moolenbroek }
2323*00b67f09SDavid van Moolenbroek
2324*00b67f09SDavid van Moolenbroek nodep = NULL;
2325*00b67f09SDavid van Moolenbroek
2326*00b67f09SDavid van Moolenbroek /*
2327*00b67f09SDavid van Moolenbroek * Check that the node is there.
2328*00b67f09SDavid van Moolenbroek */
2329*00b67f09SDavid van Moolenbroek dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_existingname),
2330*00b67f09SDavid van Moolenbroek ISC_FALSE, &nodep);
2331*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
2332*00b67f09SDavid van Moolenbroek t_info("unable to find %s\n", existing_name);
2333*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
2334*00b67f09SDavid van Moolenbroek isc_hash_destroy();
2335*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
2336*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2337*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
2338*00b67f09SDavid van Moolenbroek }
2339*00b67f09SDavid van Moolenbroek
2340*00b67f09SDavid van Moolenbroek /*
2341*00b67f09SDavid van Moolenbroek * Expire it.
2342*00b67f09SDavid van Moolenbroek */
2343*00b67f09SDavid van Moolenbroek if (node_expire_time != 0)
2344*00b67f09SDavid van Moolenbroek node_expire_time += now;
2345*00b67f09SDavid van Moolenbroek
2346*00b67f09SDavid van Moolenbroek dns_result = dns_db_expirenode(db, nodep, node_expire_time);
2347*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
2348*00b67f09SDavid van Moolenbroek t_info("dns_db_expirenode failed %s\n",
2349*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
2350*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
2351*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
2352*00b67f09SDavid van Moolenbroek isc_hash_destroy();
2353*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
2354*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2355*00b67f09SDavid van Moolenbroek return(T_FAIL);
2356*00b67f09SDavid van Moolenbroek }
2357*00b67f09SDavid van Moolenbroek
2358*00b67f09SDavid van Moolenbroek dns_fixedname_init(&dns_foundname);
2359*00b67f09SDavid van Moolenbroek dns_rdataset_init(&rdataset);
2360*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
2361*00b67f09SDavid van Moolenbroek nodep = NULL;
2362*00b67f09SDavid van Moolenbroek
2363*00b67f09SDavid van Moolenbroek if (find_expire_time != 0)
2364*00b67f09SDavid van Moolenbroek find_expire_time += now;
2365*00b67f09SDavid van Moolenbroek
2366*00b67f09SDavid van Moolenbroek dns_result = dns_db_find(db,
2367*00b67f09SDavid van Moolenbroek dns_fixedname_name(&dns_existingname),
2368*00b67f09SDavid van Moolenbroek NULL,
2369*00b67f09SDavid van Moolenbroek dns_rdatatype_any,
2370*00b67f09SDavid van Moolenbroek 0,
2371*00b67f09SDavid van Moolenbroek find_expire_time,
2372*00b67f09SDavid van Moolenbroek &nodep,
2373*00b67f09SDavid van Moolenbroek dns_fixedname_name(&dns_foundname),
2374*00b67f09SDavid van Moolenbroek &rdataset, NULL);
2375*00b67f09SDavid van Moolenbroek
2376*00b67f09SDavid van Moolenbroek if (dns_result == exp_result) {
2377*00b67f09SDavid van Moolenbroek result = T_PASS;
2378*00b67f09SDavid van Moolenbroek } else {
2379*00b67f09SDavid van Moolenbroek t_info("dns_db_find %s returned %s\n", existing_name,
2380*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
2381*00b67f09SDavid van Moolenbroek result = T_FAIL;
2382*00b67f09SDavid van Moolenbroek }
2383*00b67f09SDavid van Moolenbroek
2384*00b67f09SDavid van Moolenbroek if ((dns_result != ISC_R_NOTFOUND) &&
2385*00b67f09SDavid van Moolenbroek (dns_result != DNS_R_NXDOMAIN) &&
2386*00b67f09SDavid van Moolenbroek (dns_result != DNS_R_NXRRSET)) {
2387*00b67f09SDavid van Moolenbroek
2388*00b67f09SDavid van Moolenbroek /*
2389*00b67f09SDavid van Moolenbroek * Don't need to disassociate the rdataset because
2390*00b67f09SDavid van Moolenbroek * we're searching with dns_rdatatype_any.
2391*00b67f09SDavid van Moolenbroek */
2392*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
2393*00b67f09SDavid van Moolenbroek }
2394*00b67f09SDavid van Moolenbroek
2395*00b67f09SDavid van Moolenbroek
2396*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
2397*00b67f09SDavid van Moolenbroek isc_hash_destroy();
2398*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
2399*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2400*00b67f09SDavid van Moolenbroek
2401*00b67f09SDavid van Moolenbroek return(result);
2402*00b67f09SDavid van Moolenbroek }
2403*00b67f09SDavid van Moolenbroek
2404*00b67f09SDavid van Moolenbroek static void
t12(void)2405*00b67f09SDavid van Moolenbroek t12(void) {
2406*00b67f09SDavid van Moolenbroek int result;
2407*00b67f09SDavid van Moolenbroek
2408*00b67f09SDavid van Moolenbroek t_assert("dns_db_expirenode", 12, T_REQUIRED, "%s", a12);
2409*00b67f09SDavid van Moolenbroek result = t_eval("dns_db_expirenode_data", t_dns_db_expirenode, 8);
2410*00b67f09SDavid van Moolenbroek t_result(result);
2411*00b67f09SDavid van Moolenbroek }
2412*00b67f09SDavid van Moolenbroek
2413*00b67f09SDavid van Moolenbroek static const char *a13 =
2414*00b67f09SDavid van Moolenbroek "If the node name exists, then a call to "
2415*00b67f09SDavid van Moolenbroek "dns_db_findnode(db, name, ISC_FALSE, nodep) initializes nodep "
2416*00b67f09SDavid van Moolenbroek "to point to the node and returns ISC_R_SUCCESS, otherwise "
2417*00b67f09SDavid van Moolenbroek "it returns ISC_R_NOTFOUND.";
2418*00b67f09SDavid van Moolenbroek
2419*00b67f09SDavid van Moolenbroek static int
t_dns_db_findnode_1(char ** av)2420*00b67f09SDavid van Moolenbroek t_dns_db_findnode_1(char **av) {
2421*00b67f09SDavid van Moolenbroek char *filename;
2422*00b67f09SDavid van Moolenbroek char *db_type;
2423*00b67f09SDavid van Moolenbroek char *origin;
2424*00b67f09SDavid van Moolenbroek char *class;
2425*00b67f09SDavid van Moolenbroek char *model;
2426*00b67f09SDavid van Moolenbroek char *find_name;
2427*00b67f09SDavid van Moolenbroek char *find_type;
2428*00b67f09SDavid van Moolenbroek char *expected_result;
2429*00b67f09SDavid van Moolenbroek
2430*00b67f09SDavid van Moolenbroek int result;
2431*00b67f09SDavid van Moolenbroek int len;
2432*00b67f09SDavid van Moolenbroek dns_db_t *db;
2433*00b67f09SDavid van Moolenbroek isc_result_t dns_result;
2434*00b67f09SDavid van Moolenbroek isc_result_t isc_result;
2435*00b67f09SDavid van Moolenbroek isc_mem_t *mctx;
2436*00b67f09SDavid van Moolenbroek isc_entropy_t *ectx;
2437*00b67f09SDavid van Moolenbroek dns_dbnode_t *nodep;
2438*00b67f09SDavid van Moolenbroek isc_buffer_t name_buffer;
2439*00b67f09SDavid van Moolenbroek dns_rdataset_t rdataset;
2440*00b67f09SDavid van Moolenbroek dns_rdatatype_t rdatatype;
2441*00b67f09SDavid van Moolenbroek isc_textregion_t textregion;
2442*00b67f09SDavid van Moolenbroek dns_fixedname_t dns_name;
2443*00b67f09SDavid van Moolenbroek dns_dbversion_t *cversionp;
2444*00b67f09SDavid van Moolenbroek isc_result_t exp_result;
2445*00b67f09SDavid van Moolenbroek
2446*00b67f09SDavid van Moolenbroek filename = T_ARG(0);
2447*00b67f09SDavid van Moolenbroek db_type = T_ARG(1);
2448*00b67f09SDavid van Moolenbroek origin = T_ARG(2);
2449*00b67f09SDavid van Moolenbroek class = T_ARG(3);
2450*00b67f09SDavid van Moolenbroek model = T_ARG(4);
2451*00b67f09SDavid van Moolenbroek find_name = T_ARG(5);
2452*00b67f09SDavid van Moolenbroek find_type = T_ARG(6);
2453*00b67f09SDavid van Moolenbroek expected_result = T_ARG(7);
2454*00b67f09SDavid van Moolenbroek
2455*00b67f09SDavid van Moolenbroek db = NULL;
2456*00b67f09SDavid van Moolenbroek mctx = NULL;
2457*00b67f09SDavid van Moolenbroek ectx = NULL;
2458*00b67f09SDavid van Moolenbroek
2459*00b67f09SDavid van Moolenbroek t_info("testing using file %s and name %s\n", filename, find_name);
2460*00b67f09SDavid van Moolenbroek
2461*00b67f09SDavid van Moolenbroek exp_result = t_dns_result_fromtext(expected_result);
2462*00b67f09SDavid van Moolenbroek
2463*00b67f09SDavid van Moolenbroek textregion.base = find_type;
2464*00b67f09SDavid van Moolenbroek textregion.length = strlen(find_type);
2465*00b67f09SDavid van Moolenbroek dns_result = dns_rdatatype_fromtext(&rdatatype, &textregion);
2466*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
2467*00b67f09SDavid van Moolenbroek t_info("dns_rdatatype_fromtext %s failed %s\n",
2468*00b67f09SDavid van Moolenbroek find_type,
2469*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
2470*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
2471*00b67f09SDavid van Moolenbroek }
2472*00b67f09SDavid van Moolenbroek
2473*00b67f09SDavid van Moolenbroek isc_result = isc_mem_create(0, 0, &mctx);
2474*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
2475*00b67f09SDavid van Moolenbroek t_info("isc_mem_create failed %s\n",
2476*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
2477*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
2478*00b67f09SDavid van Moolenbroek }
2479*00b67f09SDavid van Moolenbroek
2480*00b67f09SDavid van Moolenbroek isc_result = isc_entropy_create(mctx, &ectx);
2481*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
2482*00b67f09SDavid van Moolenbroek t_info("isc_entropy_create failed %s\n",
2483*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
2484*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2485*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
2486*00b67f09SDavid van Moolenbroek }
2487*00b67f09SDavid van Moolenbroek
2488*00b67f09SDavid van Moolenbroek isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
2489*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
2490*00b67f09SDavid van Moolenbroek t_info("isc_hash_create failed %s\n",
2491*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
2492*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2493*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
2494*00b67f09SDavid van Moolenbroek }
2495*00b67f09SDavid van Moolenbroek
2496*00b67f09SDavid van Moolenbroek dns_result = t_create(db_type, origin, class, model, mctx, &db);
2497*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
2498*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2499*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
2500*00b67f09SDavid van Moolenbroek }
2501*00b67f09SDavid van Moolenbroek
2502*00b67f09SDavid van Moolenbroek dns_result = dns_db_load(db, filename);
2503*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
2504*00b67f09SDavid van Moolenbroek t_info("dns_db_load returned %s\n",
2505*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
2506*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
2507*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2508*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
2509*00b67f09SDavid van Moolenbroek }
2510*00b67f09SDavid van Moolenbroek
2511*00b67f09SDavid van Moolenbroek nodep = NULL;
2512*00b67f09SDavid van Moolenbroek dns_fixedname_init(&dns_name);
2513*00b67f09SDavid van Moolenbroek
2514*00b67f09SDavid van Moolenbroek len = strlen(find_name);
2515*00b67f09SDavid van Moolenbroek isc_buffer_init(&name_buffer, find_name, len);
2516*00b67f09SDavid van Moolenbroek isc_buffer_add(&name_buffer, len);
2517*00b67f09SDavid van Moolenbroek dns_result = dns_name_fromtext(dns_fixedname_name(&dns_name),
2518*00b67f09SDavid van Moolenbroek &name_buffer, NULL, 0, NULL);
2519*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
2520*00b67f09SDavid van Moolenbroek t_info("dns_name_fromtext failed %s\n",
2521*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
2522*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
2523*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2524*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
2525*00b67f09SDavid van Moolenbroek }
2526*00b67f09SDavid van Moolenbroek
2527*00b67f09SDavid van Moolenbroek dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_name),
2528*00b67f09SDavid van Moolenbroek ISC_FALSE, &nodep);
2529*00b67f09SDavid van Moolenbroek if (dns_result != exp_result) {
2530*00b67f09SDavid van Moolenbroek t_info("dns_db_findnode failed %s\n",
2531*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
2532*00b67f09SDavid van Moolenbroek if (dns_result == ISC_R_SUCCESS)
2533*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
2534*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
2535*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2536*00b67f09SDavid van Moolenbroek return(T_FAIL);
2537*00b67f09SDavid van Moolenbroek }
2538*00b67f09SDavid van Moolenbroek
2539*00b67f09SDavid van Moolenbroek /*
2540*00b67f09SDavid van Moolenbroek * if we're expecting the find to succeed and it did,
2541*00b67f09SDavid van Moolenbroek * check that the node has been initialized
2542*00b67f09SDavid van Moolenbroek * by checking for the specified type of rdata
2543*00b67f09SDavid van Moolenbroek * and expecting the search to succeed
2544*00b67f09SDavid van Moolenbroek */
2545*00b67f09SDavid van Moolenbroek
2546*00b67f09SDavid van Moolenbroek if (dns_result == ISC_R_SUCCESS) {
2547*00b67f09SDavid van Moolenbroek cversionp = NULL;
2548*00b67f09SDavid van Moolenbroek dns_db_currentversion(db, &cversionp);
2549*00b67f09SDavid van Moolenbroek dns_rdataset_init(&rdataset);
2550*00b67f09SDavid van Moolenbroek
2551*00b67f09SDavid van Moolenbroek dns_result = dns_db_findrdataset(db, nodep, cversionp,
2552*00b67f09SDavid van Moolenbroek rdatatype, 0,
2553*00b67f09SDavid van Moolenbroek 0, &rdataset, NULL);
2554*00b67f09SDavid van Moolenbroek if (dns_result == ISC_R_SUCCESS) {
2555*00b67f09SDavid van Moolenbroek dns_rdataset_disassociate(&rdataset);
2556*00b67f09SDavid van Moolenbroek result = T_PASS;
2557*00b67f09SDavid van Moolenbroek } else {
2558*00b67f09SDavid van Moolenbroek t_info("dns_db_findrdataset failed %s\n",
2559*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
2560*00b67f09SDavid van Moolenbroek result = T_FAIL;
2561*00b67f09SDavid van Moolenbroek }
2562*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &cversionp, ISC_FALSE);
2563*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
2564*00b67f09SDavid van Moolenbroek } else {
2565*00b67f09SDavid van Moolenbroek result = T_PASS;
2566*00b67f09SDavid van Moolenbroek }
2567*00b67f09SDavid van Moolenbroek
2568*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
2569*00b67f09SDavid van Moolenbroek isc_hash_destroy();
2570*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
2571*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2572*00b67f09SDavid van Moolenbroek
2573*00b67f09SDavid van Moolenbroek return(result);
2574*00b67f09SDavid van Moolenbroek }
2575*00b67f09SDavid van Moolenbroek
2576*00b67f09SDavid van Moolenbroek static void
t13(void)2577*00b67f09SDavid van Moolenbroek t13(void) {
2578*00b67f09SDavid van Moolenbroek int result;
2579*00b67f09SDavid van Moolenbroek
2580*00b67f09SDavid van Moolenbroek t_assert("dns_db_findnode", 13, T_REQUIRED, "%s", a13);
2581*00b67f09SDavid van Moolenbroek result = t_eval("dns_db_findnode_1_data", t_dns_db_findnode_1, 8);
2582*00b67f09SDavid van Moolenbroek t_result(result);
2583*00b67f09SDavid van Moolenbroek }
2584*00b67f09SDavid van Moolenbroek
2585*00b67f09SDavid van Moolenbroek static const char *a14 =
2586*00b67f09SDavid van Moolenbroek "If the node name does not exist and create is ISC_TRUE, "
2587*00b67f09SDavid van Moolenbroek "then a call to dns_db_findnode(db, name, create, nodep) "
2588*00b67f09SDavid van Moolenbroek "creates the node, initializes nodep to point to the node, "
2589*00b67f09SDavid van Moolenbroek "and returns ISC_R_SUCCESS.";
2590*00b67f09SDavid van Moolenbroek
2591*00b67f09SDavid van Moolenbroek static int
t_dns_db_findnode_2(char ** av)2592*00b67f09SDavid van Moolenbroek t_dns_db_findnode_2(char **av) {
2593*00b67f09SDavid van Moolenbroek char *filename;
2594*00b67f09SDavid van Moolenbroek char *db_type;
2595*00b67f09SDavid van Moolenbroek char *origin;
2596*00b67f09SDavid van Moolenbroek char *class;
2597*00b67f09SDavid van Moolenbroek char *model;
2598*00b67f09SDavid van Moolenbroek char *newname;
2599*00b67f09SDavid van Moolenbroek
2600*00b67f09SDavid van Moolenbroek int nfails;
2601*00b67f09SDavid van Moolenbroek int result;
2602*00b67f09SDavid van Moolenbroek int len;
2603*00b67f09SDavid van Moolenbroek dns_db_t *db;
2604*00b67f09SDavid van Moolenbroek isc_result_t dns_result;
2605*00b67f09SDavid van Moolenbroek isc_result_t isc_result;
2606*00b67f09SDavid van Moolenbroek isc_mem_t *mctx;
2607*00b67f09SDavid van Moolenbroek isc_entropy_t *ectx;
2608*00b67f09SDavid van Moolenbroek dns_dbnode_t *nodep;
2609*00b67f09SDavid van Moolenbroek dns_dbnode_t *newnodep;
2610*00b67f09SDavid van Moolenbroek isc_buffer_t name_buffer;
2611*00b67f09SDavid van Moolenbroek dns_rdataset_t rdataset;
2612*00b67f09SDavid van Moolenbroek dns_fixedname_t dns_name;
2613*00b67f09SDavid van Moolenbroek dns_fixedname_t dns_foundname;
2614*00b67f09SDavid van Moolenbroek dns_dbversion_t *cversionp;
2615*00b67f09SDavid van Moolenbroek
2616*00b67f09SDavid van Moolenbroek filename = T_ARG(0);
2617*00b67f09SDavid van Moolenbroek db_type = T_ARG(1);
2618*00b67f09SDavid van Moolenbroek origin = T_ARG(2);
2619*00b67f09SDavid van Moolenbroek class = T_ARG(3);
2620*00b67f09SDavid van Moolenbroek model = T_ARG(4);
2621*00b67f09SDavid van Moolenbroek newname = T_ARG(5);
2622*00b67f09SDavid van Moolenbroek
2623*00b67f09SDavid van Moolenbroek db = NULL;
2624*00b67f09SDavid van Moolenbroek mctx = NULL;
2625*00b67f09SDavid van Moolenbroek ectx = NULL;
2626*00b67f09SDavid van Moolenbroek nfails = 0;
2627*00b67f09SDavid van Moolenbroek
2628*00b67f09SDavid van Moolenbroek t_info("testing using file %s and name %s\n", filename, newname);
2629*00b67f09SDavid van Moolenbroek
2630*00b67f09SDavid van Moolenbroek isc_result = isc_mem_create(0, 0, &mctx);
2631*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
2632*00b67f09SDavid van Moolenbroek t_info("isc_mem_create failed %s\n",
2633*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
2634*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
2635*00b67f09SDavid van Moolenbroek }
2636*00b67f09SDavid van Moolenbroek
2637*00b67f09SDavid van Moolenbroek isc_result = isc_entropy_create(mctx, &ectx);
2638*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
2639*00b67f09SDavid van Moolenbroek t_info("isc_entropy_create failed %s\n",
2640*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
2641*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
2642*00b67f09SDavid van Moolenbroek }
2643*00b67f09SDavid van Moolenbroek
2644*00b67f09SDavid van Moolenbroek isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
2645*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
2646*00b67f09SDavid van Moolenbroek t_info("isc_hash_create failed %s\n",
2647*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
2648*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
2649*00b67f09SDavid van Moolenbroek }
2650*00b67f09SDavid van Moolenbroek
2651*00b67f09SDavid van Moolenbroek dns_result = t_create(db_type, origin, class, model, mctx, &db);
2652*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
2653*00b67f09SDavid van Moolenbroek isc_hash_destroy();
2654*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
2655*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2656*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
2657*00b67f09SDavid van Moolenbroek }
2658*00b67f09SDavid van Moolenbroek
2659*00b67f09SDavid van Moolenbroek dns_result = dns_db_load(db, filename);
2660*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
2661*00b67f09SDavid van Moolenbroek t_info("dns_db_load returned %s\n",
2662*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
2663*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
2664*00b67f09SDavid van Moolenbroek isc_hash_destroy();
2665*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
2666*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2667*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
2668*00b67f09SDavid van Moolenbroek }
2669*00b67f09SDavid van Moolenbroek
2670*00b67f09SDavid van Moolenbroek nodep = NULL;
2671*00b67f09SDavid van Moolenbroek dns_fixedname_init(&dns_name);
2672*00b67f09SDavid van Moolenbroek
2673*00b67f09SDavid van Moolenbroek /*
2674*00b67f09SDavid van Moolenbroek * Make sure the name isn't there
2675*00b67f09SDavid van Moolenbroek */
2676*00b67f09SDavid van Moolenbroek len = strlen(newname);
2677*00b67f09SDavid van Moolenbroek isc_buffer_init(&name_buffer, newname, len);
2678*00b67f09SDavid van Moolenbroek isc_buffer_add(&name_buffer, len);
2679*00b67f09SDavid van Moolenbroek dns_result = dns_name_fromtext(dns_fixedname_name(&dns_name),
2680*00b67f09SDavid van Moolenbroek &name_buffer, NULL, 0, NULL);
2681*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
2682*00b67f09SDavid van Moolenbroek t_info("dns_name_fromtext returned %s\n",
2683*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
2684*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
2685*00b67f09SDavid van Moolenbroek isc_hash_destroy();
2686*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
2687*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2688*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
2689*00b67f09SDavid van Moolenbroek }
2690*00b67f09SDavid van Moolenbroek
2691*00b67f09SDavid van Moolenbroek dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_name),
2692*00b67f09SDavid van Moolenbroek ISC_FALSE, &nodep);
2693*00b67f09SDavid van Moolenbroek if ((dns_result != ISC_R_NOTFOUND) &&
2694*00b67f09SDavid van Moolenbroek (dns_result != DNS_R_NXDOMAIN) &&
2695*00b67f09SDavid van Moolenbroek (dns_result != DNS_R_NXRRSET)) {
2696*00b67f09SDavid van Moolenbroek t_info("dns_db_findnode %s\n",
2697*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
2698*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
2699*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
2700*00b67f09SDavid van Moolenbroek isc_hash_destroy();
2701*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
2702*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2703*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
2704*00b67f09SDavid van Moolenbroek }
2705*00b67f09SDavid van Moolenbroek
2706*00b67f09SDavid van Moolenbroek /*
2707*00b67f09SDavid van Moolenbroek * Add it.
2708*00b67f09SDavid van Moolenbroek */
2709*00b67f09SDavid van Moolenbroek dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_name),
2710*00b67f09SDavid van Moolenbroek ISC_TRUE, &nodep);
2711*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
2712*00b67f09SDavid van Moolenbroek t_info("dns_db_findnode %s\n",
2713*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
2714*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
2715*00b67f09SDavid van Moolenbroek isc_hash_destroy();
2716*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
2717*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2718*00b67f09SDavid van Moolenbroek return(T_FAIL);
2719*00b67f09SDavid van Moolenbroek }
2720*00b67f09SDavid van Moolenbroek
2721*00b67f09SDavid van Moolenbroek /*
2722*00b67f09SDavid van Moolenbroek * Check it.
2723*00b67f09SDavid van Moolenbroek */
2724*00b67f09SDavid van Moolenbroek newnodep = NULL;
2725*00b67f09SDavid van Moolenbroek dns_rdataset_init(&rdataset);
2726*00b67f09SDavid van Moolenbroek dns_fixedname_init(&dns_foundname);
2727*00b67f09SDavid van Moolenbroek cversionp = NULL;
2728*00b67f09SDavid van Moolenbroek dns_db_currentversion(db, &cversionp);
2729*00b67f09SDavid van Moolenbroek
2730*00b67f09SDavid van Moolenbroek /*
2731*00b67f09SDavid van Moolenbroek * First try dns_db_find DNS_R_NXDOMAIN.
2732*00b67f09SDavid van Moolenbroek */
2733*00b67f09SDavid van Moolenbroek dns_result = dns_db_find(db,
2734*00b67f09SDavid van Moolenbroek dns_fixedname_name(&dns_name),
2735*00b67f09SDavid van Moolenbroek cversionp,
2736*00b67f09SDavid van Moolenbroek dns_rdatatype_any,
2737*00b67f09SDavid van Moolenbroek 0,
2738*00b67f09SDavid van Moolenbroek 0,
2739*00b67f09SDavid van Moolenbroek &newnodep,
2740*00b67f09SDavid van Moolenbroek dns_fixedname_name(&dns_foundname),
2741*00b67f09SDavid van Moolenbroek &rdataset, NULL);
2742*00b67f09SDavid van Moolenbroek if ((dns_result != ISC_R_NOTFOUND) && (dns_result != DNS_R_NXDOMAIN)) {
2743*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &newnodep);
2744*00b67f09SDavid van Moolenbroek }
2745*00b67f09SDavid van Moolenbroek
2746*00b67f09SDavid van Moolenbroek if (dns_result != DNS_R_NXDOMAIN) {
2747*00b67f09SDavid van Moolenbroek t_info("dns_db_find %s\n",
2748*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
2749*00b67f09SDavid van Moolenbroek ++nfails;
2750*00b67f09SDavid van Moolenbroek }
2751*00b67f09SDavid van Moolenbroek
2752*00b67f09SDavid van Moolenbroek /*
2753*00b67f09SDavid van Moolenbroek * Then try dns_db_findnode ISC_R_SUCCESS.
2754*00b67f09SDavid van Moolenbroek */
2755*00b67f09SDavid van Moolenbroek dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_name),
2756*00b67f09SDavid van Moolenbroek ISC_FALSE, &newnodep);
2757*00b67f09SDavid van Moolenbroek t_info("dns_db_findnode %s\n", dns_result_totext(dns_result));
2758*00b67f09SDavid van Moolenbroek if (dns_result == ISC_R_SUCCESS) {
2759*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &newnodep);
2760*00b67f09SDavid van Moolenbroek } else {
2761*00b67f09SDavid van Moolenbroek t_info("dns_db_findnode %s failed %s\n", newname,
2762*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
2763*00b67f09SDavid van Moolenbroek ++nfails;
2764*00b67f09SDavid van Moolenbroek }
2765*00b67f09SDavid van Moolenbroek
2766*00b67f09SDavid van Moolenbroek
2767*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
2768*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &cversionp, ISC_FALSE);
2769*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
2770*00b67f09SDavid van Moolenbroek isc_hash_destroy();
2771*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
2772*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2773*00b67f09SDavid van Moolenbroek
2774*00b67f09SDavid van Moolenbroek if (nfails == 0)
2775*00b67f09SDavid van Moolenbroek result = T_PASS;
2776*00b67f09SDavid van Moolenbroek else
2777*00b67f09SDavid van Moolenbroek result = T_FAIL;
2778*00b67f09SDavid van Moolenbroek
2779*00b67f09SDavid van Moolenbroek return(result);
2780*00b67f09SDavid van Moolenbroek }
2781*00b67f09SDavid van Moolenbroek
2782*00b67f09SDavid van Moolenbroek static void
t14(void)2783*00b67f09SDavid van Moolenbroek t14(void) {
2784*00b67f09SDavid van Moolenbroek int result;
2785*00b67f09SDavid van Moolenbroek
2786*00b67f09SDavid van Moolenbroek t_assert("dns_db_findnode", 14, T_REQUIRED, "%s", a14);
2787*00b67f09SDavid van Moolenbroek result = t_eval("dns_db_findnode_2_data", t_dns_db_findnode_2, 6);
2788*00b67f09SDavid van Moolenbroek t_result(result);
2789*00b67f09SDavid van Moolenbroek }
2790*00b67f09SDavid van Moolenbroek
2791*00b67f09SDavid van Moolenbroek static int
t_dns_db_find_x(char ** av)2792*00b67f09SDavid van Moolenbroek t_dns_db_find_x(char **av) {
2793*00b67f09SDavid van Moolenbroek char *dbfile;
2794*00b67f09SDavid van Moolenbroek char *dbtype;
2795*00b67f09SDavid van Moolenbroek char *dborigin;
2796*00b67f09SDavid van Moolenbroek char *dbclass;
2797*00b67f09SDavid van Moolenbroek char *dbmodel;
2798*00b67f09SDavid van Moolenbroek char *findname;
2799*00b67f09SDavid van Moolenbroek char *findtype;
2800*00b67f09SDavid van Moolenbroek char *findopts;
2801*00b67f09SDavid van Moolenbroek char *findtime;
2802*00b67f09SDavid van Moolenbroek char *expected_result;
2803*00b67f09SDavid van Moolenbroek
2804*00b67f09SDavid van Moolenbroek int result;
2805*00b67f09SDavid van Moolenbroek int len;
2806*00b67f09SDavid van Moolenbroek int opts;
2807*00b67f09SDavid van Moolenbroek dns_db_t *db;
2808*00b67f09SDavid van Moolenbroek isc_result_t dns_result;
2809*00b67f09SDavid van Moolenbroek isc_result_t isc_result;
2810*00b67f09SDavid van Moolenbroek isc_stdtime_t ftime;
2811*00b67f09SDavid van Moolenbroek isc_stdtime_t now;
2812*00b67f09SDavid van Moolenbroek isc_result_t exp_result;
2813*00b67f09SDavid van Moolenbroek isc_mem_t *mctx;
2814*00b67f09SDavid van Moolenbroek isc_entropy_t *ectx;
2815*00b67f09SDavid van Moolenbroek dns_dbnode_t *nodep;
2816*00b67f09SDavid van Moolenbroek isc_textregion_t textregion;
2817*00b67f09SDavid van Moolenbroek isc_buffer_t findname_buffer;
2818*00b67f09SDavid van Moolenbroek dns_fixedname_t dns_findname;
2819*00b67f09SDavid van Moolenbroek dns_fixedname_t dns_foundname;
2820*00b67f09SDavid van Moolenbroek dns_rdataset_t rdataset;
2821*00b67f09SDavid van Moolenbroek dns_rdatatype_t rdatatype;
2822*00b67f09SDavid van Moolenbroek dns_dbversion_t *cversionp;
2823*00b67f09SDavid van Moolenbroek
2824*00b67f09SDavid van Moolenbroek dbfile = T_ARG(0);
2825*00b67f09SDavid van Moolenbroek dbtype = T_ARG(1);
2826*00b67f09SDavid van Moolenbroek dborigin = T_ARG(2);
2827*00b67f09SDavid van Moolenbroek dbclass = T_ARG(3);
2828*00b67f09SDavid van Moolenbroek dbmodel = T_ARG(4);
2829*00b67f09SDavid van Moolenbroek findname = T_ARG(5);
2830*00b67f09SDavid van Moolenbroek findtype = T_ARG(6);
2831*00b67f09SDavid van Moolenbroek findopts = T_ARG(7);
2832*00b67f09SDavid van Moolenbroek findtime = T_ARG(8);
2833*00b67f09SDavid van Moolenbroek expected_result = T_ARG(9);
2834*00b67f09SDavid van Moolenbroek db = NULL;
2835*00b67f09SDavid van Moolenbroek mctx = NULL;
2836*00b67f09SDavid van Moolenbroek ectx = NULL;
2837*00b67f09SDavid van Moolenbroek opts = 0;
2838*00b67f09SDavid van Moolenbroek
2839*00b67f09SDavid van Moolenbroek t_info("testing using %s, name %s, type %s\n", dbfile, findname,
2840*00b67f09SDavid van Moolenbroek findtype);
2841*00b67f09SDavid van Moolenbroek
2842*00b67f09SDavid van Moolenbroek isc_result = isc_mem_create(0, 0, &mctx);
2843*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
2844*00b67f09SDavid van Moolenbroek t_info("isc_mem_create failed %s\n",
2845*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
2846*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
2847*00b67f09SDavid van Moolenbroek }
2848*00b67f09SDavid van Moolenbroek
2849*00b67f09SDavid van Moolenbroek isc_result = isc_entropy_create(mctx, &ectx);
2850*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
2851*00b67f09SDavid van Moolenbroek t_info("isc_entropy_create failed %s\n",
2852*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
2853*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2854*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
2855*00b67f09SDavid van Moolenbroek }
2856*00b67f09SDavid van Moolenbroek
2857*00b67f09SDavid van Moolenbroek isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
2858*00b67f09SDavid van Moolenbroek if (isc_result != ISC_R_SUCCESS) {
2859*00b67f09SDavid van Moolenbroek t_info("isc_hash_create failed %s\n",
2860*00b67f09SDavid van Moolenbroek isc_result_totext(isc_result));
2861*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
2862*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2863*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
2864*00b67f09SDavid van Moolenbroek }
2865*00b67f09SDavid van Moolenbroek
2866*00b67f09SDavid van Moolenbroek dns_result = t_create(dbtype, dborigin, dbclass, dbmodel, mctx, &db);
2867*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
2868*00b67f09SDavid van Moolenbroek isc_hash_destroy();
2869*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
2870*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2871*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
2872*00b67f09SDavid van Moolenbroek }
2873*00b67f09SDavid van Moolenbroek
2874*00b67f09SDavid van Moolenbroek dns_result = dns_db_load(db, dbfile);
2875*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
2876*00b67f09SDavid van Moolenbroek t_info("dns_db_load returned %s\n",
2877*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
2878*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
2879*00b67f09SDavid van Moolenbroek isc_hash_destroy();
2880*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
2881*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2882*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
2883*00b67f09SDavid van Moolenbroek }
2884*00b67f09SDavid van Moolenbroek
2885*00b67f09SDavid van Moolenbroek exp_result = t_dns_result_fromtext(expected_result);
2886*00b67f09SDavid van Moolenbroek
2887*00b67f09SDavid van Moolenbroek dns_fixedname_init(&dns_findname);
2888*00b67f09SDavid van Moolenbroek len = strlen(findname);
2889*00b67f09SDavid van Moolenbroek isc_buffer_init(&findname_buffer, findname, len);
2890*00b67f09SDavid van Moolenbroek isc_buffer_add(&findname_buffer, len);
2891*00b67f09SDavid van Moolenbroek dns_result = dns_name_fromtext(dns_fixedname_name(&dns_findname),
2892*00b67f09SDavid van Moolenbroek &findname_buffer, NULL, 0, NULL);
2893*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
2894*00b67f09SDavid van Moolenbroek t_info("dns_name_fromtext failed %s\n",
2895*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
2896*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
2897*00b67f09SDavid van Moolenbroek isc_hash_destroy();
2898*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
2899*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2900*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
2901*00b67f09SDavid van Moolenbroek }
2902*00b67f09SDavid van Moolenbroek
2903*00b67f09SDavid van Moolenbroek textregion.base = findtype;
2904*00b67f09SDavid van Moolenbroek textregion.length = strlen(findtype);
2905*00b67f09SDavid van Moolenbroek dns_result = dns_rdatatype_fromtext(&rdatatype, &textregion);
2906*00b67f09SDavid van Moolenbroek if (dns_result != ISC_R_SUCCESS) {
2907*00b67f09SDavid van Moolenbroek t_info("dns_rdatatype_fromtext %s failed %s\n",
2908*00b67f09SDavid van Moolenbroek findtype,
2909*00b67f09SDavid van Moolenbroek dns_result_totext(dns_result));
2910*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
2911*00b67f09SDavid van Moolenbroek isc_hash_destroy();
2912*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
2913*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2914*00b67f09SDavid van Moolenbroek return(T_UNRESOLVED);
2915*00b67f09SDavid van Moolenbroek }
2916*00b67f09SDavid van Moolenbroek
2917*00b67f09SDavid van Moolenbroek if (strstr(findopts, "DNS_DBFIND_GLUEOK"))
2918*00b67f09SDavid van Moolenbroek opts |= DNS_DBFIND_GLUEOK;
2919*00b67f09SDavid van Moolenbroek if (strstr(findopts, "DNS_DBFIND_VALIDATEGLUE"))
2920*00b67f09SDavid van Moolenbroek opts |= DNS_DBFIND_VALIDATEGLUE;
2921*00b67f09SDavid van Moolenbroek
2922*00b67f09SDavid van Moolenbroek isc_stdtime_get(&now);
2923*00b67f09SDavid van Moolenbroek
2924*00b67f09SDavid van Moolenbroek ftime = strtol(findtime, NULL, 10);
2925*00b67f09SDavid van Moolenbroek if (ftime != 0)
2926*00b67f09SDavid van Moolenbroek ftime += now;
2927*00b67f09SDavid van Moolenbroek
2928*00b67f09SDavid van Moolenbroek cversionp = NULL;
2929*00b67f09SDavid van Moolenbroek dns_fixedname_init(&dns_foundname);
2930*00b67f09SDavid van Moolenbroek dns_rdataset_init(&rdataset);
2931*00b67f09SDavid van Moolenbroek if (dns_db_iszone(db))
2932*00b67f09SDavid van Moolenbroek dns_db_currentversion(db, &cversionp);
2933*00b67f09SDavid van Moolenbroek nodep = NULL;
2934*00b67f09SDavid van Moolenbroek
2935*00b67f09SDavid van Moolenbroek dns_result = dns_db_find(db,
2936*00b67f09SDavid van Moolenbroek dns_fixedname_name(&dns_findname),
2937*00b67f09SDavid van Moolenbroek cversionp,
2938*00b67f09SDavid van Moolenbroek rdatatype,
2939*00b67f09SDavid van Moolenbroek opts,
2940*00b67f09SDavid van Moolenbroek ftime,
2941*00b67f09SDavid van Moolenbroek &nodep,
2942*00b67f09SDavid van Moolenbroek dns_fixedname_name(&dns_foundname),
2943*00b67f09SDavid van Moolenbroek &rdataset, NULL);
2944*00b67f09SDavid van Moolenbroek
2945*00b67f09SDavid van Moolenbroek if (dns_result != exp_result) {
2946*00b67f09SDavid van Moolenbroek t_info("dns_db_find %s %s unexpectedly returned %s, "
2947*00b67f09SDavid van Moolenbroek "expected %s\n",
2948*00b67f09SDavid van Moolenbroek findname, findtype, dns_result_totext(dns_result),
2949*00b67f09SDavid van Moolenbroek dns_result_totext(exp_result));
2950*00b67f09SDavid van Moolenbroek result = T_FAIL;
2951*00b67f09SDavid van Moolenbroek } else {
2952*00b67f09SDavid van Moolenbroek result = T_PASS;
2953*00b67f09SDavid van Moolenbroek }
2954*00b67f09SDavid van Moolenbroek
2955*00b67f09SDavid van Moolenbroek if ((dns_result != ISC_R_NOTFOUND) && (dns_result != DNS_R_NXDOMAIN)) {
2956*00b67f09SDavid van Moolenbroek
2957*00b67f09SDavid van Moolenbroek if ((dns_result != DNS_R_NXRRSET) &&
2958*00b67f09SDavid van Moolenbroek (dns_result != DNS_R_ZONECUT))
2959*00b67f09SDavid van Moolenbroek if (dns_rdataset_isassociated(&rdataset))
2960*00b67f09SDavid van Moolenbroek dns_rdataset_disassociate(&rdataset);
2961*00b67f09SDavid van Moolenbroek dns_db_detachnode(db, &nodep);
2962*00b67f09SDavid van Moolenbroek }
2963*00b67f09SDavid van Moolenbroek
2964*00b67f09SDavid van Moolenbroek if (dns_db_iszone(db))
2965*00b67f09SDavid van Moolenbroek dns_db_closeversion(db, &cversionp, ISC_FALSE);
2966*00b67f09SDavid van Moolenbroek dns_db_detach(&db);
2967*00b67f09SDavid van Moolenbroek isc_hash_destroy();
2968*00b67f09SDavid van Moolenbroek isc_entropy_detach(&ectx);
2969*00b67f09SDavid van Moolenbroek isc_mem_destroy(&mctx);
2970*00b67f09SDavid van Moolenbroek
2971*00b67f09SDavid van Moolenbroek return(result);
2972*00b67f09SDavid van Moolenbroek }
2973*00b67f09SDavid van Moolenbroek
2974*00b67f09SDavid van Moolenbroek static const char *a15 =
2975*00b67f09SDavid van Moolenbroek "A call to dns_db_find(db, name, version, type, options, now, ...) "
2976*00b67f09SDavid van Moolenbroek "finds the best match for 'name' and 'type' in version 'version' "
2977*00b67f09SDavid van Moolenbroek "of 'db'.";
2978*00b67f09SDavid van Moolenbroek
2979*00b67f09SDavid van Moolenbroek static void
t15(void)2980*00b67f09SDavid van Moolenbroek t15(void) {
2981*00b67f09SDavid van Moolenbroek int result;
2982*00b67f09SDavid van Moolenbroek
2983*00b67f09SDavid van Moolenbroek t_assert("dns_db_find", 15, T_REQUIRED, "%s", a15);
2984*00b67f09SDavid van Moolenbroek result = t_eval("dns_db_find_1_data", t_dns_db_find_x, 10);
2985*00b67f09SDavid van Moolenbroek t_result(result);
2986*00b67f09SDavid van Moolenbroek }
2987*00b67f09SDavid van Moolenbroek
2988*00b67f09SDavid van Moolenbroek
2989*00b67f09SDavid van Moolenbroek static const char *a16 =
2990*00b67f09SDavid van Moolenbroek "When the desired node and type were found, but are glue, "
2991*00b67f09SDavid van Moolenbroek "and the DNS_DBFIND_GLUEOK option is set, a call to "
2992*00b67f09SDavid van Moolenbroek "dns_db_find(db, name, version, type, options, now, ...) "
2993*00b67f09SDavid van Moolenbroek "returns DNS_R_GLUE.";
2994*00b67f09SDavid van Moolenbroek
2995*00b67f09SDavid van Moolenbroek static void
t16(void)2996*00b67f09SDavid van Moolenbroek t16(void) {
2997*00b67f09SDavid van Moolenbroek int result;
2998*00b67f09SDavid van Moolenbroek
2999*00b67f09SDavid van Moolenbroek t_assert("dns_db_find", 16, T_REQUIRED, "%s", a16);
3000*00b67f09SDavid van Moolenbroek result = t_eval("dns_db_find_2_data", t_dns_db_find_x, 10);
3001*00b67f09SDavid van Moolenbroek t_result(result);
3002*00b67f09SDavid van Moolenbroek }
3003*00b67f09SDavid van Moolenbroek
3004*00b67f09SDavid van Moolenbroek static const char *a17 =
3005*00b67f09SDavid van Moolenbroek "A call to dns_db_find() returns DNS_R_DELEGATION when the data "
3006*00b67f09SDavid van Moolenbroek "requested is beneath a zone cut.";
3007*00b67f09SDavid van Moolenbroek
3008*00b67f09SDavid van Moolenbroek static void
t17(void)3009*00b67f09SDavid van Moolenbroek t17(void) {
3010*00b67f09SDavid van Moolenbroek int result;
3011*00b67f09SDavid van Moolenbroek
3012*00b67f09SDavid van Moolenbroek t_assert("dns_db_find", 17, T_REQUIRED, "%s", a17);
3013*00b67f09SDavid van Moolenbroek result = t_eval("dns_db_find_3_data", t_dns_db_find_x, 10);
3014*00b67f09SDavid van Moolenbroek t_result(result);
3015*00b67f09SDavid van Moolenbroek }
3016*00b67f09SDavid van Moolenbroek
3017*00b67f09SDavid van Moolenbroek static const char *a18 =
3018*00b67f09SDavid van Moolenbroek "A call to dns_db_find() returns DNS_R_DELEGATION when type is "
3019*00b67f09SDavid van Moolenbroek "dns_rdatatype_any and the desired node is a zone cut.";
3020*00b67f09SDavid van Moolenbroek
3021*00b67f09SDavid van Moolenbroek static void
t18(void)3022*00b67f09SDavid van Moolenbroek t18(void) {
3023*00b67f09SDavid van Moolenbroek int result;
3024*00b67f09SDavid van Moolenbroek
3025*00b67f09SDavid van Moolenbroek t_assert("dns_db_find", 18, T_REQUIRED, "%s", a18);
3026*00b67f09SDavid van Moolenbroek result = t_eval("dns_db_find_4_data", t_dns_db_find_x, 10);
3027*00b67f09SDavid van Moolenbroek t_result(result);
3028*00b67f09SDavid van Moolenbroek }
3029*00b67f09SDavid van Moolenbroek
3030*00b67f09SDavid van Moolenbroek static const char *a19 =
3031*00b67f09SDavid van Moolenbroek "A call to dns_db_find() returns DNS_R_DNAME when the data "
3032*00b67f09SDavid van Moolenbroek "requested is beneath a DNAME.";
3033*00b67f09SDavid van Moolenbroek
3034*00b67f09SDavid van Moolenbroek static void
t19(void)3035*00b67f09SDavid van Moolenbroek t19(void) {
3036*00b67f09SDavid van Moolenbroek int result;
3037*00b67f09SDavid van Moolenbroek
3038*00b67f09SDavid van Moolenbroek t_assert("dns_db_find", 19, T_REQUIRED, "%s", a19);
3039*00b67f09SDavid van Moolenbroek result = t_eval("dns_db_find_5_data", t_dns_db_find_x, 10);
3040*00b67f09SDavid van Moolenbroek t_result(result);
3041*00b67f09SDavid van Moolenbroek }
3042*00b67f09SDavid van Moolenbroek
3043*00b67f09SDavid van Moolenbroek static const char *a20 =
3044*00b67f09SDavid van Moolenbroek "A call to dns_db_find() returns DNS_R_CNAME when the requested "
3045*00b67f09SDavid van Moolenbroek "rdataset was not found but there is a CNAME at the desired name.";
3046*00b67f09SDavid van Moolenbroek
3047*00b67f09SDavid van Moolenbroek static void
t20(void)3048*00b67f09SDavid van Moolenbroek t20(void) {
3049*00b67f09SDavid van Moolenbroek int result;
3050*00b67f09SDavid van Moolenbroek
3051*00b67f09SDavid van Moolenbroek t_assert("dns_db_find", 20, T_REQUIRED, "%s", a20);
3052*00b67f09SDavid van Moolenbroek result = t_eval("dns_db_find_6_data", t_dns_db_find_x, 10);
3053*00b67f09SDavid van Moolenbroek t_result(result);
3054*00b67f09SDavid van Moolenbroek }
3055*00b67f09SDavid van Moolenbroek
3056*00b67f09SDavid van Moolenbroek static const char *a21 =
3057*00b67f09SDavid van Moolenbroek "A call to dns_db_find() returns DNS_R_NXDOMAIN when name "
3058*00b67f09SDavid van Moolenbroek "does not exist.";
3059*00b67f09SDavid van Moolenbroek
3060*00b67f09SDavid van Moolenbroek static void
t21(void)3061*00b67f09SDavid van Moolenbroek t21(void) {
3062*00b67f09SDavid van Moolenbroek int result;
3063*00b67f09SDavid van Moolenbroek
3064*00b67f09SDavid van Moolenbroek t_assert("dns_db_find", 21, T_REQUIRED, "%s", a21);
3065*00b67f09SDavid van Moolenbroek result = t_eval("dns_db_find_7_data", t_dns_db_find_x, 10);
3066*00b67f09SDavid van Moolenbroek t_result(result);
3067*00b67f09SDavid van Moolenbroek }
3068*00b67f09SDavid van Moolenbroek
3069*00b67f09SDavid van Moolenbroek static const char *a22 =
3070*00b67f09SDavid van Moolenbroek "A call to dns_db_find() returns DNS_R_NXRRSET when "
3071*00b67f09SDavid van Moolenbroek "the desired name exists, but the desired type does not.";
3072*00b67f09SDavid van Moolenbroek
3073*00b67f09SDavid van Moolenbroek static void
t22(void)3074*00b67f09SDavid van Moolenbroek t22(void) {
3075*00b67f09SDavid van Moolenbroek int result;
3076*00b67f09SDavid van Moolenbroek
3077*00b67f09SDavid van Moolenbroek t_assert("dns_db_find", 22, T_REQUIRED, "%s", a22);
3078*00b67f09SDavid van Moolenbroek result = t_eval("dns_db_find_8_data", t_dns_db_find_x, 10);
3079*00b67f09SDavid van Moolenbroek t_result(result);
3080*00b67f09SDavid van Moolenbroek }
3081*00b67f09SDavid van Moolenbroek
3082*00b67f09SDavid van Moolenbroek static const char *a23 =
3083*00b67f09SDavid van Moolenbroek "When db is a cache database, a call to dns_db_find() "
3084*00b67f09SDavid van Moolenbroek "returns ISC_R_NOTFOUND when the desired name does not exist, "
3085*00b67f09SDavid van Moolenbroek "and no delegation could be found.";
3086*00b67f09SDavid van Moolenbroek
3087*00b67f09SDavid van Moolenbroek static void
t23(void)3088*00b67f09SDavid van Moolenbroek t23(void) {
3089*00b67f09SDavid van Moolenbroek int result;
3090*00b67f09SDavid van Moolenbroek
3091*00b67f09SDavid van Moolenbroek t_assert("dns_db_find", 23, T_REQUIRED, "%s", a23);
3092*00b67f09SDavid van Moolenbroek result = t_eval("dns_db_find_9_data", t_dns_db_find_x, 10);
3093*00b67f09SDavid van Moolenbroek t_result(result);
3094*00b67f09SDavid van Moolenbroek }
3095*00b67f09SDavid van Moolenbroek
3096*00b67f09SDavid van Moolenbroek static const char *a24 =
3097*00b67f09SDavid van Moolenbroek "When db is a cache database, an rdataset will be found only "
3098*00b67f09SDavid van Moolenbroek "if at least one rdataset at the found node expires after 'now'.";
3099*00b67f09SDavid van Moolenbroek
3100*00b67f09SDavid van Moolenbroek static void
t24(void)3101*00b67f09SDavid van Moolenbroek t24(void) {
3102*00b67f09SDavid van Moolenbroek int result;
3103*00b67f09SDavid van Moolenbroek
3104*00b67f09SDavid van Moolenbroek t_assert("dns_db_find", 24, T_REQUIRED, "%s", a24);
3105*00b67f09SDavid van Moolenbroek result = t_eval("dns_db_find_10_data", t_dns_db_find_x, 10);
3106*00b67f09SDavid van Moolenbroek t_result(result);
3107*00b67f09SDavid van Moolenbroek }
3108*00b67f09SDavid van Moolenbroek
3109*00b67f09SDavid van Moolenbroek static const char *a25 =
3110*00b67f09SDavid van Moolenbroek "A call to dns_db_load(db, filename) returns DNS_R_NOTZONETOP "
3111*00b67f09SDavid van Moolenbroek "when the zone data contains a SOA not at the zone apex.";
3112*00b67f09SDavid van Moolenbroek
3113*00b67f09SDavid van Moolenbroek static void
t25(void)3114*00b67f09SDavid van Moolenbroek t25(void) {
3115*00b67f09SDavid van Moolenbroek int result;
3116*00b67f09SDavid van Moolenbroek
3117*00b67f09SDavid van Moolenbroek t_assert("dns_db_load", 25, T_REQUIRED, "%s", a25);
3118*00b67f09SDavid van Moolenbroek result = t_eval("dns_db_load_soa_not_top", t_dns_db_load, 9);
3119*00b67f09SDavid van Moolenbroek t_result(result);
3120*00b67f09SDavid van Moolenbroek }
3121*00b67f09SDavid van Moolenbroek
3122*00b67f09SDavid van Moolenbroek testspec_t T_testlist[] = {
3123*00b67f09SDavid van Moolenbroek { (PFV) t1, "dns_db_load" },
3124*00b67f09SDavid van Moolenbroek { (PFV) t2, "dns_db_iscache" },
3125*00b67f09SDavid van Moolenbroek { (PFV) t3, "dns_db_iscache" },
3126*00b67f09SDavid van Moolenbroek { (PFV) t4, "dns_db_iszone" },
3127*00b67f09SDavid van Moolenbroek { (PFV) t5, "dns_db_iszone" },
3128*00b67f09SDavid van Moolenbroek { (PFV) t6, "dns_db_origin" },
3129*00b67f09SDavid van Moolenbroek { (PFV) t7, "dns_db_class" },
3130*00b67f09SDavid van Moolenbroek { (PFV) t8, "dns_db_currentversion" },
3131*00b67f09SDavid van Moolenbroek { (PFV) t9, "dns_db_newversion" },
3132*00b67f09SDavid van Moolenbroek { (PFV) t10, "dns_db_closeversion" },
3133*00b67f09SDavid van Moolenbroek { (PFV) t11, "dns_db_closeversion" },
3134*00b67f09SDavid van Moolenbroek { (PFV) t12, "dns_db_expirenode" },
3135*00b67f09SDavid van Moolenbroek { (PFV) t13, "dns_db_findnode" },
3136*00b67f09SDavid van Moolenbroek { (PFV) t14, "dns_db_findnode" },
3137*00b67f09SDavid van Moolenbroek { (PFV) t15, "dns_db_find" },
3138*00b67f09SDavid van Moolenbroek { (PFV) t16, "dns_db_find" },
3139*00b67f09SDavid van Moolenbroek { (PFV) t17, "dns_db_find" },
3140*00b67f09SDavid van Moolenbroek { (PFV) t18, "dns_db_find" },
3141*00b67f09SDavid van Moolenbroek { (PFV) t19, "dns_db_find" },
3142*00b67f09SDavid van Moolenbroek { (PFV) t20, "dns_db_find" },
3143*00b67f09SDavid van Moolenbroek { (PFV) t21, "dns_db_find" },
3144*00b67f09SDavid van Moolenbroek { (PFV) t22, "dns_db_find" },
3145*00b67f09SDavid van Moolenbroek { (PFV) t23, "dns_db_find" },
3146*00b67f09SDavid van Moolenbroek { (PFV) t24, "dns_db_find" },
3147*00b67f09SDavid van Moolenbroek { (PFV) t25, "dns_db_load" },
3148*00b67f09SDavid van Moolenbroek { (PFV) 0, NULL }
3149*00b67f09SDavid van Moolenbroek };
3150*00b67f09SDavid van Moolenbroek
3151*00b67f09SDavid van Moolenbroek #ifdef WIN32
3152*00b67f09SDavid van Moolenbroek int
main(int argc,char ** argv)3153*00b67f09SDavid van Moolenbroek main(int argc, char **argv) {
3154*00b67f09SDavid van Moolenbroek t_settests(T_testlist);
3155*00b67f09SDavid van Moolenbroek return (t_main(argc, argv));
3156*00b67f09SDavid van Moolenbroek }
3157*00b67f09SDavid van Moolenbroek #endif
3158