diff options
-rw-r--r-- | src/vty/command.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/src/vty/command.c b/src/vty/command.c index 598e63cc..bec28a0d 100644 --- a/src/vty/command.c +++ b/src/vty/command.c @@ -139,6 +139,12 @@ static int cmp_desc(const void *p, const void *q) return strcmp(a->cmd, b->cmd); } +static int is_config(struct vty *vty) +{ + /* Assume that everything above CONFIG_NODE is a config node */ + return vty->node > CONFIG_NODE; +} + /* Sort each node's command element according to command string. */ void sort_node() { @@ -1947,9 +1953,9 @@ cmd_execute_command(vector vline, struct vty *vty, struct cmd_element **cmd, if (vtysh) return saved_ret; - /* This assumes all nodes above CONFIG_NODE are childs of CONFIG_NODE */ + /* Go to parent for config nodes to attempt to find the right command */ while (ret != CMD_SUCCESS && ret != CMD_WARNING - && vty->node > CONFIG_NODE) { + && is_config(vty)) { vty_go_parent(vty); ret = cmd_execute_command_real(vline, vty, cmd); tried = 1; @@ -2097,7 +2103,7 @@ int config_from_file(struct vty *vty, FILE * fp) /* Try again with setting node to CONFIG_NODE */ while (ret != CMD_SUCCESS && ret != CMD_WARNING && ret != CMD_ERR_NOTHING_TODO - && vty->node != CONFIG_NODE) { + && vty->node != CONFIG_NODE && is_config(vty)) { vty_go_parent(vty); ret = cmd_execute_command_strict(vline, vty, NULL); } |