diff -urpN busybox-1.14.1/modutils/modprobe.c busybox-1.14.1-modprobe/modutils/modprobe.c --- busybox-1.14.1/modutils/modprobe.c 2009-05-27 18:01:37.000000000 +0200 +++ busybox-1.14.1-modprobe/modutils/modprobe.c 2009-06-04 19:01:04.000000000 +0200 @@ -8,12 +8,17 @@ * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. */ +/* Note that unlike older versions of modules.dep/depmod (busybox and m-i-t), + * we expect the full dependency list to be specified in modules.dep. Older + * versions would only export the direct dependency list. + */ + #include "libbb.h" #include "modutils.h" #include #include -//#define DBG(...) bb_error_msg(__VA_ARGS__) +//#define DBG(fmt, ...) bb_error_msg("%s: " fmt, __func__, ## __VA_ARGS__) #define DBG(...) ((void)0) #define MODULE_FLAG_LOADED 0x0001 @@ -116,6 +121,7 @@ static void add_probe(const char *name) return; } + DBG("queuing %s", name); m->probed_name = name; m->flags |= MODULE_FLAG_NEED_DEPS; llist_add_to_end(&G.probes, m); @@ -205,9 +211,10 @@ static int read_config(const char *path) static int do_modprobe(struct module_entry *m) { - struct module_entry *m2; + struct module_entry *m2 = m2; /* for compiler */ char *fn, *options; - int rc = -1; + int rc, first; + llist_t *l; if (!(m->flags & MODULE_FLAG_FOUND_IN_MODDEP)) { DBG("skipping %s, not found in modules.dep", m->modname); @@ -218,13 +225,25 @@ static int do_modprobe(struct module_ent if (!(option_mask32 & MODPROBE_OPT_REMOVE)) m->deps = llist_rev(m->deps); + for (l = m->deps; l != NULL; l = l->link) + DBG("dep: %s", l->data); + + first = 1; rc = 0; while (m->deps && rc == 0) { fn = llist_pop(&m->deps); m2 = get_or_add_modentry(fn); if (option_mask32 & MODPROBE_OPT_REMOVE) { - if (bb_delete_module(m->modname, O_EXCL) != 0) - rc = errno; + if (m2->flags & MODULE_FLAG_LOADED) { + if (bb_delete_module(m2->modname, O_EXCL) != 0) { + if (first) + rc = errno; + } else { + m2->flags &= ~MODULE_FLAG_LOADED; + } + } + /* do not error out if *deps* fail to unload */ + first = 0; } else if (!(m2->flags & MODULE_FLAG_LOADED)) { options = m2->options; m2->options = NULL; @@ -242,11 +261,10 @@ static int do_modprobe(struct module_ent free(fn); } -//FIXME: what if rc < 0? - if (rc > 0 && !(option_mask32 & INSMOD_OPT_SILENT)) { + if (rc && !(option_mask32 & INSMOD_OPT_SILENT)) { bb_error_msg("failed to %sload module %s: %s", (option_mask32 & MODPROBE_OPT_REMOVE) ? "un" : "", - m->probed_name ? m->probed_name : m->modname, + m2->probed_name ? m2->probed_name : m2->modname, moderror(rc) ); } @@ -294,7 +312,8 @@ static void load_modules_dep(void) llist_add_to(&m->deps, xstrdup(tokens[0])); if (tokens[1]) string_to_llist(tokens[1], &m->deps, " "); - } + } else + DBG("skipping dep line"); } config_close(p); } @@ -344,10 +363,12 @@ int modprobe_main(int argc UNUSED_PARAM, if (opt & (MODPROBE_OPT_INSERT_ALL | MODPROBE_OPT_REMOVE)) { /* Each argument is a module name */ do { + DBG("adding module %s", *argv); add_probe(*argv++); } while (*argv); } else { /* First argument is module name, rest are parameters */ + DBG("probing just module %s", *argv); add_probe(argv[0]); G.cmdline_mopts = parse_cmdline_module_options(argv); } diff -urpN busybox-1.14.1/modutils/modprobe-small.c busybox-1.14.1-modprobe/modutils/modprobe-small.c --- busybox-1.14.1/modutils/modprobe-small.c 2009-05-27 18:00:23.000000000 +0200 +++ busybox-1.14.1-modprobe/modutils/modprobe-small.c 2009-06-04 19:01:28.000000000 +0200 @@ -656,7 +656,7 @@ depmod -[aA] [-n -e -v -q -V -r -u] [-b basedirectory] [forced_version] depmod [-n -e -v -q -r -u] [-F kernelsyms] module1.ko module2.ko ... If no arguments (except options) are given, "depmod -a" is assumed. -depmod will output a dependancy list suitable for the modprobe utility. +depmod will output a dependency list suitable for the modprobe utility. Options: -a, --all Probe all modules -A, --quick Only does the work if there's a new module diff -urpN busybox-1.14.1/modutils/modutils.c busybox-1.14.1-modprobe/modutils/modutils.c --- busybox-1.14.1/modutils/modutils.c 2009-05-27 18:00:23.000000000 +0200 +++ busybox-1.14.1-modprobe/modutils/modutils.c 2009-06-03 12:50:48.000000000 +0200 @@ -57,7 +57,7 @@ char * FAST_FUNC filename2modname(const from = bb_get_last_path_component_nostrip(filename); for (i = 0; i < (MODULE_NAME_LEN-1) && from[i] != '\0' && from[i] != '.'; i++) modname[i] = (from[i] == '-') ? '_' : from[i]; - modname[i] = 0; + modname[i] = '\0'; return modname; }