The command interpreter checks always if an environment variable for that name exists and in this case the content of the variable is executed. It becomes possible to redefine all U-Boot commands. A new "builtin" command is added to be able to run builtin U-boot commands even if they are redefined. For this reason, builtin is a reserved word an no environment variable can be set with this name.
Signed-off-by : Stefano Babic <[EMAIL PROTECTED]> --- common/cmd_nvedit.c | 8 ++++++++ common/hush.c | 9 ++++++++- common/main.c | 37 +++++++++++++++++++++++++++++++++++++ tools/env/fw_env.c | 8 ++++++++ 4 files changed, 61 insertions(+), 1 deletions(-) diff --git a/common/cmd_nvedit.c b/common/cmd_nvedit.c index 637d6c9..c6e4ec7 100644 --- a/common/cmd_nvedit.c +++ b/common/cmd_nvedit.c @@ -161,6 +161,14 @@ int _do_setenv (int flag, int argc, char *argv[]) } /* + * Check for reserved words + */ + if (strcmp(name, "builtin") == 0) { + printf ("## Error: builtin is a reserved word. You cannot set a variable with this name\n"); + return 1; + } + + /* * search if variable with this name already exists */ oldval = -1; diff --git a/common/hush.c b/common/hush.c index 093c428..bd7b223 100644 --- a/common/hush.c +++ b/common/hush.c @@ -1677,9 +1677,16 @@ static int run_pipe_real(struct pipe *pi) child->argv[i]); return -1; } - /* Look up command in command table */ + /* Check if exists a variable with that name, builtin is forbidden */ + if ((strcmp (child->argv[i], "builtin") != 0) && (p = getenv (child->argv[i])) != NULL ) { + int rcode; + rcode = (parse_string_outer(p, + FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP) != 0); + return rcode; + } + /* Look up command in command table */ if ((cmdtp = find_cmd(child->argv[i])) == NULL) { printf ("Unknown command '%s' - try 'help'\n", child->argv[i]); return -1; /* give up after bad command */ diff --git a/common/main.c b/common/main.c index c06ea07..d2be2ac 100644 --- a/common/main.c +++ b/common/main.c @@ -1289,6 +1289,7 @@ int run_command (const char *cmd, int flag) int argc, inquotes; int repeatable = 1; int rc = 0; + char *runenv; #ifdef DEBUG_PARSER printf ("[RUN_COMMAND] cmd[%p]=\"", cmd); @@ -1357,6 +1358,13 @@ int run_command (const char *cmd, int flag) continue; } + if ((strcmp (argv[0], "builtin") != 0) && ((runenv = getenv (argv[0])) != NULL )) { + if (run_command(runenv,flag) == -1) { + rc = -1; + } + continue; + } + /* Look up command in command table */ if ((cmdtp = find_cmd(argv[0])) == NULL) { printf ("Unknown command '%s' - try 'help'\n", argv[0]); @@ -1433,3 +1441,32 @@ int do_run (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) return 0; } #endif + +int do_builtin (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) +{ + int i; + + if (argc < 2) { + printf ("Usage:\n%s\n", cmdtp->usage); + return 1; + } + + /* Look up command in command table */ + if ((cmdtp = find_cmd(argv[1])) == NULL) { + printf ("Unknown builtin command '%s' - try 'help'\n", argv[1]); + return 1; + } + + /* Remove builtin from arg list */ + argc--; + + /* OK - call function to do the command */ + if ((cmdtp->cmd) (cmdtp, flag, argc, &argv[1]) != 0) { + return 1; + } +} + +U_BOOT_CMD( + builtin, CFG_MAXARGS, 1, do_builtin, + "builtin - run builtin commands\n", +); diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c index 6e9c34f..cc31b79 100644 --- a/tools/env/fw_env.c +++ b/tools/env/fw_env.c @@ -353,6 +353,14 @@ int fw_setenv (int argc, char *argv[]) name = argv[1]; /* + * Check for reserved words + */ + if (strcmp(name, "builtin") == 0) { + errno = EINVAL; + return -1; + } + + /* * search if variable with this name already exists */ for (nxt = env = environment.data; *env; env = nxt + 1) { -- 1.5.4.3 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot