summaryrefslogtreecommitdiff
path: root/futility/cmd_show.c
diff options
context:
space:
mode:
authorBill Richardson <wfrichar@chromium.org>2015-03-26 16:29:10 -0700
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2015-03-31 06:28:14 +0000
commit453ecd19560af8efe3e518ba745dc6e8bfecac90 (patch)
treeb9f9e2f3f59e9a90c69d989cd9c853ec60e1a8b3 /futility/cmd_show.c
parent6ea2f72d0356a73915b736a5ef3498ac06a50770 (diff)
downloadvboot-453ecd19560af8efe3e518ba745dc6e8bfecac90.tar.gz
futility: add --type arg to show and sign commands
This allows the user to manually specify the type of an input file, since not all file types can be reliably identified. This also adds a test to ensure that futility doesn't coredump if you give it the wrong type (although I'm sure it's not exhaustive). BUG=chromium:231574 BRANCH=none TEST=make runtests Signed-off-by: Bill Richardson <wfrichar@chromium.org> Change-Id: I9d909305d9989fe7299e744c585de380109cf8cd Reviewed-on: https://chromium-review.googlesource.com/262895 Reviewed-by: Randall Spangler <rspangler@chromium.org>
Diffstat (limited to 'futility/cmd_show.c')
-rw-r--r--futility/cmd_show.c34
1 files changed, 29 insertions, 5 deletions
diff --git a/futility/cmd_show.c b/futility/cmd_show.c
index 661aef2b..f00f2224 100644
--- a/futility/cmd_show.c
+++ b/futility/cmd_show.c
@@ -39,8 +39,10 @@ static struct local_data_s {
uint32_t padding;
int strict;
int t_flag;
+ enum futil_file_type type;
} option = {
.padding = 65536,
+ .type = FILE_TYPE_UNKNOWN,
};
/* Stuff for BIOS images. */
@@ -615,6 +617,7 @@ int ft_show_kernel_preamble(const char *name, uint8_t *buf, uint32_t len,
enum no_short_opts {
OPT_PADDING = 1000,
+ OPT_TYPE,
OPT_HELP,
};
@@ -635,6 +638,8 @@ static const char usage[] = "\n"
" Use this public key for validation\n"
" -f|--fv FILE Verify this payload (FW_MAIN_A/B)\n"
" --pad NUM Kernel vblock padding size\n"
+ " --type TYPE Override the detected file type\n"
+ " Use \"--type help\" for a list\n"
"%s"
"\n";
@@ -655,6 +660,7 @@ static const struct option long_opts[] = {
{"publickey", 1, 0, 'k'},
{"fv", 1, 0, 'f'},
{"pad", 1, NULL, OPT_PADDING},
+ {"type", 1, NULL, OPT_TYPE},
{"strict", 0, &option.strict, 1},
{"help", 0, NULL, OPT_HELP},
{NULL, 0, NULL, 0},
@@ -662,7 +668,7 @@ static const struct option long_opts[] = {
static char *short_opts = ":f:k:t";
-static void show_type(char *filename)
+static int show_type(char *filename)
{
enum futil_file_err err;
enum futil_file_type type;
@@ -670,7 +676,8 @@ static void show_type(char *filename)
switch (err) {
case FILE_ERR_NONE:
printf("%s:\t%s\n", filename, futil_file_type_name(type));
- break;
+ /* Only our recognized types return success */
+ return 0;
case FILE_ERR_DIR:
printf("%s:\t%s\n", filename, "directory");
break;
@@ -686,6 +693,8 @@ static void show_type(char *filename)
default:
break;
}
+ /* Everything else is an error */
+ return 1;
}
static int do_show(int argc, char *argv[])
@@ -693,10 +702,11 @@ static int do_show(int argc, char *argv[])
char *infile = 0;
int ifd, i;
int errorcnt = 0;
- enum futil_file_type type;
uint8_t *buf;
uint32_t len;
char *e = 0;
+ int type_override = 0;
+ enum futil_file_type type;
opterr = 0; /* quiet, you */
while ((i = getopt_long(argc, argv, short_opts, long_opts, 0)) != -1) {
@@ -727,6 +737,16 @@ static int do_show(int argc, char *argv[])
errorcnt++;
}
break;
+ case OPT_TYPE:
+ if (!futil_str_to_file_type(optarg, &option.type)) {
+ if (!strcasecmp("help", optarg))
+ print_file_types_and_exit(errorcnt);
+ fprintf(stderr,
+ "Invalid --type \"%s\"\n", optarg);
+ errorcnt++;
+ }
+ type_override = 1;
+ break;
case OPT_HELP:
print_help(argc, argv);
return !!errorcnt;
@@ -763,7 +783,7 @@ static int do_show(int argc, char *argv[])
if (option.t_flag) {
for (i = optind; i < argc; i++)
- show_type(argv[i]);
+ errorcnt += show_type(argv[i]);
goto done;
}
@@ -782,7 +802,11 @@ static int do_show(int argc, char *argv[])
goto boo;
}
- type = futil_file_type_buf(buf, len);
+ /* Allow the user to override the type */
+ if (type_override)
+ type = option.type;
+ else
+ type = futil_file_type_buf(buf, len);
errorcnt += futil_file_type_show(type, infile, buf, len);