All of lore.kernel.org
 help / color / mirror / Atom feed
From: Francis Laniel <francis.laniel@amarulasolutions.com>
To: u-boot@lists.denx.de
Cc: "Michael Nazzareno Trimarchi" <michael@amarulasolutions.com>,
	"Tom Rini" <trini@konsulko.com>, "Simon Glass" <sjg@chromium.org>,
	"Harald Seiler" <hws@denx.de>,
	"Francis Laniel" <francis.laniel@amarulasolutions.com>,
	"Albert ARIBAUD (3ADEV)" <albert.aribaud@3adev.fr>,
	"Tony Dinh" <mibodhi@gmail.com>,
	"Sergei Antonov" <saproj@gmail.com>,
	"Heinrich Schuchardt" <xypron.glpk@gmx.de>,
	"Ilias Apalodimas" <ilias.apalodimas@linaro.org>,
	"Masahisa Kojima" <masahisa.kojima@linaro.org>,
	"Pali Rohár" <pali@kernel.org>, "Stefan Roese" <sr@denx.de>,
	"John Keeping" <john@metanate.com>,
	"Neil Armstrong" <neil.armstrong@linaro.org>,
	"Roger Knecht" <rknecht@pm.me>,
	"Robert Marko" <robimarko@gmail.com>,
	"Alexey Romanov" <avromanov@sberdevices.ru>,
	"Marek Vasut" <marex@denx.de>,
	"Patrick Delaunay" <patrick.delaunay@foss.st.com>,
	"Patrice Chotard" <patrice.chotard@foss.st.com>,
	"Fabrice Gasnier" <fabrice.gasnier@foss.st.com>,
	"Hector Palacios" <hector.palacios@digi.com>,
	"Rasmus Villemoes" <rasmus.villemoes@prevas.dk>,
	"AKASHI Takahiro" <takahiro.akashi@linaro.org>,
	"Rui Miguel Silva" <rui.silva@linaro.org>,
	"Linus Walleij" <linus.walleij@linaro.org>,
	"Andrew Scull" <ascull@google.com>
Subject: [RFC PATCH v7 12/23] cli: Enables using hush 2021 parser as command line parser
Date: Thu, 30 Mar 2023 20:47:00 +0100	[thread overview]
Message-ID: <20230330194716.23623-13-francis.laniel@amarulasolutions.com> (raw)
In-Reply-To: <20230330194716.23623-1-francis.laniel@amarulasolutions.com>

If one defines HUSH_2021_PARSER, it is then possible to use 2021 parser with:
=> parser get
old
=> parser set 2021
2021> parser get
2021

Signed-off-by: Francis Laniel <francis.laniel@amarulasolutions.com>
---
 cmd/parser.c                      |  7 ++++-
 common/cli.c                      | 38 +++++++++++++++++++----
 common/cli_hush_2021.c            |  3 ++
 common/cli_hush_upstream.c        | 46 +++++++++++++++++++++++++---
 include/asm-generic/global_data.h |  4 +++
 include/cli_hush.h                | 51 +++++++++++++++++++++++++++++--
 6 files changed, 135 insertions(+), 14 deletions(-)

diff --git a/cmd/parser.c b/cmd/parser.c
index 0a433b7dc6..f7b0f0dc9d 100644
--- a/cmd/parser.c
+++ b/cmd/parser.c
@@ -12,6 +12,8 @@ static const char *gd_flags_to_parser(void)
 {
 	if (gd->flags & GD_FLG_HUSH_OLD_PARSER)
 		return "old";
+	if (gd->flags & GD_FLG_HUSH_2021_PARSER)
+		return "2021";
 	return NULL;
 }
 
@@ -34,12 +36,15 @@ static int parser_string_to_gd_flags(const char *parser)
 {
 	if (!strcmp(parser, "old"))
 		return GD_FLG_HUSH_OLD_PARSER;
+	if (!strcmp(parser, "2021"))
+		return GD_FLG_HUSH_2021_PARSER;
 	return -1;
 }
 
 static void reset_parser_gd_flags(void)
 {
 	gd->flags &= ~GD_FLG_HUSH_OLD_PARSER;
+	gd->flags &= ~GD_FLG_HUSH_2021_PARSER;
 }
 
 static int do_parser_set(struct cmd_tbl *cmdtp, int flag, int argc,
@@ -108,7 +113,7 @@ static int do_parser(struct cmd_tbl *cmdtp, int flag, int argc,
 #if CONFIG_IS_ENABLED(SYS_LONGHELP)
 static char parser_help_text[] =
 	"get - print current parser\n"
-	"set - set the current parser, possible value is: old"
+	"set - set the current parser, possible values are: old, 2021"
 	;
 #endif
 
diff --git a/common/cli.c b/common/cli.c
index 21f98ca99c..e75a3ccc50 100644
--- a/common/cli.c
+++ b/common/cli.c
@@ -40,12 +40,15 @@ int run_command(const char *cmd, int flag)
 		return 1;
 
 	return 0;
-#else
+#elif CONFIG_IS_ENABLED(HUSH_OLD_PARSER)
 	int hush_flags = FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP;
 
 	if (flag & CMD_FLAG_ENV)
 		hush_flags |= FLAG_CONT_ON_NEWLINE;
 	return parse_string_outer(cmd, hush_flags);
+#else /* HUSH_2021_PARSER */
+	/* Not yet implemented. */
+	return 1;
 #endif
 }
 
@@ -105,7 +108,12 @@ int run_command_list(const char *cmd, int len, int flag)
 		buff[len] = '\0';
 	}
 #ifdef CONFIG_HUSH_PARSER
