depmod: fix -b option (by timo.teras AT iki.fi)
No binary (build failed)
—
(log yok)
| @@ -33,7 +33,7 @@ typedef struct module_info { | |
| 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 @@ static int FAST_FUNC parse_module(const char *fname, struct stat *sb, | |
| *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 order_dep_list(module_info *modules, module_info *start, | |
| } | |
| } | |
| + | 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 @@ int depmod_main(int argc UNUSED_PARAM, char **argv) | |
| 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 @@ int depmod_main(int argc UNUSED_PARAM, char **argv) | |
| #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", | |