[OpenWrt-Devel] [PATCH] kmodloader: added -v and -a args to modeprobe
Gerard Ryan
g.m0n3y.2503 at gmail.com
Sun Oct 13 00:03:15 EDT 2019
This is primarily to satiate the usage by docker/libnetwork.
Behaviour mirrors /tools/modprobe.c from https://git.kernel.org
Signed-off-by: Gerard Ryan <G.M0N3Y.2503 at gmail.com>
---
Compile tested: x86_x64, Hyper-V, OpenWrt Master
Run tested: x86_x64, Hyper-V, OpenWrt Master
You can also find this patch on GitHub if you prefer.
https://github.com/G-M0N3Y-2503/openwrt-ubox-mirror/tree/feature_extend_modprobe_options
kmodloader.c | 76 +++++++++++++++++++++++++++++++---------------------
1 file changed, 46 insertions(+), 30 deletions(-)
diff --git a/kmodloader.c b/kmodloader.c
index 422c895..a437509 100644
--- a/kmodloader.c
+++ b/kmodloader.c
@@ -678,7 +678,9 @@ static int print_insmod_usage(void)
static int print_modprobe_usage(void)
{
- ULOG_INFO("Usage:\n\tmodprobe [-q] filename\n");
+ ULOG_INFO("Usage:\n"
+ "\tmodprobe [-q] [-v] filename\n"
+ "\tmodprobe -a [-q] [-v] filename [filename...]\n");
return -1;
}
@@ -851,18 +853,26 @@ static int main_modinfo(int argc, char **argv)
static int main_modprobe(int argc, char **argv)
{
+ int exit_code = EXIT_SUCCESS;
struct module_node *mn;
struct module *m;
- char *name;
- char *mod = NULL;
+ int load_fail;
+ int log_level = LOG_WARNING;
int opt;
bool quiet = false;
+ bool use_all = false;
- while ((opt = getopt(argc, argv, "q")) != -1 ) {
+ while ((opt = getopt(argc, argv, "aqv")) != -1 ) {
switch (opt) {
+ case 'a':
+ use_all = true;
+ break;
case 'q': /* shhhh! */
quiet = true;
break;
+ case 'v':
+ log_level = LOG_DEBUG;
+ break;
default: /* '?' */
return print_modprobe_usage();
break;
@@ -872,7 +882,8 @@ static int main_modprobe(int argc, char **argv)
if (optind >= argc)
return print_modprobe_usage(); /* expected module after options */
- mod = argv[optind];
+ /* after print_modprobe_usage() so it won't be filtered out */
+ ulog_threshold(log_level);
if (scan_module_folders())
return -1;
@@ -880,40 +891,45 @@ static int main_modprobe(int argc, char **argv)
if (scan_loaded_modules())
return -1;
- name = get_module_name(mod);
- m = find_module(name);
- if (m && m->state == LOADED) {
- if (!quiet)
- ULOG_ERR("%s is already loaded\n", name);
- return 0;
- } else if (!m) {
- if (!quiet)
- ULOG_ERR("failed to find a module named %s\n", name);
- return -1;
- } else {
- int fail;
+ do {
+ char *name;
- m->state = PROBE;
+ name = get_module_name(argv[optind]);
+ m = find_module(name);
- fail = load_modprobe(true);
+ if (m && m->state == LOADED) {
+ if (!quiet)
+ ULOG_INFO("%s is already loaded\n", name);
+ } else if (!m) {
+ if (!quiet)
+ ULOG_ERR("failed to find a module named %s\n", name);
+ exit_code = EXIT_FAILURE;
+ } else {
+ m->state = PROBE;
+ }
- if (fail) {
- ULOG_ERR("%d module%s could not be probed\n",
- fail, (fail == 1) ? ("") : ("s"));
+ optind++;
+ } while (use_all && optind < argc);
- avl_for_each_element(&modules, mn, avl) {
- if (mn->is_alias)
- continue;
- m = mn->m;
- if ((m->state == PROBE) || m->error)
- ULOG_ERR("- %s\n", m->name);
- }
+ load_fail = load_modprobe(true);
+ if (load_fail) {
+ ULOG_ERR("%d module%s could not be probed\n",
+ load_fail, (load_fail == 1) ? ("") : ("s"));
+
+ avl_for_each_element(&modules, mn, avl) {
+ if (mn->is_alias)
+ continue;
+ m = mn->m;
+ if ((m->state == PROBE) || m->error)
+ ULOG_ERR("- %s\n", m->name);
}
+
+ exit_code = EXIT_FAILURE;
}
free_modules();
- return 0;
+ return exit_code;
}
static int main_loader(int argc, char **argv)
--
2.17.1
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel
More information about the openwrt-devel
mailing list