diff --git a/lib/dns/db.c b/lib/dns/db.c index 0f123d3671..deeeb41ac5 100644 --- a/lib/dns/db.c +++ b/lib/dns/db.c @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: db.c,v 1.63 2000/11/17 01:06:37 bwelling Exp $ */ +/* $Id: db.c,v 1.64 2000/11/30 13:19:04 marka Exp $ */ /*** *** Imports @@ -615,6 +615,8 @@ dns_db_addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version, REQUIRE(((db->attributes & DNS_DBATTR_CACHE) == 0 && version != NULL)|| ((db->attributes & DNS_DBATTR_CACHE) != 0 && version == NULL && (options & DNS_DBADD_MERGE) == 0)); + REQUIRE((options & DNS_DBADD_EXACT) == 0 || + (options & DNS_DBADD_MERGE) != 0); REQUIRE(DNS_RDATASET_VALID(rdataset)); REQUIRE(dns_rdataset_isassociated(rdataset)); REQUIRE(rdataset->rdclass == db->rdclass); diff --git a/lib/dns/include/dns/db.h b/lib/dns/include/dns/db.h index 6dbe403fe0..7ee53679d5 100644 --- a/lib/dns/include/dns/db.h +++ b/lib/dns/include/dns/db.h @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: db.h,v 1.60 2000/11/16 22:33:50 bwelling Exp $ */ +/* $Id: db.h,v 1.61 2000/11/30 13:19:08 marka Exp $ */ #ifndef DNS_DB_H #define DNS_DB_H 1 @@ -192,6 +192,7 @@ struct dns_db { */ #define DNS_DBADD_MERGE 0x01 #define DNS_DBADD_FORCE 0x02 +#define DNS_DBADD_EXACT 0x04 /***** ***** Methods @@ -1014,6 +1015,8 @@ dns_db_addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version, * without regard to trust levels. If not forcing the data, then the * rdataset will only be added if its trust level is >= the trust level of * any existing rdataset. Forcing is only meaningful for cache databases. + * If DNS_DBADD_EXACT is set then there must be no rdata in common between + * the old and new rdata sets. * * The 'now' field is ignored if 'db' is a zone database. If 'db' is * a cache database, then the added rdataset will expire no later than diff --git a/lib/dns/include/dns/rdataslab.h b/lib/dns/include/dns/rdataslab.h index 2a5683d54e..77d7c077bd 100644 --- a/lib/dns/include/dns/rdataslab.h +++ b/lib/dns/include/dns/rdataslab.h @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rdataslab.h,v 1.16 2000/10/18 23:53:30 marka Exp $ */ +/* $Id: rdataslab.h,v 1.17 2000/11/30 13:19:09 marka Exp $ */ #ifndef DNS_RDATASLAB_H #define DNS_RDATASLAB_H 1 @@ -55,6 +55,9 @@ ISC_LANG_BEGINDECLS +#define DNS_RDATASLAB_FORCE 0x1 +#define DNS_RDATASLAB_EXACT 0x2 + /*** *** Functions ***/ @@ -96,11 +99,12 @@ isc_result_t dns_rdataslab_merge(unsigned char *oslab, unsigned char *nslab, unsigned int reservelen, isc_mem_t *mctx, dns_rdataclass_t rdclass, dns_rdatatype_t type, - isc_boolean_t force, unsigned char **tslabp); + unsigned int flags, unsigned char **tslabp); /* * Merge 'oslab' and 'nslab'. * * XXX + * DNS_RDATASLAB_FORCE and DNS_RDATASLAB_EXACT are mutually exclusive. */ isc_result_t diff --git a/lib/dns/journal.c b/lib/dns/journal.c index 63ae5ecac4..b2a1937d61 100644 --- a/lib/dns/journal.c +++ b/lib/dns/journal.c @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: journal.c,v 1.63 2000/11/14 23:29:50 bwelling Exp $ */ +/* $Id: journal.c,v 1.64 2000/11/30 13:19:05 marka Exp $ */ #include @@ -397,7 +397,8 @@ dns_diff_apply(dns_diff_t *diff, dns_db_t *db, dns_dbversion_t *ver) if (op == DNS_DIFFOP_ADD) { result = dns_db_addrdataset(db, node, ver, 0, &rds, - DNS_DBADD_MERGE, + DNS_DBADD_MERGE| + DNS_DBADD_EXACT, NULL); } else if (op == DNS_DIFFOP_DEL) { result = dns_db_subtractrdataset(db, node, ver, diff --git a/lib/dns/rbtdb.c b/lib/dns/rbtdb.c index c23afa00e6..a94371913e 100644 --- a/lib/dns/rbtdb.c +++ b/lib/dns/rbtdb.c @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rbtdb.c,v 1.134 2000/11/22 01:56:02 halley Exp $ */ +/* $Id: rbtdb.c,v 1.135 2000/11/30 13:19:06 marka Exp $ */ /* * Principal Author: Bob Halley @@ -3108,7 +3108,6 @@ add(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion, rdatasetheader_t *topheader, *topheader_prev, *header; unsigned char *merged; isc_result_t result; - isc_boolean_t force = ISC_FALSE; isc_boolean_t header_nx; isc_boolean_t newheader_nx; isc_boolean_t merge; @@ -3274,10 +3273,13 @@ add(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion, * that is the union of 'newheader' and 'header'. */ if (merge) { + unsigned int flags = 0; INSIST(rbtversion->serial >= header->serial); merged = NULL; + if ((options & DNS_DBADD_EXACT) != 0) + flags |= DNS_RDATASLAB_EXACT; if (newheader->ttl != header->ttl) - force = ISC_TRUE; + flags |= DNS_RDATASLAB_FORCE; result = dns_rdataslab_merge( (unsigned char *)header, (unsigned char *)newheader, @@ -3285,8 +3287,7 @@ add(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion, rbtdb->common.mctx, rbtdb->common.rdclass, (dns_rdatatype_t)header->type, - force, - &merged); + flags, &merged); if (result == ISC_R_SUCCESS) { /* * If 'header' has the same serial number as