mirror of https://github.com/getdnsapi/getdns.git
qnames also in dname wire format
This commit is contained in:
parent
650b6dbda4
commit
102a9b3be1
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue