modprobe-small: make insmod command line compatible

function                                             old     new   delta
modprobe_main                                        326     435    +109
moderror                                               -      52     +52
process_module                                       577     530     -47
This commit is contained in:
Denis Vlasenko 2008-09-06 14:14:01 +00:00
parent 4acb1b0793
commit 1c781cc8ff
2 changed files with 27 additions and 6 deletions

View 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]));
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;
}
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);

View 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" ...;)