summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJacob Erlbeck <jerlbeck@sysmocom.de>2013-09-10 14:04:54 +0200
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2013-09-11 09:36:45 +0200
commitb3657e121645977a494c48950838129cb5fd0cd5 (patch)
treefb2c2da8c0a4970c0458497e407519d0d5a1d9fa /src
parent6ef71b062b9e8ddfcc1cf43aaf4a640a8b21c38e (diff)
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.
Diffstat (limited to 'src')
-rw-r--r--src/vty/command.c30
1 files 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 <errno.h>
#define _XOPEN_SOURCE
#include <unistd.h>
-#include <assert.h>
#include <ctype.h>
#include <time.h>
#include <sys/time.h>
@@ -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))