diff --git a/examples/dns.c b/examples/dns.c index ca0f473..9515a58 100644 --- a/examples/dns.c +++ b/examples/dns.c @@ -33,7 +33,40 @@ bool validate_dns(HParseResult *p) { return true; } +struct dns_qname get_qname(const HParsedToken *t) { + // The qname parser parses at least 1 length-value pair, then a NULL. + // So, t->seq->elements[0] is a sequence of at least 1 such pair, + // and t->seq->elements[1] is the null. + const HParsedToken *labels = t->seq->elements[0]; + struct dns_qname ret = { + .qlen = labels->seq->used, + .labels = arena_malloc(t->seq->arena, sizeof(ret.labels)*ret.qlen) + }; + // i is which label we're on + for (size_t i=0; iseq->used; ++i) { + ret.labels[i].len = labels->seq->elements[i]->seq->used; + ret.labels[i].label = arena_malloc(t->seq->arena, sizeof(uint8_t)*ret.labels[i].len); + // j is which char of the label we're on + for (size_t j=0; jseq->elements[i]->seq->elements[j]->uint; + } + return ret; +} +char* get_name(const HParsedToken *t) { + switch(t->token_type) { + case TT_UINT: + return " "; + case TT_SEQUENCE: + { + // Sequence of subdomains separated by "." + + } + default: + return NULL; + } + +} const HParsedToken* pack_dns_struct(const HParseResult *p) { HParsedToken *ret = arena_malloc(p->arena, sizeof(HParsedToken*)); @@ -62,6 +95,8 @@ const HParsedToken* pack_dns_struct(const HParseResult *p) { struct dns_question *questions = arena_malloc(p->arena, sizeof(struct dns_question)*(header.question_count)); for (size_t i=0; iseq->elements[i]->seq->elements[0]); questions[i].qtype = qs->seq->elements[i]->seq->elements[1]->uint; questions[i].qclass = qs->seq->elements[i]->seq->elements[2]->uint; @@ -145,8 +180,8 @@ const HParser* init_parser() { const HParser *dns_question = sequence(sequence(many1(length_value(uint8(), uint8())), - ch('\x00'), - NULL), // QNAME + ch('\x00'), + NULL), // QNAME qtype, // QTYPE qclass, // QCLASS NULL); diff --git a/examples/dns.h b/examples/dns.h index ab0a86f..1d36103 100644 --- a/examples/dns.h +++ b/examples/dns.h @@ -8,8 +8,15 @@ struct dns_header { size_t authority_count; size_t additional_count; }; +struct dns_qname { + size_t qlen; + struct { + size_t len; + uint8_t *label; + } *labels; +}; struct dns_question { - char** qname; // change to whatever format you want; I'm assuming you'll keep the length-prefixed terms. + struct dns_qname qname; uint16_t qtype; uint16_t qclass; };