aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernhard Reutner-Fischer <rep.dot.nop@gmail.com>2008-05-26 17:04:01 +0000
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>2008-05-26 17:04:01 +0000
commit6bb55cfb99090565d565588c281c08ca21993e78 (patch)
treefb8b75be9b53ad897ecdee08b321fa211aa1345c
parentcf18010ca966aa2be06e0466aeb78b54d15957e2 (diff)
downloadbusybox-w32-6bb55cfb99090565d565588c281c08ca21993e78.tar.gz
busybox-w32-6bb55cfb99090565d565588c281c08ca21993e78.tar.bz2
busybox-w32-6bb55cfb99090565d565588c281c08ca21993e78.zip
- add basic option-handling (+220b). Untested
-rw-r--r--modutils/depmod.c50
1 files changed, 42 insertions, 8 deletions
diff --git a/modutils/depmod.c b/modutils/depmod.c
index 5d51ba450..710c3e540 100644
--- a/modutils/depmod.c
+++ b/modutils/depmod.c
@@ -27,7 +27,7 @@ struct globals {
27static int fill_lst(const char *modulename, struct stat ATTRIBUTE_UNUSED *sb, 27static int fill_lst(const char *modulename, struct stat ATTRIBUTE_UNUSED *sb,
28 void ATTRIBUTE_UNUSED *data, int ATTRIBUTE_UNUSED depth) 28 void ATTRIBUTE_UNUSED *data, int ATTRIBUTE_UNUSED depth)
29{ 29{
30 llist_add_to(&G.lst, strdup(modulename)); 30 llist_add_to(&G.lst, xstrdup(modulename));
31 return TRUE; 31 return TRUE;
32} 32}
33 33
@@ -69,7 +69,7 @@ static int fileAction(const char *fname, struct stat *sb,
69 break; 69 break;
70 len -= ++ptr - the_module; 70 len -= ++ptr - the_module;
71 } while (1); 71 } while (1);
72 deps = depends = strdup (ptr + sizeof("depends=")-1); 72 deps = depends = xstrdup (ptr + sizeof("depends=")-1);
73//bb_info_msg(" depends='%s'", depends); 73//bb_info_msg(" depends='%s'", depends);
74 while (*deps) { 74 while (*deps) {
75 llist_t * _lst = G.lst; 75 llist_t * _lst = G.lst;
@@ -106,18 +106,49 @@ int depmod_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
106int depmod_main(int ATTRIBUTE_UNUSED argc, char **argv) 106int depmod_main(int ATTRIBUTE_UNUSED argc, char **argv)
107{ 107{
108 int retval = EXIT_SUCCESS; 108 int retval = EXIT_SUCCESS;
109// static const char moddir_base[] ALIGN1 = "/lib/modules/%s"; 109 char *moddir_base, *system_map, *chp;
110 FILE *filedes = xfopen("/tmp/modules.dep", "w"); 110 FILE *filedes = stdout;
111 enum {
112 ARG_a = (1<<0), /* All modules, ignore mods in argv */
113 ARG_A = (1<<1), /* Only emit .ko that are newer than modules.dep file */
114 ARG_b = (1<<2), /* not /lib/modules/$(uname -r)/ but this base-dir */
115 ARG_e = (1<<3), /* with -F, print unresolved symbols */
116 ARG_F = (1<<4), /* System.map that contains the symbols */
117 ARG_n = (1<<5) /* dry-run, print to stdout only */
118 };
111 119
112 argv++; 120 getopt32(argv, "aAb:eF:n", &moddir_base, &system_map);
121 argv += optind;
122 if (*argv) /* got a version to use? */
123 chp = *argv++;
124 else {
125 struct utsname uts;
126 if (uname(&uts) < 0)
127 bb_simple_perror_msg_and_die("uname");
128 chp = xstrdup(uts.release);
129 }
130 moddir_base
131 = concat_path_file(option_mask32 & ARG_b ? moddir_base : "/lib/modules",
132 chp);
133 if (ENABLE_FEATURE_CLEAN_UP)
134 free(chp);
135 if (!(option_mask32 & ARG_n)) {
136 char *modules_dep = concat_path_file(moddir_base, "modules.dep");
137 filedes = xfopen(modules_dep, "w");
138 if (ENABLE_FEATURE_CLEAN_UP)
139 free(modules_dep);
140 }
113 do { 141 do {
114 if (!recursive_action(*argv, 142 chp = concat_path_file(moddir_base,
143 option_mask32 & ARG_a ? "/" : *argv++);
144
145 if (!recursive_action(chp,
115 ACTION_RECURSE, /* flags */ 146 ACTION_RECURSE, /* flags */
116 fill_lst, /* file action */ 147 fill_lst, /* file action */
117 NULL, /* dir action */ 148 NULL, /* dir action */
118 NULL, /* user data */ 149 NULL, /* user data */
119 0) || /* depth */ 150 0) || /* depth */
120 !recursive_action(*argv, 151 !recursive_action(chp,
121 ACTION_RECURSE, /* flags */ 152 ACTION_RECURSE, /* flags */
122 fileAction, /* file action */ 153 fileAction, /* file action */
123 NULL, /* dir action */ 154 NULL, /* dir action */
@@ -125,11 +156,14 @@ int depmod_main(int ATTRIBUTE_UNUSED argc, char **argv)
125 0)) { /* depth */ 156 0)) { /* depth */
126 retval = EXIT_FAILURE; 157 retval = EXIT_FAILURE;
127 } 158 }
128 } while (*++argv); 159 if (ENABLE_FEATURE_CLEAN_UP)
160 free(chp);
161 } while (!(option_mask32 & ARG_a) || *argv);
129 162
130 if (ENABLE_FEATURE_CLEAN_UP) { 163 if (ENABLE_FEATURE_CLEAN_UP) {
131 fclose(filedes); 164 fclose(filedes);
132 llist_free(G.lst, free); 165 llist_free(G.lst, free);
166 free(moddir_base);
133 } 167 }
134 return retval; 168 return retval;
135} 169}