aboutsummaryrefslogtreecommitdiff
path: root/toys/other
diff options
context:
space:
mode:
Diffstat (limited to 'toys/other')
-rw-r--r--toys/other/modinfo.c67
1 files changed, 30 insertions, 37 deletions
diff --git a/toys/other/modinfo.c b/toys/other/modinfo.c
index 286570f1..6c1e9392 100644
--- a/toys/other/modinfo.c
+++ b/toys/other/modinfo.c
@@ -40,16 +40,16 @@ static void output_field(char *field, char *value)
static void modinfo_file(char *full_name)
{
- int fd, len, i;
- char *buf = 0, *pos, *modinfo_tags[] = {
- "alias", "license", "description", "author", "firmware",
- "vermagic", "srcversion", "intree", "depends", "parm",
- "parmtype",
+ int fd, flen, i;
+ char *buf = 0, *end, *modinfo_tags[] = {
+ "license", "author", "description", "firmware", "alias", "srcversion",
+ "depends", "retpoline", "intree", "name", "vermagic", "parm", "parmtype",
};
if (-1 != (fd = open(full_name, O_RDONLY))) {
- len = fdlength(fd);
- buf = xmmap(0, len, PROT_READ, MAP_SHARED, fd, 0);
+ flen = fdlength(fd);
+ buf = xmmap(0, flen, PROT_READ, MAP_SHARED, fd, 0);
+ end = buf + flen;
close(fd);
}
@@ -61,47 +61,42 @@ static void modinfo_file(char *full_name)
TT.count++;
output_field("filename", full_name);
- for (pos = buf; pos < buf+len; pos++) {
- if (*pos) continue;
+ for (i=0; i<ARRAY_LEN(modinfo_tags); i++) {
+ char *field = modinfo_tags[i], *p = buf;
+ int slen = sprintf(toybuf, "%s=", field);
- for (i=0; i<ARRAY_LEN(modinfo_tags); i++) {
- char *str = modinfo_tags[i];
- int len = strlen(str);
-
- if (!strncmp(pos+1, str, len) && pos[len+1] == '=')
- output_field(str, pos+len+2);
+ while (p && p < end) {
+ p = memmem(p, end-p, toybuf, slen);
+ if (p) output_field(field, p += slen);
}
}
- munmap(buf, len);
+ munmap(buf, flen);
}
static int check_module(struct dirtree *new)
{
- if (!dirtree_notdotdot(new)) return 0;
+ char *s;
+ int len;
- if (S_ISREG(new->st.st_mode)) {
- char *s;
-
- for (s = toys.optargs[TT.mod]; *s; s++) {
- int len = 0;
+ if (!dirtree_notdotdot(new)) return 0;
- // The kernel treats - and _ the same, so we should too.
- for (len = 0; s[len]; len++) {
- if (s[len] == '-' && new->name[len] == '_') continue;
- if (s[len] == '_' && new->name[len] == '-') continue;
- if (s[len] != new->name[len]) break;
- }
- if (s[len] || strcmp(new->name+len, ".ko")) break;
+ if (!S_ISREG(new->st.st_mode)) return DIRTREE_RECURSE;
- modinfo_file(s = dirtree_path(new, 0));
- free(s);
+ s = toys.optargs[TT.mod];
- return DIRTREE_ABORT;
- }
+ // The kernel treats - and _ the same, so we should too.
+ for (len = 0; s[len]; len++) {
+ if (s[len] == '-' && new->name[len] == '_') continue;
+ if (s[len] == '_' && new->name[len] == '-') continue;
+ if (s[len] != new->name[len]) break;
}
+ if (s[len] || strcmp(new->name+len, ".ko")) return DIRTREE_RECURSE;
+
+ modinfo_file(s = dirtree_path(new, 0));
+ free(s);
- return DIRTREE_RECURSE;
+ return DIRTREE_ABORT;
}
void modinfo_main(void)
@@ -120,9 +115,7 @@ void modinfo_main(void)
}
for (TT.mod = 0; TT.mod<toys.optc; TT.mod++) {
- char *s = strstr(toys.optargs[TT.mod], ".ko");
-
- if (s && !s[3]) modinfo_file(toys.optargs[TT.mod]);
+ if (strend(toys.optargs[TT.mod], ".ko")) modinfo_file(toys.optargs[TT.mod]);
else {
char *path = xmprintf("%s/lib/modules/%s", TT.b, TT.k);