rdataset.h revision 205292
1/* 2 * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC") 3 * Copyright (C) 1999-2003 Internet Software Consortium. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 10 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 11 * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 12 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 13 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 14 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 15 * PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18/* $Id: rdataset.h,v 1.65.50.2.22.2 2010/02/25 10:57:12 tbox Exp $ */ 19 20#ifndef DNS_RDATASET_H 21#define DNS_RDATASET_H 1 22 23/***** 24 ***** Module Info 25 *****/ 26 27/*! \file dns/rdataset.h 28 * \brief 29 * A DNS rdataset is a handle that can be associated with a collection of 30 * rdata all having a common owner name, class, and type. 31 * 32 * The dns_rdataset_t type is like a "virtual class". To actually use 33 * rdatasets, an implementation of the method suite (e.g. "slabbed rdata") is 34 * required. 35 * 36 * XXX <more> XXX 37 * 38 * MP: 39 *\li Clients of this module must impose any required synchronization. 40 * 41 * Reliability: 42 *\li No anticipated impact. 43 * 44 * Resources: 45 *\li TBS 46 * 47 * Security: 48 *\li No anticipated impact. 49 * 50 * Standards: 51 *\li None. 52 */ 53 54#include <isc/lang.h> 55#include <isc/magic.h> 56#include <isc/stdtime.h> 57 58#include <dns/types.h> 59 60ISC_LANG_BEGINDECLS 61 62typedef enum { 63 dns_rdatasetadditional_fromauth, 64 dns_rdatasetadditional_fromcache, 65 dns_rdatasetadditional_fromglue 66} dns_rdatasetadditional_t; 67 68typedef struct dns_rdatasetmethods { 69 void (*disassociate)(dns_rdataset_t *rdataset); 70 isc_result_t (*first)(dns_rdataset_t *rdataset); 71 isc_result_t (*next)(dns_rdataset_t *rdataset); 72 void (*current)(dns_rdataset_t *rdataset, 73 dns_rdata_t *rdata); 74 void (*clone)(dns_rdataset_t *source, 75 dns_rdataset_t *target); 76 unsigned int (*count)(dns_rdataset_t *rdataset); 77 isc_result_t (*addnoqname)(dns_rdataset_t *rdataset, 78 dns_name_t *name); 79 isc_result_t (*getnoqname)(dns_rdataset_t *rdataset, 80 dns_name_t *name, 81 dns_rdataset_t *neg, 82 dns_rdataset_t *negsig); 83 isc_result_t (*addclosest)(dns_rdataset_t *rdataset, 84 dns_name_t *name); 85 isc_result_t (*getclosest)(dns_rdataset_t *rdataset, 86 dns_name_t *name, 87 dns_rdataset_t *neg, 88 dns_rdataset_t *negsig); 89 isc_result_t (*getadditional)(dns_rdataset_t *rdataset, 90 dns_rdatasetadditional_t type, 91 dns_rdatatype_t qtype, 92 dns_acache_t *acache, 93 dns_zone_t **zonep, 94 dns_db_t **dbp, 95 dns_dbversion_t **versionp, 96 dns_dbnode_t **nodep, 97 dns_name_t *fname, 98 dns_message_t *msg, 99 isc_stdtime_t now); 100 isc_result_t (*setadditional)(dns_rdataset_t *rdataset, 101 dns_rdatasetadditional_t type, 102 dns_rdatatype_t qtype, 103 dns_acache_t *acache, 104 dns_zone_t *zone, 105 dns_db_t *db, 106 dns_dbversion_t *version, 107 dns_dbnode_t *node, 108 dns_name_t *fname); 109 isc_result_t (*putadditional)(dns_acache_t *acache, 110 dns_rdataset_t *rdataset, 111 dns_rdatasetadditional_t type, 112 dns_rdatatype_t qtype); 113 void (*settrust)(dns_rdataset_t *rdataset, 114 dns_trust_t trust); 115 void (*expire)(dns_rdataset_t *rdataset); 116} dns_rdatasetmethods_t; 117 118#define DNS_RDATASET_MAGIC ISC_MAGIC('D','N','S','R') 119#define DNS_RDATASET_VALID(set) ISC_MAGIC_VALID(set, DNS_RDATASET_MAGIC) 120 121/*% 122 * Direct use of this structure by clients is strongly discouraged, except 123 * for the 'link' field which may be used however the client wishes. The 124 * 'private', 'current', and 'index' fields MUST NOT be changed by clients. 125 * rdataset implementations may change any of the fields. 126 */ 127struct dns_rdataset { 128 unsigned int magic; /* XXX ? */ 129 dns_rdatasetmethods_t * methods; 130 ISC_LINK(dns_rdataset_t) link; 131 /* 132 * XXX do we need these, or should they be retrieved by methods? 133 * Leaning towards the latter, since they are not frequently required 134 * once you have the rdataset. 135 */ 136 dns_rdataclass_t rdclass; 137 dns_rdatatype_t type; 138 dns_ttl_t ttl; 139 dns_trust_t trust; 140 dns_rdatatype_t covers; 141 /* 142 * attributes 143 */ 144 unsigned int attributes; 145 /*% 146 * the counter provides the starting point in the "cyclic" order. 147 * The value ISC_UINT32_MAX has a special meaning of "picking up a 148 * random value." in order to take care of databases that do not 149 * increment the counter. 150 */ 151 isc_uint32_t count; 152 /* 153 * This RRSIG RRset should be re-generated around this time. 154 * Only valid if DNS_RDATASETATTR_RESIGN is set in attributes. 155 */ 156 isc_stdtime_t resign; 157 /*@{*/ 158 /*% 159 * These are for use by the rdataset implementation, and MUST NOT 160 * be changed by clients. 161 */ 162 void * private1; 163 void * private2; 164 void * private3; 165 unsigned int privateuint4; 166 void * private5; 167 void * private6; 168 void * private7; 169 /*@}*/ 170 171}; 172 173/*! 174 * \def DNS_RDATASETATTR_RENDERED 175 * Used by message.c to indicate that the rdataset was rendered. 176 * 177 * \def DNS_RDATASETATTR_TTLADJUSTED 178 * Used by message.c to indicate that the rdataset's rdata had differing 179 * TTL values, and the rdataset->ttl holds the smallest. 180 * 181 * \def DNS_RDATASETATTR_LOADORDER 182 * Output the RRset in load order. 183 */ 184 185#define DNS_RDATASETATTR_QUESTION 0x00000001 186#define DNS_RDATASETATTR_RENDERED 0x00000002 /*%< Used by message.c */ 187#define DNS_RDATASETATTR_ANSWERED 0x00000004 /*%< Used by server. */ 188#define DNS_RDATASETATTR_CACHE 0x00000008 /*%< Used by resolver. */ 189#define DNS_RDATASETATTR_ANSWER 0x00000010 /*%< Used by resolver. */ 190#define DNS_RDATASETATTR_ANSWERSIG 0x00000020 /*%< Used by resolver. */ 191#define DNS_RDATASETATTR_EXTERNAL 0x00000040 /*%< Used by resolver. */ 192#define DNS_RDATASETATTR_NCACHE 0x00000080 /*%< Used by resolver. */ 193#define DNS_RDATASETATTR_CHAINING 0x00000100 /*%< Used by resolver. */ 194#define DNS_RDATASETATTR_TTLADJUSTED 0x00000200 /*%< Used by message.c */ 195#define DNS_RDATASETATTR_FIXEDORDER 0x00000400 196#define DNS_RDATASETATTR_RANDOMIZE 0x00000800 197#define DNS_RDATASETATTR_CHASE 0x00001000 /*%< Used by resolver. */ 198#define DNS_RDATASETATTR_NXDOMAIN 0x00002000 199#define DNS_RDATASETATTR_NOQNAME 0x00004000 200#define DNS_RDATASETATTR_CHECKNAMES 0x00008000 /*%< Used by resolver. */ 201#define DNS_RDATASETATTR_REQUIREDGLUE 0x00010000 202#define DNS_RDATASETATTR_LOADORDER 0x00020000 203#define DNS_RDATASETATTR_RESIGN 0x00040000 204#define DNS_RDATASETATTR_CLOSEST 0x00080000 205#define DNS_RDATASETATTR_OPTOUT 0x00100000 /*%< OPTOUT proof */ 206 207/*% 208 * _OMITDNSSEC: 209 * Omit DNSSEC records when rendering ncache records. 210 */ 211#define DNS_RDATASETTOWIRE_OMITDNSSEC 0x0001 212 213void 214dns_rdataset_init(dns_rdataset_t *rdataset); 215/*%< 216 * Make 'rdataset' a valid, disassociated rdataset. 217 * 218 * Requires: 219 *\li 'rdataset' is not NULL. 220 * 221 * Ensures: 222 *\li 'rdataset' is a valid, disassociated rdataset. 223 */ 224 225void 226dns_rdataset_invalidate(dns_rdataset_t *rdataset); 227/*%< 228 * Invalidate 'rdataset'. 229 * 230 * Requires: 231 *\li 'rdataset' is a valid, disassociated rdataset. 232 * 233 * Ensures: 234 *\li If assertion checking is enabled, future attempts to use 'rdataset' 235 * without initializing it will cause an assertion failure. 236 */ 237 238void 239dns_rdataset_disassociate(dns_rdataset_t *rdataset); 240/*%< 241 * Disassociate 'rdataset' from its rdata, allowing it to be reused. 242 * 243 * Notes: 244 *\li The client must ensure it has no references to rdata in the rdataset 245 * before disassociating. 246 * 247 * Requires: 248 *\li 'rdataset' is a valid, associated rdataset. 249 * 250 * Ensures: 251 *\li 'rdataset' is a valid, disassociated rdataset. 252 */ 253 254isc_boolean_t 255dns_rdataset_isassociated(dns_rdataset_t *rdataset); 256/*%< 257 * Is 'rdataset' associated? 258 * 259 * Requires: 260 *\li 'rdataset' is a valid rdataset. 261 * 262 * Returns: 263 *\li #ISC_TRUE 'rdataset' is associated. 264 *\li #ISC_FALSE 'rdataset' is not associated. 265 */ 266 267void 268dns_rdataset_makequestion(dns_rdataset_t *rdataset, dns_rdataclass_t rdclass, 269 dns_rdatatype_t type); 270/*%< 271 * Make 'rdataset' a valid, associated, question rdataset, with a 272 * question class of 'rdclass' and type 'type'. 273 * 274 * Notes: 275 *\li Question rdatasets have a class and type, but no rdata. 276 * 277 * Requires: 278 *\li 'rdataset' is a valid, disassociated rdataset. 279 * 280 * Ensures: 281 *\li 'rdataset' is a valid, associated, question rdataset. 282 */ 283 284void 285dns_rdataset_clone(dns_rdataset_t *source, dns_rdataset_t *target); 286/*%< 287 * Make 'target' refer to the same rdataset as 'source'. 288 * 289 * Requires: 290 *\li 'source' is a valid, associated rdataset. 291 * 292 *\li 'target' is a valid, dissociated rdataset. 293 * 294 * Ensures: 295 *\li 'target' references the same rdataset as 'source'. 296 */ 297 298unsigned int 299dns_rdataset_count(dns_rdataset_t *rdataset); 300/*%< 301 * Return the number of records in 'rdataset'. 302 * 303 * Requires: 304 *\li 'rdataset' is a valid, associated rdataset. 305 * 306 * Returns: 307 *\li The number of records in 'rdataset'. 308 */ 309 310isc_result_t 311dns_rdataset_first(dns_rdataset_t *rdataset); 312/*%< 313 * Move the rdata cursor to the first rdata in the rdataset (if any). 314 * 315 * Requires: 316 *\li 'rdataset' is a valid, associated rdataset. 317 * 318 * Returns: 319 *\li #ISC_R_SUCCESS 320 *\li #ISC_R_NOMORE There are no rdata in the set. 321 */ 322 323isc_result_t 324dns_rdataset_next(dns_rdataset_t *rdataset); 325/*%< 326 * Move the rdata cursor to the next rdata in the rdataset (if any). 327 * 328 * Requires: 329 *\li 'rdataset' is a valid, associated rdataset. 330 * 331 * Returns: 332 *\li #ISC_R_SUCCESS 333 *\li #ISC_R_NOMORE There are no more rdata in the set. 334 */ 335 336void 337dns_rdataset_current(dns_rdataset_t *rdataset, dns_rdata_t *rdata); 338/*%< 339 * Make 'rdata' refer to the current rdata. 340 * 341 * Notes: 342 * 343 *\li The data returned in 'rdata' is valid for the life of the 344 * rdataset; in particular, subsequent changes in the cursor position 345 * do not invalidate 'rdata'. 346 * 347 * Requires: 348 *\li 'rdataset' is a valid, associated rdataset. 349 * 350 *\li The rdata cursor of 'rdataset' is at a valid location (i.e. the 351 * result of last call to a cursor movement command was ISC_R_SUCCESS). 352 * 353 * Ensures: 354 *\li 'rdata' refers to the rdata at the rdata cursor location of 355 *\li 'rdataset'. 356 */ 357 358isc_result_t 359dns_rdataset_totext(dns_rdataset_t *rdataset, 360 dns_name_t *owner_name, 361 isc_boolean_t omit_final_dot, 362 isc_boolean_t question, 363 isc_buffer_t *target); 364/*%< 365 * Convert 'rdataset' to text format, storing the result in 'target'. 366 * 367 * Notes: 368 *\li The rdata cursor position will be changed. 369 * 370 *\li The 'question' flag should normally be #ISC_FALSE. If it is 371 * #ISC_TRUE, the TTL and rdata fields are not printed. This is 372 * for use when printing an rdata representing a question section. 373 * 374 *\li This interface is deprecated; use dns_master_rdatasettottext() 375 * and/or dns_master_questiontotext() instead. 376 * 377 * Requires: 378 *\li 'rdataset' is a valid rdataset. 379 * 380 *\li 'rdataset' is not empty. 381 */ 382 383isc_result_t 384dns_rdataset_towire(dns_rdataset_t *rdataset, 385 dns_name_t *owner_name, 386 dns_compress_t *cctx, 387 isc_buffer_t *target, 388 unsigned int options, 389 unsigned int *countp); 390/*%< 391 * Convert 'rdataset' to wire format, compressing names as specified 392 * in 'cctx', and storing the result in 'target'. 393 * 394 * Notes: 395 *\li The rdata cursor position will be changed. 396 * 397 *\li The number of RRs added to target will be added to *countp. 398 * 399 * Requires: 400 *\li 'rdataset' is a valid rdataset. 401 * 402 *\li 'rdataset' is not empty. 403 * 404 *\li 'countp' is a valid pointer. 405 * 406 * Ensures: 407 *\li On a return of ISC_R_SUCCESS, 'target' contains a wire format 408 * for the data contained in 'rdataset'. Any error return leaves 409 * the buffer unchanged. 410 * 411 *\li *countp has been incremented by the number of RRs added to 412 * target. 413 * 414 * Returns: 415 *\li #ISC_R_SUCCESS - all ok 416 *\li #ISC_R_NOSPACE - 'target' doesn't have enough room 417 * 418 *\li Any error returned by dns_rdata_towire(), dns_rdataset_next(), 419 * dns_name_towire(). 420 */ 421 422isc_result_t 423dns_rdataset_towiresorted(dns_rdataset_t *rdataset, 424 const dns_name_t *owner_name, 425 dns_compress_t *cctx, 426 isc_buffer_t *target, 427 dns_rdatasetorderfunc_t order, 428 const void *order_arg, 429 unsigned int options, 430 unsigned int *countp); 431/*%< 432 * Like dns_rdataset_towire(), but sorting the rdatasets according to 433 * the integer value returned by 'order' when called with the rdataset 434 * and 'order_arg' as arguments. 435 * 436 * Requires: 437 *\li All the requirements of dns_rdataset_towire(), and 438 * that order_arg is NULL if and only if order is NULL. 439 */ 440 441isc_result_t 442dns_rdataset_towirepartial(dns_rdataset_t *rdataset, 443 const dns_name_t *owner_name, 444 dns_compress_t *cctx, 445 isc_buffer_t *target, 446 dns_rdatasetorderfunc_t order, 447 const void *order_arg, 448 unsigned int options, 449 unsigned int *countp, 450 void **state); 451/*%< 452 * Like dns_rdataset_towiresorted() except that a partial rdataset 453 * may be written. 454 * 455 * Requires: 456 *\li All the requirements of dns_rdataset_towiresorted(). 457 * If 'state' is non NULL then the current position in the 458 * rdataset will be remembered if the rdataset in not 459 * completely written and should be passed on on subsequent 460 * calls (NOT CURRENTLY IMPLEMENTED). 461 * 462 * Returns: 463 *\li #ISC_R_SUCCESS if all of the records were written. 464 *\li #ISC_R_NOSPACE if unable to fit in all of the records. *countp 465 * will be updated to reflect the number of records 466 * written. 467 */ 468 469isc_result_t 470dns_rdataset_additionaldata(dns_rdataset_t *rdataset, 471 dns_additionaldatafunc_t add, void *arg); 472/*%< 473 * For each rdata in rdataset, call 'add' for each name and type in the 474 * rdata which is subject to additional section processing. 475 * 476 * Requires: 477 * 478 *\li 'rdataset' is a valid, non-question rdataset. 479 * 480 *\li 'add' is a valid dns_additionaldatafunc_t 481 * 482 * Ensures: 483 * 484 *\li If successful, dns_rdata_additionaldata() will have been called for 485 * each rdata in 'rdataset'. 486 * 487 *\li If a call to dns_rdata_additionaldata() is not successful, the 488 * result returned will be the result of dns_rdataset_additionaldata(). 489 * 490 * Returns: 491 * 492 *\li #ISC_R_SUCCESS 493 * 494 *\li Any error that dns_rdata_additionaldata() can return. 495 */ 496 497isc_result_t 498dns_rdataset_getnoqname(dns_rdataset_t *rdataset, dns_name_t *name, 499 dns_rdataset_t *neg, dns_rdataset_t *negsig); 500/*%< 501 * Return the noqname proof for this record. 502 * 503 * Requires: 504 *\li 'rdataset' to be valid and #DNS_RDATASETATTR_NOQNAME to be set. 505 *\li 'name' to be valid. 506 *\li 'neg' and 'negsig' to be valid and not associated. 507 */ 508 509isc_result_t 510dns_rdataset_addnoqname(dns_rdataset_t *rdataset, dns_name_t *name); 511/*%< 512 * Associate a noqname proof with this record. 513 * Sets #DNS_RDATASETATTR_NOQNAME if successful. 514 * Adjusts the 'rdataset->ttl' to minimum of the 'rdataset->ttl' and 515 * the 'nsec'/'nsec3' and 'rrsig(nsec)'/'rrsig(nsec3)' ttl. 516 * 517 * Requires: 518 *\li 'rdataset' to be valid and #DNS_RDATASETATTR_NOQNAME to be set. 519 *\li 'name' to be valid and have NSEC or NSEC3 and associated RRSIG 520 * rdatasets. 521 */ 522 523isc_result_t 524dns_rdataset_getclosest(dns_rdataset_t *rdataset, dns_name_t *name, 525 dns_rdataset_t *nsec, dns_rdataset_t *nsecsig); 526/*%< 527 * Return the closest encloser for this record. 528 * 529 * Requires: 530 *\li 'rdataset' to be valid and #DNS_RDATASETATTR_CLOSEST to be set. 531 *\li 'name' to be valid. 532 *\li 'nsec' and 'nsecsig' to be valid and not associated. 533 */ 534 535isc_result_t 536dns_rdataset_addclosest(dns_rdataset_t *rdataset, dns_name_t *name); 537/*%< 538 * Associate a closest encloset proof with this record. 539 * Sets #DNS_RDATASETATTR_CLOSEST if successful. 540 * Adjusts the 'rdataset->ttl' to minimum of the 'rdataset->ttl' and 541 * the 'nsec' and 'rrsig(nsec)' ttl. 542 * 543 * Requires: 544 *\li 'rdataset' to be valid and #DNS_RDATASETATTR_CLOSEST to be set. 545 *\li 'name' to be valid and have NSEC3 and RRSIG(NSEC3) rdatasets. 546 */ 547 548isc_result_t 549dns_rdataset_getadditional(dns_rdataset_t *rdataset, 550 dns_rdatasetadditional_t type, 551 dns_rdatatype_t qtype, 552 dns_acache_t *acache, 553 dns_zone_t **zonep, 554 dns_db_t **dbp, 555 dns_dbversion_t **versionp, 556 dns_dbnode_t **nodep, 557 dns_name_t *fname, 558 dns_message_t *msg, 559 isc_stdtime_t now); 560/*%< 561 * Get cached additional information from the DB node for a particular 562 * 'rdataset.' 'type' is one of dns_rdatasetadditional_fromauth, 563 * dns_rdatasetadditional_fromcache, and dns_rdatasetadditional_fromglue, 564 * which specifies the origin of the information. 'qtype' is intended to 565 * be used for specifying a particular rdata type in the cached information. 566 * 567 * Requires: 568 * \li 'rdataset' is a valid rdataset. 569 * \li 'acache' can be NULL, in which case this function will simply return 570 * ISC_R_FAILURE. 571 * \li For the other pointers, see dns_acache_getentry(). 572 * 573 * Ensures: 574 * \li See dns_acache_getentry(). 575 * 576 * Returns: 577 * \li #ISC_R_SUCCESS 578 * \li #ISC_R_FAILURE - additional information caching is not supported. 579 * \li #ISC_R_NOTFOUND - the corresponding DB node has not cached additional 580 * information for 'rdataset.' 581 * \li Any error that dns_acache_getentry() can return. 582 */ 583 584isc_result_t 585dns_rdataset_setadditional(dns_rdataset_t *rdataset, 586 dns_rdatasetadditional_t type, 587 dns_rdatatype_t qtype, 588 dns_acache_t *acache, 589 dns_zone_t *zone, 590 dns_db_t *db, 591 dns_dbversion_t *version, 592 dns_dbnode_t *node, 593 dns_name_t *fname); 594/*%< 595 * Set cached additional information to the DB node for a particular 596 * 'rdataset.' See dns_rdataset_getadditional for the semantics of 'type' 597 * and 'qtype'. 598 * 599 * Requires: 600 * \li 'rdataset' is a valid rdataset. 601 * \li 'acache' can be NULL, in which case this function will simply return 602 * ISC_R_FAILURE. 603 * \li For the other pointers, see dns_acache_setentry(). 604 * 605 * Ensures: 606 * \li See dns_acache_setentry(). 607 * 608 * Returns: 609 * \li #ISC_R_SUCCESS 610 * \li #ISC_R_FAILURE - additional information caching is not supported. 611 * \li #ISC_R_NOMEMORY 612 * \li Any error that dns_acache_setentry() can return. 613 */ 614 615isc_result_t 616dns_rdataset_putadditional(dns_acache_t *acache, 617 dns_rdataset_t *rdataset, 618 dns_rdatasetadditional_t type, 619 dns_rdatatype_t qtype); 620/*%< 621 * Discard cached additional information stored in the DB node for a particular 622 * 'rdataset.' See dns_rdataset_getadditional for the semantics of 'type' 623 * and 'qtype'. 624 * 625 * Requires: 626 * \li 'rdataset' is a valid rdataset. 627 * \li 'acache' can be NULL, in which case this function will simply return 628 * ISC_R_FAILURE. 629 * 630 * Ensures: 631 * \li See dns_acache_cancelentry(). 632 * 633 * Returns: 634 * \li #ISC_R_SUCCESS 635 * \li #ISC_R_FAILURE - additional information caching is not supported. 636 * \li #ISC_R_NOTFOUND - the corresponding DB node has not cached additional 637 * information for 'rdataset.' 638 */ 639 640void 641dns_rdataset_settrust(dns_rdataset_t *rdataset, dns_trust_t trust); 642/*%< 643 * Set the trust of the 'rdataset' to trust in any in the backing database. 644 * The local trust level of 'rdataset' is also set. 645 */ 646 647void 648dns_rdataset_expire(dns_rdataset_t *rdataset); 649/*%< 650 * Mark the rdataset to be expired in the backing database. 651 */ 652 653ISC_LANG_ENDDECLS 654 655#endif /* DNS_RDATASET_H */ 656