From: Miek Gieben Date: Wed, 8 Jun 2005 10:06:16 +0000 (+0000) Subject: cat and cat clone functions X-Git-Tag: release-0.65~22 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=eeac703d64367911f1f6c36473edd6069a2591fc;p=thirdparty%2Fldns.git cat and cat clone functions --- diff --git a/dname.c b/dname.c index 4f28d736..57902c45 100644 --- a/dname.c +++ b/dname.c @@ -52,6 +52,42 @@ ldns_dname_cat_clone(ldns_rdf *rd1, ldns_rdf *rd2) 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) { diff --git a/ldns/error.h b/ldns/error.h index 18168f04..be942a1c 100644 --- a/ldns/error.h +++ b/ldns/error.h @@ -39,7 +39,8 @@ enum ldns_enum_status 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, diff --git a/ldns/rr.h b/ldns/rr.h index fc1375ac..8e35f3f0 100644 --- a/ldns/rr.h +++ b/ldns/rr.h @@ -437,10 +437,9 @@ void ldns_rr_list_deep_free(ldns_rr_list *rr_list); * 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). diff --git a/libdns.vim b/libdns.vim index 288a136d..d3a87407 100644 --- a/libdns.vim +++ b/libdns.vim @@ -106,6 +106,7 @@ syn keyword ldnsMacro LDNS_STATUS_INVALID_TIME 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 diff --git a/rr.c b/rr.c index 6a142193..ced87b5f 100644 --- a/rr.c +++ b/rr.c @@ -482,48 +482,38 @@ ldns_rr_list_deep_free(ldns_rr_list *rr_list) } -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 * @@ -539,9 +529,14 @@ ldns_rr_list_cat_clone(ldns_rr_list *left, ldns_rr_list *right) 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 ) {