pull selection and initialization of RDATA parser out of set_rdata
This commit is contained in:
parent
f0155d18d6
commit
588d534f32
3 changed files with 41 additions and 29 deletions
|
|
@ -59,39 +59,16 @@ uint8_t** get_txt(const HCountedArray *arr) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_rr(struct dns_rr rr, HCountedArray *rdata) {
|
void set_rdata(struct dns_rr rr, HCountedArray *rdata) {
|
||||||
uint8_t *data = h_arena_malloc(rdata->arena, sizeof(uint8_t)*rdata->used);
|
uint8_t *data = h_arena_malloc(rdata->arena, sizeof(uint8_t)*rdata->used);
|
||||||
for (size_t i=0; i<rdata->used; ++i)
|
for (size_t i=0; i<rdata->used; ++i)
|
||||||
data[i] = rdata->elements[i]->uint;
|
data[i] = rdata->elements[i]->uint;
|
||||||
|
|
||||||
// Mapping numeric RR types (as indices) to parsers
|
// Parse RDATA if possible.
|
||||||
const HParser *parsers[] = {
|
|
||||||
NULL, // there is no type 0
|
|
||||||
init_a(), // 1
|
|
||||||
init_ns(),
|
|
||||||
init_md(),
|
|
||||||
init_mf(),
|
|
||||||
init_cname(), // 5
|
|
||||||
init_soa(),
|
|
||||||
init_mb(),
|
|
||||||
init_mg(),
|
|
||||||
init_mr(),
|
|
||||||
init_null(), // 10
|
|
||||||
init_wks(),
|
|
||||||
init_ptr(),
|
|
||||||
init_hinfo(),
|
|
||||||
init_minfo(),
|
|
||||||
init_mx(), // 15
|
|
||||||
init_txt()
|
|
||||||
};
|
|
||||||
|
|
||||||
// Parse rdata if possible.
|
|
||||||
const HParseResult *p = NULL;
|
const HParseResult *p = NULL;
|
||||||
if (rr.type < sizeof(parsers)) {
|
const HParser *parser = init_rdata(rr.type);
|
||||||
const HParser *parser = parsers[rr.type];
|
if (parser)
|
||||||
if (parser)
|
p = h_parse(parser, (const uint8_t*)data, rdata->used);
|
||||||
p = h_parse(parser, (const uint8_t*)data, rdata->used);
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the RR doesn't parse, set its type to 0.
|
// If the RR doesn't parse, set its type to 0.
|
||||||
if (!p)
|
if (!p)
|
||||||
|
|
@ -214,7 +191,7 @@ const HParsedToken* act_rr(const HParseResult *p) {
|
||||||
rr->rdlength = p->ast->seq->elements[4]->seq->used;
|
rr->rdlength = p->ast->seq->elements[4]->seq->used;
|
||||||
|
|
||||||
// Parse and pack RDATA.
|
// Parse and pack RDATA.
|
||||||
set_rr(*rr, p->ast->seq->elements[4]->seq);
|
set_rdata(*rr, p->ast->seq->elements[4]->seq);
|
||||||
|
|
||||||
return H_MAKE_TOKEN(dns_rr_t, rr);
|
return H_MAKE_TOKEN(dns_rr_t, rr);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,39 @@
|
||||||
#define false 0
|
#define false 0
|
||||||
#define true 1
|
#define true 1
|
||||||
|
|
||||||
|
#define RDATA_TYPE_MAX 16
|
||||||
|
const HParser* init_rdata(uint16_t type) {
|
||||||
|
static const HParser *parsers[RDATA_TYPE_MAX+1];
|
||||||
|
static int inited = 0;
|
||||||
|
|
||||||
|
if (type > RDATA_TYPE_MAX)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (inited)
|
||||||
|
return parsers[type];
|
||||||
|
|
||||||
|
parsers[ 0] = NULL; // there is no type 0
|
||||||
|
parsers[ 1] = init_a();
|
||||||
|
parsers[ 2] = init_ns();
|
||||||
|
parsers[ 3] = init_md();
|
||||||
|
parsers[ 4] = init_mf();
|
||||||
|
parsers[ 5] = init_cname();
|
||||||
|
parsers[ 6] = init_soa();
|
||||||
|
parsers[ 7] = init_mb();
|
||||||
|
parsers[ 8] = init_mg();
|
||||||
|
parsers[ 9] = init_mr();
|
||||||
|
parsers[10] = init_null();
|
||||||
|
parsers[11] = init_wks();
|
||||||
|
parsers[12] = init_ptr();
|
||||||
|
parsers[13] = init_hinfo();
|
||||||
|
parsers[14] = init_minfo();
|
||||||
|
parsers[15] = init_mx();
|
||||||
|
parsers[16] = init_txt();
|
||||||
|
|
||||||
|
inited = 1;
|
||||||
|
return parsers[type];
|
||||||
|
}
|
||||||
|
|
||||||
const HParser* init_cname() {
|
const HParser* init_cname() {
|
||||||
static const HParser *cname = NULL;
|
static const HParser *cname = NULL;
|
||||||
if (cname)
|
if (cname)
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,8 @@
|
||||||
|
|
||||||
#include "../src/hammer.h"
|
#include "../src/hammer.h"
|
||||||
|
|
||||||
|
const HParser* init_rdata(uint16_t type);
|
||||||
|
|
||||||
const HParser* init_cname();
|
const HParser* init_cname();
|
||||||
const HParser* init_hinfo();
|
const HParser* init_hinfo();
|
||||||
const HParser* init_mb();
|
const HParser* init_mb();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue