diff options
| author | Denys Vlasenko <vda.linux@googlemail.com> | 2009-05-18 13:08:04 +0200 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2009-05-18 13:08:04 +0200 |
| commit | 16bda3bd1f8e486ed93f5182fc777be1e813bce7 (patch) | |
| tree | bf6571888d13007e3e51664b9e9eba9346bb7838 /modutils | |
| parent | c396fe6306f9a769d3a91809eb03361640c2f2fc (diff) | |
| download | busybox-w32-16bda3bd1f8e486ed93f5182fc777be1e813bce7.tar.gz busybox-w32-16bda3bd1f8e486ed93f5182fc777be1e813bce7.tar.bz2 busybox-w32-16bda3bd1f8e486ed93f5182fc777be1e813bce7.zip | |
depmod: fix handling of .gz modules
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'modutils')
| -rw-r--r-- | modutils/depmod.c | 39 | ||||
| -rwxr-xr-x | modutils/depmod_process.sh | 20 | ||||
| -rw-r--r-- | modutils/modutils.c | 2 |
3 files changed, 47 insertions, 14 deletions
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 { | |||
| 40 | ARG_r = (1<<6) /* Compat dummy. Linux Makefile uses it */ | 40 | ARG_r = (1<<6) /* Compat dummy. Linux Makefile uses it */ |
| 41 | }; | 41 | }; |
| 42 | 42 | ||
| 43 | static int FAST_FUNC parse_module(const char *fname, struct stat *sb, | 43 | static int FAST_FUNC parse_module(const char *fname, struct stat *sb UNUSED_PARAM, |
| 44 | void *data, int UNUSED_PARAM depth) | 44 | void *data, int depth UNUSED_PARAM) |
| 45 | { | 45 | { |
| 46 | char modname[MODULE_NAME_LEN]; | ||
| 46 | module_info **first = (module_info **) data; | 47 | module_info **first = (module_info **) data; |
| 47 | char *image, *ptr; | 48 | char *image, *ptr; |
| 48 | module_info *info; | 49 | module_info *info; |
| 49 | size_t len = sb->st_size; | 50 | /* Arbitrary. Was sb->st_size, but that breaks .gz etc */ |
| 51 | size_t len = (64*1024*1024 - 4096); | ||
| 50 | 52 | ||
| 51 | if (strrstr(fname, ".ko") == NULL) | 53 | if (strrstr(fname, ".ko") == NULL) |
| 52 | return TRUE; | 54 | return TRUE; |
| 53 | 55 | ||
| 54 | image = xmalloc_open_zipped_read_close(fname, &len); | 56 | image = xmalloc_open_zipped_read_close(fname, &len); |
| 55 | info = xzalloc(sizeof(module_info)); | 57 | info = xzalloc(sizeof(*info)); |
| 56 | 58 | ||
| 57 | info->next = *first; | 59 | info->next = *first; |
| 58 | *first = info; | 60 | *first = info; |
| 59 | 61 | ||
| 60 | info->dnext = info->dprev = info; | 62 | info->dnext = info->dprev = info; |
| 61 | info->name = xasprintf("/%s", fname); | 63 | info->name = xasprintf("/%s", fname); |
| 62 | info->modname = filename2modname(fname, NULL); | 64 | info->modname = xstrdup(filename2modname(fname, modname)); |
| 63 | for (ptr = image; ptr < image + len - 10; ptr++) { | 65 | for (ptr = image; ptr < image + len - 10; ptr++) { |
| 64 | if (strncmp(ptr, "depends=", 8) == 0) { | 66 | if (strncmp(ptr, "depends=", 8) == 0) { |
| 65 | char *u; | 67 | char *u; |
| @@ -69,12 +71,14 @@ static int FAST_FUNC parse_module(const char *fname, struct stat *sb, | |||
| 69 | if (*u == '-') | 71 | if (*u == '-') |
| 70 | *u = '_'; | 72 | *u = '_'; |
| 71 | ptr += string_to_llist(ptr, &info->dependencies, ","); | 73 | ptr += string_to_llist(ptr, &info->dependencies, ","); |
| 72 | } else if (ENABLE_FEATURE_MODUTILS_ALIAS && | 74 | } else if (ENABLE_FEATURE_MODUTILS_ALIAS |
| 73 | strncmp(ptr, "alias=", 6) == 0) { | 75 | && strncmp(ptr, "alias=", 6) == 0 |
| 76 | ) { | ||
| 74 | llist_add_to(&info->aliases, xstrdup(ptr + 6)); | 77 | llist_add_to(&info->aliases, xstrdup(ptr + 6)); |
| 75 | ptr += strlen(ptr); | 78 | ptr += strlen(ptr); |
| 76 | } else if (ENABLE_FEATURE_MODUTILS_SYMBOLS && | 79 | } else if (ENABLE_FEATURE_MODUTILS_SYMBOLS |
| 77 | strncmp(ptr, "__ksymtab_", 10) == 0) { | 80 | && strncmp(ptr, "__ksymtab_", 10) == 0 |
| 81 | ) { | ||
| 78 | ptr += 10; | 82 | ptr += 10; |
| 79 | if (strncmp(ptr, "gpl", 3) == 0 || | 83 | if (strncmp(ptr, "gpl", 3) == 0 || |
| 80 | strcmp(ptr, "strings") == 0) | 84 | strcmp(ptr, "strings") == 0) |
| @@ -199,10 +203,17 @@ int depmod_main(int argc UNUSED_PARAM, char **argv) | |||
| 199 | if (!(option_mask32 & ARG_n)) | 203 | if (!(option_mask32 & ARG_n)) |
| 200 | xfreopen_write("modules.alias", stdout); | 204 | xfreopen_write("modules.alias", stdout); |
| 201 | for (m = modules; m != NULL; m = m->next) { | 205 | for (m = modules; m != NULL; m = m->next) { |
| 206 | const char *fname = bb_basename(m->name); | ||
| 207 | int fnlen = strchrnul(fname, '.') - fname; | ||
| 202 | while (m->aliases) { | 208 | while (m->aliases) { |
| 203 | printf("alias %s %s\n", | 209 | /* Last word can well be m->modname instead, |
| 210 | * but depmod from module-init-tools 3.4 | ||
| 211 | * uses module basename, i.e., no s/-/_/g. | ||
| 212 | * (pathname and .ko.* are still stripped) | ||
| 213 | * Mimicking that... */ | ||
| 214 | printf("alias %s %.*s\n", | ||
| 204 | (char*)llist_pop(&m->aliases), | 215 | (char*)llist_pop(&m->aliases), |
| 205 | m->modname); | 216 | fnlen, fname); |
| 206 | } | 217 | } |
| 207 | } | 218 | } |
| 208 | #endif | 219 | #endif |
| @@ -210,10 +221,12 @@ int depmod_main(int argc UNUSED_PARAM, char **argv) | |||
| 210 | if (!(option_mask32 & ARG_n)) | 221 | if (!(option_mask32 & ARG_n)) |
| 211 | xfreopen_write("modules.symbols", stdout); | 222 | xfreopen_write("modules.symbols", stdout); |
| 212 | for (m = modules; m != NULL; m = m->next) { | 223 | for (m = modules; m != NULL; m = m->next) { |
| 224 | const char *fname = bb_basename(m->name); | ||
| 225 | int fnlen = strchrnul(fname, '.') - fname; | ||
| 213 | while (m->symbols) { | 226 | while (m->symbols) { |
| 214 | printf("alias symbol:%s %s\n", | 227 | printf("alias symbol:%s %.*s\n", |
| 215 | (char*)llist_pop(&m->symbols), | 228 | (char*)llist_pop(&m->symbols), |
| 216 | m->modname); | 229 | fnlen, fname); |
| 217 | } | 230 | } |
| 218 | } | 231 | } |
| 219 | #endif | 232 | #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 @@ | |||
| 1 | #!/bin/sh | ||
| 2 | |||
| 3 | # Depmod output may be hard to diff. | ||
| 4 | # This script sorts dependencies within "xx.ko: yy.ko zz.ko" lines, | ||
| 5 | # and sorts all lines too. | ||
| 6 | # Usage: | ||
| 7 | # | ||
| 8 | # [./busybox] depmod -n | ./depmod_process.sh | sort >OUTFILE | ||
| 9 | # | ||
| 10 | # and then you can diff OUTFILEs. Useful for comparing bbox depmod | ||
| 11 | # with module-init-tools depmod and such. | ||
| 12 | |||
| 13 | while read -r word rest; do | ||
| 14 | if ! test "${word/*:/}"; then | ||
| 15 | echo -n "$word " | ||
| 16 | echo "$rest" | xargs -n1 | sort | xargs | ||
| 17 | else | ||
| 18 | echo "$word $rest"; | ||
| 19 | fi | ||
| 20 | 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) | |||
| 57 | from = bb_get_last_path_component_nostrip(filename); | 57 | from = bb_get_last_path_component_nostrip(filename); |
| 58 | for (i = 0; i < (MODULE_NAME_LEN-1) && from[i] != '\0' && from[i] != '.'; i++) | 58 | for (i = 0; i < (MODULE_NAME_LEN-1) && from[i] != '\0' && from[i] != '.'; i++) |
| 59 | modname[i] = (from[i] == '-') ? '_' : from[i]; | 59 | modname[i] = (from[i] == '-') ? '_' : from[i]; |
| 60 | modname[i] = 0; | 60 | modname[i] = '\0'; |
| 61 | 61 | ||
| 62 | return modname; | 62 | return modname; |
| 63 | } | 63 | } |
