diff options
Diffstat (limited to 'utils')
-rw-r--r-- | utils/modlist.c | 83 |
1 files changed, 65 insertions, 18 deletions
diff --git a/utils/modlist.c b/utils/modlist.c index efb768c8c..eb8f6b3a7 100644 --- a/utils/modlist.c +++ b/utils/modlist.c @@ -10,10 +10,19 @@ int main(int argc, char ** argv) { char * modInfoFile = "/boot/module-info"; enum driverMajor major; char * type; + char * mod; struct moduleInfo * list, * m; - int rc; + int rc, i; + int showModInfo = 0; + int ignoreMissing = 0; + struct moduleInfo * mi; struct poptOption optionTable[] = { - { "modinfo", 'm', POPT_ARG_STRING, &modInfoFile, 0 }, + { "ignore-missing", 'I', POPT_ARG_NONE, &ignoreMissing, 0, + "Ignore modules not in modinfo file for --modinfo" }, + { "modinfo", 'm', POPT_ARG_NONE, &showModInfo, 0, + "Give output in module-info file for listed args" }, + { "modinfo-file", 'f', POPT_ARG_STRING, &modInfoFile, 0, + "Module info file to use"}, POPT_AUTOHELP { 0, 0, 0, 0, 0 } }; @@ -32,24 +41,62 @@ int main(int argc, char ** argv) { exit(1); } - while ((type = poptGetArg(optCon))) { - if (!strcasecmp(type, "scsi")) { - major = DRIVER_SCSI; - } else if (!strcasecmp(type, "net")) { - major = DRIVER_NET; - } else if (!strcasecmp(type, "fs")) { - major = DRIVER_FS; - } else if (!strcasecmp(type, "cdrom")) { - major = DRIVER_CDROM; - } else { - fprintf(stderr, "type must be one of scsi, net, fs, cdrom\n"); - exit(1); + if (showModInfo) { + while ((mod = poptGetArg(optCon))) { + mi = isysFindModuleInfo(mod); + if (mi) { + printf("%s\n", mi->moduleName); + switch (mi->major) { + case DRIVER_CDROM: printf("\tcdrom\n"); break; + case DRIVER_SCSI: printf("\tscsi\n"); break; + case DRIVER_FS: printf("\tfs\n"); break; + case DRIVER_NET: + switch (mi->minor) { + case DRIVER_MINOR_ETHERNET: printf("\teth\n"); break; + + default: + fprintf(stderr, "unknown net minor type for %s\n", + mi->moduleName); + exit(1); + } + break; + + default: + fprintf(stderr, "unknown device type for %s\n", + mi->moduleName); + exit(1); + + } + printf("\t\"%s\"\n", mi->description); + for (i = 0; i < mi->numArgs; i++) { + printf("\t%s \"%s\"\n", mi->args[i].arg, + mi->args[i].description); + } + } else if (!ignoreMissing) { + fprintf(stderr, "I know nothing about %s\n", mod); + exit(1); + } } + } else { + while ((type = poptGetArg(optCon))) { + if (!strcasecmp(type, "scsi")) { + major = DRIVER_SCSI; + } else if (!strcasecmp(type, "net")) { + major = DRIVER_NET; + } else if (!strcasecmp(type, "fs")) { + major = DRIVER_FS; + } else if (!strcasecmp(type, "cdrom")) { + major = DRIVER_CDROM; + } else { + fprintf(stderr, "type must be one of scsi, net, fs, cdrom\n"); + exit(1); + } - list = isysGetModuleList(major); - for (m = list; m && m->moduleName; m++) - printf("%s\n", m->moduleName); - free(list); + list = isysGetModuleList(major); + for (m = list; m && m->moduleName; m++) + printf("%s\n", m->moduleName); + free(list); + } } return 0; |