[PATCH] vty: Allow vty_go_parent() in all nodes.

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/OpenBSC@lists.osmocom.org/.

Jacob Erlbeck jerlbeck at sysmocom.de
Tue Sep 10 12:04:54 UTC 2013


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 7f76ced..d6a2c18 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))
-- 
1.7.9.5





More information about the OpenBSC mailing list