aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Robinson <andr345@gmail.com>2009-05-14 11:42:57 +0200
committerAndreas Robinson <andr345@gmail.com>2009-05-15 14:59:38 +0200
commit39e63afd9d179b03b84f27eb9cfe8d6dd7c2ba7f (patch)
treee1c053ba35b22e65c4ef2f998ecbd3b442105e5f
parent97e2cb54ea7cea8e9b2af23c8d397427cb81e107 (diff)
downloadmodule-init-tools-39e63afd9d179b03b84f27eb9cfe8d6dd7c2ba7f.tar.gz
modinfo: load modules with grab_elf_file()
Also, load module info with ops->get_modinfo() instead of get_section() This hides struct elf_file fields. load_strings() was originally planned to replace get_section(), but the code ended up less clear, so that idea is put on hold. Signed-off-by: Andreas Robinson <andr345@gmail.com>
-rw-r--r--modinfo.c67
1 files changed, 31 insertions, 36 deletions
diff --git a/modinfo.c b/modinfo.c
index 8a1dff3..d8412db 100644
--- a/modinfo.c
+++ b/modinfo.c
@@ -179,23 +179,22 @@ static char *next_line(char *p, const char *end)
return (char *)end + 1;
}
-static void *grab_module(const char *name, unsigned long *size, char**filename,
- const char *kernel, const char *basedir)
+static struct elf_file *grab_module(const char *name,
+ const char *kernel,
+ const char *basedir)
{
char *data;
+ unsigned long size;
struct utsname buf;
char *depname, *p, *moddir;
+ struct elf_file *module;
if (strchr(name, '.') || strchr(name, '/')) {
- data = grab_file(name, size);
- if (data) {
- *filename = NOFAIL(strdup(name));
- return data;
- } else {
+ module = grab_elf_file(name);
+ if (!module)
error("modinfo: could not open %s: %s\n",
name, strerror(errno));
- return NULL;
- }
+ return module;
}
if (!kernel) {
@@ -207,10 +206,9 @@ static void *grab_module(const char *name, unsigned long *size, char**filename,
else
nofail_asprintf(&moddir, "%s/%s", MODULE_DIR, kernel);
- nofail_asprintf(&depname, "%s/%s", moddir, "modules.dep");
-
/* Search for it in modules.dep. */
- data = grab_file(depname, size);
+ nofail_asprintf(&depname, "%s/%s", moddir, "modules.dep");
+ data = grab_file(depname, &size);
if (!data) {
error("modinfo: could not open %s\n", depname);
free(depname);
@@ -218,10 +216,11 @@ static void *grab_module(const char *name, unsigned long *size, char**filename,
}
free(depname);
- for (p = data; p < data + *size; p = next_line(p, data + *size)) {
- if (name_matches(p, data + *size, name)) {
+ for (p = data; p < data + size; p = next_line(p, data + size)) {
+ if (name_matches(p, data + size, name)) {
int namelen = strcspn(p, ":");
const char *dir;
+ char *filename;
if ('/' == p[0])
dir = basedir; /* old style deps - abs. path */
@@ -229,20 +228,21 @@ static void *grab_module(const char *name, unsigned long *size, char**filename,
dir = moddir; /* new style - relative path */
if (strlen(dir)) {
- nofail_asprintf(filename, "%s/%s", dir, p);
- (*filename)[namelen + strlen(dir) + 1] = '\0';
+ nofail_asprintf(&filename, "%s/%s", dir, p);
+ filename[namelen + strlen(dir) + 1] = '\0';
} else {
- *filename = strndup(p, namelen);
+ filename = strndup(p, namelen);
}
- release_file(data, *size);
- data = grab_file(*filename, size);
- if (!data)
+ release_file(data, size);
+ module = grab_elf_file(filename);
+ if (!module)
error("modinfo: could not open %s: %s\n",
*filename, strerror(errno));
- return data;
+ free(filename);
+ return module;
}
}
- release_file(data, *size);
+ release_file(data, size);
error("modinfo: could not find module %s\n", name);
return NULL;
}
@@ -263,7 +263,6 @@ int main(int argc, char *argv[])
const char *field = NULL;
const char *kernel = NULL;
char sep = '\n';
- unsigned long infosize = 0;
int opt, ret = 0;
char *basedir = "";
@@ -295,29 +294,25 @@ int main(int argc, char *argv[])
}
for (opt = optind; opt < argc; opt++) {
- void *info, *mod;
- unsigned long modulesize;
- char *filename;
+ void *info;
+ unsigned long infosize = 0;
+ struct elf_file *mod;
- mod = grab_module(argv[opt], &modulesize, &filename,
- kernel, basedir);
+ mod = grab_module(argv[opt], kernel, basedir);
if (!mod) {
ret = 1;
continue;
}
-
- info = get_section(mod, modulesize, ".modinfo", &infosize);
+ info = mod->ops->get_modinfo(mod, &infosize);
if (!info) {
- release_file(mod, modulesize);
- free(filename);
+ release_elf_file(mod);
continue;
}
if (field)
- print_tag(field, info, infosize, filename, sep);
+ print_tag(field, info, infosize, mod->pathname, sep);
else
- print_all(info, infosize, filename, sep);
- release_file(mod, modulesize);
- free(filename);
+ print_all(info, infosize, mod->pathname, sep);
+ release_elf_file(mod);
}
return ret;
}