All of lore.kernel.org
 help / color / mirror / Atom feed
From: "long.wanglong" <long.wanglong-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
To: Simon Glass <sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
Cc: David Gibson
	<david-xT8FGy+AXnRB3Ne2BGzF6laj5H9X9Tb+@public.gmane.org>,
	"jdl-CYoMK+44s/E@public.gmane.org"
	<jdl-CYoMK+44s/E@public.gmane.org>,
	peifeiyue-hv44wF8Li93QT0dZR+AlfA@public.gmane.org,
	Devicetree Compiler
	<devicetree-compiler-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>
Subject: Re: [PATCH v2] fdtput: add delete node and property function
Date: Mon, 19 Jan 2015 14:24:40 +0800	[thread overview]
Message-ID: <54BCA328.4020900@huawei.com> (raw)
In-Reply-To: <CAPnjgZ1aGDx50GgQsJc8mCmP+OW_HCw7tjthV0wxPGM9NsebAA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>

On 2015/1/16 0:08, Simon Glass wrote:
> Hi Wang,
> 
> On 15 January 2015 at 00:55, Wang Long <long.wanglong-hv44wF8Li93QT0dZR+AlfA@public.gmane.org> wrote:
>> add the delete node and property function for fdtput.
>>
>> usage:
>> 1) delete nodes
>>    fdtput -r <options> <dt file> [<node>...]
>> 2) delete properties
>>    fdtput -d <options> <dt file> <node> [<property>...]
>>
>> Signed-off-by: Wang Long <long.wanglong-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
>> ---
>>  fdtput.c           | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
>>  tests/run_tests.sh | 22 +++++++++++++
>>  2 files changed, 113 insertions(+), 2 deletions(-)
>>
>> diff --git a/fdtput.c b/fdtput.c
>> index 2a8d674..a7aaca4 100644
>> --- a/fdtput.c
>> +++ b/fdtput.c
>> @@ -32,6 +32,8 @@
>>  enum oper_type {
>>         OPER_WRITE_PROP,                /* Write a property in a node */
>>         OPER_CREATE_NODE,               /* Create a new node */
>> +       OPER_DELETE_NODE,               /* Delete a node */
> 
> nit: It might be better to use REMOVE instead of delete everywhere in
> the code for the node-removal case. Just a suggestion though, it is
> fine as it is.
> 
ok, use REMOVE for node and DELETE for porperty.

>> +       OPER_DELETE_PROP,               /* Delete a property in a node */
>>  };
>>
>>  struct display_info {
>> @@ -270,11 +272,66 @@ static int create_node(char **blob, const char *node_name)
>>         return 0;
>>  }
>>
>> +/**
>> + * Delete a property of a node in the fdt.
>> + *
>> + * @param blob         FDT blob to write into
>> + * @param node_name    Name of node which the delete property belongs to
>> + * @param prop_name    Name of property to delete
>> + * @return 0 on success, or -1 on failure
>> + */
>> +static int delete_prop(char *blob, const char *node_name, const char *prop_name)
>> +{
>> +       int node = 0;
>> +
>> +       node = fdt_path_offset(blob, node_name);
>> +       if (node < 0) {
>> +               report_error(node_name, -1, node);
>> +               return -1;
>> +       }
>> +
>> +       node = fdt_delprop(blob, node, prop_name);
>> +
>> +       if (node < 0) {
>> +               report_error(node_name, -1, node);
>> +               return -1;
>> +       }
>> +
>> +       return 0;
>> +}
>> +
>> +/**
>> + * Delete a node in the fdt.
>> + *
>> + * @param blob         FDT blob to write into
>> + * @param node_name    Name of node to delete
>> + * @return 0 on success, or -1 on failure
>> + */
>> +static int delete_node(char *blob, const char *node_name)
>> +{
>> +       int node = 0;
>> +
>> +       node = fdt_path_offset(blob, node_name);
>> +       if (node < 0) {
>> +               report_error(node_name, -1, node);
>> +               return -1;
>> +       }
>> +
>> +       node = fdt_del_node(blob, node);
>> +       if (node < 0) {
>> +               report_error(node_name, -1, node);
>> +               return -1;
>> +       }
>> +
>> +       return 0;
>> +}
>> +
>>  static int do_fdtput(struct display_info *disp, const char *filename,
>>                     char **arg, int arg_count)
>>  {
>>         char *value;
>>         char *blob;
>> +       char *node;
>>         int len, ret = 0;
>>
>>         blob = utilfdt_read(filename);
>> @@ -302,6 +359,15 @@ static int do_fdtput(struct display_info *disp, const char *filename,
>>                                 ret = create_node(&blob, *arg);
>>                 }
>>                 break;
>> +       case OPER_DELETE_NODE:
>> +               for (; ret >= 0 && arg_count--; arg++)
>> +                       ret = delete_node(blob, *arg);
>> +               break;
>> +       case OPER_DELETE_PROP:
>> +               node = *arg;
>> +               for (; ret >= 0 && arg_count-- > 1; arg++)
>> +                       ret = delete_prop(blob, node, arg[1]);
>> +               break;
>>         }
>>         if (ret >= 0) {
>>                 fdt_pack(blob);
>> @@ -312,17 +378,22 @@ static int do_fdtput(struct display_info *disp, const char *filename,
>>         return ret;
>>  }
>>
>> +
>>  /* Usage related data. */
>>  static const char usage_synopsis[] =
>>         "write a property value to a device tree\n"
>>         "       fdtput <options> <dt file> <node> <property> [<value>...]\n"
>>         "       fdtput -c <options> <dt file> [<node>...]\n"
>> +       "       fdtput -r <options> <dt file> [<node>...]\n"
>> +       "       fdtput -d <options> <dt file> <node> [<property>...]\n"
>>         "\n"
>>         "The command line arguments are joined together into a single value.\n"
>>         USAGE_TYPE_MSG;
>> -static const char usage_short_opts[] = "cpt:v" USAGE_COMMON_SHORT_OPTS;
>> +static const char usage_short_opts[] = "crdpt:v" USAGE_COMMON_SHORT_OPTS;
>>  static struct option const usage_long_opts[] = {
>>         {"create",           no_argument, NULL, 'c'},
>> +       {"remove",           no_argument, NULL, 'r'},
>> +       {"delete",           no_argument, NULL, 'd'},
>>         {"auto-path",        no_argument, NULL, 'p'},
>>         {"type",              a_argument, NULL, 't'},
>>         {"verbose",          no_argument, NULL, 'v'},
>> @@ -330,6 +401,8 @@ static struct option const usage_long_opts[] = {
>>  };
>>  static const char * const usage_opts_help[] = {
>>         "Create nodes if they don't already exist",
>> +       "Delete nodes if they already exist",
> 
> Perhaps 'Delete nodes (and any subnodes) ...' so it is clear that
> subnodes will be deleted also.

ok, i will change this description.

> 
>> +       "Delete perporties if they already exist",
> 
> properties
Sorry for this spelling mistake

thanks
> 
>>         "Automatically create nodes as needed for the node path",
>>         "Type of data",
>>         "Display each value decoded from command line",
>> @@ -348,7 +421,6 @@ int main(int argc, char *argv[])
>>         while ((opt = util_getopt_long()) != EOF) {
>>                 /*
>>                  * TODO: add options to:
>> -                * - delete property
>>                  * - delete node (optionally recursively)
> 
> You can remove this line too, right?
ok, i forgot to delete this line.

> 
>>                  * - rename node
>>                  * - pack fdt before writing
>> @@ -360,6 +432,12 @@ int main(int argc, char *argv[])
>>                 case 'c':
>>                         disp.oper = OPER_CREATE_NODE;
>>                         break;
>> +               case 'r':
>> +                       disp.oper = OPER_DELETE_NODE;
>> +                       break;
>> +               case 'd':
>> +                       disp.oper = OPER_DELETE_PROP;
>> +                       break;
>>                 case 'p':
>>                         disp.auto_path = 1;
>>                         break;
>> @@ -390,6 +468,17 @@ int main(int argc, char *argv[])
>>                         usage("missing property");
>>         }
>>
>> +       if (disp.oper == OPER_DELETE_NODE)
>> +               if (argc < 1)
>> +                       usage("missing node");
> 
> I don't think you need/want this check, since if no nodes are
> specified, it can't simply do nothing. This is how -c works, and
> fdtget.
> 
>> +
>> +       if (disp.oper == OPER_DELETE_PROP) {
>> +               if (argc < 1)
>> +                       usage("missing node");
>> +               if (argc < 2)
>> +                       usage("missing property");
> 
> Here I think you want the first check but not the second, since the
> tool takes a list of properties to delete, and I think an empty list
> should be valid.
> 
ok, if the empty list is valid, there is no need for the check code of the OPER_DELETE_NODE.
we only check the node argument for OPER_DELETE_PROP.

thanks


>> +       }
>> +
> 
> 
>>         if (do_fdtput(&disp, filename, argv, argc))
>>                 return 1;
>>         return 0;
>> diff --git a/tests/run_tests.sh b/tests/run_tests.sh
>> index ace6e4f..c5856d9 100755
>> --- a/tests/run_tests.sh
>> +++ b/tests/run_tests.sh
>> @@ -610,6 +610,28 @@ fdtput_tests () {
>>      run_wrap_test $DTPUT $dtb -cp /chosen
>>      run_wrap_test $DTPUT $dtb -cp /chosen/son
>>
>> +    # Start again with a fresh dtb
>> +    run_dtc_test -O dtb -p $(stat -c %s $text) -o $dtb $dts
>> +
>> +    # Node delete
>> +    run_wrap_test $DTPUT $dtb -c /chosen/node1 /chosen/node2 /chosen/node3
>> +    run_fdtget_test "node3\nnode2\nnode1" $dtb -l  /chosen
>> +    run_wrap_test $DTPUT $dtb -r /chosen/node1 /chosen/node2
>> +    run_fdtget_test "node3" $dtb -l  /chosen
>> +
>> +    # Delete the non-existent node
>> +    run_wrap_error_test $DTPUT $dtb -r /non-existent/node
>> +
>> +    # Property delete
>> +    run_fdtput_test "eva" $dtb /chosen/ name "" -ts "eva"
>> +    run_fdtput_test "016" $dtb /chosen/ age  "" -ts "016"
>> +    run_fdtget_test "age\nname\nbootargs\nlinux,platform" $dtb -p  /chosen
>> +    run_wrap_test $DTPUT $dtb -d /chosen/ name age
>> +    run_fdtget_test "bootargs\nlinux,platform" $dtb -p  /chosen
>> +
>> +    # Delete the non-existent property
>> +    run_wrap_error_test $DTPUT $dtb -d /chosen   non-existent-prop
> 
> These tests look good to me.
> 
>> +
>>      # TODO: Add tests for verbose mode?
>>  }
> 
> Regards,
> Simon
> 
> .
> 
Best Regards
Wang Long

--
To unsubscribe from this list: send the line "unsubscribe devicetree-compiler" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

      parent reply	other threads:[~2015-01-19  6:24 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-15  7:55 [PATCH v2] fdtput: add delete node and property function Wang Long
     [not found] ` <1421308536-140275-1-git-send-email-long.wanglong-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2015-01-15 16:08   ` Simon Glass
     [not found]     ` <CAPnjgZ1aGDx50GgQsJc8mCmP+OW_HCw7tjthV0wxPGM9NsebAA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-01-19  6:24       ` long.wanglong [this message]

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=54BCA328.4020900@huawei.com \
    --to=long.wanglong-hv44wf8li93qt0dzr+alfa@public.gmane.org \
    --cc=david-xT8FGy+AXnRB3Ne2BGzF6laj5H9X9Tb+@public.gmane.org \
    --cc=devicetree-compiler-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=jdl-CYoMK+44s/E@public.gmane.org \
    --cc=peifeiyue-hv44wF8Li93QT0dZR+AlfA@public.gmane.org \
    --cc=sjg-F7+t8E8rja9g9hUCZPvPmw@public.gmane.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.