From 0b40364150452cb8a8467d10143637bfbb99fb89 Mon Sep 17 00:00:00 2001 From: Thierry Reding Date: Thu, 16 Feb 2012 12:57:42 +0100 Subject: Add new nl_cache_clone() function. The function can be used to make a copy of an existing cache. It is very similar to nl_cache_subset() except that it allows no filtering but copies every object. Signed-off-by: Thierry Reding Signed-off-by: Thomas Graf --- include/netlink/cache.h | 1 + lib/cache.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/include/netlink/cache.h b/include/netlink/cache.h index f8073f0..59886ac 100644 --- a/include/netlink/cache.h +++ b/include/netlink/cache.h @@ -44,6 +44,7 @@ extern int nl_cache_alloc_name(const char *, struct nl_cache **); extern struct nl_cache * nl_cache_subset(struct nl_cache *, struct nl_object *); +extern struct nl_cache * nl_cache_clone(struct nl_cache *); extern void nl_cache_clear(struct nl_cache *); extern void nl_cache_free(struct nl_cache *); diff --git a/lib/cache.c b/lib/cache.c index a1c8eae..814c616 100644 --- a/lib/cache.c +++ b/lib/cache.c @@ -287,6 +287,36 @@ struct nl_cache *nl_cache_subset(struct nl_cache *orig, return cache; } +/** + * Allocate new cache and copy the contents of an existing cache + * @arg cache Original cache to base new cache on + * + * Allocates a new cache matching the type of the cache specified by + * \p cache. Iterates over the \p cache cache and copies all objects + * to the new cache. + * + * The copied objects are clones but do not contain a reference to each + * other. Later modifications to objects in the original cache will + * not affect objects in the new cache. + * + * @return A newly allocated cache or NULL. + */ +struct nl_cache *nl_cache_clone(struct nl_cache *cache) +{ + struct nl_cache_ops *ops = nl_cache_get_ops(cache); + struct nl_cache *clone; + struct nl_object *obj; + + clone = nl_cache_alloc(ops); + if (!clone) + return NULL; + + nl_list_for_each_entry(obj, &cache->c_items, ce_list) + nl_cache_add(clone, obj); + + return clone; +} + /** * Remove all objects of a cache. * @arg cache Cache to clear -- cgit v1.2.1