From ece09aac7f516549c6f14b7af68cd9c24d709b68 Mon Sep 17 00:00:00 2001 From: Lucas De Marchi Date: Wed, 18 Jan 2012 01:26:44 -0200 Subject: [PATCH] libkmod-module: add visited field This field can be used to iterate the modules, controlling whether we are revisiting a certain module. A function to clear the values in all modules is needed since when we are iterating, we don't know if the module is created anew or if it's picked from the pool. Therefore we can't know if the field is true because of a previous iteration or if the module was indeed already visited. --- libkmod/libkmod-module.c | 6 ++++++ libkmod/libkmod-private.h | 2 ++ libkmod/libkmod.c | 10 ++++++++++ 3 files changed, 18 insertions(+) diff --git a/libkmod/libkmod-module.c b/libkmod/libkmod-module.c index 983deef1..e4adcc64 100644 --- a/libkmod/libkmod-module.c +++ b/libkmod/libkmod-module.c @@ -68,6 +68,7 @@ struct kmod_module { bool install_commands : 1; bool remove_commands : 1; } init; + bool visited : 1; }; static inline const char *path_join(const char *path, size_t prefixlen, @@ -163,6 +164,11 @@ fail: return err; } +void kmod_module_set_visited(struct kmod_module *mod, bool visited) +{ + mod->visited = visited; +} + /** * kmod_module_new_from_name: * @ctx: kmod library context diff --git a/libkmod/libkmod-private.h b/libkmod/libkmod-private.h index 274cb1d0..0ee37d49 100644 --- a/libkmod/libkmod-private.h +++ b/libkmod/libkmod-private.h @@ -82,6 +82,7 @@ int kmod_lookup_alias_from_symbols_file(struct kmod_ctx *ctx, const char *name, 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_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)))); char *kmod_search_moddep(struct kmod_ctx *ctx, const char *name) __attribute__((nonnull(1,2))); @@ -135,6 +136,7 @@ int kmod_module_new_from_alias(struct kmod_ctx *ctx, const char *alias, const ch int kmod_module_parse_depline(struct kmod_module *mod, char *line) __attribute__((nonnull(1, 2))); 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))); /* libkmod-hash.c */ diff --git a/libkmod/libkmod.c b/libkmod/libkmod.c index 5edd594e..d5bcab1a 100644 --- a/libkmod/libkmod.c +++ b/libkmod/libkmod.c @@ -613,6 +613,16 @@ int kmod_lookup_alias_from_commands(struct kmod_ctx *ctx, const char *name, return nmatch; } +void kmod_set_modules_visited(struct kmod_ctx *ctx, bool visited) +{ + struct hash_iter iter; + const void *v; + + hash_iter_init(ctx->modules_by_name, &iter); + while (hash_iter_next(&iter, NULL, &v)) + kmod_module_set_visited((struct kmod_module *)v, visited); +} + static bool is_cache_invalid(const char *path, unsigned long long stamp) { struct stat st; -- 2.47.2