From 16bda3bd1f8e486ed93f5182fc777be1e813bce7 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Mon, 18 May 2009 13:08:04 +0200 Subject: depmod: fix handling of .gz modules Signed-off-by: Denys Vlasenko --- modutils/depmod.c | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) (limited to 'modutils/depmod.c') diff --git a/modutils/depmod.c b/modutils/depmod.c index 405ba9e2a..5ec2a51dd 100644 --- a/modutils/depmod.c +++ b/modutils/depmod.c @@ -40,26 +40,28 @@ enum { ARG_r = (1<<6) /* Compat dummy. Linux Makefile uses it */ }; -static int FAST_FUNC parse_module(const char *fname, struct stat *sb, - void *data, int UNUSED_PARAM depth) +static int FAST_FUNC parse_module(const char *fname, struct stat *sb UNUSED_PARAM, + void *data, int depth UNUSED_PARAM) { + char modname[MODULE_NAME_LEN]; module_info **first = (module_info **) data; char *image, *ptr; module_info *info; - size_t len = sb->st_size; + /* Arbitrary. Was sb->st_size, but that breaks .gz etc */ + size_t len = (64*1024*1024 - 4096); if (strrstr(fname, ".ko") == NULL) return TRUE; image = xmalloc_open_zipped_read_close(fname, &len); - info = xzalloc(sizeof(module_info)); + info = xzalloc(sizeof(*info)); info->next = *first; *first = info; info->dnext = info->dprev = info; info->name = xasprintf("/%s", fname); - info->modname = filename2modname(fname, NULL); + info->modname = xstrdup(filename2modname(fname, modname)); for (ptr = image; ptr < image + len - 10; ptr++) { if (strncmp(ptr, "depends=", 8) == 0) { char *u; @@ -69,12 +71,14 @@ static int FAST_FUNC parse_module(const char *fname, struct stat *sb, if (*u == '-') *u = '_'; ptr += string_to_llist(ptr, &info->dependencies, ","); - } else if (ENABLE_FEATURE_MODUTILS_ALIAS && - strncmp(ptr, "alias=", 6) == 0) { + } else if (ENABLE_FEATURE_MODUTILS_ALIAS + && strncmp(ptr, "alias=", 6) == 0 + ) { llist_add_to(&info->aliases, xstrdup(ptr + 6)); ptr += strlen(ptr); - } else if (ENABLE_FEATURE_MODUTILS_SYMBOLS && - strncmp(ptr, "__ksymtab_", 10) == 0) { + } else if (ENABLE_FEATURE_MODUTILS_SYMBOLS + && strncmp(ptr, "__ksymtab_", 10) == 0 + ) { ptr += 10; if (strncmp(ptr, "gpl", 3) == 0 || strcmp(ptr, "strings") == 0) @@ -199,10 +203,17 @@ int depmod_main(int argc UNUSED_PARAM, char **argv) if (!(option_mask32 & ARG_n)) xfreopen_write("modules.alias", stdout); for (m = modules; m != NULL; m = m->next) { + const char *fname = bb_basename(m->name); + int fnlen = strchrnul(fname, '.') - fname; while (m->aliases) { - printf("alias %s %s\n", + /* Last word can well be m->modname instead, + * but depmod from module-init-tools 3.4 + * uses module basename, i.e., no s/-/_/g. + * (pathname and .ko.* are still stripped) + * Mimicking that... */ + printf("alias %s %.*s\n", (char*)llist_pop(&m->aliases), - m->modname); + fnlen, fname); } } #endif @@ -210,10 +221,12 @@ int depmod_main(int argc UNUSED_PARAM, char **argv) if (!(option_mask32 & ARG_n)) xfreopen_write("modules.symbols", stdout); for (m = modules; m != NULL; m = m->next) { + const char *fname = bb_basename(m->name); + int fnlen = strchrnul(fname, '.') - fname; while (m->symbols) { - printf("alias symbol:%s %s\n", + printf("alias symbol:%s %.*s\n", (char*)llist_pop(&m->symbols), - m->modname); + fnlen, fname); } } #endif -- cgit v1.2.3