From: Alexey Gladkov <gladkov.alexey@gmail.com>
To: util-linux@vger.kernel.org
Subject: [PATCH v1 4/4] modinfo: Show information about built-in modules
Date: Thu, 10 Oct 2019 14:09:28 +0200 [thread overview]
Message-ID: <20191010120928.3817287-5-gladkov.alexey@gmail.com> (raw)
In-Reply-To: <20191010120928.3817287-1-gladkov.alexey@gmail.com>
Signed-off-by: Alexey Gladkov <gladkov.alexey@gmail.com>
---
libkmod/libkmod-builtin.c | 2 +-
libkmod/libkmod-module.c | 23 ++++++++++++++++-------
tools/modinfo.c | 39 +++++++++++++++++++++------------------
3 files changed, 38 insertions(+), 26 deletions(-)
diff --git a/libkmod/libkmod-builtin.c b/libkmod/libkmod-builtin.c
index 9da0010..1c16275 100644
--- a/libkmod/libkmod-builtin.c
+++ b/libkmod/libkmod-builtin.c
@@ -162,7 +162,7 @@ int kmod_builtin_get_modinfo(struct kmod_ctx *ctx, const char *modname,
iter = kmod_builtin_iter_new(ctx);
if (!iter)
- return -1;
+ return -errno;
modlen = strlen(modname);
diff --git a/libkmod/libkmod-module.c b/libkmod/libkmod-module.c
index 0754ad5..ed82dcb 100644
--- a/libkmod/libkmod-module.c
+++ b/libkmod/libkmod-module.c
@@ -2286,13 +2286,22 @@ KMOD_EXPORT int kmod_module_get_info(const struct kmod_module *mod, struct kmod_
assert(*list == NULL);
- elf = kmod_module_get_elf(mod);
- if (elf == NULL)
- return -errno;
+ /* remove const: this can only change internal state */
+ if (kmod_module_is_builtin((struct kmod_module *)mod)) {
+ count = kmod_builtin_get_modinfo(mod->ctx,
+ kmod_module_get_name(mod),
+ &strings);
+ if (count < 0)
+ return count;
+ } else {
+ elf = kmod_module_get_elf(mod);
+ if (elf == NULL)
+ return -errno;
- count = kmod_elf_get_strings(elf, ".modinfo", &strings);
- if (count < 0)
- return count;
+ count = kmod_elf_get_strings(elf, ".modinfo", &strings);
+ if (count < 0)
+ return count;
+ }
for (i = 0; i < count; i++) {
struct kmod_list *n;
@@ -2316,7 +2325,7 @@ KMOD_EXPORT int kmod_module_get_info(const struct kmod_module *mod, struct kmod_
goto list_error;
}
- if (kmod_module_signature_info(mod->file, &sig_info)) {
+ if (mod->file && kmod_module_signature_info(mod->file, &sig_info)) {
struct kmod_list *n;
n = kmod_module_info_append(list, "sig_id", strlen("sig_id"),
diff --git a/tools/modinfo.c b/tools/modinfo.c
index 86ac04b..0231bb0 100644
--- a/tools/modinfo.c
+++ b/tools/modinfo.c
@@ -172,18 +172,33 @@ static int modinfo_do(struct kmod_module *mod)
{
struct kmod_list *l, *list = NULL;
struct param *params = NULL;
- int err;
+ int err, is_builtin;
+ const char *filename = kmod_module_get_path(mod);
+
+ is_builtin = (filename == NULL);
+
+ if (is_builtin) {
+ printf("%-16s%s%c", "name:", kmod_module_get_name(mod), separator);
+ filename = "(builtin)";
+ }
if (field != NULL && streq(field, "filename")) {
- printf("%s%c", kmod_module_get_path(mod), separator);
+ printf("%s%c", filename, separator);
return 0;
} else if (field == NULL) {
printf("%-16s%s%c", "filename:",
- kmod_module_get_path(mod), separator);
+ filename, separator);
}
err = kmod_module_get_info(mod, &list);
if (err < 0) {
+ if (is_builtin && err == -ENOENT) {
+ /*
+ * This is an old kernel that does not have a file
+ * with information about built-in modules.
+ */
+ return 0;
+ }
ERR("could not get modinfo from '%s': %s\n",
kmod_module_get_name(mod), strerror(-err));
return err;
@@ -276,7 +291,7 @@ static int modinfo_path_do(struct kmod_ctx *ctx, const char *path)
static int modinfo_alias_do(struct kmod_ctx *ctx, const char *alias)
{
- struct kmod_list *l, *filtered, *list = NULL;
+ struct kmod_list *l, *list = NULL;
int err = kmod_module_new_from_lookup(ctx, alias, &list);
if (err < 0) {
ERR("Module alias %s not found.\n", alias);
@@ -288,26 +303,14 @@ static int modinfo_alias_do(struct kmod_ctx *ctx, const char *alias)
return -ENOENT;
}
- err = kmod_module_apply_filter(ctx, KMOD_FILTER_BUILTIN, list, &filtered);
- kmod_module_unref_list(list);
- if (err < 0) {
- ERR("Failed to filter list: %m\n");
- return err;
- }
-
- if (filtered == NULL) {
- ERR("Module %s not found.\n", alias);
- return -ENOENT;
- }
-
- kmod_list_foreach(l, filtered) {
+ kmod_list_foreach(l, list) {
struct kmod_module *mod = kmod_module_get_module(l);
int r = modinfo_do(mod);
kmod_module_unref(mod);
if (r < 0)
err = r;
}
- kmod_module_unref_list(filtered);
+ kmod_module_unref_list(list);
return err;
}
--
2.21.0
next prev parent reply other threads:[~2019-10-10 12:09 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-10 12:09 [PATCH v1 0/4] Add modules.builtin.modinfo support Alexey Gladkov
2019-10-10 12:09 ` [PATCH v1 1/4] libkmod: Add parser for modules.builtin.modinfo Alexey Gladkov
2019-10-10 12:09 ` [PATCH v1 2/4] libkmod: Add function to get list of built-in modules Alexey Gladkov
2019-10-10 12:09 ` [PATCH v1 3/4] Lookup aliases in the modules.builtin.modinfo Alexey Gladkov
2019-10-10 12:09 ` Alexey Gladkov [this message]
2019-10-11 6:58 ` [PATCH v1 0/4] Add modules.builtin.modinfo support Karel Zak
2019-10-11 8:17 ` Alexey Gladkov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191010120928.3817287-5-gladkov.alexey@gmail.com \
--to=gladkov.alexey@gmail.com \
--cc=util-linux@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).