xref: /dragonfly/contrib/ldns/ldns/resolver.h (revision ee791feb)
1825eb42bSJan Lentfer /*
2825eb42bSJan Lentfer  * resolver.h
3825eb42bSJan Lentfer  *
4825eb42bSJan Lentfer  * DNS Resolver definitions
5825eb42bSJan Lentfer  *
6825eb42bSJan Lentfer  * a Net::DNS like library for C
7825eb42bSJan Lentfer  *
8825eb42bSJan Lentfer  * (c) NLnet Labs, 2005-2006
9825eb42bSJan Lentfer  *
10825eb42bSJan Lentfer  * See the file LICENSE for the license
11825eb42bSJan Lentfer  */
12825eb42bSJan Lentfer 
13825eb42bSJan Lentfer /**
14825eb42bSJan Lentfer  * \file
15825eb42bSJan Lentfer  *
16825eb42bSJan Lentfer  * Defines the  ldns_resolver structure, a stub resolver that can send queries and parse answers.
17825eb42bSJan Lentfer  *
18825eb42bSJan Lentfer  */
19825eb42bSJan Lentfer 
20825eb42bSJan Lentfer #ifndef LDNS_RESOLVER_H
21825eb42bSJan Lentfer #define LDNS_RESOLVER_H
22825eb42bSJan Lentfer 
23825eb42bSJan Lentfer #include <ldns/error.h>
24825eb42bSJan Lentfer #include <ldns/common.h>
25825eb42bSJan Lentfer #include <ldns/rr.h>
26825eb42bSJan Lentfer #include <ldns/tsig.h>
27825eb42bSJan Lentfer #include <ldns/rdata.h>
28825eb42bSJan Lentfer #include <ldns/packet.h>
29825eb42bSJan Lentfer #include <sys/time.h>
30825eb42bSJan Lentfer 
31ac996e71SJan Lentfer #ifdef __cplusplus
32ac996e71SJan Lentfer extern "C" {
33ac996e71SJan Lentfer #endif
34ac996e71SJan Lentfer 
35825eb42bSJan Lentfer /** Default location of the resolv.conf file */
36825eb42bSJan Lentfer #define LDNS_RESOLV_CONF	"/etc/resolv.conf"
37825eb42bSJan Lentfer /** Default location of the hosts file */
38825eb42bSJan Lentfer #define LDNS_RESOLV_HOSTS	"/etc/hosts"
39825eb42bSJan Lentfer 
40825eb42bSJan Lentfer #define LDNS_RESOLV_KEYWORD     -1
41825eb42bSJan Lentfer #define LDNS_RESOLV_DEFDOMAIN	0
42825eb42bSJan Lentfer #define LDNS_RESOLV_NAMESERVER	1
43825eb42bSJan Lentfer #define LDNS_RESOLV_SEARCH	2
44825eb42bSJan Lentfer #define LDNS_RESOLV_SORTLIST	3
45825eb42bSJan Lentfer #define LDNS_RESOLV_OPTIONS	4
46825eb42bSJan Lentfer #define LDNS_RESOLV_ANCHOR	5
47825eb42bSJan Lentfer #define LDNS_RESOLV_KEYWORDS    6
48825eb42bSJan Lentfer 
49825eb42bSJan Lentfer #define LDNS_RESOLV_INETANY		0
50825eb42bSJan Lentfer #define LDNS_RESOLV_INET		1
51825eb42bSJan Lentfer #define LDNS_RESOLV_INET6		2
52825eb42bSJan Lentfer 
53825eb42bSJan Lentfer #define LDNS_RESOLV_RTT_INF             0       /* infinity */
54825eb42bSJan Lentfer #define LDNS_RESOLV_RTT_MIN             1       /* reachable */
55825eb42bSJan Lentfer 
56825eb42bSJan Lentfer /**
57825eb42bSJan Lentfer  * DNS stub resolver structure
58825eb42bSJan Lentfer  */
59825eb42bSJan Lentfer struct ldns_struct_resolver
60825eb42bSJan Lentfer {
61825eb42bSJan Lentfer 	/**  Port to send queries to */
62825eb42bSJan Lentfer 	uint16_t _port;
63825eb42bSJan Lentfer 
64825eb42bSJan Lentfer 	/** Array of nameservers to query (IP addresses or dnames) */
65825eb42bSJan Lentfer 	ldns_rdf **_nameservers;
66825eb42bSJan Lentfer 	/** Number of nameservers in \c _nameservers */
67825eb42bSJan Lentfer 	size_t _nameserver_count; /* how many do we have */
68825eb42bSJan Lentfer 
69825eb42bSJan Lentfer 	/**  Round trip time; 0 -> infinity. Unit: ms? */
70825eb42bSJan Lentfer 	size_t *_rtt;
71825eb42bSJan Lentfer 
725340022aSzrj 	/**  Whether or not to be recursive */
73825eb42bSJan Lentfer 	bool _recursive;
74825eb42bSJan Lentfer 
75825eb42bSJan Lentfer 	/**  Print debug information */
76825eb42bSJan Lentfer 	bool _debug;
77825eb42bSJan Lentfer 
78825eb42bSJan Lentfer 	/**  Default domain to add to non fully qualified domain names */
79825eb42bSJan Lentfer 	ldns_rdf *_domain;
80825eb42bSJan Lentfer 
81825eb42bSJan Lentfer 	/**  Searchlist array, add the names in this array if a query cannot be found */
82825eb42bSJan Lentfer 	ldns_rdf **_searchlist;
83825eb42bSJan Lentfer 
84825eb42bSJan Lentfer 	/** Number of entries in the searchlist array */
85825eb42bSJan Lentfer 	size_t _searchlist_count;
86825eb42bSJan Lentfer 
87825eb42bSJan Lentfer 	/**  Number of times to retry before giving up */
88825eb42bSJan Lentfer 	uint8_t _retry;
89825eb42bSJan Lentfer 	/**  Time to wait before retrying */
90825eb42bSJan Lentfer 	uint8_t _retrans;
91825eb42bSJan Lentfer 	/**  Use new fallback mechanism (try EDNS, then do TCP) */
92825eb42bSJan Lentfer 	bool _fallback;
93825eb42bSJan Lentfer 
94825eb42bSJan Lentfer 	/**  Whether to do DNSSEC */
95825eb42bSJan Lentfer 	bool _dnssec;
96825eb42bSJan Lentfer 	/**  Whether to set the CD bit on DNSSEC requests */
97825eb42bSJan Lentfer 	bool _dnssec_cd;
98825eb42bSJan Lentfer 	/** Optional trust anchors for complete DNSSEC validation */
99825eb42bSJan Lentfer 	ldns_rr_list * _dnssec_anchors;
100825eb42bSJan Lentfer 	/**  Whether to use tcp or udp (tcp if the value is true)*/
101825eb42bSJan Lentfer 	bool _usevc;
102825eb42bSJan Lentfer 	/**  Whether to ignore the tc bit */
103825eb42bSJan Lentfer 	bool _igntc;
1045340022aSzrj 	/**  Whether to use ip6: 0->does not matter, 1 is IPv4, 2 is IPv6 */
105825eb42bSJan Lentfer 	uint8_t _ip6;
106825eb42bSJan Lentfer 	/**  If true append the default domain */
107825eb42bSJan Lentfer 	bool _defnames;
108825eb42bSJan Lentfer 	/**  If true apply the search list */
109825eb42bSJan Lentfer 	bool _dnsrch;
110825eb42bSJan Lentfer 	/**  Timeout for socket connections */
111825eb42bSJan Lentfer 	struct timeval _timeout;
112825eb42bSJan Lentfer 	/**  Only try the first nameserver, and return with an error directly if it fails */
113825eb42bSJan Lentfer 	bool _fail;
114825eb42bSJan Lentfer 	/**  Randomly choose a nameserver */
115825eb42bSJan Lentfer 	bool _random;
116825eb42bSJan Lentfer 	/** Keep some things to make AXFR possible */
117825eb42bSJan Lentfer 	int _socket;
118825eb42bSJan Lentfer 	/** Count the number of LDNS_RR_TYPE_SOA RRs we have seen so far
119825eb42bSJan Lentfer 	 * (the second one signifies the end of the AXFR)
120825eb42bSJan Lentfer 	 */
121825eb42bSJan Lentfer 	int _axfr_soa_count;
122825eb42bSJan Lentfer 	/* when axfring we get complete packets from the server
123825eb42bSJan Lentfer 	   but we want to give the caller 1 rr at a time, so
124825eb42bSJan Lentfer 	   keep the current pkt */
125825eb42bSJan Lentfer         /** Packet currently handled when doing part of an AXFR */
126825eb42bSJan Lentfer 	ldns_pkt *_cur_axfr_pkt;
127825eb42bSJan Lentfer 	/** Counter for within the AXFR packets */
128825eb42bSJan Lentfer 	uint16_t _axfr_i;
129825eb42bSJan Lentfer 	/* EDNS0 available buffer size */
130825eb42bSJan Lentfer 	uint16_t _edns_udp_size;
1315340022aSzrj 	/* serial for IXFR */
1325340022aSzrj 	uint32_t _serial;
133825eb42bSJan Lentfer 
134825eb42bSJan Lentfer 	/* Optional tsig key for signing queries,
135825eb42bSJan Lentfer 	outgoing messages are signed if and only if both are set
136825eb42bSJan Lentfer 	*/
137825eb42bSJan Lentfer 	/** Name of the key to use with TSIG, if _tsig_keyname and _tsig_keydata both contain values, outgoing messages are automatically signed with TSIG. */
138825eb42bSJan Lentfer 	char *_tsig_keyname;
139825eb42bSJan Lentfer 	/** Secret key data to use with TSIG, if _tsig_keyname and _tsig_keydata both contain values, outgoing messages are automatically signed with TSIG. */
140825eb42bSJan Lentfer 	char *_tsig_keydata;
141825eb42bSJan Lentfer 	/** TSIG signing algorithm */
142825eb42bSJan Lentfer 	char *_tsig_algorithm;
1435340022aSzrj 
1445340022aSzrj 	/** Source address to query from */
1455340022aSzrj 	ldns_rdf *_source;
146825eb42bSJan Lentfer };
147825eb42bSJan Lentfer typedef struct ldns_struct_resolver ldns_resolver;
148825eb42bSJan Lentfer 
149825eb42bSJan Lentfer /* prototypes */
150825eb42bSJan Lentfer /* read access functions */
151825eb42bSJan Lentfer 
152825eb42bSJan Lentfer /**
153825eb42bSJan Lentfer  * Get the port the resolver should use
154825eb42bSJan Lentfer  * \param[in] r the resolver
155825eb42bSJan Lentfer  * \return the port number
156825eb42bSJan Lentfer  */
157825eb42bSJan Lentfer uint16_t ldns_resolver_port(const ldns_resolver *r);
158825eb42bSJan Lentfer 
159825eb42bSJan Lentfer /**
1605340022aSzrj  * Get the source address the resolver should use
1615340022aSzrj  * \param[in] r the resolver
1625340022aSzrj  * \return the source rdf
1635340022aSzrj  */
1645340022aSzrj ldns_rdf *ldns_resolver_source(const ldns_resolver *r);
1655340022aSzrj 
1665340022aSzrj /**
167825eb42bSJan Lentfer  * Is the resolver set to recurse
168825eb42bSJan Lentfer  * \param[in] r the resolver
169825eb42bSJan Lentfer  * \return true if so, otherwise false
170825eb42bSJan Lentfer  */
171825eb42bSJan Lentfer bool ldns_resolver_recursive(const ldns_resolver *r);
172825eb42bSJan Lentfer 
173825eb42bSJan Lentfer /**
174825eb42bSJan Lentfer  * Get the debug status of the resolver
175825eb42bSJan Lentfer  * \param[in] r the resolver
176825eb42bSJan Lentfer  * \return true if so, otherwise false
177825eb42bSJan Lentfer  */
178825eb42bSJan Lentfer bool ldns_resolver_debug(const ldns_resolver *r);
179825eb42bSJan Lentfer 
180825eb42bSJan Lentfer /**
181825eb42bSJan Lentfer  * Get the number of retries
182825eb42bSJan Lentfer  * \param[in] r the resolver
183825eb42bSJan Lentfer  * \return the number of retries
184825eb42bSJan Lentfer  */
185825eb42bSJan Lentfer uint8_t ldns_resolver_retry(const ldns_resolver *r);
186825eb42bSJan Lentfer 
187825eb42bSJan Lentfer /**
188825eb42bSJan Lentfer  * Get the retransmit interval
189825eb42bSJan Lentfer  * \param[in] r the resolver
190825eb42bSJan Lentfer  * \return the retransmit interval
191825eb42bSJan Lentfer  */
192825eb42bSJan Lentfer uint8_t ldns_resolver_retrans(const ldns_resolver *r);
193825eb42bSJan Lentfer 
194825eb42bSJan Lentfer /**
195825eb42bSJan Lentfer  * Get the truncation fallback status
196825eb42bSJan Lentfer  * \param[in] r the resolver
197825eb42bSJan Lentfer  * \return whether the truncation fallback mechanism is used
198825eb42bSJan Lentfer  */
199825eb42bSJan Lentfer bool ldns_resolver_fallback(const ldns_resolver *r);
200825eb42bSJan Lentfer 
201825eb42bSJan Lentfer /**
202825eb42bSJan Lentfer  * Does the resolver use ip6 or ip4
203825eb42bSJan Lentfer  * \param[in] r the resolver
204825eb42bSJan Lentfer  * \return 0: both, 1: ip4, 2:ip6
205825eb42bSJan Lentfer  */
206825eb42bSJan Lentfer uint8_t ldns_resolver_ip6(const ldns_resolver *r);
207825eb42bSJan Lentfer 
208825eb42bSJan Lentfer /**
209825eb42bSJan Lentfer  * Get the resolver's udp size
210825eb42bSJan Lentfer  * \param[in] r the resolver
211825eb42bSJan Lentfer  * \return the udp mesg size
212825eb42bSJan Lentfer  */
213825eb42bSJan Lentfer uint16_t ldns_resolver_edns_udp_size(const ldns_resolver *r);
214825eb42bSJan Lentfer /**
215825eb42bSJan Lentfer  * Does the resolver use tcp or udp
216825eb42bSJan Lentfer  * \param[in] r the resolver
217825eb42bSJan Lentfer  * \return true: tcp, false: udp
218825eb42bSJan Lentfer  */
219825eb42bSJan Lentfer bool ldns_resolver_usevc(const ldns_resolver *r);
220825eb42bSJan Lentfer /**
221825eb42bSJan Lentfer  * Does the resolver only try the first nameserver
222825eb42bSJan Lentfer  * \param[in] r the resolver
223825eb42bSJan Lentfer  * \return true: yes, fail, false: no, try the others
224825eb42bSJan Lentfer  */
225825eb42bSJan Lentfer bool ldns_resolver_fail(const ldns_resolver *r);
226825eb42bSJan Lentfer /**
227ac996e71SJan Lentfer  * Does the resolver apply default domain name
228ac996e71SJan Lentfer  * \param[in] r the resolver
229ac996e71SJan Lentfer  * \return true: yes, false: no
230ac996e71SJan Lentfer  */
231ac996e71SJan Lentfer bool ldns_resolver_defnames(const ldns_resolver *r);
232ac996e71SJan Lentfer /**
233ac996e71SJan Lentfer  * Does the resolver apply search list
234ac996e71SJan Lentfer  * \param[in] r the resolver
235ac996e71SJan Lentfer  * \return true: yes, false: no
236ac996e71SJan Lentfer  */
237ac996e71SJan Lentfer bool ldns_resolver_dnsrch(const ldns_resolver *r);
238ac996e71SJan Lentfer /**
239825eb42bSJan Lentfer  * Does the resolver do DNSSEC
240825eb42bSJan Lentfer  * \param[in] r the resolver
241825eb42bSJan Lentfer  * \return true: yes, false: no
242825eb42bSJan Lentfer  */
243825eb42bSJan Lentfer bool ldns_resolver_dnssec(const ldns_resolver *r);
244825eb42bSJan Lentfer /**
245825eb42bSJan Lentfer  * Does the resolver set the CD bit
246825eb42bSJan Lentfer  * \param[in] r the resolver
247825eb42bSJan Lentfer  * \return true: yes, false: no
248825eb42bSJan Lentfer  */
249825eb42bSJan Lentfer bool ldns_resolver_dnssec_cd(const ldns_resolver *r);
250825eb42bSJan Lentfer /**
251825eb42bSJan Lentfer  * Get the resolver's DNSSEC anchors
252825eb42bSJan Lentfer  * \param[in] r the resolver
253*ee791febSAntonio Huete Jimenez  * \return an rr_list containing trusted DNSSEC anchors
254825eb42bSJan Lentfer  */
255825eb42bSJan Lentfer ldns_rr_list * ldns_resolver_dnssec_anchors(const ldns_resolver *r);
256825eb42bSJan Lentfer /**
257825eb42bSJan Lentfer  * Does the resolver ignore the TC bit (truncated)
258825eb42bSJan Lentfer  * \param[in] r the resolver
259825eb42bSJan Lentfer  * \return true: yes, false: no
260825eb42bSJan Lentfer  */
261825eb42bSJan Lentfer bool ldns_resolver_igntc(const ldns_resolver *r);
262825eb42bSJan Lentfer /**
263825eb42bSJan Lentfer  * Does the resolver randomize the nameserver before usage
264825eb42bSJan Lentfer  * \param[in] r the resolver
265825eb42bSJan Lentfer  * \return true: yes, false: no
266825eb42bSJan Lentfer  */
267825eb42bSJan Lentfer bool ldns_resolver_random(const ldns_resolver *r);
268825eb42bSJan Lentfer /**
269825eb42bSJan Lentfer  * How many nameserver are configured in the resolver
270825eb42bSJan Lentfer  * \param[in] r the resolver
271825eb42bSJan Lentfer  * \return number of nameservers
272825eb42bSJan Lentfer  */
273825eb42bSJan Lentfer size_t ldns_resolver_nameserver_count(const ldns_resolver *r);
274825eb42bSJan Lentfer /**
275825eb42bSJan Lentfer  * What is the default dname to add to relative queries
276825eb42bSJan Lentfer  * \param[in] r the resolver
277825eb42bSJan Lentfer  * \return the dname which is added
278825eb42bSJan Lentfer  */
279825eb42bSJan Lentfer ldns_rdf *ldns_resolver_domain(const ldns_resolver *r);
280825eb42bSJan Lentfer /**
281825eb42bSJan Lentfer  * What is the timeout on socket connections
282825eb42bSJan Lentfer  * \param[in] r the resolver
283825eb42bSJan Lentfer  * \return the timeout as struct timeval
284825eb42bSJan Lentfer  */
285825eb42bSJan Lentfer struct timeval ldns_resolver_timeout(const ldns_resolver *r);
286825eb42bSJan Lentfer /**
287825eb42bSJan Lentfer  * What is the searchlist as used by the resolver
288825eb42bSJan Lentfer  * \param[in] r the resolver
289825eb42bSJan Lentfer  * \return a ldns_rdf pointer to a list of the addresses
290825eb42bSJan Lentfer  */
291825eb42bSJan Lentfer ldns_rdf** ldns_resolver_searchlist(const ldns_resolver *r);
292825eb42bSJan Lentfer /**
293825eb42bSJan Lentfer  * Return the configured nameserver ip address
294825eb42bSJan Lentfer  * \param[in] r the resolver
295825eb42bSJan Lentfer  * \return a ldns_rdf pointer to a list of the addresses
296825eb42bSJan Lentfer  */
297825eb42bSJan Lentfer ldns_rdf** ldns_resolver_nameservers(const ldns_resolver *r);
298825eb42bSJan Lentfer /**
299825eb42bSJan Lentfer  * Return the used round trip times for the nameservers
300825eb42bSJan Lentfer  * \param[in] r the resolver
301825eb42bSJan Lentfer  * \return a size_t* pointer to the list.
302825eb42bSJan Lentfer  * yet)
303825eb42bSJan Lentfer  */
304825eb42bSJan Lentfer size_t * ldns_resolver_rtt(const ldns_resolver *r);
305825eb42bSJan Lentfer /**
306825eb42bSJan Lentfer  * Return the used round trip time for a specific nameserver
307825eb42bSJan Lentfer  * \param[in] r the resolver
308825eb42bSJan Lentfer  * \param[in] pos the index to the nameserver
309825eb42bSJan Lentfer  * \return the rrt, 0: infinite, >0: undefined (as of * yet)
310825eb42bSJan Lentfer  */
311825eb42bSJan Lentfer size_t ldns_resolver_nameserver_rtt(const ldns_resolver *r, size_t pos);
312825eb42bSJan Lentfer /**
313825eb42bSJan Lentfer  * Return the tsig keyname as used by the nameserver
314825eb42bSJan Lentfer  * \param[in] r the resolver
3155340022aSzrj  * \return the name used. Still owned by the resolver - change using
3165340022aSzrj  * ldns_resolver_set_tsig_keyname().
317825eb42bSJan Lentfer  */
3185340022aSzrj const char *ldns_resolver_tsig_keyname(const ldns_resolver *r);
319825eb42bSJan Lentfer /**
320825eb42bSJan Lentfer  * Return the tsig algorithm as used by the nameserver
321825eb42bSJan Lentfer  * \param[in] r the resolver
3225340022aSzrj  * \return the algorithm used. Still owned by the resolver - change using
3235340022aSzrj  * ldns_resolver_set_tsig_algorithm().
324825eb42bSJan Lentfer  */
3255340022aSzrj const char *ldns_resolver_tsig_algorithm(const ldns_resolver *r);
326825eb42bSJan Lentfer /**
327825eb42bSJan Lentfer  * Return the tsig keydata as used by the nameserver
328825eb42bSJan Lentfer  * \param[in] r the resolver
3295340022aSzrj  * \return the keydata used. Still owned by the resolver - change using
3305340022aSzrj  * ldns_resolver_set_tsig_keydata().
331825eb42bSJan Lentfer  */
3325340022aSzrj const char *ldns_resolver_tsig_keydata(const ldns_resolver *r);
333825eb42bSJan Lentfer /**
334825eb42bSJan Lentfer  * pop the last nameserver from the resolver.
335825eb42bSJan Lentfer  * \param[in] r the resolver
336825eb42bSJan Lentfer  * \return the popped address or NULL if empty
337825eb42bSJan Lentfer  */
338825eb42bSJan Lentfer ldns_rdf* ldns_resolver_pop_nameserver(ldns_resolver *r);
339825eb42bSJan Lentfer 
340825eb42bSJan Lentfer /**
341825eb42bSJan Lentfer  * Return the resolver's searchlist count
342825eb42bSJan Lentfer  * \param[in] r the resolver
343825eb42bSJan Lentfer  * \return the searchlist count
344825eb42bSJan Lentfer  */
345825eb42bSJan Lentfer size_t ldns_resolver_searchlist_count(const ldns_resolver *r);
346825eb42bSJan Lentfer 
347825eb42bSJan Lentfer /* write access function */
348825eb42bSJan Lentfer /**
349825eb42bSJan Lentfer  * Set the port the resolver should use
350825eb42bSJan Lentfer  * \param[in] r the resolver
351825eb42bSJan Lentfer  * \param[in] p the port number
352825eb42bSJan Lentfer  */
353825eb42bSJan Lentfer void ldns_resolver_set_port(ldns_resolver *r, uint16_t p);
354825eb42bSJan Lentfer 
355825eb42bSJan Lentfer /**
3565340022aSzrj  * Set the source rdf (address) the resolver should use
3575340022aSzrj  * \param[in] r the resolver
3585340022aSzrj  * \param[in] s the source address
3595340022aSzrj  */
3605340022aSzrj void ldns_resolver_set_source(ldns_resolver *r, ldns_rdf *s);
3615340022aSzrj 
3625340022aSzrj /**
363825eb42bSJan Lentfer  * Set the resolver recursion
364825eb42bSJan Lentfer  * \param[in] r the resolver
365825eb42bSJan Lentfer  * \param[in] b true: set to recurse, false: unset
366825eb42bSJan Lentfer  */
367825eb42bSJan Lentfer void ldns_resolver_set_recursive(ldns_resolver *r, bool b);
368825eb42bSJan Lentfer 
369825eb42bSJan Lentfer /**
370825eb42bSJan Lentfer  * Set the resolver debugging
371825eb42bSJan Lentfer  * \param[in] r the resolver
372825eb42bSJan Lentfer  * \param[in] b true: debug on: false debug off
373825eb42bSJan Lentfer  */
374825eb42bSJan Lentfer void ldns_resolver_set_debug(ldns_resolver *r, bool b);
375825eb42bSJan Lentfer 
376825eb42bSJan Lentfer /**
377825eb42bSJan Lentfer  * Incremental the resolver's nameserver count.
378825eb42bSJan Lentfer  * \param[in] r the resolver
379825eb42bSJan Lentfer  */
380825eb42bSJan Lentfer void ldns_resolver_incr_nameserver_count(ldns_resolver *r);
381825eb42bSJan Lentfer 
382825eb42bSJan Lentfer /**
383825eb42bSJan Lentfer  * Decrement the resolver's nameserver count.
384825eb42bSJan Lentfer  * \param[in] r the resolver
385825eb42bSJan Lentfer  */
386825eb42bSJan Lentfer void ldns_resolver_dec_nameserver_count(ldns_resolver *r);
387825eb42bSJan Lentfer 
388825eb42bSJan Lentfer /**
389825eb42bSJan Lentfer  * Set the resolver's nameserver count directly.
390825eb42bSJan Lentfer  * \param[in] r the resolver
391825eb42bSJan Lentfer  * \param[in] c the nameserver count
392825eb42bSJan Lentfer  */
393825eb42bSJan Lentfer void ldns_resolver_set_nameserver_count(ldns_resolver *r, size_t c);
394825eb42bSJan Lentfer 
395825eb42bSJan Lentfer /**
396825eb42bSJan Lentfer  * Set the resolver's nameserver count directly by using an rdf list
397825eb42bSJan Lentfer  * \param[in] r the resolver
398825eb42bSJan Lentfer  * \param[in] rd the resolver addresses
399825eb42bSJan Lentfer  */
400825eb42bSJan Lentfer void ldns_resolver_set_nameservers(ldns_resolver *r, ldns_rdf **rd);
401825eb42bSJan Lentfer 
402825eb42bSJan Lentfer /**
403825eb42bSJan Lentfer  * Set the resolver's default domain. This gets appended when no
404825eb42bSJan Lentfer  * absolute name is given
405825eb42bSJan Lentfer  * \param[in] r the resolver
406825eb42bSJan Lentfer  * \param[in] rd the name to append
407825eb42bSJan Lentfer  */
408825eb42bSJan Lentfer void ldns_resolver_set_domain(ldns_resolver *r, ldns_rdf *rd);
409825eb42bSJan Lentfer 
410825eb42bSJan Lentfer /**
411825eb42bSJan Lentfer  * Set the resolver's socket time out when talking to remote hosts
412825eb42bSJan Lentfer  * \param[in] r the resolver
413825eb42bSJan Lentfer  * \param[in] timeout the timeout to use
414825eb42bSJan Lentfer  */
415825eb42bSJan Lentfer void ldns_resolver_set_timeout(ldns_resolver *r, struct timeval timeout);
416825eb42bSJan Lentfer 
417825eb42bSJan Lentfer /**
418825eb42bSJan Lentfer  * Push a new rd to the resolver's searchlist
419825eb42bSJan Lentfer  * \param[in] r the resolver
420825eb42bSJan Lentfer  * \param[in] rd to push
421825eb42bSJan Lentfer  */
422825eb42bSJan Lentfer void ldns_resolver_push_searchlist(ldns_resolver *r, ldns_rdf *rd);
423825eb42bSJan Lentfer 
424825eb42bSJan Lentfer /**
425825eb42bSJan Lentfer  * Whether the resolver uses the name set with _set_domain
426825eb42bSJan Lentfer  * \param[in] r the resolver
427825eb42bSJan Lentfer  * \param[in] b true: use the defaults, false: don't use them
428825eb42bSJan Lentfer  */
429825eb42bSJan Lentfer void ldns_resolver_set_defnames(ldns_resolver *r, bool b);
430825eb42bSJan Lentfer 
431825eb42bSJan Lentfer /**
432825eb42bSJan Lentfer  * Whether the resolver uses a virtual circuit (TCP)
433825eb42bSJan Lentfer  * \param[in] r the resolver
434825eb42bSJan Lentfer  * \param[in] b true: use TCP, false: don't use TCP
435825eb42bSJan Lentfer  */
436825eb42bSJan Lentfer void ldns_resolver_set_usevc(ldns_resolver *r, bool b);
437825eb42bSJan Lentfer 
438825eb42bSJan Lentfer /**
439825eb42bSJan Lentfer  * Whether the resolver uses the searchlist
440825eb42bSJan Lentfer  * \param[in] r the resolver
441825eb42bSJan Lentfer  * \param[in] b true: use the list, false: don't use the list
442825eb42bSJan Lentfer  */
443825eb42bSJan Lentfer void ldns_resolver_set_dnsrch(ldns_resolver *r, bool b);
444825eb42bSJan Lentfer 
445825eb42bSJan Lentfer /**
446825eb42bSJan Lentfer  * Whether the resolver uses DNSSEC
447825eb42bSJan Lentfer  * \param[in] r the resolver
448825eb42bSJan Lentfer  * \param[in] b true: use DNSSEC, false: don't use DNSSEC
449825eb42bSJan Lentfer  */
450825eb42bSJan Lentfer void ldns_resolver_set_dnssec(ldns_resolver *r, bool b);
451825eb42bSJan Lentfer 
452825eb42bSJan Lentfer /**
453825eb42bSJan Lentfer  * Whether the resolver uses the checking disable bit
454825eb42bSJan Lentfer  * \param[in] r the resolver
455825eb42bSJan Lentfer  * \param[in] b true: enable , false: don't use TCP
456825eb42bSJan Lentfer  */
457825eb42bSJan Lentfer void ldns_resolver_set_dnssec_cd(ldns_resolver *r, bool b);
458825eb42bSJan Lentfer /**
459825eb42bSJan Lentfer  * Set the resolver's DNSSEC anchor list directly. RRs should be of type DS or DNSKEY.
460825eb42bSJan Lentfer  * \param[in] r the resolver
461825eb42bSJan Lentfer  * \param[in] l the list of RRs to use as trust anchors
462825eb42bSJan Lentfer  */
463825eb42bSJan Lentfer void ldns_resolver_set_dnssec_anchors(ldns_resolver *r, ldns_rr_list * l);
464825eb42bSJan Lentfer 
465825eb42bSJan Lentfer /**
466825eb42bSJan Lentfer  * Push a new trust anchor to the resolver. It must be a DS or DNSKEY rr
467825eb42bSJan Lentfer  * \param[in] r the resolver.
468825eb42bSJan Lentfer  * \param[in] rr the RR to add as a trust anchor.
469825eb42bSJan Lentfer  * \return a status
470825eb42bSJan Lentfer  */
471825eb42bSJan Lentfer ldns_status ldns_resolver_push_dnssec_anchor(ldns_resolver *r, ldns_rr *rr);
472825eb42bSJan Lentfer 
473825eb42bSJan Lentfer /**
474825eb42bSJan Lentfer  * Set the resolver retrans timeout (in seconds)
475825eb42bSJan Lentfer  * \param[in] r the resolver
476825eb42bSJan Lentfer  * \param[in] re the retransmission interval in seconds
477825eb42bSJan Lentfer  */
478825eb42bSJan Lentfer void ldns_resolver_set_retrans(ldns_resolver *r, uint8_t re);
479825eb42bSJan Lentfer 
480825eb42bSJan Lentfer /**
481825eb42bSJan Lentfer  * Set whether the resolvers truncation fallback mechanism is used
482825eb42bSJan Lentfer  * when ldns_resolver_query() is called.
483825eb42bSJan Lentfer  * \param[in] r the resolver
484825eb42bSJan Lentfer  * \param[in] fallback whether to use the fallback mechanism
485825eb42bSJan Lentfer  */
486825eb42bSJan Lentfer void ldns_resolver_set_fallback(ldns_resolver *r, bool fallback);
487825eb42bSJan Lentfer 
488825eb42bSJan Lentfer /**
4895340022aSzrj  * Set the number of times a resolver should retry a nameserver before the
4905340022aSzrj  * next one is tried.
491825eb42bSJan Lentfer  * \param[in] r the resolver
4925340022aSzrj  * \param[in] re the number of retries
493825eb42bSJan Lentfer  */
494825eb42bSJan Lentfer void ldns_resolver_set_retry(ldns_resolver *r, uint8_t re);
495825eb42bSJan Lentfer 
496825eb42bSJan Lentfer /**
497825eb42bSJan Lentfer  * Whether the resolver uses ip6
498825eb42bSJan Lentfer  * \param[in] r the resolver
499825eb42bSJan Lentfer  * \param[in] i 0: no pref, 1: ip4, 2: ip6
500825eb42bSJan Lentfer  */
501825eb42bSJan Lentfer void ldns_resolver_set_ip6(ldns_resolver *r, uint8_t i);
502825eb42bSJan Lentfer 
503825eb42bSJan Lentfer /**
504825eb42bSJan Lentfer  * Whether or not to fail after one failed query
505825eb42bSJan Lentfer  * \param[in] r the resolver
506825eb42bSJan Lentfer  * \param[in] b true: yes fail, false: continue with next nameserver
507825eb42bSJan Lentfer  */
508825eb42bSJan Lentfer void ldns_resolver_set_fail(ldns_resolver *r, bool b);
509825eb42bSJan Lentfer 
510825eb42bSJan Lentfer /**
511825eb42bSJan Lentfer  * Whether or not to ignore the TC bit
512825eb42bSJan Lentfer  * \param[in] r the resolver
513825eb42bSJan Lentfer  * \param[in] b true: yes ignore, false: don't ignore
514825eb42bSJan Lentfer  */
515825eb42bSJan Lentfer void ldns_resolver_set_igntc(ldns_resolver *r, bool b);
516825eb42bSJan Lentfer 
517825eb42bSJan Lentfer /**
518825eb42bSJan Lentfer  * Set maximum udp size
519825eb42bSJan Lentfer  * \param[in] r the resolver
520825eb42bSJan Lentfer  * \param[in] s the udp max size
521825eb42bSJan Lentfer  */
522825eb42bSJan Lentfer void ldns_resolver_set_edns_udp_size(ldns_resolver *r, uint16_t s);
523825eb42bSJan Lentfer 
524825eb42bSJan Lentfer /**
525825eb42bSJan Lentfer  * Set the tsig key name
526825eb42bSJan Lentfer  * \param[in] r the resolver
5275340022aSzrj  * \param[in] tsig_keyname the tsig key name (copied into resolver)
528825eb42bSJan Lentfer  */
5295340022aSzrj void ldns_resolver_set_tsig_keyname(ldns_resolver *r, const char *tsig_keyname);
530825eb42bSJan Lentfer 
531825eb42bSJan Lentfer /**
532825eb42bSJan Lentfer  * Set the tsig algorithm
533825eb42bSJan Lentfer  * \param[in] r the resolver
5345340022aSzrj  * \param[in] tsig_algorithm the tsig algorithm (copied into resolver)
535825eb42bSJan Lentfer  */
5365340022aSzrj void ldns_resolver_set_tsig_algorithm(ldns_resolver *r, const char *tsig_algorithm);
537825eb42bSJan Lentfer 
538825eb42bSJan Lentfer /**
539825eb42bSJan Lentfer  * Set the tsig key data
540825eb42bSJan Lentfer  * \param[in] r the resolver
5415340022aSzrj  * \param[in] tsig_keydata the key data (copied into resolver)
542825eb42bSJan Lentfer  */
5435340022aSzrj void ldns_resolver_set_tsig_keydata(ldns_resolver *r, const char *tsig_keydata);
544825eb42bSJan Lentfer 
545825eb42bSJan Lentfer /**
546825eb42bSJan Lentfer  * Set round trip time for all nameservers. Note this currently
547825eb42bSJan Lentfer  * differentiates between: unreachable and reachable.
548825eb42bSJan Lentfer  * \param[in] r the resolver
549825eb42bSJan Lentfer  * \param[in] rtt a list with the times
550825eb42bSJan Lentfer  */
551825eb42bSJan Lentfer void ldns_resolver_set_rtt(ldns_resolver *r, size_t *rtt);
552825eb42bSJan Lentfer 
553825eb42bSJan Lentfer /**
554825eb42bSJan Lentfer  * Set round trip time for a specific nameserver. Note this
555825eb42bSJan Lentfer  * currently differentiates between: unreachable and reachable.
556825eb42bSJan Lentfer  * \param[in] r the resolver
557825eb42bSJan Lentfer  * \param[in] pos the nameserver position
558825eb42bSJan Lentfer  * \param[in] value the rtt
559825eb42bSJan Lentfer  */
560825eb42bSJan Lentfer void ldns_resolver_set_nameserver_rtt(ldns_resolver *r, size_t pos, size_t value);
561825eb42bSJan Lentfer 
562825eb42bSJan Lentfer /**
563825eb42bSJan Lentfer  * Should the nameserver list be randomized before each use
564825eb42bSJan Lentfer  * \param[in] r the resolver
565825eb42bSJan Lentfer  * \param[in] b: true: randomize, false: don't
566825eb42bSJan Lentfer  */
567825eb42bSJan Lentfer void ldns_resolver_set_random(ldns_resolver *r, bool b);
568825eb42bSJan Lentfer 
569825eb42bSJan Lentfer /**
570ac996e71SJan Lentfer  * Push a new nameserver to the resolver. It must be an IP
571825eb42bSJan Lentfer  * address v4 or v6.
572825eb42bSJan Lentfer  * \param[in] r the resolver
573825eb42bSJan Lentfer  * \param[in] n the ip address
574825eb42bSJan Lentfer  * \return ldns_status a status
575825eb42bSJan Lentfer  */
5765340022aSzrj ldns_status ldns_resolver_push_nameserver(ldns_resolver *r, const ldns_rdf *n);
577825eb42bSJan Lentfer 
578825eb42bSJan Lentfer /**
579ac996e71SJan Lentfer  * Push a new nameserver to the resolver. It must be an
580825eb42bSJan Lentfer  * A or AAAA RR record type
581825eb42bSJan Lentfer  * \param[in] r the resolver
582825eb42bSJan Lentfer  * \param[in] rr the resource record
583825eb42bSJan Lentfer  * \return ldns_status a status
584825eb42bSJan Lentfer  */
5855340022aSzrj ldns_status ldns_resolver_push_nameserver_rr(ldns_resolver *r, const ldns_rr *rr);
586825eb42bSJan Lentfer 
587825eb42bSJan Lentfer /**
588ac996e71SJan Lentfer  * Push a new nameserver rr_list to the resolver.
589825eb42bSJan Lentfer  * \param[in] r the resolver
590825eb42bSJan Lentfer  * \param[in] rrlist the rr_list to push
591825eb42bSJan Lentfer  * \return ldns_status a status
592825eb42bSJan Lentfer  */
5935340022aSzrj ldns_status ldns_resolver_push_nameserver_rr_list(ldns_resolver *r, const ldns_rr_list *rrlist);
594825eb42bSJan Lentfer 
595825eb42bSJan Lentfer /**
596825eb42bSJan Lentfer  * Send the query for using the resolver and take the search list into account
597825eb42bSJan Lentfer  * The search algorithm is as follows:
598825eb42bSJan Lentfer  * If the name is absolute, try it as-is, otherwise apply the search list
599825eb42bSJan Lentfer  * \param[in] *r operate using this resolver
600825eb42bSJan Lentfer  * \param[in] *rdf query for this name
601825eb42bSJan Lentfer  * \param[in] t query for this type (may be 0, defaults to A)
602825eb42bSJan Lentfer  * \param[in] c query for this class (may be 0, default to IN)
603825eb42bSJan Lentfer  * \param[in] flags the query flags
604d1b2b5caSJohn Marino  *
605825eb42bSJan Lentfer  * \return ldns_pkt* a packet with the reply from the nameserver
606825eb42bSJan Lentfer  */
607825eb42bSJan Lentfer ldns_pkt* ldns_resolver_search(const ldns_resolver *r, const ldns_rdf *rdf, ldns_rr_type t, ldns_rr_class c, uint16_t flags);
608825eb42bSJan Lentfer 
6095340022aSzrj 
6105340022aSzrj /**
6115340022aSzrj  * Send the query for using the resolver and take the search list into account
6125340022aSzrj  * The search algorithm is as follows:
6135340022aSzrj  * If the name is absolute, try it as-is, otherwise apply the search list
6145340022aSzrj  * \param[out] pkt a packet with the reply from the nameserver
6155340022aSzrj  * \param[in] *r operate using this resolver
6165340022aSzrj  * \param[in] *rdf query for this name
6175340022aSzrj  * \param[in] t query for this type (may be 0, defaults to A)
6185340022aSzrj  * \param[in] c query for this class (may be 0, default to IN)
6195340022aSzrj  * \param[in] flags the query flags
6205340022aSzrj  *
6215340022aSzrj  * \return ldns_status LDNS_STATUS_OK on success
6225340022aSzrj  */
6235340022aSzrj ldns_status ldns_resolver_search_status(ldns_pkt** pkt, ldns_resolver *r, const ldns_rdf *rdf, ldns_rr_type t, ldns_rr_class c, uint16_t flags);
6245340022aSzrj 
625825eb42bSJan Lentfer /**
626825eb42bSJan Lentfer  * Form a query packet from a resolver and name/type/class combo
627825eb42bSJan Lentfer  * \param[out] **q a pointer to a ldns_pkt pointer (initialized by this function)
628825eb42bSJan Lentfer  * \param[in] *r operate using this resolver
629825eb42bSJan Lentfer  * \param[in] *name query for this name
630825eb42bSJan Lentfer  * \param[in] t query for this type (may be 0, defaults to A)
631825eb42bSJan Lentfer  * \param[in] c query for this class (may be 0, default to IN)
632825eb42bSJan Lentfer  * \param[in] f the query flags
633d1b2b5caSJohn Marino  *
634825eb42bSJan Lentfer  * \return ldns_pkt* a packet with the reply from the nameserver
635825eb42bSJan Lentfer  */
636825eb42bSJan Lentfer ldns_status ldns_resolver_prepare_query_pkt(ldns_pkt **q, ldns_resolver *r, const  ldns_rdf *name, ldns_rr_type t, ldns_rr_class c, uint16_t f);
637825eb42bSJan Lentfer 
638825eb42bSJan Lentfer /**
639825eb42bSJan Lentfer  * Send the query for name as-is
640825eb42bSJan Lentfer  * \param[out] **answer a pointer to a ldns_pkt pointer (initialized by this function)
641825eb42bSJan Lentfer  * \param[in] *r operate using this resolver
642825eb42bSJan Lentfer  * \param[in] *name query for this name
643825eb42bSJan Lentfer  * \param[in] t query for this type (may be 0, defaults to A)
644825eb42bSJan Lentfer  * \param[in] c query for this class (may be 0, default to IN)
645825eb42bSJan Lentfer  * \param[in] flags the query flags
646d1b2b5caSJohn Marino  *
6475340022aSzrj  * \return ldns_status LDNS_STATUS_OK on success
648825eb42bSJan Lentfer  */
649825eb42bSJan Lentfer ldns_status ldns_resolver_send(ldns_pkt **answer, ldns_resolver *r, const ldns_rdf *name, ldns_rr_type t, ldns_rr_class c, uint16_t flags);
650825eb42bSJan Lentfer 
651825eb42bSJan Lentfer /**
652825eb42bSJan Lentfer  * Send the given packet to a nameserver
653825eb42bSJan Lentfer  * \param[out] **answer a pointer to a ldns_pkt pointer (initialized by this function)
654825eb42bSJan Lentfer  * \param[in] *r operate using this resolver
655825eb42bSJan Lentfer  * \param[in] *query_pkt query
656825eb42bSJan Lentfer  */
657825eb42bSJan Lentfer ldns_status ldns_resolver_send_pkt(ldns_pkt **answer, ldns_resolver *r, ldns_pkt *query_pkt);
658825eb42bSJan Lentfer 
659825eb42bSJan Lentfer /**
660825eb42bSJan Lentfer  * Send a query to a nameserver
6615340022aSzrj  * \param[out] pkt a packet with the reply from the nameserver
662825eb42bSJan Lentfer  * \param[in] *r operate using this resolver
663825eb42bSJan Lentfer  * \param[in] *name query for this name
664825eb42bSJan Lentfer  * \param[in] *t query for this type (may be 0, defaults to A)
665825eb42bSJan Lentfer  * \param[in] *c query for this class (may be 0, default to IN)
666825eb42bSJan Lentfer  * \param[in] flags the query flags
667d1b2b5caSJohn Marino  *
6685340022aSzrj  * \return ldns_status LDNS_STATUS_OK on success
6695340022aSzrj  * if _defnames is true the default domain will be added
6705340022aSzrj  */
6715340022aSzrj ldns_status ldns_resolver_query_status(ldns_pkt** pkt, ldns_resolver *r, const ldns_rdf *name, ldns_rr_type t, ldns_rr_class c, uint16_t flags);
6725340022aSzrj 
6735340022aSzrj 
6745340022aSzrj /**
6755340022aSzrj  * Send a query to a nameserver
6765340022aSzrj  * \param[in] *r operate using this resolver
6775340022aSzrj  *               (despite the const in the declaration,
6785340022aSzrj  *                the struct is altered as a side-effect)
6795340022aSzrj  * \param[in] *name query for this name
6805340022aSzrj  * \param[in] *t query for this type (may be 0, defaults to A)
6815340022aSzrj  * \param[in] *c query for this class (may be 0, default to IN)
6825340022aSzrj  * \param[in] flags the query flags
6835340022aSzrj  *
684825eb42bSJan Lentfer  * \return ldns_pkt* a packet with the reply from the nameserver
685825eb42bSJan Lentfer  * if _defnames is true the default domain will be added
686825eb42bSJan Lentfer  */
687825eb42bSJan Lentfer ldns_pkt* ldns_resolver_query(const ldns_resolver *r, const ldns_rdf *name, ldns_rr_type t, ldns_rr_class c, uint16_t flags);
688825eb42bSJan Lentfer 
689825eb42bSJan Lentfer 
690825eb42bSJan Lentfer /**
691825eb42bSJan Lentfer  * Create a new resolver structure
6925340022aSzrj  * \return ldns_resolver* pointer to new structure
693825eb42bSJan Lentfer  */
694825eb42bSJan Lentfer ldns_resolver* ldns_resolver_new(void);
695825eb42bSJan Lentfer 
696825eb42bSJan Lentfer /**
6975340022aSzrj  * Clone a resolver
6985340022aSzrj  * \param[in] r the resolver to clone
6995340022aSzrj  * \return ldns_resolver* pointer to new structure
7005340022aSzrj  */
7015340022aSzrj ldns_resolver* ldns_resolver_clone(ldns_resolver *r);
7025340022aSzrj 
7035340022aSzrj /**
704825eb42bSJan Lentfer  * Create a resolver structure from a file like /etc/resolv.conf
705825eb42bSJan Lentfer  * \param[out] r the new resolver
706825eb42bSJan Lentfer  * \param[in] fp file pointer to create new resolver from
707825eb42bSJan Lentfer  *      if NULL use /etc/resolv.conf
708825eb42bSJan Lentfer  * \return LDNS_STATUS_OK or the error
709825eb42bSJan Lentfer  */
710825eb42bSJan Lentfer ldns_status ldns_resolver_new_frm_fp(ldns_resolver **r, FILE *fp);
711825eb42bSJan Lentfer 
712825eb42bSJan Lentfer /**
713825eb42bSJan Lentfer  * Create a resolver structure from a file like /etc/resolv.conf
714825eb42bSJan Lentfer  * \param[out] r the new resolver
715825eb42bSJan Lentfer  * \param[in] fp file pointer to create new resolver from
716825eb42bSJan Lentfer  *      if NULL use /etc/resolv.conf
717825eb42bSJan Lentfer  * \param[in] line_nr pointer to an integer containing the current line number (for debugging purposes)
718825eb42bSJan Lentfer  * \return LDNS_STATUS_OK or the error
719825eb42bSJan Lentfer  */
720825eb42bSJan Lentfer ldns_status ldns_resolver_new_frm_fp_l(ldns_resolver **r, FILE *fp, int *line_nr);
721825eb42bSJan Lentfer 
722825eb42bSJan Lentfer /**
723ac996e71SJan Lentfer  * Configure a resolver by means of a resolv.conf file
724825eb42bSJan Lentfer  * The file may be NULL in which case there will  be
7255340022aSzrj  * looked the RESOLV_CONF (defaults to /etc/resolv.conf)
726825eb42bSJan Lentfer  * \param[out] r the new resolver
727825eb42bSJan Lentfer  * \param[in] filename the filename to use
728825eb42bSJan Lentfer  * \return LDNS_STATUS_OK or the error
729825eb42bSJan Lentfer  */
730825eb42bSJan Lentfer ldns_status ldns_resolver_new_frm_file(ldns_resolver **r, const char *filename);
731825eb42bSJan Lentfer 
732825eb42bSJan Lentfer /**
733*ee791febSAntonio Huete Jimenez  * Frees the allocated space for this resolver. Only frees the resolver pointer! You should probably be using _deep_free.
734825eb42bSJan Lentfer  * \param res resolver to free
735825eb42bSJan Lentfer  */
736825eb42bSJan Lentfer void ldns_resolver_free(ldns_resolver *res);
737825eb42bSJan Lentfer 
738825eb42bSJan Lentfer /**
739825eb42bSJan Lentfer  * Frees the allocated space for this resolver and all it's data
740825eb42bSJan Lentfer  * \param res resolver to free
741825eb42bSJan Lentfer  */
742825eb42bSJan Lentfer void ldns_resolver_deep_free(ldns_resolver *res);
743825eb42bSJan Lentfer 
744825eb42bSJan Lentfer /**
745ac996e71SJan Lentfer  * Get the next stream of RRs in a AXFR
746825eb42bSJan Lentfer  * \param[in] resolver the resolver to use. First ldns_axfr_start() must be
747825eb42bSJan Lentfer  * called
748825eb42bSJan Lentfer  * \return ldns_rr the next RR from the AXFR stream
749ac996e71SJan Lentfer  * After you get this returned RR (not NULL: on error), then check if
750ac996e71SJan Lentfer  * ldns_axfr_complete() is true to see if the zone transfer has completed.
751825eb42bSJan Lentfer  */
752825eb42bSJan Lentfer ldns_rr* ldns_axfr_next(ldns_resolver *resolver);
753825eb42bSJan Lentfer 
754825eb42bSJan Lentfer /**
7555340022aSzrj  * Abort a transfer that is in progress
7565340022aSzrj  * \param[in] resolver the resolver that is used
7575340022aSzrj  */
7585340022aSzrj void ldns_axfr_abort(ldns_resolver *resolver);
7595340022aSzrj 
7605340022aSzrj /**
761ac996e71SJan Lentfer  * Returns true if the axfr transfer has completed (i.e. 2 SOA RRs and no errors were encountered
762825eb42bSJan Lentfer  * \param[in] resolver the resolver that is used
763825eb42bSJan Lentfer  * \return bool true if axfr transfer was completed without error
764825eb42bSJan Lentfer  */
765825eb42bSJan Lentfer bool ldns_axfr_complete(const ldns_resolver *resolver);
766825eb42bSJan Lentfer 
767825eb42bSJan Lentfer /**
768ac996e71SJan Lentfer  * Returns a pointer to the last ldns_pkt that was sent by the server in the AXFR transfer
769*ee791febSAntonio Huete Jimenez  * usable for instance to get the error code on failure
770825eb42bSJan Lentfer  * \param[in] res the resolver that was used in the axfr transfer
771825eb42bSJan Lentfer  * \return ldns_pkt the last packet sent
772825eb42bSJan Lentfer  */
773825eb42bSJan Lentfer ldns_pkt *ldns_axfr_last_pkt(const ldns_resolver *res);
774825eb42bSJan Lentfer 
775825eb42bSJan Lentfer /**
7765340022aSzrj  * Get the serial for requesting IXFR.
7775340022aSzrj  * \param[in] r the resolver
7785340022aSzrj  * \param[in] serial serial
7795340022aSzrj  */
7805340022aSzrj void ldns_resolver_set_ixfr_serial(ldns_resolver *r, uint32_t serial);
7815340022aSzrj 
7825340022aSzrj /**
7835340022aSzrj  * Get the serial for requesting IXFR.
7845340022aSzrj  * \param[in] res the resolver
7855340022aSzrj  * \return uint32_t serial
7865340022aSzrj  */
7875340022aSzrj uint32_t ldns_resolver_get_ixfr_serial(const ldns_resolver *res);
7885340022aSzrj 
7895340022aSzrj /**
790ac996e71SJan Lentfer  * Randomize the nameserver list in the resolver
791825eb42bSJan Lentfer  * \param[in] r the resolver
792825eb42bSJan Lentfer  */
793825eb42bSJan Lentfer void ldns_resolver_nameservers_randomize(ldns_resolver *r);
794825eb42bSJan Lentfer 
795825eb42bSJan Lentfer /**
796825eb42bSJan Lentfer  * Returns true if at least one of the provided keys is a trust anchor
797825eb42bSJan Lentfer  * \param[in] r the current resolver
798825eb42bSJan Lentfer  * \param[in] keys the keyset to check
799825eb42bSJan Lentfer  * \param[out] trusted_keys the subset of trusted keys in the 'keys' rrset
800825eb42bSJan Lentfer  * \return true if at least one of the provided keys is a configured trust anchor
801825eb42bSJan Lentfer  */
802825eb42bSJan Lentfer bool ldns_resolver_trusted_key(const ldns_resolver *r, ldns_rr_list * keys, ldns_rr_list * trusted_keys);
803825eb42bSJan Lentfer 
804ac996e71SJan Lentfer #ifdef __cplusplus
805ac996e71SJan Lentfer }
806ac996e71SJan Lentfer #endif
807ac996e71SJan Lentfer 
808825eb42bSJan Lentfer #endif  /* LDNS_RESOLVER_H */
809