2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-22 18:19:42 +00:00

add rdataset cloning

This commit is contained in:
Bob Halley 1999-07-13 01:50:22 +00:00
parent ef4b66d355
commit 1c724c986d
4 changed files with 71 additions and 4 deletions

View File

@ -65,6 +65,8 @@ typedef struct dns_rdatasetmethods {
dns_result_t (*next)(dns_rdataset_t *rdataset); dns_result_t (*next)(dns_rdataset_t *rdataset);
void (*current)(dns_rdataset_t *rdataset, void (*current)(dns_rdataset_t *rdataset,
dns_rdata_t *rdata); dns_rdata_t *rdata);
void (*clone)(dns_rdataset_t *source,
dns_rdataset_t *target);
} dns_rdatasetmethods_t; } dns_rdatasetmethods_t;
#define DNS_RDATASET_MAGIC 0x444E5352U /* DNSR. */ #define DNS_RDATASET_MAGIC 0x444E5352U /* DNSR. */
@ -167,6 +169,20 @@ dns_rdataset_makequestion(dns_rdataset_t *rdataset, dns_rdataclass_t rdclass,
* 'rdataset' is a valid, associated, question rdataset. * 'rdataset' is a valid, associated, question rdataset.
*/ */
void
dns_rdataset_clone(dns_rdataset_t *source, dns_rdataset_t *target);
/*
* Make 'target' refer to the same rdataset as 'source'.
*
* Requires:
* 'source' is a valid, associated rdataset.
*
* 'target' is a valid, dissociated rdataset.
*
* Ensures:
* 'target' references the same rdataset as 'source.
*/
dns_result_t dns_result_t
dns_rdataset_first(dns_rdataset_t *rdataset); dns_rdataset_first(dns_rdataset_t *rdataset);
/* /*

View File

@ -171,16 +171,18 @@ typedef struct {
isc_stdtime_t now; isc_stdtime_t now;
} rbtdb_load_t; } rbtdb_load_t;
static void rdataset_disassociate(dns_rdataset_t *rdatasetp); static void rdataset_disassociate(dns_rdataset_t *rdataset);
static dns_result_t rdataset_first(dns_rdataset_t *rdataset); static dns_result_t rdataset_first(dns_rdataset_t *rdataset);
static dns_result_t rdataset_next(dns_rdataset_t *rdataset); static dns_result_t rdataset_next(dns_rdataset_t *rdataset);
static void rdataset_current(dns_rdataset_t *rdataset, dns_rdata_t *rdata); static void rdataset_current(dns_rdataset_t *rdataset, dns_rdata_t *rdata);
static void rdataset_clone(dns_rdataset_t *source, dns_rdataset_t *target);
static dns_rdatasetmethods_t rdataset_methods = { static dns_rdatasetmethods_t rdataset_methods = {
rdataset_disassociate, rdataset_disassociate,
rdataset_first, rdataset_first,
rdataset_next, rdataset_next,
rdataset_current rdataset_current,
rdataset_clone
}; };
static void rdatasetiter_destroy(dns_rdatasetiter_t **iteratorp); static void rdatasetiter_destroy(dns_rdatasetiter_t **iteratorp);
@ -3105,6 +3107,22 @@ rdataset_current(dns_rdataset_t *rdataset, dns_rdata_t *rdata) {
dns_rdata_fromregion(rdata, rdataset->rdclass, rdataset->type, &r); dns_rdata_fromregion(rdata, rdataset->rdclass, rdataset->type, &r);
} }
static void
rdataset_clone(dns_rdataset_t *source, dns_rdataset_t *target) {
dns_db_t *db = source->private1;
dns_dbnode_t *node = source->private2;
dns_dbnode_t *cloned_node;
attachnode(db, &node, &cloned_node);
*target = *source;
/*
* Reset iterator state.
*/
target->private4 = NULL;
target->private5 = NULL;
}
/* /*
* Rdataset Iterator Methods * Rdataset Iterator Methods

View File

@ -27,12 +27,14 @@ static void disassociate(dns_rdataset_t *rdatasetp);
static dns_result_t first(dns_rdataset_t *rdataset); static dns_result_t first(dns_rdataset_t *rdataset);
static dns_result_t next(dns_rdataset_t *rdataset); static dns_result_t next(dns_rdataset_t *rdataset);
static void current(dns_rdataset_t *rdataset, dns_rdata_t *rdata); static void current(dns_rdataset_t *rdataset, dns_rdata_t *rdata);
static void clone(dns_rdataset_t *source, dns_rdataset_t *target);
static dns_rdatasetmethods_t methods = { static dns_rdatasetmethods_t methods = {
disassociate, disassociate,
first, first,
next, next,
current current,
clone
}; };
dns_result_t dns_result_t
@ -104,3 +106,13 @@ current(dns_rdataset_t *rdataset, dns_rdata_t *rdata) {
*rdata = *list_rdata; *rdata = *list_rdata;
ISC_LINK_INIT(rdata, link); ISC_LINK_INIT(rdata, link);
} }
static void
clone(dns_rdataset_t *source, dns_rdataset_t *target) {
*target = *source;
/*
* Reset iterator state.
*/
target->private2 = NULL;
}

View File

@ -122,11 +122,17 @@ question_current(dns_rdataset_t *rdataset, dns_rdata_t *rdata) {
REQUIRE(0); REQUIRE(0);
} }
static void
question_clone(dns_rdataset_t *source, dns_rdataset_t *target) {
*target = *source;
}
static dns_rdatasetmethods_t question_methods = { static dns_rdatasetmethods_t question_methods = {
question_disassociate, question_disassociate,
question_cursor, question_cursor,
question_cursor, question_cursor,
question_current question_current,
question_clone
}; };
void void
@ -148,6 +154,21 @@ dns_rdataset_makequestion(dns_rdataset_t *rdataset, dns_rdataclass_t rdclass,
rdataset->attributes |= DNS_RDATASETATTR_QUESTION; rdataset->attributes |= DNS_RDATASETATTR_QUESTION;
} }
void
dns_rdataset_clone(dns_rdataset_t *source, dns_rdataset_t *target) {
/*
* Make 'target' refer to the same rdataset as 'source'.
*/
REQUIRE(DNS_RDATASET_VALID(source));
REQUIRE(source->methods != NULL);
REQUIRE(DNS_RDATASET_VALID(target));
REQUIRE(target->methods == NULL);
(source->methods->clone)(source, target);
}
dns_result_t dns_result_t
dns_rdataset_first(dns_rdataset_t *rdataset) { dns_rdataset_first(dns_rdataset_t *rdataset) {