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));
|
case t_bindata: bindata.size = ldns_rdf_size(ldns_rr_rdf(rr, i));
|
||||||
bindata.data = ldns_rdf_data(ldns_rr_rdf(rr, i));
|
bindata.data = ldns_rdf_data(ldns_rr_rdf(rr, i));
|
||||||
r = getdns_dict_set_bindata(
|
r = getdns_dict_set_bindata(
|
||||||
rdata, def->rdata[i].name, &bindata);
|
rdata, (char *)def->rdata[i].name, &bindata);
|
||||||
break;
|
break;
|
||||||
case t_int : switch (ldns_rdf_size(ldns_rr_rdf(rr, i))) {
|
case t_int : switch (ldns_rdf_size(ldns_rr_rdf(rr, i))) {
|
||||||
case 1: intval = (uint8_t)*ldns_rdf_data(
|
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;
|
break;
|
||||||
}
|
}
|
||||||
r = getdns_dict_set_int(
|
r = getdns_dict_set_int(
|
||||||
rdata, def->rdata[i].name, intval);
|
rdata, (char *)def->rdata[i].name, intval);
|
||||||
break;
|
break;
|
||||||
default : break;
|
default : break;
|
||||||
}
|
}
|
||||||
|
@ -626,6 +626,7 @@ priv_getdns_create_dict_from_rdfs(
|
||||||
|
|
||||||
assert(context);
|
assert(context);
|
||||||
assert(rr);
|
assert(rr);
|
||||||
|
assert(rdata);
|
||||||
|
|
||||||
*rdata = getdns_dict_create_with_context(context);
|
*rdata = getdns_dict_create_with_context(context);
|
||||||
if (! *rdata)
|
if (! *rdata)
|
||||||
|
@ -676,6 +677,7 @@ priv_getdns_create_dict_from_rr(
|
||||||
|
|
||||||
assert(context);
|
assert(context);
|
||||||
assert(rr);
|
assert(rr);
|
||||||
|
assert(rr_dict);
|
||||||
|
|
||||||
*rr_dict = getdns_dict_create_with_context(context);
|
*rr_dict = getdns_dict_create_with_context(context);
|
||||||
if (! *rr_dict)
|
if (! *rr_dict)
|
||||||
|
@ -715,3 +717,46 @@ priv_getdns_create_dict_from_rr(
|
||||||
getdns_dict_destroy(*rr_dict);
|
getdns_dict_destroy(*rr_dict);
|
||||||
return r;
|
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(
|
getdns_return_t priv_getdns_create_dict_from_rr(
|
||||||
struct getdns_context *context, ldns_rr *rr, struct getdns_dict** rr_dict);
|
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);
|
const char *priv_getdns_rr_type_name(int rr_type);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -232,37 +232,6 @@ create_reply_header_dict(struct getdns_context *context, ldns_pkt * reply)
|
||||||
return result;
|
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.
|
/* helper to convert an rr_list to getdns_list.
|
||||||
returns a list of objects where each object
|
returns a list of objects where each object
|
||||||
is a result from create_dict_from_rr */
|
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);
|
getdns_dict_destroy(subdict);
|
||||||
|
|
||||||
/* question */
|
/* 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);
|
r |= getdns_dict_set_dict(result, GETDNS_STR_KEY_QUESTION, subdict);
|
||||||
getdns_dict_destroy(subdict);
|
getdns_dict_destroy(subdict);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue