| --- 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", |