-a treats all non-op trailing arguments as module names
and attempts to load all of them. This behaviour mirrors the behaviour
of the respective -a in /tools/modprobe.c from https://git.kernel.org.

This is primarily to satiate the multiple modules passed by
docker/libnetwork.

Signed-off-by: Gerard Ryan <g.m0n3y.2...@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

Since https://patchwork.ozlabs.org/patch/1175792/ I adjusted some whitespace to 
indent more consistently and split the patch by the args they implement.
Since https://patchwork.ozlabs.org/patch/1179955/ I reworded the commit message 
to explain the functionality of -a

 kmodloader.c | 68 +++++++++++++++++++++++++++++-----------------------
 1 file changed, 38 insertions(+), 30 deletions(-)

diff --git a/kmodloader.c b/kmodloader.c
index 07b6700..838bc8c 100644
--- a/kmodloader.c
+++ b/kmodloader.c
@@ -681,6 +681,7 @@ static int print_modprobe_usage(void)
        ULOG_INFO(
                "Usage:\n"
                "\tmodprobe [-q] [-v] filename\n"
+               "\tmodprobe -a [-q] [-v] filename [filename...]\n"
        );

        return -1;
@@ -854,16 +855,20 @@ 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, "qv")) != -1 ) {
+       while ((opt = getopt(argc, argv, "aqv")) != -1 ) {
                switch (opt) {
+                       case 'a':
+                               use_all = true;
+                               break;
                        case 'q': /* shhhh! */
                                quiet = true;
                                break;
@@ -882,48 +887,51 @@ static int main_modprobe(int argc, char **argv)
        /* after print_modprobe_usage() so it won't be filtered out */
        ulog_threshold(log_level);

-       mod = argv[optind];
-
        if (scan_module_folders())
                return -1;

        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@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to