aboutsummaryrefslogtreecommitdiff
path: root/modutils/modprobe.c
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2008-05-18 14:39:43 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2008-05-18 14:39:43 +0000
commit9ddc8d54d18f33774dc9db80a26f82bbaff5747d (patch)
tree28b640cfae5c704a771cf26d84281c4ca5bd371a /modutils/modprobe.c
parentb6c4855f1db16af926a0616cf91e0f65b0e2a3c6 (diff)
downloadbusybox-w32-9ddc8d54d18f33774dc9db80a26f82bbaff5747d.tar.gz
busybox-w32-9ddc8d54d18f33774dc9db80a26f82bbaff5747d.tar.bz2
busybox-w32-9ddc8d54d18f33774dc9db80a26f82bbaff5747d.zip
modprobe: optional "blacklist" command support (by Natanael Copa)
is_conf_command - 56 +56 include_conf 898 917 +19 check_dep 348 356 +8 ------------------------------------------------------------------------------ (add/remove: 1/0 grow/shrink: 2/0 up/down: 83/0) Total: 83 bytes
Diffstat (limited to 'modutils/modprobe.c')
-rw-r--r--modutils/modprobe.c31
1 files changed, 26 insertions, 5 deletions
diff --git a/modutils/modprobe.c b/modutils/modprobe.c
index f6681a8d8..60dc92665 100644
--- a/modutils/modprobe.c
+++ b/modutils/modprobe.c
@@ -29,7 +29,8 @@ struct dep_t { /* one-way list of dependency rules */
29 struct mod_opt_t * m_options; /* the module options */ 29 struct mod_opt_t * m_options; /* the module options */
30 30
31 int m_isalias : 1; /* the module is an alias */ 31 int m_isalias : 1; /* the module is an alias */
32 int m_reserved : 15; /* stuffin' */ 32 int m_isblacklisted : 1;
33 int m_reserved : 14; /* stuffin' */
33 34
34 int m_depcnt : 16; /* the number of dependable module(s) */ 35 int m_depcnt : 16; /* the number of dependable module(s) */
35 char ** m_deparr; /* the list of dependable module(s) */ 36 char ** m_deparr; /* the list of dependable module(s) */
@@ -230,6 +231,13 @@ static char *parse_command_string(char *src, char **dst)
230#define parse_command_string(src, dst) (0) 231#define parse_command_string(src, dst) (0)
231#endif /* ENABLE_FEATURE_MODPROBE_MULTIPLE_OPTIONS */ 232#endif /* ENABLE_FEATURE_MODPROBE_MULTIPLE_OPTIONS */
232 233
234static int is_conf_command(char *buffer, const char *command)
235{
236 int len = strlen(command);
237 return ((strstr(buffer, command) == buffer) &&
238 isspace(buffer[len]));
239}
240
233/* 241/*
234 * This function reads aliases and default module options from a configuration file 242 * This function reads aliases and default module options from a configuration file
235 * (/etc/modprobe.conf syntax). It supports includes (only files, no directories). 243 * (/etc/modprobe.conf syntax). It supports includes (only files, no directories).
@@ -260,7 +268,7 @@ static void include_conf(struct dep_t **first, struct dep_t **current, char *buf
260 if (continuation_line) 268 if (continuation_line)
261 continue; 269 continue;
262 270
263 if ((strncmp(buffer, "alias", 5) == 0) && isspace(buffer[5])) { 271 if (is_conf_command(buffer, "alias")) {
264 char *alias, *mod; 272 char *alias, *mod;
265 273
266 if (parse_tag_value(buffer + 6, &alias, &mod)) { 274 if (parse_tag_value(buffer + 6, &alias, &mod)) {
@@ -284,7 +292,7 @@ static void include_conf(struct dep_t **first, struct dep_t **current, char *buf
284 } 292 }
285 /*(*current)->m_next = NULL; - done by xzalloc */ 293 /*(*current)->m_next = NULL; - done by xzalloc */
286 } 294 }
287 } else if ((strncmp(buffer, "options", 7) == 0) && isspace(buffer[7])) { 295 } else if (is_conf_command(buffer, "options")) {
288 char *mod, *opt; 296 char *mod, *opt;
289 297
290 /* split the line in the module/alias name, and options */ 298 /* split the line in the module/alias name, and options */
@@ -307,7 +315,7 @@ static void include_conf(struct dep_t **first, struct dep_t **current, char *buf
307 } 315 }
308 } 316 }
309 } 317 }
310 } else if ((strncmp(buffer, "include", 7) == 0) && isspace(buffer[7])) { 318 } else if (is_conf_command(buffer, "include")) {
311 int fdi; 319 int fdi;
312 char *filename; 320 char *filename;
313 321
@@ -317,6 +325,18 @@ static void include_conf(struct dep_t **first, struct dep_t **current, char *buf
317 include_conf(first, current, buffer, buflen, fdi); 325 include_conf(first, current, buffer, buflen, fdi);
318 close(fdi); 326 close(fdi);
319 } 327 }
328 } else if (ENABLE_FEATURE_MODPROBE_BLACKLIST &&
329 (is_conf_command(buffer, "blacklist"))) {
330 char *mod;
331 struct dep_t *dt;
332
333 mod = skip_whitespace(buffer + 10);
334 for (dt = *first; dt; dt = dt->m_next) {
335 if (dt->m_isalias && strcmp(dt->m_deparr[0], mod) == 0)
336 break;
337 }
338 if (dt)
339 dt->m_isblacklisted = 1;
320 } 340 }
321 } /* while (reads(...)) */ 341 } /* while (reads(...)) */
322} 342}
@@ -728,7 +748,8 @@ static void check_dep(char *mod, struct mod_list_t **head, struct mod_list_t **t
728 748
729 // resolve alias names 749 // resolve alias names
730 while (dt->m_isalias) { 750 while (dt->m_isalias) {
731 if (dt->m_depcnt == 1) { 751 if (dt->m_depcnt == 1 && !(ENABLE_FEATURE_MODPROBE_BLACKLIST &&
752 dt->m_isblacklisted)) {
732 struct dep_t *adt; 753 struct dep_t *adt;
733 754
734 for (adt = depend; adt; adt = adt->m_next) { 755 for (adt = depend; adt; adt = adt->m_next) {