From: Todor Minchev <todor.minchev@linux.intel.com>
To: Jianxun Zhang <jianxun.zhang@linux.intel.com>
Cc: meta-intel@yoctoproject.org, yocto@yoctoproject.org
Subject: Re: [PATCH 2/3] rmc: Enable reading the contents of an existing fingerprint file
Date: Mon, 06 Feb 2017 14:28:29 -0800 [thread overview]
Message-ID: <1486420109.42955.152.camel@linux.intel.com> (raw)
In-Reply-To: <F48E5880-F370-48BA-8E83-10547D4352AA@linux.intel.com>
On Mon, 2017-02-06 at 12:01 -0800, Jianxun Zhang wrote:
> Tudor,
> Please refer to my 3 inline comments.
>
> > On Feb 2, 2017, at 2:37 PM, Todor Minchev <todor.minchev@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 -F -i input_fingerprint_file
> Suggest we have a new top option for dumping in parallel with -F to keep usages clear and simple for users.
We can use -E to extract both the database and the fingerprint?
rmc -E -d rmc.db
rmc -E -f rmc.fingerprint
> >
> > Signed-off-by: Todor Minchev <todor.minchev@linux.intel.com>
> > ---
> > src/rmc.c | 121 +++++++++++++++++++++++++++++++++++++++-----------------------
> > 1 file changed, 76 insertions(+), 45 deletions(-)
> >
> > diff --git a/src/rmc.c b/src/rmc.c
> > index 062dd36..a051ccf 100644
> > --- a/src/rmc.c
> > +++ b/src/rmc.c
> > @@ -14,33 +14,35 @@
> > #include <rmc_api.h>
> >
> > #define USAGE "RMC (Runtime Machine configuration) Tool\n" \
> > - "NOTE: Most of usages require root permission (sudo)\n" \
> > - "rmc -F [-o output_fingerprint]\n" \
> > + "NOTE: Most of usages require root permission (sudo)\n\n" \
> > + "rmc -F [-o output_fingerprint] | -i input_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" \
> > + "\t-i input_file: print RMC fingerprint stored in input_file\n\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" \
> > + "Examples (Steps in an order to add board support into rmc):\n\n" \
> > + "1. Generate board fingerprint:\n" \
> > + "\t./rmc -F\n\n” \
> Why do we force the rmc in current dir here? rmc can be installed to a system path like other programs.
Yes, this can be anywhere.
>
> > + "2. Generate a rmc record for the board with two file blobs and save it\n" \
> > + "to a specified file:\n" \
> > + "\t./rmc -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" \
> > + "\t./rmc -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" \
> > + "\t./rmc -B audio.conf -d my_rmc.db -o /tmp/new_audio.conf\n\n"
> >
> >
> > #define RMC_OPT_CAP_F (1 << 0)
> > @@ -51,6 +53,7 @@
> > #define RMC_OPT_O (1 << 5)
> > #define RMC_OPT_B (1 << 6)
> > #define RMC_OPT_D (1 << 7)
> > +#define RMC_OPT_I (1 << 8)
> >
> > static void usage () {
> > fprintf(stdout, USAGE);
> > @@ -78,7 +81,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;
> > @@ -214,7 +217,6 @@ read_fp_done:
> > static rmc_file_t *read_policy_file(char *pathname, int type) {
> > rmc_file_t *tmp = NULL;
> > rmc_size_t policy_len = 0;
> > - int ret;
> Any reduction to this project is welcome!
>
> it’s just irrelevant for the purposes claimed in commit msg. Please have another patch for other improvements. (Well, I myself could have violated these rules too)
OK.. I will split this into its own commit.
>
> > char *path_token;
> >
> > if ((tmp = calloc(1, sizeof(rmc_file_t))) == NULL) {
> > @@ -226,8 +228,7 @@ static rmc_file_t *read_policy_file(char *pathname, int type) {
> > tmp->next = NULL;
> >
> > if (type == RMC_GENERIC_FILE) {
> > - ret = read_file(pathname, (char **)&tmp->blob, &policy_len);
> > - if (ret) {
> > + if (read_file(pathname, (char **)&tmp->blob, &policy_len)) {
> > fprintf(stderr, "Failed to read file %s\n\n", pathname);
> > free(tmp);
> > return NULL;
> > @@ -311,7 +312,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, "FRD:B:b:f:o:i:d:")) != -1)
> > switch (c) {
> > case 'F':
> > options |= RMC_OPT_CAP_F;
> > @@ -352,6 +353,10 @@ int main(int argc, char **argv){
> > output_path = optarg;
> > options |= RMC_OPT_O;
> > break;
> > + case 'i':
> > + input_fingerprint = optarg;
> > + options |= RMC_OPT_I;
> > + break;
> > case 'f':
> > input_fingerprint = optarg;
> > options |= RMC_OPT_F;
> > @@ -388,7 +393,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 == 'b' || optopt == 'f' || optopt == 'o' || optopt == 'd' \
> > + || optopt == 'i')
> > fprintf(stderr, "\nWRONG USAGE: -%c\n\n", optopt);
> > else if (isprint(optopt))
> > fprintf(stderr, "Unknown option `-%c'.\n\n", optopt);
> > @@ -414,6 +420,15 @@ int main(int argc, char **argv){
> > }
> > }
> >
> > + /* sanity check for -i */
> > + if (options & RMC_OPT_I) {
> > + if (!(options & RMC_OPT_CAP_F)) {
> > + fprintf(stderr, "\nWRONG: Option -i cannot be applied without -F\n\n");
> > + usage();
> > + return 1;
> > + }
> > + }
> > +
> > /* sanity check for -R */
> > if ((options & RMC_OPT_CAP_R) && (!(options & RMC_OPT_B))) {
> > fprintf(stderr, "\nWRONG: -b is required when -R is present\n\n");
> > @@ -563,25 +578,41 @@ int main(int argc, char **argv){
> > }
> >
> > if (options & RMC_OPT_CAP_F) {
> > - /* set a default fingerprint file name if user didn't provide one */
> > - if (!output_path)
> > - output_path = "rmc.fingerprint";
> > + /* print fingerpring file to console*/
> > + if (options & RMC_OPT_I) {
> > + 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);
> > + dump_fingerprint(&fp);
> > + }else {
> > + printf("Fingerprint file not provided! Exiting.\n");
> > + }
> > + } else { /* generate fingerprint file for the current board*/
> > + /* set a default fingerprint file name if user didn't provide one */
> > + if (!output_path)
> > + output_path = "rmc.fingerprint";
> >
> > - if (rmc_get_fingerprint(&fingerprint)) {
> > - fprintf(stderr, "Cannot get board fingerprint\n");
> > - goto main_free;
> > - }
> > + if (rmc_get_fingerprint(&fingerprint)) {
> > + fprintf(stderr, "Cannot get board fingerprint\n");
> > + goto main_free;
> > + }
> >
> > - printf("Got Fingerprint for board:\n\n");
> > - dump_fingerprint(&fingerprint);
> > + printf("Got Fingerprint for board:\n\n");
> > + dump_fingerprint(&fingerprint);
> >
> > - if (write_fingerprint_file(output_path, &fingerprint)) {
> > - fprintf(stderr, "Cannot write board fingerprint to %s\n", output_path);
> > + if (write_fingerprint_file(output_path, &fingerprint)) {
> > + fprintf(stderr, "Cannot write board fingerprint to %s\n", output_path);
> > + rmc_free_fingerprint(&fingerprint);
> > + goto main_free;
> > + }
> > rmc_free_fingerprint(&fingerprint);
> > - goto main_free;
> > }
> > -
> > - rmc_free_fingerprint(&fingerprint);
> > }
> >
> > ret = 0;
> > --
> > 2.11.0
> >
>
next prev parent reply other threads:[~2017-02-06 22:28 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-02-02 22:37 [PATCH 0/3] [meta-intel][rmc] Add fingerprint quering and database extraction functionality to RMC Todor Minchev
2017-02-02 22:37 ` [PATCH 1/3] Makefile: add verbosity and debug options to Makefile Todor Minchev
2017-02-06 19:06 ` Jianxun Zhang
2017-02-06 22:21 ` Todor Minchev
2017-02-02 22:37 ` [PATCH 2/3] rmc: Enable reading the contents of an existing fingerprint file Todor Minchev
2017-02-06 20:01 ` Jianxun Zhang
2017-02-06 22:28 ` Todor Minchev [this message]
2017-02-06 23:12 ` Jianxun Zhang
2017-02-02 22:37 ` [PATCH 3/3] rmc: add database extraction functionality Todor Minchev
2017-02-06 21:09 ` Jianxun Zhang
2017-02-06 23:09 ` Todor Minchev
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1486420109.42955.152.camel@linux.intel.com \
--to=todor.minchev@linux.intel.com \
--cc=jianxun.zhang@linux.intel.com \
--cc=meta-intel@yoctoproject.org \
--cc=yocto@yoctoproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.