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);
|
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);
|
||||||
/*
|
/*
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
@ -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) {
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user