From: Lucas De Marchi Date: Wed, 30 Nov 2011 22:31:45 +0000 (-0200) Subject: Lookup modules.symbols.bin X-Git-Tag: v1~160 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9ba6f57b5b398fe81f33df825eaa03c642342c26;p=thirdparty%2Fkmod.git 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 7450ee3f..fdfcf45f 100644 --- a/libkmod/libkmod-module.c +++ b/libkmod/libkmod-module.c @@ -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: diff --git a/libkmod/libkmod-private.h b/libkmod/libkmod-private.h index 4abea762..55626f2f 100644 --- a/libkmod/libkmod-private.h +++ b/libkmod/libkmod-private.h @@ -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 { diff --git a/libkmod/libkmod.c b/libkmod/libkmod.c index 3dea3b8f..b0c45f85 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 @@ 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) {