]> git.ipfire.org Git - thirdparty/kmod.git/commitdiff
kmod_module: return a new list and increase ref of dependencies
authorLucas De Marchi <lucas.demarchi@profusion.mobi>
Mon, 5 Dec 2011 21:40:45 +0000 (19:40 -0200)
committerLucas De Marchi <lucas.demarchi@profusion.mobi>
Tue, 6 Dec 2011 04:48:03 +0000 (02:48 -0200)
kmod_module_get_dependency is renamed to kmod_module_get_dependencies
since it's returning a list. To match other APIs, now it returns a new
list that user must free with kmod_module_unref_list().

libkmod/libkmod-module.c
libkmod/libkmod.h
libkmod/libkmod.sym

index 48548868ce426304eb9c8fd9040f26535210d88e..a5c7ca34216ef41583ae93304c2552a8fbc79046 100644 (file)
@@ -274,13 +274,33 @@ KMOD_EXPORT int kmod_module_unref_list(struct kmod_list *list)
        return 0;
 }
 
-/*
- * We don't increase the refcount. Maybe we should.
- */
-KMOD_EXPORT struct kmod_list *kmod_module_get_dependency(const struct kmod_module *mod)
+KMOD_EXPORT struct kmod_list *kmod_module_get_dependencies(const struct kmod_module *mod)
 {
-       // FIXME calculate dependency if it's not initialized
-       return mod->dep;
+       /* TODO: populate dependencies on demand */
+       struct kmod_list *l, *l_new, *list_new = NULL;
+
+       if (mod == NULL)
+               return NULL;
+
+       if (!mod->init.dep)
+               return NULL;
+
+       kmod_list_foreach(l, mod->dep) {
+               l_new = kmod_list_append(list_new, kmod_module_ref(l->data));
+               if (l_new == NULL) {
+                       kmod_module_unref(l->data);
+                       goto fail;
+               }
+
+               list_new = l_new;
+       }
+
+       return list_new;
+
+fail:
+       ERR(mod->ctx, "out of memory\n");
+       kmod_module_unref_list(list_new);
+       return NULL;
 }
 
 KMOD_EXPORT struct kmod_module *kmod_module_get_module(const struct kmod_list *entry)
index ae5c623782ab676d8716b040bfe9ad97b2dc3362..81fa5a45f15cd7038b835fea5e2188c028e6bf52 100644 (file)
@@ -94,7 +94,7 @@ struct kmod_module *kmod_module_ref(struct kmod_module *mod);
 struct kmod_module *kmod_module_unref(struct kmod_module *mod);
 int kmod_module_unref_list(struct kmod_list *list);
 struct kmod_module *kmod_module_get_module(const struct kmod_list *entry);
-struct kmod_list *kmod_module_get_dependency(const struct kmod_module *mod);
+struct kmod_list *kmod_module_get_dependencies(const struct kmod_module *mod);
 
 int kmod_module_remove_module(struct kmod_module *mod, unsigned int flags);
 int kmod_module_insert_module(struct kmod_module *mod, unsigned int flags);
index 7b95749f01d6589e3132b16f6f194e76b0773ef1..ec3f8544380ba180a42081eb5527834ff818a62c 100644 (file)
@@ -22,7 +22,7 @@ global:
        kmod_module_remove_module;
        kmod_module_insert_module;
 
-       kmod_module_get_dependency;
+       kmod_module_get_dependencies;
        kmod_module_get_module;
 
        kmod_module_get_name;