diff --git a/Makefile.am b/Makefile.am index 5a689f4..f9fe0ae 100644 --- a/Makefile.am +++ b/Makefile.am @@ -110,7 +110,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 test/test-elf \ + test/test-blacklist test/test-elf test/test-probe \ $(check_PROGRAMS) test_test_rmmod_LDADD = libkmod/libkmod.la @@ -122,3 +122,4 @@ test_test_get_dependencies_LDADD = libkmod/libkmod.la test_test_mod_double_ref_LDADD = libkmod/libkmod.la test_test_blacklist_LDADD = libkmod/libkmod.la test_test_elf_LDADD = libkmod/libkmod.la +test_test_probe_LDADD = libkmod/libkmod.la diff --git a/test/.gitignore b/test/.gitignore index 3118b91..2b51bce 100644 --- a/test/.gitignore +++ b/test/.gitignore @@ -10,3 +10,4 @@ test-get-dependencies test-mod-double-ref test-blacklist test-elf +test-probe diff --git a/test/test-probe.c b/test/test-probe.c new file mode 100644 index 0000000..c68a783 --- /dev/null +++ b/test/test-probe.c @@ -0,0 +1,118 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static const char cmdoptions_short[] = "lh"; +static const struct option cmdoptions[] = { + {"load-resources", no_argument, 0, 'l'}, + {"help", no_argument, 0, 'h'}, + {NULL, 0, 0, 0} +}; + +static void help(const char *progname) +{ + const struct option *itr_opt; + const char *itr_short; + printf("Usage:\n" + "\t%s [options] [ module_options ]\n" + "Options:\n", + progname); + for (itr_opt = cmdoptions, itr_short = cmdoptions_short; + itr_opt->name != NULL; itr_opt++, itr_short++) + printf("\t-%c, --%s\n", *itr_short, itr_opt->name); +} + +int main(int argc, char *argv[]) +{ + const char *alias; + const char *opt; + struct kmod_ctx *ctx; + struct kmod_list *list = NULL, *l; + int load_resources = 0; + int err; + + printf("libkmod version %s\n", VERSION); + + for (;;) { + int c, idx = 0; + c = getopt_long(argc, argv, cmdoptions_short, cmdoptions, &idx); + if (c == -1) + break; + switch (c) { + case 'l': + load_resources = 1; + break; + case 'h': + help(argv[0]); + return 0; + case '?': + return -1; + default: + fprintf(stderr, + "ERR: unexpected getopt_long() value %c\n", c); + return -1; + } + } + + if (optind >= argc) { + fprintf(stderr, "ERR: Provide an alias name\n"); + return EXIT_FAILURE; + } + + alias = argv[optind++]; + + if (optind < argc) + opt = argv[optind]; + else + opt = NULL; + + ctx = kmod_new(NULL, NULL); + if (ctx == NULL) { + kmod_unref(ctx); + exit(EXIT_FAILURE); + } + + if (load_resources) { + err = kmod_load_resources(ctx); + if (err < 0) { + printf("Could not load resources: %s\n", + strerror(-err)); + kmod_unref(ctx); + exit(EXIT_FAILURE); + } + } + + err = kmod_module_new_from_lookup(ctx, alias, &list); + if (err < 0) + exit(EXIT_FAILURE); + + 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", kmod_module_get_name(mod)); + + err = kmod_module_probe_insert_module(mod, 0, opt, NULL, NULL); + if (err >=0 ) + printf(": inserted ok\n"); + else + printf(": failed to insert\n"); + + kmod_module_unref(mod); + } + + kmod_module_unref_list(list); + kmod_unref(ctx); + + return EXIT_SUCCESS; +}