]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
pack_clone: new function
authorVladimír Čunát <vladimir.cunat@nic.cz>
Tue, 10 Apr 2018 12:35:49 +0000 (14:35 +0200)
committerVladimír Čunát <vladimir.cunat@nic.cz>
Thu, 12 Apr 2018 15:49:03 +0000 (17:49 +0200)
lib/generic/pack.h

index b42fd18fc143cd46a958e51384d93f5ae306eae2..ddabb0b2a61a61f2f6440fbce26188c456cb95fa 100644 (file)
@@ -182,6 +182,25 @@ static inline int pack_obj_del(pack_t *pack, const uint8_t *obj, pack_objlen_t l
        return -1;
 }
 
+/** Clone a pack into a mempool (can be NULL).
+ * @return NULL on allocation failure. */
+static inline pack_t * pack_clone(const pack_t *src, knot_mm_t *pool)
+{
+       pack_t *dst = mm_alloc(pool, sizeof(pack_t));
+       if (!dst) return dst;
+       pack_init(*dst);
+       /* Clone data only if needed */
+       if (!pack_head(*src)) return dst;
+       int ret = array_reserve_mm(*dst, src->len, kr_memreserve, pool);
+       if (ret < 0) {
+               mm_free(pool, dst);
+               return NULL;
+       }
+       memcpy(dst->at, src->at, src->len);
+       dst->len = src->len;
+       return dst;
+}
+
 #ifdef __cplusplus
 }
 #endif