kmod_module: parse dependencies on demand
authorLucas De Marchi <lucas.demarchi@profusion.mobi>
Mon, 5 Dec 2011 22:23:05 +0000 (20:23 -0200)
committerLucas De Marchi <lucas.demarchi@profusion.mobi>
Tue, 6 Dec 2011 04:48:04 +0000 (02:48 -0200)
libkmod/libkmod-module.c
libkmod/libkmod-private.h
libkmod/libkmod.c

index a5c7ca3..74e8d22 100644 (file)
@@ -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));
index 69d52b7..5740fe2 100644 (file)
@@ -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;
index da1ea17..248203b 100644 (file)
@@ -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: