static struct cmdline_args cmdargs;
+/* check whether file will be listed/extracted from */
+static int file_ok(const struct file *f)
+{
+ return !(f->flags & FW_FLAG_UNSUPPORTED) || cmdargs.unsupported;
+}
+
/* Convert a CPU-endian 16bit integer to Big-Endian */
static be16_t to_be16(uint16_t v)
{
exit(255);
}
- if (!cmdargs.identify_only)
+ if (cmdargs.mode == FWCM_EXTRACT)
write_file(extract->name, buf, data_length, &hdr, flags);
free(buf);
"<MD5 checksum>\n\n");
/* print for legacy driver first */
for (i = 0; i < FILES; i++)
- if (!(files[i].flags & FW_FLAG_V4))
+ if (file_ok(&files[i]) && !(files[i].flags & FW_FLAG_V4))
print_file(&files[i]);
for (i = 0; i < FILES; i++)
- if (files[i].flags & FW_FLAG_V4)
+ if (file_ok(&files[i]) && files[i].flags & FW_FLAG_V4)
print_file(&files[i]);
printf("\n");
}
signature[12], signature[13], signature[14], signature[15]);
for (i = 0; i < FILES; ++i) {
- if (strcasecmp(md5sig, files[i].md5) == 0) {
+ if (file_ok(&files[i]) &&
+ strcasecmp(md5sig, files[i].md5) == 0) {
printf("This file is recognised as:\n");
printf(" filename : %s\n", files[i].name);
printf(" version : %s\n", files[i].ucode_version);
{
print_banner();
printf("\nUsage: %s [OPTION] [driver.sys]\n", argv[0]);
+ printf(" --unsupported "
+ "Allow working on extractable but unsupported drivers\n");
printf(" -l|--list "
"List supported driver versions\n");
printf(" -i|--identify "
for (i = 1; i < argc; i++) {
res = cmp_arg(argv, &i, "--list", "-l", 0);
if (res == ARG_MATCH) {
- print_supported_files();
- return 1;
+ cmdargs.mode = FWCM_LIST;
+ continue;
} else if (res == ARG_ERROR)
goto out;
res = cmp_arg(argv, &i, "--identify", "-i", 0);
if (res == ARG_MATCH) {
- cmdargs.identify_only = 1;
+ cmdargs.mode = FWCM_IDENTIFY;
+ continue;
+ } else if (res == ARG_ERROR)
+ goto out;
+
+ res = cmp_arg(argv, &i, "--unsupported", NULL, 0);
+ if (res == ARG_MATCH) {
+ cmdargs.unsupported = 1;
continue;
} else if (res == ARG_ERROR)
goto out;
break;
}
- if (!cmdargs.infile)
+ if (!cmdargs.infile && cmdargs.mode != FWCM_LIST)
goto out_usage;
return 0;
else if (err != 0)
return err;
+ if (cmdargs.mode == FWCM_LIST) {
+ print_supported_files();
+ return 0;
+ }
+
fd = fopen(cmdargs.infile, "rb");
if (!fd) {
fprintf(stderr, "Cannot open input file %s\n", cmdargs.infile);
extract = file->extract;
while (extract->name) {
printf("%s %s/%s.fw\n",
- cmdargs.identify_only ? "Contains" : "Extracting",
+ cmdargs.mode == FWCM_IDENTIFY ? "Contains" : "Extracting",
dir, extract->name);
extract_or_identify(fd, extract, file->flags);
extract++;