rr.h
Go to the documentation of this file.
1 /*
2  * rr.h - resource record definitions
3  *
4  * a Net::DNS like library for C
5  *
6  * (c) NLnet Labs, 2005-2006
7  *
8  * See the file LICENSE for the license
9  */
10 
18 #ifndef LDNS_RR_H
19 #define LDNS_RR_H
20 
21 #include <ldns/common.h>
22 #include <ldns/rdata.h>
23 #include <ldns/buffer.h>
24 #include <ldns/error.h>
25 
26 #ifdef __cplusplus
27 extern "C" {
28 #endif
29 
31 #define LDNS_MAX_LABELLEN 63
32 
33 #define LDNS_MAX_DOMAINLEN 255
34 
35 #define LDNS_MAX_POINTERS 65535
36 
37 #define LDNS_RR_OVERHEAD 10
38 
39 /* The first fields are 'common' and can be referenced instantly */
40 #define LDNS_RDATA_FIELD_DESCRIPTORS_COMMON 53
41 
42 
43 
48 {
59 
63 };
65 
70 {
74 };
76 
81 {
169  LDNS_RR_TYPE_SSHFP = 44, /* RFC 4255 */
171  LDNS_RR_TYPE_IPSECKEY = 45, /* RFC 4025 */
173  LDNS_RR_TYPE_RRSIG = 46, /* RFC 4034 */
174  LDNS_RR_TYPE_NSEC = 47, /* RFC 4034 */
175  LDNS_RR_TYPE_DNSKEY = 48, /* RFC 4034 */
176 
177  LDNS_RR_TYPE_DHCID = 49, /* RFC 4701 */
178  /* NSEC3 */
179  LDNS_RR_TYPE_NSEC3 = 50, /* RFC 5155 */
180  LDNS_RR_TYPE_NSEC3PARAM = 51, /* RFC 5155 */
184 
187 
189 
194 
204 
205  /* RFC 4431, 5074, DNSSEC Lookaside Validation */
207 
208  /* type codes from nsec3 experimental phase
209  LDNS_RR_TYPE_NSEC3 = 65324,
210  LDNS_RR_TYPE_NSEC3PARAMS = 65325, */
214 };
216 
279 {
283  uint32_t _ttl;
285  size_t _rd_count;
287  ldns_rr_type _rr_type;
289  ldns_rr_class _rr_class;
290  /* everything in the rdata is in network order */
297 };
298 typedef struct ldns_struct_rr ldns_rr;
299 
307 {
308  size_t _rr_count;
309  size_t _rr_capacity;
311 };
313 
320 {
322  ldns_rr_type _type;
324  const char *_name;
326  uint8_t _minimum;
328  uint8_t _maximum;
334  ldns_rr_compress _compress;
336  uint8_t _dname_count;
337 };
339 
344 ldns_rr* ldns_rr_new(void);
345 
350 ldns_rr* ldns_rr_new_frm_type(ldns_rr_type t);
351 
357 void ldns_rr_free(ldns_rr *rr);
358 
375 ldns_status ldns_rr_new_frm_str(ldns_rr **n, const char *str,
376  uint32_t default_ttl, ldns_rdf *origin,
377  ldns_rdf **prev);
378 
393  ldns_rdf *origin, ldns_rdf **prev);
394 
409 ldns_status ldns_rr_new_frm_fp(ldns_rr **rr, FILE *fp, uint32_t *default_ttl, ldns_rdf **origin, ldns_rdf **prev);
410 
426 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);
427 
434 void ldns_rr_set_owner(ldns_rr *rr, ldns_rdf *owner);
435 
442 void ldns_rr_set_question(ldns_rr *rr, bool question);
443 
450 void ldns_rr_set_ttl(ldns_rr *rr, uint32_t ttl);
451 
458 void ldns_rr_set_rd_count(ldns_rr *rr, size_t count);
459 
466 void ldns_rr_set_type(ldns_rr *rr, ldns_rr_type rr_type);
467 
474 void ldns_rr_set_class(ldns_rr *rr, ldns_rr_class rr_class);
475 
484 ldns_rdf* ldns_rr_set_rdf(ldns_rr *rr, const ldns_rdf *f, size_t position);
485 
493 bool ldns_rr_push_rdf(ldns_rr *rr, const ldns_rdf *f);
494 
502 
509 ldns_rdf* ldns_rr_rdf(const ldns_rr *rr, size_t nr);
510 
516 ldns_rdf* ldns_rr_owner(const ldns_rr *rr);
517 
523 bool ldns_rr_is_question(const ldns_rr *rr);
524 
530 uint32_t ldns_rr_ttl(const ldns_rr *rr);
531 
537 size_t ldns_rr_rd_count(const ldns_rr *rr);
538 
544 ldns_rr_type ldns_rr_get_type(const ldns_rr *rr);
545 
551 ldns_rr_class ldns_rr_get_class(const ldns_rr *rr);
552 
553 /* rr_lists */
554 
560 size_t ldns_rr_list_rr_count(const ldns_rr_list *rr_list);
561 
568 void ldns_rr_list_set_rr_count(ldns_rr_list *rr_list, size_t count);
569 
578 ldns_rr * ldns_rr_list_set_rr(ldns_rr_list *rr_list, const ldns_rr *r, size_t count);
579 
586 ldns_rr* ldns_rr_list_rr(const ldns_rr_list *rr_list, size_t nr);
587 
593 
598 void ldns_rr_list_free(ldns_rr_list *rr_list);
599 
604 void ldns_rr_list_deep_free(ldns_rr_list *rr_list);
605 
613 bool ldns_rr_list_cat(ldns_rr_list *left, ldns_rr_list *right);
614 
623 
630 bool ldns_rr_list_push_rr(ldns_rr_list *rr_list, const ldns_rr *rr);
631 
638 bool ldns_rr_list_push_rr_list(ldns_rr_list *rr_list, const ldns_rr_list *push_list);
639 
646 
653 ldns_rr_list* ldns_rr_list_pop_rr_list(ldns_rr_list *rr_list, size_t size);
654 
662 bool ldns_rr_list_contains_rr(const ldns_rr_list *rr_list, ldns_rr *rr);
663 
669 bool ldns_is_rrset(ldns_rr_list *rr_list);
670 
677 bool ldns_rr_set_push_rr(ldns_rr_list *rr_list, ldns_rr *rr);
678 
687 
694 
695 
701 ldns_rr_type ldns_get_rr_type_by_name(const char *name);
702 
708 ldns_rr_class ldns_get_rr_class_by_name(const char *name);
709 
715 ldns_rr* ldns_rr_clone(const ldns_rr *rr);
716 
723 
729 void ldns_rr_list_sort(ldns_rr_list *unsorted);
730 
739 int ldns_rr_compare(const ldns_rr *rr1, const ldns_rr *rr2);
740 
749 int ldns_rr_compare_no_rdata(const ldns_rr *rr1, const ldns_rr *rr2);
750 
759 int ldns_rr_compare_wire(ldns_buffer *rr1_buf, ldns_buffer *rr2_buf);
760 
769 bool ldns_rr_compare_ds(const ldns_rr *rr1, const ldns_rr *rr2);
770 
779 int ldns_rr_list_compare(const ldns_rr_list *rrl1, const ldns_rr_list *rrl2);
780 
786 size_t ldns_rr_uncompressed_size(const ldns_rr *r);
787 
793 void ldns_rr2canonical(ldns_rr *rr);
794 
800 void ldns_rr_list2canonical(ldns_rr_list *rr_list);
801 
807 uint8_t ldns_rr_label_count(ldns_rr *rr);
808 
815 const ldns_rr_descriptor *ldns_rr_descript(uint16_t type);
816 
823 size_t ldns_rr_descriptor_minimum(const ldns_rr_descriptor *descriptor);
824 
831 size_t ldns_rr_descriptor_maximum(const ldns_rr_descriptor *descriptor);
832 
840 ldns_rdf_type ldns_rr_descriptor_field_type(const ldns_rr_descriptor *descriptor, size_t field);
841 
854 
863 ldns_rr_type ldns_rdf2rr_type(const ldns_rdf *rd);
864 
872 ldns_rr_type
873 ldns_rr_list_type(const ldns_rr_list *rr_list);
874 
882 ldns_rdf *
883 ldns_rr_list_owner(const ldns_rr_list *rr_list);
884 
885 #ifdef __cplusplus
886 }
887 #endif
888 
889 #endif /* LDNS_RR_H */
ldns_rdf * ldns_rr_rdf(const ldns_rr *rr, size_t nr)
returns the rdata field member counter.
Definition: rr.c:848
RFC1183.
Definition: rr.h:121
implementation of buffers to ease operations
Definition: buffer.h:50
mailbox or mail list information
Definition: rr.h:109
RFC1183.
Definition: rr.h:123
ldns_rr_list * ldns_rr_list_new()
creates a new rr_list structure.
Definition: rr.c:939
bool ldns_is_rrset(ldns_rr_list *rr_list)
checks if an rr_list is a rrset.
Definition: rr.c:1197
size_t _rr_count
Definition: rr.h:308
ldns_rdf * ldns_rr_set_rdf(ldns_rr *rr, const ldns_rdf *f, size_t position)
sets a rdf member, it will be set on the position given.
Definition: rr.c:779
ldns_rr * ldns_rr_clone(const ldns_rr *rr)
clones a rr and all its data
Definition: rr.c:1338
2535typecode
Definition: rr.h:141
void ldns_rr_set_rd_count(ldns_rr *rr, size_t count)
sets the rd_count in the rr.
Definition: rr.c:761
void ldns_rr_set_type(ldns_rr *rr, ldns_rr_type rr_type)
sets the type in the rr.
Definition: rr.c:767
RFC1183.
Definition: rr.h:117
bool ldns_rr_compare_ds(const ldns_rr *orr1, const ldns_rr *orr2)
returns true of the given rr&#39;s are equal.
Definition: rr.c:1666
void ldns_rr2canonical(ldns_rr *rr)
converts each dname in a rr to its canonical form.
Definition: rr.c:1737
the canonical name for an alias
Definition: rr.h:91
a host address
Definition: rr.h:83
bool ldns_rr_set_push_rr(ldns_rr_list *rr_list, ldns_rr *rr)
pushes an rr to an rrset (which really are rr_list&#39;s).
Definition: rr.c:1232
ldns_rr_type ldns_rdf2rr_type(const ldns_rdf *rd)
convert an rdf of type LDNS_RDF_TYPE_TYPE to an actual LDNS_RR_TYPE.
Definition: rr.c:2410
DNSSEC.
Definition: rr.h:173
Defines ldns_rdf and functions to manipulate those.
Pseudo OPT record...
Definition: rr.h:163
Chaos class.
Definition: rr.h:52
enum ldns_enum_rr_class ldns_rr_class
Definition: rr.h:64
bool ldns_rr_list_push_rr(ldns_rr_list *rr_list, const ldns_rr *rr)
pushes an rr to an rrlist.
Definition: rr.c:1071
compression is allowed
Definition: rr.h:72
bool ldns_rr_list_contains_rr(const ldns_rr_list *rr_list, ldns_rr *rr)
returns true if the given rr is one of the rrs in the list, or if it is equal to one ...
Definition: rr.c:1178
List or Set of Resource Records.
Definition: rr.h:306
bool ldns_rr_is_question(const ldns_rr *rr)
returns the question flag of an rr structure.
Definition: rr.c:864
a null RR (EXPERIMENTAL)
Definition: rr.h:101
ldns_rr_compress _compress
Specifies whether compression can be used for dnames in this RR type.
Definition: rr.h:334
A request for mailbox-related records (MB, MG or MR)
Definition: rr.h:199
RFC2163.
Definition: rr.h:133
ldns_rdf_type ldns_rr_descriptor_field_type(const ldns_rr_descriptor *descriptor, size_t index)
returns the rdf type for the given rdata field number of the rr type for the given descriptor...
Definition: rr.c:2336
RFC2538.
Definition: rr.h:155
RFC2230.
Definition: rr.h:153
void ldns_rr_list_deep_free(ldns_rr_list *rr_list)
frees an rr_list structure and all rrs contained therein.
Definition: rr.c:959
ldns_rr_class _rr_class
Class of the resource record.
Definition: rr.h:289
ldns_rr_list * ldns_rr_list_subtype_by_rdf(ldns_rr_list *l, ldns_rdf *r, size_t pos)
Return the rr_list which matches the rdf at position field.
Definition: rr.c:1037
ldns_rr * ldns_rr_new_frm_type(ldns_rr_type t)
creates a new rr structure, based on the given type.
Definition: rr.c:42
http://www.jhsoft.com/rfc/af-saa-0069.000.rtf
Definition: rr.h:149
uint8_t _maximum
Maximum number of rdata fields in the RRs of this type.
Definition: rr.h:328
size_t ldns_rr_rd_count(const ldns_rr *rr)
returns the rd_count of an rr structure.
Definition: rr.c:876
void ldns_rr_free(ldns_rr *rr)
frees an RR structure
Definition: rr.c:75
ldns_rr_type ldns_get_rr_type_by_name(const char *name)
retrieves a rrtype by looking up its name.
Definition: rr.c:2350
2535typecode
Definition: rr.h:131
void ldns_rr_list_free(ldns_rr_list *rr_list)
frees an rr_list structure.
Definition: rr.c:950
size_t ldns_rr_uncompressed_size(const ldns_rr *r)
calculates the uncompressed size of an RR.
Definition: rr.c:1720
const ldns_rr_descriptor * ldns_rr_descript(uint16_t type)
returns the resource record descriptor for the given rr type.
Definition: rr.c:2292
ldns_enum_rr_class
The different RR classes.
Definition: rr.h:47
Resource Record.
Definition: rr.h:278
text strings
Definition: rr.h:113
a mailbox domain name (EXPERIMENTAL)
Definition: rr.h:95
size_t _rd_count
Number of data fields.
Definition: rr.h:285
ldns_status ldns_rr_new_frm_str(ldns_rr **newrr, const char *str, uint32_t default_ttl, ldns_rdf *origin, ldns_rdf **prev)
creates an rr from a string.
Definition: rr.c:624
ipv6 address
Definition: rr.h:137
marks the start of a zone of authority
Definition: rr.h:93
Defines error numbers and functions to translate those to a readable string.
SSH Key Fingerprint.
Definition: rr.h:169
ldns_rr * ldns_rr_list_rr(const ldns_rr_list *rr_list, size_t nr)
returns a specific rr of an rrlist.
Definition: rr.c:929
size_t _rr_capacity
Definition: rr.h:309
void ldns_rr_set_class(ldns_rr *rr, ldns_rr_class rr_class)
sets the class in the rr.
Definition: rr.c:773
enum ldns_enum_rdf_type ldns_rdf_type
Definition: rdata.h:109
ldns_rdf_type _variable
Special rdf types.
Definition: rr.h:332
void ldns_rr_set_question(ldns_rr *rr, bool question)
Definition: rr.c:749
RFC1183.
Definition: rr.h:119
ldns_rr * ldns_rr_list_pop_rr(ldns_rr_list *rr_list)
pops the last rr from an rrlist.
Definition: rr.c:1116
None class, dynamic update.
Definition: rr.h:56
ldns_rdf * ldns_rr_pop_rdf(ldns_rr *rr)
removes a rd_field member, it will be popped from the last position.
Definition: rr.c:819
ldns_rr * ldns_rr_set_pop_rr(ldns_rr_list *rr_list)
pops the last rr from an rrset.
Definition: rr.c:1280
the Internet
Definition: rr.h:50
size_t ldns_rr_descriptor_maximum(const ldns_rr_descriptor *descriptor)
returns the maximum number of rdata fields of the rr type this descriptor describes.
Definition: rr.c:2321
bool ldns_rr_list_push_rr_list(ldns_rr_list *rr_list, const ldns_rr_list *push_list)
pushes an rr_list to an rrlist.
Definition: rr.c:1102
a well known service description
Definition: rr.h:103
draft-ietf-dane-protocol
Definition: rr.h:183
dnsind-kitchen-sink-02.txt
Definition: rr.h:161
Contains all information about resource record types.
Definition: rr.h:319
int ldns_rr_compare(const ldns_rr *rr1, const ldns_rr *rr2)
compares two rrs.
Definition: rr.c:1594
IPsec Key.
Definition: rr.h:171
draft-ietf-dnsext-delegation
Definition: rr.h:167
void ldns_rr_list_set_rr_count(ldns_rr_list *rr_list, size_t count)
sets the number of rr&#39;s in an rr_list.
Definition: rr.c:922
ldns_rr_list * ldns_rr_list_clone(const ldns_rr_list *rrlist)
clones an rrlist.
Definition: rr.c:1369
RFC1706.
Definition: rr.h:125
ldns_rr_list * ldns_rr_list_pop_rr_list(ldns_rr_list *rr_list, size_t howmany)
pops an rr_list of size s from an rrlist.
Definition: rr.c:1148
ldns_rdf * ldns_rr_list_owner(const ldns_rr_list *rr_list)
Returns the owner domain name rdf of the first element of the RR If there are no elements present...
Definition: rr.c:2437
ldns_rr_list * ldns_rr_list_cat_clone(ldns_rr_list *left, ldns_rr_list *right)
concatenates two ldns_rr_lists together, but makes clones of the rr&#39;s (instead of pointer copying)...
Definition: rr.c:998
a domain name pointer
Definition: rr.h:105
void ldns_rr_set_owner(ldns_rr *rr, ldns_rdf *owner)
sets the owner in the rr structure.
Definition: rr.c:743
ldns_rr * ldns_rr_list_set_rr(ldns_rr_list *rr_list, const ldns_rr *r, size_t count)
set a rr on a specific index in a ldns_rr_list
Definition: rr.c:906
RFC2874.
Definition: rr.h:157
ldns_rr_type ldns_rr_get_type(const ldns_rr *rr)
returns the type of the rr.
Definition: rr.c:882
ldns_rr_list * ldns_rr_list_pop_rrset(ldns_rr_list *rr_list)
pops the first rrset from the list, the list must be sorted, so that all rr&#39;s from each rrset are nex...
Definition: rr.c:1286
int ldns_rr_compare_no_rdata(const ldns_rr *rr1, const ldns_rr *rr2)
compares two rrs, up to the rdata.
Definition: rr.c:1515
RFC1712.
Definition: rr.h:135
draft-ietf-nimrod-dns-01.txt
Definition: rr.h:143
A request for mail agent RRs (Obsolete - see MX)
Definition: rr.h:201
a mail group member (EXPERIMENTAL)
Definition: rr.h:97
void ldns_rr_set_ttl(ldns_rr *rr, uint32_t ttl)
sets the ttl in the rr structure.
Definition: rr.c:755
enum ldns_enum_status ldns_status
Definition: error.h:122
a mail destination (Obsolete - use MX)
Definition: rr.h:87
2535typecode
Definition: rr.h:129
ldns_rr ** _rrs
Definition: rr.h:310
This file contains the definition of ldns_buffer, and functions to manipulate those.
ldns_status ldns_rr_new_frm_fp_l(ldns_rr **newrr, FILE *fp, uint32_t *default_ttl, ldns_rdf **origin, ldns_rdf **prev, int *line_nr)
creates a new rr from a file containing a string.
Definition: rr.c:655
LOC record RFC1876.
Definition: rr.h:139
ldns_rdf * _owner
Owner name, uncompressed.
Definition: rr.h:281
SRV record RFC2782.
Definition: rr.h:147
Hesiod (Dyer 87)
Definition: rr.h:54
size_t ldns_rr_descriptor_minimum(const ldns_rr_descriptor *descriptor)
returns the minimum number of rdata fields of the rr type this descriptor describes.
Definition: rr.c:2311
uint8_t _minimum
Minimum number of rdata fields in the RRs of this type.
Definition: rr.h:326
host information
Definition: rr.h:107
bool ldns_rr_push_rdf(ldns_rr *rr, const ldns_rdf *f)
sets rd_field member, it will be placed in the next available spot.
Definition: rr.c:796
RFC1348.
Definition: rr.h:127
a mail rename domain name (EXPERIMENTAL)
Definition: rr.h:99
uint32_t _ttl
Time to live.
Definition: rr.h:283
RFC2915.
Definition: rr.h:151
uint8_t _dname_count
The number of DNAMEs in the _wireformat string, for parsing.
Definition: rr.h:336
Resource record data field.
Definition: rdata.h:138
ldns_enum_rr_compress
Used to specify whether compression is allowed.
Definition: rr.h:69
Common definitions for LDNS.
RFC3123.
Definition: rr.h:165
uint8_t ldns_rr_label_count(ldns_rr *rr)
counts the number of labels of the ownername.
Definition: rr.c:1798
ldns_rr_class ldns_get_rr_class_by_name(const char *name)
retrieves a class by looking up its name.
Definition: rr.c:2390
enum ldns_enum_rr_compress ldns_rr_compress
Definition: rr.h:75
ldns_rdf * ldns_rr_owner(const ldns_rr *rr)
returns the owner name of an rr structure.
Definition: rr.c:858
ldns_rr * ldns_rr_new(void)
creates a new rr structure.
Definition: rr.c:24
ldns_enum_rr_type
The different RR types.
Definition: rr.h:80
ldns_status ldns_rr_new_question_frm_str(ldns_rr **newrr, const char *str, ldns_rdf *origin, ldns_rdf **prev)
creates an rr for the question section from a string, i.e.
Definition: rr.c:637
size_t ldns_rr_list_rr_count(const ldns_rr_list *rr_list)
returns the number of rr&#39;s in an rr_list.
Definition: rr.c:896
enum ldns_enum_rr_type ldns_rr_type
Definition: rr.h:215
const char * _name
Textual name of the RR type.
Definition: rr.h:324
an authoritative name server
Definition: rr.h:85
ldns_rdf ** _rdata_fields
The array of rdata&#39;s.
Definition: rr.h:292
signed char _rr_question
question rr [it would be nicer if thous is after _rd_count] ABI change: Fix this in next major releas...
Definition: rr.h:296
void ldns_rr_list2canonical(ldns_rr_list *rr_list)
converts each dname in each rr in a rr_list to its canonical form.
Definition: rr.c:1789
int ldns_rr_list_compare(const ldns_rr_list *rrl1, const ldns_rr_list *rrl2)
compares two rr listss.
Definition: rr.c:1693
uint32_t ldns_rr_ttl(const ldns_rr *rr)
returns the ttl of an rr structure.
Definition: rr.c:870
ldns_rr_type ldns_rr_list_type(const ldns_rr_list *rr_list)
Returns the type of the first element of the RR If there are no elements present, 0 is returned...
Definition: rr.c:2427
ldns_rr_class ldns_rr_get_class(const ldns_rr *rr)
returns the class of the rr.
Definition: rr.c:888
Any class.
Definition: rr.h:58
draft-ietf-dnsop-trust-history
Definition: rr.h:186
bool ldns_rr_list_cat(ldns_rr_list *left, ldns_rr_list *right)
concatenates two ldns_rr_lists together.
Definition: rr.c:975
mail exchange
Definition: rr.h:111
RFC1183.
Definition: rr.h:115
ldns_rr_type _rr_type
the type of the RR.
Definition: rr.h:287
void ldns_rr_list_sort(ldns_rr_list *unsorted)
sorts an rr_list (canonical wire format).
Definition: rr.c:1472
draft-ietf-nimrod-dns-01.txt
Definition: rr.h:145
RFC2672.
Definition: rr.h:159
ldns_status ldns_rr_new_frm_fp(ldns_rr **newrr, FILE *fp, uint32_t *ttl, ldns_rdf **origin, ldns_rdf **prev)
creates a new rr from a file containing a string.
Definition: rr.c:649
a mail forwarder (Obsolete - use MX)
Definition: rr.h:89
any type (wildcard)
Definition: rr.h:203
int ldns_rr_compare_wire(ldns_buffer *rr1_buf, ldns_buffer *rr2_buf)
compares the wireformat of two rrs, contained in the given buffers.
Definition: rr.c:1556
ldns_rr_type _type
Type of the RR that is described here.
Definition: rr.h:322
const ldns_rdf_type * _wireformat
Wireformat specification for the rr, i.e.
Definition: rr.h:330