* or do we modify rd1 inplace?
* I guess the latter is better... MG... ?
*/
-ldns_rdf *
+ldns_status
ldns_dname_cat(ldns_rdf *rd1, ldns_rdf *rd2)
{
- ldns_rdf *new;
- uint16_t new_size;
- uint8_t *buf;
+ uint16_t size;
if (ldns_rdf_get_type(rd1) != LDNS_RDF_TYPE_DNAME ||
ldns_rdf_get_type(rd2) != LDNS_RDF_TYPE_DNAME)
{
- return NULL;
- }
-
- /* we overwrite the nullbyte of rd1 */
- new_size = ldns_rdf_size(rd1) + ldns_rdf_size(rd2) - 1;
- buf = LDNS_XMALLOC(uint8_t, new_size);
- if (!buf) {
- return NULL;
+ return LDNS_STATUS_ERR;
}
- /* put the two dname's after each other */
- memcpy(buf, ldns_rdf_data(rd1), ldns_rdf_size(rd1) - 1);
- memcpy(buf + ldns_rdf_size(rd1) - 1,
- ldns_rdf_data(rd2), ldns_rdf_size(rd2));
-
- new = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_DNAME, new_size, buf);
+ size = ldns_rdf_size(rd1) + ldns_rdf_size(rd2) - 1;
+ ldns_rdf_set_data(rd1, LDNS_XREALLOC(ldns_rdf_data(rd1), uint8_t, size));
+ memcpy(ldns_rdf_data(rd1) + ldns_rdf_size(rd1) - 1, ldns_rdf_data(rd2), ldns_rdf_size(rd2));
+ ldns_rdf_set_size(rd1, size);
- LDNS_FREE(buf);
- return new;
+ return LDNS_STATUS_OK;
}
ldns_rdf *
* \return a new rdf with leftside/rightside
*/
ldns_rdf *ldns_dname_cat_clone(ldns_rdf *rd1, ldns_rdf *rd2);
+/**
+ * concatenates rd2 after rd1 (rd2 is copied, rd1 is modified)
+ * \param[in] rd1 the leftside
+ * \param[in] rd2 the rightside
+ * \return LDNS_STATUS_OK on success
+ */
+ldns_status *ldns_dname_cat(ldns_rdf *rd1, ldns_rdf *rd2);
/**
* chop one label off a dname. so
* wwww.nlnetlabs.nl, becomes nlnetlabs.nl
/* create a new resolver from /etc/resolv.conf */
res = ldns_resolver_new_frm_file(NULL);
+
if (!res) {
exit(1);
}
* records of the domain given on the command line
*/
p = ldns_resolver_query(res, domain, LDNS_RR_TYPE_MX, LDNS_RR_CLASS_IN, LDNS_RD);
+
+ ldns_rdf_deep_free(domain);
+
if (!p) {
exit(1);
} else {
fprintf(stderr,
" *** invalid answer name %s after MX query for %s\n",
argv[1], argv[1]);
+ ldns_pkt_free(p);
+ ldns_resolver_deep_free(res);
exit(1);
} else {
/* sort the list nicely */
/* ldns_rr_list_sort(mx); */
/* print the rrlist to stdout */
ldns_rr_list_print(stdout, mx);
+ ldns_rr_list_deep_free(mx);
}
}
+ ldns_pkt_free(p);
+ ldns_resolver_deep_free(res);
return 0;
}
}
if (ldns_pkt2buffer_wire(qb, query_pkt) != LDNS_STATUS_OK) {
+ ldns_buffer_free(qb);
return LDNS_STATUS_ERR;
}
/* random should already be setup - isn't so bad
break;
default:
LDNS_FREE(ns);
+ ldns_buffer_free(qb);
return LDNS_STATUS_ERR;
}
if (!reply_bytes) {
if (ldns_resolver_fail(r)) {
LDNS_FREE(ns);
+ ldns_buffer_free(qb);
return LDNS_STATUS_ERR;
} else {
continue;
LDNS_STATUS_OK) {
LDNS_FREE(reply_bytes);
LDNS_FREE(ns);
+ ldns_buffer_free(qb);
return LDNS_STATUS_ERR;
}
);
}
}
+ ldns_rr_list_deep_free(rrs);
+
if (ldns_rr_list_rr_count(new) == 0) {
ldns_rr_list_free(new);
return NULL;
);
if (!r) {
/* huh, failure in cloning */
+ ldns_rr_list_free(new_list);
return NULL;
}
ldns_rr_list_push_rr(new_list, r);