modprobe-small: remove redundant aliases from modules.dep.bb

function                                             old     new   delta
parse_module                                         309     395     +86

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2014-04-19 16:17:27 +02:00
parent 5fd3ddfb24
commit 6116cb23cc

View File

@ -212,6 +212,7 @@ static void parse_module(module_info *info, const char *pathname)
reset_stringbuf(); reset_stringbuf();
pos = 0; pos = 0;
while (1) { while (1) {
unsigned start = stringbuf_idx;
ptr = find_keyword(module_image + pos, len - pos, "alias="); ptr = find_keyword(module_image + pos, len - pos, "alias=");
if (!ptr) { if (!ptr) {
ptr = find_keyword(module_image + pos, len - pos, "__ksymtab_"); ptr = find_keyword(module_image + pos, len - pos, "__ksymtab_");
@ -228,6 +229,31 @@ static void parse_module(module_info *info, const char *pathname)
} }
append(ptr); append(ptr);
appendc(' '); appendc(' ');
/*
* Don't add redundant aliases, such as:
* libcrc32c.ko symbol:crc32c symbol:crc32c
*/
if (start) { /* "if we aren't the first alias" */
char *found, *last;
stringbuf[stringbuf_idx] = '\0';
last = stringbuf + start;
/*
* String at last-1 is " symbol:crc32c "
* (with both leading and trailing spaces).
*/
if (strncmp(stringbuf, last, stringbuf_idx - start) == 0)
/* First alias matches us */
found = stringbuf;
else
/* Does any other alias match? */
found = strstr(stringbuf, last-1);
if (found < last-1) {
/* There is absolutely the same string before us */
dbg2_error_msg("redundant:'%s'", last);
stringbuf_idx = start;
goto skip;
}
}
skip: skip:
pos = (ptr - module_image); pos = (ptr - module_image);
} }