From 3805274bf5e1e0acbd072ac7d523db8c8057130c Mon Sep 17 00:00:00 2001 From: Lucas De Marchi Date: Thu, 16 Feb 2012 20:43:16 -0200 Subject: [PATCH] kmod-module: lookup: search modules.builtin file too Search modules.builtin file before saying the module was not found. Note: these "modules" should not appear as dependencies of other modules (in modules.dep) even if they appear in modinfo. This fixes the return code of modprobe with builtin modules. Also fixes a small coding style issue in module_is_inkernel(). --- diff --git a/libkmod/libkmod-module.c b/libkmod/libkmod-module.c index 835896f..4226bbb 100644 --- a/libkmod/libkmod-module.c +++ b/libkmod/libkmod-module.c @@ -80,6 +80,13 @@ struct kmod_module { * whether the module's command and softdep should be ignored */ bool ignorecmd : 1; + + /* + * if module was created by searching the modules.builtin file, this + * is set. There's nothing much useful one can do with such a + * "module", except knowing it's builtin. + */ + bool builtin : 1; }; static inline const char *path_join(const char *path, size_t prefixlen, @@ -101,12 +108,13 @@ static inline const char *path_join(const char *path, size_t prefixlen, static inline bool module_is_inkernel(struct kmod_module *mod) { int state = kmod_module_get_initstate(mod); + if (state == KMOD_MODULE_LIVE || state == KMOD_MODULE_COMING || state == KMOD_MODULE_BUILTIN) return true; - else - return false; + + return false; } int kmod_module_parse_depline(struct kmod_module *mod, char *line) @@ -191,6 +199,11 @@ void kmod_module_set_visited(struct kmod_module *mod, bool visited) mod->visited = visited; } +void kmod_module_set_builtin(struct kmod_module *mod, bool builtin) +{ + mod->builtin = builtin; +} + /* * Memory layout with alias: * @@ -526,6 +539,10 @@ KMOD_EXPORT int kmod_module_new_from_lookup(struct kmod_ctx *ctx, err = kmod_lookup_alias_from_aliases_file(ctx, alias, list); CHECK_ERR_AND_FINISH(err, fail, list, finish); + DBG(ctx, "lookup modules.builtin %s\n", alias); + err = kmod_lookup_alias_from_builtin_file(ctx, alias, list); + CHECK_ERR_AND_FINISH(err, fail, list, finish); + finish: DBG(ctx, "lookup %s=%d, list=%p\n", alias, err, *list); return err; @@ -1593,6 +1610,9 @@ KMOD_EXPORT int kmod_module_get_initstate(const struct kmod_module *mod) if (mod == NULL) return -ENOENT; + if (mod->builtin) + return KMOD_MODULE_BUILTIN; + pathlen = snprintf(path, sizeof(path), "/sys/module/%s/initstate", mod->name); fd = open(path, O_RDONLY|O_CLOEXEC); diff --git a/libkmod/libkmod-private.h b/libkmod/libkmod-private.h index 0ee37d4..ebda945 100644 --- a/libkmod/libkmod-private.h +++ b/libkmod/libkmod-private.h @@ -81,6 +81,7 @@ int kmod_lookup_alias_from_config(struct kmod_ctx *ctx, const char *name, struct int kmod_lookup_alias_from_symbols_file(struct kmod_ctx *ctx, const char *name, struct kmod_list **list) __attribute__((nonnull(1, 2, 3))); int kmod_lookup_alias_from_aliases_file(struct kmod_ctx *ctx, const char *name, struct kmod_list **list) __attribute__((nonnull(1, 2, 3))); int kmod_lookup_alias_from_moddep_file(struct kmod_ctx *ctx, const char *name, struct kmod_list **list) __attribute__((nonnull(1, 2, 3))); +int kmod_lookup_alias_from_builtin_file(struct kmod_ctx *ctx, const char *name, struct kmod_list **list) __attribute__((nonnull(1, 2, 3))); int kmod_lookup_alias_from_commands(struct kmod_ctx *ctx, const char *name, struct kmod_list **list) __attribute__((nonnull(1, 2, 3))); void kmod_set_modules_visited(struct kmod_ctx *ctx, bool visited) __attribute__((nonnull((1)))); @@ -137,6 +138,7 @@ int kmod_module_parse_depline(struct kmod_module *mod, char *line) __attribute__ void kmod_module_set_install_commands(struct kmod_module *mod, const char *cmd) __attribute__((nonnull(1))); void kmod_module_set_remove_commands(struct kmod_module *mod, const char *cmd) __attribute__((nonnull(1))); void kmod_module_set_visited(struct kmod_module *mod, bool visited) __attribute__((nonnull(1))); +void kmod_module_set_builtin(struct kmod_module *mod, bool builtin) __attribute__((nonnull((1)))); /* libkmod-hash.c */ diff --git a/libkmod/libkmod.c b/libkmod/libkmod.c index 4990d3e..36af201 100644 --- a/libkmod/libkmod.c +++ b/libkmod/libkmod.c @@ -37,7 +37,7 @@ #define KMOD_HASH_SIZE (256) #define KMOD_LRU_MAX (128) -#define _KMOD_INDEX_MODULES_SIZE KMOD_INDEX_MODULES_SYMBOL + 1 +#define _KMOD_INDEX_MODULES_SIZE KMOD_INDEX_MODULES_BUILTIN + 1 /** * SECTION:libkmod @@ -54,6 +54,7 @@ static struct _index_files { [KMOD_INDEX_MODULES_DEP] = { .fn = "modules.dep", .prefix = "" }, [KMOD_INDEX_MODULES_ALIAS] = { .fn = "modules.alias", .prefix = "alias " }, [KMOD_INDEX_MODULES_SYMBOL] = { .fn = "modules.symbols", .prefix = "alias "}, + [KMOD_INDEX_MODULES_BUILTIN] = { .fn = "modules.builtin", .prefix = ""}, }; static const char *default_config_paths[] = { @@ -476,6 +477,24 @@ int kmod_lookup_alias_from_aliases_file(struct kmod_ctx *ctx, const char *name, name, list); } +int kmod_lookup_alias_from_builtin_file(struct kmod_ctx *ctx, const char *name, + struct kmod_list **list) +{ + const struct kmod_list *l; + + int err = kmod_lookup_alias_from_alias_bin(ctx, + KMOD_INDEX_MODULES_BUILTIN, name, list); + if (err < 0) + return err; + + kmod_list_foreach(l, *list) { + struct kmod_module *m = l->data; + kmod_module_set_builtin(m, true); + } + + return err; +} + char *kmod_search_moddep(struct kmod_ctx *ctx, const char *name) { struct index_file *idx; diff --git a/libkmod/libkmod.h b/libkmod/libkmod.h index 6992e77..424640a 100644 --- a/libkmod/libkmod.h +++ b/libkmod/libkmod.h @@ -69,6 +69,7 @@ enum kmod_index { KMOD_INDEX_MODULES_DEP = 0, KMOD_INDEX_MODULES_ALIAS, KMOD_INDEX_MODULES_SYMBOL, + KMOD_INDEX_MODULES_BUILTIN, /* Padding to make sure enum is not mapped to char */ _KMOD_INDEX_PAD = (1 << 31), };