]> git.ipfire.org Git - thirdparty/kmod.git/commitdiff
Lookup modules.symbols.bin
authorLucas De Marchi <lucas.demarchi@profusion.mobi>
Wed, 30 Nov 2011 22:31:45 +0000 (20:31 -0200)
committerLucas De Marchi <lucas.demarchi@profusion.mobi>
Wed, 30 Nov 2011 22:32:53 +0000 (20:32 -0200)
Test in my system:

./test/test-lookup symbol:sas_slave_destroy
libkmod version 0.1
Alias: 'symbol:sas_slave_destroy'
Modules matching:
libsas

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

index 7450ee3f5554d2a99dfcb76053396963bbc6b6a0..fdfcf45f90326f5ed9f56b169f2fb8edbbd91db3 100644 (file)
@@ -180,6 +180,8 @@ KMOD_EXPORT int kmod_module_new_from_lookup(struct kmod_ctx *ctx,
        err = kmod_lookup_alias_from_config(ctx, alias, list);
        CHECK_ERR_AND_FINISH(err, fail, list, finish);
 
+       err = kmod_lookup_alias_from_symbols_file(ctx, alias, list);
+       CHECK_ERR_AND_FINISH(err, fail, list, finish);
 
 finish:
 
index 4abea7620ff54ca673756cdc8b3563f2d4ee1057..55626f2fd89ce3af2cf30180cb107362380d40e9 100644 (file)
@@ -56,6 +56,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);
+int kmod_lookup_alias_from_symbols_file(struct kmod_ctx *ctx, const char *name, struct kmod_list **list);
 
 /* libkmod-config.c */
 struct kmod_config {
index 3dea3b8f4961ff81f2f1642c5ae0264683ca7fae..b0c45f85858c5e2173abd7f0a5bc14a069574db2 100644 (file)
@@ -30,6 +30,7 @@
 
 #include "libkmod.h"
 #include "libkmod-private.h"
+#include "libkmod-index.h"
 
 /**
  * SECTION:libkmod
@@ -266,6 +267,52 @@ KMOD_EXPORT void kmod_set_log_priority(struct kmod_ctx *ctx, int priority)
        ctx->log_priority = priority;
 }
 
+
+static const char *symbols_file = "modules.symbols";
+
+int kmod_lookup_alias_from_symbols_file(struct kmod_ctx *ctx, const char *name,
+                                               struct kmod_list **list)
+{
+       char *fn;
+       int err;
+       struct index_file *index;
+       struct index_value *realnames, *realname;
+
+       if (!startswith(name, "symbol:"))
+               return 0;
+
+       if (asprintf(&fn, "%s/%s.bin", ctx->dirname, symbols_file) < 0)
+               return -ENOMEM;
+
+       DBG(ctx, "file=%s alias=%s", fn, name);
+
+       index = index_file_open(fn);
+       if (index == NULL) {
+               free(fn);
+               return -ENOSYS;
+       }
+
+       realnames = index_searchwild(index, name);
+       for (realname = realnames; realname; realname = realnames->next) {
+               struct kmod_module *mod;
+
+               err = kmod_module_new_from_name(ctx, realname->value, &mod);
+               if (err < 0) {
+                       ERR(ctx, "%s\n", strerror(-err));
+                       goto finish;
+               }
+
+               *list = kmod_list_append(*list, mod);
+       }
+
+finish:
+       index_values_free(realnames);
+       index_file_close(index);
+       free(fn);
+
+       return err;
+}
+
 int kmod_lookup_alias_from_config(struct kmod_ctx *ctx, const char *name,
                                                struct kmod_list **list)
 {