All of lore.kernel.org
 help / color / mirror / Atom feed
From: Heiko Schocher <hs@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v2 14/16] [PATCH] hush: add showvar command for hush shell.
Date: Wed, 15 Oct 2008 09:40:28 +0200	[thread overview]
Message-ID: <48F59E6C.9050803@denx.de> (raw)

This new command shows the local variables defined in
the hush shell:

=> help showvar
showvar
    - print values of all hushshell variables
showvar name ...
    - print value of hushshell variable 'name'

Also make the set_local_var() and unset_local_var ()
no longer static, so it is possible to define local
hush shell variables at boot time. If CONFIG_HUSH_INIT_VAR
is defined, u-boot calls hush_init_var (), where
boardspecific code can define local hush shell
variables at boottime.

Signed-off-by: Heiko Schocher <hs@denx.de>
---
 common/hush.c  |   60 ++++++++++++++++++++++++++++++++++++++++++++++++-------
 common/main.c  |    4 +++
 include/hush.h |    6 +++++
 3 files changed, 62 insertions(+), 8 deletions(-)

diff --git a/common/hush.c b/common/hush.c
index 093c428..67bed39 100644
--- a/common/hush.c
+++ b/common/hush.c
@@ -501,10 +501,6 @@ static void remove_bg_job(struct pipe *pi);
 static char **make_list_in(char **inp, char *name);
 static char *insert_var_value(char *inp);
 static char *get_local_var(const char *var);
-#ifndef __U_BOOT__
-static void  unset_local_var(const char *name);
-#endif
-static int set_local_var(const char *s, int flg_export);

 #ifndef __U_BOOT__
 /* Table of built-in functions.  They can be forked or not, depending on
@@ -2204,7 +2200,7 @@ static char *get_local_var(const char *s)
    flg_export==0 if only local (not exporting) variable
    flg_export==1 if "new" exporting environ
    flg_export>1  if current startup environ (not call putenv()) */
-static int set_local_var(const char *s, int flg_export)
+int set_local_var(const char *s, int flg_export)
 {
 	char *name, *value;
 	int result=0;
@@ -2295,8 +2291,7 @@ static int set_local_var(const char *s, int flg_export)
 	return result;
 }

-#ifndef __U_BOOT__
-static void unset_local_var(const char *name)
+void unset_local_var(const char *name)
 {
 	struct variables *cur;

@@ -2311,8 +2306,10 @@ static void unset_local_var(const char *name)
 				error_msg("%s: readonly variable", name);
 				return;
 			} else {
+#ifndef __U_BOOT__
 				if(cur->flg_export)
 					unsetenv(cur->name);
+#endif
 				free(cur->name);
 				free(cur->value);
 				while (next->next != cur)
@@ -2323,7 +2320,6 @@ static void unset_local_var(const char *name)
 		}
 	}
 }
-#endif

 static int is_assignment(const char *s)
 {
@@ -3588,5 +3584,53 @@ static char * make_string(char ** inp)
 	return str;
 }

+#ifdef __U_BOOT__
+int do_showvar (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+	int i, k;
+	int rcode = 0;
+	struct variables *cur;
+
+	if (argc == 1) {		/* Print all env variables	*/
+		for (cur = top_vars; cur; cur = cur->next) {
+			printf ("%s=%s\n", cur->name, cur->value);
+			if (ctrlc ()) {
+				puts ("\n ** Abort\n");
+				return 1;
+			}
+		}
+		return 0;
+	}
+	for (i = 1; i < argc; ++i) {	/* print single env variables	*/
+		char *name = argv[i];
+
+		k = -1;
+		for (cur = top_vars; cur; cur = cur->next) {
+			if(strcmp (cur->name, name) == 0) {
+				k = 0;
+				printf ("%s=%s\n", cur->name, cur->value);
+			}
+			if (ctrlc ()) {
+				puts ("\n ** Abort\n");
+				return 1;
+			}
+		}
+		if (k < 0) {
+			printf ("## Error: \"%s\" not defined\n", name);
+			rcode ++;
+		}
+	}
+	return rcode;
+}
+
+U_BOOT_CMD(
+	showvar, CFG_MAXARGS, 1,	do_showvar,
+	"showvar- print local hushshell variables\n",
+	"\n    - print values of all hushshell variables\n"
+	"showvar name ...\n"
+	"    - print value of hushshell variable 'name'\n"
+);
+
+#endif
 #endif /* CFG_HUSH_PARSER */
 /****************************************************************************/
diff --git a/common/main.c b/common/main.c
index c06ea07..9a9fc9d 100644
--- a/common/main.c
+++ b/common/main.c
@@ -341,6 +341,10 @@ void main_loop (void)
 	u_boot_hush_start ();
 #endif

+#if defined(CONFIG_HUSH_INIT_VAR)
+	hush_init_var ();
+#endif
+
 #ifdef CONFIG_AUTO_COMPLETE
 	install_auto_complete();
 #endif
diff --git a/include/hush.h b/include/hush.h
index 20e48db..0805ff3 100644
--- a/include/hush.h
+++ b/include/hush.h
@@ -32,4 +32,10 @@ extern int u_boot_hush_start(void);
 extern int parse_string_outer(char *, int);
 extern int parse_file_outer(void);

+int set_local_var(const char *s, int flg_export);
+void unset_local_var(const char *name);
+
+#if defined(CONFIG_HUSH_INIT_VAR)
+extern int hush_init_var (void);
+#endif
 #endif
-- 
1.5.6.1

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany

                 reply	other threads:[~2008-10-15  7:40 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

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=48F59E6C.9050803@denx.de \
    --to=hs@denx.de \
    --cc=u-boot@lists.denx.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.