From 1c724c986de1449e3b2f1eeae4c724dc0d97603c Mon Sep 17 00:00:00 2001 From: Bob Halley Date: Tue, 13 Jul 1999 01:50:22 +0000 Subject: [PATCH] add rdataset cloning --- lib/dns/include/dns/rdataset.h | 16 ++++++++++++++++ lib/dns/rbtdb.c | 22 ++++++++++++++++++++-- lib/dns/rdatalist.c | 14 +++++++++++++- lib/dns/rdataset.c | 23 ++++++++++++++++++++++- 4 files changed, 71 insertions(+), 4 deletions(-) diff --git a/lib/dns/include/dns/rdataset.h b/lib/dns/include/dns/rdataset.h index 120353ff9e..a069acac26 100644 --- a/lib/dns/include/dns/rdataset.h +++ b/lib/dns/include/dns/rdataset.h @@ -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); /* diff --git a/lib/dns/rbtdb.c b/lib/dns/rbtdb.c index c695b3d12f..2ee2d35fdd 100644 --- a/lib/dns/rbtdb.c +++ b/lib/dns/rbtdb.c @@ -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 diff --git a/lib/dns/rdatalist.c b/lib/dns/rdatalist.c index a5e73074b2..9c75f856ee 100644 --- a/lib/dns/rdatalist.c +++ b/lib/dns/rdatalist.c @@ -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; +} diff --git a/lib/dns/rdataset.c b/lib/dns/rdataset.c index 61f7ff798e..7317f6ea67 100644 --- a/lib/dns/rdataset.c +++ b/lib/dns/rdataset.c @@ -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) {