--- module-init-tools/modinfo.c.alt-modinfo-legacy 2004-08-11 05:32:18 +0400 +++ module-init-tools/modinfo.c 2005-01-06 20:27:06 +0300 @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include "zlibsupport.h" @@ -115,9 +116,128 @@ static const char *next_string(const cha return string; } +static const char *find_tag(const char *tag, const char *info, + unsigned long size) +{ + unsigned int taglen = strlen(tag); + + for (; info; info = next_string(info, &size)) + if (strncmp(info, tag, taglen) == 0 && info[taglen] == '=') + return info; + + return NULL; +} + +static void print_legacy_parm(const char *parm_tag, const char *info, + unsigned long size) +{ + const char *desc; + char *p, *eq, *desc_tag_name, *parm_name; + unsigned int name_len; + unsigned int min = 1, max = 1; + + eq = strchr(parm_tag, '='); + if (!eq) + return; + if (eq - parm_tag < sizeof("parm_") - 1) + return; + parm_tag += sizeof("parm_") - 1; + name_len = eq - parm_tag; + + desc_tag_name = alloca(name_len + sizeof("parm_desc_")); + strcpy(desc_tag_name, "parm_desc_"); + parm_name = desc_tag_name + sizeof("parm_desc_") - 1; + memcpy(parm_name, parm_tag, name_len); + parm_name[name_len] = '\0'; + printf("%s:", parm_name); + + p = eq + 1; + if (isdigit(*p)) { + min = strtoul(p, &p, 10); + if (*p == '-') + max = strtoul(p + 1, &p, 10); + else + max = min; + } + + switch (*p) { + case 'c': + printf("char"); + if (!isdigit(p[1])) + printf(" *** missing string size ***"); + else { + while (isdigit(p[1])) + ++p; + } + break; + + case 'b': + printf("byte"); + break; + case 'h': + printf("short"); + break; + case 'i': + printf("int"); + break; + case 'l': + printf("long"); + break; + case 's': + printf("string"); + break; + case '\0': + printf("no format character"); + return; + default: + printf("unknown format character '%c'", *p); + return; + } + + switch (*++p) { + case 'p': + printf(" persistent"); + if (p[-1] == 's') + printf(" (invalid)"); + break; + case '\0': + break; + default: + printf(" unknown format modifier '%c'", *p); + break; + } + + if (min > 1 || max > 1) + printf(" array (min = %u, max = %u%s)", min, max, + (max < min) ? " [invalid]" : ""); + + desc = find_tag(desc_tag_name, info, size); + if (desc) { + eq = strchr(desc, '='); + if (eq) + printf(": %s", eq + 1); + } +} + +static void print_all_legacy_parms(const char *info, unsigned long size, + char sep) +{ + const char *saved_info = info; + unsigned long saved_size = size; + + for (; info; info = next_string(info, &size)) { + if (strncmp(info, "parm_", 5) == 0 + && strncmp(info, "parm_desc_", 10) != 0) { + print_legacy_parm(info, saved_info, saved_size); + putchar(sep); + } + } +} + static void print_tag(const char *tag, const char *info, unsigned long size, const char *filename, char sep) { + int legacy_mode = find_tag("vermagic", info, size) == NULL; unsigned int taglen = strlen(tag); if (streq(tag, "filename")) { @@ -125,6 +245,11 @@ static void print_tag(const char *tag, c return; } + if (legacy_mode && strcmp(tag, "parm") == 0) { + print_all_legacy_parms(info, size, sep); + return; + } + for (; info; info = next_string(info, &size)) if (strncmp(info, tag, taglen) == 0 && info[taglen] == '=') printf("%s%c", info + taglen + 1, sep); @@ -133,9 +258,44 @@ static void print_tag(const char *tag, c static void print_all(const char *info, unsigned long size, const char *filename, char sep) { + int legacy_mode = find_tag("vermagic", info, size) == NULL; + const char *saved_info = info; + unsigned long saved_size = size; + int found_kernel_version = 0; + int found_using_checksums = 0; + printf("%-16s%s%c", "filename:", filename, sep); for (; info; info = next_string(info, &size)) { char *eq; + + if (legacy_mode) { + /* Old modules had lots of duplicate entries */ + if (strncmp(info, "kernel_version=", + sizeof("kernel_version=") - 1) == 0) { + if (found_kernel_version) + continue; + found_kernel_version = 1; + } + if (strncmp(info, "using_checksums=", + sizeof("using_checksums=") - 1) == 0) { + if (found_using_checksums) + continue; + found_using_checksums = 1; + } + } + + if (legacy_mode && strncmp(info, "parm_", 5) == 0) { + if (strncmp(info, "parm_desc_", 10) == 0) + continue; + if (!sep) + printf("parm="); + else + printf("%-16s", "parm:"); + print_legacy_parm(info, saved_info, saved_size); + putchar(sep); + continue; + } + if (!sep) { printf("%s%c", info, sep); continue;