return new;
}
+/* pointer copy only */
+/* this is a bitch - do we free rd1 and then copy new to rd1
+ * or do we modify rd1 inplace?
+ * I guess the latter is better... MG... ?
+ */
+ldns_rdf *
+ldns_dname_cat(ldns_rdf *rd1, ldns_rdf *rd2)
+{
+ ldns_rdf *new;
+ uint16_t new_size;
+ uint8_t *buf;
+
+ 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;
+ }
+
+ /* 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);
+
+ LDNS_FREE(buf);
+ return new;
+}
+
ldns_rdf *
ldns_dname_left_chop(ldns_rdf *d)
{
LDNS_STATUS_ADDRESS_ERR,
LDNS_STATUS_UNKNOWN_INET,
LDNS_STATUS_NOT_IMPL,
- LDNS_STATUS_CRYPTO_UNKNOWN_ALGO,
+ LDNS_STATUS_NULL, /* NULL pointer error */
+ LDNS_STATUS_CRYPTO_UNKNOWN_ALGO, /* crypto: unknown algorithm */
LDNS_STATUS_CRYPTO_NO_RRSIG,
LDNS_STATUS_CRYPTO_NO_DNSKEY,
LDNS_STATUS_CRYPTO_VALIDATED,
* concatenates two ldns_rr_lists together.
* \param[in] left the leftside
* \param[in] right the rightside
- * \return a new rr_list with leftside/rightside concatenated
+ * \return a left with right concatenated to it
*/
-ldns_rr_list* ldns_rr_list_cat(ldns_rr_list *left, ldns_rr_list *right);
-
+ldns_status ldns_rr_list_cat(ldns_rr_list *left, ldns_rr_list *right);
/**
* concatenates two ldns_rr_lists together, but makes clones of the rr's (instead of pointer copying).
syn keyword ldnsMacro LDNS_STATUS_NETWORK_ERR
syn keyword ldnsMacro LDNS_STATUS_ADDRESS_ERR
syn keyword ldnsMacro LDNS_STATUS_CRYPTO_NO_RRSIG
+syn keyword ldnsMacro LDNS_STATUS_NULL
" ldns/resolver.h
syn keyword ldnsType ldns_resolver
}
-ldns_rr_list *
+/* add right to left. So we modify *left! */
+ldns_status
ldns_rr_list_cat(ldns_rr_list *left, ldns_rr_list *right)
{
- uint16_t l_rr_count;
uint16_t r_rr_count;
+ uint16_t l_rr_count;
uint16_t i;
- ldns_rr_list *cat;
- l_rr_count = 0;
r_rr_count = 0;
if (left) {
l_rr_count = ldns_rr_list_rr_count(left);
+ } else {
+ return LDNS_STATUS_NULL;
}
+
if (right) {
r_rr_count = ldns_rr_list_rr_count(right);
+ } else {
+ return LDNS_STATUS_NULL;
}
if (l_rr_count + r_rr_count > LDNS_MAX_RR ) {
/* overflow error */
- return NULL;
+ return LDNS_STATUS_ERR;
}
- cat = ldns_rr_list_new();
-
- if (!cat) {
- return NULL;
- }
-
- /* left */
- for(i = 0; i < l_rr_count; i++) {
- ldns_rr_list_push_rr(cat,
- ldns_rr_deep_clone(
- ldns_rr_list_rr(left, i)));
- }
- /* right */
+ /* push right to left */
for(i = 0; i < r_rr_count; i++) {
- ldns_rr_list_push_rr(cat,
- ldns_rr_deep_clone(
- ldns_rr_list_rr(right, i)));
+ ldns_rr_list_push_rr(left, ldns_rr_list_rr(right, i));
}
- return cat;
+ return LDNS_STATUS_OK;
}
ldns_rr_list *
if (left) {
l_rr_count = ldns_rr_list_rr_count(left);
+ } else {
+ return NULL;
}
+
if (right) {
r_rr_count = ldns_rr_list_rr_count(right);
+ } else {
+ return NULL;
}
if (l_rr_count + r_rr_count > LDNS_MAX_RR ) {