modprobe-small: make insmod command line compatible
No binary (build failed)
—
(log yok)
| @@ -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); | |
| @@ -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" ...;) | |