]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Remember protocol instance in proto_config and use that for
authorMartin Mares <mj@ucw.cz>
Tue, 30 Nov 1999 14:04:09 +0000 (14:04 +0000)
committerMartin Mares <mj@ucw.cz>
Tue, 30 Nov 1999 14:04:09 +0000 (14:04 +0000)
`show protocols <name>'.

TODO
doc/reply_codes
nest/cli.c
nest/proto.c
nest/protocol.h

diff --git a/TODO b/TODO
index e5648717dad1c553ea5376335c627a168733e0e2..d82bf811532178dbf7b0376b0c9695893a4b2ead 100644 (file)
--- a/TODO
+++ b/TODO
@@ -47,14 +47,12 @@ Commands
 shutdown                       # order system shutdown
 configure [<file>]
 debug  <what>                  # dump debugging information to log
-show   protocols [<name>]
-       <name>                  # show everything you know about symbol <name>
+show   <name>                  # show everything you know about symbol <name>
        route [<route>] [table <name>] [filter (<name> | { <inline> })] [where <condition>] [all]
        status                  # router id, version etc.
        rip ??? [<name>]
        ospf ??? [<name>]
        static ??? [<name>]
-       interfaces [<name>]
        neighbors               # ???
        filters [<name>]
 (disable|enable|restart) <protocol>    # or ALL?
index 89c8b5a5a9b714f1a791d38d913708b2c346aca1..3bafd74552490757f26af25538ca6b52a92eae02 100644 (file)
@@ -23,3 +23,4 @@ Reply codes of BIRD command-line interface
 
 9000   Command too long
 9001   Parse error
+9002   Invalid symbol type
index ca4cc826b304c85cddd23adc1c8d916f04ff12dd..88fb78d9ee66f17f826ea45578b759da0638d266 100644 (file)
@@ -6,6 +6,8 @@
  *     Can be freely distributed and used under the terms of the GNU GPL.
  */
 
+#include <string.h>
+
 #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;
index 29f961d4449ed92e05621fe2cc8b0434ec91f85f..0766608a2676a99b74c9cc8452888b345b03d6d4 100644 (file)
@@ -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, "");
 }
index 2a21c119b2ac5d44255349ce896d115962a89577..8958d0766122afb61c3a56882503ee07b33eeea7 100644 (file)
@@ -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 */