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

📄 zone.c

📁 bind 源码 最新实现 linux/unix/windows平台
💻 C
📖 第 1 页 / 共 5 页
字号:
{	isc_result_t result;	unsigned int count;	dns_rdataset_t rdataset;	dns_rdata_t rdata = DNS_RDATA_INIT;	dns_rdata_soa_t soa;	dns_rdataset_init(&rdataset);	result = dns_db_findrdataset(db, node, version, dns_rdatatype_soa,				     dns_rdatatype_none, 0, &rdataset, NULL);	if (result == ISC_R_NOTFOUND) {		if (soacount != NULL)			*soacount = 0;		if (serial != NULL)			*serial = 0;		if (refresh != NULL)			*refresh = 0;		if (retry != NULL)			*retry = 0;		if (expire != NULL)			*expire = 0;		if (minimum != NULL)			*minimum = 0;		result = ISC_R_SUCCESS;		goto invalidate_rdataset;	}	if (result != ISC_R_SUCCESS)		goto invalidate_rdataset;	count = 0;	result = dns_rdataset_first(&rdataset);	while (result == ISC_R_SUCCESS) {		dns_rdata_init(&rdata);		dns_rdataset_current(&rdataset, &rdata);		count++;		if (count == 1) {			result = dns_rdata_tostruct(&rdata, &soa, NULL);			RUNTIME_CHECK(result == ISC_R_SUCCESS);		}		result = dns_rdataset_next(&rdataset);		dns_rdata_reset(&rdata);	}	dns_rdataset_disassociate(&rdataset);	if (soacount != NULL)		*soacount = count;	if (count > 0) {		if (serial != NULL)			*serial = soa.serial;		if (refresh != NULL)			*refresh = soa.refresh;		if (retry != NULL)			*retry = soa.retry;		if (expire != NULL)			*expire = soa.expire;		if (minimum != NULL)			*minimum = soa.minimum;	}	result = ISC_R_SUCCESS; invalidate_rdataset:	dns_rdataset_invalidate(&rdataset);	return (result);}/* * zone must be locked. */static isc_result_tzone_get_from_db(dns_db_t *db, dns_name_t *origin, unsigned int *nscount,		 unsigned int *soacount, isc_uint32_t *serial,		 isc_uint32_t *refresh, isc_uint32_t *retry,		 isc_uint32_t *expire, isc_uint32_t *minimum){	dns_dbversion_t *version;	isc_result_t result;	isc_result_t answer = ISC_R_SUCCESS;	dns_dbnode_t *node;	REQUIRE(db != NULL);	REQUIRE(origin != NULL);	version = NULL;	dns_db_currentversion(db, &version);	node = NULL;	result = dns_db_findnode(db, origin, ISC_FALSE, &node);	if (result != ISC_R_SUCCESS) {		answer = result;		goto closeversion;	}	if (nscount != NULL) {		result = zone_count_ns_rr(db, node, version, nscount);		if (result != ISC_R_SUCCESS)			answer = result;	}	if (soacount != NULL || serial != NULL || refresh != NULL	    || retry != NULL || expire != NULL || minimum != NULL) {		result = zone_load_soa_rr(db, node, version, soacount,					  serial, refresh, retry, expire,					  minimum);		if (result != ISC_R_SUCCESS)			answer = result;	}	dns_db_detachnode(db, &node); closeversion:	dns_db_closeversion(db, &version, ISC_FALSE);	return (answer);}voiddns_zone_attach(dns_zone_t *source, dns_zone_t **target) {	REQUIRE(DNS_ZONE_VALID(source));	REQUIRE(target != NULL && *target == NULL);	isc_refcount_increment(&source->erefs, NULL);	*target = source;}voiddns_zone_detach(dns_zone_t **zonep) {	dns_zone_t *zone;	unsigned int refs;	isc_boolean_t free_now = ISC_FALSE;	REQUIRE(zonep != NULL && DNS_ZONE_VALID(*zonep));	zone = *zonep;	isc_refcount_decrement(&zone->erefs, &refs);	if (refs == 0) {		LOCK_ZONE(zone);		/*		 * We just detached the last external reference.		 */		if (zone->task != NULL) {			/*			 * This zone is being managed.  Post			 * its control event and let it clean			 * up synchronously in the context of			 * its task.			 */			isc_event_t *ev = &zone->ctlevent;			isc_task_send(zone->task, &ev);		} else {			/*			 * This zone is not being managed; it has			 * no task and can have no outstanding			 * events.  Free it immediately.			 */			/*			 * Unmanaged zones should not have non-null views;			 * we have no way of detaching from the view here			 * without causing deadlock because this code is called			 * with the view already locked.			 */			INSIST(zone->view == NULL);			free_now = ISC_TRUE;		}		UNLOCK_ZONE(zone);	}	*zonep = NULL;	if (free_now)		zone_free(zone);}voiddns_zone_iattach(dns_zone_t *source, dns_zone_t **target) {	REQUIRE(DNS_ZONE_VALID(source));	REQUIRE(target != NULL && *target == NULL);	LOCK_ZONE(source);	zone_iattach(source, target);	UNLOCK_ZONE(source);}static voidzone_iattach(dns_zone_t *source, dns_zone_t **target) {	/*	 * 'source' locked by caller.	 */	REQUIRE(LOCKED_ZONE(source));	REQUIRE(DNS_ZONE_VALID(source));	REQUIRE(target != NULL && *target == NULL);	INSIST(source->irefs + isc_refcount_current(&source->erefs) > 0);	source->irefs++;	INSIST(source->irefs != 0);	*target = source;}static voidzone_idetach(dns_zone_t **zonep) {	dns_zone_t *zone;	/*	 * 'zone' locked by caller.	 */	REQUIRE(zonep != NULL && DNS_ZONE_VALID(*zonep));	zone = *zonep;	REQUIRE(LOCKED_ZONE(*zonep));	*zonep = NULL;	INSIST(zone->irefs > 0);	zone->irefs--;	INSIST(zone->irefs + isc_refcount_current(&zone->erefs) > 0);}voiddns_zone_idetach(dns_zone_t **zonep) {	dns_zone_t *zone;	isc_boolean_t free_needed;	REQUIRE(zonep != NULL && DNS_ZONE_VALID(*zonep));	zone = *zonep;	*zonep = NULL;	LOCK_ZONE(zone);	INSIST(zone->irefs > 0);	zone->irefs--;	free_needed = exit_check(zone);	UNLOCK_ZONE(zone);	if (free_needed)		zone_free(zone);}isc_mem_t *dns_zone_getmctx(dns_zone_t *zone) {	REQUIRE(DNS_ZONE_VALID(zone));	return (zone->mctx);}dns_zonemgr_t *dns_zone_getmgr(dns_zone_t *zone) {	REQUIRE(DNS_ZONE_VALID(zone));	return (zone->zmgr);}voiddns_zone_setflag(dns_zone_t *zone, unsigned int flags, isc_boolean_t value) {	REQUIRE(DNS_ZONE_VALID(zone));	LOCK_ZONE(zone);	if (value)		DNS_ZONE_SETFLAG(zone, flags);	else		DNS_ZONE_CLRFLAG(zone, flags);	UNLOCK_ZONE(zone);}voiddns_zone_setoption(dns_zone_t *zone, unsigned int option, isc_boolean_t value){	REQUIRE(DNS_ZONE_VALID(zone));	LOCK_ZONE(zone);	if (value)		zone->options |= option;	else		zone->options &= ~option;	UNLOCK_ZONE(zone);}unsigned intdns_zone_getoptions(dns_zone_t *zone) {	REQUIRE(DNS_ZONE_VALID(zone));	return (zone->options);}isc_result_tdns_zone_setxfrsource4(dns_zone_t *zone, isc_sockaddr_t *xfrsource) {	REQUIRE(DNS_ZONE_VALID(zone));	LOCK_ZONE(zone);	zone->xfrsource4 = *xfrsource;	UNLOCK_ZONE(zone);	return (ISC_R_SUCCESS);}isc_sockaddr_t *dns_zone_getxfrsource4(dns_zone_t *zone) {	REQUIRE(DNS_ZONE_VALID(zone));	return (&zone->xfrsource4);}isc_result_tdns_zone_setxfrsource6(dns_zone_t *zone, isc_sockaddr_t *xfrsource) {	REQUIRE(DNS_ZONE_VALID(zone));	LOCK_ZONE(zone);	zone->xfrsource6 = *xfrsource;	UNLOCK_ZONE(zone);	return (ISC_R_SUCCESS);}isc_sockaddr_t *dns_zone_getxfrsource6(dns_zone_t *zone) {	REQUIRE(DNS_ZONE_VALID(zone));	return (&zone->xfrsource6);}isc_result_tdns_zone_setaltxfrsource4(dns_zone_t *zone, isc_sockaddr_t *altxfrsource) {	REQUIRE(DNS_ZONE_VALID(zone));	LOCK_ZONE(zone);	zone->altxfrsource4 = *altxfrsource;	UNLOCK_ZONE(zone);	return (ISC_R_SUCCESS);}isc_sockaddr_t *dns_zone_getaltxfrsource4(dns_zone_t *zone) {	REQUIRE(DNS_ZONE_VALID(zone));	return (&zone->altxfrsource4);}isc_result_tdns_zone_setaltxfrsource6(dns_zone_t *zone, isc_sockaddr_t *altxfrsource) {	REQUIRE(DNS_ZONE_VALID(zone));	LOCK_ZONE(zone);	zone->altxfrsource6 = *altxfrsource;	UNLOCK_ZONE(zone);	return (ISC_R_SUCCESS);}isc_sockaddr_t *dns_zone_getaltxfrsource6(dns_zone_t *zone) {	REQUIRE(DNS_ZONE_VALID(zone));	return (&zone->altxfrsource6);}isc_result_tdns_zone_setnotifysrc4(dns_zone_t *zone, isc_sockaddr_t *notifysrc) {	REQUIRE(DNS_ZONE_VALID(zone));	LOCK_ZONE(zone);	zone->notifysrc4 = *notifysrc;	UNLOCK_ZONE(zone);	return (ISC_R_SUCCESS);}isc_sockaddr_t *dns_zone_getnotifysrc4(dns_zone_t *zone) {	REQUIRE(DNS_ZONE_VALID(zone));	return (&zone->notifysrc4);}isc_result_tdns_zone_setnotifysrc6(dns_zone_t *zone, isc_sockaddr_t *notifysrc) {	REQUIRE(DNS_ZONE_VALID(zone));	LOCK_ZONE(zone);	zone->notifysrc6 = *notifysrc;	UNLOCK_ZONE(zone);	return (ISC_R_SUCCESS);}isc_sockaddr_t *dns_zone_getnotifysrc6(dns_zone_t *zone) {	REQUIRE(DNS_ZONE_VALID(zone));	return (&zone->notifysrc6);}isc_result_tdns_zone_setalsonotify(dns_zone_t *zone, isc_sockaddr_t *notify,		       isc_uint32_t count){	isc_sockaddr_t *new;	REQUIRE(DNS_ZONE_VALID(zone));	REQUIRE(count == 0 || notify != NULL);	LOCK_ZONE(zone);	if (zone->notify != NULL) {		isc_mem_put(zone->mctx, zone->notify,			    zone->notifycnt * sizeof(*new));		zone->notify = NULL;		zone->notifycnt = 0;	}	if (count != 0) {		new = isc_mem_get(zone->mctx, count * sizeof(*new));		if (new == NULL) {			UNLOCK_ZONE(zone);			return (ISC_R_NOMEMORY);		}		memcpy(new, notify, count * sizeof(*new));		zone->notify = new;		zone->notifycnt = count;	}	UNLOCK_ZONE(zone);	return (ISC_R_SUCCESS);}isc_result_tdns_zone_setmasters(dns_zone_t *zone, isc_sockaddr_t *masters,		    isc_uint32_t count){	isc_result_t result;	result = dns_zone_setmasterswithkeys(zone, masters, NULL, count);	return (result);}isc_result_tdns_zone_setmasterswithkeys(dns_zone_t *zone, isc_sockaddr_t *masters,			    dns_name_t **keynames, isc_uint32_t count){	isc_sockaddr_t *new;	isc_result_t result = ISC_R_SUCCESS;	dns_name_t **newname;	isc_boolean_t *newok;	unsigned int i;	REQUIRE(DNS_ZONE_VALID(zone));	REQUIRE(count == 0 || masters != NULL);	if (keynames != NULL) {		REQUIRE(count != 0);	}	LOCK_ZONE(zone);	if (zone->masters != NULL) {		isc_mem_put(zone->mctx, zone->masters,			    zone->masterscnt * sizeof(*new));		zone->masters = NULL;	}	if (zone->masterkeynames != NULL) {		for (i = 0; i < zone->masterscnt; i++) {			if (zone->masterkeynames[i] != NULL) {				dns_name_free(zone->masterkeynames[i],					      zone->mctx);				isc_mem_put(zone->mctx,					    zone->masterkeynames[i],					    sizeof(dns_name_t));				zone->masterkeynames[i] = NULL;			}		}		isc_mem_put(zone->mctx, zone->masterkeynames,			    zone->masterscnt * sizeof(dns_name_t *));		zone->masterkeynames = NULL;	}	if (zone->mastersok != NULL) {		isc_mem_put(zone->mctx, zone->mastersok,			    zone->masterscnt * sizeof(isc_boolean_t));		zone->mastersok = NULL;	}	zone->masterscnt = 0;	/*	 * If count == 0, don't allocate any space for masters, mastersok or	 * keynames so internally, those pointers are NULL if count == 0	 */	if (count == 0)		goto unlock;	/*	 * masters must countain count elements!	 */	new = isc_mem_get(zone->mctx, count * sizeof(*new));	if (new == NULL) {		result = ISC_R_NOMEMORY;		goto unlock;	}	memcpy(new, masters, count * sizeof(*new));		/*	 * Similarly for mastersok.	 */	newok = isc_mem_get(zone->mctx, count * sizeof(*newok));	if (newok == NULL) {		result = ISC_R_NOMEMORY;		isc_mem_put(zone->mctx, new, count * sizeof(*new));		goto unlock;	};	for (i = 0; i < count; i++)		newok[i] = ISC_FALSE;	/*	 * if keynames is non-NULL, it must contain count elements!	 */	newname = NULL;	if (keynames != NULL) {		newname = isc_mem_get(zone->mctx, count * sizeof(*newname));		if (newname == NULL) {			result = ISC_R_NOMEMORY;			isc_mem_put(zone->mctx, new, count * sizeof(*new));			isc_mem_put(zone->mctx, newok, count * sizeof(*newok));			goto unlock;		}		for (i = 0; i < count; i++)			newname[i] = NULL;		for (i = 0; i < count; i++) {			if (keynames[i] != NULL) {				newname[i] = isc_mem_get(zone->mctx,							 sizeof(dns_name_t));				if (newname[i] == NULL)					goto allocfail;

⌨️ 快捷键说明

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