refactor command mode detection

Splits the check for a command's ability to run into a helper.

This also fixes a bug whereby commands that specified COMMAND_EXEC
were allowed to run during the configuration stage.  This allowed
problematic commands to be called before 'init', defeating the intention
of specifying that command mode.  With this change, the run_command()
helper denies access to handlers that should run only after 'init'
during the configuration stage.
This commit is contained in:
Zachary T Welch 2009-11-27 10:16:42 -08:00
parent 933b4579f0
commit fd343bea7f
1 changed files with 7 additions and 2 deletions

View File

@ -525,13 +525,18 @@ char *command_name(struct command *c, char delim)
return __command_name(c, delim, 0); return __command_name(c, delim, 0);
} }
static bool command_can_run(struct command_context *cmd_ctx, struct command *c)
{
return c->mode == COMMAND_ANY || c->mode == cmd_ctx->mode;
}
static int run_command(struct command_context *context, static int run_command(struct command_context *context,
struct command *c, const char *words[], unsigned num_words) struct command *c, const char *words[], unsigned num_words)
{ {
if (!((context->mode == COMMAND_CONFIG) || (c->mode == COMMAND_ANY) || (c->mode == context->mode))) if (!command_can_run(context, c))
{ {
/* Config commands can not run after the config stage */ /* Config commands can not run after the config stage */
LOG_ERROR("Command '%s' only runs during configuration stage", c->name); LOG_ERROR("The '%s' command must be used before 'init'.", c->name);
return ERROR_FAIL; return ERROR_FAIL;
} }