From 0083031d6f3fcdf0a1ad84cdeb899c11dd02860b Mon Sep 17 00:00:00 2001 From: "Sven M. Hallberg" <pesco@khjk.org> Date: Wed, 16 Jan 2013 16:08:30 +0100 Subject: [PATCH] move get_domain logic into an action on the domain parser --- examples/dns.c | 27 +++------------------------ examples/dns.h | 5 ++++- examples/dns_common.c | 29 ++++++++++++++++++++++++++++- 3 files changed, 35 insertions(+), 26 deletions(-) diff --git a/examples/dns.c b/examples/dns.c index fb2b1487..59046163 100644 --- a/examples/dns.c +++ b/examples/dns.c @@ -43,30 +43,9 @@ bool validate_dns(HParseResult *p) { } char* get_domain(const HParsedToken *t) { - switch(t->token_type) { - case TT_UINT: - return " "; - case TT_SEQUENCE: - { - // Sequence of subdomains separated by "." - // Each subdomain is a label, which can be no more than 63 chars. - char *ret = h_arena_malloc(t->seq->arena, 64*t->seq->used); - size_t count = 0; - for (size_t i=0; i<t->seq->used; ++i) { - HParsedToken *tmp = t->seq->elements[i]; - for (size_t j=0; j<tmp->seq->used; ++j) { - ret[count] = tmp->seq->elements[i]->uint; - ++count; - } - ret[count] = '.'; - ++count; - } - ret[count-1] = '\x00'; - return ret; - } - default: - return NULL; - } + assert(t != NULL); + assert(t->token_type == (HTokenType)TT_dns_domain); + return t->user; } uint8_t* get_cs(const HCountedArray *arr) { diff --git a/examples/dns.h b/examples/dns.h index 672e3b7c..913b1869 100644 --- a/examples/dns.h +++ b/examples/dns.h @@ -6,7 +6,8 @@ enum DNSTokenType_ { TT_dns_label, TT_dns_qname, TT_dns_question, - TT_dns_rr + TT_dns_rr, + TT_dns_domain }; typedef struct dns_header { @@ -98,6 +99,8 @@ typedef struct dns_rr { }; } dns_rr_t; +typedef char *dns_domain_t; + typedef struct dns_message { dns_header_t header; dns_question_t *questions; diff --git a/examples/dns_common.c b/examples/dns_common.c index 0b07cf8d..d25abe2b 100644 --- a/examples/dns_common.c +++ b/examples/dns_common.c @@ -1,5 +1,6 @@ #include "../src/hammer.h" #include "dns_common.h" +#include "dns.h" #define false 0 #define true 1 @@ -13,6 +14,32 @@ bool validate_label(HParseResult *p) { return (64 > p->ast->seq->used); } +const HParsedToken* act_domain(const HParseResult *p) { + switch(p->ast->token_type) { + case TT_UINT: + return H_MAKE_TOKEN(dns_domain, " "); + case TT_SEQUENCE: + { + // Sequence of subdomains separated by "." + // Each subdomain is a label, which can be no more than 63 chars. + char *ret = h_arena_malloc(p->arena, 64*p->ast->seq->used); + size_t count = 0; + for (size_t i=0; i<p->ast->seq->used; ++i) { + HParsedToken *tmp = p->ast->seq->elements[i]; + for (size_t j=0; j<tmp->seq->used; ++j) { + ret[count] = tmp->seq->elements[i]->uint; + ++count; + } + ret[count] = '.'; + ++count; + } + ret[count-1] = '\x00'; + return H_MAKE_TOKEN(dns_domain, ret); + } + default: + return NULL; + } +} const HParser* init_domain() { static const HParser *ret = NULL; @@ -29,7 +56,7 @@ const HParser* init_domain() { NULL), validate_label)); H_RULE (subdomain, h_sepBy1(label, h_ch('.'))); - H_RULE (domain, h_choice(subdomain, h_ch(' '), NULL)); + H_ARULE(domain, h_choice(subdomain, h_ch(' '), NULL)); ret = domain; return ret; -- GitLab