- improve option-handling a bit
authorBernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Mon, 26 May 2008 21:33:05 +0000 (21:33 -0000)
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Mon, 26 May 2008 21:33:05 +0000 (21:33 -0000)
modutils/depmod.c

index 710c3e540c663d2c8b18e01f429d5d3c25e792d0..34483dc07e4f14fc83ab60959bf6d37e4c5775af 100644 (file)
 #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,36 +125,49 @@ 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 */
@@ -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;
 }