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

📄 rdataset.c

📁 非常好的dns解析软件
💻 C
📖 第 1 页 / 共 2 页
字号:
		sorted = sorted_fixed;	}	if (shuffle) {		/*		 * First we get handles to all of the rdata.		 */		i = 0;		do {			INSIST(i < count);			dns_rdata_init(&shuffled[i]);			dns_rdataset_current(rdataset, &shuffled[i]);			i++;			result = dns_rdataset_next(rdataset);		} while (result == ISC_R_SUCCESS);		if (result != ISC_R_NOMORE)			goto cleanup;		INSIST(i == count);		/*		 * Now we shuffle.		 */		if (WANT_FIXED(rdataset)) {			/*			 * 'Fixed' order.			 */			INSIST(order != NULL);			for (i = 0; i < count; i++) {				sorted[i].key = (*order)(&shuffled[i],							 order_arg);				sorted[i].rdata = &shuffled[i];			}		} else if (WANT_RANDOM(rdataset)) {			/*			 * 'Random' order.			 */			for (i = 0; i < count; i++) {				dns_rdata_t rdata;				isc_uint32_t val;				isc_random_get(&val);				choice = i + (val % (count - i));				rdata = shuffled[i];				shuffled[i] = shuffled[choice];				shuffled[choice] = rdata;				if (order != NULL)					sorted[i].key = (*order)(&shuffled[i],								 order_arg);				else					sorted[i].key = 0; /* Unused */				sorted[i].rdata = &shuffled[i];			}		} else {			/*			 * "Cyclic" order.			 */			isc_uint32_t val;			unsigned int j;			val = rdataset->count;			if (val == ISC_UINT32_MAX)				isc_random_get(&val);			j = val % count;			for (i = 0; i < count; i++) {				if (order != NULL)					sorted[j].key = (*order)(&shuffled[i],								 order_arg);				else					sorted[j].key = 0; /* Unused */				sorted[j].rdata = &shuffled[i];				j++;				if (j == count)					j = 0; /* Wrap around. */			}		}		/*		 * Sorted order.		 */		if (order != NULL)			qsort(sorted, count, sizeof(sorted[0]),			      towire_compare);	}	savedbuffer = *target;	i = 0;	added = 0;	do {		/*		 * Copy out the name, type, class, ttl.		 */				rrbuffer = *target;		dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);		result = dns_name_towire(owner_name, cctx, target);		if (result != ISC_R_SUCCESS)			goto rollback;		headlen = sizeof(dns_rdataclass_t) + sizeof(dns_rdatatype_t);		if (!question)			headlen += sizeof(dns_ttl_t)				+ 2;  /* XXX 2 for rdata len */		isc_buffer_availableregion(target, &r);		if (r.length < headlen) {			result = ISC_R_NOSPACE;			goto rollback;		}		isc_buffer_putuint16(target, rdataset->type);		isc_buffer_putuint16(target, rdataset->rdclass);		if (!question) {			isc_buffer_putuint32(target, rdataset->ttl);			/*			 * Save space for rdlen.			 */			rdlen = *target;			isc_buffer_add(target, 2);			/*			 * Copy out the rdata			 */			if (shuffle)				rdata = *(sorted[i].rdata);			else {				dns_rdata_reset(&rdata);				dns_rdataset_current(rdataset, &rdata);			}			result = dns_rdata_towire(&rdata, cctx, target);			if (result != ISC_R_SUCCESS)				goto rollback;			INSIST((target->used >= rdlen.used + 2) &&			       (target->used - rdlen.used - 2 < 65536));			isc_buffer_putuint16(&rdlen,					     (isc_uint16_t)(target->used -							    rdlen.used - 2));			added++;		}		if (shuffle) {			i++;			if (i == count)				result = ISC_R_NOMORE;			else				result = ISC_R_SUCCESS;		} else {			result = dns_rdataset_next(rdataset);		}	} while (result == ISC_R_SUCCESS);	if (result != ISC_R_NOMORE)		goto rollback;	*countp += count;	result = ISC_R_SUCCESS;	goto cleanup; rollback:	if (partial && result == ISC_R_NOSPACE) {		INSIST(rrbuffer.used < 65536);		dns_compress_rollback(cctx, (isc_uint16_t)rrbuffer.used);		*countp += added;		*target = rrbuffer;		goto cleanup;	}	INSIST(savedbuffer.used < 65536);	dns_compress_rollback(cctx, (isc_uint16_t)savedbuffer.used);	*countp = 0;	*target = savedbuffer; cleanup:	if (sorted != NULL && sorted != sorted_fixed)		isc_mem_put(cctx->mctx, sorted, count * sizeof(*sorted));	if (shuffled != NULL && shuffled != shuffled_fixed)		isc_mem_put(cctx->mctx, shuffled, count * sizeof(*shuffled));	return (result);}isc_result_tdns_rdataset_towiresorted(dns_rdataset_t *rdataset,			  const dns_name_t *owner_name,			  dns_compress_t *cctx,			  isc_buffer_t *target,			  dns_rdatasetorderfunc_t order,			  const void *order_arg,			  unsigned int options,			  unsigned int *countp){	return (towiresorted(rdataset, owner_name, cctx, target,			     order, order_arg, ISC_FALSE, options,			     countp, NULL));}isc_result_tdns_rdataset_towirepartial(dns_rdataset_t *rdataset,			   const dns_name_t *owner_name,			   dns_compress_t *cctx,			   isc_buffer_t *target,			   dns_rdatasetorderfunc_t order,			   const void *order_arg,			   unsigned int options,			   unsigned int *countp,			   void **state){	REQUIRE(state == NULL);	/* XXX remove when implemented */	return (towiresorted(rdataset, owner_name, cctx, target,			     order, order_arg, ISC_TRUE, options,			     countp, state));}isc_result_tdns_rdataset_towire(dns_rdataset_t *rdataset,		    dns_name_t *owner_name,		    dns_compress_t *cctx,		    isc_buffer_t *target,		    unsigned int options,		    unsigned int *countp){	return (towiresorted(rdataset, owner_name, cctx, target,			     NULL, NULL, ISC_FALSE, options, countp, NULL));}isc_result_tdns_rdataset_additionaldata(dns_rdataset_t *rdataset,			    dns_additionaldatafunc_t add, void *arg){	dns_rdata_t rdata = DNS_RDATA_INIT;	isc_result_t result;	/*	 * For each rdata in rdataset, call 'add' for each name and type in the	 * rdata which is subject to additional section processing.	 */	REQUIRE(DNS_RDATASET_VALID(rdataset));	REQUIRE((rdataset->attributes & DNS_RDATASETATTR_QUESTION) == 0);	result = dns_rdataset_first(rdataset);	if (result != ISC_R_SUCCESS)		return (result);	do {		dns_rdataset_current(rdataset, &rdata);		result = dns_rdata_additionaldata(&rdata, add, arg);		if (result == ISC_R_SUCCESS)			result = dns_rdataset_next(rdataset);		dns_rdata_reset(&rdata);	} while (result == ISC_R_SUCCESS);	if (result != ISC_R_NOMORE)		return (result);	return (ISC_R_SUCCESS);}isc_result_tdns_rdataset_addnoqname(dns_rdataset_t *rdataset, dns_name_t *name) {	REQUIRE(DNS_RDATASET_VALID(rdataset));	REQUIRE(rdataset->methods != NULL);	if (rdataset->methods->addnoqname == NULL)		return (ISC_R_NOTIMPLEMENTED);	return((rdataset->methods->addnoqname)(rdataset, name));}isc_result_tdns_rdataset_getnoqname(dns_rdataset_t *rdataset, dns_name_t *name,		        dns_rdataset_t *nsec, dns_rdataset_t *nsecsig){	REQUIRE(DNS_RDATASET_VALID(rdataset));	REQUIRE(rdataset->methods != NULL);	if (rdataset->methods->getnoqname == NULL)		return (ISC_R_NOTIMPLEMENTED);	return((rdataset->methods->getnoqname)(rdataset, name, nsec, nsecsig));}/* * Additional cache stuff */isc_result_tdns_rdataset_getadditional(dns_rdataset_t *rdataset,			   dns_rdatasetadditional_t type,			   dns_rdatatype_t qtype,			   dns_acache_t *acache,			   dns_zone_t **zonep,			   dns_db_t **dbp,			   dns_dbversion_t **versionp,			   dns_dbnode_t **nodep,			   dns_name_t *fname,			   dns_message_t *msg,			   isc_stdtime_t now){	REQUIRE(DNS_RDATASET_VALID(rdataset));	REQUIRE(rdataset->methods != NULL);	REQUIRE(zonep == NULL || *zonep == NULL);	REQUIRE(dbp != NULL && *dbp == NULL);	REQUIRE(versionp != NULL && *versionp == NULL);	REQUIRE(nodep != NULL && *nodep == NULL);	REQUIRE(fname != NULL);	REQUIRE(msg != NULL);	if (acache != NULL && rdataset->methods->getadditional != NULL) {		return ((rdataset->methods->getadditional)(rdataset, type,							   qtype, acache,							   zonep, dbp,							   versionp, nodep,							   fname, msg, now));	}	return (ISC_R_FAILURE);}isc_result_tdns_rdataset_setadditional(dns_rdataset_t *rdataset,			   dns_rdatasetadditional_t type,			   dns_rdatatype_t qtype,			   dns_acache_t *acache,			   dns_zone_t *zone,			   dns_db_t *db,			   dns_dbversion_t *version,			   dns_dbnode_t *node,			   dns_name_t *fname){	REQUIRE(DNS_RDATASET_VALID(rdataset));	REQUIRE(rdataset->methods != NULL);	if (acache != NULL && rdataset->methods->setadditional != NULL) {		return ((rdataset->methods->setadditional)(rdataset, type,							   qtype, acache, zone,							   db, version,							   node, fname));	}	return (ISC_R_FAILURE);}isc_result_tdns_rdataset_putadditional(dns_acache_t *acache,			   dns_rdataset_t *rdataset,			   dns_rdatasetadditional_t type,			   dns_rdatatype_t qtype){	REQUIRE(DNS_RDATASET_VALID(rdataset));	REQUIRE(rdataset->methods != NULL);	if (acache != NULL && rdataset->methods->putadditional != NULL) {		return ((rdataset->methods->putadditional)(acache, rdataset,							   type, qtype));	}	return (ISC_R_FAILURE);}

⌨️ 快捷键说明

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