mirror of https://github.com/getdnsapi/getdns.git
canonical_name in reply dict + lose debug printing
This commit is contained in:
parent
ceeab9965a
commit
b1bf4a6741
|
@ -511,6 +511,21 @@ error:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
dname_equal(uint8_t *s1, uint8_t *s2)
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
for (;;) {
|
||||||
|
if (*s1 != *s2)
|
||||||
|
return 0;
|
||||||
|
else if (!*s1)
|
||||||
|
return 1;
|
||||||
|
for (i = *s1++, s2++; i > 0; i--, s1++, s2++)
|
||||||
|
if ((*s1 & 0xDF) != (*s2 & 0xDF))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static getdns_dict *
|
static getdns_dict *
|
||||||
create_reply_dict(getdns_context *context, getdns_network_req *req,
|
create_reply_dict(getdns_context *context, getdns_network_req *req,
|
||||||
getdns_list *just_addrs)
|
getdns_list *just_addrs)
|
||||||
|
@ -567,15 +582,23 @@ create_reply_dict(getdns_context *context, getdns_network_req *req,
|
||||||
priv_getdns_rdf_iter rdf_iter_storage, *rdf_iter;
|
priv_getdns_rdf_iter rdf_iter_storage, *rdf_iter;
|
||||||
getdns_bindata bindata;
|
getdns_bindata bindata;
|
||||||
gldns_pkt_section section;
|
gldns_pkt_section section;
|
||||||
|
uint8_t canonical_name_space[256],
|
||||||
|
*canonical_name = canonical_name_space;
|
||||||
|
uint8_t owner_name_space[256], *owner_name;
|
||||||
|
size_t canonical_name_len = 256, owner_name_len;
|
||||||
|
int new_canonical = 0;
|
||||||
|
|
||||||
if (!result)
|
if (!result)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
|
||||||
/* header */
|
/* header */
|
||||||
if ((r = getdns_dict_set_dict(result, GETDNS_STR_KEY_HEADER,
|
if ((r = getdns_dict_set_dict(result, GETDNS_STR_KEY_HEADER,
|
||||||
create_reply_header_dict(context, req))))
|
create_reply_header_dict(context, req))))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
(void) gldns_str2wire_dname_buf(
|
||||||
|
req->owner->name, canonical_name_space, &canonical_name_len);
|
||||||
|
|
||||||
for ( rr_iter = priv_getdns_rr_iter_init(&rr_iter_storage
|
for ( rr_iter = priv_getdns_rr_iter_init(&rr_iter_storage
|
||||||
, req->response
|
, req->response
|
||||||
|
@ -601,6 +624,23 @@ create_reply_dict(getdns_context *context, getdns_network_req *req,
|
||||||
if (section != GLDNS_SECTION_ANSWER)
|
if (section != GLDNS_SECTION_ANSWER)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (gldns_read_uint16(rr_iter->rr_type)==GETDNS_RRTYPE_CNAME) {
|
||||||
|
|
||||||
|
owner_name = priv_getdns_owner_if_or_as_decompressed(
|
||||||
|
rr_iter, owner_name_space, &owner_name_len);
|
||||||
|
if (!dname_equal(canonical_name, owner_name))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!(rdf_iter = priv_getdns_rdf_iter_init(
|
||||||
|
&rdf_iter_storage, rr_iter)))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
new_canonical = 1;
|
||||||
|
canonical_name = priv_getdns_rdf_if_or_as_decompressed(
|
||||||
|
rdf_iter,canonical_name_space,&canonical_name_len);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
/* TODO: Get canonical name_from ANSWER RR's */
|
/* TODO: Get canonical name_from ANSWER RR's */
|
||||||
if (gldns_read_uint16(rr_iter->rr_type) != GETDNS_RRTYPE_A &&
|
if (gldns_read_uint16(rr_iter->rr_type) != GETDNS_RRTYPE_A &&
|
||||||
gldns_read_uint16(rr_iter->rr_type) != GETDNS_RRTYPE_AAAA)
|
gldns_read_uint16(rr_iter->rr_type) != GETDNS_RRTYPE_AAAA)
|
||||||
|
@ -639,12 +679,50 @@ create_reply_dict(getdns_context *context, getdns_network_req *req,
|
||||||
|
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* other stuff
|
/* other stuff
|
||||||
* Note that spec doesn't explicitely mention these.
|
* Note that spec doesn't explicitely mention these.
|
||||||
* They are only showcased in the response dict example */
|
* They are only showcased in the response dict example */
|
||||||
if (getdns_dict_set_int(result, "answer_type", GETDNS_NAMETYPE_DNS))
|
if (getdns_dict_set_int(result, "answer_type", GETDNS_NAMETYPE_DNS))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
while (new_canonical) {
|
||||||
|
new_canonical = 0;
|
||||||
|
|
||||||
|
for ( rr_iter = priv_getdns_rr_iter_init(&rr_iter_storage
|
||||||
|
, req->response
|
||||||
|
, req->response_len)
|
||||||
|
; rr_iter && priv_getdns_rr_iter_section(rr_iter)
|
||||||
|
<= GLDNS_SECTION_ANSWER
|
||||||
|
; rr_iter = priv_getdns_rr_iter_next(rr_iter)) {
|
||||||
|
|
||||||
|
if (priv_getdns_rr_iter_section(rr_iter) !=
|
||||||
|
GLDNS_SECTION_ANSWER)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (gldns_read_uint16(rr_iter->rr_type) !=
|
||||||
|
GETDNS_RRTYPE_CNAME)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
owner_name = priv_getdns_owner_if_or_as_decompressed(
|
||||||
|
rr_iter, owner_name_space, &owner_name_len);
|
||||||
|
if (!dname_equal(canonical_name, owner_name))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!(rdf_iter = priv_getdns_rdf_iter_init(
|
||||||
|
&rdf_iter_storage, rr_iter)))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
canonical_name = priv_getdns_rdf_if_or_as_decompressed(
|
||||||
|
rdf_iter,canonical_name_space,&canonical_name_len);
|
||||||
|
new_canonical = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bindata.data = canonical_name;
|
||||||
|
bindata.size = canonical_name_len;
|
||||||
|
if (getdns_dict_set_bindata(result, "canonical_name", &bindata))
|
||||||
|
goto error;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
error:
|
error:
|
||||||
getdns_dict_destroy(rr_dict);
|
getdns_dict_destroy(rr_dict);
|
||||||
|
@ -703,13 +781,6 @@ create_getdns_response(getdns_dns_req *completed_request)
|
||||||
/* info (bools) about dns_req */
|
/* info (bools) about dns_req */
|
||||||
int dnssec_return_status;
|
int dnssec_return_status;
|
||||||
|
|
||||||
#if defined(WIRE_DEBUG) && WIRE_DEBUG
|
|
||||||
char *str_pkt;
|
|
||||||
priv_getdns_rr_iter rr_iter_storage, *rr_iter;
|
|
||||||
priv_getdns_rdf_iter rdf_spc, *rdf_iter;
|
|
||||||
int i;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for ( netreq_p = completed_request->netreqs
|
for ( netreq_p = completed_request->netreqs
|
||||||
; ! r && (netreq = *netreq_p)
|
; ! r && (netreq = *netreq_p)
|
||||||
; netreq_p++) {
|
; netreq_p++) {
|
||||||
|
@ -723,44 +794,6 @@ create_getdns_response(getdns_dns_req *completed_request)
|
||||||
netreq->response_len = 0;
|
netreq->response_len = 0;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(WIRE_DEBUG) && WIRE_DEBUG
|
|
||||||
for ( rr_iter = priv_getdns_rr_iter_init(&rr_iter_storage
|
|
||||||
, netreq->response
|
|
||||||
, netreq->response_len)
|
|
||||||
; rr_iter
|
|
||||||
; rr_iter = priv_getdns_rr_iter_next(rr_iter)) {
|
|
||||||
|
|
||||||
fprintf( stderr, "%d (%p): %s\n"
|
|
||||||
, (int)rr_iter->n, rr_iter->pos
|
|
||||||
, priv_getdns_rr_def_lookup(
|
|
||||||
(int)gldns_read_uint16(rr_iter->rr_type)
|
|
||||||
)->name);
|
|
||||||
|
|
||||||
i = 0;
|
|
||||||
for ( rdf_iter = priv_getdns_rdf_iter_init(&rdf_spc
|
|
||||||
, rr_iter)
|
|
||||||
; rdf_iter
|
|
||||||
; rdf_iter = priv_getdns_rdf_iter_next(rdf_iter)) {
|
|
||||||
|
|
||||||
fprintf( stderr, "\t%d (%p): "
|
|
||||||
"len: %3d, left: %3d, "
|
|
||||||
"name: %s\n"
|
|
||||||
, i++
|
|
||||||
, rdf_iter->pos
|
|
||||||
, (int)(rdf_iter->nxt - rdf_iter->pos)
|
|
||||||
, (int)(rdf_iter->end - rdf_iter->nxt)
|
|
||||||
, rdf_iter->rdd_pos->name
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
if ((str_pkt = gldns_wire2str_pkt(
|
|
||||||
netreq->response, netreq->response_len))) {
|
|
||||||
fprintf(stderr, "%s\n", str_pkt);
|
|
||||||
free(str_pkt);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dnssec_return_status = completed_request->dnssec_return_status ||
|
dnssec_return_status = completed_request->dnssec_return_status ||
|
||||||
|
|
Loading…
Reference in New Issue