From 16bda3bd1f8e486ed93f5182fc777be1e813bce7 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Mon, 18 May 2009 13:08:04 +0200 Subject: [PATCH] depmod: fix handling of .gz modules Signed-off-by: Denys Vlasenko --- modutils/depmod.c | 39 +++++++++++++++++++++++++------------- modutils/depmod_process.sh | 20 +++++++++++++++++++ modutils/modutils.c | 2 +- 3 files changed, 47 insertions(+), 14 deletions(-) create mode 100755 modutils/depmod_process.sh 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 diff --git a/modutils/depmod_process.sh b/modutils/depmod_process.sh new file mode 100755 index 000000000..f99b09153 --- /dev/null +++ b/modutils/depmod_process.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +# Depmod output may be hard to diff. +# This script sorts dependencies within "xx.ko: yy.ko zz.ko" lines, +# and sorts all lines too. +# Usage: +# +# [./busybox] depmod -n | ./depmod_process.sh | sort >OUTFILE +# +# and then you can diff OUTFILEs. Useful for comparing bbox depmod +# with module-init-tools depmod and such. + +while read -r word rest; do + if ! test "${word/*:/}"; then + echo -n "$word " + echo "$rest" | xargs -n1 | sort | xargs + else + echo "$word $rest"; + fi +done diff --git a/modutils/modutils.c b/modutils/modutils.c index 0f6cb0f2d..f437a9829 100644 --- a/modutils/modutils.c +++ b/modutils/modutils.c @@ -57,7 +57,7 @@ char * FAST_FUNC filename2modname(const char *filename, char *modname) from = bb_get_last_path_component_nostrip(filename); for (i = 0; i < (MODULE_NAME_LEN-1) && from[i] != '\0' && from[i] != '.'; i++) modname[i] = (from[i] == '-') ? '_' : from[i]; - modname[i] = 0; + modname[i] = '\0'; return modname; }