+#if CONFIG_IS_ENABLED(HUSH_OLD_PARSER)
 	rcode = parse_string_outer(buff, FLAG_PARSE_SEMICOLON);
+#else /* HUSH_2021_PARSER */
+	/* Not yet implemented. */
+	rcode = 1;
+#endif
 #else
 	/*
 	 * This function will overwrite any \n it sees with a \0, which
@@ -241,8 +249,13 @@ err:
 void cli_loop(void)
 {
 	bootstage_mark(BOOTSTAGE_ID_ENTER_CLI_LOOP);
-#ifdef CONFIG_HUSH_PARSER
-	parse_file_outer();
+#if CONFIG_IS_ENABLED(HUSH_PARSER)
+	if (gd->flags & GD_FLG_HUSH_2021_PARSER)
+		parse_and_run_file();
+	else if (gd->flags & GD_FLG_HUSH_OLD_PARSER)
+		parse_file_outer();
+
+	printf("Problem\n");
 	/* This point is never reached */
 	for (;;);
 #elif defined(CONFIG_CMDLINE)
@@ -255,10 +268,23 @@ void cli_loop(void)
 void cli_init(void)
 {
 #ifdef CONFIG_HUSH_PARSER
+	/* This if block is used to initialize hush parser gd flag. */
 	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();
+		&& !(gd->flags & GD_FLG_HUSH_2021_PARSER)) {
+		if (CONFIG_IS_ENABLED(HUSH_OLD_PARSER))
+			gd->flags |= GD_FLG_HUSH_OLD_PARSER;
+		else if (CONFIG_IS_ENABLED(HUSH_2021_PARSER))
+			gd->flags |= GD_FLG_HUSH_2021_PARSER;
+	}
+
+	if (gd->flags & GD_FLG_HUSH_OLD_PARSER) {
+		u_boot_hush_start();
+	} else if (gd->flags & GD_FLG_HUSH_2021_PARSER) {
+		u_boot_hush_start_2021();
+	} else {
+		printf("No valid hush parser to use, cli will not initialized!\n");
+		return;
+	}
 #endif
 
 #if defined(CONFIG_HUSH_INIT_VAR)
diff --git a/common/cli_hush_2021.c b/common/cli_hush_2021.c
index 6d109933b8..653ea52929 100644
--- a/common/cli_hush_2021.c
+++ b/common/cli_hush_2021.c
@@ -221,6 +221,9 @@ static uint8_t xfunc_error_retval;
 static const char defifsvar[] __aligned(1) = "IFS= \t\n";
 #define defifs (defifsvar + 4)
 
+/* This define is used to check if exit command was called. */
+#define EXIT_RET_CODE -2
+
 /*
  * This define is used for changes that need be done directly in the upstream
  * sources still. Ideally, its use should be minimized as much as possible.
diff --git a/common/cli_hush_upstream.c b/common/cli_hush_upstream.c
index cc64af4e0c..84227a248e 100644
--- a/common/cli_hush_upstream.c
+++ b/common/cli_hush_upstream.c
@@ -7914,7 +7914,17 @@ static void parse_and_run_stream(struct in_str *inp, int end_trigger)
 		}
 		debug_print_tree(pipe_list, 0);
 		debug_printf_exec("parse_and_run_stream: run_and_free_list\n");
+#ifndef __U_BOOT__
 		run_and_free_list(pipe_list);
+#else /* __U_BOOT__ */
+		int rcode = run_and_free_list(pipe_list);
+		/*
+		 * We reset input string to not run the following command, so running
+		 * 'exit; echo foo' does not print foo.
+		 */
+		if (rcode <= EXIT_RET_CODE)
+			setup_file_in_str(inp);
+#endif /* __U_BOOT__ */
 		empty = 0;
 		if (G_flag_return_in_progress == 1)
 			break;
