summaryrefslogtreecommitdiffstats
path: root/src/vty
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2017-01-07 12:52:00 +0100
committerHarald Welte <laforge@gnumonks.org>2017-01-07 12:14:48 +0000
commitaddeaa39b172b4114bffbbfdd3dd09a029eb37b3 (patch)
treefe923303751fde1dbe7d9f05990dff749c8c1455 /src/vty
parentecbcdf52ec7c165c7933346441c02030833aba78 (diff)
vty: OSMO_ASSERT() if two identical commands are installed
When the caller installs two identical commands at a given VTY node, the result is that neither of the two commands can ever be executed: The VTY would always complain about "Ambiguous command.". Let's fail fast at program start when two identical commands are intalled. Change-Id: I85ff4640ebb3d8b75a6a9ab5d2f668edb5b7189e
Diffstat (limited to 'src/vty')
-rw-r--r--src/vty/command.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/vty/command.c b/src/vty/command.c
index 9d8bf314..587bd626 100644
--- a/src/vty/command.c
+++ b/src/vty/command.c
@@ -594,6 +594,22 @@ static int vty_dump_nodes(struct vty *vty)
return 0;
}
+/* \brief Check if a command with given string exists at given node */
+static int check_element_exists(struct cmd_node *cnode, const char *cmdstring)
+{
+ int i;
+
+ for (i = 0; i < vector_active(cnode->cmd_vector); ++i) {
+ struct cmd_element *elem;
+ elem = vector_slot(cnode->cmd_vector, i);
+ if (!elem->string)
+ continue;
+ if (!strcmp(elem->string, cmdstring))
+ return 1;
+ }
+ return 0;
+}
+
/*! \brief Install a command into a node
* \param[in] ntype Node Type
* \param[cmd] element to be installed
@@ -605,6 +621,9 @@ void install_element(int ntype, struct cmd_element *cmd)
cnode = vector_slot(cmdvec, ntype);
OSMO_ASSERT(cnode);
+ /* ensure no _identical_ command has been registered at this
+ * node so far */
+ OSMO_ASSERT(!check_element_exists(cnode, cmd->string));
vector_set(cnode->cmd_vector, cmd);