diff --git a/examples/dns.c b/examples/dns.c index ba1f592..637b2a1 100644 --- a/examples/dns.c +++ b/examples/dns.c @@ -53,16 +53,6 @@ uint8_t* get_cs(const HCountedArray *arr) { return ret; } -uint8_t** get_txt(const HCountedArray *arr) { - uint8_t **ret = h_arena_malloc(arr->arena, sizeof(uint8_t*)*arr->used); - for (size_t i=0; iused; ++i) { - uint8_t *tmp = h_arena_malloc(arr->arena, sizeof(uint8_t)*arr->elements[i]->seq->used); - for (size_t j=0; jelements[i]->seq->used; ++j) - tmp[j] = arr->elements[i]->seq->elements[j]->uint; - } - return ret; -} - void set_rdata(struct dns_rr rr, HCountedArray *rdata) { uint8_t *data = h_arena_malloc(rdata->arena, sizeof(uint8_t)*rdata->used); for (size_t i=0; iused; ++i) @@ -142,8 +132,7 @@ void set_rdata(struct dns_rr rr, HCountedArray *rdata) { rr.mx.exchange = *H_FIELD(dns_domain_t, 1); break; case 16: // TXT - rr.txt.count = p->ast->seq->elements[0]->seq->used; - rr.txt.txt_data = get_txt(p->ast->seq->elements[0]->seq); + rr.txt = *(dns_rr_txt_t *)p->ast; break; default: break; @@ -348,7 +337,7 @@ int start_listening() { const int TYPE_MAX = 16; typedef const char* cstr; -const char* TYPE_STR[17] = { +static const char* TYPE_STR[17] = { "nil", "A", "NS", "MD", "MF", "CNAME", "SOA", "MB", "MG", "MR", "NULL", "WKS", diff --git a/examples/dns.h b/examples/dns.h index 57602b0..f3e023c 100644 --- a/examples/dns.h +++ b/examples/dns.h @@ -7,6 +7,12 @@ enum DNSTokenType_ { TT_dns_qname_t, TT_dns_question_t, TT_dns_rr_t, + TT_dns_rr_txt_t, + TT_dns_rr_hinfo_t, + TT_dns_rr_minfo_t, + TT_dns_rr_mx_t, + TT_dns_rr_soa_t, + TT_dns_rr_wks_t, TT_dns_domain_t }; diff --git a/examples/rr.c b/examples/rr.c index f252953..3619ca1 100644 --- a/examples/rr.c +++ b/examples/rr.c @@ -1,5 +1,6 @@ #include "../src/hammer.h" #include "dns_common.h" +#include "dns.h" #include "rr.h" #define false 0 @@ -11,6 +12,24 @@ bool validate_null(HParseResult *p) { return (65536 > p->ast->seq->used); } +const HParsedToken *act_txt(const HParseResult *p) { + dns_rr_txt_t *txt = H_MAKE(dns_rr_txt_t); + + const HCountedArray *arr = p->ast->seq->elements[0]->seq; + uint8_t **ret = h_arena_malloc(arr->arena, sizeof(uint8_t*)*arr->used); + for (size_t i=0; iused; ++i) { + uint8_t *tmp = h_arena_malloc(arr->arena, sizeof(uint8_t)*arr->elements[i]->seq->used); + for (size_t j=0; jelements[i]->seq->used; ++j) + tmp[j] = arr->elements[i]->seq->elements[j]->uint; + ret[i] = tmp; + } + + txt->count = p->ast->seq->elements[0]->seq->used; + txt->txt_data = ret; + + return H_MAKE_TOKEN(dns_rr_txt_t, txt); +} + #define RDATA_TYPE_MAX 16 const HParser* init_rdata(uint16_t type) { static const HParser *parsers[RDATA_TYPE_MAX+1]; @@ -51,7 +70,7 @@ const HParser* init_rdata(uint16_t type) { H_RULE (hinfo, h_sequence(cstr, cstr, NULL)); H_RULE (minfo, h_sequence(domain, domain, NULL)); H_RULE (mx, h_sequence(h_uint16(), domain, NULL)); - H_RULE (txt, h_many1(cstr)); + H_ARULE(txt, h_many1(cstr)); parsers[ 0] = NULL; // there is no type 0