61
for (; info; info = next_string(info, &size))
64
for (j = 0; j < tags->cnt; j++) {
65
const char *info = tags->str[j];
62
66
if (strncmp(info, tag, taglen) == 0 && info[taglen] == '=')
63
67
printf("%s%c", info + taglen + 1, sep);
66
static void print_all(const char *info, unsigned long size,
71
static void print_all(struct string_table *tags,
67
72
const char *filename, char sep)
69
75
struct param *i, *params = NULL;
71
77
printf("%-16s%s%c", "filename:", filename, sep);
72
for (; info; info = next_string(info, &size)) {
78
for (j = 0; j < tags->cnt; j++) {
79
const char *info = tags->str[j];
75
82
/* We expect this in parm and parmtype. */
177
184
return (char *)end + 1;
180
static void *grab_module(const char *name, unsigned long *size, char**filename,
181
const char *kernel, const char *basedir)
187
static struct elf_file *grab_module(const char *name,
184
193
struct utsname buf;
185
194
char *depname, *p, *moddir;
195
struct elf_file *module;
187
197
if (strchr(name, '.') || strchr(name, '/')) {
188
data = grab_file(name, size);
190
*filename = strdup(name);
193
fprintf(stderr, "modinfo: could not open %s: %s\n",
198
module = grab_elf_file(name);
200
error("modinfo: could not open %s: %s\n",
194
201
name, strerror(errno));
201
asprintf(&moddir, "%s/%s/%s",
202
basedir, MODULE_DIR, kernel);
204
asprintf(&moddir, "%s/%s",
209
asprintf(&moddir, "%s/%s/%s",
210
basedir, MODULE_DIR, buf.release);
212
asprintf(&moddir, "%s/%s",
213
MODULE_DIR, buf.release);
207
kernel = buf.release;
215
asprintf(&depname, "%s/%s", moddir, "modules.dep");
210
nofail_asprintf(&moddir, "%s/%s/%s", basedir, MODULE_DIR, kernel);
212
nofail_asprintf(&moddir, "%s/%s", MODULE_DIR, kernel);
217
214
/* Search for it in modules.dep. */
218
data = grab_file(depname, size);
215
nofail_asprintf(&depname, "%s/%s", moddir, "modules.dep");
216
data = grab_file(depname, &size);
220
fprintf(stderr, "modinfo: could not open %s\n", depname);
218
error("modinfo: could not open %s\n", depname);
226
for (p = data; p < data + *size; p = next_line(p, data + *size)) {
227
if (name_matches(p, data + *size, name)) {
224
for (p = data; p < data + size; p = next_line(p, data + size)) {
225
if (name_matches(p, data + size, name)) {
228
226
int namelen = strcspn(p, ":");
230
if ('/' == p[0]) { /* old style deps - absolute path */
231
*filename = malloc(namelen + strlen(basedir)+2);
232
if (strlen(basedir)) {
233
sprintf(*filename, "%s/", basedir);
234
memcpy(*filename+strlen(basedir)+1,p,
237
+strlen(basedir)+1] = '\0';
239
memcpy(*filename,p,namelen);
240
(*filename)[namelen] = '\0';
231
dir = basedir; /* old style deps - abs. path */
233
dir = moddir; /* new style - relative path */
236
nofail_asprintf(&filename, "%s/%s", dir, p);
237
filename[namelen + strlen(dir) + 1] = '\0';
243
*filename = malloc(namelen + strlen(moddir)+2);
244
sprintf(*filename, "%s/", moddir);
245
memcpy(*filename+strlen(moddir)+1, p,namelen);
246
(*filename)[namelen+strlen(moddir)+1] ='\0';
239
filename = strndup(p, namelen);
248
release_file(data, *size);
249
data = grab_file(*filename, size);
252
"modinfo: could not open %s: %s\n",
241
release_file(data, size);
242
module = grab_elf_file(filename);
244
error("modinfo: could not open %s: %s\n",
253
245
*filename, strerror(errno));
257
release_file(data, *size);
258
fprintf(stderr, "modinfo: could not find module %s\n", name);
250
release_file(data, size);
251
error("modinfo: could not find module %s\n", name);
307
301
for (opt = optind; opt < argc; opt++) {
309
unsigned long modulesize;
302
struct string_table *tags;
303
struct elf_file *mod;
312
mod = grab_module(argv[opt], &modulesize, &filename,
305
mod = grab_module(argv[opt], kernel, basedir);
319
info = get_section(mod, modulesize, ".modinfo", &infosize);
321
release_file(mod, modulesize);
310
tags = mod->ops->load_strings(mod, ".modinfo", NULL, error);
312
release_elf_file(mod);
326
print_tag(field, info, infosize, filename, sep);
316
print_tag(field, tags, mod->pathname, sep);
328
print_all(info, infosize, filename, sep);
329
release_file(mod, modulesize);
318
print_all(tags, mod->pathname, sep);
320
release_elf_file(mod);