⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 t_db.c

📁 package of develop dns
💻 C
📖 第 1 页 / 共 5 页
字号:
/* * Copyright (C) 2004  Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2001  Internet Software Consortium. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. *//* $Id: t_db.c,v 1.29.206.3 2004/10/25 01:36:06 marka Exp $ */#include <config.h>#include <ctype.h>#include <stdlib.h>#include <isc/entropy.h>#include <isc/hash.h>#include <isc/mem.h>#include <isc/string.h>#include <isc/util.h>#include <dns/db.h>#include <dns/fixedname.h>#include <dns/rdata.h>#include <dns/rdataclass.h>#include <dns/rdatatype.h>#include <dns/rdatalist.h>#include <dns/rdataset.h>#include <dns/result.h>#include <tests/t_api.h>static isc_result_tt_create(const char *db_type, const char *origin, const char *class,	 const char *model, isc_mem_t *mctx, dns_db_t **db){	int			len;	isc_result_t		dns_result;	dns_dbtype_t		dbtype;	isc_textregion_t	region;	isc_buffer_t		origin_buffer;	dns_fixedname_t		dns_origin;	dns_rdataclass_t	rdataclass;	dbtype = dns_dbtype_zone;	if (strcasecmp(model, "cache") == 0)		dbtype = dns_dbtype_cache;	dns_fixedname_init(&dns_origin);	len = strlen(origin);	isc_buffer_init(&origin_buffer, origin, len);	isc_buffer_add(&origin_buffer, len);	dns_result = dns_name_fromtext(dns_fixedname_name(&dns_origin),				       &origin_buffer, NULL, ISC_FALSE, NULL);	if (dns_result != ISC_R_SUCCESS) {		t_info("dns_name_fromtext failed %s\n",		       dns_result_totext(dns_result));		return(dns_result);	}	DE_CONST(class, region.base);	region.length = strlen(class);	dns_result = dns_rdataclass_fromtext(&rdataclass, &region);	if (dns_result != ISC_R_SUCCESS) {		t_info("dns_rdataclass_fromtext failed %s\n",		       dns_result_totext(dns_result));		return(dns_result);	}	dns_result = dns_db_create(mctx, db_type,				   dns_fixedname_name(&dns_origin),				   dbtype, rdataclass, 0, NULL, db);	if (dns_result != ISC_R_SUCCESS)		t_info("dns_db_create failed %s\n",		       dns_result_totext(dns_result));	return(dns_result);}static intt_dns_db_load(char **av) {	char			*filename;	char			*db_type;	char			*origin;	char			*model;	char			*class;	char			*expected_load_result;	char			*findname;	char			*find_type;	char			*expected_find_result;	int			result;	int			len;	dns_db_t		*db;	isc_result_t		dns_result;	isc_result_t		isc_result;	isc_mem_t		*mctx;	isc_entropy_t		*ectx;	dns_dbnode_t		*nodep;	isc_textregion_t	textregion;	isc_buffer_t		findname_buffer;	dns_fixedname_t		dns_findname;	dns_fixedname_t		dns_foundname;	dns_rdataset_t		rdataset;	dns_rdatatype_t		rdatatype;	dns_dbversion_t		*versionp;	isc_result_t		exp_load_result;	isc_result_t		exp_find_result;	result = T_UNRESOLVED;	db = NULL;	mctx = NULL;	ectx = NULL;	filename = T_ARG(0);	db_type = T_ARG(1);	origin = T_ARG(2);	model = T_ARG(3);	class = T_ARG(4);	expected_load_result = T_ARG(5);	findname = T_ARG(6);	find_type = T_ARG(7);	expected_find_result = T_ARG(8);	t_info("testing using file %s and name %s\n", filename, findname);	exp_load_result = t_dns_result_fromtext(expected_load_result);	exp_find_result = t_dns_result_fromtext(expected_find_result);	isc_result = isc_mem_create(0, 0, &mctx);	if (isc_result != ISC_R_SUCCESS) {		t_info("isc_mem_create failed %s\n",				isc_result_totext(isc_result));		return(T_UNRESOLVED);	}	isc_result = isc_entropy_create(mctx, &ectx);	if (isc_result != ISC_R_SUCCESS) {		t_info("isc_entropy_create failed %s\n",				isc_result_totext(isc_result));		isc_mem_destroy(&mctx);		return(T_UNRESOLVED);	}	isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);	if (isc_result != ISC_R_SUCCESS) {		t_info("isc_hash_create failed %s\n",				isc_result_totext(isc_result));		isc_entropy_detach(&ectx);		isc_mem_destroy(&mctx);		return(T_UNRESOLVED);	}	dns_result = t_create(db_type, origin, class, model, mctx, &db);	if (dns_result != ISC_R_SUCCESS) {		isc_hash_destroy();		isc_entropy_detach(&ectx);		isc_mem_destroy(&mctx);		return(T_UNRESOLVED);	}	dns_result = dns_db_load(db, filename);	if (dns_result != exp_load_result) {		t_info("dns_db_load returned %s, expected %s\n",				dns_result_totext(dns_result),				dns_result_totext(exp_load_result));		dns_db_detach(&db);		isc_hash_destroy();		isc_entropy_detach(&ectx);		isc_mem_destroy(&mctx);		return(T_FAIL);	}	if (dns_result != ISC_R_SUCCESS) {		result = T_PASS;		goto cleanup_db;	}	dns_fixedname_init(&dns_findname);	len = strlen(findname);	isc_buffer_init(&findname_buffer, findname, len);	isc_buffer_add(&findname_buffer, len);	dns_result = dns_name_fromtext(dns_fixedname_name(&dns_findname),				&findname_buffer, NULL, ISC_FALSE, NULL);	if (dns_result != ISC_R_SUCCESS) {		t_info("dns_name_fromtext failed %s\n",			dns_result_totext(dns_result));		dns_db_detach(&db);		isc_hash_destroy();		isc_entropy_detach(&ectx);		isc_mem_destroy(&mctx);		return(T_UNRESOLVED);	}	textregion.base = find_type;	textregion.length = strlen(find_type);	dns_result = dns_rdatatype_fromtext(&rdatatype, &textregion);	if (dns_result != ISC_R_SUCCESS) {		t_info("dns_rdatatype_fromtext %s failed %s\n",				find_type,				dns_result_totext(dns_result));		dns_db_detach(&db);		isc_hash_destroy();		isc_entropy_detach(&ectx);		isc_mem_destroy(&mctx);		return(T_UNRESOLVED);	}	versionp = NULL;	dns_fixedname_init(&dns_foundname);	dns_rdataset_init(&rdataset);	if (dns_db_iszone(db))		dns_db_currentversion(db, &versionp);	nodep = NULL;	dns_result = dns_db_find(db,			dns_fixedname_name(&dns_findname),			versionp,			rdatatype,			DNS_DBFIND_GLUEOK,			0,			&nodep,			dns_fixedname_name(&dns_foundname),			&rdataset, NULL);	if (dns_result != exp_find_result) {		t_info("dns_db_find returned %s, expected %s\n",				dns_result_totext(dns_result),				dns_result_totext(exp_find_result));		result = T_FAIL;	} else {		result = T_PASS;	}	if (dns_result != ISC_R_NOTFOUND) {		dns_db_detachnode(db, &nodep);		if (dns_rdataset_isassociated(&rdataset))			dns_rdataset_disassociate(&rdataset);	}	if (dns_db_iszone(db))		dns_db_closeversion(db, &versionp, ISC_FALSE); cleanup_db:	dns_db_detach(&db);	isc_hash_destroy();	isc_entropy_detach(&ectx);	isc_mem_destroy(&mctx);	return(result);}static const char *a1 =	"A call to dns_db_load(db, filename) loads the contents of "	"the database in filename into db.";static voidt1(void) {	int	result;	t_assert("dns_db_load", 1, T_REQUIRED, a1);	result = t_eval("dns_db_load_data", t_dns_db_load, 9);	t_result(result);}static const char *a2 =	"When the database db has cache semantics, a call to "	"dns_db_iscache(db) returns ISC_TRUE.";static intt_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){	int			result;	int			len;	dns_db_t		*db;	isc_result_t		dns_result;	isc_result_t		isc_result;	isc_mem_t		*mctx;	isc_entropy_t		*ectx;	dns_rdataclass_t	rdataclass;	isc_textregion_t	textregion;	isc_buffer_t		origin_buffer;	dns_fixedname_t		dns_origin;	result = T_UNRESOLVED;	db = NULL;	mctx = NULL;	ectx = NULL;	t_info("testing using file %s\n", filename);	dns_fixedname_init(&dns_origin);	len = strlen(origin);	isc_buffer_init(&origin_buffer, origin, len);	isc_buffer_add(&origin_buffer, len);	dns_result = dns_name_fromtext(dns_fixedname_name(&dns_origin),				       &origin_buffer, NULL, ISC_FALSE, NULL);	if (dns_result != ISC_R_SUCCESS) {		t_info("dns_name_fromtext failed %s\n",		       dns_result_totext(dns_result));		return(T_UNRESOLVED);	}	textregion.base = class;	textregion.length = strlen(class);	dns_result = dns_rdataclass_fromtext(&rdataclass, &textregion);	if (dns_result != ISC_R_SUCCESS) {		t_info("dns_rdataclass_fromtext failed %s\n",		       dns_result_totext(dns_result));		return(T_UNRESOLVED);	}	isc_result = isc_mem_create(0, 0, &mctx);	if (isc_result != ISC_R_SUCCESS) {		t_info("isc_mem_create failed %s\n",		       isc_result_totext(isc_result));		return(T_UNRESOLVED);	}	isc_result = isc_entropy_create(mctx, &ectx);	if (isc_result != ISC_R_SUCCESS) {		t_info("isc_entropy_create failed %s\n",				isc_result_totext(isc_result));		isc_mem_destroy(&mctx);		return(T_UNRESOLVED);	}	isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);	if (isc_result != ISC_R_SUCCESS) {		t_info("isc_hash_create failed %s\n",				isc_result_totext(isc_result));		isc_entropy_detach(&ectx);		isc_mem_destroy(&mctx);		return(T_UNRESOLVED);	}	dns_result = dns_db_create(mctx, db_type,				   dns_fixedname_name(&dns_origin),				   dbtype, rdataclass, 0, NULL, &db);	if (dns_result != ISC_R_SUCCESS) {		t_info("dns_db_create failed %s\n",		       dns_result_totext(dns_result));		isc_hash_destroy();		isc_entropy_detach(&ectx);		isc_mem_destroy(&mctx);		return(T_UNRESOLVED);	}	dns_result = dns_db_load(db, filename);	if (dns_result == ISC_R_SUCCESS) {		if ((*cf)(db) == exp_result)			result = T_PASS;		else			result = T_FAIL;	} else {		t_info("dns_db_load failed %s\n",		       dns_result_totext(dns_result));		result = T_FAIL;	}	dns_db_detach(&db);	isc_hash_destroy();	isc_entropy_detach(&ectx);	isc_mem_destroy(&mctx);	return(result);}static inttest_dns_db_zc_x(const char *filename, dns_dbtype_t dbtype,		 isc_boolean_t(*cf)(dns_db_t *), isc_boolean_t exp_result){	FILE		*fp;	char		*p;	int		line;	int		cnt;	int		result;	int		nfails;	int		nprobs;	char		*tokens[T_MAXTOKS];	nfails = 0;	nprobs = 0;	fp = fopen(filename, "r");	if (fp != NULL) {		line = 0;		while ((p = t_fgetbs(fp)) != NULL) {			++line;			/*			 * Skip comment lines.			 */			if ((isspace((unsigned char)*p)) || (*p == '#'))				continue;			cnt = t_bustline(p, tokens);			if (cnt == 4) {				result = t_dns_db_zc_x(tokens[0], /* file */						       tokens[1], /* type */						       tokens[2], /* origin */						       tokens[3], /* class */						       dbtype,     /* cache */						       cf,     /* check func */						       exp_result);/* expect */				if (result != T_PASS) {					if (result == T_FAIL)						++nfails;					else						++nprobs;				}			} else {				t_info("bad format in %s at line %d\n",				       filename, line);				++nprobs;			}			(void)free(p);		}		(void)fclose(fp);	} else {		t_info("Missing datafile %s\n", filename);		++nprobs;	}	result = T_UNRESOLVED;	if (nfails == 0 && nprobs == 0)		result = T_PASS;	else if (nfails)		result = T_FAIL;	return(result);}static voidt2(void) {	int	result;	t_assert("dns_db_iscache", 2, T_REQUIRED, a2);	result = test_dns_db_zc_x("dns_db_iscache_1_data",				  dns_dbtype_cache, dns_db_iscache, ISC_TRUE);	t_result(result);}static const char *a3 =	"When the database db has zone semantics, a call to "	"dns_db_iscache(db) returns ISC_FALSE.";static voidt3(void) {	int	result;	t_assert("dns_db_iscache", 3, T_REQUIRED, a3);	result = test_dns_db_zc_x("dns_db_iscache_2_data",				  dns_dbtype_zone, dns_db_iscache, ISC_FALSE);	t_result(result);}static const char *a4 =	"When the database db has zone semantics, a call to "	"dns_db_iszone(db) returns ISC_TRUE.";static voidt4(void) {	int	result;	t_assert("dns_db_iszone", 4, T_REQUIRED, a4);	result = test_dns_db_zc_x("dns_db_iszone_1_data",				  dns_dbtype_zone, dns_db_iszone, ISC_TRUE);	t_result(result);}static const char *a5 =	"When the database db has cache semantics, a call to "	"dns_db_iszone(db) returns ISC_FALSE.";static voidt5(void) {	int	result;	t_assert("dns_db_iszone", 5, T_REQUIRED, a5);	result = test_dns_db_zc_x("dns_db_iszone_2_data",				  dns_dbtype_cache, dns_db_iszone, ISC_FALSE);	t_result(result);}static intt_dns_db_origin(char **av) {	char			*filename;	char			*origin;	int			result;	int			len;	int			order;	isc_result_t		dns_result;	isc_result_t		isc_result;	isc_mem_t		*mctx;	isc_entropy_t		*ectx;	dns_db_t		*db;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -