Index: vpd.c |
diff --git a/vpd.c b/vpd.c |
index 90aca8985f4331bc69846e188eaf6e7e57504a70..103d79a5a0a9a8b07bdfe5a6a1b7014676134d39 100644 |
--- a/vpd.c |
+++ b/vpd.c |
@@ -548,6 +548,7 @@ static void usage(const char *progname) { |
printf(" -i <partition> Specify VPD partition name in fmap.\n"); |
printf(" -l List content in the file.\n"); |
printf(" -O Overwrite and re-format VPD partition.\n"); |
+ printf(" -g <key> Print value string only.\n"); |
printf("\n"); |
} |
@@ -555,7 +556,7 @@ int main(int argc, char *argv[]) { |
int opt; |
int option_index = 0; |
int retval = 0; |
- const char *optstring = "hf:E:s:p:i:lO"; |
+ const char *optstring = "hf:E:s:p:i:lOg:"; |
static struct option long_options[] = { |
{"help", 0, 0, 'h'}, |
{"file", 0, 0, 'f'}, |
@@ -565,9 +566,11 @@ int main(int argc, char *argv[]) { |
{"partition", 0, 0, 'i'}, |
{"list", 0, 0, 'l'}, |
{"overwrite", 0, 0, 'O'}, |
+ {"filter", 0, 0, 'g'}, |
{0, 0, 0, 0} |
}; |
char *filename = NULL; |
+ char *filter_str = NULL; |
int write_back_to_flash = 0; |
int list_it = 0; |
int overwrite_it = 0; |
@@ -640,8 +643,12 @@ int main(int argc, char *argv[]) { |
* no new pair is given. */ |
break; |
+ case 'g': |
+ filter_str = strdup(optarg); |
+ break; |
+ |
default: |
- fprintf(stderr, "Invalid option, use --help for usage.\n"); |
+ fprintf(stderr, "Invalid option (%s), use --help for usage.\n", optarg); |
retval = 1; |
goto teardown; |
break; |
@@ -656,6 +663,13 @@ int main(int argc, char *argv[]) { |
} |
if (generateTempFilenames() < 0) { |
+ fprintf(stderr, "[ERROR] generateTempFilenames() returns failed.\n"); |
+ retval = 1; |
+ goto teardown; |
+ } |
+ |
+ if (list_it && filter_str) { |
+ fprintf(stderr, "[ERROR] -l and -g must be mutually exclusive.\n"); |
retval = 1; |
goto teardown; |
} |
@@ -682,14 +696,16 @@ int main(int argc, char *argv[]) { |
mergeContainer(&file, &argument); |
- if (list_it) { |
+ if (list_it || filter_str) { |
/* Reserve larger size because the exporting generates longer string than |
* the encoded data. */ |
uint8_t list_buf[BUF_LEN * 2]; |
int list_len = 0; |
- if (VPD_OK != exportContainer(VPD_EXPORT_KEY_VALUE, &file, |
- sizeof(list_buf), list_buf, &list_len)) { |
+ if (filter_str) setContainerFilter(&file, filter_str); |
+ if (VPD_OK != exportContainer( |
+ (filter_str) ? VPD_EXPORT_VALUE : VPD_EXPORT_KEY_VALUE, |
+ &file, sizeof(list_buf), list_buf, &list_len)) { |
fprintf(stderr, "exportContainer(): Cannot generate string.\n"); |
retval = 1; |
goto teardown; |
@@ -716,6 +732,7 @@ int main(int argc, char *argv[]) { |
teardown: |
if (spd_data) free(spd_data); |
if (filename) free(filename); |
+ if (filter_str) free(filter_str); |
destroyContainer(&file); |
destroyContainer(&argument); |