00001
00002
00003
00004
00005
00006
00007
00008
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
00040 #define LDNS_RDATA_FIELD_DESCRIPTORS_COMMON 258
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,
00171 LDNS_RR_TYPE_IPSECKEY = 45,
00173 LDNS_RR_TYPE_RRSIG = 46,
00174 LDNS_RR_TYPE_NSEC = 47,
00175 LDNS_RR_TYPE_DNSKEY = 48,
00176
00177 LDNS_RR_TYPE_DHCID = 49,
00178
00179 LDNS_RR_TYPE_NSEC3 = 50,
00180 LDNS_RR_TYPE_NSEC3PARAM = 51,
00181 LDNS_RR_TYPE_NSEC3PARAMS = 51,
00182 LDNS_RR_TYPE_TLSA = 52,
00183
00184 LDNS_RR_TYPE_HIP = 55,
00185
00187 LDNS_RR_TYPE_NINFO = 56,
00189 LDNS_RR_TYPE_RKEY = 57,
00191 LDNS_RR_TYPE_TALINK = 58,
00193 LDNS_RR_TYPE_CDS = 59,
00194
00195 LDNS_RR_TYPE_SPF = 99,
00196
00197 LDNS_RR_TYPE_UINFO = 100,
00198 LDNS_RR_TYPE_UID = 101,
00199 LDNS_RR_TYPE_GID = 102,
00200 LDNS_RR_TYPE_UNSPEC = 103,
00201
00202 LDNS_RR_TYPE_NID = 104,
00203 LDNS_RR_TYPE_L32 = 105,
00204 LDNS_RR_TYPE_L64 = 106,
00205 LDNS_RR_TYPE_LP = 107,
00206
00207 LDNS_RR_TYPE_EUI48 = 108,
00208 LDNS_RR_TYPE_EUI64 = 109,
00209
00210 LDNS_RR_TYPE_TKEY = 249,
00211 LDNS_RR_TYPE_TSIG = 250,
00212 LDNS_RR_TYPE_IXFR = 251,
00213 LDNS_RR_TYPE_AXFR = 252,
00215 LDNS_RR_TYPE_MAILB = 253,
00217 LDNS_RR_TYPE_MAILA = 254,
00219 LDNS_RR_TYPE_ANY = 255,
00221 LDNS_RR_TYPE_URI = 256,
00222 LDNS_RR_TYPE_CAA = 257,
00223
00225 LDNS_RR_TYPE_TA = 32768,
00226
00227 LDNS_RR_TYPE_DLV = 32769,
00228
00229
00230
00231
00232 LDNS_RR_TYPE_FIRST = 0,
00233 LDNS_RR_TYPE_LAST = 65535,
00234 LDNS_RR_TYPE_COUNT = LDNS_RR_TYPE_LAST - LDNS_RR_TYPE_FIRST + 1
00235 };
00236 typedef enum ldns_enum_rr_type ldns_rr_type;
00237
00299 struct ldns_struct_rr
00300 {
00302 ldns_rdf *_owner;
00304 uint32_t _ttl;
00306 size_t _rd_count;
00308 ldns_rr_type _rr_type;
00310 ldns_rr_class _rr_class;
00311
00313 ldns_rdf **_rdata_fields;
00317 bool _rr_question;
00318 };
00319 typedef struct ldns_struct_rr ldns_rr;
00320
00327 struct ldns_struct_rr_list
00328 {
00329 size_t _rr_count;
00330 size_t _rr_capacity;
00331 ldns_rr **_rrs;
00332 };
00333 typedef struct ldns_struct_rr_list ldns_rr_list;
00334
00340 struct ldns_struct_rr_descriptor
00341 {
00343 ldns_rr_type _type;
00345 const char *_name;
00347 uint8_t _minimum;
00349 uint8_t _maximum;
00351 const ldns_rdf_type *_wireformat;
00353 ldns_rdf_type _variable;
00355 ldns_rr_compress _compress;
00357 uint8_t _dname_count;
00358 };
00359 typedef struct ldns_struct_rr_descriptor ldns_rr_descriptor;
00360
00361
00368 ldns_status ldns_rdf_bitmap_known_rr_types_space(ldns_rdf** rdf);
00369
00375 ldns_status ldns_rdf_bitmap_known_rr_types(ldns_rdf** rdf);
00376
00377
00382 ldns_rr* ldns_rr_new(void);
00383
00388 ldns_rr* ldns_rr_new_frm_type(ldns_rr_type t);
00389
00395 void ldns_rr_free(ldns_rr *rr);
00396
00413 ldns_status ldns_rr_new_frm_str(ldns_rr **n, const char *str,
00414 uint32_t default_ttl, ldns_rdf *origin,
00415 ldns_rdf **prev);
00416
00430 ldns_status ldns_rr_new_question_frm_str(ldns_rr **n, const char *str,
00431 ldns_rdf *origin, ldns_rdf **prev);
00432
00447 ldns_status ldns_rr_new_frm_fp(ldns_rr **rr, FILE *fp, uint32_t *default_ttl, ldns_rdf **origin, ldns_rdf **prev);
00448
00464 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);
00465
00472 void ldns_rr_set_owner(ldns_rr *rr, ldns_rdf *owner);
00473
00480 void ldns_rr_set_question(ldns_rr *rr, bool question);
00481
00488 void ldns_rr_set_ttl(ldns_rr *rr, uint32_t ttl);
00489
00496 void ldns_rr_set_rd_count(ldns_rr *rr, size_t count);
00497
00504 void ldns_rr_set_type(ldns_rr *rr, ldns_rr_type rr_type);
00505
00512 void ldns_rr_set_class(ldns_rr *rr, ldns_rr_class rr_class);
00513
00522 ldns_rdf* ldns_rr_set_rdf(ldns_rr *rr, const ldns_rdf *f, size_t position);
00523
00531 bool ldns_rr_push_rdf(ldns_rr *rr, const ldns_rdf *f);
00532
00539 ldns_rdf* ldns_rr_pop_rdf(ldns_rr *rr);
00540
00547 ldns_rdf* ldns_rr_rdf(const ldns_rr *rr, size_t nr);
00548
00554 ldns_rdf* ldns_rr_owner(const ldns_rr *rr);
00555
00561 bool ldns_rr_is_question(const ldns_rr *rr);
00562
00568 uint32_t ldns_rr_ttl(const ldns_rr *rr);
00569
00575 size_t ldns_rr_rd_count(const ldns_rr *rr);
00576
00582 ldns_rr_type ldns_rr_get_type(const ldns_rr *rr);
00583
00589 ldns_rr_class ldns_rr_get_class(const ldns_rr *rr);
00590
00591
00592
00598 size_t ldns_rr_list_rr_count(const ldns_rr_list *rr_list);
00599
00606 void ldns_rr_list_set_rr_count(ldns_rr_list *rr_list, size_t count);
00607
00616 ldns_rr * ldns_rr_list_set_rr(ldns_rr_list *rr_list, const ldns_rr *r, size_t count);
00617
00624 ldns_rr* ldns_rr_list_rr(const ldns_rr_list *rr_list, size_t nr);
00625
00630 ldns_rr_list* ldns_rr_list_new(void);
00631
00636 void ldns_rr_list_free(ldns_rr_list *rr_list);
00637
00642 void ldns_rr_list_deep_free(ldns_rr_list *rr_list);
00643
00651 bool ldns_rr_list_cat(ldns_rr_list *left, ldns_rr_list *right);
00652
00660 ldns_rr_list* ldns_rr_list_cat_clone(ldns_rr_list *left, ldns_rr_list *right);
00661
00668 bool ldns_rr_list_push_rr(ldns_rr_list *rr_list, const ldns_rr *rr);
00669
00676 bool ldns_rr_list_push_rr_list(ldns_rr_list *rr_list, const ldns_rr_list *push_list);
00677
00683 ldns_rr* ldns_rr_list_pop_rr(ldns_rr_list *rr_list);
00684
00691 ldns_rr_list* ldns_rr_list_pop_rr_list(ldns_rr_list *rr_list, size_t size);
00692
00700 bool ldns_rr_list_contains_rr(const ldns_rr_list *rr_list, ldns_rr *rr);
00701
00707 bool ldns_is_rrset(ldns_rr_list *rr_list);
00708
00715 bool ldns_rr_set_push_rr(ldns_rr_list *rr_list, ldns_rr *rr);
00716
00724 ldns_rr* ldns_rr_set_pop_rr(ldns_rr_list *rr_list);
00725
00731 ldns_rr_list *ldns_rr_list_pop_rrset(ldns_rr_list *rr_list);
00732
00733
00739 ldns_rr_type ldns_get_rr_type_by_name(const char *name);
00740
00746 ldns_rr_class ldns_get_rr_class_by_name(const char *name);
00747
00753 ldns_rr* ldns_rr_clone(const ldns_rr *rr);
00754
00760 ldns_rr_list* ldns_rr_list_clone(const ldns_rr_list *rrlist);
00761
00767 void ldns_rr_list_sort(ldns_rr_list *unsorted);
00768
00777 int ldns_rr_compare(const ldns_rr *rr1, const ldns_rr *rr2);
00778
00787 int ldns_rr_compare_no_rdata(const ldns_rr *rr1, const ldns_rr *rr2);
00788
00797 int ldns_rr_compare_wire(ldns_buffer *rr1_buf, ldns_buffer *rr2_buf);
00798
00807 bool ldns_rr_compare_ds(const ldns_rr *rr1, const ldns_rr *rr2);
00808
00817 int ldns_rr_list_compare(const ldns_rr_list *rrl1, const ldns_rr_list *rrl2);
00818
00824 size_t ldns_rr_uncompressed_size(const ldns_rr *r);
00825
00831 void ldns_rr2canonical(ldns_rr *rr);
00832
00838 void ldns_rr_list2canonical(ldns_rr_list *rr_list);
00839
00845 uint8_t ldns_rr_label_count(ldns_rr *rr);
00846
00853 const ldns_rr_descriptor *ldns_rr_descript(uint16_t type);
00854
00861 size_t ldns_rr_descriptor_minimum(const ldns_rr_descriptor *descriptor);
00862
00869 size_t ldns_rr_descriptor_maximum(const ldns_rr_descriptor *descriptor);
00870
00878 ldns_rdf_type ldns_rr_descriptor_field_type(const ldns_rr_descriptor *descriptor, size_t field);
00879
00891 ldns_rr_list *ldns_rr_list_subtype_by_rdf(ldns_rr_list *l, ldns_rdf *r, size_t pos);
00892
00901 ldns_rr_type ldns_rdf2rr_type(const ldns_rdf *rd);
00902
00910 ldns_rr_type
00911 ldns_rr_list_type(const ldns_rr_list *rr_list);
00912
00920 ldns_rdf *
00921 ldns_rr_list_owner(const ldns_rr_list *rr_list);
00922
00923 #ifdef __cplusplus
00924 }
00925 #endif
00926
00927 #endif