From: Lucas De Marchi Date: Fri, 13 Jan 2012 04:24:18 +0000 (-0200) Subject: config: add exported iterator functions X-Git-Tag: v4~17 X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fkmod.git;a=commitdiff_plain;h=0017862911984aac14794d0a84872dcb103e5a93 config: add exported iterator functions Config iterators are useful to get each configuration list, remember its type and how to get their key/value pair. softdeps don't have the value yet, because they are stored as string vectors. --- diff --git a/libkmod/libkmod-config.c b/libkmod/libkmod-config.c index a5c6d11..a51fcbf 100644 --- a/libkmod/libkmod-config.c +++ b/libkmod/libkmod-config.c @@ -841,3 +841,155 @@ oom: return -ENOMEM; } + +/********************************************************************** + * struct kmod_config_iter functions + **********************************************************************/ + +enum config_type { + CONFIG_TYPE_BLACKLIST = 0, + CONFIG_TYPE_INSTALL, + CONFIG_TYPE_REMOVE, + CONFIG_TYPE_ALIAS, + CONFIG_TYPE_OPTION, + CONFIG_TYPE_SOFTDEP, +}; + +struct kmod_config_iter { + enum config_type type; + const struct kmod_list *list; + const struct kmod_list *curr; + const char *(*get_key)(const struct kmod_list *l); + const char *(*get_value)(const struct kmod_list *l); +}; + +static struct kmod_config_iter *kmod_config_iter_new(const struct kmod_ctx* ctx, + enum config_type type) +{ + struct kmod_config_iter *iter = calloc(1, sizeof(*iter)); + + if (iter == NULL) + return NULL; + + iter->type = type; + + switch (type) { + case CONFIG_TYPE_BLACKLIST: + iter->list = kmod_get_blacklists(ctx); + iter->get_key = kmod_blacklist_get_modname; + break; + case CONFIG_TYPE_INSTALL: + iter->list = kmod_get_install_commands(ctx); + iter->get_key = kmod_command_get_modname; + iter->get_value = kmod_command_get_command; + break; + case CONFIG_TYPE_REMOVE: + iter->list = kmod_get_remove_commands(ctx); + iter->get_key = kmod_command_get_modname; + iter->get_value = kmod_command_get_command; + break; + case CONFIG_TYPE_ALIAS: + iter->list = kmod_get_aliases(ctx); + iter->get_key = kmod_alias_get_name; + iter->get_value = kmod_alias_get_modname; + break; + case CONFIG_TYPE_OPTION: + iter->list = kmod_get_options(ctx); + iter->get_key = kmod_option_get_modname; + iter->get_value = kmod_option_get_options; + break; + case CONFIG_TYPE_SOFTDEP: + iter->list = kmod_get_softdeps(ctx); + iter->get_key = kmod_softdep_get_name; + break; + } + + return iter; +} + +KMOD_EXPORT struct kmod_config_iter *kmod_config_get_blacklists(const struct kmod_ctx *ctx) +{ + if (ctx == NULL) + return NULL;; + + return kmod_config_iter_new(ctx, CONFIG_TYPE_BLACKLIST); +} + +KMOD_EXPORT struct kmod_config_iter *kmod_config_get_install_commands(const struct kmod_ctx *ctx) +{ + if (ctx == NULL) + return NULL;; + + return kmod_config_iter_new(ctx, CONFIG_TYPE_INSTALL); +} + +KMOD_EXPORT struct kmod_config_iter *kmod_config_get_remove_commands(const struct kmod_ctx *ctx) +{ + if (ctx == NULL) + return NULL;; + + return kmod_config_iter_new(ctx, CONFIG_TYPE_REMOVE); +} + +KMOD_EXPORT struct kmod_config_iter *kmod_config_get_aliases(const struct kmod_ctx *ctx) +{ + if (ctx == NULL) + return NULL;; + + return kmod_config_iter_new(ctx, CONFIG_TYPE_ALIAS); +} + +KMOD_EXPORT struct kmod_config_iter *kmod_config_get_options(const struct kmod_ctx *ctx) +{ + if (ctx == NULL) + return NULL;; + + return kmod_config_iter_new(ctx, CONFIG_TYPE_OPTION); +} + +KMOD_EXPORT struct kmod_config_iter *kmod_config_get_softdeps(const struct kmod_ctx *ctx) +{ + if (ctx == NULL) + return NULL;; + + return kmod_config_iter_new(ctx, CONFIG_TYPE_SOFTDEP); +} + +KMOD_EXPORT const char *kmod_config_iter_get_key(const struct kmod_config_iter *iter) +{ + if (iter == NULL || iter->curr == NULL) + return NULL; + + return iter->get_key(iter->curr); +} + +KMOD_EXPORT const char *kmod_config_iter_get_value(const struct kmod_config_iter *iter) +{ + if (iter == NULL || iter->curr == NULL) + return NULL; + + if (iter->get_value == NULL) + return NULL; + + return iter->get_value(iter->curr); +} + +KMOD_EXPORT bool kmod_config_iter_next(struct kmod_config_iter *iter) +{ + if (iter == NULL) + return false; + + if (iter->curr == NULL) { + iter->curr = iter->list; + return iter->curr != NULL; + } + + iter->curr = kmod_list_next(iter->list, iter->curr); + + return iter->curr != NULL; +} + +KMOD_EXPORT void kmod_config_iter_free_iter(struct kmod_config_iter *iter) +{ + free(iter); +} diff --git a/libkmod/libkmod.h b/libkmod/libkmod.h index 84bca64..edf3ad2 100644 --- a/libkmod/libkmod.h +++ b/libkmod/libkmod.h @@ -23,6 +23,7 @@ #include #include +#include #include #ifdef __cplusplus @@ -82,6 +83,24 @@ struct kmod_list *kmod_list_last(const struct kmod_list *list); list_entry != NULL; \ list_entry = kmod_list_prev(first_entry, list_entry)) +/* + * kmod_config_iter + * + * access to configuration lists - it allows to get each configuration's + * key/value stored by kmod + */ +struct kmod_config_iter; +struct kmod_config_iter *kmod_config_get_blacklists(const struct kmod_ctx *ctx); +struct kmod_config_iter *kmod_config_get_install_commands(const struct kmod_ctx *ctx); +struct kmod_config_iter *kmod_config_get_remove_commands(const struct kmod_ctx *ctx); +struct kmod_config_iter *kmod_config_get_aliases(const struct kmod_ctx *ctx); +struct kmod_config_iter *kmod_config_get_options(const struct kmod_ctx *ctx); +struct kmod_config_iter *kmod_config_get_softdeps(const struct kmod_ctx *ctx); +const char *kmod_config_iter_get_key(const struct kmod_config_iter *iter); +const char *kmod_config_iter_get_value(const struct kmod_config_iter *iter); +bool kmod_config_iter_next(struct kmod_config_iter *iter); +void kmod_config_iter_free_iter(struct kmod_config_iter *iter); + /* Removal flags */ enum kmod_remove { KMOD_REMOVE_FORCE = O_TRUNC, diff --git a/libkmod/libkmod.sym b/libkmod/libkmod.sym index 316fcc2..500af4e 100644 --- a/libkmod/libkmod.sym +++ b/libkmod/libkmod.sym @@ -81,3 +81,17 @@ global: kmod_module_probe_insert_module; } LIBKMOD_2; + +LIBKMOD_4 { +global: + kmod_config_get_blacklists; + kmod_config_get_install_commands; + kmod_config_get_remove_commands; + kmod_config_get_aliases; + kmod_config_get_options; + kmod_config_get_softdeps; + kmod_config_iter_get_key; + kmod_config_iter_get_value; + kmod_config_iter_next; + kmod_config_iter_free_iter; +} LIBKMOD_3;