@@ -10369,13 +10379,39 @@ static int run_list(struct pipe *pi)
 #endif /* !__U_BOOT__ */
 		rcode = r = run_pipe(pi); /* NB: rcode is a smalluint, r is int */
 #ifdef __U_BOOT__
-		if (r == -2) {
-			/* -2 indicates exit was called, so we need to quit now. */
-			G.last_exitcode = rcode;
+		if (r <= EXIT_RET_CODE) {
+			int previous_rcode = G.last_exitcode;
+			/*
+			 * This magic is to get the exit code given by the user.
+			 * Contrary to old shell code, we use + EXIT_RET_CODE as EXIT_RET_CODE
+			 * equals -2.
+			 */
+			G.last_exitcode = -r + EXIT_RET_CODE;
 
-			break;
+			/*
+			 * This case deals with the following:
+			 * => setenv inner 'echo entry inner; exit; echo inner done'
+			 * => setenv outer 'echo entry outer; run inner; echo outer done'
+			 * => run outer
+			 * So, if we are in inner, we need to break and not run the other
+			 * commands.
+			 * Otherwise, we just continue in outer.
+			 * As return code are propagated, we use the previous value to check if
+			 * exit was just called or was propagated.
+			 */
+			if (previous_rcode != r) {
+				/*
+				 * If run from run_command, run_command_flags will be set, so we check
+				 * this to know if we are in main input shell.
+				 */
+				if (!G.run_command_flags)
+					printf("exit not allowed from main input shell.\n");
+
+				break;
+			}
+			continue;
 		}
-#endif
+#endif /* __U_BOOT__ */
 		if (r != -1) {
 			/* We ran a builtin, function, or group.
 			 * rcode is already known
diff --git a/include/asm-generic/global_data.h b/include/asm-generic/global_data.h
index d61aa4346d..3bdc645a05 100644
--- a/include/asm-generic/global_data.h
+++ b/include/asm-generic/global_data.h
@@ -654,6 +654,10 @@ enum gd_flags {
 	 * @GD_FLG_HUSH_OLD_PARSER: Use hush old parser.
 	 */
 	GD_FLG_HUSH_OLD_PARSER = 0x200000,
+	/**
+	 * @GD_FLG_HUSH_2021_PARSER: Use hush 2021 parser.
+	 */
+	GD_FLG_HUSH_2021_PARSER = 0x400000,
 };
 
 #endif /* __ASSEMBLY__ */
diff --git a/include/cli_hush.h b/include/cli_hush.h
index 2bd35670c7..4ef79de53c 100644
--- a/include/cli_hush.h
+++ b/include/cli_hush.h
@@ -12,11 +12,58 @@
 #define FLAG_REPARSING       (1 << 2)	  /* >=2nd pass */
 #define FLAG_CONT_ON_NEWLINE (1 << 3)	  /* continue when we see \n */
 
+#if CONFIG_IS_ENABLED(HUSH_OLD_PARSER)
 extern int u_boot_hush_start(void);
-extern int parse_string_outer(const char *, int);
+extern int parse_string_outer(const char *str, int flag);
 extern int parse_file_outer(void);
-
 int set_local_var(const char *s, int flg_export);
+#else
+static inline int u_boot_hush_start(void)
+{
+	return 0;
+}
+
+static inline int parse_string_outer(const char *str, int flag)
+{
+	return 1;
+}
+
+static inline int parse_file_outer(void)
+{
+	return 0;
+}
+
+static inline int set_local_var(const char *s, int flg_export)
+{
+	return 0;
+}
+#endif
+#if CONFIG_IS_ENABLED(HUSH_2021_PARSER)
+extern int u_boot_hush_start_2021(void);
+extern int parse_string_outer_2021(const char *str, int flag);
+extern void parse_and_run_file(void);
+int set_local_var_2021(char *s, int flg_export);
+#else
+static inline int u_boot_hush_start_2021(void)
+{
+	return 0;
+}
+
+static inline int parse_string_outer_2021(const char *str, int flag)
+{
+	return 1;
+}
+
+static inline void parse_and_run_file(void)
+{
+}
+
+static inline int set_local_var_2021(char *s, int flg_export)
+{
+	return 0;
+}
+#endif
+
 void unset_local_var(const char *name);
 char *get_local_var(const char *s);
 
-- 
2.34.1


  parent reply	other threads:[~2023-03-30 19:55 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-30 19:46 [RFC PATCH v7 00/23] Modernize U-Boot shell Francis Laniel
2023-03-30 19:46 ` [RFC PATCH v7 01/23] test: Add framework to test hush behavior Francis Laniel
2023-03-30 19:46 ` [RFC PATCH v7 02/23] test: hush: Test hush if/else Francis Laniel
2023-03-30 19:46 ` [RFC PATCH v7 03/23] test/py: hush_if_test: Remove the test file Francis Laniel
2023-03-30 19:46 ` [RFC PATCH v7 04/23] test: hush: Test hush variable expansion Francis Laniel
2023-04-01  6:32   ` Simon Glass
2023-03-30 19:46 ` [RFC PATCH v7 05/23] test: hush: Test hush commands list Francis Laniel
2023-03-30 19:46 ` [RFC PATCH v7 06/23] test: hush: Test hush loops Francis Laniel
2023-03-30 19:46 ` [RFC PATCH v7 07/23] cli: Add Busybox upstream hush.c file Francis Laniel
2023-03-30 19:46 ` [RFC PATCH v7 08/23] cli: Port Busybox 2021 hush to U-Boot Francis Laniel
2023-03-30 19:46 ` [RFC PATCH v7 09/23] cli: Add menu for hush parser Francis Laniel
2023-04-01  6:32   ` Simon Glass
2023-03-30 19:46 ` [RFC PATCH v7 10/23] global_data.h: add GD_FLG_HUSH_OLD_PARSER flag Francis Laniel
2023-04-01  6:32   ` Simon Glass
2023-03-30 19:46 ` [RFC PATCH v7 11/23] cmd: Add new parser command Francis Laniel
2023-04-01  6:32   ` Simon Glass
2023-04-01 22:44     ` Francis Laniel
2023-03-30 19:47 ` Francis Laniel [this message]
2023-04-01  6:32   ` [RFC PATCH v7 12/23] cli: Enables using hush 2021 parser as command line parser Simon Glass
2023-03-30 19:47 ` [RFC PATCH v7 13/23] cli: hush_2021: Enable variables expansion for hush 2021 Francis Laniel
2023-03-30 19:47 ` [RFC PATCH v7 14/23] cli: hush_2021: Add functions to be called from run_command() Francis Laniel
2023-03-30 19:47 ` [RFC PATCH v7 15/23] cli: add hush 2021 as parser for run_command*() Francis Laniel
2023-04-01  6:32   ` Simon Glass
2023-03-30 19:47 ` [RFC PATCH v7 16/23] test: hush: Fix instructions list tests for hush 2021 Francis Laniel
2023-04-01  6:32   ` Simon Glass
2023-03-30 19:47 ` [RFC PATCH v7 17/23] test: hush: Fix variable expansion " Francis Laniel
2023-04-01  6:32   ` Simon Glass
2023-03-30 19:47 ` [RFC PATCH v7 18/23] cli: hush_2021: Enable using < and > as string compare operators Francis Laniel
2023-03-30 19:47 ` [RFC PATCH v7 19/23] cli: hush_2021: Enable if keyword Francis Laniel
2023-03-30 19:47 ` [RFC PATCH v7 20/23] cli: hush_2021: Enable loops Francis Laniel
2023-03-30 19:47 ` [RFC PATCH v7 21/23] test: hush: Fix loop tests for hush 2021 Francis Laniel
2023-04-01  6:32   ` Simon Glass
2023-03-30 19:47 ` [RFC PATCH v7 22/23] cli: hush_2021: Add upstream commits up to 30th January 2023 Francis Laniel
2023-03-30 19:47 ` [RFC PATCH v7 23/23] DO NOT MERGE: only to make CI happy Francis Laniel
2023-03-30 20:17   ` Tony Dinh
2023-03-30 22:14     ` Francis Laniel
2023-03-31 23:17       ` Tony Dinh

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=20230330194716.23623-13-francis.laniel@amarulasolutions.com \
    --to=francis.laniel@amarulasolutions.com \
    --cc=albert.aribaud@3adev.fr \
    --cc=ascull@google.com \
    --cc=avromanov@sberdevices.ru \
    --cc=fabrice.gasnier@foss.st.com \
    --cc=hector.palacios@digi.com \
    --cc=hws@denx.de \
    --cc=ilias.apalodimas@linaro.org \
    --cc=john@metanate.com \
    --cc=linus.walleij@linaro.org \
    --cc=marex@denx.de \
    --cc=masahisa.kojima@linaro.org \
    --cc=mibodhi@gmail.com \
    --cc=michael@amarulasolutions.com \
    --cc=neil.armstrong@linaro.org \
    --cc=pali@kernel.org \
    --cc=patrice.chotard@foss.st.com \
    --cc=patrick.delaunay@foss.st.com \
    --cc=rasmus.villemoes@prevas.dk \
    --cc=rknecht@pm.me \
    --cc=robimarko@gmail.com \
    --cc=rui.silva@linaro.org \
    --cc=saproj@gmail.com \
    --cc=sjg@chromium.org \
    --cc=sr@denx.de \
    --cc=takahiro.akashi@linaro.org \
    --cc=trini@konsulko.com \
    --cc=u-boot@lists.denx.de \
    --cc=xypron.glpk@gmx.de \
    /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.