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

📄 sdlz.c

📁 非常好的dns解析软件
💻 C
📖 第 1 页 / 共 3 页
字号:
	UNUSED(nodep);	UNUSED(foundname);	UNUSED(rdataset);	UNUSED(sigrdataset);	return (ISC_R_NOTIMPLEMENTED);}static voidattachnode(dns_db_t *db, dns_dbnode_t *source, dns_dbnode_t **targetp) {	dns_sdlz_db_t *sdlz = (dns_sdlz_db_t *)db;	dns_sdlznode_t *node = (dns_sdlznode_t *)source;	REQUIRE(VALID_SDLZDB(sdlz));	UNUSED(sdlz);	LOCK(&node->lock);	INSIST(node->references > 0);	node->references++;	INSIST(node->references != 0);		/* Catch overflow. */	UNLOCK(&node->lock);	*targetp = source;}static voiddetachnode(dns_db_t *db, dns_dbnode_t **targetp) {	dns_sdlz_db_t *sdlz = (dns_sdlz_db_t *)db;	dns_sdlznode_t *node;	isc_boolean_t need_destroy = ISC_FALSE;	REQUIRE(VALID_SDLZDB(sdlz));	REQUIRE(targetp != NULL && *targetp != NULL);	UNUSED(sdlz);	node = (dns_sdlznode_t *)(*targetp);	LOCK(&node->lock);	INSIST(node->references > 0);	node->references--;	if (node->references == 0)		need_destroy = ISC_TRUE;	UNLOCK(&node->lock);	if (need_destroy)		destroynode(node);	*targetp = NULL;}static isc_result_texpirenode(dns_db_t *db, dns_dbnode_t *node, isc_stdtime_t now) {	UNUSED(db);	UNUSED(node);	UNUSED(now);	INSIST(0);	return (ISC_R_UNEXPECTED);}static voidprintnode(dns_db_t *db, dns_dbnode_t *node, FILE *out) {	UNUSED(db);	UNUSED(node);	UNUSED(out);	return;}static isc_result_tcreateiterator(dns_db_t *db, isc_boolean_t relative_names,	       dns_dbiterator_t **iteratorp){	dns_sdlz_db_t *sdlz = (dns_sdlz_db_t *)db;	sdlz_dbiterator_t *sdlziter;	isc_result_t result;	isc_buffer_t b;	char zonestr[DNS_NAME_MAXTEXT + 1];	REQUIRE(VALID_SDLZDB(sdlz));	if (sdlz->dlzimp->methods->allnodes == NULL)		return (ISC_R_NOTIMPLEMENTED);	isc_buffer_init(&b, zonestr, sizeof(zonestr));	result = dns_name_totext(&sdlz->common.origin, ISC_TRUE, &b);	if (result != ISC_R_SUCCESS)		return (result);	isc_buffer_putuint8(&b, 0);	sdlziter = isc_mem_get(sdlz->common.mctx, sizeof(sdlz_dbiterator_t));	if (sdlziter == NULL)		return (ISC_R_NOMEMORY);	sdlziter->common.methods = &dbiterator_methods;	sdlziter->common.db = NULL;	dns_db_attach(db, &sdlziter->common.db);	sdlziter->common.relative_names = relative_names;	sdlziter->common.magic = DNS_DBITERATOR_MAGIC;	ISC_LIST_INIT(sdlziter->nodelist);	sdlziter->current = NULL;	sdlziter->origin = NULL;	/* make sure strings are always lowercase */	dns_sdlz_tolower(zonestr);	MAYBE_LOCK(sdlz->dlzimp);	result = sdlz->dlzimp->methods->allnodes(zonestr,						 sdlz->dlzimp->driverarg,						 sdlz->dbdata, sdlziter);	MAYBE_UNLOCK(sdlz->dlzimp);	if (result != ISC_R_SUCCESS) {		dns_dbiterator_t *iter = &sdlziter->common;		dbiterator_destroy(&iter);		return (result);	}	if (sdlziter->origin != NULL) {		ISC_LIST_UNLINK(sdlziter->nodelist, sdlziter->origin, link);		ISC_LIST_PREPEND(sdlziter->nodelist, sdlziter->origin, link);	}	*iteratorp = (dns_dbiterator_t *)sdlziter;	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_sdlznode_t *sdlznode = (dns_sdlznode_t *)node;	REQUIRE(VALID_SDLZNODE(node));	UNUSED(db);	UNUSED(version);	UNUSED(covers);	UNUSED(now);	UNUSED(sigrdataset);	if (type == dns_rdatatype_sig || type == dns_rdatatype_rrsig)		return (ISC_R_NOTIMPLEMENTED);	list = ISC_LIST_HEAD(sdlznode->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_tfind(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version,     dns_rdatatype_t type, unsigned int options, isc_stdtime_t now,     dns_dbnode_t **nodep, dns_name_t *foundname,     dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset){	dns_sdlz_db_t *sdlz = (dns_sdlz_db_t *)db;	dns_dbnode_t *node = NULL;	dns_fixedname_t fname;	dns_rdataset_t xrdataset;	dns_name_t *xname;	unsigned int nlabels, olabels;	isc_result_t result;	unsigned int i;	REQUIRE(VALID_SDLZDB(sdlz));	REQUIRE(nodep == NULL || *nodep == NULL);	REQUIRE(version == NULL || version == (void *) &dummy);	UNUSED(options);	UNUSED(sdlz);	if (!dns_name_issubdomain(name, &db->origin))		return (DNS_R_NXDOMAIN);	olabels = dns_name_countlabels(&db->origin);	nlabels = dns_name_countlabels(name);	dns_fixedname_init(&fname);	xname = dns_fixedname_name(&fname);	if (rdataset == NULL) {		dns_rdataset_init(&xrdataset);		rdataset = &xrdataset;	}	result = DNS_R_NXDOMAIN;	for (i = olabels; i <= nlabels; i++) {		/*		 * Unless this is an explicit lookup at the origin, don't		 * look at the origin.		 */		if (i == olabels && i != nlabels)			continue;		/*		 * Look up the next label.		 */		dns_name_getlabelsequence(name, nlabels - i, i, xname);		result = findnode(db, xname, ISC_FALSE, &node);		if (result != ISC_R_SUCCESS) {			result = DNS_R_NXDOMAIN;			continue;		}		/*		 * Look for a DNAME at the current label, unless this is		 * the qname.		 */		if (i < nlabels) {			result = findrdataset(db, node, version,					      dns_rdatatype_dname,					      0, now, rdataset, sigrdataset);			if (result == ISC_R_SUCCESS) {				result = DNS_R_DNAME;				break;			}		}		/*		 * Look for an NS at the current label, unless this is the		 * origin or glue is ok.		 */		if (i != olabels && (options & DNS_DBFIND_GLUEOK) == 0) {			result = findrdataset(db, node, version,					      dns_rdatatype_ns,					      0, now, rdataset, sigrdataset);			if (result == ISC_R_SUCCESS) {				if (i == nlabels && type == dns_rdatatype_any)				{					result = DNS_R_ZONECUT;					dns_rdataset_disassociate(rdataset);					if (sigrdataset != NULL)						dns_rdataset_disassociate							(sigrdataset);				} else					result = DNS_R_DELEGATION;				break;			}		}		/*		 * If the current name is not the qname, add another label		 * and try again.		 */		if (i < nlabels) {			destroynode(node);			node = NULL;			continue;		}		/*		 * If we're looking for ANY, we're done.		 */		if (type == dns_rdatatype_any) {			result = ISC_R_SUCCESS;			break;		}		/*		 * Look for the qtype.		 */		result = findrdataset(db, node, version, type,				      0, now, rdataset, sigrdataset);		if (result == ISC_R_SUCCESS)			break;		/*		 * Look for a CNAME		 */		if (type != dns_rdatatype_cname) {			result = findrdataset(db, node, version,					      dns_rdatatype_cname,					      0, now, rdataset, sigrdataset);			if (result == ISC_R_SUCCESS) {				result = DNS_R_CNAME;				break;			}		}		result = DNS_R_NXRRSET;		break;	}	if (rdataset == &xrdataset && dns_rdataset_isassociated(rdataset))		dns_rdataset_disassociate(rdataset);	if (foundname != NULL) {		isc_result_t xresult;		xresult = dns_name_copy(xname, foundname, NULL);		if (xresult != ISC_R_SUCCESS) {			if (node != NULL)				destroynode(node);			if (dns_rdataset_isassociated(rdataset))				dns_rdataset_disassociate(rdataset);			return (DNS_R_BADDB);		}	}	if (nodep != NULL)		*nodep = node;	else if (node != NULL)		detachnode(db, &node);	return (result);}static isc_result_tallrdatasets(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,	     isc_stdtime_t now, dns_rdatasetiter_t **iteratorp){	sdlz_rdatasetiter_t *iterator;	REQUIRE(version == NULL || version == &dummy);	UNUSED(version);	UNUSED(now);	iterator = isc_mem_get(db->mctx, sizeof(sdlz_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 voidsettask(dns_db_t *db, isc_task_t *task) {	UNUSED(db);	UNUSED(task);}static dns_dbmethods_t sdlzdb_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,	settask,	NULL,};/* * Database Iterator Methods.  These methods were "borrowed" from the SDB * driver interface.  See the SDB driver interface documentation for more info. */static voiddbiterator_destroy(dns_dbiterator_t **iteratorp) {	sdlz_dbiterator_t *sdlziter = (sdlz_dbiterator_t *)(*iteratorp);	dns_sdlz_db_t *sdlz = (dns_sdlz_db_t *)sdlziter->common.db;	while (!ISC_LIST_EMPTY(sdlziter->nodelist)) {		dns_sdlznode_t *node;		node = ISC_LIST_HEAD(sdlziter->nodelist);		ISC_LIST_UNLINK(sdlziter->nodelist, node, link);		destroynode(node);	}	dns_db_detach(&sdlziter->common.db);	isc_mem_put(sdlz->common.mctx, sdlziter, sizeof(sdlz_dbiterator_t));	*iteratorp = NULL;}static isc_result_tdbiterator_first(dns_dbiterator_t *iterator) {	sdlz_dbiterator_t *sdlziter = (sdlz_dbiterator_t *)iterator;	sdlziter->current = ISC_LIST_HEAD(sdlziter->nodelist);	if (sdlziter->current == NULL)		return (ISC_R_NOMORE);	else		return (ISC_R_SUCCESS);}static isc_result_tdbiterator_last(dns_dbiterator_t *iterator) {	sdlz_dbiterator_t *sdlziter = (sdlz_dbiterator_t *)iterator;	sdlziter->current = ISC_LIST_TAIL(sdlziter->nodelist);	if (sdlziter->current == NULL)		return (ISC_R_NOMORE);	else		return (ISC_R_SUCCESS);}static isc_result_tdbiterator_seek(dns_dbiterator_t *iterator, dns_name_t *name) {	sdlz_dbiterator_t *sdlziter = (sdlz_dbiterator_t *)iterator;	sdlziter->current = ISC_LIST_HEAD(sdlziter->nodelist);	while (sdlziter->current != NULL)		if (dns_name_equal(sdlziter->current->name, name))			return (ISC_R_SUCCESS);	return (ISC_R_NOTFOUND);}static isc_result_tdbiterator_prev(dns_dbiterator_t *iterator) {	sdlz_dbiterator_t *sdlziter = (sdlz_dbiterator_t *)iterator;	sdlziter->current = ISC_LIST_PREV(sdlziter->current, link);	if (sdlziter->current == NULL)		return (ISC_R_NOMORE);	else		return (ISC_R_SUCCESS);}static isc_result_tdbiterator_next(dns_dbiterator_t *iterator) {	sdlz_dbiterator_t *sdlziter = (sdlz_dbiterator_t *)iterator;	sdlziter->current = ISC_LIST_NEXT(sdlziter->current, link);	if (sdlziter->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){	sdlz_dbiterator_t *sdlziter = (sdlz_dbiterator_t *)iterator;	attachnode(iterator->db, sdlziter->current, nodep);	if (name != NULL)		return (dns_name_copy(sdlziter->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 Methods. These methods were "borrowed" from the SDB driver * interface.  See the SDB driver interface documentation for more info. */static voiddisassociate(dns_rdataset_t *rdataset) {	dns_dbnode_t *node = rdataset->private5;	dns_sdlznode_t *sdlznode = (dns_sdlznode_t *) node;	dns_db_t *db = (dns_db_t *) sdlznode->sdlz;	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_sdlznode_t *sdlznode = (dns_sdlznode_t *) node;	dns_db_t *db = (dns_db_t *) sdlznode->sdlz;	dns_dbnode_t *tempdb = NULL;	isc__rdatalist_clone(source, target);	attachnode(db, node, &tempdb);	source->private5 = tempdb;}static dns_rdatasetmethods_t rdataset_methods = {	disassociate,	isc__rdatalist_first,	isc__rdatalist_next,	isc__rdatalist_current,	rdataset_clone,	isc__rdatalist_count,	isc__rdatalist_addnoqname,	isc__rdatalist_getnoqname,

⌨️ 快捷键说明

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