qnames also in dname wire format

This commit is contained in:
Willem Toorop 2014-01-31 00:32:39 +01:00
parent 650b6dbda4
commit 102a9b3be1
3 changed files with 51 additions and 34 deletions

View File

@ -590,7 +590,7 @@ priv_getdns_equip_dict_with_rdfs(struct getdns_dict *rdata, ldns_rr *rr)
case t_bindata: bindata.size = ldns_rdf_size(ldns_rr_rdf(rr, i));
bindata.data = ldns_rdf_data(ldns_rr_rdf(rr, i));
r = getdns_dict_set_bindata(
rdata, def->rdata[i].name, &bindata);
rdata, (char *)def->rdata[i].name, &bindata);
break;
case t_int : switch (ldns_rdf_size(ldns_rr_rdf(rr, i))) {
case 1: intval = (uint8_t)*ldns_rdf_data(
@ -607,7 +607,7 @@ priv_getdns_equip_dict_with_rdfs(struct getdns_dict *rdata, ldns_rr *rr)
break;
}
r = getdns_dict_set_int(
rdata, def->rdata[i].name, intval);
rdata, (char *)def->rdata[i].name, intval);
break;
default : break;
}
@ -626,6 +626,7 @@ priv_getdns_create_dict_from_rdfs(
assert(context);
assert(rr);
assert(rdata);
*rdata = getdns_dict_create_with_context(context);
if (! *rdata)
@ -676,6 +677,7 @@ priv_getdns_create_dict_from_rr(
assert(context);
assert(rr);
assert(rr_dict);
*rr_dict = getdns_dict_create_with_context(context);
if (! *rr_dict)
@ -715,3 +717,46 @@ priv_getdns_create_dict_from_rr(
getdns_dict_destroy(*rr_dict);
return r;
}
getdns_return_t
priv_getdns_create_reply_question_dict(
struct getdns_context *context, ldns_pkt *pkt, struct getdns_dict** q_dict)
{
getdns_return_t r = GETDNS_RETURN_GOOD;
ldns_rr *rr;
struct getdns_bindata qname;
assert(context);
assert(pkt);
assert(q_dict);
rr = ldns_rr_list_rr(ldns_pkt_question(pkt), 0);
if (! rr)
return GETDNS_RETURN_GENERIC_ERROR;
*q_dict = getdns_dict_create_with_context(context);
if (! *q_dict)
return GETDNS_RETURN_MEMORY_ERROR;
do { /* break on error (to cleanup *q_dict) */
r = getdns_dict_set_int(*q_dict,
"qtype", ldns_rr_get_type(rr));
if (r != GETDNS_RETURN_GOOD)
break;
r = getdns_dict_set_int(*q_dict,
"qclass", ldns_rr_get_class(rr));
if (r != GETDNS_RETURN_GOOD)
break;
/* "qname" attribute.
* ldns_rr_owner(rr) is already uncompressed!
*/
qname.size = ldns_rdf_size(ldns_rr_owner(rr));
qname.data = ldns_rdf_data(ldns_rr_owner(rr));
r = getdns_dict_set_bindata(*q_dict, "qname", &qname);
if (r == GETDNS_RETURN_GOOD)
return r;
} while (0);
getdns_dict_destroy(*q_dict);
return r;
}

View File

@ -38,6 +38,9 @@
getdns_return_t priv_getdns_create_dict_from_rr(
struct getdns_context *context, ldns_rr *rr, struct getdns_dict** rr_dict);
getdns_return_t priv_getdns_create_reply_question_dict(
struct getdns_context *context, ldns_pkt *pkt, struct getdns_dict** q_dict);
const char *priv_getdns_rr_type_name(int rr_type);
#endif

View File

@ -232,37 +232,6 @@ create_reply_header_dict(struct getdns_context *context, ldns_pkt * reply)
return result;
}
static struct getdns_dict *
create_reply_question_dict(struct getdns_context *context, ldns_pkt * reply)
{
/* { "qname": <bindata for "www.example.com">, "qtype": 1, "qclass": 1 } */
int r = 0;
ldns_rr *question = NULL;
char *qname;
struct getdns_dict *result = getdns_dict_create_with_context(context);
if (!result) {
return NULL;
}
question = ldns_rr_list_rr(ldns_pkt_question(reply), 0);
r |= getdns_dict_set_int(result, GETDNS_STR_KEY_QTYPE,
(int) ldns_rr_get_type(question));
r |= getdns_dict_set_int(result, GETDNS_STR_KEY_QCLASS,
(int) ldns_rr_get_class(question));
qname = convert_rdf_to_str(ldns_rr_owner(question));
if (qname) {
r |= getdns_dict_util_set_string(result, GETDNS_STR_KEY_QNAME,
qname);
free(qname);
} else {
r = 1;
}
if (r != 0) {
getdns_dict_destroy(result);
result = NULL;
}
return result;
}
/* helper to convert an rr_list to getdns_list.
returns a list of objects where each object
is a result from create_dict_from_rr */
@ -399,7 +368,7 @@ create_reply_dict(struct getdns_context *context, getdns_network_req * req,
getdns_dict_destroy(subdict);
/* question */
subdict = create_reply_question_dict(context, reply);
r |= priv_getdns_create_reply_question_dict(context, reply, &subdict);
r |= getdns_dict_set_dict(result, GETDNS_STR_KEY_QUESTION, subdict);
getdns_dict_destroy(subdict);