Changeset View
Changeset View
Standalone View
Standalone View
contrib/ldns/host2wire.c
Show First 20 Lines • Show All 61 Lines • ▼ Show 20 Lines | if (ldns_buffer_reserve(buffer, 2)) | ||||
ldns_buffer_write_u16(buffer, position); | ldns_buffer_write_u16(buffer, position); | ||||
} | } | ||||
return ldns_buffer_status(buffer); | return ldns_buffer_status(buffer); | ||||
} | } | ||||
else | else | ||||
{ | { | ||||
/* Not found. Write cache entry, take off first label, write it, */ | /* Not found. Write cache entry, take off first label, write it, */ | ||||
/* try again with the rest of the name. */ | /* try again with the rest of the name. */ | ||||
if (ldns_buffer_position(buffer) < 16384) { | |||||
ldns_rdf *key; | |||||
node = LDNS_MALLOC(ldns_rbnode_t); | node = LDNS_MALLOC(ldns_rbnode_t); | ||||
if(!node) | if(!node) | ||||
{ | { | ||||
return LDNS_STATUS_MEM_ERR; | return LDNS_STATUS_MEM_ERR; | ||||
} | } | ||||
if (ldns_buffer_position(buffer) < 16384) { | |||||
node->key = ldns_rdf_clone(name); | key = ldns_rdf_clone(name); | ||||
if (!key) { | |||||
LDNS_FREE(node); | |||||
return LDNS_STATUS_MEM_ERR; | |||||
} | |||||
node->key = key; | |||||
node->data = (void *) (intptr_t) ldns_buffer_position(buffer); | node->data = (void *) (intptr_t) ldns_buffer_position(buffer); | ||||
if(!ldns_rbtree_insert(compression_data,node)) | if(!ldns_rbtree_insert(compression_data,node)) | ||||
{ | { | ||||
/* fprintf(stderr,"Name not found but now it's there?\n"); */ | /* fprintf(stderr,"Name not found but now it's there?\n"); */ | ||||
ldns_rdf_deep_free(key); | |||||
LDNS_FREE(node); | |||||
} | } | ||||
} | } | ||||
label = ldns_dname_label(name, 0); | label = ldns_dname_label(name, 0); | ||||
rest = ldns_dname_left_chop(name); | rest = ldns_dname_left_chop(name); | ||||
size = ldns_rdf_size(label) - 1; /* Don't want the final zero */ | size = ldns_rdf_size(label) - 1; /* Don't want the final zero */ | ||||
data = ldns_rdf_data(label); | data = ldns_rdf_data(label); | ||||
if(ldns_buffer_reserve(buffer, size)) | if(ldns_buffer_reserve(buffer, size)) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 271 Lines • ▼ Show 20 Lines | compression_node_free(ldns_rbnode_t *node, void *arg) | ||||
(void)arg; /* Yes, dear compiler, it is used */ | (void)arg; /* Yes, dear compiler, it is used */ | ||||
ldns_rdf_deep_free((ldns_rdf *)node->key); | ldns_rdf_deep_free((ldns_rdf *)node->key); | ||||
LDNS_FREE(node); | LDNS_FREE(node); | ||||
} | } | ||||
ldns_status | ldns_status | ||||
ldns_pkt2buffer_wire(ldns_buffer *buffer, const ldns_pkt *packet) | ldns_pkt2buffer_wire(ldns_buffer *buffer, const ldns_pkt *packet) | ||||
{ | { | ||||
ldns_status status; | |||||
ldns_rbtree_t *compression_data = ldns_rbtree_create((int (*)(const void *, const void *))ldns_dname_compare); | |||||
status = ldns_pkt2buffer_wire_compress(buffer, packet, compression_data); | |||||
ldns_traverse_postorder(compression_data,compression_node_free,NULL); | |||||
ldns_rbtree_free(compression_data); | |||||
return status; | |||||
} | |||||
ldns_status | |||||
ldns_pkt2buffer_wire_compress(ldns_buffer *buffer, const ldns_pkt *packet, ldns_rbtree_t *compression_data) | |||||
{ | |||||
ldns_rr_list *rr_list; | ldns_rr_list *rr_list; | ||||
uint16_t i; | uint16_t i; | ||||
/* edns tmp vars */ | /* edns tmp vars */ | ||||
ldns_rr *edns_rr; | ldns_rr *edns_rr; | ||||
uint8_t edata[4]; | uint8_t edata[4]; | ||||
ldns_rbtree_t *compression_data = ldns_rbtree_create((int (*)(const void *, const void *))ldns_dname_compare); | ldns_buffer *edns_buf = NULL; | ||||
ldns_rdf *edns_rdf = NULL; | |||||
(void) ldns_hdr2buffer_wire(buffer, packet); | (void) ldns_hdr2buffer_wire(buffer, packet); | ||||
rr_list = ldns_pkt_question(packet); | rr_list = ldns_pkt_question(packet); | ||||
if (rr_list) { | if (rr_list) { | ||||
for (i = 0; i < ldns_rr_list_rr_count(rr_list); i++) { | for (i = 0; i < ldns_rr_list_rr_count(rr_list); i++) { | ||||
(void) ldns_rr2buffer_wire_compress(buffer, | (void) ldns_rr2buffer_wire_compress(buffer, | ||||
ldns_rr_list_rr(rr_list, i), LDNS_SECTION_QUESTION, compression_data); | ldns_rr_list_rr(rr_list, i), LDNS_SECTION_QUESTION, compression_data); | ||||
} | } | ||||
Show All 28 Lines | ldns_rr_set_owner(edns_rr, | ||||
ldns_rdf_new_frm_str(LDNS_RDF_TYPE_DNAME, ".")); | ldns_rdf_new_frm_str(LDNS_RDF_TYPE_DNAME, ".")); | ||||
ldns_rr_set_type(edns_rr, LDNS_RR_TYPE_OPT); | ldns_rr_set_type(edns_rr, LDNS_RR_TYPE_OPT); | ||||
ldns_rr_set_class(edns_rr, ldns_pkt_edns_udp_size(packet)); | ldns_rr_set_class(edns_rr, ldns_pkt_edns_udp_size(packet)); | ||||
edata[0] = ldns_pkt_edns_extended_rcode(packet); | edata[0] = ldns_pkt_edns_extended_rcode(packet); | ||||
edata[1] = ldns_pkt_edns_version(packet); | edata[1] = ldns_pkt_edns_version(packet); | ||||
ldns_write_uint16(&edata[2], ldns_pkt_edns_z(packet)); | ldns_write_uint16(&edata[2], ldns_pkt_edns_z(packet)); | ||||
ldns_rr_set_ttl(edns_rr, ldns_read_uint32(edata)); | ldns_rr_set_ttl(edns_rr, ldns_read_uint32(edata)); | ||||
/* don't forget to add the edns rdata (if any) */ | /* don't forget to add the edns rdata (if any) */ | ||||
if (packet->_edns_data) | if ((edns_buf = ldns_edns_option_list2wireformat_buffer(packet->_edns_list))) { | ||||
edns_rdf = ldns_rdf_new( LDNS_RDF_TYPE_UNKNOWN | |||||
, ldns_buffer_limit(edns_buf) | |||||
, ldns_buffer_export(edns_buf)); | |||||
ldns_buffer_free(edns_buf); | |||||
} | |||||
if (edns_rdf) | |||||
ldns_rr_push_rdf(edns_rr, edns_rdf); | |||||
else if (packet->_edns_data) | |||||
ldns_rr_push_rdf (edns_rr, packet->_edns_data); | ldns_rr_push_rdf(edns_rr, packet->_edns_data); | ||||
(void)ldns_rr2buffer_wire_compress(buffer, edns_rr, LDNS_SECTION_ADDITIONAL, compression_data); | (void)ldns_rr2buffer_wire_compress(buffer, edns_rr, LDNS_SECTION_ADDITIONAL, compression_data); | ||||
/* take the edns rdata back out of the rr before we free rr */ | /* if the rdata of the OPT came from packet->_edns_data | ||||
if (packet->_edns_data) | * we need to take it back out of the edns_rr before we free it | ||||
* so packet->_edns_data doesn't get freed | |||||
*/ | |||||
if (!edns_rdf && packet->_edns_data) | |||||
(void)ldns_rr_pop_rdf (edns_rr); | (void)ldns_rr_pop_rdf (edns_rr); | ||||
ldns_rr_free(edns_rr); | ldns_rr_free(edns_rr); | ||||
} | } | ||||
/* add TSIG to additional if it is there */ | /* add TSIG to additional if it is there */ | ||||
if (ldns_pkt_tsig(packet)) { | if (ldns_pkt_tsig(packet)) { | ||||
(void) ldns_rr2buffer_wire_compress(buffer, | (void) ldns_rr2buffer_wire_compress(buffer, | ||||
ldns_pkt_tsig(packet), LDNS_SECTION_ADDITIONAL, compression_data); | ldns_pkt_tsig(packet), LDNS_SECTION_ADDITIONAL, compression_data); | ||||
} | } | ||||
ldns_traverse_postorder(compression_data,compression_node_free,NULL); | |||||
ldns_rbtree_free(compression_data); | |||||
return LDNS_STATUS_OK; | return LDNS_STATUS_OK; | ||||
} | } | ||||
ldns_status | ldns_status | ||||
ldns_rdf2wire(uint8_t **dest, const ldns_rdf *rdf, size_t *result_size) | ldns_rdf2wire(uint8_t **dest, const ldns_rdf *rdf, size_t *result_size) | ||||
{ | { | ||||
ldns_buffer *buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN); | ldns_buffer *buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN); | ||||
▲ Show 20 Lines • Show All 49 Lines • Show Last 20 Lines |