]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
cat and cat clone functions
authorMiek Gieben <miekg@NLnetLabs.nl>
Wed, 8 Jun 2005 10:06:16 +0000 (10:06 +0000)
committerMiek Gieben <miekg@NLnetLabs.nl>
Wed, 8 Jun 2005 10:06:16 +0000 (10:06 +0000)
dname.c
ldns/error.h
ldns/rr.h
libdns.vim
rr.c

diff --git a/dname.c b/dname.c
index 4f28d73637ec5e389208c1bceb7ed540f177b9a0..57902c45c2a7ea5fc338cba09593f039a1671333 100644 (file)
--- 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)
 {
index 18168f0434eeb1ac3301bea5e72349686171ec49..be942a1c0c4057328212336b23d22bddf5bfe7ab 100644 (file)
@@ -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,
index fc1375acc4326466c901854f8f8f3352968a5c31..8e35f3f095c7ee134c49a507568bbacdabeeb92b 100644 (file)
--- 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).
index 288a136d179d66a8c0180b51d3c8c7043ace56e8..d3a874073c32cd8fbec218af4d1632734b19a57a 100644 (file)
@@ -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 6a142193761f9789642f7b95d3a0de89ed4a49b2..ced87b5fe17f6dbbe66bf250373e2d9b0cbaedd7 100644 (file)
--- 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 ) {