From: Vladimír Čunát Date: Tue, 10 Apr 2018 12:35:49 +0000 (+0200) Subject: pack_clone: new function X-Git-Tag: v2.3.0~12^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=85b69110adcd030e304cddce20e1f69abcbb728b;p=thirdparty%2Fknot-resolver.git pack_clone: new function --- diff --git a/lib/generic/pack.h b/lib/generic/pack.h index b42fd18fc..ddabb0b2a 100644 --- a/lib/generic/pack.h +++ b/lib/generic/pack.h @@ -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