* 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 <sys/utsname.h>
#include <fnmatch.h>
-//#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
llist_t *deps; /* strings. modules we depend on */
};
-#define MODPROBE_OPTS "acdlnrt:VC:" USE_FEATURE_MODPROBE_BLACKLIST("b")
+#define MODPROBE_OPTS "acdlnrt:VC:" IF_FEATURE_MODPROBE_BLACKLIST("b")
enum {
MODPROBE_OPT_INSERT_ALL = (INSMOD_OPT_UNUSED << 0), /* a */
MODPROBE_OPT_DUMP_ONLY = (INSMOD_OPT_UNUSED << 1), /* c */
return;
}
+ DBG("queuing %s", name);
m->probed_name = name;
m->flags |= MODULE_FLAG_NEED_DEPS;
llist_add_to_end(&G.probes, m);
struct module_entry *m2;
char *fn, *options;
int rc = -1;
+ llist_t *l;
if (!(m->flags & MODULE_FLAG_FOUND_IN_MODDEP)) {
DBG("skipping %s, not found in modules.dep", m->modname);
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);
+
rc = 0;
while (m->deps && rc == 0) {
fn = llist_pop(&m->deps);
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);
}
if (opt & MODPROBE_OPT_INSERT_ALL) {
/* 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);
}