OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2010 Google Inc. | 2 * Copyright (C) 2010 Google Inc. |
3 * | 3 * |
4 * This program is free software; you can redistribute it and/or | 4 * This program is free software; you can redistribute it and/or |
5 * modify it under the terms of the GNU General Public License | 5 * modify it under the terms of the GNU General Public License |
6 * as published by the Free Software Foundation; either version 2 | 6 * as published by the Free Software Foundation; either version 2 |
7 * of the License, or (at your option) any later version. | 7 * of the License, or (at your option) any later version. |
8 * | 8 * |
9 * This program is distributed in the hope that it will be useful, | 9 * This program is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 530 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
541 printf("Usage: %s [OPTION] ...\n", progname); | 541 printf("Usage: %s [OPTION] ...\n", progname); |
542 printf(" OPTIONs include:\n"); | 542 printf(" OPTIONs include:\n"); |
543 printf(" -h This help page and version.\n"); | 543 printf(" -h This help page and version.\n"); |
544 printf(" -f <filename> The output file name.\n"); | 544 printf(" -f <filename> The output file name.\n"); |
545 printf(" -E <address> EPS base address (default:0x240000).\n"); | 545 printf(" -E <address> EPS base address (default:0x240000).\n"); |
546 printf(" -s <key=value> To add/change a string value.\n"); | 546 printf(" -s <key=value> To add/change a string value.\n"); |
547 printf(" -p <pad length> Pad if length is shorter.\n"); | 547 printf(" -p <pad length> Pad if length is shorter.\n"); |
548 printf(" -i <partition> Specify VPD partition name in fmap.\n"); | 548 printf(" -i <partition> Specify VPD partition name in fmap.\n"); |
549 printf(" -l List content in the file.\n"); | 549 printf(" -l List content in the file.\n"); |
550 printf(" -O Overwrite and re-format VPD partition.\n"); | 550 printf(" -O Overwrite and re-format VPD partition.\n"); |
| 551 printf(" -g <key> Print value string only.\n"); |
551 printf("\n"); | 552 printf("\n"); |
552 } | 553 } |
553 | 554 |
554 int main(int argc, char *argv[]) { | 555 int main(int argc, char *argv[]) { |
555 int opt; | 556 int opt; |
556 int option_index = 0; | 557 int option_index = 0; |
557 int retval = 0; | 558 int retval = 0; |
558 const char *optstring = "hf:E:s:p:i:lO"; | 559 const char *optstring = "hf:E:s:p:i:lOg:"; |
559 static struct option long_options[] = { | 560 static struct option long_options[] = { |
560 {"help", 0, 0, 'h'}, | 561 {"help", 0, 0, 'h'}, |
561 {"file", 0, 0, 'f'}, | 562 {"file", 0, 0, 'f'}, |
562 {"epsbase", 0, 0, 'E'}, | 563 {"epsbase", 0, 0, 'E'}, |
563 {"string", 0, 0, 's'}, | 564 {"string", 0, 0, 's'}, |
564 {"pad", 0, 0, 'p'}, | 565 {"pad", 0, 0, 'p'}, |
565 {"partition", 0, 0, 'i'}, | 566 {"partition", 0, 0, 'i'}, |
566 {"list", 0, 0, 'l'}, | 567 {"list", 0, 0, 'l'}, |
567 {"overwrite", 0, 0, 'O'}, | 568 {"overwrite", 0, 0, 'O'}, |
| 569 {"filter", 0, 0, 'g'}, |
568 {0, 0, 0, 0} | 570 {0, 0, 0, 0} |
569 }; | 571 }; |
570 char *filename = NULL; | 572 char *filename = NULL; |
| 573 char *filter_str = NULL; |
571 int write_back_to_flash = 0; | 574 int write_back_to_flash = 0; |
572 int list_it = 0; | 575 int list_it = 0; |
573 int overwrite_it = 0; | 576 int overwrite_it = 0; |
574 int modified = 0; | 577 int modified = 0; |
575 int fd; | 578 int fd; |
576 | 579 |
577 initContainer(&file); | 580 initContainer(&file); |
578 initContainer(&argument); | 581 initContainer(&argument); |
579 | 582 |
580 while ((opt = getopt_long(argc, argv, optstring, | 583 while ((opt = getopt_long(argc, argv, optstring, |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
633 case 'l': | 636 case 'l': |
634 list_it = 1; | 637 list_it = 1; |
635 break; | 638 break; |
636 | 639 |
637 case 'O': | 640 case 'O': |
638 overwrite_it = 1; | 641 overwrite_it = 1; |
639 modified = 1; /* This option forces to write empty data back even | 642 modified = 1; /* This option forces to write empty data back even |
640 * no new pair is given. */ | 643 * no new pair is given. */ |
641 break; | 644 break; |
642 | 645 |
| 646 case 'g': |
| 647 filter_str = strdup(optarg); |
| 648 break; |
| 649 |
643 default: | 650 default: |
644 fprintf(stderr, "Invalid option, use --help for usage.\n"); | 651 fprintf(stderr, "Invalid option (%s), use --help for usage.\n", optarg); |
645 retval = 1; | 652 retval = 1; |
646 goto teardown; | 653 goto teardown; |
647 break; | 654 break; |
648 } | 655 } |
649 } | 656 } |
650 | 657 |
651 if (optind < argc) { | 658 if (optind < argc) { |
652 fprintf(stderr, "[ERROR] unexpected argument: %s\n\n", argv[optind]); | 659 fprintf(stderr, "[ERROR] unexpected argument: %s\n\n", argv[optind]); |
653 usage(argv[0]); | 660 usage(argv[0]); |
654 retval = 1; | 661 retval = 1; |
655 goto teardown; | 662 goto teardown; |
656 } | 663 } |
657 | 664 |
658 if (generateTempFilenames() < 0) { | 665 if (generateTempFilenames() < 0) { |
| 666 fprintf(stderr, "[ERROR] generateTempFilenames() returns failed.\n"); |
659 retval = 1; | 667 retval = 1; |
660 goto teardown; | 668 goto teardown; |
661 } | 669 } |
| 670 |
| 671 if (list_it && filter_str) { |
| 672 fprintf(stderr, "[ERROR] -l and -g must be mutually exclusive.\n"); |
| 673 retval = 1; |
| 674 goto teardown; |
| 675 } |
662 | 676 |
663 /* to avoid malicious attack, we replace suspicious chars. */ | 677 /* to avoid malicious attack, we replace suspicious chars. */ |
664 fmapNormalizeAreaName(fmap_vpd_area_name); | 678 fmapNormalizeAreaName(fmap_vpd_area_name); |
665 | 679 |
666 /* if no filename is specified, call flashrom to read from flash. */ | 680 /* if no filename is specified, call flashrom to read from flash. */ |
667 if (!filename) { | 681 if (!filename) { |
668 if (FLASHROM_OK != flashromRead(tmp_part_file, tmp_full_file, | 682 if (FLASHROM_OK != flashromRead(tmp_part_file, tmp_full_file, |
669 fmap_vpd_area_name)) { | 683 fmap_vpd_area_name)) { |
670 fprintf(stderr, "flashromRead() error!\n"); | 684 fprintf(stderr, "flashromRead() error!\n"); |
671 retval = 1; | 685 retval = 1; |
672 goto teardown; | 686 goto teardown; |
673 } | 687 } |
674 write_back_to_flash = 1; | 688 write_back_to_flash = 1; |
675 filename = strdup(tmp_part_file); | 689 filename = strdup(tmp_part_file); |
676 } | 690 } |
677 | 691 |
678 if (retval = loadFile(filename, &file, overwrite_it)) { | 692 if (retval = loadFile(filename, &file, overwrite_it)) { |
679 fprintf(stderr, "loadFile('%s') error.\n", filename); | 693 fprintf(stderr, "loadFile('%s') error.\n", filename); |
680 goto teardown; | 694 goto teardown; |
681 } | 695 } |
682 | 696 |
683 mergeContainer(&file, &argument); | 697 mergeContainer(&file, &argument); |
684 | 698 |
685 if (list_it) { | 699 if (list_it || filter_str) { |
686 /* Reserve larger size because the exporting generates longer string than | 700 /* Reserve larger size because the exporting generates longer string than |
687 * the encoded data. */ | 701 * the encoded data. */ |
688 uint8_t list_buf[BUF_LEN * 2]; | 702 uint8_t list_buf[BUF_LEN * 2]; |
689 int list_len = 0; | 703 int list_len = 0; |
690 | 704 |
691 if (VPD_OK != exportContainer(VPD_EXPORT_KEY_VALUE, &file, | 705 if (filter_str) setContainerFilter(&file, filter_str); |
692 sizeof(list_buf), list_buf, &list_len)) { | 706 if (VPD_OK != exportContainer( |
| 707 (filter_str) ? VPD_EXPORT_VALUE : VPD_EXPORT_KEY_VALUE, |
| 708 &file, sizeof(list_buf), list_buf, &list_len)) { |
693 fprintf(stderr, "exportContainer(): Cannot generate string.\n"); | 709 fprintf(stderr, "exportContainer(): Cannot generate string.\n"); |
694 retval = 1; | 710 retval = 1; |
695 goto teardown; | 711 goto teardown; |
696 } | 712 } |
697 printf("%s", list_buf); | 713 printf("%s", list_buf); |
698 } | 714 } |
699 | 715 |
700 if (modified) { | 716 if (modified) { |
701 if (retval = saveFile(&file, filename)) { | 717 if (retval = saveFile(&file, filename)) { |
702 fprintf(stderr, "saveFile('%s') error.\n", filename); | 718 fprintf(stderr, "saveFile('%s') error.\n", filename); |
703 goto teardown; | 719 goto teardown; |
704 } | 720 } |
705 | 721 |
706 if (write_back_to_flash) { | 722 if (write_back_to_flash) { |
707 if (FLASHROM_OK != flashromPartialWrite(filename, tmp_full_file, | 723 if (FLASHROM_OK != flashromPartialWrite(filename, tmp_full_file, |
708 fmap_vpd_area_name)) { | 724 fmap_vpd_area_name)) { |
709 fprintf(stderr, "flashromPartialWrite() error.\n"); | 725 fprintf(stderr, "flashromPartialWrite() error.\n"); |
710 retval = 1; | 726 retval = 1; |
711 goto teardown; | 727 goto teardown; |
712 } | 728 } |
713 } | 729 } |
714 } | 730 } |
715 | 731 |
716 teardown: | 732 teardown: |
717 if (spd_data) free(spd_data); | 733 if (spd_data) free(spd_data); |
718 if (filename) free(filename); | 734 if (filename) free(filename); |
| 735 if (filter_str) free(filter_str); |
719 destroyContainer(&file); | 736 destroyContainer(&file); |
720 destroyContainer(&argument); | 737 destroyContainer(&argument); |
721 | 738 |
722 return retval; | 739 return retval; |
723 } | 740 } |
OLD | NEW |