]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
cmd: Add new cli command
authorFrancis Laniel <francis.laniel@amarulasolutions.com>
Fri, 22 Dec 2023 21:02:31 +0000 (22:02 +0100)
committerTom Rini <trini@konsulko.com>
Thu, 28 Dec 2023 17:02:56 +0000 (12:02 -0500)
This command can be used to print the current parser with 'cli get'.
It can also be used to set the current parser with 'cli set'.
For the moment, only one value is valid for set: old.

Signed-off-by: Francis Laniel <francis.laniel@amarulasolutions.com>
cmd/Makefile
cmd/cli.c [new file with mode: 0644]
common/cli.c
doc/usage/cmd/cli.rst [new file with mode: 0644]
doc/usage/index.rst

index 5ed0e4011d07562e4ca4e7fd929d31d432118a31..477b86cf239d0c526cb1f326c8d2c69df213af6a 100644 (file)
@@ -229,6 +229,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 (file)
index 0000000..86c6471
--- /dev/null
+++ b/cmd/cli.c
@@ -0,0 +1,114 @@
+// 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_name(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_name();
+
+       if (!current) {
+               printf("current cli value is not valid, this should not happen!\n");
+               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;
+       }
+
+       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
+);
index e5fe1060d0beeee09c6240ce4fab8c83c29c1017..d419671e8c8fa168b5301864437b9c5de135638e 100644 (file)
@@ -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)
+               && 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 (file)
index 0000000..89ece32
--- /dev/null
@@ -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.
index 1a626c03c2371fa8d45312b682ebea0cb417ad82..c171c029b80c5f1d86b14c9213b2e580cf682902 100644 (file)
@@ -43,6 +43,7 @@ Shell commands
    cmd/cat
    cmd/cbsysinfo
    cmd/cedit
+   cmd/cli
    cmd/cls
    cmd/cmp
    cmd/coninfo