--- /dev/null
+--- busybox-1.13.2/modutils/depmod.c Sun Nov 9 18:28:03 2008
++++ busybox-1.13.2-depmod/modutils/depmod.c Mon Jan 12 23:12:59 2009
+@@ -33,7 +33,7 @@
+ enum {
+ ARG_a = (1<<0), /* All modules, ignore mods in argv */
+ ARG_A = (1<<1), /* Only emit .ko that are newer than modules.dep file */
+- ARG_b = (1<<2), /* not /lib/modules/$(uname -r)/ but this base-dir */
++ ARG_b = (1<<2), /* base directory when modules are in staging area */
+ ARG_e = (1<<3), /* with -F, print unresolved symbols */
+ ARG_F = (1<<4), /* System.map that contains the symbols */
+ ARG_n = (1<<5) /* dry-run, print to stdout only */
+@@ -57,7 +57,7 @@
+ *first = info;
+
+ info->dnext = info->dprev = info;
+- info->name = xstrdup(fname);
++ info->name = xasprintf("/%s", fname);
+ info->modname = filename2modname(fname, NULL);
+ for (ptr = image; ptr < image + len - 10; ptr++) {
+ if (strncmp(ptr, "depends=", 8) == 0) {
+@@ -123,44 +123,61 @@
+ }
+ }
+
++static void xfreopen_write(const char *file, FILE *f)
++{
++ if (freopen(file, "w", f) == NULL)
++ bb_perror_msg_and_die("can't open '%s'", file);
++}
++
+ int depmod_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+ int depmod_main(int argc UNUSED_PARAM, char **argv)
+ {
+ module_info *modules = NULL, *m, *dep;
+- char *moddir_base = (char *)CONFIG_DEFAULT_MODULES_DIR;
++ const char *moddir_base = "/";
++ char *moddir, *version;
++ struct utsname uts;
+ int tmp;
+
+ getopt32(argv, "aAb:eF:n", &moddir_base, NULL);
+ argv += optind;
+
+ /* goto modules location */
++ xchdir(moddir_base);
+
+ /* If a version is provided, then that kernel version's module directory
+ * is used, rather than the current kernel version (as returned by
+ * "uname -r"). */
+- xchdir(moddir_base);
+- if (*argv && (sscanf(*argv, "%d.%d.%d", &tmp, &tmp, &tmp) == 3)) {
+- xchdir(*argv++);
++ if (*argv && sscanf(*argv, "%d.%d.%d", &tmp, &tmp, &tmp) == 3) {
++ version = *argv++;
+ } else {
+- struct utsname uts;
+ uname(&uts);
+- xchdir(uts.release);
++ version = uts.release;
+ }
+- /* If no modules are given on the command-line, -a is on per default. */
+- option_mask32 |= *argv == NULL;
++ moddir = concat_path_file(&CONFIG_DEFAULT_MODULES_DIR[1], version);
+
+ /* Scan modules */
+- moddir_base = xrealloc_getcwd_or_warn(NULL);
+- do {
+- recursive_action((option_mask32 & ARG_a) ? moddir_base : *argv,
+- ACTION_RECURSE, parse_module, NULL, &modules, 0);
+- } while (!(option_mask32 & ARG_a) && *(++argv));
++ if (*argv) {
++ char *modfile;
++ struct stat sb;
++ do {
++ modfile = concat_path_file(moddir, *argv);
++ xstat(modfile, &sb);
++ parse_module(modfile, &sb, &modules, 0);
++ free(modfile);
++ } while (*(++argv));
++ } else {
++ recursive_action(moddir, ACTION_RECURSE,
++ parse_module, NULL, &modules, 0);
++ }
++
++ /* Prepare for writing out the dep files */
++ xchdir(moddir);
+ if (ENABLE_FEATURE_CLEAN_UP)
+- free(moddir_base);
++ free(moddir);
+
+ /* Generate dependency and alias files */
+ if (!(option_mask32 & ARG_n))
+- freopen(CONFIG_DEFAULT_DEPMOD_FILE, "w", stdout);
++ xfreopen_write(CONFIG_DEFAULT_DEPMOD_FILE, stdout);
+ for (m = modules; m != NULL; m = m->next) {
+ printf("%s:", m->name);
+
+@@ -174,12 +191,12 @@
+ dep->dprev->dnext = dep->dnext;
+ dep->dnext = dep->dprev = dep;
+ }
+- puts("");
++ bb_putchar('\n');
+ }
+
+ #if ENABLE_FEATURE_MODUTILS_ALIAS
+ if (!(option_mask32 & ARG_n))
+- freopen("modules.alias", "w", stdout);
++ xfreopen_write("modules.alias", stdout);
+ for (m = modules; m != NULL; m = m->next) {
+ while (m->aliases) {
+ printf("alias %s %s\n",
+@@ -190,7 +207,7 @@
+ #endif
+ #if ENABLE_FEATURE_MODUTILS_SYMBOLS
+ if (!(option_mask32 & ARG_n))
+- freopen("modules.symbols", "w", stdout);
++ xfreopen_write("modules.symbols", stdout);
+ for (m = modules; m != NULL; m = m->next) {
+ while (m->symbols) {
+ printf("alias symbol:%s %s\n",