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

📄 sdb.c

📁 bind-3.2.
💻 C
📖 第 1 页 / 共 3 页
字号:
destroy(dns_sdb_t *sdb) {	isc_mem_t *mctx;	dns_sdbimplementation_t *imp = sdb->implementation;	mctx = sdb->common.mctx;	if (imp->methods->destroy != NULL) {		MAYBE_LOCK(sdb);		imp->methods->destroy(sdb->zone, imp->driverdata,				      &sdb->dbdata);		MAYBE_UNLOCK(sdb);	}	isc_mem_free(mctx, sdb->zone);	DESTROYLOCK(&sdb->lock);	sdb->common.magic = 0;	sdb->common.impmagic = 0;	dns_name_free(&sdb->common.origin, mctx);	isc_mem_put(mctx, sdb, sizeof(dns_sdb_t));	isc_mem_detach(&mctx);}static voiddetach(dns_db_t **dbp) {	dns_sdb_t *sdb = (dns_sdb_t *)(*dbp);	isc_boolean_t need_destroy = ISC_FALSE;	REQUIRE(VALID_SDB(sdb));	LOCK(&sdb->lock);	REQUIRE(sdb->references > 0);	sdb->references--;	if (sdb->references == 0)		need_destroy = ISC_TRUE;	UNLOCK(&sdb->lock);	if (need_destroy)		destroy(sdb);	*dbp = NULL;}static isc_result_tbeginload(dns_db_t *db, dns_addrdatasetfunc_t *addp, dns_dbload_t **dbloadp) {	UNUSED(db);	UNUSED(addp);	UNUSED(dbloadp);	return (ISC_R_NOTIMPLEMENTED);}static isc_result_tendload(dns_db_t *db, dns_dbload_t **dbloadp) {	UNUSED(db);	UNUSED(dbloadp);	return (ISC_R_NOTIMPLEMENTED);}static isc_result_tdump(dns_db_t *db, dns_dbversion_t *version, const char *filename) {	UNUSED(db);	UNUSED(version);	UNUSED(filename);	return (ISC_R_NOTIMPLEMENTED);}static voidcurrentversion(dns_db_t *db, dns_dbversion_t **versionp) {	REQUIRE(versionp != NULL && *versionp == NULL);	UNUSED(db);	*versionp = (void *) &dummy;	return;}static isc_result_tnewversion(dns_db_t *db, dns_dbversion_t **versionp) {	UNUSED(db);	UNUSED(versionp);	return (ISC_R_NOTIMPLEMENTED);}static voidattachversion(dns_db_t *db, dns_dbversion_t *source, 	      dns_dbversion_t **targetp){	REQUIRE(source != NULL && source == (void *) &dummy);	UNUSED(db);	UNUSED(source);	UNUSED(targetp);	return;}static voidcloseversion(dns_db_t *db, dns_dbversion_t **versionp, isc_boolean_t commit) {	REQUIRE(versionp != NULL && *versionp == (void *) &dummy);	REQUIRE(commit == ISC_FALSE);	UNUSED(db);	UNUSED(commit);	*versionp = NULL;}static isc_result_tcreatenode(dns_sdb_t *sdb, dns_sdbnode_t **nodep) {	dns_sdbnode_t *node;	isc_result_t result;	node = isc_mem_get(sdb->common.mctx, sizeof(dns_sdbnode_t));	if (node == NULL)		return (ISC_R_NOMEMORY);	node->sdb = NULL;	attach((dns_db_t *)sdb, (dns_db_t **)&node->sdb);	ISC_LIST_INIT(node->lists);	ISC_LIST_INIT(node->buffers);	ISC_LINK_INIT(node, link);	node->name = NULL;	result = isc_mutex_init(&node->lock);	if (result != ISC_R_SUCCESS) {		UNEXPECTED_ERROR(__FILE__, __LINE__,				 "isc_mutex_init() failed: %s",				 isc_result_totext(result));		isc_mem_put(sdb->common.mctx, node, sizeof(dns_sdbnode_t));		return (ISC_R_UNEXPECTED);	}	dns_rdatacallbacks_init(&node->callbacks);	node->references = 1;	node->magic = SDBLOOKUP_MAGIC;	*nodep = node;	return (ISC_R_SUCCESS);}static voiddestroynode(dns_sdbnode_t *node) {	dns_rdatalist_t *list;	dns_rdata_t *rdata;	isc_buffer_t *b;	dns_sdb_t *sdb;	isc_mem_t *mctx;	sdb = node->sdb;	mctx = sdb->common.mctx;	while (!ISC_LIST_EMPTY(node->lists)) {		list = ISC_LIST_HEAD(node->lists);		while (!ISC_LIST_EMPTY(list->rdata)) {			rdata = ISC_LIST_HEAD(list->rdata);			ISC_LIST_UNLINK(list->rdata, rdata, link);			isc_mem_put(mctx, rdata, sizeof(dns_rdata_t));		}		ISC_LIST_UNLINK(node->lists, list, link);		isc_mem_put(mctx, list, sizeof(dns_rdatalist_t));	}	while (!ISC_LIST_EMPTY(node->buffers)) {		b = ISC_LIST_HEAD(node->buffers);		ISC_LIST_UNLINK(node->buffers, b, link);		isc_buffer_free(&b);	}	if (node->name != NULL) {		dns_name_free(node->name, mctx);		isc_mem_put(mctx, node->name, sizeof(dns_name_t));	}	DESTROYLOCK(&node->lock);	node->magic = 0;	isc_mem_put(mctx, node, sizeof(dns_sdbnode_t));	detach((dns_db_t **)&sdb);}static isc_result_tfindnode(dns_db_t *db, dns_name_t *name, isc_boolean_t create,	 dns_dbnode_t **nodep){	dns_sdb_t *sdb = (dns_sdb_t *)db;	dns_sdbnode_t *node = NULL;	isc_result_t result;	isc_buffer_t b;	char namestr[DNS_NAME_MAXTEXT + 1];	isc_boolean_t isorigin;	dns_sdbimplementation_t *imp;	REQUIRE(VALID_SDB(sdb));	REQUIRE(create == ISC_FALSE);	REQUIRE(nodep != NULL && *nodep == NULL);	UNUSED(name);	UNUSED(create);	imp = sdb->implementation;	isc_buffer_init(&b, namestr, sizeof(namestr));	if ((imp->flags & DNS_SDBFLAG_RELATIVEOWNER) != 0) {		dns_name_t relname;		unsigned int labels;		labels = dns_name_countlabels(name) -			 dns_name_countlabels(&db->origin);		dns_name_init(&relname, NULL);		dns_name_getlabelsequence(name, 0, labels, &relname);		result = dns_name_totext(&relname, ISC_TRUE, &b);		if (result != ISC_R_SUCCESS)			return (result);	} else {		result = dns_name_totext(name, ISC_TRUE, &b);		if (result != ISC_R_SUCCESS)			return (result);	}	isc_buffer_putuint8(&b, 0);	result = createnode(sdb, &node);	if (result != ISC_R_SUCCESS)		return (result);	isorigin = dns_name_equal(name, &sdb->common.origin);	MAYBE_LOCK(sdb);	result = imp->methods->lookup(sdb->zone, namestr, sdb->dbdata, node);	MAYBE_UNLOCK(sdb);	if (result != ISC_R_SUCCESS && !isorigin) {		destroynode(node);		return (result);	}	if (isorigin && imp->methods->authority != NULL) {		MAYBE_LOCK(sdb);		result = imp->methods->authority(sdb->zone, sdb->dbdata, node);		MAYBE_UNLOCK(sdb);		if (result != ISC_R_SUCCESS) {			destroynode(node);			return (result);		}	}		*nodep = node;	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_sdb_t *sdb = (dns_sdb_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_SDB(sdb));	REQUIRE(nodep == NULL || *nodep == NULL);	REQUIRE(version == NULL || version == (void *) &dummy);	UNUSED(options);	UNUSED(sdb);	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) {			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_tfindzonecut(dns_db_t *db, dns_name_t *name, unsigned int options,	    isc_stdtime_t now, dns_dbnode_t **nodep, dns_name_t *foundname,	    dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset){	UNUSED(db);	UNUSED(name);	UNUSED(options);	UNUSED(now);	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_sdb_t *sdb = (dns_sdb_t *)db;	dns_sdbnode_t *node = (dns_sdbnode_t *)source;	REQUIRE(VALID_SDB(sdb));	UNUSED(sdb);	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_sdb_t *sdb = (dns_sdb_t *)db;	dns_sdbnode_t *node;	isc_boolean_t need_destroy = ISC_FALSE;	REQUIRE(VALID_SDB(sdb));	REQUIRE(targetp != NULL && *targetp != NULL);	UNUSED(sdb);	node = (dns_sdbnode_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_sdb_t *sdb = (dns_sdb_t *)db;	sdb_dbiterator_t *sdbiter;	dns_sdbimplementation_t *imp = sdb->implementation;	isc_result_t result;

⌨️ 快捷键说明

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