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 11 /** 12 * \file 13 * 14 * Contains the definition of ldns_rr and functions to manipulate those. 15 */ 16 17 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 30 /** Maximum length of a dname label */ 31 #define LDNS_MAX_LABELLEN 63 32 /** Maximum length of a complete dname */ 33 #define LDNS_MAX_DOMAINLEN 255 34 /** Maximum number of pointers in 1 dname */ 35 #define LDNS_MAX_POINTERS 65535 36 /** The bytes TTL, CLASS and length use up in an rr */ 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 52 41 42 43 44 /** 45 * The different RR classes. 46 */ 47 enum ldns_enum_rr_class 48 { 49 /** the Internet */ 50 LDNS_RR_CLASS_IN = 1, 51 /** Chaos class */ 52 LDNS_RR_CLASS_CH = 3, 53 /** Hesiod (Dyer 87) */ 54 LDNS_RR_CLASS_HS = 4, 55 /** None class, dynamic update */ 56 LDNS_RR_CLASS_NONE = 254, 57 /** Any class */ 58 LDNS_RR_CLASS_ANY = 255, 59 60 LDNS_RR_CLASS_FIRST = 0, 61 LDNS_RR_CLASS_LAST = 65535, 62 LDNS_RR_CLASS_COUNT = LDNS_RR_CLASS_LAST - LDNS_RR_CLASS_FIRST + 1 63 }; 64 typedef enum ldns_enum_rr_class ldns_rr_class; 65 66 /** 67 * Used to specify whether compression is allowed. 68 */ 69 enum ldns_enum_rr_compress 70 { 71 /** compression is allowed */ 72 LDNS_RR_COMPRESS, 73 LDNS_RR_NO_COMPRESS 74 }; 75 typedef enum ldns_enum_rr_compress ldns_rr_compress; 76 77 /** 78 * The different RR types. 79 */ 80 enum ldns_enum_rr_type 81 { 82 /** a host address */ 83 LDNS_RR_TYPE_A = 1, 84 /** an authoritative name server */ 85 LDNS_RR_TYPE_NS = 2, 86 /** a mail destination (Obsolete - use MX) */ 87 LDNS_RR_TYPE_MD = 3, 88 /** a mail forwarder (Obsolete - use MX) */ 89 LDNS_RR_TYPE_MF = 4, 90 /** the canonical name for an alias */ 91 LDNS_RR_TYPE_CNAME = 5, 92 /** marks the start of a zone of authority */ 93 LDNS_RR_TYPE_SOA = 6, 94 /** a mailbox domain name (EXPERIMENTAL) */ 95 LDNS_RR_TYPE_MB = 7, 96 /** a mail group member (EXPERIMENTAL) */ 97 LDNS_RR_TYPE_MG = 8, 98 /** a mail rename domain name (EXPERIMENTAL) */ 99 LDNS_RR_TYPE_MR = 9, 100 /** a null RR (EXPERIMENTAL) */ 101 LDNS_RR_TYPE_NULL = 10, 102 /** a well known service description */ 103 LDNS_RR_TYPE_WKS = 11, 104 /** a domain name pointer */ 105 LDNS_RR_TYPE_PTR = 12, 106 /** host information */ 107 LDNS_RR_TYPE_HINFO = 13, 108 /** mailbox or mail list information */ 109 LDNS_RR_TYPE_MINFO = 14, 110 /** mail exchange */ 111 LDNS_RR_TYPE_MX = 15, 112 /** text strings */ 113 LDNS_RR_TYPE_TXT = 16, 114 /** RFC1183 */ 115 LDNS_RR_TYPE_RP = 17, 116 /** RFC1183 */ 117 LDNS_RR_TYPE_AFSDB = 18, 118 /** RFC1183 */ 119 LDNS_RR_TYPE_X25 = 19, 120 /** RFC1183 */ 121 LDNS_RR_TYPE_ISDN = 20, 122 /** RFC1183 */ 123 LDNS_RR_TYPE_RT = 21, 124 /** RFC1706 */ 125 LDNS_RR_TYPE_NSAP = 22, 126 /** RFC1348 */ 127 LDNS_RR_TYPE_NSAP_PTR = 23, 128 /** 2535typecode */ 129 LDNS_RR_TYPE_SIG = 24, 130 /** 2535typecode */ 131 LDNS_RR_TYPE_KEY = 25, 132 /** RFC2163 */ 133 LDNS_RR_TYPE_PX = 26, 134 /** RFC1712 */ 135 LDNS_RR_TYPE_GPOS = 27, 136 /** ipv6 address */ 137 LDNS_RR_TYPE_AAAA = 28, 138 /** LOC record RFC1876 */ 139 LDNS_RR_TYPE_LOC = 29, 140 /** 2535typecode */ 141 LDNS_RR_TYPE_NXT = 30, 142 /** draft-ietf-nimrod-dns-01.txt */ 143 LDNS_RR_TYPE_EID = 31, 144 /** draft-ietf-nimrod-dns-01.txt */ 145 LDNS_RR_TYPE_NIMLOC = 32, 146 /** SRV record RFC2782 */ 147 LDNS_RR_TYPE_SRV = 33, 148 /** http://www.jhsoft.com/rfc/af-saa-0069.000.rtf */ 149 LDNS_RR_TYPE_ATMA = 34, 150 /** RFC2915 */ 151 LDNS_RR_TYPE_NAPTR = 35, 152 /** RFC2230 */ 153 LDNS_RR_TYPE_KX = 36, 154 /** RFC2538 */ 155 LDNS_RR_TYPE_CERT = 37, 156 /** RFC2874 */ 157 LDNS_RR_TYPE_A6 = 38, 158 /** RFC2672 */ 159 LDNS_RR_TYPE_DNAME = 39, 160 /** dnsind-kitchen-sink-02.txt */ 161 LDNS_RR_TYPE_SINK = 40, 162 /** Pseudo OPT record... */ 163 LDNS_RR_TYPE_OPT = 41, 164 /** RFC3123 */ 165 LDNS_RR_TYPE_APL = 42, 166 /** draft-ietf-dnsext-delegation */ 167 LDNS_RR_TYPE_DS = 43, 168 /** SSH Key Fingerprint */ 169 LDNS_RR_TYPE_SSHFP = 44, 170 /** draft-richardson-ipseckey-rr-11.txt */ 171 LDNS_RR_TYPE_IPSECKEY = 45, 172 /** draft-ietf-dnsext-dnssec-25 */ 173 LDNS_RR_TYPE_RRSIG = 46, 174 LDNS_RR_TYPE_NSEC = 47, 175 LDNS_RR_TYPE_DNSKEY = 48, 176 LDNS_RR_TYPE_DHCID = 49, 177 178 LDNS_RR_TYPE_NSEC3 = 50, 179 LDNS_RR_TYPE_NSEC3PARAM = 51, 180 LDNS_RR_TYPE_NSEC3PARAMS = 51, 181 182 /** draft-ietf-dnsop-trust-history */ 183 LDNS_RR_TYPE_TALINK = 58, 184 185 LDNS_RR_TYPE_SPF = 99, 186 187 LDNS_RR_TYPE_UINFO = 100, 188 LDNS_RR_TYPE_UID = 101, 189 LDNS_RR_TYPE_GID = 102, 190 LDNS_RR_TYPE_UNSPEC = 103, 191 192 LDNS_RR_TYPE_TSIG = 250, 193 LDNS_RR_TYPE_IXFR = 251, 194 LDNS_RR_TYPE_AXFR = 252, 195 /** A request for mailbox-related records (MB, MG or MR) */ 196 LDNS_RR_TYPE_MAILB = 253, 197 /** A request for mail agent RRs (Obsolete - see MX) */ 198 LDNS_RR_TYPE_MAILA = 254, 199 /** any type (wildcard) */ 200 LDNS_RR_TYPE_ANY = 255, 201 202 /* RFC 4431, 5074, DNSSEC Lookaside Validation */ 203 LDNS_RR_TYPE_DLV = 32769, 204 205 /* type codes from nsec3 experimental phase 206 LDNS_RR_TYPE_NSEC3 = 65324, 207 LDNS_RR_TYPE_NSEC3PARAMS = 65325, */ 208 LDNS_RR_TYPE_FIRST = 0, 209 LDNS_RR_TYPE_LAST = 65535, 210 LDNS_RR_TYPE_COUNT = LDNS_RR_TYPE_LAST - LDNS_RR_TYPE_FIRST + 1 211 }; 212 typedef enum ldns_enum_rr_type ldns_rr_type; 213 214 /** 215 * Resource Record 216 * 217 * This is the basic DNS element that contains actual data 218 * 219 * From RFC1035: 220 * <pre> 221 3.2.1. Format 222 223 All RRs have the same top level format shown below: 224 225 1 1 1 1 1 1 226 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 227 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 228 | | 229 / / 230 / NAME / 231 | | 232 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 233 | TYPE | 234 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 235 | CLASS | 236 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 237 | TTL | 238 | | 239 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 240 | RDLENGTH | 241 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--| 242 / RDATA / 243 / / 244 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 245 246 where: 247 248 NAME an owner name, i.e., the name of the node to which this 249 resource record pertains. 250 251 TYPE two octets containing one of the RR TYPE codes. 252 253 CLASS two octets containing one of the RR CLASS codes. 254 255 TTL a 32 bit signed integer that specifies the time interval 256 that the resource record may be cached before the source 257 of the information should again be consulted. Zero 258 values are interpreted to mean that the RR can only be 259 used for the transaction in progress, and should not be 260 cached. For example, SOA records are always distributed 261 with a zero TTL to prohibit caching. Zero values can 262 also be used for extremely volatile data. 263 264 RDLENGTH an unsigned 16 bit integer that specifies the length in 265 octets of the RDATA field. 266 267 RDATA a variable length string of octets that describes the 268 resource. The format of this information varies 269 according to the TYPE and CLASS of the resource record. 270 * </pre> 271 * 272 * The actual amount and type of rdata fields depend on the RR type of the 273 * RR, and can be found by using \ref ldns_rr_descriptor functions. 274 */ 275 struct ldns_struct_rr 276 { 277 /** Owner name, uncompressed */ 278 ldns_rdf *_owner; 279 /** Time to live */ 280 uint32_t _ttl; 281 /** Number of data fields */ 282 size_t _rd_count; 283 /** the type of the RR. A, MX etc. */ 284 ldns_rr_type _rr_type; 285 /** Class of the resource record. */ 286 ldns_rr_class _rr_class; 287 /* everything in the rdata is in network order */ 288 /** The array of rdata's */ 289 ldns_rdf **_rdata_fields; 290 /** question rr [it would be nicer if thous is after _rd_count] 291 ABI change: Fix this in next major release 292 */ 293 bool _rr_question; 294 }; 295 typedef struct ldns_struct_rr ldns_rr; 296 297 /** 298 * List or Set of Resource Records 299 * 300 * Contains a list of rr's <br> 301 * No official RFC-like checks are made 302 */ 303 struct ldns_struct_rr_list 304 { 305 size_t _rr_count; 306 size_t _rr_capacity; 307 ldns_rr **_rrs; 308 }; 309 typedef struct ldns_struct_rr_list ldns_rr_list; 310 311 /** 312 * Contains all information about resource record types. 313 * 314 * This structure contains, for all rr types, the rdata fields that are defined. 315 */ 316 struct ldns_struct_rr_descriptor 317 { 318 /** Type of the RR that is described here */ 319 ldns_rr_type _type; 320 /** Textual name of the RR type. */ 321 const char *_name; 322 /** Minimum number of rdata fields in the RRs of this type. */ 323 uint8_t _minimum; 324 /** Maximum number of rdata fields in the RRs of this type. */ 325 uint8_t _maximum; 326 /** Wireformat specification for the rr, i.e. the types of rdata fields in their respective order. */ 327 const ldns_rdf_type *_wireformat; 328 /** Special rdf types */ 329 ldns_rdf_type _variable; 330 /** Specifies whether compression can be used for dnames in this RR type. */ 331 ldns_rr_compress _compress; 332 /** The number of DNAMEs in the _wireformat string, for parsing. */ 333 uint8_t _dname_count; 334 }; 335 typedef struct ldns_struct_rr_descriptor ldns_rr_descriptor; 336 337 /** 338 * creates a new rr structure. 339 * \return ldns_rr * 340 */ 341 ldns_rr* ldns_rr_new(void); 342 343 /** 344 * creates a new rr structure, based on the given type. 345 * alloc enough space to hold all the rdf's 346 */ 347 ldns_rr* ldns_rr_new_frm_type(ldns_rr_type t); 348 349 /** 350 * frees an RR structure 351 * \param[in] *rr the RR to be freed 352 * \return void 353 */ 354 void ldns_rr_free(ldns_rr *rr); 355 356 /** 357 * creates an rr from a string. 358 * The string should be a fully filled-in rr, like 359 * ownername <space> TTL <space> CLASS <space> 360 * TYPE <space> RDATA. 361 * \param[out] n the rr to return 362 * \param[in] str the string to convert 363 * \param[in] default_ttl default ttl value for the rr. 364 * If 0 DEF_TTL will be used 365 * \param[in] origin when the owner is relative add this. 366 * The caller must ldns_rdf_deep_free it. 367 * \param[out] prev the previous ownername. if this value is not NULL, 368 * the function overwrites this with the ownername found in this 369 * string. The caller must then ldns_rdf_deep_free it. 370 * \return a status msg describing an error or LDNS_STATUS_OK 371 */ 372 ldns_status ldns_rr_new_frm_str(ldns_rr **n, const char *str, 373 uint32_t default_ttl, ldns_rdf *origin, 374 ldns_rdf **prev); 375 376 /** 377 * creates an rr for the question section from a string, i.e. 378 * without RDATA fields 379 * Origin and previous RR functionality are the same as in 380 * ldns_rr_new_frm_str() 381 * \param[out] n the rr to return 382 * \param[in] str the string to convert 383 * \param[in] origin when the owner is relative add this. 384 * The caller must ldns_rdf_deep_free it. 385 * \param prev the previous ownername. the function overwrite this with 386 * the current found ownername. The caller must ldns_rdf_deep_free it. 387 * \return a status msg describing an error or LDNS_STATUS_OK 388 */ 389 ldns_status ldns_rr_new_question_frm_str(ldns_rr **n, const char *str, 390 ldns_rdf *origin, ldns_rdf **prev); 391 392 /** 393 * creates a new rr from a file containing a string. 394 * \param[out] rr the new rr 395 * \param[in] fp the file pointer to use 396 * \param[in] default_ttl pointer to a default ttl for the rr. If NULL DEF_TTL will be used 397 * the pointer will be updated if the file contains a $TTL directive 398 * \param[in] origin when the owner is relative add this 399 * the pointer will be updated if the file contains a $ORIGIN directive 400 * The caller must ldns_rdf_deep_free it. 401 * \param[in] prev when the owner is whitespaces use this as the * ownername 402 * the pointer will be updated after the call 403 * The caller must ldns_rdf_deep_free it. 404 * \return a ldns_status with an error or LDNS_STATUS_OK 405 */ 406 ldns_status ldns_rr_new_frm_fp(ldns_rr **rr, FILE *fp, uint32_t *default_ttl, ldns_rdf **origin, ldns_rdf **prev); 407 408 /** 409 * creates a new rr from a file containing a string. 410 * \param[out] rr the new rr 411 * \param[in] fp the file pointer to use 412 * \param[in] default_ttl a default ttl for the rr. If NULL DEF_TTL will be used 413 * the pointer will be updated if the file contains a $TTL directive 414 * \param[in] origin when the owner is relative add this 415 * the pointer will be updated if the file contains a $ORIGIN directive 416 * The caller must ldns_rdf_deep_free it. 417 * \param[in] line_nr pointer to an integer containing the current line number (for debugging purposes) 418 * \param[in] prev when the owner is whitespaces use this as the * ownername 419 * the pointer will be updated after the call 420 * The caller must ldns_rdf_deep_free it. 421 * \return a ldns_status with an error or LDNS_STATUS_OK 422 */ 423 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); 424 425 /** 426 * sets the owner in the rr structure. 427 * \param[in] *rr rr to operate on 428 * \param[in] *owner set to this owner 429 * \return void 430 */ 431 void ldns_rr_set_owner(ldns_rr *rr, ldns_rdf *owner); 432 433 /** 434 * sets the question flag in the rr structure. 435 * \param[in] *rr rr to operate on 436 * \param[in] question question flag 437 * \return void 438 */ 439 void ldns_rr_set_question(ldns_rr *rr, bool question); 440 441 /** 442 * sets the ttl in the rr structure. 443 * \param[in] *rr rr to operate on 444 * \param[in] ttl set to this ttl 445 * \return void 446 */ 447 void ldns_rr_set_ttl(ldns_rr *rr, uint32_t ttl); 448 449 /** 450 * sets the rd_count in the rr. 451 * \param[in] *rr rr to operate on 452 * \param[in] count set to this count 453 * \return void 454 */ 455 void ldns_rr_set_rd_count(ldns_rr *rr, size_t count); 456 457 /** 458 * sets the type in the rr. 459 * \param[in] *rr rr to operate on 460 * \param[in] rr_type set to this type 461 * \return void 462 */ 463 void ldns_rr_set_type(ldns_rr *rr, ldns_rr_type rr_type); 464 465 /** 466 * sets the class in the rr. 467 * \param[in] *rr rr to operate on 468 * \param[in] rr_class set to this class 469 * \return void 470 */ 471 void ldns_rr_set_class(ldns_rr *rr, ldns_rr_class rr_class); 472 473 /** 474 * sets a rdf member, it will be set on the 475 * position given. The old value is returned, like pop. 476 * \param[in] *rr the rr to operate on 477 * \param[in] *f the rdf to set 478 * \param[in] position the position the set the rdf 479 * \return the old value in the rr, NULL on failyre 480 */ 481 ldns_rdf* ldns_rr_set_rdf(ldns_rr *rr, const ldns_rdf *f, size_t position); 482 483 /** 484 * sets rd_field member, it will be 485 * placed in the next available spot. 486 * \param[in] *rr rr to operate on 487 * \param[in] *f the data field member to set 488 * \return bool 489 */ 490 bool ldns_rr_push_rdf(ldns_rr *rr, const ldns_rdf *f); 491 492 /** 493 * removes a rd_field member, it will be 494 * popped from the last position. 495 * \param[in] *rr rr to operate on 496 * \return rdf which was popped (null if nothing) 497 */ 498 ldns_rdf* ldns_rr_pop_rdf(ldns_rr *rr); 499 500 /** 501 * returns the rdata field member counter. 502 * \param[in] *rr rr to operate on 503 * \param[in] nr the number of the rdf to return 504 * \return ldns_rdf * 505 */ 506 ldns_rdf* ldns_rr_rdf(const ldns_rr *rr, size_t nr); 507 508 /** 509 * returns the owner name of an rr structure. 510 * \param[in] *rr rr to operate on 511 * \return ldns_rdf * 512 */ 513 ldns_rdf* ldns_rr_owner(const ldns_rr *rr); 514 515 /** 516 * returns the question flag of an rr structure. 517 * \param[in] *rr rr to operate on 518 * \return bool true if question 519 */ 520 bool ldns_rr_is_question(const ldns_rr *rr); 521 522 /** 523 * returns the ttl of an rr structure. 524 * \param[in] *rr the rr to read from 525 * \return the ttl of the rr 526 */ 527 uint32_t ldns_rr_ttl(const ldns_rr *rr); 528 529 /** 530 * returns the rd_count of an rr structure. 531 * \param[in] *rr the rr to read from 532 * \return the rd count of the rr 533 */ 534 size_t ldns_rr_rd_count(const ldns_rr *rr); 535 536 /** 537 * returns the type of the rr. 538 * \param[in] *rr the rr to read from 539 * \return the type of the rr 540 */ 541 ldns_rr_type ldns_rr_get_type(const ldns_rr *rr); 542 543 /** 544 * returns the class of the rr. 545 * \param[in] *rr the rr to read from 546 * \return the class of the rr 547 */ 548 ldns_rr_class ldns_rr_get_class(const ldns_rr *rr); 549 550 /* rr_lists */ 551 552 /** 553 * returns the number of rr's in an rr_list. 554 * \param[in] rr_list the rr_list to read from 555 * \return the number of rr's 556 */ 557 size_t ldns_rr_list_rr_count(const ldns_rr_list *rr_list); 558 559 /** 560 * sets the number of rr's in an rr_list. 561 * \param[in] rr_list the rr_list to set the count on 562 * \param[in] count the number of rr in this list 563 * \return void 564 */ 565 void ldns_rr_list_set_rr_count(ldns_rr_list *rr_list, size_t count); 566 567 /** 568 * set a rr on a specific index in a ldns_rr_list 569 * \param[in] rr_list the rr_list to use 570 * \param[in] r the rr to set 571 * \param[in] count index into the rr_list 572 * \return the old rr which was stored in the rr_list, or 573 * NULL is the index was too large 574 * set a specific rr */ 575 ldns_rr * ldns_rr_list_set_rr(ldns_rr_list *rr_list, const ldns_rr *r, size_t count); 576 577 /** 578 * returns a specific rr of an rrlist. 579 * \param[in] rr_list the rr_list to read from 580 * \param[in] nr return this rr 581 * \return the rr at position nr 582 */ 583 ldns_rr* ldns_rr_list_rr(const ldns_rr_list *rr_list, size_t nr); 584 585 /** 586 * creates a new rr_list structure. 587 * \return a new rr_list structure 588 */ 589 ldns_rr_list* ldns_rr_list_new(); 590 591 /** 592 * frees an rr_list structure. 593 * \param[in] rr_list the list to free 594 */ 595 void ldns_rr_list_free(ldns_rr_list *rr_list); 596 597 /** 598 * frees an rr_list structure and all rrs contained therein. 599 * \param[in] rr_list the list to free 600 */ 601 void ldns_rr_list_deep_free(ldns_rr_list *rr_list); 602 603 /** 604 * concatenates two ldns_rr_lists together. This modifies 605 * *left (to extend it and add the pointers from *right). 606 * \param[in] left the leftside 607 * \param[in] right the rightside 608 * \return a left with right concatenated to it 609 */ 610 bool ldns_rr_list_cat(ldns_rr_list *left, ldns_rr_list *right); 611 612 /** 613 * concatenates two ldns_rr_lists together, but makes clones of the rr's 614 * (instead of pointer copying). 615 * \param[in] left the leftside 616 * \param[in] right the rightside 617 * \return a new rr_list with leftside/rightside concatenated 618 */ 619 ldns_rr_list* ldns_rr_list_cat_clone(ldns_rr_list *left, ldns_rr_list *right); 620 621 /** 622 * pushes an rr to an rrlist. 623 * \param[in] rr_list the rr_list to push to 624 * \param[in] rr the rr to push 625 * \return false on error, otherwise true 626 */ 627 bool ldns_rr_list_push_rr(ldns_rr_list *rr_list, const ldns_rr *rr); 628 629 /** 630 * pushes an rr_list to an rrlist. 631 * \param[in] rr_list the rr_list to push to 632 * \param[in] push_list the rr_list to push 633 * \return false on error, otherwise true 634 */ 635 bool ldns_rr_list_push_rr_list(ldns_rr_list *rr_list, const ldns_rr_list *push_list); 636 637 /** 638 * pops the last rr from an rrlist. 639 * \param[in] rr_list the rr_list to pop from 640 * \return NULL if nothing to pop. Otherwise the popped RR 641 */ 642 ldns_rr* ldns_rr_list_pop_rr(ldns_rr_list *rr_list); 643 644 /** 645 * pops an rr_list of size s from an rrlist. 646 * \param[in] rr_list the rr_list to pop from 647 * \param[in] size the number of rr's to pop 648 * \return NULL if nothing to pop. Otherwise the popped rr_list 649 */ 650 ldns_rr_list* ldns_rr_list_pop_rr_list(ldns_rr_list *rr_list, size_t size); 651 652 /** 653 * returns true if the given rr is one of the rrs in the 654 * list, or if it is equal to one 655 * \param[in] rr_list the rr_list to check 656 * \param[in] rr the rr to check 657 * \return true if rr_list contains rr, false otherwise 658 */ 659 bool ldns_rr_list_contains_rr(const ldns_rr_list *rr_list, ldns_rr *rr); 660 661 /** 662 * checks if an rr_list is a rrset. 663 * \param[in] rr_list the rr_list to check 664 * \return true if it is an rrset otherwise false 665 */ 666 bool ldns_is_rrset(ldns_rr_list *rr_list); 667 668 /** 669 * pushes an rr to an rrset (which really are rr_list's). 670 * \param[in] *rr_list the rrset to push the rr to 671 * \param[in] *rr the rr to push 672 * \return true if the push succeeded otherwise false 673 */ 674 bool ldns_rr_set_push_rr(ldns_rr_list *rr_list, ldns_rr *rr); 675 676 /** 677 * pops the last rr from an rrset. This function is there only 678 * for the symmetry. 679 * \param[in] rr_list the rr_list to pop from 680 * \return NULL if nothing to pop. Otherwise the popped RR 681 * 682 */ 683 ldns_rr* ldns_rr_set_pop_rr(ldns_rr_list *rr_list); 684 685 /** 686 * pops the first rrset from the list, 687 * the list must be sorted, so that all rr's from each rrset 688 * are next to each other 689 */ 690 ldns_rr_list *ldns_rr_list_pop_rrset(ldns_rr_list *rr_list); 691 692 693 /** 694 * retrieves a rrtype by looking up its name. 695 * \param[in] name a string with the name 696 * \return the type which corresponds with the name 697 */ 698 ldns_rr_type ldns_get_rr_type_by_name(const char *name); 699 700 /** 701 * retrieves a class by looking up its name. 702 * \param[in] name string with the name 703 * \return the cass which corresponds with the name 704 */ 705 ldns_rr_class ldns_get_rr_class_by_name(const char *name); 706 707 /** 708 * clones a rr and all its data 709 * \param[in] rr the rr to clone 710 * \return the new rr or NULL on failure 711 */ 712 ldns_rr* ldns_rr_clone(const ldns_rr *rr); 713 714 /** 715 * clones an rrlist. 716 * \param[in] rrlist the rrlist to clone 717 * \return the cloned rr list 718 */ 719 ldns_rr_list* ldns_rr_list_clone(const ldns_rr_list *rrlist); 720 721 /** 722 * sorts an rr_list (canonical wire format). the sorting is done inband. 723 * \param[in] unsorted the rr_list to be sorted 724 * \return void 725 */ 726 void ldns_rr_list_sort(ldns_rr_list *unsorted); 727 728 /** 729 * compares two rrs. The TTL is not looked at. 730 * \param[in] rr1 the first one 731 * \param[in] rr2 the second one 732 * \return 0 if equal 733 * -1 if rr1 comes before rr2 734 * +1 if rr2 comes before rr1 735 */ 736 int ldns_rr_compare(const ldns_rr *rr1, const ldns_rr *rr2); 737 738 /** 739 * compares two rrs, up to the rdata. 740 * \param[in] rr1 the first one 741 * \param[in] rr2 the second one 742 * \return 0 if equal 743 * -1 if rr1 comes before rr2 744 * +1 if rr2 comes before rr1 745 */ 746 int ldns_rr_compare_no_rdata(const ldns_rr *rr1, const ldns_rr *rr2); 747 748 /** 749 * compares the wireformat of two rrs, contained in the given buffers. 750 * \param[in] rr1_buf the first one 751 * \param[in] rr2_buf the second one 752 * \return 0 if equal 753 * -1 if rr1_buf comes before rr2_buf 754 * +1 if rr2_buf comes before rr1_buf 755 */ 756 int ldns_rr_compare_wire(ldns_buffer *rr1_buf, ldns_buffer *rr2_buf); 757 758 /** 759 * returns true of the given rr's are equal. 760 * Also returns true if one record is a DS that represents the 761 * same DNSKEY record as the other record 762 * \param[in] rr1 the first rr 763 * \param[in] rr2 the second rr 764 * \return true if equal otherwise false 765 */ 766 bool ldns_rr_compare_ds(const ldns_rr *rr1, const ldns_rr *rr2); 767 768 /** 769 * compares two rr listss. 770 * \param[in] rrl1 the first one 771 * \param[in] rrl2 the second one 772 * \return 0 if equal 773 * -1 if rrl1 comes before rrl2 774 * +1 if rrl2 comes before rrl1 775 */ 776 int ldns_rr_list_compare(const ldns_rr_list *rrl1, const ldns_rr_list *rrl2); 777 778 /** 779 * calculates the uncompressed size of an RR. 780 * \param[in] r the rr to operate on 781 * \return size of the rr 782 */ 783 size_t ldns_rr_uncompressed_size(const ldns_rr *r); 784 785 /** 786 * converts each dname in a rr to its canonical form. 787 * \param[in] rr the rr to work on 788 * \return void 789 */ 790 void ldns_rr2canonical(ldns_rr *rr); 791 792 /** 793 * converts each dname in each rr in a rr_list to its canonical form. 794 * \param[in] rr_list the rr_list to work on 795 * \return void 796 */ 797 void ldns_rr_list2canonical(ldns_rr_list *rr_list); 798 799 /** 800 * counts the number of labels of the ownername. 801 * \param[in] rr count the labels of this rr 802 * \return the number of labels 803 */ 804 uint8_t ldns_rr_label_count(ldns_rr *rr); 805 806 /** 807 * returns the resource record descriptor for the given rr type. 808 * 809 * \param[in] type the type value of the rr type 810 *\return the ldns_rr_descriptor for this type 811 */ 812 const ldns_rr_descriptor *ldns_rr_descript(uint16_t type); 813 814 /** 815 * returns the minimum number of rdata fields of the rr type this descriptor describes. 816 * 817 * \param[in] descriptor for an rr type 818 * \return the minimum number of rdata fields 819 */ 820 size_t ldns_rr_descriptor_minimum(const ldns_rr_descriptor *descriptor); 821 822 /** 823 * returns the maximum number of rdata fields of the rr type this descriptor describes. 824 * 825 * \param[in] descriptor for an rr type 826 * \return the maximum number of rdata fields 827 */ 828 size_t ldns_rr_descriptor_maximum(const ldns_rr_descriptor *descriptor); 829 830 /** 831 * returns the rdf type for the given rdata field number of the rr type for the given descriptor. 832 * 833 * \param[in] descriptor for an rr type 834 * \param[in] field the field number 835 * \return the rdf type for the field 836 */ 837 ldns_rdf_type ldns_rr_descriptor_field_type(const ldns_rr_descriptor *descriptor, size_t field); 838 839 /** 840 * Return the rr_list which matches the rdf at position field. Think 841 * type-covered stuff for RRSIG 842 * 843 * \param[in] l the rr_list to look in 844 * \param[in] r the rdf to use for the comparison 845 * \param[in] pos at which position can we find the rdf 846 * 847 * \return a new rr list with only the RRs that match 848 * 849 */ 850 ldns_rr_list *ldns_rr_list_subtype_by_rdf(ldns_rr_list *l, ldns_rdf *r, size_t pos); 851 852 /** 853 * convert an rdf of type LDNS_RDF_TYPE_TYPE to an actual 854 * LDNS_RR_TYPE. This is usefull in the case when inspecting 855 * the rrtype covered field of an RRSIG. 856 * \param[in] rd the rdf to look at 857 * \return a ldns_rr_type with equivalent LDNS_RR_TYPE 858 * 859 */ 860 ldns_rr_type ldns_rdf2rr_type(const ldns_rdf *rd); 861 862 /** 863 * Returns the type of the first element of the RR 864 * If there are no elements present, 0 is returned 865 * 866 * \param[in] rr_list The rr list 867 * \return rr_type of the first element, or 0 if the list is empty 868 */ 869 ldns_rr_type 870 ldns_rr_list_type(const ldns_rr_list *rr_list); 871 872 /** 873 * Returns the owner domain name rdf of the first element of the RR 874 * If there are no elements present, NULL is returned 875 * 876 * \param[in] rr_list The rr list 877 * \return dname of the first element, or NULL if the list is empty 878 */ 879 ldns_rdf * 880 ldns_rr_list_owner(const ldns_rr_list *rr_list); 881 882 #ifdef __cplusplus 883 } 884 #endif 885 886 #endif /* LDNS_RR_H */ 887