[RFC PATCH v8 11/23] cmd: Add new cli command

Heinrich Schuchardt xypron.glpk at gmx.de
Sat May 13 03:18:27 CEST 2023


On 5/12/23 22:03, Francis Laniel wrote:
> This command can be used to print the current parser with 'cli print'.
> It can also be used to set the current parser with 'cli set'.
> For the moment, only one value is valid for set: old.

What would be the benefit having multiple alternative parsers in one
U-Boot instance?

I would prefer the solution to stay simple and small meaning just one
parser per U-Boot binary.

>
> Signed-off-by: Francis Laniel <francis.laniel at amarulasolutions.com>
> ---
>   cmd/Makefile          |   2 +
>   cmd/cli.c             | 120 ++++++++++++++++++++++++++++++++++++++++++
>   common/cli.c          |   3 +-
>   doc/usage/cmd/cli.rst |  59 +++++++++++++++++++++
>   doc/usage/index.rst   |   1 +
>   5 files changed, 184 insertions(+), 1 deletion(-)
>   create mode 100644 cmd/cli.c
>   create mode 100644 doc/usage/cmd/cli.rst
>
> diff --git a/cmd/Makefile b/cmd/Makefile
> index 6c37521b4e..706e934836 100644
> --- a/cmd/Makefile
> +++ b/cmd/Makefile
> @@ -224,6 +224,8 @@ obj-$(CONFIG_CMD_AVB) += avb.o
>   # Foundries.IO SCP03
>   obj-$(CONFIG_CMD_SCP03) += scp03.o
>
> +obj-$(CONFIG_HUSH_PARSER) += cli.o
> +
>   obj-$(CONFIG_ARM) += arm/
>   obj-$(CONFIG_RISCV) += riscv/
>   obj-$(CONFIG_SANDBOX) += sandbox/
> diff --git a/cmd/cli.c b/cmd/cli.c
> new file mode 100644
> index 0000000000..7671785b83
> --- /dev/null
> +++ b/cmd/cli.c
> @@ -0,0 +1,120 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +
> +#include <common.h>
> +#include <cli.h>
> +#include <command.h>
> +#include <string.h>
> +#include <asm/global_data.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +static const char *gd_flags_to_parser(void)
> +{
> +	if (gd->flags & GD_FLG_HUSH_OLD_PARSER)
> +		return "old";
> +	return NULL;
> +}
> +
> +static int do_cli_get(struct cmd_tbl *cmdtp, int flag, int argc,
> +			 char *const argv[])
> +{
> +	const char *current = gd_flags_to_parser();
> +
> +	if (!current) {
> +		printf("current cli value is not valid, this should not happen!\n");

Please, use log_err() for errors. We want to keep our code small. "this
should not happen!" does not convey any additional information.

> +		return CMD_RET_FAILURE;
> +	}
> +
> +	printf("%s\n", current);
> +
> +	return CMD_RET_SUCCESS;
> +}
> +
> +static int parser_string_to_gd_flags(const char *parser)
> +{
> +	if (!strcmp(parser, "old"))
> +		return GD_FLG_HUSH_OLD_PARSER;
> +	return -1;
> +}
> +
> +static void reset_parser_gd_flags(void)
> +{
> +	gd->flags &= ~GD_FLG_HUSH_OLD_PARSER;
> +}
> +
> +static int do_cli_set(struct cmd_tbl *cmdtp, int flag, int argc,
> +		      char *const argv[])
> +{
> +	char *parser_name;
> +	int parser_flag;
> +
> +	if (argc < 2)
> +		return CMD_RET_USAGE;
> +
> +	parser_name = argv[1];
> +
> +	parser_flag = parser_string_to_gd_flags(parser_name);
> +	if (parser_flag == -1) {
> +		printf("Bad value for parser name: %s\n", parser_name);
> +		return CMD_RET_USAGE;
> +	}
> +
> +	if (parser_flag == GD_FLG_HUSH_OLD_PARSER &&
> +		!CONFIG_IS_ENABLED(HUSH_OLD_PARSER)) {
> +		printf("Want to set current parser to old, but its code was not compiled!\n");
> +		return CMD_RET_FAILURE;
> +	}

We want to keep the code small. We don't need different strings "Parser
%d is not available" would be enough information.

> +.
> +	if (parser_flag == GD_FLG_HUSH_2021_PARSER &&
> +		!CONFIG_IS_ENABLED(HUSH_2021_PARSER)) {
> +		printf("Want to set current parser to 2021, but its code was not compiled!\n");
> +		return CMD_RET_FAILURE;
> +	}
> +
> +	reset_parser_gd_flags();
> +	gd->flags |= parser_flag;
> +
> +	cli_init();
> +	cli_loop();
> +
> +	/* cli_loop() should never return. */
> +	return CMD_RET_FAILURE;
> +}
> +
> +static struct cmd_tbl parser_sub[] = {
> +	U_BOOT_CMD_MKENT(get, 1, 1, do_cli_get, "", ""),
> +	U_BOOT_CMD_MKENT(set, 2, 1, do_cli_set, "", ""),
> +};
> +
> +static int do_cli(struct cmd_tbl *cmdtp, int flag, int argc,
> +		  char *const argv[])
> +{
> +	struct cmd_tbl *cp;
> +
> +	if (argc < 2)
> +		return CMD_RET_USAGE;
> +
> +	/* drop initial "parser" arg */
> +	argc--;
> +	argv++;
> +
> +	cp = find_cmd_tbl(argv[0], parser_sub, ARRAY_SIZE(parser_sub));
> +	if (cp)
> +		return cp->cmd(cmdtp, flag, argc, argv);
> +
> +	return CMD_RET_USAGE;
> +}
> +
> +#if CONFIG_IS_ENABLED(SYS_LONGHELP)
> +static char cli_help_text[] =
> +	"get - print current cli\n"
> +	"set - set the current cli, possible value is: old"
> +	;
> +#endif
> +
> +U_BOOT_CMD(cli, 3, 1, do_cli,
> +	   "cli",
> +#if CONFIG_IS_ENABLED(SYS_LONGHELP)
> +	   cli_help_text
> +#endif
> +);
> diff --git a/common/cli.c b/common/cli.c
> index e5fe1060d0..d419671e8c 100644
> --- a/common/cli.c
> +++ b/common/cli.c
> @@ -268,7 +268,8 @@ void cli_loop(void)
>   void cli_init(void)
>   {
>   #ifdef CONFIG_HUSH_PARSER
> -	if (!(gd->flags & GD_FLG_HUSH_OLD_PARSER))
> +	if (!(gd->flags & GD_FLG_HUSH_OLD_PARSER)

This constraint is superfluous.

Best regards

Heinrich

> +		&& CONFIG_IS_ENABLED(HUSH_OLD_PARSER))
>   		gd->flags |= GD_FLG_HUSH_OLD_PARSER;
>   	u_boot_hush_start();
>   #endif
> diff --git a/doc/usage/cmd/cli.rst b/doc/usage/cmd/cli.rst
> new file mode 100644
> index 0000000000..89ece3203d
> --- /dev/null
> +++ b/doc/usage/cmd/cli.rst
> @@ -0,0 +1,59 @@
> +.. SPDX-License-Identifier: GPL-2.0+
> +
> +cli command
> +===========
> +
> +Synopis
> +-------
> +
> +::
> +
> +    cli get
> +    cli set cli_flavor
> +
> +Description
> +-----------
> +
> +The cli command permits getting and changing the current parser at runtime.
> +
> +cli get
> +~~~~~~~
> +
> +It shows the current value of the parser used by the CLI.
> +
> +cli set
> +~~~~~~~
> +
> +It permits setting the value of the parser used by the CLI.
> +
> +Possible values are old and 2021.
> +Note that, to use a specific parser its code should have been compiled, that
> +is to say you need to enable the corresponding CONFIG_HUSH*.
> +Otherwise, an error message is printed.
> +
> +Examples
> +--------
> +
> +Get the current parser::
> +
> +    => cli get
> +    old
> +
> +Change the current parser::
> +
> +    => cli set old
> +
> +Trying to set the current parser to an unknown value::
> +
> +    => cli set foo
> +    Bad value for parser name: foo
> +    cli - cli
> +
> +    Usage:
> +    cli get - print current cli
> +    set - set the current cli, possible value is: old
> +
> +Return value
> +------------
> +
> +The return value $? indicates whether the command succeeded.
> diff --git a/doc/usage/index.rst b/doc/usage/index.rst
> index 0fde130a54..d0e26d1aee 100644
> --- a/doc/usage/index.rst
> +++ b/doc/usage/index.rst
> @@ -37,6 +37,7 @@ Shell commands
>      cmd/bootz
>      cmd/cat
>      cmd/cbsysinfo
> +   cmd/cli
>      cmd/cls
>      cmd/cmp
>      cmd/coninfo



More information about the U-Boot mailing list