diff --git a/examples/dns.c b/examples/dns.c index 3f4ed9b1178722ba00ace45070cd592e748fd633..0456223b51fffb300fa6478e6c30b402e9115b1d 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 42b46481e6c8b3b83058071bea463a33da692302..5752fe91475ea175a16d3dcc9a94ea759eef28f5 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