Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 // | 4 // |
| 5 // Utility for manipulating firmware screen block (BMPBLOCK) in GBB. | 5 // Utility for manipulating firmware screen block (BMPBLOCK) in GBB. |
| 6 // | 6 // |
| 7 | 7 |
| 8 #include "bmpblk_utility.h" | 8 #include "bmpblk_utility.h" |
| 9 | 9 |
| 10 #include <assert.h> | 10 #include <assert.h> |
| (...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 475 if (r != 1) { | 475 if (r != 1) { |
| 476 perror(filename); | 476 perror(filename); |
| 477 exit(errno); | 477 exit(errno); |
| 478 } | 478 } |
| 479 } | 479 } |
| 480 | 480 |
| 481 } // namespace vboot_reference | 481 } // namespace vboot_reference |
| 482 | 482 |
| 483 #ifdef WITH_UTIL_MAIN | 483 #ifdef WITH_UTIL_MAIN |
| 484 | 484 |
| 485 /////////////////////////////////////////////////////////////////////// | 485 ////////////////////////////////////////////////////////////////////////////// |
| 486 // Command line utilities | 486 // Command line utilities. |
| 487 | |
| 488 extern "C" { | |
| 489 #include "bmpblk_util.h" | |
| 490 } | |
| 487 | 491 |
| 488 using vboot_reference::BmpBlockUtil; | 492 using vboot_reference::BmpBlockUtil; |
| 489 | 493 |
| 490 // utility function: provide usage of this utility and exit. | 494 // utility function: provide usage of this utility and exit. |
| 491 static void usagehelp_exit(const char *prog_name) { | 495 static void usagehelp_exit(const char *prog_name) { |
| 492 printf( | 496 printf( |
| 493 "Utility to manage firmware screen block (BMPBLOCK)\n" | |
| 494 "Usage: %s -c|-l|-x [options] BMPBLOCK_FILE\n" | |
| 495 "\n" | 497 "\n" |
| 496 "Main Operation Mode:\n" | 498 "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
| |
| 497 " -c, --create Create a new BMPBLOCK file. Should specify --config.\n" | |
| 498 " -l, --list List the contents of a BMPBLOCK file.\n" | |
| 499 " -x, --extract Extract embedded images and config file from a BMPBLOCK\n" | |
| 500 " file.\n" | |
| 501 "\n" | 499 "\n" |
| 502 "Other Options:\n" | 500 " %s [-z NUM] -c YAML BMPBLOCK\n" |
| 503 " -C, --config=CONFIG_FILE Config file describing screen layouts and\n" | |
| 504 " embedded images. (default: bmpblk.cfg)\n" | |
| 505 "\n" | 501 "\n" |
| 506 "Example:\n" | 502 " -z NUM = compression algorithm to use\n" |
| 507 " %s --create --config=screens.cfg bmpblk.bin\n" | 503 " 0 = none\n" |
| 508 , prog_name, prog_name); | 504 " 1 = EFIv1\n" |
| 505 " 2 = TBD\n" | |
| 506 "\n", prog_name); | |
| 507 printf( | |
| 508 "To display the contents of a BMPBLOCK:\n" | |
| 509 "\n" | |
| 510 " %s BMPBLOCK\n" | |
| 511 "\n", prog_name); | |
| 512 printf( | |
| 513 "To unpack a BMPBLOCK file:\n" | |
| 514 "\n" | |
| 515 " %s -x [-d DIR] [-f] BMPBLOCK\n" | |
| 516 "\n" | |
| 517 " -d DIR = directory to use (default '.')\n" | |
| 518 " -f = force overwriting existing files\n" | |
| 519 "\n", prog_name); | |
| 509 exit(1); | 520 exit(1); |
| 510 } | 521 } |
| 511 | 522 |
| 512 /////////////////////////////////////////////////////////////////////// | 523 /////////////////////////////////////////////////////////////////////// |
| 513 // main | 524 // main |
| 514 | 525 |
| 515 int main(int argc, char *argv[]) { | 526 int main(int argc, char *argv[]) { |
| 516 const char *prog_name = argv[0]; | |
| 517 BmpBlockUtil util; | |
| 518 | 527 |
| 519 struct BmpBlockUtilOptions { | 528 const char *prog_name = strrchr(argv[0], '/'); |
| 520 bool create_mode, list_mode, extract_mode; | 529 if (prog_name) |
| 521 string config_fn, bmpblock_fn; | 530 prog_name++; |
| 522 } options; | 531 else |
| 532 prog_name = argv[0]; | |
| 523 | 533 |
| 524 int longindex, opt; | 534 int force = 0, extract_mode = 0; |
| 525 static struct option longopts[] = { | 535 int compression = 0; |
| 526 {"create", 0, NULL, 'c'}, | 536 const char *config_fn = 0, *bmpblock_fn = 0, *extract_dir = "."; |
| 527 {"list", 0, NULL, 'l'}, | |
| 528 {"extract", 0, NULL, 'x'}, | |
| 529 {"config", 1, NULL, 'C'}, | |
| 530 { NULL, 0, NULL, 0 }, | |
| 531 }; | |
| 532 | 537 |
| 533 while ((opt = getopt_long(argc, argv, "clxC:", longopts, &longindex)) >= 0) { | 538 int opt; |
| 539 opterr = 0; // quiet | |
| 540 int errorcnt = 0; | |
| 541 char *e = 0; | |
| 542 while ((opt = getopt(argc, argv, ":c:xz:fd:")) != -1) { | |
| 534 switch (opt) { | 543 switch (opt) { |
| 535 case 'c': | 544 case 'c': |
| 536 options.create_mode = true; | 545 config_fn = optarg; |
| 537 break; | 546 break; |
| 538 case 'l': | 547 case 'x': |
| 539 options.list_mode = true; | 548 extract_mode = 1; |
| 540 break; | 549 break; |
| 541 case 'x': | 550 case 'z': |
| 542 options.extract_mode = true; | 551 compression = (int)strtoul(optarg, &e, 0); |
| 543 break; | 552 if (!*optarg || (e && *e)) { |
| 544 case 'C': | 553 fprintf(stderr, "%s: invalid argument to -%c: \"%s\"\n", |
| 545 options.config_fn = optarg; | 554 prog_name, opt, optarg); |
| 546 break; | 555 errorcnt++; |
| 547 default: | 556 } |
| 548 case '?': | 557 if (compression >= MAX_COMPRESS) { |
| 549 usagehelp_exit(prog_name); | 558 fprintf(stderr, "%s: compression type must be less than %d\n", |
| 550 break; | 559 prog_name, compression); |
| 560 errorcnt++; | |
| 561 } | |
| 562 break; | |
| 563 case 'f': | |
| 564 force = 1; | |
| 565 break; | |
| 566 case 'd': | |
| 567 extract_dir= optarg; | |
| 568 break; | |
| 569 case ':': | |
| 570 fprintf(stderr, "%s: missing argument to -%c\n", | |
| 571 prog_name, optopt); | |
| 572 errorcnt++; | |
| 573 break; | |
| 574 default: | |
| 575 fprintf(stderr, "%s: unrecognized switch: -%c\n", | |
| 576 prog_name, optopt); | |
| 577 errorcnt++; | |
| 578 break; | |
| 551 } | 579 } |
| 552 } | 580 } |
| 553 argc -= optind; | 581 argc -= optind; |
| 554 argv += optind; | 582 argv += optind; |
| 555 | 583 |
| 556 if (argc == 1) { | 584 if (argc >= 1) { |
| 557 options.bmpblock_fn = argv[0]; | 585 bmpblock_fn = argv[0]; |
| 558 } else { | 586 } else { |
| 559 usagehelp_exit(prog_name); | 587 fprintf(stderr, "%s: missing BMPBLOCK name\n", prog_name); |
| 588 errorcnt++; | |
| 560 } | 589 } |
| 561 | 590 |
| 562 if (options.create_mode) { | 591 if (errorcnt) |
| 563 util.load_from_config(options.config_fn.c_str()); | 592 usagehelp_exit(prog_name); |
| 593 | |
| 594 BmpBlockUtil util; | |
| 595 | |
| 596 if (config_fn) { | |
| 597 printf("compression is %d\n", compression); | |
| 598 util.load_from_config(config_fn); | |
| 564 util.pack_bmpblock(); | 599 util.pack_bmpblock(); |
| 565 util.write_to_bmpblock(options.bmpblock_fn.c_str()); | 600 util.write_to_bmpblock(bmpblock_fn); |
| 566 printf("The BMPBLOCK is sucessfully created in: %s.\n", | 601 printf("The BMPBLOCK is sucessfully created in: %s.\n", |
| 567 options.bmpblock_fn.c_str()); | 602 bmpblock_fn); |
| 568 } | 603 } |
| 569 | 604 |
| 570 if (options.list_mode) { | 605 else if (extract_mode) { |
| 606 return extract_bmpblock(bmpblock_fn, extract_dir, force); | |
| 607 printf("extract parts from %s into %s %s overwriting\n", | |
| 608 bmpblock_fn, extract_dir, force ? "with" : "without"); | |
| 609 /* TODO(waihong): Implement the list mode. */ | |
| 610 error("Extract mode hasn't been implemented yet.\n"); | |
| 611 } | |
| 612 | |
| 613 else { | |
| 614 return display_bmpblock(bmpblock_fn); | |
| 615 printf("display content of %s\n", bmpblock_fn); | |
| 571 /* TODO(waihong): Implement the list mode. */ | 616 /* TODO(waihong): Implement the list mode. */ |
| 572 error("List mode hasn't been implemented yet.\n"); | 617 error("List mode hasn't been implemented yet.\n"); |
| 573 } | 618 } |
| 574 | 619 |
| 575 if (options.extract_mode) { | |
| 576 /* TODO(waihong): Implement the extract mode. */ | |
| 577 error("Extract mode hasn't been implemented yet.\n"); | |
| 578 } | |
| 579 | |
| 580 return 0; | 620 return 0; |
| 581 } | 621 } |
| 582 | 622 |
| 583 #endif // WITH_UTIL_MAIN | 623 #endif // WITH_UTIL_MAIN |
| OLD | NEW |