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