diff options
author | Tomas Vanek <vanekt@fbl.cz> | 2019-01-09 12:55:51 +0100 |
---|---|---|
committer | Tomas Vanek <vanekt@fbl.cz> | 2019-01-27 20:59:42 +0000 |
commit | 877cec20dca6e78f9f029f0f173879cda101a6c2 (patch) | |
tree | 1872cca472a4eb8cd0ecd545a111a74145345ae8 | |
parent | d4790209507ebda2de7fe124db2dc8e6a9122d4c (diff) | |
download | riscv-openocd-877cec20dca6e78f9f029f0f173879cda101a6c2.zip riscv-openocd-877cec20dca6e78f9f029f0f173879cda101a6c2.tar.gz riscv-openocd-877cec20dca6e78f9f029f0f173879cda101a6c2.tar.bz2 |
command: check command mode for native jim commands
The command mode was checked only for simple type of commands.
Native commands (handled by jim_handler) was treated as
they had mode COMMAND_ANY
Change-Id: Iab1d8cbb0b8c6f6b9f3cf942600432dec9a703ff
Signed-off-by: Tomas Vanek <vanekt@fbl.cz>
Reviewed-on: http://openocd.zylin.com/4841
Tested-by: jenkins
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
-rw-r--r-- | src/helper/command.c | 45 |
1 files changed, 26 insertions, 19 deletions
diff --git a/src/helper/command.c b/src/helper/command.c index 1ff4e01..0afbe2c 100644 --- a/src/helper/command.c +++ b/src/helper/command.c @@ -579,31 +579,35 @@ char *command_name(struct command *c, char delim) static bool command_can_run(struct command_context *cmd_ctx, struct command *c) { - return c->mode == COMMAND_ANY || c->mode == cmd_ctx->mode; + if (c->mode == COMMAND_ANY || c->mode == cmd_ctx->mode) + return true; + + /* Many commands may be run only before/after 'init' */ + const char *when; + switch (c->mode) { + case COMMAND_CONFIG: + when = "before"; + break; + case COMMAND_EXEC: + when = "after"; + break; + /* handle the impossible with humor; it guarantees a bug report! */ + default: + when = "if Cthulhu is summoned by"; + break; + } + char *full_name = command_name(c, ' '); + LOG_ERROR("The '%s' command must be used %s 'init'.", + full_name ? full_name : c->name, when); + free(full_name); + return false; } static int run_command(struct command_context *context, struct command *c, const char *words[], unsigned num_words) { - if (!command_can_run(context, c)) { - /* Many commands may be run only before/after 'init' */ - const char *when; - switch (c->mode) { - case COMMAND_CONFIG: - when = "before"; - break; - case COMMAND_EXEC: - when = "after"; - break; - /* handle the impossible with humor; it guarantees a bug report! */ - default: - when = "if Cthulhu is summoned by"; - break; - } - LOG_ERROR("The '%s' command must be used %s 'init'.", - c->name, when); + if (!command_can_run(context, c)) return ERROR_FAIL; - } struct command_invocation cmd = { .ctx = context, @@ -1032,6 +1036,9 @@ static int command_unknown(Jim_Interp *interp, int argc, Jim_Obj *const *argv) } /* pass the command through to the intended handler */ if (c->jim_handler) { + if (!command_can_run(cmd_ctx, c)) + return ERROR_FAIL; + interp->cmdPrivData = c->jim_handler_data; return (*c->jim_handler)(interp, count, start); } |