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

📄 db_test.c

📁 bind-3.2.
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * 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 INTERNET SOFTWARE CONSORTIUM * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL * INTERNET SOFTWARE CONSORTIUM 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: db_test.c,v 1.56 2001/01/09 21:40:57 bwelling Exp $ *//* * Principal Author: Bob Halley */#include <config.h>#include <stdlib.h>#include <isc/commandline.h>#include <isc/log.h>#include <isc/mem.h>#include <isc/time.h>#include <isc/string.h>#include <isc/util.h>#include <dns/db.h>#include <dns/dbiterator.h>#include <dns/dbtable.h>#include <dns/fixedname.h>#include <dns/log.h>#include <dns/rdataset.h>#include <dns/rdatasetiter.h>#include <dns/result.h>#define MAXHOLD			100#define MAXVERSIONS		100typedef struct dbinfo {	dns_db_t *		db;	dns_dbversion_t *	version;	dns_dbversion_t *	wversion;	dns_dbversion_t *	rversions[MAXVERSIONS];	int			rcount;	dns_dbnode_t *		hold_nodes[MAXHOLD];	int			hold_count;	dns_dbiterator_t *	dbiterator;	dns_dbversion_t *	iversion;	int			pause_every;	isc_boolean_t		ascending;	ISC_LINK(struct dbinfo)	link;} dbinfo;static isc_mem_t *		mctx = NULL;static char			dbtype[128];static dns_dbtable_t *		dbtable;static ISC_LIST(dbinfo)		dbs;static dbinfo *			cache_dbi = NULL;static int			pause_every = 0;static isc_boolean_t		ascending = ISC_TRUE;static voidprint_result(const char *message, isc_result_t result) {	size_t len;	if (message == NULL) {		len = 0;		message = "";	}	len = strlen(message);	printf("%s%sresult %08x: %s\n", message, (len == 0) ? "" : " ", result,	       isc_result_totext(result));}static voidprint_rdataset(dns_name_t *name, dns_rdataset_t *rdataset) {	isc_buffer_t text;	char t[1000];	isc_result_t result;	isc_region_t r;	isc_buffer_init(&text, t, sizeof(t));	result = dns_rdataset_totext(rdataset, name, ISC_FALSE, ISC_FALSE,				     &text);	isc_buffer_usedregion(&text, &r);	if (result == ISC_R_SUCCESS)		printf("%.*s", (int)r.length, (char *)r.base);	else		print_result("", result);}static voidprint_rdatasets(dns_name_t *name, dns_rdatasetiter_t *rdsiter) {	isc_result_t result;	dns_rdataset_t rdataset;	dns_rdataset_init(&rdataset);	result = dns_rdatasetiter_first(rdsiter);	while (result == ISC_R_SUCCESS) {		dns_rdatasetiter_current(rdsiter, &rdataset);		print_rdataset(name, &rdataset);		dns_rdataset_disassociate(&rdataset);		result = dns_rdatasetiter_next(rdsiter);	}	if (result != ISC_R_NOMORE)		print_result("", result);}static dbinfo *select_db(char *origintext) {	dns_fixedname_t forigin;	dns_name_t *origin;	isc_buffer_t source;	size_t len;	dbinfo *dbi;	isc_result_t result;	if (strcasecmp(origintext, "cache") == 0) {		if (cache_dbi == NULL)			printf("the cache does not exist\n");		return (cache_dbi);	}	len = strlen(origintext);	isc_buffer_init(&source, origintext, len);	isc_buffer_add(&source, len);	dns_fixedname_init(&forigin);	origin = dns_fixedname_name(&forigin);	result = dns_name_fromtext(origin, &source, dns_rootname, ISC_FALSE,				   NULL);	if (result != ISC_R_SUCCESS) {		print_result("bad name", result);		return (NULL);	}	for (dbi = ISC_LIST_HEAD(dbs);	     dbi != NULL;	     dbi = ISC_LIST_NEXT(dbi, link)) {		if (dns_name_compare(dns_db_origin(dbi->db), origin) == 0)			break;	}	return (dbi);}static voidlist(dbinfo *dbi, char *seektext) {	dns_fixedname_t fname;	dns_name_t *name;	dns_dbnode_t *node;	dns_rdatasetiter_t *rdsiter;	isc_result_t result;	int i;	size_t len;	dns_fixedname_t fseekname;	dns_name_t *seekname;	isc_buffer_t source;	dns_fixedname_init(&fname);	name = dns_fixedname_name(&fname);	if (dbi->dbiterator == NULL) {		INSIST(dbi->iversion == NULL);		if (dns_db_iszone(dbi->db)) {			if (dbi->version != NULL)				dns_db_attachversion(dbi->db, dbi->version,						     &dbi->iversion);			else				dns_db_currentversion(dbi->db, &dbi->iversion);		}		result = dns_db_createiterator(dbi->db, ISC_FALSE,					       &dbi->dbiterator);		if (result == ISC_R_SUCCESS) {			if (seektext != NULL) {				len = strlen(seektext);				isc_buffer_init(&source, seektext, len);				isc_buffer_add(&source, len);				dns_fixedname_init(&fseekname);				seekname = dns_fixedname_name(&fseekname);				result = dns_name_fromtext(seekname, &source,							   dns_db_origin(								 dbi->db),							   ISC_FALSE,							   NULL);				if (result == ISC_R_SUCCESS)					result = dns_dbiterator_seek(							     dbi->dbiterator,							     seekname);			} else if (dbi->ascending)				result = dns_dbiterator_first(dbi->dbiterator);			else				result = dns_dbiterator_last(dbi->dbiterator);		}	} else		result = ISC_R_SUCCESS;	node = NULL;	rdsiter = NULL;	i = 0;	while (result == ISC_R_SUCCESS) {		result = dns_dbiterator_current(dbi->dbiterator, &node, name);		if (result != ISC_R_SUCCESS && result != DNS_R_NEWORIGIN)			break;		result = dns_db_allrdatasets(dbi->db, node, dbi->iversion, 0,					     &rdsiter);		if (result != ISC_R_SUCCESS) {			dns_db_detachnode(dbi->db, &node);			break;		}		print_rdatasets(name, rdsiter);		dns_rdatasetiter_destroy(&rdsiter);		dns_db_detachnode(dbi->db, &node);		if (dbi->ascending)			result = dns_dbiterator_next(dbi->dbiterator);		else			result = dns_dbiterator_prev(dbi->dbiterator);		i++;		if (result == ISC_R_SUCCESS && i == dbi->pause_every) {			printf("[more...]\n");			result = dns_dbiterator_pause(dbi->dbiterator);			if (result == ISC_R_SUCCESS)				return;		}	}	if (result != ISC_R_NOMORE)		print_result("", result);	dns_dbiterator_destroy(&dbi->dbiterator);	if (dbi->iversion != NULL)		dns_db_closeversion(dbi->db, &dbi->iversion, ISC_FALSE);}static isc_result_tload(const char *filename, const char *origintext, isc_boolean_t cache) {	dns_fixedname_t forigin;	dns_name_t *origin;	isc_result_t result;	isc_buffer_t source;	size_t len;	dbinfo *dbi;	unsigned int i;	dbi = isc_mem_get(mctx, sizeof *dbi);	if (dbi == NULL)		return (ISC_R_NOMEMORY);	dbi->db = NULL;	dbi->version = NULL;	dbi->wversion = NULL;	for (i = 0; i < MAXVERSIONS; i++)		dbi->rversions[i] = NULL;	dbi->hold_count = 0;	for (i = 0; i < MAXHOLD; i++)		dbi->hold_nodes[i] = NULL;	dbi->dbiterator = NULL;	dbi->iversion = NULL;	dbi->pause_every = pause_every;	dbi->ascending = ascending;	ISC_LINK_INIT(dbi, link);	len = strlen(origintext);	isc_buffer_init(&source, origintext, len);	isc_buffer_add(&source, len);	dns_fixedname_init(&forigin);	origin = dns_fixedname_name(&forigin);	result = dns_name_fromtext(origin, &source, dns_rootname, ISC_FALSE,				   NULL);	if (result != ISC_R_SUCCESS)		return (result);	result = dns_db_create(mctx, dbtype, origin,			       cache ? dns_dbtype_cache : dns_dbtype_zone,			       dns_rdataclass_in,			       0, NULL, &dbi->db);	if (result != ISC_R_SUCCESS) {		isc_mem_put(mctx, dbi, sizeof *dbi);		return (result);	}	printf("loading %s (%s)\n", filename, origintext);	result = dns_db_load(dbi->db, filename);	if (result != ISC_R_SUCCESS && result != DNS_R_SEENINCLUDE) {		dns_db_detach(&dbi->db);		isc_mem_put(mctx, dbi, sizeof *dbi);		return (result);	}	printf("loaded\n");	if (cache) {		INSIST(cache_dbi == NULL);		dns_dbtable_adddefault(dbtable, dbi->db);		cache_dbi = dbi;	} else {		if (dns_dbtable_add(dbtable, dbi->db) != ISC_R_SUCCESS) {			dns_db_detach(&dbi->db);			isc_mem_put(mctx, dbi, sizeof *dbi);			return (result);		}	}	ISC_LIST_APPEND(dbs, dbi, link);	return (ISC_R_SUCCESS);}static voidunload_all(void) {	dbinfo *dbi, *dbi_next;	for (dbi = ISC_LIST_HEAD(dbs); dbi != NULL; dbi = dbi_next) {		dbi_next = ISC_LIST_NEXT(dbi, link);		if (dns_db_iszone(dbi->db))			dns_dbtable_remove(dbtable, dbi->db);		else {			INSIST(dbi == cache_dbi);			dns_dbtable_removedefault(dbtable);			cache_dbi = NULL;		}		dns_db_detach(&dbi->db);		ISC_LIST_UNLINK(dbs, dbi, link);		isc_mem_put(mctx, dbi, sizeof *dbi);	}}#define DBI_CHECK(dbi) \if ((dbi) == NULL) { \	printf("You must first select a database with !DB\n"); \	continue; \}intmain(int argc, char *argv[]) {	dns_db_t *db;	dns_dbnode_t *node;	isc_result_t result;	dns_name_t name;	dns_offsets_t offsets;	size_t len;	isc_buffer_t source, target;	char s[1000];	char b[255];	dns_rdataset_t rdataset, sigrdataset;	int ch;	dns_rdatatype_t type = 1;	isc_boolean_t printnode = ISC_FALSE;	isc_boolean_t addmode = ISC_FALSE;	isc_boolean_t delmode = ISC_FALSE;	isc_boolean_t holdmode = ISC_FALSE;	isc_boolean_t verbose = ISC_FALSE;	isc_boolean_t done = ISC_FALSE;	isc_boolean_t quiet = ISC_FALSE;	isc_boolean_t time_lookups = ISC_FALSE;	isc_boolean_t found_as;	isc_boolean_t find_zonecut = ISC_FALSE;	isc_boolean_t noexact_zonecut = ISC_FALSE;	int i, v;	dns_rdatasetiter_t *rdsiter;	char t1[256];	char t2[256];	isc_buffer_t tb1, tb2;	isc_region_t r1, r2;	dns_fixedname_t foundname;	dns_name_t *fname;	unsigned int options = 0, zcoptions;	isc_time_t start, finish;	char *origintext;	dbinfo *dbi;	dns_dbversion_t *version;	dns_name_t *origin;	size_t memory_quota = 0;	dns_trust_t trust = 0;	unsigned int addopts;	isc_log_t *lctx = NULL;	dns_result_register();	RUNTIME_CHECK(isc_mem_create(0, 0, &mctx) == ISC_R_SUCCESS);	RUNTIME_CHECK(dns_dbtable_create(mctx, dns_rdataclass_in, &dbtable) ==		      ISC_R_SUCCESS);		strcpy(dbtype, "rbt");	while ((ch = isc_commandline_parse(argc, argv, "c:d:t:z:P:Q:glpqvT"))	       != -1) {		switch (ch) {		case 'c':			result = load(isc_commandline_argument, ".", ISC_TRUE);			if (result != ISC_R_SUCCESS)				printf("cache load(%s) %08x: %s\n",				       isc_commandline_argument, result,				       isc_result_totext(result));			break;		case 'd':			strcpy(dbtype, isc_commandline_argument);			break;		case 'g':			options |= (DNS_DBFIND_GLUEOK|DNS_DBFIND_VALIDATEGLUE);			break;        	case 'l':			RUNTIME_CHECK(isc_log_create(mctx, &lctx,						     NULL) == ISC_R_SUCCESS);			isc_log_setcontext(lctx);			dns_log_init(lctx);			dns_log_setcontext(lctx);			break;		case 'q':			quiet = ISC_TRUE;			verbose = ISC_FALSE;			break;		case 'p':			printnode = ISC_TRUE;			break;		case 'P':			pause_every = atoi(isc_commandline_argument);			break;		case 'Q':			memory_quota = atoi(isc_commandline_argument);			isc_mem_setquota(mctx, memory_quota);			break;		case 't':			type = atoi(isc_commandline_argument);			break;		case 'T':			time_lookups = ISC_TRUE;			break;		case 'v':			verbose = ISC_TRUE;			break;		case 'z':			origintext = strrchr(isc_commandline_argument, '/');			if (origintext == NULL)				origintext = isc_commandline_argument;			else				origintext++;	/* Skip '/'. */			result = load(isc_commandline_argument, origintext,				      ISC_FALSE);			if (result != ISC_R_SUCCESS)				printf("zone load(%s) %08x: %s\n",				       isc_commandline_argument, result,				       isc_result_totext(result));			break;		}	}	argc -= isc_commandline_index;	argv += isc_commandline_index;	if (argc != 0)		printf("ignoring trailing arguments\n");	/*	 * Some final initialization...	 */	dns_fixedname_init(&foundname);	fname = dns_fixedname_name(&foundname);	dbi = NULL;	origin = dns_rootname;	version = NULL;	if (time_lookups) {		(void)isc_time_now(&start);	}	while (!done) {		if (!quiet)			printf("\n");

⌨️ 快捷键说明

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