1 /* 2 * dns.c -- DNS definitions. 3 * 4 * Copyright (c) 2001-2006, NLnet Labs. All rights reserved. 5 * 6 * See LICENSE for the license. 7 * 8 */ 9 10 #include "config.h" 11 12 #include <sys/types.h> 13 #include <sys/socket.h> 14 #include <netinet/in.h> 15 #include <arpa/inet.h> 16 #include <ctype.h> 17 #include <netdb.h> 18 #include <string.h> 19 #ifdef HAVE_STRINGS_H 20 #include <strings.h> 21 #endif 22 23 #include "dns.h" 24 #include "rdata.h" 25 26 /* Taken from RFC 1035, section 3.2.4. */ 27 static lookup_table_type dns_rrclasses[] = { 28 { CLASS_IN, "IN" }, /* the Internet */ 29 { CLASS_CS, "CS" }, /* the CSNET class (Obsolete) */ 30 { CLASS_CH, "CH" }, /* the CHAOS class */ 31 { CLASS_HS, "HS" }, /* Hesiod */ 32 { 0, NULL } 33 }; 34 35 /* For a standard field, it is not optional, has no rdata field functions. */ 36 #define FIELD(name, size) { name, 0 /* is_optional */, size, NULL /* calc_len_func */, NULL /* calc_len_uncompressed_wire_func */ } 37 38 /* For a field entry with all values, for optional fields, or with defined 39 * rdata field functions. */ 40 #define FIELD_ENTRY(name, is_optional, size, calc_len_func, cal_len_uncompressed_wire_func ) { name, is_optional, size, calc_len_func, cal_len_uncompressed_wire_func } 41 42 static const struct nsd_rdata_descriptor generic_rdata_fields[] = { 43 FIELD("", RDATA_REMAINDER) 44 }; 45 46 static const struct nsd_rdata_descriptor a_rdata_fields[] = { 47 FIELD("address", 4) 48 }; 49 50 static const struct nsd_rdata_descriptor ns_rdata_fields[] = { 51 FIELD("host", RDATA_COMPRESSED_DNAME) 52 }; 53 54 static const struct nsd_rdata_descriptor md_rdata_fields[] = { 55 FIELD("madname", RDATA_UNCOMPRESSED_DNAME) 56 }; 57 58 static const struct nsd_rdata_descriptor mf_rdata_fields[] = { 59 FIELD("madname", RDATA_UNCOMPRESSED_DNAME) 60 }; 61 62 static const struct nsd_rdata_descriptor cname_rdata_fields[] = { 63 FIELD("host", RDATA_COMPRESSED_DNAME) 64 }; 65 66 static const struct nsd_rdata_descriptor soa_rdata_fields[] = { 67 FIELD("primary", RDATA_COMPRESSED_DNAME), 68 FIELD("mailbox", RDATA_COMPRESSED_DNAME), 69 FIELD("serial", 4), 70 FIELD("refresh", 4), 71 FIELD("retry", 4), 72 FIELD("expire", 4), 73 FIELD("minimum", 4) 74 }; 75 76 static const struct nsd_rdata_descriptor mb_rdata_fields[] = { 77 FIELD("madname", RDATA_COMPRESSED_DNAME) 78 }; 79 80 static const struct nsd_rdata_descriptor mg_rdata_fields[] = { 81 FIELD("mgmname", RDATA_COMPRESSED_DNAME) 82 }; 83 84 static const struct nsd_rdata_descriptor mr_rdata_fields[] = { 85 FIELD("newname", RDATA_COMPRESSED_DNAME) 86 }; 87 88 static const struct nsd_rdata_descriptor wks_rdata_fields[] = { 89 FIELD("address", 4), 90 FIELD("protocol", 1), 91 FIELD("bitmap", RDATA_REMAINDER) 92 }; 93 94 static const struct nsd_rdata_descriptor ptr_rdata_fields[] = { 95 FIELD("ptrdname", RDATA_COMPRESSED_DNAME) 96 }; 97 98 static const struct nsd_rdata_descriptor hinfo_rdata_fields[] = { 99 FIELD("cpu", RDATA_STRING), 100 FIELD("os", RDATA_STRING) 101 }; 102 103 static const struct nsd_rdata_descriptor minfo_rdata_fields[] = { 104 FIELD("rmailbx", RDATA_COMPRESSED_DNAME), 105 FIELD("emailbx", RDATA_COMPRESSED_DNAME) 106 }; 107 108 static const struct nsd_rdata_descriptor mx_rdata_fields[] = { 109 FIELD("priority", 2), 110 FIELD("hostname", RDATA_COMPRESSED_DNAME) 111 }; 112 113 static const struct nsd_rdata_descriptor txt_rdata_fields[] = { 114 FIELD("text", RDATA_REMAINDER) 115 }; 116 117 static const struct nsd_rdata_descriptor rp_rdata_fields[] = { 118 FIELD("mailbox", RDATA_UNCOMPRESSED_DNAME), 119 FIELD("text", RDATA_UNCOMPRESSED_DNAME) 120 }; 121 122 static const struct nsd_rdata_descriptor afsdb_rdata_fields[] = { 123 FIELD("subtype", 2), 124 FIELD("hostname", RDATA_UNCOMPRESSED_DNAME) 125 }; 126 127 static const struct nsd_rdata_descriptor x25_rdata_fields[] = { 128 FIELD("address", RDATA_STRING) 129 }; 130 131 static const struct nsd_rdata_descriptor isdn_rdata_fields[] = { 132 FIELD("address", RDATA_STRING), 133 FIELD_ENTRY("subaddress", 1, RDATA_STRING, NULL, NULL) 134 }; 135 136 static const struct nsd_rdata_descriptor rt_rdata_fields[] = { 137 FIELD("preference", 2), 138 FIELD("hostname", RDATA_UNCOMPRESSED_DNAME) 139 }; 140 141 static const struct nsd_rdata_descriptor nsap_rdata_fields[] = { 142 FIELD("address", RDATA_REMAINDER) 143 }; 144 145 static const struct nsd_rdata_descriptor nsap_ptr_rdata_fields[] = { 146 FIELD("hostname", RDATA_STRING) 147 }; 148 149 static const struct nsd_rdata_descriptor sig_rdata_fields[] = { 150 FIELD("sigtype", 2), 151 FIELD("algorithm", 1), 152 FIELD("labels", 1), 153 FIELD("origttl", 4), 154 FIELD("expire", 4), 155 FIELD("inception", 4), 156 FIELD("keytag", 2), 157 FIELD("signer", RDATA_LITERAL_DNAME), 158 FIELD("signature", RDATA_REMAINDER) 159 }; 160 161 static const struct nsd_rdata_descriptor key_rdata_fields[] = { 162 FIELD("flags", 2), 163 FIELD("protocol", 1), 164 FIELD("algorithm", 1), 165 FIELD("publickey", RDATA_REMAINDER) 166 }; 167 168 static const struct nsd_rdata_descriptor px_rdata_fields[] = { 169 FIELD("preference", 2), 170 FIELD("map822", RDATA_UNCOMPRESSED_DNAME), 171 FIELD("mapx400", RDATA_UNCOMPRESSED_DNAME) 172 }; 173 174 static const struct nsd_rdata_descriptor gpos_rdata_fields[] = { 175 FIELD("latitude", RDATA_STRING), 176 FIELD("longitude", RDATA_STRING), 177 FIELD("altitude", RDATA_STRING) 178 }; 179 180 static const struct nsd_rdata_descriptor aaaa_rdata_fields[] = { 181 FIELD("address", 16) 182 }; 183 184 static const struct nsd_rdata_descriptor loc_rdata_fields[] = { 185 FIELD("version", 1), 186 FIELD("size", 1), 187 FIELD("horizontal precision", 1), 188 FIELD("vertical precision", 1), 189 FIELD("latitude", 4), 190 FIELD("longitude", 4), 191 FIELD("altitude", 4), 192 }; 193 194 static const struct nsd_rdata_descriptor nxt_rdata_fields[] = { 195 FIELD("next domain name", RDATA_UNCOMPRESSED_DNAME), 196 FIELD("type bit map", RDATA_REMAINDER) 197 }; 198 199 static const struct nsd_rdata_descriptor eid_rdata_fields[] = { 200 FIELD("end point identifier", RDATA_REMAINDER) 201 }; 202 203 static const struct nsd_rdata_descriptor nimloc_rdata_fields[] = { 204 FIELD("nimrod locator", RDATA_REMAINDER) 205 }; 206 207 static const struct nsd_rdata_descriptor srv_rdata_fields[] = { 208 FIELD("priority", 2), 209 FIELD("weight", 2), 210 FIELD("port", 2), 211 FIELD("target", RDATA_UNCOMPRESSED_DNAME) 212 }; 213 214 static const struct nsd_rdata_descriptor atma_rdata_fields[] = { 215 FIELD("address", RDATA_REMAINDER) 216 }; 217 218 static const struct nsd_rdata_descriptor naptr_rdata_fields[] = { 219 FIELD("order", 2), 220 FIELD("preference", 2), 221 FIELD("flags", RDATA_STRING), 222 FIELD("services", RDATA_STRING), 223 FIELD("regex", RDATA_STRING), 224 FIELD("replacement", RDATA_UNCOMPRESSED_DNAME) 225 }; 226 227 static const struct nsd_rdata_descriptor kx_rdata_fields[] = { 228 FIELD("preference", 2), 229 FIELD("exchanger", RDATA_UNCOMPRESSED_DNAME) 230 }; 231 232 static const struct nsd_rdata_descriptor cert_rdata_fields[] = { 233 FIELD("type", 2), 234 FIELD("key tag", 2), 235 FIELD("algorithm", 1), 236 FIELD("certificate", RDATA_REMAINDER) 237 }; 238 239 static const struct nsd_rdata_descriptor a6_rdata_fields[] = { 240 FIELD("address", RDATA_REMAINDER) 241 }; 242 243 static const struct nsd_rdata_descriptor dname_rdata_fields[] = { 244 FIELD("source", RDATA_UNCOMPRESSED_DNAME) 245 }; 246 247 static const struct nsd_rdata_descriptor sink_rdata_fields[] = { 248 FIELD("coding", 1), 249 FIELD("subcoding", 1), 250 FIELD("data", RDATA_REMAINDER), 251 }; 252 253 static const struct nsd_rdata_descriptor apl_rdata_fields[] = { 254 FIELD_ENTRY("prefix", 1, RDATA_REMAINDER, NULL, NULL) 255 }; 256 257 static const struct nsd_rdata_descriptor ds_rdata_fields[] = { 258 FIELD("keytag", 2), 259 FIELD("algorithm", 1), 260 FIELD("digtype", 1), 261 FIELD("digest", RDATA_REMAINDER) 262 }; 263 264 static const struct nsd_rdata_descriptor sshfp_rdata_fields[] = { 265 FIELD("algorithm", 1), 266 FIELD("ftype", 1), 267 FIELD("fingerprint", RDATA_REMAINDER) 268 }; 269 270 static const struct nsd_rdata_descriptor ipseckey_rdata_fields[] = { 271 FIELD("precedence", 1), 272 FIELD("gateway type", 1), 273 FIELD("algorithm", 1), 274 FIELD_ENTRY("gateway", 0, RDATA_IPSECGATEWAY, 275 ipseckey_gateway_length, ipseckey_gateway_length), 276 FIELD_ENTRY("public key", 1, RDATA_REMAINDER, NULL, NULL) 277 }; 278 279 static const struct nsd_rdata_descriptor rrsig_rdata_fields[] = { 280 FIELD("rrtype", 2), 281 FIELD("algorithm", 1), 282 FIELD("labels", 1), 283 FIELD("origttl", 4), 284 FIELD("expire", 4), 285 FIELD("inception", 4), 286 FIELD("keytag", 2), 287 FIELD("signer", RDATA_LITERAL_DNAME), 288 FIELD("signature", RDATA_REMAINDER) 289 }; 290 291 static const struct nsd_rdata_descriptor nsec_rdata_fields[] = { 292 FIELD("next", RDATA_LITERAL_DNAME), 293 FIELD("types", RDATA_REMAINDER) 294 }; 295 296 static const struct nsd_rdata_descriptor dnskey_rdata_fields[] = { 297 FIELD("flags", 2), 298 FIELD("protocol", 1), 299 FIELD("algorithm", 1), 300 FIELD("publickey", RDATA_REMAINDER) 301 }; 302 303 static const struct nsd_rdata_descriptor dhcid_rdata_fields[] = { 304 FIELD("dhcpinfo", RDATA_REMAINDER) 305 }; 306 307 static const struct nsd_rdata_descriptor nsec3_rdata_fields[] = { 308 FIELD("algorithm", 1), 309 FIELD("flags", 1), 310 FIELD("iterations", 2), 311 FIELD("salt", RDATA_BINARY), 312 FIELD("next", RDATA_BINARY), 313 FIELD("types", RDATA_REMAINDER) 314 }; 315 316 static const struct nsd_rdata_descriptor nsec3param_rdata_fields[] = { 317 FIELD("algorithm", 1), 318 FIELD("flags", 1), 319 FIELD("iterations", 2), 320 FIELD("salt", RDATA_BINARY) 321 }; 322 323 static const struct nsd_rdata_descriptor tlsa_rdata_fields[] = { 324 FIELD("usage", 1), 325 FIELD("selector", 1), 326 FIELD("matching type", 1), 327 FIELD("certificate association data", RDATA_REMAINDER) 328 }; 329 330 static const struct nsd_rdata_descriptor smimea_rdata_fields[] = { 331 FIELD("usage", 1), 332 FIELD("selector", 1), 333 FIELD("matching type", 1), 334 FIELD("certificate association data", RDATA_REMAINDER) 335 }; 336 337 static const struct nsd_rdata_descriptor hip_rdata_fields[] = { 338 FIELD("hip", RDATA_REMAINDER) 339 }; 340 341 static const struct nsd_rdata_descriptor ninfo_rdata_fields[] = { 342 FIELD("text", RDATA_REMAINDER) 343 }; 344 345 static const struct nsd_rdata_descriptor rkey_rdata_fields[] = { 346 FIELD("flags", 2), 347 FIELD("protocol", 1), 348 FIELD("algorithm", 1), 349 FIELD("publickey", RDATA_REMAINDER) 350 }; 351 352 static const struct nsd_rdata_descriptor talink_rdata_fields[] = { 353 FIELD("start or previous", RDATA_LITERAL_DNAME), 354 FIELD("end or next", RDATA_LITERAL_DNAME) 355 }; 356 357 static const struct nsd_rdata_descriptor cds_rdata_fields[] = { 358 FIELD("keytag", 2), 359 FIELD("algorithm", 1), 360 FIELD("digtype", 1), 361 FIELD("digest", RDATA_REMAINDER) 362 }; 363 364 static const struct nsd_rdata_descriptor cdnskey_rdata_fields[] = { 365 FIELD("flags", 2), 366 FIELD("protocol", 1), 367 FIELD("algorithm", 1), 368 FIELD("publickey", RDATA_REMAINDER) 369 }; 370 371 static const struct nsd_rdata_descriptor openpgpkey_rdata_fields[] = { 372 FIELD("key", RDATA_REMAINDER) 373 }; 374 375 static const struct nsd_rdata_descriptor csync_rdata_fields[] = { 376 FIELD("serial", 4), 377 FIELD("flags", 2), 378 FIELD("types", RDATA_REMAINDER) 379 }; 380 381 static const struct nsd_rdata_descriptor zonemd_rdata_fields[] = { 382 FIELD("serial", 4), 383 FIELD("scheme", 1), 384 FIELD("algorithm", 1), 385 FIELD("digest", RDATA_REMAINDER) 386 }; 387 388 static const struct nsd_rdata_descriptor svcb_rdata_fields[] = { 389 FIELD("priority", 2), 390 FIELD("target", RDATA_UNCOMPRESSED_DNAME), 391 FIELD("params", RDATA_REMAINDER) 392 }; 393 394 static const struct nsd_rdata_descriptor https_rdata_fields[] = { 395 FIELD("priority", 2), 396 FIELD("target", RDATA_UNCOMPRESSED_DNAME), 397 FIELD("params", RDATA_REMAINDER) 398 }; 399 400 static const struct nsd_rdata_descriptor dsync_rdata_fields[] = { 401 FIELD("rrtype", 2), 402 FIELD("scheme", 1), 403 FIELD("port", 2), 404 FIELD("target", RDATA_LITERAL_DNAME) 405 }; 406 407 static const struct nsd_rdata_descriptor spf_rdata_fields[] = { 408 FIELD("text", RDATA_REMAINDER) 409 }; 410 411 static const struct nsd_rdata_descriptor nid_rdata_fields[] = { 412 FIELD("nid", 2), 413 FIELD("locator", 8) 414 }; 415 416 static const struct nsd_rdata_descriptor l32_rdata_fields[] = { 417 FIELD("preference", 2), 418 FIELD("locator", 4) 419 }; 420 421 static const struct nsd_rdata_descriptor l64_rdata_fields[] = { 422 FIELD("preference", 2), 423 FIELD("locator", 8) 424 }; 425 426 static const struct nsd_rdata_descriptor lp_rdata_fields[] = { 427 FIELD("preference", 2), 428 FIELD("pointer", RDATA_UNCOMPRESSED_DNAME) 429 }; 430 431 static const struct nsd_rdata_descriptor eui48_rdata_fields[] = { 432 FIELD("address", 6) 433 }; 434 435 static const struct nsd_rdata_descriptor eui64_rdata_fields[] = { 436 FIELD("address", 8) 437 }; 438 439 static const struct nsd_rdata_descriptor uri_rdata_fields[] = { 440 FIELD("priority", 2), 441 FIELD("weight", 2), 442 FIELD("target", RDATA_REMAINDER) 443 }; 444 445 static const struct nsd_rdata_descriptor caa_rdata_fields[] = { 446 FIELD("flags", 1), 447 FIELD("tag", RDATA_STRING), 448 FIELD("value", RDATA_REMAINDER) 449 }; 450 451 static const struct nsd_rdata_descriptor avc_rdata_fields[] = { 452 FIELD("text", RDATA_REMAINDER) 453 }; 454 455 static const struct nsd_rdata_descriptor doa_rdata_fields[] = { 456 FIELD("enterprise", 4), 457 FIELD("type", 4), 458 FIELD("location", 1), 459 FIELD("media type", RDATA_STRING), 460 FIELD("data", RDATA_REMAINDER) 461 }; 462 463 static const struct nsd_rdata_descriptor amtrelay_rdata_fields[] = { 464 FIELD("precedence", 1), 465 FIELD("discovery_type", 1), 466 FIELD_ENTRY("relay", 0, RDATA_AMTRELAY_RELAY, 467 amtrelay_relay_length, amtrelay_relay_length) 468 }; 469 470 static const struct nsd_rdata_descriptor resinfo_rdata_fields[] = { 471 FIELD("text", RDATA_REMAINDER) 472 }; 473 474 static const struct nsd_rdata_descriptor wallet_rdata_fields[] = { 475 FIELD("wallet", RDATA_REMAINDER) 476 }; 477 478 static const struct nsd_rdata_descriptor cla_rdata_fields[] = { 479 FIELD("CLA", RDATA_REMAINDER) 480 }; 481 482 static const struct nsd_rdata_descriptor ipn_rdata_fields[] = { 483 FIELD("CBHE Node Number", 8) 484 }; 485 486 static const struct nsd_rdata_descriptor ta_rdata_fields[] = { 487 FIELD("key", 2), 488 FIELD("algorithm", 1), 489 FIELD("type", 1), 490 FIELD("digest", RDATA_REMAINDER) 491 }; 492 493 static const struct nsd_rdata_descriptor dlv_rdata_fields[] = { 494 FIELD("key", 2), 495 FIELD("algorithm", 1), 496 FIELD("type", 1), 497 FIELD("digest", RDATA_REMAINDER) 498 }; 499 500 #define TYPE(name, code, bools, read, write, print, fields) \ 501 { code, name, bools, read, write, print, { sizeof(fields)/sizeof(fields[0]), fields } } 502 503 #define UNKNOWN_TYPE(code) \ 504 { code, NULL /* mnemonic */, 0 /* has_references */, 0 /* is_compressible */, 0 /* has_dnames */, read_generic_rdata, write_generic_rdata, print_generic_rdata, { sizeof(generic_rdata_fields)/sizeof(generic_rdata_fields[0]), generic_rdata_fields } } 505 506 /* The RR type has no references, it is a binary wireformat. 507 * has_references, is_compressible, has_dnames. */ 508 #define TYPE_HAS_NO_REFS 0, 0, 0 509 /* The RR type has references, it has compressed dnames. */ 510 #define TYPE_HAS_COMPRESSED_DNAME 1, 1, 1 511 /* The RR type has references, it has uncompressed dnames. */ 512 #define TYPE_HAS_UNCOMPRESSED_DNAME 1, 0, 1 513 /* The RR type has no references, it has literal dnames. */ 514 #define TYPE_HAS_LITERAL_DNAME 0, 0, 1 515 /* Set the bools, has_references, is_compressible, has_dnames. */ 516 #define TYPE_HAS_FLAGS(has_references, is_compressible, has_dnames) has_references, is_compressible, has_dnames 517 518 const nsd_type_descriptor_type type_descriptors[] = { 519 /* 0 */ 520 UNKNOWN_TYPE(0), /* Type 0 - Reserved [RFC 6895] */ 521 /* 1 */ 522 TYPE("A", TYPE_A, TYPE_HAS_NO_REFS, 523 read_a_rdata, write_generic_rdata, 524 print_a_rdata, a_rdata_fields), 525 /* 2 */ 526 TYPE("NS", TYPE_NS, TYPE_HAS_COMPRESSED_DNAME, 527 read_compressed_name_rdata, write_compressed_name_rdata, 528 print_name_rdata, ns_rdata_fields), 529 /* 3 */ 530 TYPE("MD", TYPE_MD, TYPE_HAS_UNCOMPRESSED_DNAME, 531 read_uncompressed_name_rdata, write_uncompressed_name_rdata, 532 print_name_rdata, md_rdata_fields), 533 /* 4 */ 534 TYPE("MF", TYPE_MF, TYPE_HAS_UNCOMPRESSED_DNAME, 535 read_uncompressed_name_rdata, write_uncompressed_name_rdata, 536 print_name_rdata, mf_rdata_fields), 537 /* 5 */ 538 TYPE("CNAME", TYPE_CNAME, TYPE_HAS_COMPRESSED_DNAME, 539 read_compressed_name_rdata, write_compressed_name_rdata, 540 print_name_rdata, cname_rdata_fields), 541 /* 6 */ 542 TYPE("SOA", TYPE_SOA, TYPE_HAS_COMPRESSED_DNAME, 543 read_soa_rdata, write_soa_rdata, 544 print_soa_rdata, soa_rdata_fields), 545 /* 7 */ 546 TYPE("MB", TYPE_MB, TYPE_HAS_COMPRESSED_DNAME, 547 read_compressed_name_rdata, write_compressed_name_rdata, 548 print_name_rdata, mb_rdata_fields), 549 /* 8 */ 550 TYPE("MG", TYPE_MG, TYPE_HAS_COMPRESSED_DNAME, 551 read_compressed_name_rdata, write_compressed_name_rdata, 552 print_name_rdata, mg_rdata_fields), 553 /* 9 */ 554 TYPE("MR", TYPE_MR, TYPE_HAS_COMPRESSED_DNAME, 555 read_compressed_name_rdata, write_compressed_name_rdata, 556 print_name_rdata, mr_rdata_fields), 557 /* 10 */ 558 TYPE("NULL", TYPE_NULL, TYPE_HAS_NO_REFS, 559 read_generic_rdata, write_generic_rdata, 560 print_generic_rdata, generic_rdata_fields), 561 /* 11 */ 562 TYPE("WKS", TYPE_WKS, TYPE_HAS_NO_REFS, 563 read_wks_rdata, write_generic_rdata, 564 print_wks_rdata, wks_rdata_fields), 565 /* 12 */ 566 TYPE("PTR", TYPE_PTR, TYPE_HAS_COMPRESSED_DNAME, 567 read_compressed_name_rdata, write_compressed_name_rdata, 568 print_name_rdata, ptr_rdata_fields), 569 /* 13 */ 570 TYPE("HINFO", TYPE_HINFO, TYPE_HAS_NO_REFS, 571 read_hinfo_rdata, write_generic_rdata, 572 print_hinfo_rdata, hinfo_rdata_fields), 573 /* 14 */ 574 TYPE("MINFO", TYPE_MINFO, TYPE_HAS_COMPRESSED_DNAME, 575 read_minfo_rdata, write_minfo_rdata, 576 print_minfo_rdata, minfo_rdata_fields), 577 /* 15 */ 578 TYPE("MX", TYPE_MX, TYPE_HAS_COMPRESSED_DNAME, 579 read_mx_rdata, write_mx_rdata, 580 print_mx_rdata, mx_rdata_fields), 581 /* 16 */ 582 TYPE("TXT", TYPE_TXT, TYPE_HAS_NO_REFS, 583 read_txt_rdata, write_generic_rdata, 584 print_txt_rdata, txt_rdata_fields), 585 /* 17 */ 586 TYPE("RP", TYPE_RP, TYPE_HAS_UNCOMPRESSED_DNAME, 587 read_rp_rdata, write_rp_rdata, print_rp_rdata, 588 rp_rdata_fields), 589 /* 18 */ 590 TYPE("AFSDB", TYPE_AFSDB, TYPE_HAS_UNCOMPRESSED_DNAME, 591 read_afsdb_rdata, write_afsdb_rdata, print_afsdb_rdata, 592 afsdb_rdata_fields), 593 /* 19 */ 594 TYPE("X25", TYPE_X25, TYPE_HAS_NO_REFS, 595 read_x25_rdata, write_generic_rdata, print_x25_rdata, 596 x25_rdata_fields), 597 /* 20 */ 598 TYPE("ISDN", TYPE_ISDN, TYPE_HAS_NO_REFS, 599 read_isdn_rdata, write_generic_rdata, print_isdn_rdata, 600 isdn_rdata_fields), 601 /* 21 */ 602 TYPE("RT", TYPE_RT, TYPE_HAS_UNCOMPRESSED_DNAME, 603 read_rt_rdata, write_rt_rdata, print_mx_rdata, 604 rt_rdata_fields), 605 /* 22 */ 606 TYPE("NSAP", TYPE_NSAP, TYPE_HAS_NO_REFS, 607 read_generic_rdata, write_generic_rdata, print_nsap_rdata, 608 nsap_rdata_fields), 609 /* 23 */ 610 TYPE("NSAP-PTR", TYPE_NSAP_PTR, TYPE_HAS_NO_REFS, 611 read_generic_rdata, write_generic_rdata, 612 print_nsap_ptr_rdata, nsap_ptr_rdata_fields), 613 /* 24 */ 614 TYPE("SIG", TYPE_SIG, TYPE_HAS_LITERAL_DNAME, 615 read_rrsig_rdata, write_generic_rdata, print_rrsig_rdata, 616 sig_rdata_fields), 617 /* 25 */ 618 TYPE("KEY", TYPE_KEY, TYPE_HAS_NO_REFS, 619 read_generic_rdata, write_generic_rdata, print_key_rdata, 620 key_rdata_fields), 621 /* 26 */ 622 TYPE("PX", TYPE_PX, TYPE_HAS_UNCOMPRESSED_DNAME, 623 read_px_rdata, write_px_rdata, print_px_rdata, 624 px_rdata_fields), 625 /* 27 */ 626 TYPE("GPOS", TYPE_GPOS, TYPE_HAS_NO_REFS, 627 read_generic_rdata, write_generic_rdata, print_gpos_rdata, 628 gpos_rdata_fields), 629 /* 28 */ 630 TYPE("AAAA", TYPE_AAAA, TYPE_HAS_NO_REFS, 631 read_aaaa_rdata, write_generic_rdata, print_aaaa_rdata, 632 aaaa_rdata_fields), 633 /* 29 */ 634 TYPE("LOC", TYPE_LOC, TYPE_HAS_NO_REFS, 635 read_loc_rdata, write_generic_rdata, print_loc_rdata, 636 loc_rdata_fields), 637 /* 30 */ 638 TYPE("NXT", TYPE_NXT, TYPE_HAS_UNCOMPRESSED_DNAME, 639 read_nxt_rdata, write_nxt_rdata, print_nxt_rdata, 640 nxt_rdata_fields), 641 /* 31 */ 642 TYPE("EID", TYPE_EID, TYPE_HAS_NO_REFS, 643 read_generic_rdata, write_generic_rdata, print_eid_rdata, 644 eid_rdata_fields), 645 /* 32 */ 646 TYPE("NIMLOC", TYPE_NIMLOC, TYPE_HAS_NO_REFS, 647 read_generic_rdata, write_generic_rdata, print_nimloc_rdata, 648 nimloc_rdata_fields), 649 /* 33 */ 650 TYPE("SRV", TYPE_SRV, TYPE_HAS_UNCOMPRESSED_DNAME, 651 read_srv_rdata, write_srv_rdata, 652 print_srv_rdata, srv_rdata_fields), 653 /* 34 */ 654 TYPE("ATMA", TYPE_ATMA, TYPE_HAS_NO_REFS, 655 read_generic_rdata, write_generic_rdata, print_atma_rdata, 656 atma_rdata_fields), 657 /* 35 */ 658 TYPE("NAPTR", TYPE_NAPTR, TYPE_HAS_UNCOMPRESSED_DNAME, 659 read_naptr_rdata, write_naptr_rdata, 660 print_naptr_rdata, naptr_rdata_fields), 661 /* 36 */ 662 TYPE("KX", TYPE_KX, TYPE_HAS_UNCOMPRESSED_DNAME, 663 read_kx_rdata, write_kx_rdata, 664 print_mx_rdata, kx_rdata_fields), 665 /* 37 */ 666 TYPE("CERT", TYPE_CERT, TYPE_HAS_NO_REFS, 667 read_cert_rdata, write_generic_rdata, 668 print_cert_rdata, cert_rdata_fields), 669 /* 38 */ 670 TYPE("A6", TYPE_A6, TYPE_HAS_NO_REFS, 671 read_generic_rdata, write_generic_rdata, 672 print_generic_rdata, a6_rdata_fields), 673 /* 39 */ 674 TYPE("DNAME", TYPE_DNAME, TYPE_HAS_UNCOMPRESSED_DNAME, 675 read_uncompressed_name_rdata, write_uncompressed_name_rdata, 676 print_name_rdata, dname_rdata_fields), 677 /* 40 */ 678 TYPE("SINK", TYPE_SINK, TYPE_HAS_NO_REFS, 679 read_generic_rdata, write_generic_rdata, print_sink_rdata, 680 sink_rdata_fields), 681 682 UNKNOWN_TYPE(41), /* Type 41 - OPT */ 683 684 /* 42 */ 685 TYPE("APL", TYPE_APL, TYPE_HAS_NO_REFS, 686 read_apl_rdata, write_generic_rdata, 687 print_apl_rdata, apl_rdata_fields), 688 /* 43 */ 689 TYPE("DS", TYPE_DS, TYPE_HAS_NO_REFS, 690 read_ds_rdata, write_generic_rdata, 691 print_ds_rdata, ds_rdata_fields), 692 /* 44 */ 693 TYPE("SSHFP", TYPE_SSHFP, TYPE_HAS_NO_REFS, 694 read_sshfp_rdata, write_generic_rdata, 695 print_sshfp_rdata, sshfp_rdata_fields), 696 /* 45 */ 697 TYPE("IPSECKEY", TYPE_IPSECKEY, TYPE_HAS_LITERAL_DNAME, 698 read_ipseckey_rdata, write_generic_rdata, 699 print_ipseckey_rdata, ipseckey_rdata_fields), 700 /* 46 */ 701 TYPE("RRSIG", TYPE_RRSIG, TYPE_HAS_LITERAL_DNAME, 702 read_rrsig_rdata, write_generic_rdata, 703 print_rrsig_rdata, rrsig_rdata_fields), 704 /* 47 */ 705 TYPE("NSEC", TYPE_NSEC, TYPE_HAS_LITERAL_DNAME, 706 read_nsec_rdata, write_generic_rdata, 707 print_nsec_rdata, nsec_rdata_fields), 708 /* 48 */ 709 TYPE("DNSKEY", TYPE_DNSKEY, TYPE_HAS_NO_REFS, 710 read_dnskey_rdata, write_generic_rdata, 711 print_dnskey_rdata, dnskey_rdata_fields), 712 /* 49 */ 713 TYPE("DHCID", TYPE_DHCID, TYPE_HAS_NO_REFS, 714 read_dhcid_rdata, write_generic_rdata, 715 print_dhcid_rdata, dhcid_rdata_fields), 716 /* 50 */ 717 TYPE("NSEC3", TYPE_NSEC3, TYPE_HAS_NO_REFS, 718 read_nsec3_rdata, write_generic_rdata, 719 print_nsec3_rdata, nsec3_rdata_fields), 720 /* 51 */ 721 TYPE("NSEC3PARAM", TYPE_NSEC3PARAM, TYPE_HAS_NO_REFS, 722 read_nsec3param_rdata, write_generic_rdata, 723 print_nsec3param_rdata, nsec3param_rdata_fields), 724 /* 52 */ 725 TYPE("TLSA", TYPE_TLSA, TYPE_HAS_NO_REFS, 726 read_tlsa_rdata, write_generic_rdata, 727 print_tlsa_rdata, tlsa_rdata_fields), 728 /* 53 */ 729 TYPE("SMIMEA", TYPE_SMIMEA, TYPE_HAS_NO_REFS, 730 read_tlsa_rdata, write_generic_rdata, 731 print_tlsa_rdata, smimea_rdata_fields), 732 733 UNKNOWN_TYPE(54), 734 735 /* 55 */ 736 TYPE("HIP", TYPE_HIP, TYPE_HAS_LITERAL_DNAME, 737 read_hip_rdata, write_generic_rdata, 738 print_hip_rdata, hip_rdata_fields), 739 /* 56 */ 740 TYPE("NINFO", TYPE_NINFO, TYPE_HAS_NO_REFS, 741 read_txt_rdata, write_generic_rdata, 742 print_txt_rdata, ninfo_rdata_fields), 743 /* 57 */ 744 TYPE("RKEY", TYPE_RKEY, TYPE_HAS_NO_REFS, 745 read_rkey_rdata, write_generic_rdata, 746 print_rkey_rdata, rkey_rdata_fields), 747 /* 58 */ 748 TYPE("TALINK", TYPE_TALINK, TYPE_HAS_LITERAL_DNAME, 749 read_talink_rdata, write_generic_rdata, 750 print_talink_rdata, talink_rdata_fields), 751 /* 59 */ 752 TYPE("CDS", TYPE_CDS, TYPE_HAS_NO_REFS, 753 read_ds_rdata, write_generic_rdata, 754 print_ds_rdata, cds_rdata_fields), 755 /* 60 */ 756 TYPE("CDNSKEY", TYPE_CDNSKEY, TYPE_HAS_NO_REFS, 757 read_dnskey_rdata, write_generic_rdata, 758 print_dnskey_rdata, cdnskey_rdata_fields), 759 /* 61 */ 760 TYPE("OPENPGPKEY", TYPE_OPENPGPKEY, TYPE_HAS_NO_REFS, 761 read_generic_rdata, write_generic_rdata, 762 print_openpgpkey_rdata, openpgpkey_rdata_fields), 763 /* 62 */ 764 TYPE("CSYNC", TYPE_CSYNC, TYPE_HAS_NO_REFS, 765 read_csync_rdata, write_generic_rdata, 766 print_csync_rdata, csync_rdata_fields), 767 /* 63 */ 768 TYPE("ZONEMD", TYPE_ZONEMD, TYPE_HAS_NO_REFS, 769 read_zonemd_rdata, write_generic_rdata, 770 print_zonemd_rdata, zonemd_rdata_fields), 771 /* 64 */ 772 TYPE("SVCB", TYPE_SVCB, TYPE_HAS_UNCOMPRESSED_DNAME, 773 read_svcb_rdata, write_svcb_rdata, 774 print_svcb_rdata, svcb_rdata_fields), 775 /* 65 */ 776 TYPE("HTTPS", TYPE_HTTPS, TYPE_HAS_UNCOMPRESSED_DNAME, 777 read_svcb_rdata, write_svcb_rdata, 778 print_svcb_rdata, https_rdata_fields), 779 /* 66 */ 780 TYPE("DSYNC", TYPE_DSYNC, TYPE_HAS_LITERAL_DNAME, 781 read_dsync_rdata, write_generic_rdata, 782 print_dsync_rdata, dsync_rdata_fields), 783 784 UNKNOWN_TYPE(67), 785 UNKNOWN_TYPE(68), 786 UNKNOWN_TYPE(69), 787 UNKNOWN_TYPE(70), 788 UNKNOWN_TYPE(71), 789 UNKNOWN_TYPE(72), 790 UNKNOWN_TYPE(73), 791 UNKNOWN_TYPE(74), 792 UNKNOWN_TYPE(75), 793 UNKNOWN_TYPE(76), 794 UNKNOWN_TYPE(77), 795 UNKNOWN_TYPE(78), 796 UNKNOWN_TYPE(79), 797 UNKNOWN_TYPE(80), 798 UNKNOWN_TYPE(81), 799 UNKNOWN_TYPE(82), 800 UNKNOWN_TYPE(83), 801 UNKNOWN_TYPE(84), 802 UNKNOWN_TYPE(85), 803 UNKNOWN_TYPE(86), 804 UNKNOWN_TYPE(87), 805 UNKNOWN_TYPE(88), 806 UNKNOWN_TYPE(89), 807 UNKNOWN_TYPE(90), 808 UNKNOWN_TYPE(91), 809 UNKNOWN_TYPE(92), 810 UNKNOWN_TYPE(93), 811 UNKNOWN_TYPE(94), 812 UNKNOWN_TYPE(95), 813 UNKNOWN_TYPE(96), 814 UNKNOWN_TYPE(97), 815 UNKNOWN_TYPE(98), 816 817 /* 99 */ 818 TYPE("SPF", TYPE_SPF, TYPE_HAS_NO_REFS, 819 read_txt_rdata, write_generic_rdata, 820 print_txt_rdata, spf_rdata_fields), 821 822 UNKNOWN_TYPE(100), /* Type 100 - UINFO [The RR type code is reserved, no reference] */ 823 UNKNOWN_TYPE(101), /* Type 101 - UID [The RR type code is reserved, no reference] */ 824 UNKNOWN_TYPE(102), /* Type 102 - GID [The RR type code is reserved, no reference] */ 825 UNKNOWN_TYPE(103), /* Type 103 - UNSPEC [The RR type code is reserved, no reference] */ 826 827 /* 104 */ 828 TYPE("NID", TYPE_NID, TYPE_HAS_NO_REFS, 829 read_nid_rdata, write_generic_rdata, 830 print_nid_rdata, nid_rdata_fields), 831 /* 105 */ 832 TYPE("L32", TYPE_L32, TYPE_HAS_NO_REFS, 833 read_l32_rdata, write_generic_rdata, 834 print_l32_rdata, l32_rdata_fields), 835 /* 106 */ 836 TYPE("L64", TYPE_L64, TYPE_HAS_NO_REFS, 837 read_l64_rdata, write_generic_rdata, 838 print_l64_rdata, l64_rdata_fields), 839 /* 107 */ 840 TYPE("LP", TYPE_LP, TYPE_HAS_UNCOMPRESSED_DNAME, 841 read_lp_rdata, write_lp_rdata, 842 print_lp_rdata, lp_rdata_fields), 843 /* 108 */ 844 TYPE("EUI48", TYPE_EUI48, TYPE_HAS_NO_REFS, 845 read_eui48_rdata, write_generic_rdata, 846 print_eui48_rdata, eui48_rdata_fields), 847 /* 109 */ 848 TYPE("EUI64", TYPE_EUI64, TYPE_HAS_NO_REFS, 849 read_eui64_rdata, write_generic_rdata, 850 print_eui64_rdata, eui64_rdata_fields), 851 852 UNKNOWN_TYPE(110), 853 UNKNOWN_TYPE(111), 854 UNKNOWN_TYPE(112), 855 UNKNOWN_TYPE(113), 856 UNKNOWN_TYPE(114), 857 UNKNOWN_TYPE(115), 858 UNKNOWN_TYPE(116), 859 UNKNOWN_TYPE(117), 860 UNKNOWN_TYPE(118), 861 UNKNOWN_TYPE(119), 862 UNKNOWN_TYPE(120), 863 UNKNOWN_TYPE(121), 864 UNKNOWN_TYPE(122), 865 UNKNOWN_TYPE(123), 866 UNKNOWN_TYPE(124), 867 UNKNOWN_TYPE(125), 868 UNKNOWN_TYPE(126), 869 UNKNOWN_TYPE(127), 870 871 /* 128 */ 872 /* The mnemonic is included so it can be printed in type bitmaps.*/ 873 TYPE("NXNAME", TYPE_NXNAME, TYPE_HAS_NO_REFS, 874 read_generic_rdata, write_generic_rdata, 875 print_generic_rdata, generic_rdata_fields), 876 877 UNKNOWN_TYPE(129), 878 UNKNOWN_TYPE(130), 879 UNKNOWN_TYPE(131), 880 UNKNOWN_TYPE(132), 881 UNKNOWN_TYPE(133), 882 UNKNOWN_TYPE(134), 883 UNKNOWN_TYPE(135), 884 UNKNOWN_TYPE(136), 885 UNKNOWN_TYPE(137), 886 UNKNOWN_TYPE(138), 887 UNKNOWN_TYPE(139), 888 UNKNOWN_TYPE(140), 889 UNKNOWN_TYPE(141), 890 UNKNOWN_TYPE(142), 891 UNKNOWN_TYPE(143), 892 UNKNOWN_TYPE(144), 893 UNKNOWN_TYPE(145), 894 UNKNOWN_TYPE(146), 895 UNKNOWN_TYPE(147), 896 UNKNOWN_TYPE(148), 897 UNKNOWN_TYPE(149), 898 UNKNOWN_TYPE(150), 899 UNKNOWN_TYPE(151), 900 UNKNOWN_TYPE(152), 901 UNKNOWN_TYPE(153), 902 UNKNOWN_TYPE(154), 903 UNKNOWN_TYPE(155), 904 UNKNOWN_TYPE(156), 905 UNKNOWN_TYPE(157), 906 UNKNOWN_TYPE(158), 907 UNKNOWN_TYPE(159), 908 UNKNOWN_TYPE(160), 909 UNKNOWN_TYPE(161), 910 UNKNOWN_TYPE(162), 911 UNKNOWN_TYPE(163), 912 UNKNOWN_TYPE(164), 913 UNKNOWN_TYPE(165), 914 UNKNOWN_TYPE(166), 915 UNKNOWN_TYPE(167), 916 UNKNOWN_TYPE(168), 917 UNKNOWN_TYPE(169), 918 UNKNOWN_TYPE(170), 919 UNKNOWN_TYPE(171), 920 UNKNOWN_TYPE(172), 921 UNKNOWN_TYPE(173), 922 UNKNOWN_TYPE(174), 923 UNKNOWN_TYPE(175), 924 UNKNOWN_TYPE(176), 925 UNKNOWN_TYPE(177), 926 UNKNOWN_TYPE(178), 927 UNKNOWN_TYPE(179), 928 UNKNOWN_TYPE(180), 929 UNKNOWN_TYPE(181), 930 UNKNOWN_TYPE(182), 931 UNKNOWN_TYPE(183), 932 UNKNOWN_TYPE(184), 933 UNKNOWN_TYPE(185), 934 UNKNOWN_TYPE(186), 935 UNKNOWN_TYPE(187), 936 UNKNOWN_TYPE(188), 937 UNKNOWN_TYPE(189), 938 UNKNOWN_TYPE(190), 939 UNKNOWN_TYPE(191), 940 UNKNOWN_TYPE(192), 941 UNKNOWN_TYPE(193), 942 UNKNOWN_TYPE(194), 943 UNKNOWN_TYPE(195), 944 UNKNOWN_TYPE(196), 945 UNKNOWN_TYPE(197), 946 UNKNOWN_TYPE(198), 947 UNKNOWN_TYPE(199), 948 UNKNOWN_TYPE(200), 949 UNKNOWN_TYPE(201), 950 UNKNOWN_TYPE(202), 951 UNKNOWN_TYPE(203), 952 UNKNOWN_TYPE(204), 953 UNKNOWN_TYPE(205), 954 UNKNOWN_TYPE(206), 955 UNKNOWN_TYPE(207), 956 UNKNOWN_TYPE(208), 957 UNKNOWN_TYPE(209), 958 UNKNOWN_TYPE(210), 959 UNKNOWN_TYPE(211), 960 UNKNOWN_TYPE(212), 961 UNKNOWN_TYPE(213), 962 UNKNOWN_TYPE(214), 963 UNKNOWN_TYPE(215), 964 UNKNOWN_TYPE(216), 965 UNKNOWN_TYPE(217), 966 UNKNOWN_TYPE(218), 967 UNKNOWN_TYPE(219), 968 UNKNOWN_TYPE(220), 969 UNKNOWN_TYPE(221), 970 UNKNOWN_TYPE(222), 971 UNKNOWN_TYPE(223), 972 UNKNOWN_TYPE(224), 973 UNKNOWN_TYPE(225), 974 UNKNOWN_TYPE(226), 975 UNKNOWN_TYPE(227), 976 UNKNOWN_TYPE(228), 977 UNKNOWN_TYPE(229), 978 UNKNOWN_TYPE(230), 979 UNKNOWN_TYPE(231), 980 UNKNOWN_TYPE(232), 981 UNKNOWN_TYPE(233), 982 UNKNOWN_TYPE(234), 983 UNKNOWN_TYPE(235), 984 UNKNOWN_TYPE(236), 985 UNKNOWN_TYPE(237), 986 UNKNOWN_TYPE(238), 987 UNKNOWN_TYPE(239), 988 UNKNOWN_TYPE(240), 989 UNKNOWN_TYPE(241), 990 UNKNOWN_TYPE(242), 991 UNKNOWN_TYPE(243), 992 UNKNOWN_TYPE(244), 993 UNKNOWN_TYPE(245), 994 UNKNOWN_TYPE(246), 995 UNKNOWN_TYPE(247), 996 UNKNOWN_TYPE(248), 997 UNKNOWN_TYPE(249), /* Type 249 - TKEY [RFC 2930] */ 998 UNKNOWN_TYPE(250), /* Type 250 - TSIG */ 999 UNKNOWN_TYPE(251), /* Type 251 - IXFR */ 1000 UNKNOWN_TYPE(252), /* Type 252 - AXFR */ 1001 UNKNOWN_TYPE(253), /* Type 253 - MAILB */ 1002 UNKNOWN_TYPE(254), /* Type 254 - MAILA */ 1003 UNKNOWN_TYPE(255), /* Type 255 - ANY */ 1004 1005 /* 256 */ 1006 TYPE("URI", TYPE_URI, TYPE_HAS_NO_REFS, 1007 read_uri_rdata, write_generic_rdata, 1008 print_uri_rdata, uri_rdata_fields), 1009 /* 257 */ 1010 TYPE("CAA", TYPE_CAA, TYPE_HAS_NO_REFS, 1011 read_caa_rdata, write_generic_rdata, 1012 print_caa_rdata, caa_rdata_fields), 1013 /* 258 */ 1014 TYPE("AVC", TYPE_AVC, TYPE_HAS_NO_REFS, 1015 read_txt_rdata, write_generic_rdata, 1016 print_txt_rdata, avc_rdata_fields), 1017 /* 259 */ 1018 TYPE("DOA", TYPE_DOA, TYPE_HAS_NO_REFS, 1019 read_generic_rdata, write_generic_rdata, 1020 print_doa_rdata, doa_rdata_fields), 1021 /* 260 */ 1022 TYPE("AMTRELAY", TYPE_AMTRELAY, TYPE_HAS_LITERAL_DNAME, 1023 read_amtrelay_rdata, write_generic_rdata, 1024 print_amtrelay_rdata, amtrelay_rdata_fields), 1025 /* 261 */ 1026 TYPE("RESINFO", TYPE_RESINFO, TYPE_HAS_NO_REFS, 1027 read_txt_rdata, write_generic_rdata, 1028 print_resinfo_rdata, resinfo_rdata_fields), 1029 /* 262 */ 1030 TYPE("WALLET", TYPE_WALLET, TYPE_HAS_NO_REFS, 1031 read_txt_rdata, write_generic_rdata, 1032 print_txt_rdata, wallet_rdata_fields), 1033 /* 263 */ 1034 TYPE("CLA", TYPE_CLA, TYPE_HAS_NO_REFS, 1035 read_txt_rdata, write_generic_rdata, 1036 print_txt_rdata, cla_rdata_fields), 1037 /* 264 */ 1038 TYPE("IPN", TYPE_IPN, TYPE_HAS_NO_REFS, 1039 read_generic_rdata, write_generic_rdata, 1040 print_ipn_rdata, ipn_rdata_fields), 1041 1042 /* 32768 */ 1043 TYPE("TA", TYPE_TA, TYPE_HAS_NO_REFS, 1044 read_dlv_rdata, write_generic_rdata, 1045 print_dlv_rdata, ta_rdata_fields), 1046 /* 32769 */ 1047 TYPE("DLV", TYPE_DLV, TYPE_HAS_NO_REFS, 1048 read_dlv_rdata, write_generic_rdata, 1049 print_dlv_rdata, dlv_rdata_fields) 1050 }; 1051 1052 #undef UNKNOWN_TYPE 1053 #undef TYPE 1054 #undef FIELD 1055 #undef FIELD_ENTRY 1056 #undef TYPE_HAS_NO_REFS 1057 #undef TYPE_HAS_COMPRESSED_DNAME 1058 #undef TYPE_HAS_UNCOMPRESSED_DNAME 1059 #undef TYPE_HAS_LITERAL_DNAME 1060 #undef TYPE_HAS_FLAGS 1061 1062 const char * 1063 rrtype_to_string(uint16_t rrtype) 1064 { 1065 static char buf[20]; 1066 const nsd_type_descriptor_type *descriptor = 1067 nsd_type_descriptor(rrtype); 1068 if (descriptor->name) { 1069 return descriptor->name; 1070 } else { 1071 snprintf(buf, sizeof(buf), "TYPE%d", (int) rrtype); 1072 return buf; 1073 } 1074 } 1075 1076 /* 1077 * Lookup the type in the ztypes lookup table. If not found, check if 1078 * the type uses the "TYPExxx" notation for unknown types. 1079 * 1080 * Return 0 if no type matches. 1081 */ 1082 uint16_t 1083 rrtype_from_string(const char *name) 1084 { 1085 char *end; 1086 long rrtype; 1087 1088 /* Because this routine is called during zone parse for every record, 1089 * we optimise for frequently occurring records. 1090 * Also, we optimise for 'IN' and numbers are not rr types, because 1091 * during parse this routine is called for every rr class and TTL 1092 * to determine that it is not an RR type */ 1093 switch(name[0]) { 1094 case 'r': 1095 case 'R': 1096 if(strcasecmp(name+1, "RSIG") == 0) return TYPE_RRSIG; 1097 break; 1098 case 'n': 1099 case 'N': 1100 switch(name[1]) { 1101 case 's': 1102 case 'S': 1103 switch(name[2]) { 1104 case 0: return TYPE_NS; 1105 case 'e': 1106 case 'E': 1107 if(strcasecmp(name+2, "EC") == 0) return TYPE_NSEC; 1108 if(strcasecmp(name+2, "EC3") == 0) return TYPE_NSEC3; 1109 if(strcasecmp(name+2, "EC3PARAM") == 0) return TYPE_NSEC3PARAM; 1110 break; 1111 } 1112 break; 1113 } 1114 break; 1115 case 'd': 1116 case 'D': 1117 switch(name[1]) { 1118 case 's': 1119 case 'S': 1120 if(name[2]==0) return TYPE_DS; 1121 break; 1122 case 'n': 1123 case 'N': 1124 if(strcasecmp(name+2, "SKEY") == 0) return TYPE_DNSKEY; 1125 break; 1126 } 1127 break; 1128 case 'a': 1129 case 'A': 1130 switch(name[1]) { 1131 case 0: return TYPE_A; 1132 case 'a': 1133 case 'A': 1134 if(strcasecmp(name+2, "AA") == 0) return TYPE_AAAA; 1135 break; 1136 } 1137 break; 1138 case 's': 1139 case 'S': 1140 if(strcasecmp(name+1, "OA") == 0) return TYPE_SOA; 1141 break; 1142 case 't': 1143 case 'T': 1144 if(strcasecmp(name+1, "XT") == 0) return TYPE_TXT; 1145 break; 1146 case '0': 1147 case '1': 1148 case '2': 1149 case '3': 1150 case '4': 1151 case '5': 1152 case '6': 1153 case '7': 1154 case '8': 1155 case '9': 1156 return 0; /* no RR types start with 0-9 */ 1157 case 'i': 1158 case 'I': 1159 switch(name[1]) { 1160 case 'n': 1161 case 'N': 1162 return 0; /* 'IN' is a class not a type */ 1163 } 1164 break; 1165 } 1166 1167 for (int i=0, n=sizeof(type_descriptors)/sizeof(type_descriptors[0]); i < n; i++) { 1168 if (type_descriptors[i].name && strcasecmp(type_descriptors[i].name, name) == 0) 1169 return type_descriptors[i].type; 1170 } 1171 1172 if (strlen(name) < 5) 1173 return 0; 1174 1175 if (strncasecmp(name, "TYPE", 4) != 0) 1176 return 0; 1177 1178 if (!isdigit((unsigned char)name[4])) 1179 return 0; 1180 1181 /* The rest from the string must be a number. */ 1182 rrtype = strtol(name + 4, &end, 10); 1183 if (*end != '\0') 1184 return 0; 1185 if (rrtype < 0 || rrtype > 65535L) 1186 return 0; 1187 1188 return (uint16_t) rrtype; 1189 } 1190 1191 const char * 1192 rrclass_to_string(uint16_t rrclass) 1193 { 1194 static char buf[20]; 1195 lookup_table_type *entry = lookup_by_id(dns_rrclasses, rrclass); 1196 if (entry) { 1197 assert(strlen(entry->name) < sizeof(buf)); 1198 strlcpy(buf, entry->name, sizeof(buf)); 1199 } else { 1200 snprintf(buf, sizeof(buf), "CLASS%d", (int) rrclass); 1201 } 1202 return buf; 1203 } 1204 1205 uint16_t 1206 rrclass_from_string(const char *name) 1207 { 1208 char *end; 1209 long rrclass; 1210 lookup_table_type *entry; 1211 1212 entry = lookup_by_name(dns_rrclasses, name); 1213 if (entry) { 1214 return (uint16_t) entry->id; 1215 } 1216 1217 if (strlen(name) < 6) 1218 return 0; 1219 1220 if (strncasecmp(name, "CLASS", 5) != 0) 1221 return 0; 1222 1223 if (!isdigit((unsigned char)name[5])) 1224 return 0; 1225 1226 /* The rest from the string must be a number. */ 1227 rrclass = strtol(name + 5, &end, 10); 1228 if (*end != '\0') 1229 return 0; 1230 if (rrclass < 0 || rrclass > 65535L) 1231 return 0; 1232 1233 return (uint16_t) rrclass; 1234 } 1235