diff --git a/conf/confbase.Y b/conf/confbase.Y
index b952f314..b9bc048e 100644
--- a/conf/confbase.Y
+++ b/conf/confbase.Y
@@ -50,6 +50,7 @@ CF_DECLS
struct f_path_mask *h;
struct password_item *p;
struct rt_show_data *ra;
+ struct sym_show_data *sd;
struct lsadb_show_data *ld;
struct iface *iface;
void *g;
diff --git a/doc/bird.sgml b/doc/bird.sgml
index f5cfdfb1..aabb9857 100644
--- a/doc/bird.sgml
+++ b/doc/bird.sgml
@@ -570,7 +570,7 @@ This argument can be omitted if there exists only a single instance.
show interfaces [summary]
Show the list of interfaces. For each interface, print its type, state, MTU and addresses assigned.
- show symbols
+ show symbols [table|filter|function|protocol|template|]
Show the list of symbols defined in the configuration (names of protocols, routing tables etc.).
show route [[for]
diff --git a/nest/cmds.c b/nest/cmds.c
index 8ac32096..62d7c9b4 100644
--- a/nest/cmds.c
+++ b/nest/cmds.c
@@ -7,6 +7,7 @@
*/
#include "nest/bird.h"
+#include "nest/route.h"
#include "nest/cli.h"
#include "conf/conf.h"
#include "nest/cmds.h"
@@ -35,16 +36,22 @@ cmd_show_status(void)
}
void
-cmd_show_symbols(struct symbol *sym)
+cmd_show_symbols(struct sym_show_data *sd)
{
int pos = 0;
+ struct symbol *sym = sd->sym;
if (sym)
- cli_msg(1010, "%s\t%s", sym->name, cf_symbol_class_name(sym));
+ cli_msg(1010, "%-8s\t%s", sym->name, cf_symbol_class_name(sym));
else
{
while (sym = cf_walk_symbols(config, sym, &pos))
- cli_msg(-1010, "%s\t%s", sym->name, cf_symbol_class_name(sym));
+ {
+ if (sd->type && (sym->class != sd->type))
+ continue;
+
+ cli_msg(-1010, "%-8s\t%s", sym->name, cf_symbol_class_name(sym));
+ }
cli_msg(0, "");
}
}
diff --git a/nest/cmds.h b/nest/cmds.h
index 3b86a924..8b0bff7e 100644
--- a/nest/cmds.h
+++ b/nest/cmds.h
@@ -6,6 +6,11 @@
* Can be freely distributed and used under the terms of the GNU GPL.
*/
+struct sym_show_data {
+ int type; /* Symbols type to show */
+ struct symbol *sym;
+};
+
void cmd_show_status(void);
-void cmd_show_symbols(struct symbol *sym);
+void cmd_show_symbols(struct sym_show_data *sym);
void cmd_show_memory(void);
diff --git a/nest/config.Y b/nest/config.Y
index 3fcfa528..f6795df4 100644
--- a/nest/config.Y
+++ b/nest/config.Y
@@ -59,6 +59,7 @@ CF_ENUM(T_ENUM_RTD, RTD_, ROUTER, DEVICE, BLACKHOLE, UNREACHABLE, PROHIBIT, MULT
%type rtable
%type optsym
%type r_args
+%type sym_args
%type proto_start echo_mask echo_size debug_mask debug_list debug_flag mrtdump_mask mrtdump_list mrtdump_flag export_or_preexport
%type proto_patt proto_patt2
@@ -432,9 +433,21 @@ export_or_preexport:
| EXPORT { $$ = 2; }
;
-CF_CLI(SHOW SYMBOLS, optsym, [], [[Show all known symbolic names]])
+CF_CLI(SHOW SYMBOLS, sym_args, [table|filter|function|protocol|template|], [[Show all known symbolic names]])
{ cmd_show_symbols($3); } ;
+sym_args:
+ /* empty */ {
+ $$ = cfg_allocz(sizeof(struct sym_show_data));
+ }
+ | sym_args TABLE { $$ = $1; $$->type = SYM_TABLE; }
+ | sym_args FUNCTION { $$ = $1; $$->type = SYM_FUNCTION; }
+ | sym_args FILTER { $$ = $1; $$->type = SYM_FILTER; }
+ | sym_args PROTOCOL { $$ = $1; $$->type = SYM_PROTO; }
+ | sym_args TEMPLATE { $$ = $1; $$->type = SYM_TEMPLATE; }
+ | sym_args SYM { $$ = $1; $$->sym = $2; }
+ ;
+
CF_CLI_HELP(DUMP, ..., [[Dump debugging information]])
CF_CLI(DUMP RESOURCES,,, [[Dump all allocated resource]])
{ rdump(&root_pool); cli_msg(0, ""); } ;