get_qname done, starting get_domain, going to finish Great Symbol Renaming first
This commit is contained in:
parent
5163f002cf
commit
a077251947
2 changed files with 45 additions and 3 deletions
|
|
@ -33,7 +33,40 @@ bool validate_dns(HParseResult *p) {
|
||||||
return true;
|
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; i<labels->seq->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; j<ret.labels[i].len; ++j)
|
||||||
|
ret.labels[i].label[j] = labels->seq->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) {
|
const HParsedToken* pack_dns_struct(const HParseResult *p) {
|
||||||
HParsedToken *ret = arena_malloc(p->arena, sizeof(HParsedToken*));
|
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,
|
struct dns_question *questions = arena_malloc(p->arena,
|
||||||
sizeof(struct dns_question)*(header.question_count));
|
sizeof(struct dns_question)*(header.question_count));
|
||||||
for (size_t i=0; i<header.question_count; ++i) {
|
for (size_t i=0; i<header.question_count; ++i) {
|
||||||
|
// QNAME is a sequence of labels. In the parser, it's defined as
|
||||||
|
// sequence(many1(length_value(...)), ch('\x00'), NULL).
|
||||||
questions[i].qname = get_qname(qs->seq->elements[i]->seq->elements[0]);
|
questions[i].qname = get_qname(qs->seq->elements[i]->seq->elements[0]);
|
||||||
questions[i].qtype = qs->seq->elements[i]->seq->elements[1]->uint;
|
questions[i].qtype = qs->seq->elements[i]->seq->elements[1]->uint;
|
||||||
questions[i].qclass = qs->seq->elements[i]->seq->elements[2]->uint;
|
questions[i].qclass = qs->seq->elements[i]->seq->elements[2]->uint;
|
||||||
|
|
|
||||||
|
|
@ -8,8 +8,15 @@ struct dns_header {
|
||||||
size_t authority_count;
|
size_t authority_count;
|
||||||
size_t additional_count;
|
size_t additional_count;
|
||||||
};
|
};
|
||||||
|
struct dns_qname {
|
||||||
|
size_t qlen;
|
||||||
|
struct {
|
||||||
|
size_t len;
|
||||||
|
uint8_t *label;
|
||||||
|
} *labels;
|
||||||
|
};
|
||||||
struct dns_question {
|
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 qtype;
|
||||||
uint16_t qclass;
|
uint16_t qclass;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue