Lookup modules.symbols.bin
Test in my system:
./test/test-lookup symbol:sas_slave_destroy
libkmod version 0.1
Alias: 'symbol:sas_slave_destroy'
Modules matching:
libsas
diff --git a/libkmod/libkmod-module.c b/libkmod/libkmod-module.c
index 7450ee3..fdfcf45 100644
--- a/libkmod/libkmod-module.c
+++ b/libkmod/libkmod-module.c
@@ -180,6 +180,8 @@
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:
diff --git a/libkmod/libkmod-private.h b/libkmod/libkmod-private.h
index 4abea76..55626f2 100644
--- a/libkmod/libkmod-private.h
+++ b/libkmod/libkmod-private.h
@@ -56,6 +56,7 @@
/* 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 {
diff --git a/libkmod/libkmod.c b/libkmod/libkmod.c
index 3dea3b8..b0c45f8 100644
--- a/libkmod/libkmod.c
+++ b/libkmod/libkmod.c
@@ -30,6 +30,7 @@
#include "libkmod.h"
#include "libkmod-private.h"
+#include "libkmod-index.h"
/**
* SECTION:libkmod
@@ -266,6 +267,52 @@
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)
{