]> git.ipfire.org Git - thirdparty/kmod.git/commitdiff
config: add exported iterator functions
authorLucas De Marchi <lucas.demarchi@profusion.mobi>
Fri, 13 Jan 2012 04:24:18 +0000 (02:24 -0200)
committerLucas De Marchi <lucas.demarchi@profusion.mobi>
Fri, 13 Jan 2012 13:12:41 +0000 (11:12 -0200)
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.

libkmod/libkmod-config.c
libkmod/libkmod.h
libkmod/libkmod.sym

index a5c6d114eb247f26dccc04405b2c6200618e7f27..a51fcbfa44246e33b148954e4b8543075e2f6d2b 100644 (file)
@@ -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);
+}
index 84bca6495c9108cf4216394a0cf5dbe914790625..edf3ad2cbae8261b9b80a4443420a80cf0b4b5b5 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <fcntl.h>
 #include <stdarg.h>
+#include <stdbool.h>
 #include <inttypes.h>
 
 #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,
index 316fcc25d638c5f1c433c0c275276e6980fbac38..500af4e2d23f468624b3118916bbfe2986f413e6 100644 (file)
@@ -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;