]> git.ipfire.org Git - thirdparty/kmod.git/commitdiff
Add lookup to create modules list from alias
authorLucas De Marchi <lucas.demarchi@profusion.mobi>
Wed, 30 Nov 2011 21:03:41 +0000 (19:03 -0200)
committerLucas De Marchi <lucas.demarchi@profusion.mobi>
Wed, 30 Nov 2011 21:03:41 +0000 (19:03 -0200)
We return a kmod_list when searching for an alias. Right now, it only
search for aliases in config files.

To use it, we create a list:
list = NULL;
kmod_module_new_from_lookup(..., &list);

And iterate over it to get the modules and their details:

kmod_list_foreach(l, list) {
struct kmod_mod *mod = kmod_module_get_module(l);
...
... kmod_module_get_name(mod);
... kmod_module_get_path(mod);
}

Aliases might contain globs and are match by using fnmatch().

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

index 889874c261d665cfb61a418fb46b7a1271183753..7466805f5edfe65c586f390b1c787c92fdfa2f0d 100644 (file)
@@ -33,6 +33,7 @@
 
 #include "libkmod.h"
 #include "libkmod-private.h"
+//#include "libkmod-index.h"
 
 /**
  * kmod_module:
@@ -152,6 +153,40 @@ KMOD_EXPORT struct kmod_module *kmod_module_ref(struct kmod_module *mod)
        return mod;
 }
 
+KMOD_EXPORT int kmod_module_new_from_lookup(struct kmod_ctx *ctx,
+                                               const char *alias,
+                                               struct kmod_list **list)
+{
+
+       int err;
+
+       if (ctx == NULL || alias == NULL)
+               return -ENOENT;
+
+
+       if (list == NULL || *list != NULL) {
+               ERR(ctx, "An empty list is needed to create lookup\n");
+               return -ENOSYS;
+       }
+
+       err = kmod_lookup_alias_from_config(ctx, alias, list);
+
+       if (err < 0) {
+               kmod_module_unref_list(*list);
+               *list = NULL;
+       }
+
+       return err;
+}
+
+KMOD_EXPORT int kmod_module_unref_list(struct kmod_list *list)
+{
+       for (; list != NULL; list = kmod_list_remove(list))
+               kmod_module_unref(list->data);
+
+       return 0;
+}
+
 KMOD_EXPORT struct kmod_module *kmod_module_get_module(struct kmod_list *l)
 {
        struct kmod_module *mod = l->data;
index 9425a37a633772c7c10a1067b578b5379c944f46..7f6c2d17dd575fe783a348b63cfb4834842559ae 100644 (file)
@@ -55,6 +55,7 @@ struct kmod_list *kmod_list_remove_data(struct kmod_list *list,
 
 /* libkmod.c */
 const char *kmod_get_dirname(struct kmod_ctx *ctx) __attribute__((nonnull(1)));
+int kmod_lookup_alias_from_config(struct kmod_ctx *ctx, const char *name, struct kmod_list **list);
 
 /* libkmod-config.c */
 struct kmod_config {
index 56b4d3c9db48cfdc63c45473b52027663511143c..45ab2cef8feeaf26ec60e200b122b24bc54114eb 100644 (file)
@@ -23,6 +23,7 @@
 #include <stdarg.h>
 #include <unistd.h>
 #include <errno.h>
+#include <fnmatch.h>
 #include <string.h>
 #include <ctype.h>
 #include <sys/utsname.h>
@@ -258,3 +259,30 @@ KMOD_EXPORT void kmod_set_log_priority(struct kmod_ctx *ctx, int priority)
 {
        ctx->log_priority = priority;
 }
+
+int kmod_lookup_alias_from_config(struct kmod_ctx *ctx, const char *name,
+                                               struct kmod_list **list)
+{
+       struct kmod_config *config = &ctx->config;
+       struct kmod_list *l;
+       int err;
+
+       kmod_list_foreach(l, config->aliases) {
+               const char *aliasname = kmod_alias_get_name(l);
+               const char *modname = kmod_alias_get_modname(l);
+
+               if (fnmatch(aliasname, name, 0) == 0) {
+                       struct kmod_module *mod;
+
+                       err = kmod_module_new_from_name(ctx, modname, &mod);
+                       if (err < 0) {
+                               ERR(ctx, "%s", strerror(-err));
+                               return err;
+                       }
+
+                       *list = kmod_list_append(*list, mod);
+               }
+       }
+
+       return 0;
+}
index 5a66d2abb69d75b1e37b97df4ed49de52269e970..2d5c281d2ed5708d0a76519e2e8b908a956a6374 100644 (file)
@@ -100,9 +100,13 @@ int kmod_module_new_from_name(struct kmod_ctx *ctx, const char *name,
                                                struct kmod_module **mod);
 int kmod_module_new_from_path(struct kmod_ctx *ctx, const char *path,
                                                struct kmod_module **mod);
+int kmod_module_new_from_lookup(struct kmod_ctx *ctx, const char *alias,
+                                               struct kmod_list **list);
 
 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(struct kmod_list *l);
 
 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 7e998f8dd6d03284a71fe850714ffcecef348a60..06f4077b920dcf3cf31ab4400cbe95e74203aa7e 100644 (file)
@@ -19,11 +19,15 @@ global:
 
        kmod_module_new_from_name;
        kmod_module_new_from_path;
+       kmod_module_new_from_lookup;
        kmod_module_ref;
        kmod_module_unref;
+       kmod_module_unref_list;
        kmod_module_remove_module;
        kmod_module_insert_module;
 
+       kmod_module_get_module;
+
        kmod_module_get_name;
        kmod_module_get_path;
 local: