]> granicus.if.org Git - libnl/commitdiff
Add new nl_cache_clone() function.
authorThierry Reding <thierry.reding@avionic-design.de>
Thu, 16 Feb 2012 11:57:42 +0000 (12:57 +0100)
committerThomas Graf <tgraf@redhat.com>
Thu, 16 Feb 2012 12:42:49 +0000 (13:42 +0100)
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@avionic-design.de>
Signed-off-by: Thomas Graf <tgraf@redhat.com>
include/netlink/cache.h
lib/cache.c

index f8073f080f6fcabc59dfdc36e3836a4705ee3575..59886ac32fdc025c72bb3fb9b9ad56a88794216e 100644 (file)
@@ -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 *);
 
index a1c8eae3bbb9598bb5e9fa5f395f2a8f548172d9..814c61634b92ea962b580bf1ea98af7600cc37d6 100644 (file)
@@ -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