depmod: fix handling of .gz modules
No binary (build failed)
—
(log yok)
| @@ -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 | |
| @@ -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 |
| @@ -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; | |
| } | |