diff options
author | Simon Glass <sjg@chromium.org> | 2012-02-14 19:59:23 +0000 |
---|---|---|
committer | Wolfgang Denk <wd@denx.de> | 2012-03-06 21:09:34 +0100 |
commit | bdf8e34b936e2b94990ab6ce8dd5463d14d173dd (patch) | |
tree | 1cd5822ee530eaba3b22fb6fcf50967c6fce6d19 | |
parent | 7fed89e00e0836f7894f350716b3f182ee562760 (diff) |
Create a single cmd_call() function to handle command execution
We should aim for a single point of entry to the commands, whichever
parser is used.
Signed-off-by: Simon Glass <sjg@chromium.org>
-rw-r--r-- | common/command.c | 21 | ||||
-rw-r--r-- | common/hush.c | 9 | ||||
-rw-r--r-- | common/main.c | 3 | ||||
-rw-r--r-- | include/command.h | 3 |
4 files changed, 28 insertions, 8 deletions
diff --git a/common/command.c b/common/command.c index c5cecd3bf5..fe290759cd 100644 --- a/common/command.c +++ b/common/command.c @@ -487,3 +487,24 @@ void fixup_cmdtable(cmd_tbl_t *cmdtp, int size) } } #endif + +/** + * Call a command function. This should be the only route in U-Boot to call + * a command, so that we can track whether we are waiting for input or + * executing a command. + * + * @param cmdtp Pointer to the command to execute + * @param flag Some flags normally 0 (see CMD_FLAG_.. above) + * @param argc Number of arguments (arg 0 must be the command text) + * @param argv Arguments + * @return 0 if command succeeded, else non-zero (CMD_RET_...) + */ +int cmd_call(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ + int result; + + result = (cmdtp->cmd)(cmdtp, flag, argc, argv); + if (result) + debug("Command failed, result=%d", result); + return result; +} diff --git a/common/hush.c b/common/hush.c index e8e24d7dea..6cb921d4f3 100644 --- a/common/hush.c +++ b/common/hush.c @@ -1679,13 +1679,10 @@ static int run_pipe_real(struct pipe *pi) rcode = x->function(child); #else /* OK - call function to do the command */ - - rcode = (cmdtp->cmd) -(cmdtp, flag,child->argc-i,&child->argv[i]); - if ( !cmdtp->repeatable ) + rcode = cmd_call(cmdtp, flag, child->argc-i, + &child->argv[i]); + if (!cmdtp->repeatable) flag_repeat = 0; - - #endif child->argv-=i; /* XXX restore hack so free() can work right */ #ifndef __U_BOOT__ diff --git a/common/main.c b/common/main.c index 637da2b4d3..6a3eac28aa 100644 --- a/common/main.c +++ b/common/main.c @@ -1370,9 +1370,8 @@ static int builtin_run_command(const char *cmd, int flag) #endif /* OK - call function to do the command */ - if ((cmdtp->cmd) (cmdtp, flag, argc, argv) != 0) { + if (cmd_call(cmdtp, flag, argc, argv) != 0) rc = -1; - } repeatable &= cmdtp->repeatable; diff --git a/include/command.h b/include/command.h index 3912b80cdd..6dc694f7a8 100644 --- a/include/command.h +++ b/include/command.h @@ -112,6 +112,8 @@ static inline int bootm_maybe_autostart(cmd_tbl_t *cmdtp, const char *cmd) #endif extern int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); +int cmd_call(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); + #endif /* __ASSEMBLY__ */ /* @@ -150,4 +152,5 @@ extern int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); #if defined(CONFIG_NEEDS_MANUAL_RELOC) void fixup_cmdtable(cmd_tbl_t *cmdtp, int size); #endif + #endif /* __COMMAND_H */ |