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

📄 sdb.c

📁 bind-3.2.
💻 C
📖 第 1 页 / 共 3 页
字号:
	REQUIRE(VALID_SDB(sdb));	if (imp->methods->allnodes == NULL)		return (ISC_R_NOTIMPLEMENTED);	sdbiter = isc_mem_get(sdb->common.mctx, sizeof(sdb_dbiterator_t));	if (sdbiter == NULL)		return (ISC_R_NOMEMORY);	sdbiter->common.methods = &dbiterator_methods;	sdbiter->common.db = NULL;	dns_db_attach(db, &sdbiter->common.db);	sdbiter->common.relative_names = relative_names;	sdbiter->common.magic = DNS_DBITERATOR_MAGIC;	ISC_LIST_INIT(sdbiter->nodelist);	sdbiter->current = NULL;	sdbiter->origin = NULL;	MAYBE_LOCK(sdb);	result = imp->methods->allnodes(sdb->zone, sdb->dbdata, sdbiter);	MAYBE_UNLOCK(sdb);	if (result != ISC_R_SUCCESS) {		dbiterator_destroy((dns_dbiterator_t **)&sdbiter);		return (result);	}	if (sdbiter->origin != NULL) {		ISC_LIST_UNLINK(sdbiter->nodelist, sdbiter->origin, link);		ISC_LIST_PREPEND(sdbiter->nodelist, sdbiter->origin, link);	}	*iteratorp = (dns_dbiterator_t *)sdbiter;	return (ISC_R_SUCCESS);}static isc_result_tfindrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,	     dns_rdatatype_t type, dns_rdatatype_t covers,	     isc_stdtime_t now, dns_rdataset_t *rdataset,	     dns_rdataset_t *sigrdataset){	dns_rdatalist_t *list;	dns_sdbnode_t *sdbnode = (dns_sdbnode_t *)node;	REQUIRE(VALID_SDBNODE(node));	UNUSED(db);	UNUSED(version);	UNUSED(covers);	UNUSED(now);	UNUSED(sigrdataset);	if (type == dns_rdatatype_sig)		return (ISC_R_NOTIMPLEMENTED);	list = ISC_LIST_HEAD(sdbnode->lists);	while (list != NULL) {		if (list->type == type)			break;		list = ISC_LIST_NEXT(list, link);	}	if (list == NULL)		return (ISC_R_NOTFOUND);	list_tordataset(list, db, node, rdataset);	return (ISC_R_SUCCESS);}static isc_result_tallrdatasets(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,	     isc_stdtime_t now, dns_rdatasetiter_t **iteratorp){	sdb_rdatasetiter_t *iterator;	REQUIRE(version == NULL || version == &dummy);		UNUSED(version);	UNUSED(now);	iterator = isc_mem_get(db->mctx, sizeof(sdb_rdatasetiter_t));	if (iterator == NULL)		return (ISC_R_NOMEMORY);	iterator->common.magic = DNS_RDATASETITER_MAGIC;	iterator->common.methods = &rdatasetiter_methods;	iterator->common.db = db;	iterator->common.node = NULL;	attachnode(db, node, &iterator->common.node);	iterator->common.version = version;	iterator->common.now = now;	*iteratorp = (dns_rdatasetiter_t *)iterator;	return (ISC_R_SUCCESS);}static isc_result_taddrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,	    isc_stdtime_t now, dns_rdataset_t *rdataset, unsigned int options,	    dns_rdataset_t *addedrdataset){	UNUSED(db);	UNUSED(node);	UNUSED(version);	UNUSED(now);	UNUSED(rdataset);	UNUSED(options);	UNUSED(addedrdataset);	return (ISC_R_NOTIMPLEMENTED);}static isc_result_tsubtractrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,		 dns_rdataset_t *rdataset, unsigned int options,		 dns_rdataset_t *newrdataset){	UNUSED(db);	UNUSED(node);	UNUSED(version);	UNUSED(rdataset);	UNUSED(options);	UNUSED(newrdataset);	return (ISC_R_NOTIMPLEMENTED);}static isc_result_tdeleterdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,	       dns_rdatatype_t type, dns_rdatatype_t covers){	UNUSED(db);	UNUSED(node);	UNUSED(version);	UNUSED(type);	UNUSED(covers);	return (ISC_R_NOTIMPLEMENTED);}static isc_boolean_tissecure(dns_db_t *db) {	UNUSED(db);	return (ISC_FALSE);}static unsigned intnodecount(dns_db_t *db) {	UNUSED(db);	return (0);}static isc_boolean_tispersistent(dns_db_t *db) {	UNUSED(db);	return (ISC_TRUE);}static voidovermem(dns_db_t *db, isc_boolean_t overmem) {	UNUSED(db);	UNUSED(overmem);}static dns_dbmethods_t sdb_methods = {	attach,	detach,	beginload,	endload,	dump,	currentversion,	newversion,	attachversion,	closeversion,	findnode,	find,	findzonecut,	attachnode,	detachnode,	expirenode,	printnode,	createiterator,	findrdataset,	allrdatasets,	addrdataset,	subtractrdataset,	deleterdataset,	issecure,	nodecount,	ispersistent,	overmem};static isc_result_tdns_sdb_create(isc_mem_t *mctx, dns_name_t *origin, dns_dbtype_t type,	       dns_rdataclass_t rdclass, unsigned int argc, char *argv[],	       void *driverarg, dns_db_t **dbp){	dns_sdb_t *sdb;	isc_result_t result;	char zonestr[DNS_NAME_MAXTEXT + 1];	isc_buffer_t b;	dns_sdbimplementation_t *imp;	REQUIRE(driverarg != NULL);	imp = driverarg;	if (type != dns_dbtype_zone)		return (ISC_R_NOTIMPLEMENTED);	sdb = isc_mem_get(mctx, sizeof(dns_sdb_t));	if (sdb == NULL)		return (ISC_R_NOMEMORY);	memset(sdb, 0, sizeof(dns_sdb_t));	dns_name_init(&sdb->common.origin, NULL);	sdb->common.attributes = 0;	sdb->common.methods = &sdb_methods;	sdb->common.rdclass = rdclass;	sdb->common.mctx = NULL;	sdb->implementation = imp;	isc_mem_attach(mctx, &sdb->common.mctx);	result = isc_mutex_init(&sdb->lock);	if (result != ISC_R_SUCCESS) {		UNEXPECTED_ERROR(__FILE__, __LINE__,				 "isc_mutex_init() failed: %s",				 isc_result_totext(result));		result = ISC_R_UNEXPECTED;		goto cleanup_mctx;	}	result = dns_name_dupwithoffsets(origin, mctx, &sdb->common.origin);	if (result != ISC_R_SUCCESS)		goto cleanup_lock;	isc_buffer_init(&b, zonestr, sizeof(zonestr));	result = dns_name_totext(origin, ISC_TRUE, &b);	if (result != ISC_R_SUCCESS)		goto cleanup_origin;	isc_buffer_putuint8(&b, 0);	sdb->zone = isc_mem_strdup(mctx, zonestr);	if (sdb->zone == NULL) {		result = ISC_R_NOMEMORY;		goto cleanup_origin;	}	sdb->dbdata = NULL;	if (imp->methods->create != NULL) {		MAYBE_LOCK(sdb);		result = imp->methods->create(sdb->zone, argc, argv,					      imp->driverdata, &sdb->dbdata);		MAYBE_UNLOCK(sdb);		if (result != ISC_R_SUCCESS)			goto cleanup_zonestr;	}	sdb->references = 1;	sdb->common.magic = DNS_DB_MAGIC;	sdb->common.impmagic = SDB_MAGIC;	*dbp = (dns_db_t *)sdb;	return (ISC_R_SUCCESS); cleanup_zonestr:	isc_mem_free(mctx, sdb->zone); cleanup_origin:	dns_name_free(&sdb->common.origin, mctx); cleanup_lock:	isc_mutex_destroy(&sdb->lock); cleanup_mctx:	isc_mem_put(mctx, sdb, sizeof(dns_sdb_t));	isc_mem_detach(&mctx);	return (result);}/* * Rdataset Methods */static voiddisassociate(dns_rdataset_t *rdataset) {	dns_dbnode_t *node = rdataset->private5;	dns_sdbnode_t *sdbnode = (dns_sdbnode_t *) node;	dns_db_t *db = (dns_db_t *) sdbnode->sdb;	detachnode(db, &node);	isc__rdatalist_disassociate(rdataset);}static voidrdataset_clone(dns_rdataset_t *source, dns_rdataset_t *target) {	dns_dbnode_t *node = source->private5;	dns_sdbnode_t *sdbnode = (dns_sdbnode_t *) node;	dns_db_t *db = (dns_db_t *) sdbnode->sdb;	dns_dbnode_t *tempdb = NULL;	isc__rdatalist_clone(source, target);	attachnode(db, node, &tempdb);	source->private5 = tempdb;}static dns_rdatasetmethods_t methods = {	disassociate,	isc__rdatalist_first,	isc__rdatalist_next,	isc__rdatalist_current,	rdataset_clone,	isc__rdatalist_count};static voidlist_tordataset(dns_rdatalist_t *rdatalist,		dns_db_t *db, dns_dbnode_t *node,		dns_rdataset_t *rdataset){	/*	 * The sdb rdataset is an rdatalist with some additions.	 *	- private1 & private2 are used by the rdatalist.	 *	- private3 & private 4 are unused.	 *	- private5 is the node.	 */	/* This should never fail. */	RUNTIME_CHECK(dns_rdatalist_tordataset(rdatalist, rdataset) ==		      ISC_R_SUCCESS);	rdataset->methods = &methods;	dns_db_attachnode(db, node, &rdataset->private5);}/* * Database Iterator Methods */static voiddbiterator_destroy(dns_dbiterator_t **iteratorp) {	sdb_dbiterator_t *sdbiter = (sdb_dbiterator_t *)(*iteratorp);	dns_sdb_t *sdb = (dns_sdb_t *)sdbiter->common.db;	while (!ISC_LIST_EMPTY(sdbiter->nodelist)) {		dns_sdbnode_t *node;		node = ISC_LIST_HEAD(sdbiter->nodelist);		ISC_LIST_UNLINK(sdbiter->nodelist, node, link);		destroynode(node);	}	dns_db_detach(&sdbiter->common.db);	isc_mem_put(sdb->common.mctx, sdbiter, sizeof(sdb_dbiterator_t));	*iteratorp = NULL;}static isc_result_tdbiterator_first(dns_dbiterator_t *iterator) {	sdb_dbiterator_t *sdbiter = (sdb_dbiterator_t *)iterator;	sdbiter->current = ISC_LIST_HEAD(sdbiter->nodelist);	if (sdbiter->current == NULL)		return (ISC_R_NOMORE);	else		return (ISC_R_SUCCESS);}static isc_result_tdbiterator_last(dns_dbiterator_t *iterator) {	sdb_dbiterator_t *sdbiter = (sdb_dbiterator_t *)iterator;	sdbiter->current = ISC_LIST_TAIL(sdbiter->nodelist);	if (sdbiter->current == NULL)		return (ISC_R_NOMORE);	else		return (ISC_R_SUCCESS);}static isc_result_tdbiterator_seek(dns_dbiterator_t *iterator, dns_name_t *name) {	sdb_dbiterator_t *sdbiter = (sdb_dbiterator_t *)iterator;	sdbiter->current = ISC_LIST_HEAD(sdbiter->nodelist);	while (sdbiter->current != NULL)		if (dns_name_equal(sdbiter->current->name, name))			return (ISC_R_SUCCESS);	return (ISC_R_NOTFOUND);}static isc_result_tdbiterator_prev(dns_dbiterator_t *iterator) {	sdb_dbiterator_t *sdbiter = (sdb_dbiterator_t *)iterator;	sdbiter->current = ISC_LIST_PREV(sdbiter->current, link);	if (sdbiter->current == NULL)		return (ISC_R_NOMORE);	else		return (ISC_R_SUCCESS);}static isc_result_tdbiterator_next(dns_dbiterator_t *iterator) {	sdb_dbiterator_t *sdbiter = (sdb_dbiterator_t *)iterator;	sdbiter->current = ISC_LIST_NEXT(sdbiter->current, link);	if (sdbiter->current == NULL)		return (ISC_R_NOMORE);	else		return (ISC_R_SUCCESS);}static isc_result_tdbiterator_current(dns_dbiterator_t *iterator, dns_dbnode_t **nodep,		   dns_name_t *name){	sdb_dbiterator_t *sdbiter = (sdb_dbiterator_t *)iterator;	attachnode(iterator->db, sdbiter->current, nodep);	if (name != NULL)		return (dns_name_copy(sdbiter->current->name, name, NULL));	return (ISC_R_SUCCESS);}static isc_result_tdbiterator_pause(dns_dbiterator_t *iterator) {	UNUSED(iterator);	return (ISC_R_SUCCESS);}static isc_result_tdbiterator_origin(dns_dbiterator_t *iterator, dns_name_t *name) {	UNUSED(iterator);	return (dns_name_copy(dns_rootname, name, NULL));}/* * Rdataset Iterator Methods */static voidrdatasetiter_destroy(dns_rdatasetiter_t **iteratorp) {	sdb_rdatasetiter_t *sdbiterator = (sdb_rdatasetiter_t *)(*iteratorp);	detachnode(sdbiterator->common.db, &sdbiterator->common.node);	isc_mem_put(sdbiterator->common.db->mctx, sdbiterator,		    sizeof(sdb_rdatasetiter_t));	*iteratorp = NULL;}static isc_result_trdatasetiter_first(dns_rdatasetiter_t *iterator) {	sdb_rdatasetiter_t *sdbiterator = (sdb_rdatasetiter_t *)iterator;	dns_sdbnode_t *sdbnode = (dns_sdbnode_t *)iterator->node;	if (ISC_LIST_EMPTY(sdbnode->lists))		return (ISC_R_NOMORE);	sdbiterator->current = ISC_LIST_HEAD(sdbnode->lists);	return (ISC_R_SUCCESS);}static isc_result_trdatasetiter_next(dns_rdatasetiter_t *iterator) {	sdb_rdatasetiter_t *sdbiterator = (sdb_rdatasetiter_t *)iterator;	sdbiterator->current = ISC_LIST_NEXT(sdbiterator->current, link);	if (sdbiterator->current == NULL)		return (ISC_R_NOMORE);	else		return (ISC_R_SUCCESS);}static voidrdatasetiter_current(dns_rdatasetiter_t *iterator, dns_rdataset_t *rdataset) {	sdb_rdatasetiter_t *sdbiterator = (sdb_rdatasetiter_t *)iterator;	list_tordataset(sdbiterator->current, iterator->db, iterator->node,			rdataset);}

⌨️ 快捷键说明

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