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

📄 view.c

📁 bind-3.2.
💻 C
📖 第 1 页 / 共 3 页
字号:
		    dns_rdataset_isassociated(sigrdataset))			dns_rdataset_disassociate(sigrdataset);	} else if (result != ISC_R_SUCCESS &&		   result != DNS_R_GLUE &&		   result != DNS_R_HINT &&		   result != DNS_R_NCACHENXDOMAIN &&		   result != DNS_R_NCACHENXRRSET &&		   result != DNS_R_NXRRSET &&		   result != DNS_R_HINTNXRRSET &&		   result != ISC_R_NOTFOUND) {		if (dns_rdataset_isassociated(rdataset))			dns_rdataset_disassociate(rdataset);		if (sigrdataset != NULL &&		    dns_rdataset_isassociated(sigrdataset))			dns_rdataset_disassociate(sigrdataset);		result = ISC_R_NOTFOUND;	}	return (result);}isc_result_tdns_view_findzonecut(dns_view_t *view, dns_name_t *name, dns_name_t *fname,		     isc_stdtime_t now, unsigned int options,		     isc_boolean_t use_hints, 		     dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset){	return(dns_view_findzonecut2(view, name, fname, now, options,				     use_hints, ISC_TRUE,				     rdataset, sigrdataset));}isc_result_tdns_view_findzonecut2(dns_view_t *view, dns_name_t *name, dns_name_t *fname,		      isc_stdtime_t now, unsigned int options,		      isc_boolean_t use_hints,  isc_boolean_t use_cache,		      dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset){	isc_result_t result;	dns_db_t *db;	isc_boolean_t is_cache, use_zone, try_hints;	dns_zone_t *zone;	dns_name_t *zfname;	dns_rdataset_t zrdataset, zsigrdataset;	dns_fixedname_t zfixedname;	REQUIRE(DNS_VIEW_VALID(view));	REQUIRE(view->frozen);	db = NULL;	zone = NULL;	use_zone = ISC_FALSE;	try_hints = ISC_FALSE;	zfname = NULL;	/*	 * Initialize.	 */	dns_fixedname_init(&zfixedname);	dns_rdataset_init(&zrdataset);	dns_rdataset_init(&zsigrdataset);	/*	 * Find the right database.	 */	result = dns_zt_find(view->zonetable, name, 0, NULL, &zone);	if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH)		result = dns_zone_getdb(zone, &db);	if (result == ISC_R_NOTFOUND) {		/*		 * We're not directly authoritative for this query name, nor		 * is it a subdomain of any zone for which we're		 * authoritative.		 */		if (use_cache && view->cachedb != NULL) {			/*			 * We have a cache; try it.			 */			dns_db_attach(view->cachedb, &db);		} else {			/*			 * Maybe we have hints...			 */			try_hints = ISC_TRUE;			goto finish;		}	} else if (result != ISC_R_SUCCESS) {		/*		 * Something is broken.		 */		goto cleanup;	}	is_cache = dns_db_iscache(db); db_find:	/*	 * Look for the zonecut.	 */	if (!is_cache) {		result = dns_db_find(db, name, NULL, dns_rdatatype_ns, options,				     now, NULL, fname, rdataset, sigrdataset);		if (result == DNS_R_DELEGATION)			result = ISC_R_SUCCESS;		else if (result != ISC_R_SUCCESS)			goto cleanup;		if (use_cache && view->cachedb != NULL && db != view->hints) {			/*			 * We found an answer, but the cache may be better.			 */			zfname = dns_fixedname_name(&zfixedname);			result = dns_name_copy(fname, zfname, NULL);			if (result != ISC_R_SUCCESS)				goto cleanup;			dns_rdataset_clone(rdataset, &zrdataset);			dns_rdataset_disassociate(rdataset);			if (sigrdataset != NULL &&			    dns_rdataset_isassociated(sigrdataset)) {				dns_rdataset_clone(sigrdataset, &zsigrdataset);				dns_rdataset_disassociate(sigrdataset);			}			dns_db_detach(&db);			dns_db_attach(view->cachedb, &db);			is_cache = ISC_TRUE;			goto db_find;		}	} else {		result = dns_db_findzonecut(db, name, options, now, NULL,					    fname, rdataset, sigrdataset);		if (result == ISC_R_SUCCESS) {			if (zfname != NULL &&			    !dns_name_issubdomain(fname, zfname)) {				/*				 * We found a zonecut in the cache, but our				 * zone delegation is better.				 */				use_zone = ISC_TRUE;			}		} else if (result == ISC_R_NOTFOUND) {			if (zfname != NULL) {				/*				 * We didn't find anything in the cache, but we				 * have a zone delegation, so use it.				 */				use_zone = ISC_TRUE;			} else {				/*				 * Maybe we have hints...				 */				try_hints = ISC_TRUE;			}		} else {			/*			 * Something bad happened.			 */			goto cleanup;		}	} finish:	if (use_zone) {		if (dns_rdataset_isassociated(rdataset)) {			dns_rdataset_disassociate(rdataset);			if (sigrdataset != NULL &&			    dns_rdataset_isassociated(sigrdataset))				dns_rdataset_disassociate(sigrdataset);		}		result = dns_name_copy(zfname, fname, NULL);		if (result != ISC_R_SUCCESS)			goto cleanup;		dns_rdataset_clone(&zrdataset, rdataset);		if (sigrdataset != NULL &&		    dns_rdataset_isassociated(&zrdataset))			dns_rdataset_clone(&zsigrdataset, sigrdataset);	} else if (try_hints && use_hints && view->hints != NULL) {		/*		 * We've found nothing so far, but we have hints.		 */		result = dns_db_find(view->hints, dns_rootname, NULL,				     dns_rdatatype_ns, 0, now, NULL, fname,				     rdataset, NULL);		if (result != ISC_R_SUCCESS) {			/*			 * We can't even find the hints for the root			 * nameservers!			 */			if (dns_rdataset_isassociated(rdataset))				dns_rdataset_disassociate(rdataset);			result = ISC_R_NOTFOUND;		}	} cleanup:	if (dns_rdataset_isassociated(&zrdataset)) {		dns_rdataset_disassociate(&zrdataset);		if (dns_rdataset_isassociated(&zsigrdataset))			dns_rdataset_disassociate(&zsigrdataset);	}	if (db != NULL)		dns_db_detach(&db);	if (zone != NULL)		dns_zone_detach(&zone);	return (result);}isc_result_tdns_viewlist_find(dns_viewlist_t *list, const char *name,		  dns_rdataclass_t rdclass, dns_view_t **viewp){	dns_view_t *view;	REQUIRE(list != NULL);	for (view = ISC_LIST_HEAD(*list);	     view != NULL;	     view = ISC_LIST_NEXT(view, link)) {		if (strcmp(view->name, name) == 0 && view->rdclass == rdclass)			break;	}	if (view == NULL)		return (ISC_R_NOTFOUND);	dns_view_attach(view, viewp);	return (ISC_R_SUCCESS);}isc_result_tdns_view_load(dns_view_t *view, isc_boolean_t stop) {	REQUIRE(DNS_VIEW_VALID(view));	return (dns_zt_load(view->zonetable, stop));}isc_result_tdns_view_loadnew(dns_view_t *view, isc_boolean_t stop) {	REQUIRE(DNS_VIEW_VALID(view));	return (dns_zt_loadnew(view->zonetable, stop));}isc_result_tdns_view_gettsig(dns_view_t *view, dns_name_t *keyname, dns_tsigkey_t **keyp){	isc_result_t result;	REQUIRE(keyp != NULL && *keyp == NULL);	result = dns_tsigkey_find(keyp, keyname, NULL,				  view->statickeys);	if (result == ISC_R_NOTFOUND)		result = dns_tsigkey_find(keyp, keyname, NULL,					  view->dynamickeys);	return (result);}isc_result_tdns_view_getpeertsig(dns_view_t *view, isc_netaddr_t *peeraddr,		     dns_tsigkey_t **keyp){	isc_result_t result;	dns_name_t *keyname = NULL;	dns_peer_t *peer = NULL;	result = dns_peerlist_peerbyaddr(view->peers, peeraddr, &peer);	if (result != ISC_R_SUCCESS)		return (result);	result = dns_peer_getkey(peer, &keyname);	if (result != ISC_R_SUCCESS)		return (result);	return (dns_view_gettsig(view, keyname, keyp));}isc_result_tdns_view_checksig(dns_view_t *view, isc_buffer_t *source, dns_message_t *msg) {	REQUIRE(DNS_VIEW_VALID(view));	REQUIRE(source != NULL);	return (dns_tsig_verify(source, msg, view->statickeys,				view->dynamickeys));}isc_result_tdns_view_dumpdbtostream(dns_view_t *view, FILE *fp) {	isc_result_t result;	REQUIRE(DNS_VIEW_VALID(view));	(void)fprintf(fp, ";\n; Cache dump of view '%s'\n;\n", view->name);	result = dns_master_dumptostream(view->mctx, view->cachedb, NULL,					  &dns_master_style_cache, fp);	if (result != ISC_R_SUCCESS)		return (result);#ifdef notyet /* clean up adb dump format first */	dns_adb_dump(view->adb, fp);#endif	return (ISC_R_SUCCESS);}isc_result_tdns_view_flushcache(dns_view_t *view) {	isc_result_t result;	REQUIRE(DNS_VIEW_VALID(view));	if (view->cachedb == NULL)		return (ISC_R_SUCCESS);	result = dns_cache_flush(view->cache);	if (result != ISC_R_SUCCESS)		return (result);	dns_db_detach(&view->cachedb);	dns_cache_attachdb(view->cache, &view->cachedb);	dns_adb_flush(view->adb);	return (ISC_R_SUCCESS);}isc_result_tdns_view_adddelegationonly(dns_view_t *view, dns_name_t *name) {	isc_result_t result;	dns_name_t *new;	isc_uint32_t hash;	REQUIRE(DNS_VIEW_VALID(view));	if (view->delonly == NULL) {		view->delonly = isc_mem_get(view->mctx,					    sizeof(dns_namelist_t) *					    DNS_VIEW_DELONLYHASH);		if (view->delonly == NULL)			return (ISC_R_NOMEMORY);		for (hash = 0; hash < DNS_VIEW_DELONLYHASH; hash++)			ISC_LIST_INIT(view->delonly[hash]);	}	hash = dns_name_hash(name, ISC_FALSE) % DNS_VIEW_DELONLYHASH;	new = ISC_LIST_HEAD(view->delonly[hash]);	while (new != NULL && !dns_name_equal(new, name))		new = ISC_LIST_NEXT(new, link);	if (new != NULL)		return (ISC_R_SUCCESS);	new = isc_mem_get(view->mctx, sizeof(*new));	if (new == NULL)		return (ISC_R_NOMEMORY);	dns_name_init(new, NULL);	result = dns_name_dup(name, view->mctx, new);	if (result == ISC_R_SUCCESS)		ISC_LIST_APPEND(view->delonly[hash], new, link);	else		isc_mem_put(view->mctx, new, sizeof(*new));	return (result);}isc_result_tdns_view_excludedelegationonly(dns_view_t *view, dns_name_t *name) {	isc_result_t result;	dns_name_t *new;	isc_uint32_t hash;	REQUIRE(DNS_VIEW_VALID(view));	if (view->rootexclude == NULL) {		view->rootexclude = isc_mem_get(view->mctx,					    sizeof(dns_namelist_t) *					    DNS_VIEW_DELONLYHASH);		if (view->rootexclude == NULL)			return (ISC_R_NOMEMORY);		for (hash = 0; hash < DNS_VIEW_DELONLYHASH; hash++)			ISC_LIST_INIT(view->rootexclude[hash]);	}	hash = dns_name_hash(name, ISC_FALSE) % DNS_VIEW_DELONLYHASH;	new = ISC_LIST_HEAD(view->rootexclude[hash]);	while (new != NULL && !dns_name_equal(new, name))		new = ISC_LIST_NEXT(new, link);	if (new != NULL)		return (ISC_R_SUCCESS);	new = isc_mem_get(view->mctx, sizeof(*new));	if (new == NULL)		return (ISC_R_NOMEMORY);	dns_name_init(new, NULL);	result = dns_name_dup(name, view->mctx, new);	if (result == ISC_R_SUCCESS)		ISC_LIST_APPEND(view->rootexclude[hash], new, link);	else		isc_mem_put(view->mctx, new, sizeof(*new));	return (result);}isc_boolean_tdns_view_isdelegationonly(dns_view_t *view, dns_name_t *name) {	dns_name_t *new;	isc_uint32_t hash;	REQUIRE(DNS_VIEW_VALID(view));	if (!view->rootdelonly && view->delonly == NULL)		return (ISC_FALSE);	hash = dns_name_hash(name, ISC_FALSE) % DNS_VIEW_DELONLYHASH;	if (view->rootdelonly && dns_name_countlabels(name) <= 2) {		if (view->rootexclude == NULL)			return (ISC_TRUE);		new = ISC_LIST_HEAD(view->rootexclude[hash]);		while (new != NULL && !dns_name_equal(new, name))			new = ISC_LIST_NEXT(new, link);		if (new == NULL)			return (ISC_TRUE);	}	if (view->delonly == NULL)		return (ISC_FALSE);	new = ISC_LIST_HEAD(view->delonly[hash]);	while (new != NULL && !dns_name_equal(new, name))		new = ISC_LIST_NEXT(new, link);	if (new == NULL)		return (ISC_FALSE);	return (ISC_TRUE);}void dns_view_setrootdelonly(dns_view_t *view, isc_boolean_t value) {	REQUIRE(DNS_VIEW_VALID(view));	view->rootdelonly = value;}isc_boolean_tdns_view_getrootdelonly(dns_view_t *view) {	REQUIRE(DNS_VIEW_VALID(view));	return (view->rootdelonly);}

⌨️ 快捷键说明

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