aboutsummaryrefslogtreecommitdiffstats
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
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.
-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))