diff options
author | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2008-05-26 21:33:05 +0000 |
---|---|---|
committer | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2008-05-26 21:33:05 +0000 |
commit | 1ea25684694721226997c04bd79d51f1f4d774b1 (patch) | |
tree | 20529d6412f7c3e639a81d1c7ee0d09b370aedc2 | |
parent | 7a5f494cabc2412fdff8a176099e26964ea4ba78 (diff) | |
download | busybox-w32-1ea25684694721226997c04bd79d51f1f4d774b1.tar.gz busybox-w32-1ea25684694721226997c04bd79d51f1f4d774b1.tar.bz2 busybox-w32-1ea25684694721226997c04bd79d51f1f4d774b1.zip |
- improve option-handling a bit
-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 @@ | |||
11 | #include <libbb.h> | 11 | #include <libbb.h> |
12 | #include <sys/utsname.h> /* uname() */ | 12 | #include <sys/utsname.h> /* uname() */ |
13 | 13 | ||
14 | #ifndef DEFAULT_MODULES_DIR | ||
15 | #define DEFAULT_MODULES_DIR "/lib/modules" | ||
16 | #endif | ||
17 | #ifndef DEFAULT_DEPMOD_FILE | ||
18 | #define DEFAULT_DEPMOD_FILE "modules.dep" | ||
19 | #endif | ||
14 | /* | 20 | /* |
15 | * Theory of operation: | 21 | * Theory of operation: |
16 | * - iterate over all modules and record their full path | 22 | * - iterate over all modules and record their full path |
@@ -106,7 +112,7 @@ int depmod_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | |||
106 | int depmod_main(int ATTRIBUTE_UNUSED argc, char **argv) | 112 | int depmod_main(int ATTRIBUTE_UNUSED argc, char **argv) |
107 | { | 113 | { |
108 | int retval = EXIT_SUCCESS; | 114 | int retval = EXIT_SUCCESS; |
109 | char *moddir_base, *system_map, *chp; | 115 | char *moddir_base = NULL, *moddir, *system_map, *chp; |
110 | FILE *filedes = stdout; | 116 | FILE *filedes = stdout; |
111 | enum { | 117 | enum { |
112 | ARG_a = (1<<0), /* All modules, ignore mods in argv */ | 118 | ARG_a = (1<<0), /* All modules, ignore mods in argv */ |
@@ -119,37 +125,50 @@ int depmod_main(int ATTRIBUTE_UNUSED argc, char **argv) | |||
119 | 125 | ||
120 | getopt32(argv, "aAb:eF:n", &moddir_base, &system_map); | 126 | getopt32(argv, "aAb:eF:n", &moddir_base, &system_map); |
121 | argv += optind; | 127 | argv += optind; |
122 | if (*argv) /* got a version to use? */ | 128 | if (*argv) {/* got a version to use? */ |
123 | chp = *argv++; | 129 | chp = *argv++; |
124 | else { | 130 | // if (memchr(chp, '/', strlen(chp)) != NULL) /* XXX: drop this */ |
131 | // bb_show_usage(); | ||
132 | } else { | ||
125 | struct utsname uts; | 133 | struct utsname uts; |
126 | if (uname(&uts) < 0) | 134 | if (uname(&uts) < 0) |
127 | bb_simple_perror_msg_and_die("uname"); | 135 | bb_simple_perror_msg_and_die("uname"); |
128 | chp = xstrdup(uts.release); | 136 | chp = xstrdup(uts.release); |
129 | } | 137 | } |
130 | moddir_base | 138 | /* if no modules are given on the command-line, -a is on per default */ |
131 | = concat_path_file(option_mask32 & ARG_b ? moddir_base : "/lib/modules", | 139 | option_mask32 |= *argv == NULL; |
132 | chp); | 140 | |
133 | if (ENABLE_FEATURE_CLEAN_UP) | 141 | moddir = concat_path_file(DEFAULT_MODULES_DIR, chp); |
134 | free(chp); | 142 | // if (ENABLE_FEATURE_CLEAN_UP) |
135 | if (!(option_mask32 & ARG_n)) { | 143 | // free(chp); |
136 | char *modules_dep = concat_path_file(moddir_base, "modules.dep"); | 144 | if (option_mask32 & ARG_b) { |
137 | filedes = xfopen(modules_dep, "w"); | 145 | char *old_moddir = moddir; |
146 | moddir = concat_path_file(moddir_base, moddir); | ||
138 | if (ENABLE_FEATURE_CLEAN_UP) | 147 | if (ENABLE_FEATURE_CLEAN_UP) |
139 | free(modules_dep); | 148 | free(old_moddir); |
140 | } | 149 | } |
150 | |||
151 | if (!(option_mask32 & ARG_n)) { /* --dry-run */ | ||
152 | chp = concat_path_file(moddir, DEFAULT_DEPMOD_FILE); | ||
153 | filedes = xfopen(chp, "w"); | ||
154 | if (ENABLE_FEATURE_CLEAN_UP) | ||
155 | free(chp); | ||
156 | } | ||
157 | /* have to do a full walk to collect all needed data */ | ||
158 | if (!recursive_action(moddir, | ||
159 | ACTION_RECURSE, /* flags */ | ||
160 | fill_lst, /* file action */ | ||
161 | NULL, /* dir action */ | ||
162 | NULL, /* user data */ | ||
163 | 0)) { | ||
164 | retval = EXIT_FAILURE; | ||
165 | } else | ||
141 | do { | 166 | do { |
142 | chp = concat_path_file(moddir_base, | 167 | chp = concat_path_file(option_mask32 & ARG_a ? moddir : moddir_base, |
143 | option_mask32 & ARG_a ? "/" : *argv++); | 168 | option_mask32 & ARG_a ? "" : *argv++); |
144 | 169 | ||
145 | if (!recursive_action(chp, | 170 | if (!recursive_action(chp, |
146 | ACTION_RECURSE, /* flags */ | 171 | ACTION_RECURSE, /* flags */ |
147 | fill_lst, /* file action */ | ||
148 | NULL, /* dir action */ | ||
149 | NULL, /* user data */ | ||
150 | 0) || /* depth */ | ||
151 | !recursive_action(chp, | ||
152 | ACTION_RECURSE, /* flags */ | ||
153 | fileAction, /* file action */ | 172 | fileAction, /* file action */ |
154 | NULL, /* dir action */ | 173 | NULL, /* dir action */ |
155 | (void*)filedes, /* user data */ | 174 | (void*)filedes, /* user data */ |
@@ -158,12 +177,12 @@ int depmod_main(int ATTRIBUTE_UNUSED argc, char **argv) | |||
158 | } | 177 | } |
159 | if (ENABLE_FEATURE_CLEAN_UP) | 178 | if (ENABLE_FEATURE_CLEAN_UP) |
160 | free(chp); | 179 | free(chp); |
161 | } while (!(option_mask32 & ARG_a) || *argv); | 180 | } while (!(option_mask32 & ARG_a) && *argv); |
162 | 181 | ||
163 | if (ENABLE_FEATURE_CLEAN_UP) { | 182 | if (ENABLE_FEATURE_CLEAN_UP) { |
164 | fclose(filedes); | 183 | fclose(filedes); |
165 | llist_free(G.lst, free); | 184 | llist_free(G.lst, free); |
166 | free(moddir_base); | 185 | free(moddir); |
167 | } | 186 | } |
168 | return retval; | 187 | return retval; |
169 | } | 188 | } |