resolver.h
Go to the documentation of this file.
00001 /*
00002  * resolver.h
00003  *
00004  * DNS Resolver definitions
00005  *
00006  * a Net::DNS like library for C
00007  *
00008  * (c) NLnet Labs, 2005-2006
00009  *
00010  * See the file LICENSE for the license
00011  */
00012 
00020 #ifndef LDNS_RESOLVER_H
00021 #define LDNS_RESOLVER_H
00022 
00023 #include <ldns/error.h>
00024 #include <ldns/common.h>
00025 #include <ldns/rr.h>
00026 #include <ldns/tsig.h>
00027 #include <ldns/rdata.h>
00028 #include <ldns/packet.h>
00029 #include <sys/time.h>
00030 
00031 #ifdef __cplusplus
00032 extern "C" {
00033 #endif
00034 
00036 #define LDNS_RESOLV_CONF        "/etc/resolv.conf"
00037 
00038 #define LDNS_RESOLV_HOSTS       "/etc/hosts"
00039 
00040 #define LDNS_RESOLV_KEYWORD     -1
00041 #define LDNS_RESOLV_DEFDOMAIN   0
00042 #define LDNS_RESOLV_NAMESERVER  1
00043 #define LDNS_RESOLV_SEARCH      2
00044 #define LDNS_RESOLV_SORTLIST    3
00045 #define LDNS_RESOLV_OPTIONS     4
00046 #define LDNS_RESOLV_ANCHOR      5
00047 #define LDNS_RESOLV_KEYWORDS    6
00048 
00049 #define LDNS_RESOLV_INETANY             0
00050 #define LDNS_RESOLV_INET                1
00051 #define LDNS_RESOLV_INET6               2
00052 
00053 #define LDNS_RESOLV_RTT_INF             0       /* infinity */
00054 #define LDNS_RESOLV_RTT_MIN             1       /* reachable */
00055 
00059 struct ldns_struct_resolver
00060 {
00062         uint16_t _port;
00063 
00065         ldns_rdf **_nameservers;
00067         size_t _nameserver_count; /* how many do we have */
00068 
00070         size_t *_rtt;
00071 
00073         bool _recursive;
00074 
00076         bool _debug;
00077 
00079         ldns_rdf *_domain;
00080 
00082         ldns_rdf **_searchlist;
00083 
00085         size_t _searchlist_count;
00086 
00088         uint8_t _retry;
00090         uint8_t _retrans;
00092         bool _fallback;
00093 
00095         bool _dnssec;
00097         bool _dnssec_cd;
00099         ldns_rr_list * _dnssec_anchors;
00101         bool _usevc;
00103         bool _igntc;
00105         uint8_t _ip6;
00107         bool _defnames;
00109         bool _dnsrch;
00111         struct timeval _timeout;
00113         bool _fail;
00115         bool _random;
00117         int _socket;
00121         int _axfr_soa_count;
00122         /* when axfring we get complete packets from the server
00123            but we want to give the caller 1 rr at a time, so
00124            keep the current pkt */
00126         ldns_pkt *_cur_axfr_pkt;
00128         uint16_t _axfr_i;
00129         /* EDNS0 available buffer size */
00130         uint16_t _edns_udp_size;
00131 
00132         /* Optional tsig key for signing queries,
00133         outgoing messages are signed if and only if both are set
00134         */
00136         char *_tsig_keyname;
00138         char *_tsig_keydata;
00140         char *_tsig_algorithm;
00141 
00143         ldns_rdf *_source;
00144 };
00145 typedef struct ldns_struct_resolver ldns_resolver;
00146 
00147 /* prototypes */
00148 /* read access functions */
00149 
00155 uint16_t ldns_resolver_port(const ldns_resolver *r);
00156 
00162 ldns_rdf *ldns_resolver_source(const ldns_resolver *r);
00163 
00169 bool ldns_resolver_recursive(const ldns_resolver *r);
00170 
00176 bool ldns_resolver_debug(const ldns_resolver *r);
00177 
00183 uint8_t ldns_resolver_retry(const ldns_resolver *r);
00184 
00190 uint8_t ldns_resolver_retrans(const ldns_resolver *r);
00191 
00197 bool ldns_resolver_fallback(const ldns_resolver *r);
00198 
00204 uint8_t ldns_resolver_ip6(const ldns_resolver *r);
00205 
00211 uint16_t ldns_resolver_edns_udp_size(const ldns_resolver *r);
00217 bool ldns_resolver_usevc(const ldns_resolver *r);
00223 bool ldns_resolver_fail(const ldns_resolver *r);
00229 bool ldns_resolver_defnames(const ldns_resolver *r);
00235 bool ldns_resolver_dnsrch(const ldns_resolver *r);
00241 bool ldns_resolver_dnssec(const ldns_resolver *r);
00247 bool ldns_resolver_dnssec_cd(const ldns_resolver *r);
00253 ldns_rr_list * ldns_resolver_dnssec_anchors(const ldns_resolver *r);
00259 bool ldns_resolver_igntc(const ldns_resolver *r);
00265 bool ldns_resolver_random(const ldns_resolver *r);
00271 size_t ldns_resolver_nameserver_count(const ldns_resolver *r);
00277 ldns_rdf *ldns_resolver_domain(const ldns_resolver *r);
00283 struct timeval ldns_resolver_timeout(const ldns_resolver *r);
00289 ldns_rdf** ldns_resolver_searchlist(const ldns_resolver *r);
00295 ldns_rdf** ldns_resolver_nameservers(const ldns_resolver *r);
00302 size_t * ldns_resolver_rtt(const ldns_resolver *r);
00309 size_t ldns_resolver_nameserver_rtt(const ldns_resolver *r, size_t pos);
00315 char *ldns_resolver_tsig_keyname(const ldns_resolver *r);
00321 char *ldns_resolver_tsig_algorithm(const ldns_resolver *r);
00327 char *ldns_resolver_tsig_keydata(const ldns_resolver *r);
00333 ldns_rdf* ldns_resolver_pop_nameserver(ldns_resolver *r);
00334 
00340 size_t ldns_resolver_searchlist_count(const ldns_resolver *r);
00341 
00342 /* write access function */
00348 void ldns_resolver_set_port(ldns_resolver *r, uint16_t p);
00349 
00355 void ldns_resolver_set_source(ldns_resolver *r, ldns_rdf *s);
00356 
00362 void ldns_resolver_set_recursive(ldns_resolver *r, bool b);
00363 
00369 void ldns_resolver_set_debug(ldns_resolver *r, bool b);
00370 
00375 void ldns_resolver_incr_nameserver_count(ldns_resolver *r);
00376 
00381 void ldns_resolver_dec_nameserver_count(ldns_resolver *r);
00382 
00388 void ldns_resolver_set_nameserver_count(ldns_resolver *r, size_t c);
00389 
00395 void ldns_resolver_set_nameservers(ldns_resolver *r, ldns_rdf **rd);
00396 
00403 void ldns_resolver_set_domain(ldns_resolver *r, ldns_rdf *rd);
00404 
00410 void ldns_resolver_set_timeout(ldns_resolver *r, struct timeval timeout);
00411 
00417 void ldns_resolver_push_searchlist(ldns_resolver *r, ldns_rdf *rd);
00418 
00424 void ldns_resolver_set_defnames(ldns_resolver *r, bool b);
00425 
00431 void ldns_resolver_set_usevc(ldns_resolver *r, bool b);
00432 
00438 void ldns_resolver_set_dnsrch(ldns_resolver *r, bool b);
00439 
00445 void ldns_resolver_set_dnssec(ldns_resolver *r, bool b);
00446 
00452 void ldns_resolver_set_dnssec_cd(ldns_resolver *r, bool b);
00458 void ldns_resolver_set_dnssec_anchors(ldns_resolver *r, ldns_rr_list * l);
00459 
00466 ldns_status ldns_resolver_push_dnssec_anchor(ldns_resolver *r, ldns_rr *rr);
00467 
00473 void ldns_resolver_set_retrans(ldns_resolver *r, uint8_t re);
00474 
00481 void ldns_resolver_set_fallback(ldns_resolver *r, bool fallback);
00482 
00489 void ldns_resolver_set_retry(ldns_resolver *r, uint8_t re);
00490 
00496 void ldns_resolver_set_ip6(ldns_resolver *r, uint8_t i);
00497 
00503 void ldns_resolver_set_fail(ldns_resolver *r, bool b);
00504 
00510 void ldns_resolver_set_igntc(ldns_resolver *r, bool b);
00511 
00517 void ldns_resolver_set_edns_udp_size(ldns_resolver *r, uint16_t s);
00518 
00524 void ldns_resolver_set_tsig_keyname(ldns_resolver *r, char *tsig_keyname);
00525 
00531 void ldns_resolver_set_tsig_algorithm(ldns_resolver *r, char *tsig_algorithm);
00532 
00538 void ldns_resolver_set_tsig_keydata(ldns_resolver *r, char *tsig_keydata);
00539 
00546 void ldns_resolver_set_rtt(ldns_resolver *r, size_t *rtt);
00547 
00555 void ldns_resolver_set_nameserver_rtt(ldns_resolver *r, size_t pos, size_t value);
00556 
00562 void ldns_resolver_set_random(ldns_resolver *r, bool b);
00563 
00571 ldns_status ldns_resolver_push_nameserver(ldns_resolver *r, ldns_rdf *n);
00572 
00580 ldns_status ldns_resolver_push_nameserver_rr(ldns_resolver *r, ldns_rr *rr);
00581 
00588 ldns_status ldns_resolver_push_nameserver_rr_list(ldns_resolver *r, ldns_rr_list *rrlist);
00589 
00602 ldns_pkt* ldns_resolver_search(const ldns_resolver *r, const ldns_rdf *rdf, ldns_rr_type t, ldns_rr_class c, uint16_t flags);
00603 
00604 
00618 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);
00619 
00631 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);
00632 
00644 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);
00645 
00652 ldns_status ldns_resolver_send_pkt(ldns_pkt **answer, ldns_resolver *r, ldns_pkt *query_pkt);
00653 
00666 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);
00667 
00668 
00682 ldns_pkt* ldns_resolver_query(const ldns_resolver *r, const ldns_rdf *name, ldns_rr_type t, ldns_rr_class c, uint16_t flags);
00683 
00684 
00689 ldns_resolver* ldns_resolver_new(void);
00690 
00698 ldns_status ldns_resolver_new_frm_fp(ldns_resolver **r, FILE *fp);
00699 
00708 ldns_status ldns_resolver_new_frm_fp_l(ldns_resolver **r, FILE *fp, int *line_nr);
00709 
00718 ldns_status ldns_resolver_new_frm_file(ldns_resolver **r, const char *filename);
00719 
00724 void ldns_resolver_free(ldns_resolver *res);
00725 
00730 void ldns_resolver_deep_free(ldns_resolver *res);
00731 
00740 ldns_rr* ldns_axfr_next(ldns_resolver *resolver);
00741 
00747 bool ldns_axfr_complete(const ldns_resolver *resolver);
00748 
00755 ldns_pkt *ldns_axfr_last_pkt(const ldns_resolver *res);
00756 
00761 void ldns_resolver_nameservers_randomize(ldns_resolver *r);
00762 
00770 bool ldns_resolver_trusted_key(const ldns_resolver *r, ldns_rr_list * keys, ldns_rr_list * trusted_keys);
00771 
00772 #ifdef __cplusplus
00773 }
00774 #endif
00775 
00776 #endif  /* LDNS_RESOLVER_H */