busybox: 1.13.2 depmod fix
authorPeter Korsgaard <jacmet@sunsite.dk>
Mon, 19 Jan 2009 12:34:38 +0000 (12:34 -0000)
committerPeter Korsgaard <jacmet@sunsite.dk>
Mon, 19 Jan 2009 12:34:38 +0000 (12:34 -0000)
package/busybox/busybox-1.13.2-depmod.patch [new file with mode: 0644]

diff --git a/package/busybox/busybox-1.13.2-depmod.patch b/package/busybox/busybox-1.13.2-depmod.patch
new file mode 100644 (file)
index 0000000..32d6163
--- /dev/null
@@ -0,0 +1,121 @@
+--- 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",