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/gerrit-log@lists.osmocom.org/.
Neels Hofmeyr gerrit-no-reply at lists.osmocom.org
Review at https://gerrit.osmocom.org/3979
vty: derive node name from prompt, use as XML ids
The 'show online-help' produces XML output with <node id="..."> ids. We
reference those from the osmo-gsm-manuals.
Instead of numeric IDs coming from internal code, rather use a human-readable
node ID. In order to obtain such while remaining backwards compatible, derive
such a name from the command node's prompt by stripping non-alnum characters.
If this is merged, we need to adjust the references in osmo-gsm-manuals.git.
Change-Id: I8fa555570268b231c5e01727c661da92fad265de
---
M include/osmocom/vty/command.h
M src/vty/command.c
2 files changed, 49 insertions(+), 1 deletion(-)
git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/79/3979/1
diff --git a/include/osmocom/vty/command.h b/include/osmocom/vty/command.h
index 0fa5175..580c58e 100644
--- a/include/osmocom/vty/command.h
+++ b/include/osmocom/vty/command.h
@@ -123,6 +123,11 @@
/*! Vector of this node's command list. */
vector cmd_vector;
+
+ /*! Human-readable ID of this node. Should only contain alphanumeric
+ * plus '-' and '_' characters (is used as XML ID for 'show
+ * online-help'). If left NUL, this is derived from the prompt.*/
+ char name[64];
};
enum {
diff --git a/src/vty/command.c b/src/vty/command.c
index 8512ec8..76b6851 100644
--- a/src/vty/command.c
+++ b/src/vty/command.c
@@ -123,12 +123,40 @@
return str;
}
+/* For the lack of a better defined way to derive a node name from user input,
+ * mangle the provided prompt to make a node name that consists of only alnum,
+ * '-' and '_'. For example used for XML IDs in 'show online-help'. */
+static const char *node_name_from_prompt(const char *prompt, char *name_buf, size_t name_buf_size)
+{
+ const char *pos;
+ int dest = 0;
+
+ if (!prompt || !*prompt)
+ return "";
+
+ for (pos = prompt; *pos && dest < (name_buf_size-1); pos++) {
+ if (pos[0] == '%' && pos[1]) {
+ /* skip "%s"; loop pos++ does the second one. */
+ pos++;
+ continue;
+ }
+ if (!(isalnum(pos[0]) || pos[0] == '-' || pos[0] == '_'))
+ continue;
+ name_buf[dest] = pos[0];
+ dest++;
+ }
+ name_buf[dest] = '\0';
+ return name_buf;
+}
+
/*! Install top node of command vector. */
void install_node(struct cmd_node *node, int (*func) (struct vty *))
{
vector_set_index(cmdvec, node->node, node);
node->func = func;
node->cmd_vector = vector_init(VECTOR_MIN_SIZE);
+ if (!node->name || !*node->name)
+ node_name_from_prompt(node->prompt, node->name, sizeof(node->name));
}
/* Compare two command's string. Used in sort_node (). */
@@ -570,6 +598,7 @@
static int vty_dump_nodes(struct vty *vty)
{
int i, j;
+ int same_name_count;
vty_out(vty, "<vtydoc xmlns='urn:osmocom:xml:libosmocore:vty:doc:1.0'>%s", VTY_NEWLINE);
@@ -579,7 +608,21 @@
if (!cnode)
continue;
- vty_out(vty, " <node id='%d'>%s", cnode->node, VTY_NEWLINE);
+ /* How many times has this same prompt been used before? */
+ same_name_count = 1;
+ for (j = 0; j < i; ++j) {
+ struct cmd_node *cnode2;
+ cnode2 = vector_slot(cmdvec, j);
+ if (!cnode2)
+ continue;
+ if (strcmp(cnode->name, cnode2->name) == 0)
+ same_name_count ++;
+ }
+
+ vty_out(vty, " <node id='%s", cnode->name);
+ if (same_name_count > 1 || !*cnode->name)
+ vty_out(vty, "_%d", same_name_count);
+ vty_out(vty, "'>%s", VTY_NEWLINE);
for (j = 0; j < vector_active(cnode->cmd_vector); ++j) {
struct cmd_element *elem;
--
To view, visit https://gerrit.osmocom.org/3979
To unsubscribe, visit https://gerrit.osmocom.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I8fa555570268b231c5e01727c661da92fad265de
Gerrit-PatchSet: 1
Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Owner: Neels Hofmeyr <nhofmeyr at sysmocom.de>