[PATCH] Add new nl_cache_clone() function.

Thierry Reding thierry.reding at avionic-design.de
Thu Feb 16 06:57:42 EST 2012


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 <thierry.reding at avionic-design.de>
---
 include/netlink/cache.h |    1 +
 lib/cache.c             |   30 ++++++++++++++++++++++++++++++
 2 files changed, 31 insertions(+), 0 deletions(-)

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
@@ -288,6 +288,36 @@ struct nl_cache *nl_cache_subset(struct nl_cache *orig,
 }
 
 /**
+ * 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
  *
-- 
1.7.9.1




More information about the libnl mailing list