Index: utility/bmpblk_utility.cc |
diff --git a/utility/bmpblk_utility.cc b/utility/bmpblk_utility.cc |
index 750235cbbd7e6f8afad843573b3a67f0288cae08..600577aaa9efefda4c67c776d9de3d1ebbe7ae84 100644 |
--- a/utility/bmpblk_utility.cc |
+++ b/utility/bmpblk_utility.cc |
@@ -482,30 +482,41 @@ void BmpBlockUtil::write_to_bmpblock(const char *filename) { |
#ifdef WITH_UTIL_MAIN |
-/////////////////////////////////////////////////////////////////////// |
-// Command line utilities |
+////////////////////////////////////////////////////////////////////////////// |
+// Command line utilities. |
+ |
+extern "C" { |
+#include "bmpblk_util.h" |
+} |
using vboot_reference::BmpBlockUtil; |
// utility function: provide usage of this utility and exit. |
static void usagehelp_exit(const char *prog_name) { |
printf( |
- "Utility to manage firmware screen block (BMPBLOCK)\n" |
- "Usage: %s -c|-l|-x [options] BMPBLOCK_FILE\n" |
"\n" |
- "Main Operation Mode:\n" |
- " -c, --create Create a new BMPBLOCK file. Should specify --config.\n" |
- " -l, --list List the contents of a BMPBLOCK file.\n" |
- " -x, --extract Extract embedded images and config file from a BMPBLOCK\n" |
- " file.\n" |
+ "To create a new BMPBLOCK file:\n" |
Randall Spangler
2011/02/10 21:45:10
To create a new BMPBLOCK file using config from YA
|
"\n" |
- "Other Options:\n" |
- " -C, --config=CONFIG_FILE Config file describing screen layouts and\n" |
- " embedded images. (default: bmpblk.cfg)\n" |
+ " %s [-z NUM] -c YAML BMPBLOCK\n" |
+ "\n" |
+ " -z NUM = compression algorithm to use\n" |
+ " 0 = none\n" |
+ " 1 = EFIv1\n" |
+ " 2 = TBD\n" |
+ "\n", prog_name); |
+ printf( |
+ "To display the contents of a BMPBLOCK:\n" |
"\n" |
- "Example:\n" |
- " %s --create --config=screens.cfg bmpblk.bin\n" |
- , prog_name, prog_name); |
+ " %s BMPBLOCK\n" |
+ "\n", prog_name); |
+ printf( |
+ "To unpack a BMPBLOCK file:\n" |
+ "\n" |
+ " %s -x [-d DIR] [-f] BMPBLOCK\n" |
+ "\n" |
+ " -d DIR = directory to use (default '.')\n" |
+ " -f = force overwriting existing files\n" |
+ "\n", prog_name); |
exit(1); |
} |
@@ -513,68 +524,97 @@ static void usagehelp_exit(const char *prog_name) { |
// main |
int main(int argc, char *argv[]) { |
- const char *prog_name = argv[0]; |
- BmpBlockUtil util; |
- struct BmpBlockUtilOptions { |
- bool create_mode, list_mode, extract_mode; |
- string config_fn, bmpblock_fn; |
- } options; |
- |
- int longindex, opt; |
- static struct option longopts[] = { |
- {"create", 0, NULL, 'c'}, |
- {"list", 0, NULL, 'l'}, |
- {"extract", 0, NULL, 'x'}, |
- {"config", 1, NULL, 'C'}, |
- { NULL, 0, NULL, 0 }, |
- }; |
- |
- while ((opt = getopt_long(argc, argv, "clxC:", longopts, &longindex)) >= 0) { |
+ const char *prog_name = strrchr(argv[0], '/'); |
+ if (prog_name) |
+ prog_name++; |
+ else |
+ prog_name = argv[0]; |
+ |
+ int force = 0, extract_mode = 0; |
+ int compression = 0; |
+ const char *config_fn = 0, *bmpblock_fn = 0, *extract_dir = "."; |
+ |
+ int opt; |
+ opterr = 0; // quiet |
+ int errorcnt = 0; |
+ char *e = 0; |
+ while ((opt = getopt(argc, argv, ":c:xz:fd:")) != -1) { |
switch (opt) { |
- case 'c': |
- options.create_mode = true; |
- break; |
- case 'l': |
- options.list_mode = true; |
- break; |
- case 'x': |
- options.extract_mode = true; |
- break; |
- case 'C': |
- options.config_fn = optarg; |
- break; |
- default: |
- case '?': |
- usagehelp_exit(prog_name); |
- break; |
+ case 'c': |
+ config_fn = optarg; |
+ break; |
+ case 'x': |
+ extract_mode = 1; |
+ break; |
+ case 'z': |
+ compression = (int)strtoul(optarg, &e, 0); |
+ if (!*optarg || (e && *e)) { |
+ fprintf(stderr, "%s: invalid argument to -%c: \"%s\"\n", |
+ prog_name, opt, optarg); |
+ errorcnt++; |
+ } |
+ if (compression >= MAX_COMPRESS) { |
+ fprintf(stderr, "%s: compression type must be less than %d\n", |
+ prog_name, compression); |
+ errorcnt++; |
+ } |
+ break; |
+ case 'f': |
+ force = 1; |
+ break; |
+ case 'd': |
+ extract_dir= optarg; |
+ break; |
+ case ':': |
+ fprintf(stderr, "%s: missing argument to -%c\n", |
+ prog_name, optopt); |
+ errorcnt++; |
+ break; |
+ default: |
+ fprintf(stderr, "%s: unrecognized switch: -%c\n", |
+ prog_name, optopt); |
+ errorcnt++; |
+ break; |
} |
} |
argc -= optind; |
argv += optind; |
- if (argc == 1) { |
- options.bmpblock_fn = argv[0]; |
+ if (argc >= 1) { |
+ bmpblock_fn = argv[0]; |
} else { |
- usagehelp_exit(prog_name); |
+ fprintf(stderr, "%s: missing BMPBLOCK name\n", prog_name); |
+ errorcnt++; |
} |
- if (options.create_mode) { |
- util.load_from_config(options.config_fn.c_str()); |
+ if (errorcnt) |
+ usagehelp_exit(prog_name); |
+ |
+ BmpBlockUtil util; |
+ |
+ if (config_fn) { |
+ printf("compression is %d\n", compression); |
+ util.load_from_config(config_fn); |
util.pack_bmpblock(); |
- util.write_to_bmpblock(options.bmpblock_fn.c_str()); |
+ util.write_to_bmpblock(bmpblock_fn); |
printf("The BMPBLOCK is sucessfully created in: %s.\n", |
- options.bmpblock_fn.c_str()); |
+ bmpblock_fn); |
} |
- if (options.list_mode) { |
+ else if (extract_mode) { |
+ return extract_bmpblock(bmpblock_fn, extract_dir, force); |
+ printf("extract parts from %s into %s %s overwriting\n", |
+ bmpblock_fn, extract_dir, force ? "with" : "without"); |
/* TODO(waihong): Implement the list mode. */ |
- error("List mode hasn't been implemented yet.\n"); |
+ error("Extract mode hasn't been implemented yet.\n"); |
} |
- if (options.extract_mode) { |
- /* TODO(waihong): Implement the extract mode. */ |
- error("Extract mode hasn't been implemented yet.\n"); |
+ else { |
+ return display_bmpblock(bmpblock_fn); |
+ printf("display content of %s\n", bmpblock_fn); |
+ /* TODO(waihong): Implement the list mode. */ |
+ error("List mode hasn't been implemented yet.\n"); |
} |
return 0; |