From b88d6ca34a3ee82d6c6fb57e3094b90fbebfae5f Mon Sep 17 00:00:00 2001
From: "Sven M. Hallberg" <pesco@khjk.org>
Date: Thu, 17 Jan 2013 21:35:33 +0100
Subject: [PATCH] move SOA processing into an action

---
 examples/dns.c |  9 ++-------
 examples/rr.c  | 16 +++++++++++++++-
 2 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/examples/dns.c b/examples/dns.c
index 3f4ed9b1..0456223b 100644
--- a/examples/dns.c
+++ b/examples/dns.c
@@ -79,13 +79,7 @@ void set_rdata(struct dns_rr rr, HCountedArray *rdata) {
     rr.cname = *(dns_domain_t *)p->ast->user;
     break;
   case 6: // SOA
-    rr.soa.mname = *H_FIELD(dns_domain_t, 0);
-    rr.soa.rname = *H_FIELD(dns_domain_t, 1);
-    rr.soa.serial = p->ast->seq->elements[2]->uint;
-    rr.soa.refresh = p->ast->seq->elements[3]->uint;
-    rr.soa.retry = p->ast->seq->elements[4]->uint;
-    rr.soa.expire = p->ast->seq->elements[5]->uint;
-    rr.soa.minimum = p->ast->seq->elements[6]->uint;
+    rr.soa = *(dns_rr_soa_t *)p->ast->user;
     break;
   case 7: // MB
     rr.mb = *(dns_domain_t *)p->ast->user;
@@ -100,6 +94,7 @@ void set_rdata(struct dns_rr rr, HCountedArray *rdata) {
     rr.null = h_arena_malloc(rdata->arena, sizeof(uint8_t)*p->ast->seq->used);
     for (size_t i=0; i<p->ast->seq->used; ++i)
       rr.null[i] = p->ast->seq->elements[i]->uint;
+    // XXX Where is the length stored!?
     break;
   case 11: // WKS
     rr.wks.address = p->ast->seq->elements[0]->uint;
diff --git a/examples/rr.c b/examples/rr.c
index 42b46481..5752fe91 100644
--- a/examples/rr.c
+++ b/examples/rr.c
@@ -43,6 +43,20 @@ const HParsedToken* act_cstr(const HParseResult *p) {
   return H_MAKE_TOKEN(dns_cstr_t, cs);
 }
 
+const HParsedToken* act_soa(const HParseResult *p) {
+  dns_rr_soa_t *soa = H_MAKE(dns_rr_soa_t);
+
+  soa->mname   = *H_FIELD(dns_domain_t, 0);
+  soa->rname   = *H_FIELD(dns_domain_t, 1);
+  soa->serial  = p->ast->seq->elements[2]->uint;
+  soa->refresh = p->ast->seq->elements[3]->uint;
+  soa->retry   = p->ast->seq->elements[4]->uint;
+  soa->expire  = p->ast->seq->elements[5]->uint;
+  soa->minimum = p->ast->seq->elements[6]->uint;
+
+  return H_MAKE_TOKEN(dns_rr_soa_t, soa);
+}
+
 #define RDATA_TYPE_MAX 16
 const HParser* init_rdata(uint16_t type) {
   static const HParser *parsers[RDATA_TYPE_MAX+1];
@@ -63,7 +77,7 @@ const HParser* init_rdata(uint16_t type) {
   H_RULE (md,     domain);
   H_RULE (mf,     domain);
   H_RULE (cname,  domain);
-  H_RULE (soa,    h_sequence(domain,     // MNAME
+  H_ARULE(soa,    h_sequence(domain,     // MNAME
 			     domain,     // RNAME
 			     h_uint32(), // SERIAL
 			     h_uint32(), // REFRESH
-- 
GitLab