rdataset.h revision 222395
1135446Strhodes/*
2205292Sdougb * Copyright (C) 2004-2010  Internet Systems Consortium, Inc. ("ISC")
3135446Strhodes * Copyright (C) 1999-2003  Internet Software Consortium.
4135446Strhodes *
5193149Sdougb * Permission to use, copy, modify, and/or distribute this software for any
6135446Strhodes * purpose with or without fee is hereby granted, provided that the above
7135446Strhodes * copyright notice and this permission notice appear in all copies.
8135446Strhodes *
9135446Strhodes * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10135446Strhodes * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11135446Strhodes * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12135446Strhodes * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13135446Strhodes * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14135446Strhodes * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15135446Strhodes * PERFORMANCE OF THIS SOFTWARE.
16135446Strhodes */
17135446Strhodes
18222395Sdougb/* $Id: rdataset.h,v 1.65.50.4.6.1 2011-05-27 00:19:19 each Exp $ */
19135446Strhodes
20135446Strhodes#ifndef DNS_RDATASET_H
21135446Strhodes#define DNS_RDATASET_H 1
22135446Strhodes
23135446Strhodes/*****
24135446Strhodes ***** Module Info
25135446Strhodes *****/
26135446Strhodes
27193149Sdougb/*! \file dns/rdataset.h
28170222Sdougb * \brief
29135446Strhodes * A DNS rdataset is a handle that can be associated with a collection of
30135446Strhodes * rdata all having a common owner name, class, and type.
31135446Strhodes *
32135446Strhodes * The dns_rdataset_t type is like a "virtual class".  To actually use
33135446Strhodes * rdatasets, an implementation of the method suite (e.g. "slabbed rdata") is
34135446Strhodes * required.
35135446Strhodes *
36170222Sdougb * XXX <more> XXX
37135446Strhodes *
38135446Strhodes * MP:
39170222Sdougb *\li	Clients of this module must impose any required synchronization.
40135446Strhodes *
41135446Strhodes * Reliability:
42170222Sdougb *\li	No anticipated impact.
43135446Strhodes *
44135446Strhodes * Resources:
45170222Sdougb *\li	TBS
46135446Strhodes *
47135446Strhodes * Security:
48170222Sdougb *\li	No anticipated impact.
49135446Strhodes *
50135446Strhodes * Standards:
51170222Sdougb *\li	None.
52135446Strhodes */
53135446Strhodes
54135446Strhodes#include <isc/lang.h>
55135446Strhodes#include <isc/magic.h>
56170222Sdougb#include <isc/stdtime.h>
57135446Strhodes
58135446Strhodes#include <dns/types.h>
59135446Strhodes
60135446StrhodesISC_LANG_BEGINDECLS
61135446Strhodes
62170222Sdougbtypedef enum {
63170222Sdougb	dns_rdatasetadditional_fromauth,
64170222Sdougb	dns_rdatasetadditional_fromcache,
65170222Sdougb	dns_rdatasetadditional_fromglue
66170222Sdougb} dns_rdatasetadditional_t;
67170222Sdougb
68135446Strhodestypedef struct dns_rdatasetmethods {
69135446Strhodes	void			(*disassociate)(dns_rdataset_t *rdataset);
70135446Strhodes	isc_result_t		(*first)(dns_rdataset_t *rdataset);
71135446Strhodes	isc_result_t		(*next)(dns_rdataset_t *rdataset);
72135446Strhodes	void			(*current)(dns_rdataset_t *rdataset,
73135446Strhodes					   dns_rdata_t *rdata);
74135446Strhodes	void			(*clone)(dns_rdataset_t *source,
75135446Strhodes					 dns_rdataset_t *target);
76135446Strhodes	unsigned int		(*count)(dns_rdataset_t *rdataset);
77135446Strhodes	isc_result_t		(*addnoqname)(dns_rdataset_t *rdataset,
78135446Strhodes					      dns_name_t *name);
79135446Strhodes	isc_result_t		(*getnoqname)(dns_rdataset_t *rdataset,
80135446Strhodes					      dns_name_t *name,
81193149Sdougb					      dns_rdataset_t *neg,
82193149Sdougb					      dns_rdataset_t *negsig);
83193149Sdougb	isc_result_t		(*addclosest)(dns_rdataset_t *rdataset,
84193149Sdougb					      dns_name_t *name);
85193149Sdougb	isc_result_t		(*getclosest)(dns_rdataset_t *rdataset,
86193149Sdougb					      dns_name_t *name,
87193149Sdougb					      dns_rdataset_t *neg,
88193149Sdougb					      dns_rdataset_t *negsig);
89170222Sdougb	isc_result_t		(*getadditional)(dns_rdataset_t *rdataset,
90170222Sdougb						 dns_rdatasetadditional_t type,
91170222Sdougb						 dns_rdatatype_t qtype,
92170222Sdougb						 dns_acache_t *acache,
93170222Sdougb						 dns_zone_t **zonep,
94170222Sdougb						 dns_db_t **dbp,
95170222Sdougb						 dns_dbversion_t **versionp,
96170222Sdougb						 dns_dbnode_t **nodep,
97170222Sdougb						 dns_name_t *fname,
98170222Sdougb						 dns_message_t *msg,
99170222Sdougb						 isc_stdtime_t now);
100170222Sdougb	isc_result_t		(*setadditional)(dns_rdataset_t *rdataset,
101170222Sdougb						 dns_rdatasetadditional_t type,
102170222Sdougb						 dns_rdatatype_t qtype,
103170222Sdougb						 dns_acache_t *acache,
104170222Sdougb						 dns_zone_t *zone,
105170222Sdougb						 dns_db_t *db,
106170222Sdougb						 dns_dbversion_t *version,
107170222Sdougb						 dns_dbnode_t *node,
108170222Sdougb						 dns_name_t *fname);
109170222Sdougb	isc_result_t		(*putadditional)(dns_acache_t *acache,
110170222Sdougb						 dns_rdataset_t *rdataset,
111170222Sdougb						 dns_rdatasetadditional_t type,
112170222Sdougb						 dns_rdatatype_t qtype);
113205292Sdougb	void			(*settrust)(dns_rdataset_t *rdataset,
114205292Sdougb					    dns_trust_t trust);
115205292Sdougb	void			(*expire)(dns_rdataset_t *rdataset);
116135446Strhodes} dns_rdatasetmethods_t;
117135446Strhodes
118135446Strhodes#define DNS_RDATASET_MAGIC	       ISC_MAGIC('D','N','S','R')
119135446Strhodes#define DNS_RDATASET_VALID(set)	       ISC_MAGIC_VALID(set, DNS_RDATASET_MAGIC)
120135446Strhodes
121170222Sdougb/*%
122135446Strhodes * Direct use of this structure by clients is strongly discouraged, except
123135446Strhodes * for the 'link' field which may be used however the client wishes.  The
124135446Strhodes * 'private', 'current', and 'index' fields MUST NOT be changed by clients.
125135446Strhodes * rdataset implementations may change any of the fields.
126135446Strhodes */
127135446Strhodesstruct dns_rdataset {
128135446Strhodes	unsigned int			magic;		/* XXX ? */
129135446Strhodes	dns_rdatasetmethods_t *		methods;
130135446Strhodes	ISC_LINK(dns_rdataset_t)	link;
131135446Strhodes	/*
132135446Strhodes	 * XXX do we need these, or should they be retrieved by methods?
133135446Strhodes	 * Leaning towards the latter, since they are not frequently required
134135446Strhodes	 * once you have the rdataset.
135135446Strhodes	 */
136135446Strhodes	dns_rdataclass_t		rdclass;
137135446Strhodes	dns_rdatatype_t			type;
138135446Strhodes	dns_ttl_t			ttl;
139135446Strhodes	dns_trust_t			trust;
140135446Strhodes	dns_rdatatype_t			covers;
141135446Strhodes	/*
142135446Strhodes	 * attributes
143135446Strhodes	 */
144135446Strhodes	unsigned int			attributes;
145170222Sdougb	/*%
146135446Strhodes	 * the counter provides the starting point in the "cyclic" order.
147135446Strhodes	 * The value ISC_UINT32_MAX has a special meaning of "picking up a
148135446Strhodes	 * random value." in order to take care of databases that do not
149135446Strhodes	 * increment the counter.
150135446Strhodes	 */
151135446Strhodes	isc_uint32_t			count;
152193149Sdougb	/*
153193149Sdougb	 * This RRSIG RRset should be re-generated around this time.
154193149Sdougb	 * Only valid if DNS_RDATASETATTR_RESIGN is set in attributes.
155193149Sdougb	 */
156193149Sdougb	isc_stdtime_t			resign;
157170222Sdougb	/*@{*/
158170222Sdougb	/*%
159135446Strhodes	 * These are for use by the rdataset implementation, and MUST NOT
160135446Strhodes	 * be changed by clients.
161135446Strhodes	 */
162135446Strhodes	void *				private1;
163135446Strhodes	void *				private2;
164135446Strhodes	void *				private3;
165135446Strhodes	unsigned int			privateuint4;
166135446Strhodes	void *				private5;
167135446Strhodes	void *				private6;
168193149Sdougb	void *				private7;
169170222Sdougb	/*@}*/
170193149Sdougb
171135446Strhodes};
172135446Strhodes
173170222Sdougb/*!
174170222Sdougb * \def DNS_RDATASETATTR_RENDERED
175135446Strhodes *	Used by message.c to indicate that the rdataset was rendered.
176135446Strhodes *
177170222Sdougb * \def DNS_RDATASETATTR_TTLADJUSTED
178135446Strhodes *	Used by message.c to indicate that the rdataset's rdata had differing
179135446Strhodes *	TTL values, and the rdataset->ttl holds the smallest.
180170222Sdougb *
181170222Sdougb * \def DNS_RDATASETATTR_LOADORDER
182170222Sdougb *	Output the RRset in load order.
183135446Strhodes */
184170222Sdougb
185153816Sdougb#define DNS_RDATASETATTR_QUESTION	0x00000001
186170222Sdougb#define DNS_RDATASETATTR_RENDERED	0x00000002	/*%< Used by message.c */
187170222Sdougb#define DNS_RDATASETATTR_ANSWERED	0x00000004	/*%< Used by server. */
188170222Sdougb#define DNS_RDATASETATTR_CACHE		0x00000008	/*%< Used by resolver. */
189170222Sdougb#define DNS_RDATASETATTR_ANSWER		0x00000010	/*%< Used by resolver. */
190170222Sdougb#define DNS_RDATASETATTR_ANSWERSIG	0x00000020	/*%< Used by resolver. */
191170222Sdougb#define DNS_RDATASETATTR_EXTERNAL	0x00000040	/*%< Used by resolver. */
192170222Sdougb#define DNS_RDATASETATTR_NCACHE		0x00000080	/*%< Used by resolver. */
193170222Sdougb#define DNS_RDATASETATTR_CHAINING	0x00000100	/*%< Used by resolver. */
194170222Sdougb#define DNS_RDATASETATTR_TTLADJUSTED	0x00000200	/*%< Used by message.c */
195153816Sdougb#define DNS_RDATASETATTR_FIXEDORDER	0x00000400
196153816Sdougb#define DNS_RDATASETATTR_RANDOMIZE	0x00000800
197170222Sdougb#define DNS_RDATASETATTR_CHASE		0x00001000	/*%< Used by resolver. */
198153816Sdougb#define DNS_RDATASETATTR_NXDOMAIN	0x00002000
199153816Sdougb#define DNS_RDATASETATTR_NOQNAME	0x00004000
200170222Sdougb#define DNS_RDATASETATTR_CHECKNAMES	0x00008000	/*%< Used by resolver. */
201153816Sdougb#define DNS_RDATASETATTR_REQUIREDGLUE	0x00010000
202170222Sdougb#define DNS_RDATASETATTR_LOADORDER	0x00020000
203193149Sdougb#define DNS_RDATASETATTR_RESIGN		0x00040000
204193149Sdougb#define DNS_RDATASETATTR_CLOSEST	0x00080000
205193149Sdougb#define DNS_RDATASETATTR_OPTOUT		0x00100000	/*%< OPTOUT proof */
206135446Strhodes
207170222Sdougb/*%
208135446Strhodes * _OMITDNSSEC:
209135446Strhodes * 	Omit DNSSEC records when rendering ncache records.
210135446Strhodes */
211135446Strhodes#define DNS_RDATASETTOWIRE_OMITDNSSEC	0x0001
212135446Strhodes
213135446Strhodesvoid
214135446Strhodesdns_rdataset_init(dns_rdataset_t *rdataset);
215170222Sdougb/*%<
216135446Strhodes * Make 'rdataset' a valid, disassociated rdataset.
217135446Strhodes *
218135446Strhodes * Requires:
219170222Sdougb *\li	'rdataset' is not NULL.
220135446Strhodes *
221135446Strhodes * Ensures:
222170222Sdougb *\li	'rdataset' is a valid, disassociated rdataset.
223135446Strhodes */
224135446Strhodes
225135446Strhodesvoid
226135446Strhodesdns_rdataset_invalidate(dns_rdataset_t *rdataset);
227170222Sdougb/*%<
228135446Strhodes * Invalidate 'rdataset'.
229135446Strhodes *
230135446Strhodes * Requires:
231170222Sdougb *\li	'rdataset' is a valid, disassociated rdataset.
232135446Strhodes *
233135446Strhodes * Ensures:
234170222Sdougb *\li	If assertion checking is enabled, future attempts to use 'rdataset'
235135446Strhodes *	without initializing it will cause an assertion failure.
236135446Strhodes */
237135446Strhodes
238135446Strhodesvoid
239135446Strhodesdns_rdataset_disassociate(dns_rdataset_t *rdataset);
240170222Sdougb/*%<
241135446Strhodes * Disassociate 'rdataset' from its rdata, allowing it to be reused.
242135446Strhodes *
243135446Strhodes * Notes:
244170222Sdougb *\li	The client must ensure it has no references to rdata in the rdataset
245135446Strhodes *	before disassociating.
246135446Strhodes *
247135446Strhodes * Requires:
248170222Sdougb *\li	'rdataset' is a valid, associated rdataset.
249135446Strhodes *
250135446Strhodes * Ensures:
251170222Sdougb *\li	'rdataset' is a valid, disassociated rdataset.
252135446Strhodes */
253135446Strhodes
254135446Strhodesisc_boolean_t
255135446Strhodesdns_rdataset_isassociated(dns_rdataset_t *rdataset);
256170222Sdougb/*%<
257135446Strhodes * Is 'rdataset' associated?
258135446Strhodes *
259135446Strhodes * Requires:
260170222Sdougb *\li	'rdataset' is a valid rdataset.
261135446Strhodes *
262135446Strhodes * Returns:
263170222Sdougb *\li	#ISC_TRUE			'rdataset' is associated.
264170222Sdougb *\li	#ISC_FALSE			'rdataset' is not associated.
265135446Strhodes */
266135446Strhodes
267135446Strhodesvoid
268135446Strhodesdns_rdataset_makequestion(dns_rdataset_t *rdataset, dns_rdataclass_t rdclass,
269135446Strhodes			  dns_rdatatype_t type);
270170222Sdougb/*%<
271135446Strhodes * Make 'rdataset' a valid, associated, question rdataset, with a
272135446Strhodes * question class of 'rdclass' and type 'type'.
273135446Strhodes *
274135446Strhodes * Notes:
275170222Sdougb *\li	Question rdatasets have a class and type, but no rdata.
276135446Strhodes *
277135446Strhodes * Requires:
278170222Sdougb *\li	'rdataset' is a valid, disassociated rdataset.
279135446Strhodes *
280135446Strhodes * Ensures:
281170222Sdougb *\li	'rdataset' is a valid, associated, question rdataset.
282135446Strhodes */
283135446Strhodes
284135446Strhodesvoid
285135446Strhodesdns_rdataset_clone(dns_rdataset_t *source, dns_rdataset_t *target);
286170222Sdougb/*%<
287135446Strhodes * Make 'target' refer to the same rdataset as 'source'.
288135446Strhodes *
289135446Strhodes * Requires:
290170222Sdougb *\li	'source' is a valid, associated rdataset.
291135446Strhodes *
292170222Sdougb *\li	'target' is a valid, dissociated rdataset.
293135446Strhodes *
294135446Strhodes * Ensures:
295170222Sdougb *\li	'target' references the same rdataset as 'source'.
296135446Strhodes */
297135446Strhodes
298135446Strhodesunsigned int
299135446Strhodesdns_rdataset_count(dns_rdataset_t *rdataset);
300170222Sdougb/*%<
301135446Strhodes * Return the number of records in 'rdataset'.
302135446Strhodes *
303135446Strhodes * Requires:
304170222Sdougb *\li	'rdataset' is a valid, associated rdataset.
305135446Strhodes *
306135446Strhodes * Returns:
307170222Sdougb *\li	The number of records in 'rdataset'.
308135446Strhodes */
309135446Strhodes
310135446Strhodesisc_result_t
311135446Strhodesdns_rdataset_first(dns_rdataset_t *rdataset);
312170222Sdougb/*%<
313135446Strhodes * Move the rdata cursor to the first rdata in the rdataset (if any).
314135446Strhodes *
315135446Strhodes * Requires:
316170222Sdougb *\li	'rdataset' is a valid, associated rdataset.
317135446Strhodes *
318135446Strhodes * Returns:
319170222Sdougb *\li	#ISC_R_SUCCESS
320170222Sdougb *\li	#ISC_R_NOMORE			There are no rdata in the set.
321135446Strhodes */
322135446Strhodes
323135446Strhodesisc_result_t
324135446Strhodesdns_rdataset_next(dns_rdataset_t *rdataset);
325170222Sdougb/*%<
326135446Strhodes * Move the rdata cursor to the next rdata in the rdataset (if any).
327135446Strhodes *
328135446Strhodes * Requires:
329170222Sdougb *\li	'rdataset' is a valid, associated rdataset.
330135446Strhodes *
331135446Strhodes * Returns:
332170222Sdougb *\li	#ISC_R_SUCCESS
333170222Sdougb *\li	#ISC_R_NOMORE			There are no more rdata in the set.
334135446Strhodes */
335135446Strhodes
336135446Strhodesvoid
337135446Strhodesdns_rdataset_current(dns_rdataset_t *rdataset, dns_rdata_t *rdata);
338170222Sdougb/*%<
339135446Strhodes * Make 'rdata' refer to the current rdata.
340135446Strhodes *
341135446Strhodes * Notes:
342135446Strhodes *
343170222Sdougb *\li	The data returned in 'rdata' is valid for the life of the
344135446Strhodes *	rdataset; in particular, subsequent changes in the cursor position
345135446Strhodes *	do not invalidate 'rdata'.
346135446Strhodes *
347135446Strhodes * Requires:
348170222Sdougb *\li	'rdataset' is a valid, associated rdataset.
349135446Strhodes *
350170222Sdougb *\li	The rdata cursor of 'rdataset' is at a valid location (i.e. the
351135446Strhodes *	result of last call to a cursor movement command was ISC_R_SUCCESS).
352135446Strhodes *
353135446Strhodes * Ensures:
354170222Sdougb *\li	'rdata' refers to the rdata at the rdata cursor location of
355170222Sdougb *\li	'rdataset'.
356135446Strhodes */
357135446Strhodes
358135446Strhodesisc_result_t
359135446Strhodesdns_rdataset_totext(dns_rdataset_t *rdataset,
360135446Strhodes		    dns_name_t *owner_name,
361135446Strhodes		    isc_boolean_t omit_final_dot,
362135446Strhodes		    isc_boolean_t question,
363135446Strhodes		    isc_buffer_t *target);
364170222Sdougb/*%<
365135446Strhodes * Convert 'rdataset' to text format, storing the result in 'target'.
366135446Strhodes *
367135446Strhodes * Notes:
368170222Sdougb *\li	The rdata cursor position will be changed.
369135446Strhodes *
370193149Sdougb *\li	The 'question' flag should normally be #ISC_FALSE.  If it is
371193149Sdougb *	#ISC_TRUE, the TTL and rdata fields are not printed.  This is
372135446Strhodes *	for use when printing an rdata representing a question section.
373135446Strhodes *
374170222Sdougb *\li	This interface is deprecated; use dns_master_rdatasettottext()
375135446Strhodes * 	and/or dns_master_questiontotext() instead.
376135446Strhodes *
377135446Strhodes * Requires:
378170222Sdougb *\li	'rdataset' is a valid rdataset.
379135446Strhodes *
380170222Sdougb *\li	'rdataset' is not empty.
381135446Strhodes */
382135446Strhodes
383135446Strhodesisc_result_t
384135446Strhodesdns_rdataset_towire(dns_rdataset_t *rdataset,
385135446Strhodes		    dns_name_t *owner_name,
386135446Strhodes		    dns_compress_t *cctx,
387135446Strhodes		    isc_buffer_t *target,
388135446Strhodes		    unsigned int options,
389135446Strhodes		    unsigned int *countp);
390170222Sdougb/*%<
391135446Strhodes * Convert 'rdataset' to wire format, compressing names as specified
392135446Strhodes * in 'cctx', and storing the result in 'target'.
393135446Strhodes *
394135446Strhodes * Notes:
395170222Sdougb *\li	The rdata cursor position will be changed.
396135446Strhodes *
397170222Sdougb *\li	The number of RRs added to target will be added to *countp.
398135446Strhodes *
399135446Strhodes * Requires:
400170222Sdougb *\li	'rdataset' is a valid rdataset.
401135446Strhodes *
402170222Sdougb *\li	'rdataset' is not empty.
403135446Strhodes *
404170222Sdougb *\li	'countp' is a valid pointer.
405135446Strhodes *
406135446Strhodes * Ensures:
407170222Sdougb *\li	On a return of ISC_R_SUCCESS, 'target' contains a wire format
408135446Strhodes *	for the data contained in 'rdataset'.  Any error return leaves
409135446Strhodes *	the buffer unchanged.
410135446Strhodes *
411170222Sdougb *\li	*countp has been incremented by the number of RRs added to
412135446Strhodes *	target.
413135446Strhodes *
414135446Strhodes * Returns:
415170222Sdougb *\li	#ISC_R_SUCCESS		- all ok
416170222Sdougb *\li	#ISC_R_NOSPACE		- 'target' doesn't have enough room
417135446Strhodes *
418170222Sdougb *\li	Any error returned by dns_rdata_towire(), dns_rdataset_next(),
419135446Strhodes *	dns_name_towire().
420135446Strhodes */
421135446Strhodes
422135446Strhodesisc_result_t
423135446Strhodesdns_rdataset_towiresorted(dns_rdataset_t *rdataset,
424165071Sdougb			  const dns_name_t *owner_name,
425135446Strhodes			  dns_compress_t *cctx,
426135446Strhodes			  isc_buffer_t *target,
427135446Strhodes			  dns_rdatasetorderfunc_t order,
428165071Sdougb			  const void *order_arg,
429135446Strhodes			  unsigned int options,
430135446Strhodes			  unsigned int *countp);
431170222Sdougb/*%<
432135446Strhodes * Like dns_rdataset_towire(), but sorting the rdatasets according to
433193149Sdougb * the integer value returned by 'order' when called with the rdataset
434135446Strhodes * and 'order_arg' as arguments.
435135446Strhodes *
436135446Strhodes * Requires:
437170222Sdougb *\li	All the requirements of dns_rdataset_towire(), and
438135446Strhodes *	that order_arg is NULL if and only if order is NULL.
439135446Strhodes */
440135446Strhodes
441135446Strhodesisc_result_t
442135446Strhodesdns_rdataset_towirepartial(dns_rdataset_t *rdataset,
443165071Sdougb			   const dns_name_t *owner_name,
444135446Strhodes			   dns_compress_t *cctx,
445135446Strhodes			   isc_buffer_t *target,
446135446Strhodes			   dns_rdatasetorderfunc_t order,
447165071Sdougb			   const void *order_arg,
448135446Strhodes			   unsigned int options,
449135446Strhodes			   unsigned int *countp,
450135446Strhodes			   void **state);
451170222Sdougb/*%<
452135446Strhodes * Like dns_rdataset_towiresorted() except that a partial rdataset
453135446Strhodes * may be written.
454135446Strhodes *
455135446Strhodes * Requires:
456170222Sdougb *\li	All the requirements of dns_rdataset_towiresorted().
457135446Strhodes *	If 'state' is non NULL then the current position in the
458135446Strhodes *	rdataset will be remembered if the rdataset in not
459135446Strhodes *	completely written and should be passed on on subsequent
460135446Strhodes *	calls (NOT CURRENTLY IMPLEMENTED).
461135446Strhodes *
462135446Strhodes * Returns:
463170222Sdougb *\li	#ISC_R_SUCCESS if all of the records were written.
464170222Sdougb *\li	#ISC_R_NOSPACE if unable to fit in all of the records. *countp
465135446Strhodes *		      will be updated to reflect the number of records
466135446Strhodes *		      written.
467135446Strhodes */
468135446Strhodes
469135446Strhodesisc_result_t
470135446Strhodesdns_rdataset_additionaldata(dns_rdataset_t *rdataset,
471135446Strhodes			    dns_additionaldatafunc_t add, void *arg);
472170222Sdougb/*%<
473135446Strhodes * For each rdata in rdataset, call 'add' for each name and type in the
474135446Strhodes * rdata which is subject to additional section processing.
475135446Strhodes *
476135446Strhodes * Requires:
477135446Strhodes *
478170222Sdougb *\li	'rdataset' is a valid, non-question rdataset.
479135446Strhodes *
480170222Sdougb *\li	'add' is a valid dns_additionaldatafunc_t
481135446Strhodes *
482135446Strhodes * Ensures:
483135446Strhodes *
484170222Sdougb *\li	If successful, dns_rdata_additionaldata() will have been called for
485135446Strhodes *	each rdata in 'rdataset'.
486135446Strhodes *
487170222Sdougb *\li	If a call to dns_rdata_additionaldata() is not successful, the
488135446Strhodes *	result returned will be the result of dns_rdataset_additionaldata().
489135446Strhodes *
490135446Strhodes * Returns:
491135446Strhodes *
492170222Sdougb *\li	#ISC_R_SUCCESS
493135446Strhodes *
494170222Sdougb *\li	Any error that dns_rdata_additionaldata() can return.
495135446Strhodes */
496135446Strhodes
497135446Strhodesisc_result_t
498135446Strhodesdns_rdataset_getnoqname(dns_rdataset_t *rdataset, dns_name_t *name,
499193149Sdougb			dns_rdataset_t *neg, dns_rdataset_t *negsig);
500170222Sdougb/*%<
501135446Strhodes * Return the noqname proof for this record.
502135446Strhodes *
503135446Strhodes * Requires:
504170222Sdougb *\li	'rdataset' to be valid and #DNS_RDATASETATTR_NOQNAME to be set.
505170222Sdougb *\li	'name' to be valid.
506193149Sdougb *\li	'neg' and 'negsig' to be valid and not associated.
507135446Strhodes */
508135446Strhodes
509135446Strhodesisc_result_t
510135446Strhodesdns_rdataset_addnoqname(dns_rdataset_t *rdataset, dns_name_t *name);
511170222Sdougb/*%<
512135446Strhodes * Associate a noqname proof with this record.
513170222Sdougb * Sets #DNS_RDATASETATTR_NOQNAME if successful.
514135446Strhodes * Adjusts the 'rdataset->ttl' to minimum of the 'rdataset->ttl' and
515193149Sdougb * the 'nsec'/'nsec3' and 'rrsig(nsec)'/'rrsig(nsec3)' ttl.
516135446Strhodes *
517135446Strhodes * Requires:
518170222Sdougb *\li	'rdataset' to be valid and #DNS_RDATASETATTR_NOQNAME to be set.
519193149Sdougb *\li	'name' to be valid and have NSEC or NSEC3 and associated RRSIG
520193149Sdougb *	 rdatasets.
521135446Strhodes */
522135446Strhodes
523170222Sdougbisc_result_t
524193149Sdougbdns_rdataset_getclosest(dns_rdataset_t *rdataset, dns_name_t *name,
525193149Sdougb			dns_rdataset_t *nsec, dns_rdataset_t *nsecsig);
526193149Sdougb/*%<
527193149Sdougb * Return the closest encloser for this record.
528193149Sdougb *
529193149Sdougb * Requires:
530193149Sdougb *\li	'rdataset' to be valid and #DNS_RDATASETATTR_CLOSEST to be set.
531193149Sdougb *\li	'name' to be valid.
532193149Sdougb *\li	'nsec' and 'nsecsig' to be valid and not associated.
533193149Sdougb */
534193149Sdougb
535193149Sdougbisc_result_t
536193149Sdougbdns_rdataset_addclosest(dns_rdataset_t *rdataset, dns_name_t *name);
537193149Sdougb/*%<
538193149Sdougb * Associate a closest encloset proof with this record.
539193149Sdougb * Sets #DNS_RDATASETATTR_CLOSEST if successful.
540193149Sdougb * Adjusts the 'rdataset->ttl' to minimum of the 'rdataset->ttl' and
541193149Sdougb * the 'nsec' and 'rrsig(nsec)' ttl.
542193149Sdougb *
543193149Sdougb * Requires:
544193149Sdougb *\li	'rdataset' to be valid and #DNS_RDATASETATTR_CLOSEST to be set.
545193149Sdougb *\li	'name' to be valid and have NSEC3 and RRSIG(NSEC3) rdatasets.
546193149Sdougb */
547193149Sdougb
548193149Sdougbisc_result_t
549170222Sdougbdns_rdataset_getadditional(dns_rdataset_t *rdataset,
550170222Sdougb			   dns_rdatasetadditional_t type,
551170222Sdougb			   dns_rdatatype_t qtype,
552170222Sdougb			   dns_acache_t *acache,
553170222Sdougb			   dns_zone_t **zonep,
554170222Sdougb			   dns_db_t **dbp,
555170222Sdougb			   dns_dbversion_t **versionp,
556170222Sdougb			   dns_dbnode_t **nodep,
557170222Sdougb			   dns_name_t *fname,
558170222Sdougb			   dns_message_t *msg,
559170222Sdougb			   isc_stdtime_t now);
560170222Sdougb/*%<
561170222Sdougb * Get cached additional information from the DB node for a particular
562170222Sdougb * 'rdataset.'  'type' is one of dns_rdatasetadditional_fromauth,
563170222Sdougb * dns_rdatasetadditional_fromcache, and dns_rdatasetadditional_fromglue,
564170222Sdougb * which specifies the origin of the information.  'qtype' is intended to
565170222Sdougb * be used for specifying a particular rdata type in the cached information.
566170222Sdougb *
567170222Sdougb * Requires:
568170222Sdougb * \li	'rdataset' is a valid rdataset.
569170222Sdougb * \li	'acache' can be NULL, in which case this function will simply return
570170222Sdougb * 	ISC_R_FAILURE.
571170222Sdougb * \li	For the other pointers, see dns_acache_getentry().
572170222Sdougb *
573170222Sdougb * Ensures:
574170222Sdougb * \li	See dns_acache_getentry().
575170222Sdougb *
576170222Sdougb * Returns:
577170222Sdougb * \li	#ISC_R_SUCCESS
578170222Sdougb * \li	#ISC_R_FAILURE	- additional information caching is not supported.
579170222Sdougb * \li	#ISC_R_NOTFOUND	- the corresponding DB node has not cached additional
580170222Sdougb *			  information for 'rdataset.'
581170222Sdougb * \li	Any error that dns_acache_getentry() can return.
582170222Sdougb */
583170222Sdougb
584170222Sdougbisc_result_t
585170222Sdougbdns_rdataset_setadditional(dns_rdataset_t *rdataset,
586170222Sdougb			   dns_rdatasetadditional_t type,
587170222Sdougb			   dns_rdatatype_t qtype,
588170222Sdougb			   dns_acache_t *acache,
589170222Sdougb			   dns_zone_t *zone,
590170222Sdougb			   dns_db_t *db,
591170222Sdougb			   dns_dbversion_t *version,
592170222Sdougb			   dns_dbnode_t *node,
593170222Sdougb			   dns_name_t *fname);
594170222Sdougb/*%<
595170222Sdougb * Set cached additional information to the DB node for a particular
596170222Sdougb * 'rdataset.'  See dns_rdataset_getadditional for the semantics of 'type'
597170222Sdougb * and 'qtype'.
598170222Sdougb *
599170222Sdougb * Requires:
600170222Sdougb * \li	'rdataset' is a valid rdataset.
601170222Sdougb * \li	'acache' can be NULL, in which case this function will simply return
602170222Sdougb *	ISC_R_FAILURE.
603170222Sdougb * \li	For the other pointers, see dns_acache_setentry().
604170222Sdougb *
605170222Sdougb * Ensures:
606170222Sdougb * \li	See dns_acache_setentry().
607170222Sdougb *
608170222Sdougb * Returns:
609170222Sdougb * \li	#ISC_R_SUCCESS
610170222Sdougb * \li	#ISC_R_FAILURE	- additional information caching is not supported.
611170222Sdougb * \li	#ISC_R_NOMEMORY
612170222Sdougb * \li	Any error that dns_acache_setentry() can return.
613170222Sdougb */
614170222Sdougb
615170222Sdougbisc_result_t
616170222Sdougbdns_rdataset_putadditional(dns_acache_t *acache,
617170222Sdougb			   dns_rdataset_t *rdataset,
618170222Sdougb			   dns_rdatasetadditional_t type,
619170222Sdougb			   dns_rdatatype_t qtype);
620170222Sdougb/*%<
621170222Sdougb * Discard cached additional information stored in the DB node for a particular
622170222Sdougb * 'rdataset.'  See dns_rdataset_getadditional for the semantics of 'type'
623170222Sdougb * and 'qtype'.
624170222Sdougb *
625170222Sdougb * Requires:
626170222Sdougb * \li	'rdataset' is a valid rdataset.
627170222Sdougb * \li	'acache' can be NULL, in which case this function will simply return
628170222Sdougb *	ISC_R_FAILURE.
629170222Sdougb *
630170222Sdougb * Ensures:
631170222Sdougb * \li	See dns_acache_cancelentry().
632170222Sdougb *
633170222Sdougb * Returns:
634170222Sdougb * \li	#ISC_R_SUCCESS
635170222Sdougb * \li	#ISC_R_FAILURE	- additional information caching is not supported.
636170222Sdougb * \li	#ISC_R_NOTFOUND	- the corresponding DB node has not cached additional
637170222Sdougb *			  information for 'rdataset.'
638170222Sdougb */
639170222Sdougb
640205292Sdougbvoid
641205292Sdougbdns_rdataset_settrust(dns_rdataset_t *rdataset, dns_trust_t trust);
642205292Sdougb/*%<
643205292Sdougb * Set the trust of the 'rdataset' to trust in any in the backing database.
644205292Sdougb * The local trust level of 'rdataset' is also set.
645205292Sdougb */
646205292Sdougb
647205292Sdougbvoid
648205292Sdougbdns_rdataset_expire(dns_rdataset_t *rdataset);
649205292Sdougb/*%<
650205292Sdougb * Mark the rdataset to be expired in the backing database.
651205292Sdougb */
652205292Sdougb
653222395Sdougbconst char *
654222395Sdougbdns_trust_totext(dns_trust_t trust);
655222395Sdougb/*%<
656222395Sdougb * Display trust in textual form.
657222395Sdougb */
658222395Sdougb
659135446StrhodesISC_LANG_ENDDECLS
660135446Strhodes
661135446Strhodes#endif /* DNS_RDATASET_H */
662