summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common.c26
-rw-r--r--src/common.h2
2 files changed, 28 insertions, 0 deletions
diff --git a/src/common.c b/src/common.c
index 6c2b613..426b96f 100644
--- a/src/common.c
+++ b/src/common.c
@@ -262,3 +262,29 @@ void idevicerestore_progress(struct idevicerestore_client_t* client, int step, d
}
}
}
+
+void plist_dict_merge(plist_t* dictionary, plist_t node)
+{
+ if (dictionary == NULL || (plist_get_node_type(*dictionary) != PLIST_DICT))
+ return;
+
+ char* key = NULL;
+ plist_dict_iter it = NULL;
+ plist_t subnode = NULL;
+ plist_dict_new_iter(node, &it);
+ plist_dict_next_item(node, it, &key, &subnode);
+
+ while (subnode)
+ {
+ if (plist_dict_get_item(*dictionary, key) != NULL)
+ plist_dict_remove_item(*dictionary, key);
+
+ plist_dict_insert_item(*dictionary, key, plist_copy(subnode));
+ if (key) {
+ free(key);
+ key = NULL;
+ }
+ plist_dict_next_item(node, it, &key, &subnode);
+ }
+ free(it);
+} \ No newline at end of file
diff --git a/src/common.h b/src/common.h
index 2ea4a91..0805e0a 100644
--- a/src/common.h
+++ b/src/common.h
@@ -137,6 +137,8 @@ int mkdir_with_parents(const char *dir, int mode);
void idevicerestore_progress(struct idevicerestore_client_t* client, int step, double progress);
+void plist_dict_merge(plist_t* dictionary, plist_t node);
+
#ifdef __cplusplus
}
#endif