summaryrefslogtreecommitdiff
path: root/src/bundle.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bundle.c')
-rw-r--r--src/bundle.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/bundle.c b/src/bundle.c
index f5e6864..2afa47f 100644
--- a/src/bundle.c
+++ b/src/bundle.c
@@ -374,6 +374,40 @@ int bundle_keyval_get_array_val(bundle_keyval_t *kv, void ***array_val,
array_val, array_len, array_item_size);
}
+bundle_keyval_t *bundle_keyval_dup(const bundle_keyval_t *kv)
+{
+ bundle_keyval_t *ret_kv = NULL;
+ void *byte = NULL;
+ size_t byte_len;
+ size_t len;
+
+ if (!kv)
+ return NULL;
+
+ if (keyval_type_is_array(kv->type)) {
+ len = keyval_array_encode(
+ (keyval_array_t *)kv, &byte, &byte_len);
+ if (len == 0)
+ return NULL;
+ len = keyval_array_decode(byte,
+ (keyval_array_t **)&ret_kv, byte_len);
+ free(byte);
+ if (len == 0)
+ return NULL;
+ } else {
+ len = keyval_encode((keyval_t *)kv,
+ (unsigned char **)&byte, &byte_len);
+ if (len == 0)
+ return NULL;
+ len = keyval_decode(
+ (unsigned char *)byte, (keyval_t **)&ret_kv, byte_len);
+ free(byte);
+ if (len == 0)
+ return NULL;
+ }
+ return ret_kv;
+}
+
bundle *bundle_dup(bundle *b_from)
{
bundle *b_to;