diff options
Diffstat (limited to 'modutils/modinfo.c')
-rw-r--r-- | modutils/modinfo.c | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/modutils/modinfo.c b/modutils/modinfo.c index 321ad78..454a1b3 100644 --- a/modutils/modinfo.c +++ b/modutils/modinfo.c @@ -43,7 +43,8 @@ static int display(const char *data, const char *pattern, int flag) return printf("%s%c", data, (option_mask32 & OPT_0) ? '\0' : '\n'); } -static void modinfo(const char *path, struct modinfo_env *env) +static void modinfo(const char *path, const char *version, + struct modinfo_env *env) { static const char *const shortcuts[] = { "filename", @@ -62,10 +63,20 @@ static void modinfo(const char *path, struct modinfo_env *env) if (tags & 1) { /* filename */ display(path, shortcuts[0], 1 != tags); } + len = MAXINT(ssize_t); the_module = xmalloc_open_zipped_read_close(path, &len); - if (!the_module) - return; + if (!the_module) { + if (path[0] == '/') + return; + /* Newer depmod puts relative paths in modules.dep */ + path = xasprintf("%s/%s/%s", CONFIG_DEFAULT_MODULES_DIR, version, path); + the_module = xmalloc_open_zipped_read_close(path, &len); + free((char*)path); + if (!the_module) + return; + } + if (field) tags |= OPT_F; for (j = 1; (1<<j) & (OPT_TAGS + OPT_F); j++) { @@ -109,7 +120,7 @@ int modinfo_main(int argc UNUSED_PARAM, char **argv) struct modinfo_env env; char name[MODULE_NAME_LEN]; struct utsname uts; - parser_t *p; + parser_t *parser; char *colon, *tokens[2]; unsigned opts; unsigned i; @@ -121,14 +132,12 @@ int modinfo_main(int argc UNUSED_PARAM, char **argv) argv += optind; uname(&uts); - p = config_open2( - concat_path_file( - concat_path_file(CONFIG_DEFAULT_MODULES_DIR, uts.release), - CONFIG_DEFAULT_DEPMOD_FILE), + parser = config_open2( + xasprintf("%s/%s/%s", CONFIG_DEFAULT_MODULES_DIR, uts.release, CONFIG_DEFAULT_DEPMOD_FILE), xfopen_for_read ); - while (config_read(p, tokens, 2, 1, "# \t", PARSE_NORMAL)) { + while (config_read(parser, tokens, 2, 1, "# \t", PARSE_NORMAL)) { colon = last_char_is(tokens[0], ':'); if (colon == NULL) continue; @@ -136,15 +145,19 @@ int modinfo_main(int argc UNUSED_PARAM, char **argv) filename2modname(tokens[0], name); for (i = 0; argv[i]; i++) { if (fnmatch(argv[i], name, 0) == 0) { - modinfo(tokens[0], &env); + modinfo(tokens[0], uts.release, &env); argv[i] = (char *) ""; } } } + if (ENABLE_FEATURE_CLEAN_UP) + config_close(parser); + for (i = 0; argv[i]; i++) { if (argv[i][0]) { - modinfo(argv[i], &env); + modinfo(argv[i], uts.release, &env); } } + return 0; } |