rr.h
Go to the documentation of this file.
00001 /*
00002  * rr.h -  resource record definitions
00003  *
00004  * a Net::DNS like library for C
00005  *
00006  * (c) NLnet Labs, 2005-2006
00007  *
00008  * See the file LICENSE for the license
00009  */
00010 
00018 #ifndef LDNS_RR_H
00019 #define LDNS_RR_H
00020 
00021 #include <ldns/common.h>
00022 #include <ldns/rdata.h>
00023 #include <ldns/buffer.h>
00024 #include <ldns/error.h>
00025 
00026 #ifdef __cplusplus
00027 extern "C" {
00028 #endif
00029 
00031 #define LDNS_MAX_LABELLEN     63
00032 
00033 #define LDNS_MAX_DOMAINLEN    255
00034 
00035 #define LDNS_MAX_POINTERS       65535
00036 
00037 #define LDNS_RR_OVERHEAD        10
00038 
00039 /* The first fields are 'common' and can be referenced instantly */
00040 #define LDNS_RDATA_FIELD_DESCRIPTORS_COMMON 53
00041 
00042 
00043 
00047 enum ldns_enum_rr_class
00048 {
00050         LDNS_RR_CLASS_IN        = 1,
00052         LDNS_RR_CLASS_CH        = 3,
00054         LDNS_RR_CLASS_HS        = 4,
00056     LDNS_RR_CLASS_NONE      = 254,
00058         LDNS_RR_CLASS_ANY       = 255,
00059 
00060         LDNS_RR_CLASS_FIRST     = 0,
00061         LDNS_RR_CLASS_LAST      = 65535,
00062         LDNS_RR_CLASS_COUNT     = LDNS_RR_CLASS_LAST - LDNS_RR_CLASS_FIRST + 1
00063 };
00064 typedef enum ldns_enum_rr_class ldns_rr_class;
00065 
00069 enum ldns_enum_rr_compress
00070 {
00072         LDNS_RR_COMPRESS,
00073         LDNS_RR_NO_COMPRESS
00074 };
00075 typedef enum ldns_enum_rr_compress ldns_rr_compress;
00076 
00080 enum ldns_enum_rr_type
00081 {
00083         LDNS_RR_TYPE_A = 1,
00085         LDNS_RR_TYPE_NS = 2,
00087         LDNS_RR_TYPE_MD = 3,
00089         LDNS_RR_TYPE_MF = 4,
00091         LDNS_RR_TYPE_CNAME = 5,
00093         LDNS_RR_TYPE_SOA = 6,
00095         LDNS_RR_TYPE_MB = 7,
00097         LDNS_RR_TYPE_MG = 8,
00099         LDNS_RR_TYPE_MR = 9,
00101         LDNS_RR_TYPE_NULL = 10,
00103         LDNS_RR_TYPE_WKS = 11,
00105         LDNS_RR_TYPE_PTR = 12,
00107         LDNS_RR_TYPE_HINFO = 13,
00109         LDNS_RR_TYPE_MINFO = 14,
00111         LDNS_RR_TYPE_MX = 15,
00113         LDNS_RR_TYPE_TXT = 16,
00115         LDNS_RR_TYPE_RP = 17,
00117         LDNS_RR_TYPE_AFSDB = 18,
00119         LDNS_RR_TYPE_X25 = 19,
00121         LDNS_RR_TYPE_ISDN = 20,
00123         LDNS_RR_TYPE_RT = 21,
00125         LDNS_RR_TYPE_NSAP = 22,
00127         LDNS_RR_TYPE_NSAP_PTR = 23,
00129         LDNS_RR_TYPE_SIG = 24,
00131         LDNS_RR_TYPE_KEY = 25,
00133         LDNS_RR_TYPE_PX = 26,
00135         LDNS_RR_TYPE_GPOS = 27,
00137         LDNS_RR_TYPE_AAAA = 28,
00139         LDNS_RR_TYPE_LOC = 29,
00141         LDNS_RR_TYPE_NXT = 30,
00143         LDNS_RR_TYPE_EID = 31,
00145         LDNS_RR_TYPE_NIMLOC = 32,
00147         LDNS_RR_TYPE_SRV = 33,
00149         LDNS_RR_TYPE_ATMA = 34,
00151         LDNS_RR_TYPE_NAPTR = 35,
00153         LDNS_RR_TYPE_KX = 36,
00155         LDNS_RR_TYPE_CERT = 37,
00157         LDNS_RR_TYPE_A6 = 38,
00159         LDNS_RR_TYPE_DNAME = 39,
00161         LDNS_RR_TYPE_SINK = 40,
00163         LDNS_RR_TYPE_OPT = 41,
00165         LDNS_RR_TYPE_APL = 42,
00167         LDNS_RR_TYPE_DS = 43,
00169         LDNS_RR_TYPE_SSHFP = 44, /* RFC 4255 */
00171         LDNS_RR_TYPE_IPSECKEY = 45, /* RFC 4025 */
00173         LDNS_RR_TYPE_RRSIG = 46, /* RFC 4034 */
00174         LDNS_RR_TYPE_NSEC = 47, /* RFC 4034 */
00175         LDNS_RR_TYPE_DNSKEY = 48, /* RFC 4034 */
00176 
00177         LDNS_RR_TYPE_DHCID = 49, /* RFC 4701 */
00178         /* NSEC3 */
00179         LDNS_RR_TYPE_NSEC3 = 50, /* RFC 5155 */
00180         LDNS_RR_TYPE_NSEC3PARAM = 51, /* RFC 5155 */
00181         LDNS_RR_TYPE_NSEC3PARAMS = 51,
00183         LDNS_RR_TYPE_TLSA = 52,
00184 
00186         LDNS_RR_TYPE_TALINK = 58,
00187 
00188         LDNS_RR_TYPE_SPF = 99,
00189 
00190         LDNS_RR_TYPE_UINFO = 100,
00191         LDNS_RR_TYPE_UID = 101,
00192         LDNS_RR_TYPE_GID = 102,
00193         LDNS_RR_TYPE_UNSPEC = 103,
00194 
00195         LDNS_RR_TYPE_TSIG = 250,
00196         LDNS_RR_TYPE_IXFR = 251,
00197         LDNS_RR_TYPE_AXFR = 252,
00199         LDNS_RR_TYPE_MAILB = 253,
00201         LDNS_RR_TYPE_MAILA = 254,
00203         LDNS_RR_TYPE_ANY = 255,
00204 
00205         /* RFC 4431, 5074, DNSSEC Lookaside Validation */
00206         LDNS_RR_TYPE_DLV = 32769,
00207 
00208         /* type codes from nsec3 experimental phase
00209         LDNS_RR_TYPE_NSEC3 = 65324,
00210         LDNS_RR_TYPE_NSEC3PARAMS = 65325, */
00211         LDNS_RR_TYPE_FIRST = 0,
00212         LDNS_RR_TYPE_LAST  = 65535,
00213         LDNS_RR_TYPE_COUNT = LDNS_RR_TYPE_LAST - LDNS_RR_TYPE_FIRST + 1
00214 };
00215 typedef enum ldns_enum_rr_type ldns_rr_type;
00216 
00278 struct ldns_struct_rr
00279 {
00281         ldns_rdf        *_owner;
00283         uint32_t        _ttl;
00285         size_t          _rd_count;
00287         ldns_rr_type    _rr_type;
00289         ldns_rr_class   _rr_class;
00290         /* everything in the rdata is in network order */
00292         ldns_rdf         **_rdata_fields;
00296         bool            _rr_question;
00297 };
00298 typedef struct ldns_struct_rr ldns_rr;
00299 
00306 struct ldns_struct_rr_list
00307 {
00308         size_t _rr_count;
00309         size_t _rr_capacity;
00310         ldns_rr **_rrs;
00311 };
00312 typedef struct ldns_struct_rr_list ldns_rr_list;
00313 
00319 struct ldns_struct_rr_descriptor
00320 {
00322         ldns_rr_type    _type;
00324         const char *_name;
00326         uint8_t     _minimum;
00328         uint8_t     _maximum;
00330         const ldns_rdf_type *_wireformat;
00332         ldns_rdf_type _variable;
00334         ldns_rr_compress _compress;
00336         uint8_t _dname_count;
00337 };
00338 typedef struct ldns_struct_rr_descriptor ldns_rr_descriptor;
00339 
00344 ldns_rr* ldns_rr_new(void);
00345 
00350 ldns_rr* ldns_rr_new_frm_type(ldns_rr_type t);
00351 
00357 void ldns_rr_free(ldns_rr *rr);
00358 
00375 ldns_status ldns_rr_new_frm_str(ldns_rr **n, const char *str,
00376                                 uint32_t default_ttl, ldns_rdf *origin,
00377                                 ldns_rdf **prev);
00378 
00392 ldns_status ldns_rr_new_question_frm_str(ldns_rr **n, const char *str,
00393                                 ldns_rdf *origin, ldns_rdf **prev);
00394 
00409 ldns_status ldns_rr_new_frm_fp(ldns_rr **rr, FILE *fp, uint32_t *default_ttl, ldns_rdf **origin, ldns_rdf **prev);
00410 
00426 ldns_status ldns_rr_new_frm_fp_l(ldns_rr **rr, FILE *fp, uint32_t *default_ttl, ldns_rdf **origin, ldns_rdf **prev, int *line_nr);
00427 
00434 void ldns_rr_set_owner(ldns_rr *rr, ldns_rdf *owner);
00435 
00442 void ldns_rr_set_question(ldns_rr *rr, bool question);
00443 
00450 void ldns_rr_set_ttl(ldns_rr *rr, uint32_t ttl);
00451 
00458 void ldns_rr_set_rd_count(ldns_rr *rr, size_t count);
00459 
00466 void ldns_rr_set_type(ldns_rr *rr, ldns_rr_type rr_type);
00467 
00474 void ldns_rr_set_class(ldns_rr *rr, ldns_rr_class rr_class);
00475 
00484 ldns_rdf* ldns_rr_set_rdf(ldns_rr *rr, const ldns_rdf *f, size_t position);
00485 
00493 bool ldns_rr_push_rdf(ldns_rr *rr, const ldns_rdf *f);
00494 
00501 ldns_rdf* ldns_rr_pop_rdf(ldns_rr *rr);
00502 
00509 ldns_rdf* ldns_rr_rdf(const ldns_rr *rr, size_t nr);
00510 
00516 ldns_rdf* ldns_rr_owner(const ldns_rr *rr);
00517 
00523 bool ldns_rr_is_question(const ldns_rr *rr);
00524 
00530 uint32_t ldns_rr_ttl(const ldns_rr *rr);
00531 
00537 size_t ldns_rr_rd_count(const ldns_rr *rr);
00538 
00544 ldns_rr_type ldns_rr_get_type(const ldns_rr *rr);
00545 
00551 ldns_rr_class ldns_rr_get_class(const ldns_rr *rr);
00552 
00553 /* rr_lists */
00554 
00560 size_t ldns_rr_list_rr_count(const ldns_rr_list *rr_list);
00561 
00568 void ldns_rr_list_set_rr_count(ldns_rr_list *rr_list, size_t count);
00569 
00578 ldns_rr * ldns_rr_list_set_rr(ldns_rr_list *rr_list, const ldns_rr *r, size_t count);
00579 
00586 ldns_rr* ldns_rr_list_rr(const ldns_rr_list *rr_list, size_t nr);
00587 
00592 ldns_rr_list* ldns_rr_list_new();
00593 
00598 void ldns_rr_list_free(ldns_rr_list *rr_list);
00599 
00604 void ldns_rr_list_deep_free(ldns_rr_list *rr_list);
00605 
00613 bool ldns_rr_list_cat(ldns_rr_list *left, ldns_rr_list *right);
00614 
00622 ldns_rr_list* ldns_rr_list_cat_clone(ldns_rr_list *left, ldns_rr_list *right);
00623 
00630 bool ldns_rr_list_push_rr(ldns_rr_list *rr_list, const ldns_rr *rr);
00631 
00638 bool ldns_rr_list_push_rr_list(ldns_rr_list *rr_list, const ldns_rr_list *push_list);
00639 
00645 ldns_rr* ldns_rr_list_pop_rr(ldns_rr_list *rr_list);
00646 
00653 ldns_rr_list* ldns_rr_list_pop_rr_list(ldns_rr_list *rr_list, size_t size);
00654 
00662 bool ldns_rr_list_contains_rr(const ldns_rr_list *rr_list, ldns_rr *rr); 
00663 
00669 bool ldns_is_rrset(ldns_rr_list *rr_list);
00670 
00677 bool ldns_rr_set_push_rr(ldns_rr_list *rr_list, ldns_rr *rr);
00678 
00686 ldns_rr* ldns_rr_set_pop_rr(ldns_rr_list *rr_list);
00687 
00693 ldns_rr_list *ldns_rr_list_pop_rrset(ldns_rr_list *rr_list);
00694 
00695 
00701 ldns_rr_type ldns_get_rr_type_by_name(const char *name);
00702 
00708 ldns_rr_class ldns_get_rr_class_by_name(const char *name);
00709 
00715 ldns_rr* ldns_rr_clone(const ldns_rr *rr);
00716 
00722 ldns_rr_list* ldns_rr_list_clone(const ldns_rr_list *rrlist);
00723 
00729 void ldns_rr_list_sort(ldns_rr_list *unsorted);
00730 
00739 int ldns_rr_compare(const ldns_rr *rr1, const ldns_rr *rr2);
00740 
00749 int ldns_rr_compare_no_rdata(const ldns_rr *rr1, const ldns_rr *rr2);
00750 
00759 int ldns_rr_compare_wire(ldns_buffer *rr1_buf, ldns_buffer *rr2_buf);
00760 
00769 bool ldns_rr_compare_ds(const ldns_rr *rr1, const ldns_rr *rr2);
00770 
00779 int ldns_rr_list_compare(const ldns_rr_list *rrl1, const ldns_rr_list *rrl2);
00780 
00786 size_t ldns_rr_uncompressed_size(const ldns_rr *r);
00787 
00793 void ldns_rr2canonical(ldns_rr *rr);
00794 
00800 void ldns_rr_list2canonical(ldns_rr_list *rr_list);
00801 
00807 uint8_t ldns_rr_label_count(ldns_rr *rr);
00808 
00815 const ldns_rr_descriptor *ldns_rr_descript(uint16_t type);
00816 
00823 size_t ldns_rr_descriptor_minimum(const ldns_rr_descriptor *descriptor);
00824 
00831 size_t ldns_rr_descriptor_maximum(const ldns_rr_descriptor *descriptor);
00832 
00840 ldns_rdf_type ldns_rr_descriptor_field_type(const ldns_rr_descriptor *descriptor, size_t field);
00841 
00853 ldns_rr_list *ldns_rr_list_subtype_by_rdf(ldns_rr_list *l, ldns_rdf *r, size_t pos);
00854 
00863 ldns_rr_type    ldns_rdf2rr_type(const ldns_rdf *rd);
00864 
00872 ldns_rr_type
00873 ldns_rr_list_type(const ldns_rr_list *rr_list);
00874 
00882 ldns_rdf *
00883 ldns_rr_list_owner(const ldns_rr_list *rr_list);
00884 
00885 #ifdef __cplusplus
00886 }
00887 #endif
00888 
00889 #endif /* LDNS_RR_H */