diff options
author | Vadim Yanitskiy <vyanitskiy@sysmocom.de> | 2020-10-07 13:13:07 +0700 |
---|---|---|
committer | Vadim Yanitskiy <vyanitskiy@sysmocom.de> | 2020-10-07 14:17:02 +0700 |
commit | 7e1a78fb03fb32ff7e9ea3da0ae1e944a93fffee (patch) | |
tree | ef0a51e4e0c5d99b4a0d8ea03b360d69e8b6c2b7 /src/vty | |
parent | 9a28d3c599b8be7b1442cce1d8598f48bd99bb86 (diff) |
vty/command: assign flags to CMD_ATTR_{IMMEDIATE,NODE_EXIT}
Change-Id: I77c1ef7ca4c667c769cc53c7ac65c3be5c7e1c86
Related: SYS#4937
Diffstat (limited to 'src/vty')
-rw-r--r-- | src/vty/command.c | 54 |
1 files changed, 48 insertions, 6 deletions
diff --git a/src/vty/command.c b/src/vty/command.c index 60fb6207..d64902ba 100644 --- a/src/vty/command.c +++ b/src/vty/command.c @@ -631,6 +631,19 @@ static const struct value_string cmd_attr_desc[] = { { 0, NULL } }; +/* Get a flag character for a global VTY command attribute */ +static char cmd_attr_get_flag(unsigned int attr) +{ + switch (attr) { + case CMD_ATTR_IMMEDIATE: + return '!'; + case CMD_ATTR_NODE_EXIT: + return '@'; + default: + return '.'; + } +} + /* Description of attributes shared between the lib commands */ static const char * const cmd_lib_attr_desc[32] = { /* [OSMO_LIBNAME_LIB_ATTR_ATTRNAME] = \ @@ -662,14 +675,20 @@ static int vty_dump_element(struct cmd_element *cmd, print_func_t print_func, vo for (i = 0; i < ARRAY_SIZE(cmd_attr_desc) - 1; i++) { char *xml_att_desc; + char flag; if (~cmd->attr & cmd_attr_desc[i].value) continue; xml_att_desc = xml_escape(cmd_attr_desc[i].str); - print_func(data, " <attribute doc='%s' />%s", + print_func(data, " <attribute doc='%s'", xml_att_desc, newline); talloc_free(xml_att_desc); + + flag = cmd_attr_get_flag(cmd_attr_desc[i].value); + if (flag != '.') + print_func(data, " flag='%c'", flag); + print_func(data, " />%s", newline); } print_func(data, " </attributes>%s", newline); @@ -2965,9 +2984,12 @@ static void print_attr_list(struct vty *vty, unsigned int attr_mask) vty_out(vty, " Global attributes:%s", VTY_NEWLINE); for (i = 0; i < ARRAY_SIZE(cmd_attr_desc) - 1; i++) { + flag = cmd_attr_get_flag(cmd_attr_desc[i].value); desc = cmd_attr_desc[i].str; - flag = '.'; /* FIXME: no flags defined */ - vty_out(vty, " %c %s%s", flag, desc, VTY_NEWLINE); + + /* Skip attributes without flags */ + if (flag != '.') + vty_out(vty, " %c %s%s", flag, desc, VTY_NEWLINE); } } @@ -3072,7 +3094,26 @@ static unsigned int node_flag_mask(const struct cmd_node *cnode) return flag_mask; } -/* Compose flag char-mask for the given command (e.g. ".F.OB..") */ +/* Compose global flag char-mask for the given command (e.g. "!" or "@") */ +static const char *cmd_gflag_mask(const struct cmd_element *cmd) +{ + static char char_mask[8 + 1]; + char *ptr = &char_mask[0]; + + /* Mutually exclusive global attributes */ + if (cmd->attr & CMD_ATTR_IMMEDIATE) + *(ptr++) = cmd_attr_get_flag(CMD_ATTR_IMMEDIATE); + else if (cmd->attr & CMD_ATTR_NODE_EXIT) + *(ptr++) = cmd_attr_get_flag(CMD_ATTR_NODE_EXIT); + else + *(ptr++) = '.'; + + *ptr = '\0'; + + return char_mask; +} + +/* Compose app / lib flag char-mask for the given command (e.g. ".F.OB..") */ static const char *cmd_flag_mask(const struct cmd_element *cmd, unsigned int flag_mask) { @@ -3121,10 +3162,11 @@ gDEFUN(config_list, config_list_cmd, continue; if (cmd->attr & (CMD_ATTR_DEPRECATED | CMD_ATTR_HIDDEN)) continue; - if (!flag_mask) + if (!argc) vty_out(vty, " %s%s", cmd->string, VTY_NEWLINE); else { - vty_out(vty, " %s %s%s", + vty_out(vty, " %s %s %s%s", + cmd_gflag_mask(cmd), cmd_flag_mask(cmd, flag_mask), cmd->string, VTY_NEWLINE); } |