aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernhard Reutner-Fischer <rep.dot.nop@gmail.com>2008-05-26 21:33:05 +0000
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>2008-05-26 21:33:05 +0000
commit1ea25684694721226997c04bd79d51f1f4d774b1 (patch)
tree20529d6412f7c3e639a81d1c7ee0d09b370aedc2
parent7a5f494cabc2412fdff8a176099e26964ea4ba78 (diff)
downloadbusybox-w32-1ea25684694721226997c04bd79d51f1f4d774b1.tar.gz
busybox-w32-1ea25684694721226997c04bd79d51f1f4d774b1.tar.bz2
busybox-w32-1ea25684694721226997c04bd79d51f1f4d774b1.zip
- improve option-handling a bit
-rw-r--r--modutils/depmod.c63
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;
106int depmod_main(int ATTRIBUTE_UNUSED argc, char **argv) 112int 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}