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

📄 view.c

📁 bind 9.3结合mysql数据库
💻 C
📖 第 1 页 / 共 3 页
字号:
	REQUIRE(event->ev_type == DNS_EVENT_VIEWRESSHUTDOWN);	REQUIRE(DNS_VIEW_VALID(view));	REQUIRE(view->task == task);	UNUSED(task);	LOCK(&view->lock);	view->attributes |= DNS_VIEWATTR_RESSHUTDOWN;	done = all_done(view);	UNLOCK(&view->lock);	isc_event_free(&event);	if (done)		destroy(view);}static voidadb_shutdown(isc_task_t *task, isc_event_t *event) {	dns_view_t *view = event->ev_arg;	isc_boolean_t done;	REQUIRE(event->ev_type == DNS_EVENT_VIEWADBSHUTDOWN);	REQUIRE(DNS_VIEW_VALID(view));	REQUIRE(view->task == task);	UNUSED(task);	LOCK(&view->lock);	view->attributes |= DNS_VIEWATTR_ADBSHUTDOWN;	done = all_done(view);	UNLOCK(&view->lock);	isc_event_free(&event);	if (done)		destroy(view);}static voidreq_shutdown(isc_task_t *task, isc_event_t *event) {	dns_view_t *view = event->ev_arg;	isc_boolean_t done;	REQUIRE(event->ev_type == DNS_EVENT_VIEWREQSHUTDOWN);	REQUIRE(DNS_VIEW_VALID(view));	REQUIRE(view->task == task);	UNUSED(task);	LOCK(&view->lock);	view->attributes |= DNS_VIEWATTR_REQSHUTDOWN;	done = all_done(view);	UNLOCK(&view->lock);	isc_event_free(&event);	if (done)		destroy(view);}isc_result_tdns_view_createresolver(dns_view_t *view,			isc_taskmgr_t *taskmgr, unsigned int ntasks,			isc_socketmgr_t *socketmgr,			isc_timermgr_t *timermgr,			unsigned int options,			dns_dispatchmgr_t *dispatchmgr,			dns_dispatch_t *dispatchv4,			dns_dispatch_t *dispatchv6){	isc_result_t result;	isc_event_t *event;	isc_mem_t *mctx = NULL;	REQUIRE(DNS_VIEW_VALID(view));	REQUIRE(!view->frozen);	REQUIRE(view->resolver == NULL);	result = isc_task_create(taskmgr, 0, &view->task);	if (result != ISC_R_SUCCESS)		return (result);	isc_task_setname(view->task, "view", view);	result = dns_resolver_create(view, taskmgr, ntasks, socketmgr,				     timermgr, options, dispatchmgr,				     dispatchv4, dispatchv6,				     &view->resolver);	if (result != ISC_R_SUCCESS) {		isc_task_detach(&view->task);		return (result);	}	event = &view->resevent;	dns_resolver_whenshutdown(view->resolver, view->task, &event);	view->attributes &= ~DNS_VIEWATTR_RESSHUTDOWN;	result = isc_mem_create(0, 0, &mctx);	if (result != ISC_R_SUCCESS) {		dns_resolver_shutdown(view->resolver);		return (result);	}	result = dns_adb_create(mctx, view, timermgr, taskmgr, &view->adb);	isc_mem_detach(&mctx);	if (result != ISC_R_SUCCESS) {		dns_resolver_shutdown(view->resolver);		return (result);	}	event = &view->adbevent;	dns_adb_whenshutdown(view->adb, view->task, &event);	view->attributes &= ~DNS_VIEWATTR_ADBSHUTDOWN;	result = dns_requestmgr_create(view->mctx, timermgr, socketmgr,				      dns_resolver_taskmgr(view->resolver),				      dns_resolver_dispatchmgr(view->resolver),				      dns_resolver_dispatchv4(view->resolver),				      dns_resolver_dispatchv6(view->resolver),				      &view->requestmgr);	if (result != ISC_R_SUCCESS) {		dns_adb_shutdown(view->adb);		dns_resolver_shutdown(view->resolver);		return (result);	}	event = &view->reqevent;	dns_requestmgr_whenshutdown(view->requestmgr, view->task, &event);	view->attributes &= ~DNS_VIEWATTR_REQSHUTDOWN;	return (ISC_R_SUCCESS);}voiddns_view_setcache(dns_view_t *view, dns_cache_t *cache) {	REQUIRE(DNS_VIEW_VALID(view));	REQUIRE(!view->frozen);	if (view->cache != NULL) {		dns_db_detach(&view->cachedb);		dns_cache_detach(&view->cache);	}	dns_cache_attach(cache, &view->cache);	dns_cache_attachdb(cache, &view->cachedb);	INSIST(DNS_DB_VALID(view->cachedb));}voiddns_view_sethints(dns_view_t *view, dns_db_t *hints) {	REQUIRE(DNS_VIEW_VALID(view));	REQUIRE(!view->frozen);	REQUIRE(view->hints == NULL);	REQUIRE(dns_db_iszone(hints));	dns_db_attach(hints, &view->hints);}voiddns_view_setkeyring(dns_view_t *view, dns_tsig_keyring_t *ring) {	REQUIRE(DNS_VIEW_VALID(view));	REQUIRE(ring != NULL);	if (view->statickeys != NULL)		dns_tsigkeyring_destroy(&view->statickeys);	view->statickeys = ring;}voiddns_view_setdstport(dns_view_t *view, in_port_t dstport) {	REQUIRE(DNS_VIEW_VALID(view));	view->dstport = dstport;}isc_result_tdns_view_addzone(dns_view_t *view, dns_zone_t *zone) {	isc_result_t result;	REQUIRE(DNS_VIEW_VALID(view));	REQUIRE(!view->frozen);	result = dns_zt_mount(view->zonetable, zone);	return (result);}voiddns_view_freeze(dns_view_t *view) {	REQUIRE(DNS_VIEW_VALID(view));	REQUIRE(!view->frozen);	if (view->resolver != NULL) {		INSIST(view->cachedb != NULL);		dns_resolver_freeze(view->resolver);	}	view->frozen = ISC_TRUE;}isc_result_tdns_view_findzone(dns_view_t *view, dns_name_t *name, dns_zone_t **zonep) {	isc_result_t result;	REQUIRE(DNS_VIEW_VALID(view));	result = dns_zt_find(view->zonetable, name, 0, NULL, zonep);	if (result == DNS_R_PARTIALMATCH) {		dns_zone_detach(zonep);		result = ISC_R_NOTFOUND;	}	return (result);}isc_result_tdns_view_find(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,	      isc_stdtime_t now, unsigned int options, isc_boolean_t use_hints,	      dns_db_t **dbp, dns_dbnode_t **nodep, dns_name_t *foundname,	      dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset){	isc_result_t result;	dns_db_t *db, *zdb;	dns_dbnode_t *node, *znode;	isc_boolean_t is_cache;	dns_rdataset_t zrdataset, zsigrdataset;	dns_zone_t *zone;	/*	 * Find an rdataset whose owner name is 'name', and whose type is	 * 'type'.	 */	REQUIRE(DNS_VIEW_VALID(view));	REQUIRE(view->frozen);	REQUIRE(type != dns_rdatatype_rrsig);	REQUIRE(rdataset != NULL);  /* XXXBEW - remove this */	/*	 * Initialize.	 */	dns_rdataset_init(&zrdataset);	dns_rdataset_init(&zsigrdataset);	zdb = NULL;	znode = NULL;	/*	 * Find a database to answer the query.	 */	zone = NULL;	db = NULL;	node = NULL;	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_SUCCESS && view->cachedb != NULL)			dns_db_attach(view->cachedb, &db);		else if (result != ISC_R_SUCCESS)			goto cleanup;	} else if (result == ISC_R_NOTFOUND && view->cachedb != NULL)		dns_db_attach(view->cachedb, &db);	else		goto cleanup;	is_cache = dns_db_iscache(db); db_find:	/*	 * Now look for an answer in the database.	 */	result = dns_db_find(db, name, NULL, type, options,			     now, &node, foundname, rdataset, sigrdataset);	if (result == DNS_R_DELEGATION ||	    result == ISC_R_NOTFOUND) {		if (dns_rdataset_isassociated(rdataset))			dns_rdataset_disassociate(rdataset);		if (sigrdataset != NULL &&		    dns_rdataset_isassociated(sigrdataset))			dns_rdataset_disassociate(sigrdataset);		if (node != NULL)			dns_db_detachnode(db, &node);		if (!is_cache) {			dns_db_detach(&db);			if (view->cachedb != NULL) {				/*				 * Either the answer is in the cache, or we				 * don't know it.				 */				is_cache = ISC_TRUE;				dns_db_attach(view->cachedb, &db);				goto db_find;			}		} else {			/*			 * We don't have the data in the cache.  If we've got			 * glue from the zone, use it.			 */			if (dns_rdataset_isassociated(&zrdataset)) {				dns_rdataset_clone(&zrdataset, rdataset);				if (sigrdataset != NULL &&				    dns_rdataset_isassociated(&zsigrdataset))					dns_rdataset_clone(&zsigrdataset,							   sigrdataset);				result = DNS_R_GLUE;				if (db != NULL)					dns_db_detach(&db);				dns_db_attach(zdb, &db);				dns_db_attachnode(db, znode, &node);				goto cleanup;			}		}		/*		 * We don't know the answer.		 */		result = ISC_R_NOTFOUND;	} else if (result == DNS_R_GLUE) {		if (view->cachedb != NULL) {			/*			 * We found an answer, but the cache may be better.			 * Remember what we've got and go look in the cache.			 */			is_cache = ISC_TRUE;			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_attach(db, &zdb);			dns_db_attachnode(zdb, node, &znode);			dns_db_detachnode(db, &node);			dns_db_detach(&db);			dns_db_attach(view->cachedb, &db);			goto db_find;		}		/*		 * Otherwise, the glue is the best answer.		 */		result = ISC_R_SUCCESS;	}	if (result == ISC_R_NOTFOUND && use_hints && view->hints != NULL) {		if (dns_rdataset_isassociated(rdataset))			dns_rdataset_disassociate(rdataset);		if (sigrdataset != NULL &&		    dns_rdataset_isassociated(sigrdataset))			dns_rdataset_disassociate(sigrdataset);		if (db != NULL) {			if (node != NULL)				dns_db_detachnode(db, &node);			dns_db_detach(&db);		}		result = dns_db_find(view->hints, name, NULL, type, options,				     now, &node, foundname,				     rdataset, sigrdataset);		if (result == ISC_R_SUCCESS || result == DNS_R_GLUE) {			/*			 * We just used a hint.  Let the resolver know it			 * should consider priming.			 */			dns_resolver_prime(view->resolver);			dns_db_attach(view->hints, &db);			result = DNS_R_HINT;		} else if (result == DNS_R_NXRRSET) {			dns_db_attach(view->hints, &db);			result = DNS_R_HINTNXRRSET;		} else if (result == DNS_R_NXDOMAIN)			result = ISC_R_NOTFOUND;		/*		 * Cleanup if non-standard hints are used.		 */		if (db == NULL && node != NULL)			dns_db_detachnode(view->hints, &node);	} cleanup:	if (result == DNS_R_NXDOMAIN || result == DNS_R_NXRRSET) {		/*		 * We don't care about any DNSSEC proof data in these cases.		 */		if (dns_rdataset_isassociated(rdataset))			dns_rdataset_disassociate(rdataset);		if (sigrdataset != NULL &&		    dns_rdataset_isassociated(sigrdataset))			dns_rdataset_disassociate(sigrdataset);	}	if (dns_rdataset_isassociated(&zrdataset)) {		dns_rdataset_disassociate(&zrdataset);		if (dns_rdataset_isassociated(&zsigrdataset))			dns_rdataset_disassociate(&zsigrdataset);	}	if (zdb != NULL) {		if (znode != NULL)			dns_db_detachnode(zdb, &znode);		dns_db_detach(&zdb);	}	if (db != NULL) {		if (node != NULL) {			if (nodep != NULL)				*nodep = node;			else				dns_db_detachnode(db, &node);		}		if (dbp != NULL)			*dbp = db;		else			dns_db_detach(&db);	} else		INSIST(node == NULL);	if (zone != NULL)		dns_zone_detach(&zone);	return (result);}isc_result_tdns_view_simplefind(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,		    isc_stdtime_t now, unsigned int options,		    isc_boolean_t use_hints,		    dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset){	isc_result_t result;	dns_fixedname_t foundname;	dns_fixedname_init(&foundname);	result = dns_view_find(view, name, type, now, options, use_hints,			       NULL, NULL, dns_fixedname_name(&foundname),			       rdataset, sigrdataset);	if (result == DNS_R_NXDOMAIN) {		/*		 * The rdataset and sigrdataset of the relevant NSEC record		 * may be returned, but the caller cannot use them because		 * foundname is not returned by this simplified API.  We		 * disassociate them here to prevent any misuse by the caller.		 */		if (dns_rdataset_isassociated(rdataset))			dns_rdataset_disassociate(rdataset);		if (sigrdataset != NULL &&		    dns_rdataset_isassociated(sigrdataset))

⌨️ 快捷键说明

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