summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorRafael Zalamena <rzalamena@users.noreply.github.com>2021-06-07 13:32:31 +0200
committerGitHub <noreply@github.com>2021-06-07 13:32:31 +0200
commit4548fb256c31e0c9e7e913e8dc110934d7c0d79a (patch)
treedca46163795e8e6bb1a2ca2dae4747122cdc240a /lib
parentMerge pull request #8756 from volta-networks/ospfd_sr_blocks (diff)
parentlib: fix output of "list" and "find" commands (diff)
downloadfrr-4548fb256c31e0c9e7e913e8dc110934d7c0d79a.tar.xz
frr-4548fb256c31e0c9e7e913e8dc110934d7c0d79a.zip
Merge pull request #8781 from idryzhov/fix-list-find
lib: fix output of "list" and "find" commands
Diffstat (limited to 'lib')
-rw-r--r--lib/command.c78
-rw-r--r--lib/command.h1
2 files changed, 69 insertions, 10 deletions
diff --git a/lib/command.c b/lib/command.c
index c95508743..008f98a34 100644
--- a/lib/command.c
+++ b/lib/command.c
@@ -1493,6 +1493,56 @@ static void permute(struct graph_node *start, struct vty *vty)
list_delete_node(position, listtail(position));
}
+static void print_cmd(struct vty *vty, const char *cmd)
+{
+ int i, j, len = strlen(cmd);
+ char buf[len];
+ bool skip = false;
+
+ j = 0;
+ for (i = 0; i < len; i++) {
+ /* skip varname */
+ if (cmd[i] == '$')
+ skip = true;
+ else if (strchr(" ()<>[]{}|", cmd[i]))
+ skip = false;
+
+ if (skip)
+ continue;
+
+ if (isspace(cmd[i])) {
+ /* skip leading whitespace */
+ if (i == 0)
+ continue;
+ /* skip trailing whitespace */
+ if (i == len - 1)
+ continue;
+ /* skip all whitespace after opening brackets or pipe */
+ if (strchr("(<[{|", cmd[i - 1])) {
+ while (isspace(cmd[i + 1]))
+ i++;
+ continue;
+ }
+ /* skip repeated whitespace */
+ if (isspace(cmd[i + 1]))
+ continue;
+ /* skip whitespace before closing brackets or pipe */
+ if (strchr(")>]}|", cmd[i + 1]))
+ continue;
+ /* convert tabs to spaces */
+ if (cmd[i] == '\t') {
+ buf[j++] = ' ';
+ continue;
+ }
+ }
+
+ buf[j++] = cmd[i];
+ }
+ buf[j] = 0;
+
+ vty_out(vty, "%s\n", buf);
+}
+
int cmd_list_cmds(struct vty *vty, int do_permute)
{
struct cmd_node *node = vector_slot(cmdvec, vty->node);
@@ -1506,8 +1556,10 @@ int cmd_list_cmds(struct vty *vty, int do_permute)
i++)
if ((element = vector_slot(node->cmd_vector, i))
&& element->attr != CMD_ATTR_DEPRECATED
- && element->attr != CMD_ATTR_HIDDEN)
- vty_out(vty, " %s\n", element->string);
+ && element->attr != CMD_ATTR_HIDDEN) {
+ vty_out(vty, " ");
+ print_cmd(vty, element->string);
+ }
}
return CMD_SUCCESS;
}
@@ -2240,11 +2292,7 @@ DEFUN (no_banner_motd,
return CMD_SUCCESS;
}
-DEFUN(find,
- find_cmd,
- "find REGEX...",
- "Find CLI command matching a regular expression\n"
- "Search pattern (POSIX regex)\n")
+int cmd_find_cmds(struct vty *vty, struct cmd_token **argv, int argc)
{
const struct cmd_node *node;
const struct cmd_element *cli;
@@ -2311,9 +2359,10 @@ DEFUN(find,
for (unsigned int j = 0; j < vector_active(clis); j++) {
cli = vector_slot(clis, j);
- if (regexec(&exp, cli->string, 0, NULL, 0) == 0)
- vty_out(vty, " (%s) %s\n",
- node->name, cli->string);
+ if (regexec(&exp, cli->string, 0, NULL, 0) == 0) {
+ vty_out(vty, " (%s) ", node->name);
+ print_cmd(vty, cli->string);
+ }
}
}
@@ -2322,6 +2371,15 @@ done:
return CMD_SUCCESS;
}
+DEFUN(find,
+ find_cmd,
+ "find REGEX...",
+ "Find CLI command matching a regular expression\n"
+ "Search pattern (POSIX regex)\n")
+{
+ return cmd_find_cmds(vty, argv, argc);
+}
+
#if defined(DEV_BUILD) && defined(HAVE_SCRIPTING)
DEFUN(script,
script_cmd,
diff --git a/lib/command.h b/lib/command.h
index c36797d12..13bd61e9f 100644
--- a/lib/command.h
+++ b/lib/command.h
@@ -578,6 +578,7 @@ extern void cmd_init_config_callbacks(void (*start_config_cb)(void),
extern void cmd_terminate(void);
extern void cmd_exit(struct vty *vty);
extern int cmd_list_cmds(struct vty *vty, int do_permute);
+extern int cmd_find_cmds(struct vty *vty, struct cmd_token **argv, int argc);
extern int cmd_domainname_set(const char *domainname);
extern int cmd_hostname_set(const char *hostname);