From 221f5b4d44b9ad288c218dc0a241220742b3a7dc Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Thu, 14 Aug 2014 18:54:30 +0100 Subject: [PATCH] Add SOA records support. --- include/rdns.h | 9 +++++++++ src/dns_private.h | 2 +- src/parse.c | 17 +++++++++++++++++ src/util.c | 4 ++++ test/dns_regress.c | 14 +++++++++++++- 5 files changed, 44 insertions(+), 2 deletions(-) diff --git a/include/rdns.h b/include/rdns.h index fe4ea1a..fe87d64 100644 --- a/include/rdns.h +++ b/include/rdns.h @@ -47,6 +47,7 @@ typedef void (*dns_callback_type) (struct rdns_reply *reply, void *arg); enum rdns_request_type { RDNS_REQUEST_A = 1, RDNS_REQUEST_NS = 2, + RDNS_REQUEST_SOA = 6, RDNS_REQUEST_PTR = 12, RDNS_REQUEST_MX = 15, RDNS_REQUEST_TXT = 16, @@ -83,6 +84,14 @@ union rdns_reply_element_un { uint16_t port; char *target; } srv; + struct { + char *mname; + char *admin; + uint32_t serial; + int32_t refresh; + int32_t retry; + int32_t expire; + } soa; struct { uint8_t usage; uint8_t selector; diff --git a/src/dns_private.h b/src/dns_private.h index 4b71d18..0ae6e45 100644 --- a/src/dns_private.h +++ b/src/dns_private.h @@ -214,7 +214,7 @@ enum dns_type { DNS_T_A = RDNS_REQUEST_A, DNS_T_NS = RDNS_REQUEST_NS, DNS_T_CNAME = 5, - DNS_T_SOA = 6, + DNS_T_SOA = RDNS_REQUEST_SOA, DNS_T_PTR = RDNS_REQUEST_PTR, DNS_T_MX = RDNS_REQUEST_MX, DNS_T_TXT = RDNS_REQUEST_TXT, diff --git a/src/parse.c b/src/parse.c index c117817..428030e 100644 --- a/src/parse.c +++ b/src/parse.c @@ -303,6 +303,23 @@ rdns_parse_rr (struct rdns_resolver *resolver, } parsed = true; break; + case DNS_T_SOA: + if (! rdns_parse_labels (resolver, in, &elt->content.soa.mname, &p, + rep, remain, true)) { + rdns_info ("invalid labels in NS record"); + return -1; + } + if (! rdns_parse_labels (resolver, in, &elt->content.soa.admin, &p, + rep, remain, true)) { + rdns_info ("invalid labels in NS record"); + return -1; + } + GET32 (elt->content.soa.serial); + GET32 (elt->content.soa.refresh); + GET32 (elt->content.soa.retry); + GET32 (elt->content.soa.expire); + parsed = true; + break; case DNS_T_MX: GET16 (elt->content.mx.priority); if (! rdns_parse_labels (resolver, in, &elt->content.mx.name, &p, diff --git a/src/util.c b/src/util.c index 4f5fc71..7086c85 100644 --- a/src/util.c +++ b/src/util.c @@ -284,6 +284,10 @@ rdns_reply_free (struct rdns_reply *rep) case RDNS_REQUEST_TLSA: free (entry->content.tlsa.data); break; + case RDNS_REQUEST_SOA: + free (entry->content.soa.mname); + free (entry->content.soa.admin); + break; } free (entry); } diff --git a/test/dns_regress.c b/test/dns_regress.c index c30c2b5..4eef1cc 100644 --- a/test/dns_regress.c +++ b/test/dns_regress.c @@ -51,6 +51,16 @@ rdns_regress_callback (struct rdns_reply *reply, void *arg) inet_ntop (AF_INET6, &entry->content.aaa.addr, out, sizeof (out)); printf ("%s has AAAA record %s\n", (char *)arg, out); } + else if (entry->type == RDNS_REQUEST_SOA) { + printf ("%s has SOA record %s %s %u %d %d %d\n", + (char *)arg, + entry->content.soa.mname, + entry->content.soa.admin, + entry->content.soa.serial, + entry->content.soa.refresh, + entry->content.soa.retry, + entry->content.soa.expire); + } else if (entry->type == RDNS_REQUEST_TLSA) { char *hex, *p; unsigned i; @@ -85,7 +95,7 @@ static void rdns_test_a (struct rdns_resolver *resolver) { const char *names[] = { - "google.com", + //"google.com", "github.com", "freebsd.org", "kernel.org", @@ -99,6 +109,8 @@ rdns_test_a (struct rdns_resolver *resolver) *cur, RDNS_REQUEST_AAAA); rdns_make_request_full (resolver, rdns_regress_callback, *cur, 1.0, 2, 1, *cur, RDNS_REQUEST_A); + rdns_make_request_full (resolver, rdns_regress_callback, *cur, 1.0, 2, 1, + *cur, RDNS_REQUEST_SOA); remain_tests ++; } }