modprobe-small: make insmod command line compatible
authorDenis Vlasenko <vda.linux@googlemail.com>
Sat, 6 Sep 2008 14:14:01 +0000 (14:14 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sat, 6 Sep 2008 14:14:01 +0000 (14:14 -0000)
function                                             old     new   delta
modprobe_main                                        326     435    +109
moderror                                               -      52     +52
process_module                                       577     530     -47

modutils/modprobe-small.c
networking/libiproute/ll_proto.c

index 5e33cdc57d42247941c416b9930f34fe2bba7899..e2bf828b7a3800630b90d305c470099cd9e25385 100644 (file)
@@ -599,7 +599,7 @@ static void process_module(char *name, const char *cmdline_options)
        }
        free(deps);
 
-       /* insmod -> load it */
+       /* modprobe -> load it */
        if (!is_rmmod && !strstr(options, "blacklist")) {
                errno = 0;
                if (load_module(info->pathname, options) != 0) {
@@ -688,8 +688,10 @@ int modprobe_main(int argc UNUSED_PARAM, char **argv)
        /* Prevent ugly corner cases with no modules at all */
        modinfo = xzalloc(sizeof(modinfo[0]));
 
-       /* Goto modules directory */
-       xchdir(CONFIG_DEFAULT_MODULES_DIR);
+       if ('i' != applet0) { /* not insmod */
+               /* Goto modules directory */
+               xchdir(CONFIG_DEFAULT_MODULES_DIR);
+       }
        uname(&uts); /* never fails */
 
        /* depmod? */
@@ -736,8 +738,10 @@ int modprobe_main(int argc UNUSED_PARAM, char **argv)
                option_mask32 |= OPT_r;
        }
 
-       /* Goto $VERSION directory */
-       xchdir(uts.release);
+       if ('i' != applet0) { /* not insmod */
+               /* Goto $VERSION directory */
+               xchdir(uts.release);
+       }
 
 #if ENABLE_FEATURE_MODPROBE_SMALL_OPTIONS_ON_CMDLINE
        /* If not rmmod, parse possible module options given on command line.
@@ -758,11 +762,26 @@ int modprobe_main(int argc UNUSED_PARAM, char **argv)
                argv[1] = NULL;
 #endif
 
+       if ('i' == applet0) { /* insmod */
+               size_t len;
+               void *map;
+
+               len = MAXINT(ssize_t);
+               map = xmalloc_xopen_read_close(*argv, &len);
+               if (init_module(map, len,
+                       USE_FEATURE_MODPROBE_SMALL_OPTIONS_ON_CMDLINE(options ? options : "")
+                       SKIP_FEATURE_MODPROBE_SMALL_OPTIONS_ON_CMDLINE("")
+                               ) != 0)
+                       bb_error_msg_and_die("cannot insert '%s': %s",
+                                       *argv, moderror(errno));
+               return 0;
+       }
+
        /* Try to load modprobe.dep.bb */
        load_dep_bb();
 
        /* Load/remove modules.
-        * Only rmmod loops here, insmod/modprobe has only argv[0] */
+        * Only rmmod loops here, modprobe has only argv[0] */
        do {
                process_module(*argv++, options);
        } while (*argv);
index 0707fe08e9c065b2486351b28973ab8f4cfa5213..b8268732e6f9f046088e0fe403ceea24974b3ff4 100644 (file)
@@ -20,7 +20,9 @@
 #include <linux/if_ether.h>
 #endif
 
+#if !ENABLE_WERROR
 #warning de-bloat
+#endif
 /* Before re-enabling this, please (1) conditionalize exotic protocols
  * on CONFIG_something, and (2) decouple strings and numbers
  * (use llproto_ids[] = n,n,n..; and llproto_names[] = "loop\0" "pup\0" ...;)