From: Lucas De Marchi Date: Mon, 5 Dec 2011 22:23:05 +0000 (-0200) Subject: kmod_module: parse dependencies on demand X-Git-Tag: v1~93 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=671d489424df4b8b982a91b9d16badd338df0f0b;p=thirdparty%2Fkmod.git kmod_module: parse dependencies on demand --- diff --git a/libkmod/libkmod-module.c b/libkmod/libkmod-module.c index a5c7ca34..74e8d22a 100644 --- a/libkmod/libkmod-module.c +++ b/libkmod/libkmod-module.c @@ -82,7 +82,7 @@ static char *path_to_modname(const char *path, char buf[NAME_MAX], size_t *len) return modname; } -int kmod_module_parse_dep(struct kmod_module *mod, char *line) +int kmod_module_parse_depline(struct kmod_module *mod, char *line) { struct kmod_ctx *ctx = mod->ctx; struct kmod_list *list = NULL; @@ -96,6 +96,10 @@ int kmod_module_parse_dep(struct kmod_module *mod, char *line) if (p == NULL) return 0; + *p = '\0'; + if (mod->path == NULL) + mod->path = strdup(line); + p++; for (p = strtok_r(p, " \t", &saveptr); p != NULL; @@ -276,14 +280,24 @@ KMOD_EXPORT int kmod_module_unref_list(struct kmod_list *list) KMOD_EXPORT struct kmod_list *kmod_module_get_dependencies(const struct kmod_module *mod) { - /* TODO: populate dependencies on demand */ struct kmod_list *l, *l_new, *list_new = NULL; if (mod == NULL) return NULL; - if (!mod->init.dep) - return NULL; + if (!mod->init.dep) { + /* lazy init */ + char *line = kmod_search_moddep(mod->ctx, mod->name); + + if (line == NULL) + return NULL; + + kmod_module_parse_depline((struct kmod_module *)mod, line); + free(line); + + if (!mod->init.dep) + return NULL; + } kmod_list_foreach(l, mod->dep) { l_new = kmod_list_append(list_new, kmod_module_ref(l->data)); diff --git a/libkmod/libkmod-private.h b/libkmod/libkmod-private.h index 69d52b7c..5740fe2a 100644 --- a/libkmod/libkmod-private.h +++ b/libkmod/libkmod-private.h @@ -66,6 +66,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))); +char *kmod_search_moddep(struct kmod_ctx *ctx, const char *name) __attribute__((nonnull(1,2))); /* libkmod-config.c */ struct kmod_config { @@ -79,7 +80,7 @@ const char *kmod_alias_get_name(const struct kmod_list *l) __attribute__((nonnul const char *kmod_alias_get_modname(const struct kmod_list *l) __attribute__((nonnull(1))); /* libkmod-module.c */ -int kmod_module_parse_dep(struct kmod_module *mod, char *line) __attribute__((nonnull(1, 2))); +int kmod_module_parse_depline(struct kmod_module *mod, char *line) __attribute__((nonnull(1, 2))); /* libkmod-hash.c */ struct kmod_hash; diff --git a/libkmod/libkmod.c b/libkmod/libkmod.c index da1ea17f..248203b3 100644 --- a/libkmod/libkmod.c +++ b/libkmod/libkmod.c @@ -346,7 +346,7 @@ int kmod_lookup_alias_from_aliases_file(struct kmod_ctx *ctx, const char *name, static const char *moddep_file = "modules.dep"; -static char *search_moddep(struct kmod_ctx *ctx, const char *name) +char *kmod_search_moddep(struct kmod_ctx *ctx, const char *name) { struct index_file *idx; char fn[PATH_MAX]; @@ -381,7 +381,7 @@ int kmod_lookup_alias_from_moddep_file(struct kmod_ctx *ctx, const char *name, if (strchr(name, ':')) return 0; - line = search_moddep(ctx, name); + line = kmod_search_moddep(ctx, name); if (line != NULL) { struct kmod_module *mod; @@ -392,7 +392,7 @@ int kmod_lookup_alias_from_moddep_file(struct kmod_ctx *ctx, const char *name, } *list = kmod_list_append(*list, mod); - kmod_module_parse_dep(mod, line); + kmod_module_parse_depline(mod, line); } finish: