diff --git a/TODO b/TODO index e5648717..d82bf811 100644 --- a/TODO +++ b/TODO @@ -47,14 +47,12 @@ Commands shutdown # order system shutdown configure [] debug # dump debugging information to log -show protocols [] - # show everything you know about symbol +show # show everything you know about symbol route [] [table ] [filter ( | { })] [where ] [all] status # router id, version etc. rip ??? [] ospf ??? [] static ??? [] - interfaces [] neighbors # ??? filters [] (disable|enable|restart) # or ALL? diff --git a/doc/reply_codes b/doc/reply_codes index 89c8b5a5..3bafd745 100644 --- a/doc/reply_codes +++ b/doc/reply_codes @@ -23,3 +23,4 @@ Reply codes of BIRD command-line interface 9000 Command too long 9001 Parse error +9002 Invalid symbol type diff --git a/nest/cli.c b/nest/cli.c index ca4cc826..88fb78d9 100644 --- a/nest/cli.c +++ b/nest/cli.c @@ -6,6 +6,8 @@ * Can be freely distributed and used under the terms of the GNU GPL. */ +#include + #include "nest/bird.h" #include "nest/cli.h" #include "conf/conf.h" @@ -119,7 +121,7 @@ cli_command(struct cli *c) struct config f; int res; - f.pool = NULL; + bzero(&f, sizeof(f)); f.mem = c->parser_pool; cf_read_hook = cli_cmd_read_hook; cli_rh_pos = c->rx_buf; diff --git a/nest/proto.c b/nest/proto.c index 29f961d4..0766608a 100644 --- a/nest/proto.c +++ b/nest/proto.c @@ -78,7 +78,7 @@ proto_relink(struct proto *p) void * proto_new(struct proto_config *c, unsigned size) { - struct protocol *pr = c->proto; + struct protocol *pr = c->protocol; struct proto *p = mb_allocz(proto_pool, size); p->cf = c; @@ -90,6 +90,7 @@ proto_new(struct proto_config *c, unsigned size) p->table = c->table->table; p->in_filter = c->in_filter; p->out_filter = c->out_filter; + c->proto = p; return p; } @@ -136,7 +137,7 @@ proto_config_new(struct protocol *pr, unsigned size) add_tail(&new_config->protos, &c->n); c->global = new_config; - c->proto = pr; + c->protocol = pr; c->debug = pr->debug; c->name = pr->name; c->out_filter = FILTER_REJECT; @@ -174,7 +175,7 @@ protos_postconfig(struct config *c) WALK_LIST(x, c->protos) { debug(" %s", x->name); - p = x->proto; + p = x->protocol; if (p->postconfig) p->postconfig(x); } @@ -192,7 +193,7 @@ protos_commit(struct config *c) WALK_LIST(x, c->protos) { debug(" %s", x->name); - p = x->proto; + p = x->protocol; q = p->init(x); q->proto_state = PS_DOWN; q->core_state = FS_HUNGRY; @@ -458,33 +459,47 @@ proto_goal_name(struct proto *p) } static void -proto_do_show(list *l, int verbose) +proto_do_show(struct proto *p, int verbose) +{ + cli_msg(-1002, "%-8s %-8s %-8s %s%s", + p->name, + p->proto->name, + p->table->name, + proto_state_name(p), + proto_goal_name(p)); + if (verbose) + { + cli_msg(-1006, "\tPreference: %d", p->preference); + cli_msg(-1006, "\tInput filter: %s", filter_name(p->in_filter)); + cli_msg(-1006, "\tOutput filter: %s", filter_name(p->out_filter)); + } +} + +static void +proto_do_show_list(list *l, int verbose) { struct proto *p; WALK_LIST(p, *l) - { - cli_msg(-1002, "%-8s %-8s %-8s %s%s", - p->name, - p->proto->name, - p->table->name, - proto_state_name(p), - proto_goal_name(p)); - if (verbose) - { - cli_msg(-1006, "\tPreference: %d", p->preference); - cli_msg(-1006, "\tInput filter: %s", filter_name(p->in_filter)); - cli_msg(-1006, "\tOutput filter: %s", filter_name(p->out_filter)); - } - } + proto_do_show(p, verbose); } void proto_show(struct symbol *s, int verbose) { + if (s && s->class != SYM_PROTO) + { + cli_msg(9002, "%s is not a protocol", s->name); + return; + } cli_msg(-2002, "name proto table state"); - proto_do_show(&proto_list, verbose); - proto_do_show(&flush_proto_list, verbose); - proto_do_show(&inactive_proto_list, verbose); + if (s) + proto_do_show(((struct proto_config *)s->def)->proto, verbose); + else + { + proto_do_show_list(&proto_list, verbose); + proto_do_show_list(&flush_proto_list, verbose); + proto_do_show_list(&inactive_proto_list, verbose); + } cli_msg(0, ""); } diff --git a/nest/protocol.h b/nest/protocol.h index 2a21c119..8958d076 100644 --- a/nest/protocol.h +++ b/nest/protocol.h @@ -74,7 +74,8 @@ extern struct protocol proto_pipe; struct proto_config { node n; struct config *global; /* Global configuration data */ - struct protocol *proto; /* Protocol */ + struct protocol *protocol; /* Protocol */ + struct proto *proto; /* Instance we've created */ char *name; unsigned debug, preference, disabled; /* Generic parameters */ struct rtable_config *table; /* Table we're attached to */