diff options
-rw-r--r-- | modutils/depmod.c | 63 |
1 files changed, 41 insertions, 22 deletions
diff --git a/modutils/depmod.c b/modutils/depmod.c index 710c3e540..34483dc07 100644 --- a/modutils/depmod.c +++ b/modutils/depmod.c @@ -11,6 +11,12 @@ #include <libbb.h> #include <sys/utsname.h> /* uname() */ +#ifndef DEFAULT_MODULES_DIR +#define DEFAULT_MODULES_DIR "/lib/modules" +#endif +#ifndef DEFAULT_DEPMOD_FILE +#define DEFAULT_DEPMOD_FILE "modules.dep" +#endif /* * Theory of operation: * - iterate over all modules and record their full path @@ -106,7 +112,7 @@ int depmod_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int depmod_main(int ATTRIBUTE_UNUSED argc, char **argv) { int retval = EXIT_SUCCESS; - char *moddir_base, *system_map, *chp; + char *moddir_base = NULL, *moddir, *system_map, *chp; FILE *filedes = stdout; enum { ARG_a = (1<<0), /* All modules, ignore mods in argv */ @@ -119,37 +125,50 @@ int depmod_main(int ATTRIBUTE_UNUSED argc, char **argv) getopt32(argv, "aAb:eF:n", &moddir_base, &system_map); argv += optind; - if (*argv) /* got a version to use? */ + if (*argv) {/* got a version to use? */ chp = *argv++; - else { +// if (memchr(chp, '/', strlen(chp)) != NULL) /* XXX: drop this */ +// bb_show_usage(); + } else { struct utsname uts; if (uname(&uts) < 0) bb_simple_perror_msg_and_die("uname"); chp = xstrdup(uts.release); } - moddir_base - = concat_path_file(option_mask32 & ARG_b ? moddir_base : "/lib/modules", - chp); - if (ENABLE_FEATURE_CLEAN_UP) - free(chp); - if (!(option_mask32 & ARG_n)) { - char *modules_dep = concat_path_file(moddir_base, "modules.dep"); - filedes = xfopen(modules_dep, "w"); + /* if no modules are given on the command-line, -a is on per default */ + option_mask32 |= *argv == NULL; + + moddir = concat_path_file(DEFAULT_MODULES_DIR, chp); +// if (ENABLE_FEATURE_CLEAN_UP) +// free(chp); + if (option_mask32 & ARG_b) { + char *old_moddir = moddir; + moddir = concat_path_file(moddir_base, moddir); if (ENABLE_FEATURE_CLEAN_UP) - free(modules_dep); + free(old_moddir); } + + if (!(option_mask32 & ARG_n)) { /* --dry-run */ + chp = concat_path_file(moddir, DEFAULT_DEPMOD_FILE); + filedes = xfopen(chp, "w"); + if (ENABLE_FEATURE_CLEAN_UP) + free(chp); + } + /* have to do a full walk to collect all needed data */ + if (!recursive_action(moddir, + ACTION_RECURSE, /* flags */ + fill_lst, /* file action */ + NULL, /* dir action */ + NULL, /* user data */ + 0)) { + retval = EXIT_FAILURE; + } else do { - chp = concat_path_file(moddir_base, - option_mask32 & ARG_a ? "/" : *argv++); + chp = concat_path_file(option_mask32 & ARG_a ? moddir : moddir_base, + option_mask32 & ARG_a ? "" : *argv++); if (!recursive_action(chp, ACTION_RECURSE, /* flags */ - fill_lst, /* file action */ - NULL, /* dir action */ - NULL, /* user data */ - 0) || /* depth */ - !recursive_action(chp, - ACTION_RECURSE, /* flags */ fileAction, /* file action */ NULL, /* dir action */ (void*)filedes, /* user data */ @@ -158,12 +177,12 @@ int depmod_main(int ATTRIBUTE_UNUSED argc, char **argv) } if (ENABLE_FEATURE_CLEAN_UP) free(chp); - } while (!(option_mask32 & ARG_a) || *argv); + } while (!(option_mask32 & ARG_a) && *argv); if (ENABLE_FEATURE_CLEAN_UP) { fclose(filedes); llist_free(G.lst, free); - free(moddir_base); + free(moddir); } return retval; } |