[yocto] [PATCH v2 3/5] rmc: Enable reading the contents of an existing fingerprint file

Jianxun Zhang jianxun.zhang at linux.intel.com
Fri Feb 10 11:21:21 PST 2017


> On Feb 9, 2017, at 11:17 AM, Todor Minchev <todor.minchev at linux.intel.com> wrote:
> 
> The contents of an existing fingerprint file can be read and output on
> the command line with the following options:
> 
> rmc -E -f input_fingerprint_file
> 
> Signed-off-by: Todor Minchev <todor.minchev at linux.intel.com>
> ---
> src/rmc.c | 98 ++++++++++++++++++++++++++++++++++++++++++---------------------
> 1 file changed, 65 insertions(+), 33 deletions(-)
> 
> diff --git a/src/rmc.c b/src/rmc.c
> index 062dd36..f3a2a5e 100644
> --- a/src/rmc.c
> +++ b/src/rmc.c
> @@ -14,43 +14,47 @@
> #include <rmc_api.h>
> 
> #define USAGE "RMC (Runtime Machine configuration) Tool\n" \
> -    "NOTE: Most of usages require root permission (sudo)\n" \
> +    "NOTE: Most of usages require root permission (sudo)\n\n" \
>     "rmc -F [-o output_fingerprint]\n" \
>     "rmc -R [-f <fingerprint file>] -b <blob file list> [-o output_record]\n" \
>     "rmc -D <rmc record file list> [-o output_database]\n" \
> -	"rmc -B <name of file blob> -d <rmc database file> -o output_file\n" \
> -	"\n" \
> -	"-F: generate board rmc fingerprint of board\n" \
> -	"-R: generate board rmc record of board with its fingerprint and file blobs.\n" \
> -    "-f: fingerprint file to be packed in record, rmc will create a fingerprint for board and use it internally to\n" \
> -    "    generate record if -f is missed.\n" \
> -    "-b: files to be packed in record\n" \
> -	"-G: generate rmc database file with records specified in record file list\n" \
> -	"-B: get a flie blob with specified name associated to the board rmc is running on\n" \
> -	"-d: database file to be queried\n" \
> -	"-o: path and name of output file of a specific command\n" \
> -	"\n" \
> -    "Examples (Steps in an order to add board support into rmc):\n" \
> -    "generate board fingerprint:\n" \
> -    "rmc -F\n\n" \
> -    "generate a rmc record for the board with two file blobs, output to:\n" \
> -    "a specified file:\n" \
> -    "rmc -R -f fingerprint -b file_1 file_2 -o my_board.record\n\n" \
> -    "generate a rmc database file with records from 3 different boards:\n" \
> -    "rmc -D board1_record board2_record board3_record\n\n" \
> -    "query a file blob named audio.conf associated to the board rmc is running on in database my_rmc.db and output\n" \
> -    "to /tmp/new_audio.conf:\n" \
> -    "rmc -B audio.conf -d my_rmc.db -o /tmp/new_audio.conf\n\n"
> +    "rmc -B <name of file blob> -d <rmc database file> -o output_file\n\n" \
> +  "-F: manage fingerprint file\n" \
> +    "\t-o output_file: store RMC fingerprint of current board in output_file\n" \
> +  "-R: generate board rmc record of board with its fingerprint and file blobs.\n" \
> +    "\t-f intput_file : input fingerprint file to be packed in record\n\n" \
> +    "\tNOTE: RMC will create a fingerprint for the board and use it to\n" \
> +    "\tgenerate record if an input fingerprint file is not provided.\n\n" \
> +    "\t-b: files to be packed in record\n\n" \
> +  "-G: generate rmc database file with records specified in record file list\n\n" \
> +  "-B: get a file blob with specified name associated to the board rmc is\n" \
> +  "running on\n" \
> +    "\t-d: database file to be queried\n" \
> +    "\t-o: path and name of output file of a specific command\n\n" \
> +  "-E: Extract data from fingerprint file and print it to terminal\n" \
> +    "\t-f: fingerprint file to extract\n\n" \
> +    "Examples (Steps in an order to add board support into rmc):\n\n" \
> +    "1. Generate board fingerprint:\n" \
> +    "\trmc -F\n\n" \
> +    "2. Generate a rmc record for the board with two file blobs and save it\n" \
> +    "to a specified file:\n" \
> +    "\trmc -R -f fingerprint -b file_1 file_2 -o my_board.record\n\n" \
> +    "3. Generate a rmc database file with records from 3 different boards:\n" \
> +    "\trmc -D board1_record board2_record board3_record\n\n" \
> +    "4. Query a file blob named audio.conf associated to the board rmc is\n" \
> +    "running on in database my_rmc.db and output to /tmp/new_audio.conf:\n" \
> +    "\trmc -B audio.conf -d my_rmc.db -o /tmp/new_audio.conf\n\n"
> 
> 
> #define RMC_OPT_CAP_F   (1 << 0)
> #define RMC_OPT_CAP_R   (1 << 1)
> #define RMC_OPT_CAP_D   (1 << 2)
> #define RMC_OPT_CAP_B   (1 << 3)
> -#define RMC_OPT_F       (1 << 4)
> -#define RMC_OPT_O       (1 << 5)
> -#define RMC_OPT_B       (1 << 6)
> -#define RMC_OPT_D       (1 << 7)
> +#define RMC_OPT_CAP_E   (1 << 4)
> +#define RMC_OPT_F       (1 << 5)
> +#define RMC_OPT_O       (1 << 6)
> +#define RMC_OPT_B       (1 << 7)
> +#define RMC_OPT_D       (1 << 8)
> 
> static void usage () {
>     fprintf(stdout, USAGE);
> @@ -78,7 +82,7 @@ static void dump_fingerprint(rmc_fingerprint_t *fp) {
> static int write_fingerprint_file(const char* pathname, rmc_fingerprint_t *fp) {
>     int i;
>     int first = 0;
> -
> +    /* TODO - do we need to open/close file multiple times to write each field */
>     for (i = 0; i < RMC_FINGER_NUM; i++) {
>         if (write_file(pathname, &fp->rmc_fingers[i].type, sizeof(fp->rmc_fingers[i].type), first))
>             return 1;
> @@ -311,7 +315,7 @@ int main(int argc, char **argv){
>     /* parse options */
>     opterr = 0;
> 
> -    while ((c = getopt(argc, argv, "FRD:B:b:f:o:d:")) != -1)
> +    while ((c = getopt(argc, argv, "FRED:B:b:f:o:d:")) != -1)
>         switch (c) {
>         case 'F':
>             options |= RMC_OPT_CAP_F;
> @@ -319,6 +323,9 @@ int main(int argc, char **argv){
>         case 'R':
>             options |= RMC_OPT_CAP_R;
>             break;
> +        case 'E':
> +            options |= RMC_OPT_CAP_E;
> +            break;
>         case 'D':
>             /* we don't know number of arguments for this option at this point,
>              * allocate array with argc which is bigger than needed. But we also
> @@ -388,7 +395,8 @@ int main(int argc, char **argv){
>             break;
>         case '?':
>             if (optopt == 'F' || optopt == 'R' || optopt == 'D' || optopt == 'B' || \
> -                    optopt == 'b' || optopt == 'f' || optopt == 'o' || optopt == 'd')
> +                    optopt == 'E' ||  optopt == 'b' || optopt == 'f' || \
> +                    optopt == 'o' || optopt == 'd')
>                 fprintf(stderr, "\nWRONG USAGE: -%c\n\n", optopt);
>             else if (isprint(optopt))
>                 fprintf(stderr, "Unknown option `-%c'.\n\n", optopt);
> @@ -421,6 +429,13 @@ int main(int argc, char **argv){
>         return 1;
>     }
> 
> +    /* sanity check for -E */
> +    if ((options & RMC_OPT_CAP_E) && (!(options & RMC_OPT_F))) {
> +        fprintf(stderr, "\nERROR: -E requires -f <fingerprint file name>\n\n");
> +        usage();
> +        return 1;
> +    }
> +
>     /* sanity check for -B */
>     if ((options & RMC_OPT_CAP_B) && (!(options & RMC_OPT_D) || !(options & RMC_OPT_O))) {
>         fprintf(stderr, "\nWRONG: -B requires -d and -o\n\n");
> @@ -445,10 +460,28 @@ int main(int argc, char **argv){
>             rmc_free_file(&file);
>             goto main_free;
>         }
> -
>         rmc_free_file(&file);
>     }
> 
> +    if (options & RMC_OPT_CAP_E) {
> +        /* print fingerpring file to console*/
> +        if (options & RMC_OPT_F) {
> +            rmc_fingerprint_t fp;
> +            /* read fingerprint file*/
> +            if (input_fingerprint != NULL) {
> +                if (read_fingerprint_from_file(input_fingerprint, &fp, &raw_fp)) {
> +                    fprintf(stderr, "Cannot read fingerprint from %s\n\n",
> +                    input_fingerprint);
> +                    goto main_free;
> +                }
> +                printf("Successfully read fingerprint from %s \n", input_fingerprint);
I don’t think this is a blocking issue or worthy a V2. You may want to remove this line before merging the patch.

The message will be in the same console of the following actual dump. Anyone/scripts wants to redirect and then manipulate the dump into a file could have to discard this first line first.

A trivial point anyway...

> +                dump_fingerprint(&fp);
> +            }else {
> +                printf("Fingerprint file not provided! Exiting.\n");
> +            }
> +        }
> +    }
> +
>     /* generate RMC database file */
>     if (options & RMC_OPT_CAP_D) {
>         int record_idx = 0;
> @@ -580,7 +613,6 @@ int main(int argc, char **argv){
>             rmc_free_fingerprint(&fingerprint);
>             goto main_free;
>         }
> -
>         rmc_free_fingerprint(&fingerprint);
>     }
> 
> -- 
> 2.11.1
> 




More information about the yocto mailing list