diff options
author | Denys Vlasenko | 2009-05-27 18:01:42 +0200 |
---|---|---|
committer | Denys Vlasenko | 2009-05-27 18:01:42 +0200 |
commit | 20cc390b9bb33cd0ab05c8bbfcd24babad7ec204 (patch) | |
tree | 876974f2abe0ae0213e5707fb551af70b73665cd /modutils/depmod.c | |
parent | bae3abf2c7185f0a9145ed2c97abb2d2e7bc2b40 (diff) | |
download | busybox-20cc390b9bb33cd0ab05c8bbfcd24babad7ec204.zip busybox-20cc390b9bb33cd0ab05c8bbfcd24babad7ec204.tar.gz |
post-1.14.0 fixes
hush significantly updated.
fixes for acpid, awk, depmod, dhcp, gzip, mdev, modprobe, sysctl.
libbb fixes.
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'modutils/depmod.c')
-rw-r--r-- | modutils/depmod.c | 39 |
1 files changed, 26 insertions, 13 deletions
diff --git a/modutils/depmod.c b/modutils/depmod.c index 405ba9e..5ec2a51 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 |