From: Gustavo Sverzut Barbieri Date: Thu, 8 Dec 2011 07:17:43 +0000 (-0200) Subject: add kmod_module_get_filtered_blacklist() X-Git-Tag: v1~68 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1487a64ffa39cc9fdbac990e6e64658f21d67f16;p=thirdparty%2Fkmod.git add kmod_module_get_filtered_blacklist() This function will filter the given list against the known blacklist, returning a new list with remaining modules with the reference incremented. --- diff --git a/Makefile.am b/Makefile.am index da91e5c7..b6ba9d83 100644 --- a/Makefile.am +++ b/Makefile.am @@ -60,6 +60,7 @@ test_test_loaded_LDADD = libkmod/libkmod.la noinst_PROGRAMS = test/test-insmod test/test-rmmod test/test-rmmod2 \ test/test-lookup test/test-path-from-name \ test/test-get-dependencies test/test-mod-double-ref \ + test/test-blacklist \ $(check_PROGRAMS) test_test_rmmod_SOURCES = test/test-rmmod.c @@ -82,3 +83,6 @@ test_test_get_dependencies_LDADD = libkmod/libkmod.la test_test_mod_double_ref_SOURCES = test/test-mod-double-ref.c test_test_mod_double_ref_LDADD = libkmod/libkmod.la + +test_test_blacklist_SOURCES = test/test-blacklist.c +test_test_blacklist_LDADD = libkmod/libkmod.la diff --git a/libkmod/libkmod.c b/libkmod/libkmod.c index fa1fdbbb..20418e02 100644 --- a/libkmod/libkmod.c +++ b/libkmod/libkmod.c @@ -476,3 +476,46 @@ fail: *list = kmod_list_remove_n_latest(*list, nmatch); return err; } + + +KMOD_EXPORT int kmod_module_get_filtered_blacklist(const struct kmod_ctx *ctx, const struct kmod_list *input, struct kmod_list **output) +{ + const struct kmod_config *config; + const struct kmod_list *li; + + if (ctx == NULL || output == NULL) + return -ENOENT; + + *output = NULL; + if (input == NULL) + return 0; + + config = ctx->config; + kmod_list_foreach(li, input) { + struct kmod_module *mod = li->data; + const struct kmod_list *lb; + struct kmod_list *node; + bool filtered = false; + kmod_list_foreach(lb, config->blacklists) { + const char *name = lb->data; + if (streq(name, kmod_module_get_name(mod))) { + filtered = true; + break; + } + } + if (filtered) + continue; + + node = kmod_list_append(*output, mod); + if (node == NULL) + goto fail; + *output = node; + kmod_module_ref(mod); + } + return 0; + +fail: + kmod_module_unref_list(*output); + *output = NULL; + return -ENOMEM; +} diff --git a/libkmod/libkmod.h b/libkmod/libkmod.h index 81fa5a45..72f74d03 100644 --- a/libkmod/libkmod.h +++ b/libkmod/libkmod.h @@ -96,6 +96,8 @@ int kmod_module_unref_list(struct kmod_list *list); struct kmod_module *kmod_module_get_module(const struct kmod_list *entry); struct kmod_list *kmod_module_get_dependencies(const struct kmod_module *mod); +int kmod_module_get_filtered_blacklist(const struct kmod_ctx *ctx, const struct kmod_list *input, struct kmod_list **output); + int kmod_module_remove_module(struct kmod_module *mod, unsigned int flags); int kmod_module_insert_module(struct kmod_module *mod, unsigned int flags); diff --git a/libkmod/libkmod.sym b/libkmod/libkmod.sym index ec3f8544..1b46c918 100644 --- a/libkmod/libkmod.sym +++ b/libkmod/libkmod.sym @@ -25,6 +25,8 @@ global: kmod_module_get_dependencies; kmod_module_get_module; + kmod_module_get_filtered_blacklist; + kmod_module_get_name; kmod_module_get_path; diff --git a/test/.gitignore b/test/.gitignore index c22a7212..0722c91e 100644 --- a/test/.gitignore +++ b/test/.gitignore @@ -8,3 +8,4 @@ test-lookup test-path-from-name test-get-dependencies test-mod-double-ref +test-blacklist diff --git a/test/test-blacklist.c b/test/test-blacklist.c new file mode 100644 index 00000000..515bfb87 --- /dev/null +++ b/test/test-blacklist.c @@ -0,0 +1,76 @@ +#include +#include +#include +#include +#include +#include +#include +#include + + +int main(int argc, char *argv[]) +{ + const char *alias; + struct kmod_ctx *ctx; + struct kmod_list *list = NULL, *l; + int err; + + printf("libkmod version %s\n", VERSION); + + if (argc < 2) { + fprintf(stderr, "ERR: Provide an alias name\n"); + return EXIT_FAILURE; + } + + alias = argv[1]; + + ctx = kmod_new(NULL); + if (ctx == NULL) + exit(EXIT_FAILURE); + + err = kmod_module_new_from_lookup(ctx, alias, &list); + if (err < 0) + goto fail_lookup; + + if (list == NULL) + printf("No module matches '%s'\n", alias); + else + printf("Alias: '%s'\nModules matching:\n", alias); + + kmod_list_foreach(l, list) { + struct kmod_module *mod = kmod_module_get_module(l); + printf("\t%s\n", kmod_module_get_name(mod)); + kmod_module_unref(mod); + } + + if (list != NULL) { + struct kmod_list *filtered; + err = kmod_module_get_filtered_blacklist(ctx, list, &filtered); + if (err < 0) { + printf("Could not filter: %s\n", strerror(-err)); + goto fail; + } + if (filtered == NULL) + printf("All modules were filtered out!\n"); + else + printf("Modules remaining after filter:\n"); + + kmod_list_foreach(l, filtered) { + struct kmod_module *mod = kmod_module_get_module(l); + printf("\t%s\n", kmod_module_get_name(mod)); + kmod_module_unref(mod); + } + kmod_module_unref_list(filtered); + } + + kmod_module_unref_list(list); + kmod_unref(ctx); + + return EXIT_SUCCESS; + +fail: + kmod_module_unref_list(list); +fail_lookup: + kmod_unref(ctx); + return EXIT_FAILURE; +}