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:
parent
ef4b66d355
commit
1c724c986d
@ -65,6 +65,8 @@ typedef struct dns_rdatasetmethods {
|
||||
dns_result_t (*next)(dns_rdataset_t *rdataset);
|
||||
void (*current)(dns_rdataset_t *rdataset,
|
||||
dns_rdata_t *rdata);
|
||||
void (*clone)(dns_rdataset_t *source,
|
||||
dns_rdataset_t *target);
|
||||
} dns_rdatasetmethods_t;
|
||||
|
||||
#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.
|
||||
*/
|
||||
|
||||
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_rdataset_first(dns_rdataset_t *rdataset);
|
||||
/*
|
||||
|
@ -171,16 +171,18 @@ typedef struct {
|
||||
isc_stdtime_t now;
|
||||
} 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_next(dns_rdataset_t *rdataset);
|
||||
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 = {
|
||||
rdataset_disassociate,
|
||||
rdataset_first,
|
||||
rdataset_next,
|
||||
rdataset_current
|
||||
rdataset_current,
|
||||
rdataset_clone
|
||||
};
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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
|
||||
|
@ -27,12 +27,14 @@ static void disassociate(dns_rdataset_t *rdatasetp);
|
||||
static dns_result_t first(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 clone(dns_rdataset_t *source, dns_rdataset_t *target);
|
||||
|
||||
static dns_rdatasetmethods_t methods = {
|
||||
disassociate,
|
||||
first,
|
||||
next,
|
||||
current
|
||||
current,
|
||||
clone
|
||||
};
|
||||
|
||||
dns_result_t
|
||||
@ -104,3 +106,13 @@ current(dns_rdataset_t *rdataset, dns_rdata_t *rdata) {
|
||||
*rdata = *list_rdata;
|
||||
ISC_LINK_INIT(rdata, link);
|
||||
}
|
||||
|
||||
static void
|
||||
clone(dns_rdataset_t *source, dns_rdataset_t *target) {
|
||||
*target = *source;
|
||||
|
||||
/*
|
||||
* Reset iterator state.
|
||||
*/
|
||||
target->private2 = NULL;
|
||||
}
|
||||
|
@ -122,11 +122,17 @@ question_current(dns_rdataset_t *rdataset, dns_rdata_t *rdata) {
|
||||
REQUIRE(0);
|
||||
}
|
||||
|
||||
static void
|
||||
question_clone(dns_rdataset_t *source, dns_rdataset_t *target) {
|
||||
*target = *source;
|
||||
}
|
||||
|
||||
static dns_rdatasetmethods_t question_methods = {
|
||||
question_disassociate,
|
||||
question_cursor,
|
||||
question_cursor,
|
||||
question_current
|
||||
question_current,
|
||||
question_clone
|
||||
};
|
||||
|
||||
void
|
||||
@ -148,6 +154,21 @@ dns_rdataset_makequestion(dns_rdataset_t *rdataset, dns_rdataclass_t rdclass,
|
||||
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_rdataset_first(dns_rdataset_t *rdataset) {
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user