From b3657e121645977a494c48950838129cb5fd0cd5 Mon Sep 17 00:00:00 2001 From: Jacob Erlbeck Date: Tue, 10 Sep 2013 14:04:54 +0200 Subject: vty: Allow vty_go_parent() in all nodes. This patch removes an assertion of node > CONFIG_NODE and changes the function to handle all nodes properly. For the sake of completeness, the generic 'exit' command implementation is extended to work properly with all nodes, too. --- src/vty/command.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/vty/command.c b/src/vty/command.c index 7f76ced2..44a1b6cb 100644 --- a/src/vty/command.c +++ b/src/vty/command.c @@ -29,7 +29,6 @@ Boston, MA 02111-1307, USA. */ #include #define _XOPEN_SOURCE #include -#include #include #include #include @@ -1884,15 +1883,33 @@ char **cmd_complete_command(vector vline, struct vty *vty, int *status) } /* return parent node */ -/* MUST eventually converge on CONFIG_NODE */ +/* + * This function MUST eventually converge on a node when called repeatedly, + * there must not be any cycles. + * All 'config' nodes shall converge on CONFIG_NODE. + * All other 'enable' nodes shall converge on ENABLE_NODE. + * All 'view' only nodes shall converge on VIEW_NODE. + * All other nodes shall converge on themselves or it must be ensured, + * that the user's rights are not extended anyhow by calling this function. + * + * Note that these requirements also apply to all functions that are used + * as go_parent_cb. + * Note also that this function relies on the is_config_child callback to + * recognize non-config nodes if go_parent_cb is not set. + */ enum node_type vty_go_parent(struct vty *vty) { - assert(vty->node > CONFIG_NODE); - switch (vty->node) { + case AUTH_NODE: + case VIEW_NODE: + case ENABLE_NODE: case CONFIG_NODE: break; + case AUTH_ENABLE_NODE: + vty->node = VIEW_NODE; + break; + case CFG_LOG_NODE: case VTY_NODE: vty->node = CONFIG_NODE; @@ -1901,8 +1918,10 @@ enum node_type vty_go_parent(struct vty *vty) default: if (host.app_info->go_parent_cb) host.app_info->go_parent_cb(vty); - else + else if (is_config_child(vty)) vty->node = CONFIG_NODE; + else + vty->node = VIEW_NODE; break; } @@ -2267,6 +2286,7 @@ gDEFUN(config_exit, config_exit_cmd, "exit", "Exit current mode and down to previous mode\n") { switch (vty->node) { + case AUTH_NODE: case VIEW_NODE: case ENABLE_NODE: if (0) //vty_shell (vty)) -- cgit v1.2.3