summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Mares <mj@ucw.cz>1999-12-03 12:40:45 +0100
committerMartin Mares <mj@ucw.cz>1999-12-03 12:40:45 +0100
commit02c1fbddd462fecc6887a44ef67202870bcae7be (patch)
tree571deb0c83d55826ec90fe317544bd548ac848d3
parent28e01f85c65c536837227829f645818dfa6a2652 (diff)
downloadbird-02c1fbddd462fecc6887a44ef67202870bcae7be.tar
bird-02c1fbddd462fecc6887a44ef67202870bcae7be.zip
Added proto_get_named() to be used in CLI commands to get protocol instance
of a given protocol with optionally given name. See `show static' for an example.
-rw-r--r--nest/proto.c29
-rw-r--r--nest/protocol.h1
2 files changed, 30 insertions, 0 deletions
diff --git a/nest/proto.c b/nest/proto.c
index 94bbbfd..a0beb5f 100644
--- a/nest/proto.c
+++ b/nest/proto.c
@@ -499,3 +499,32 @@ proto_show(struct symbol *s, int verbose)
}
cli_msg(0, "");
}
+
+struct proto *
+proto_get_named(struct symbol *sym, struct protocol *pr)
+{
+ struct proto *p, *q;
+
+ if (sym)
+ {
+ if (sym->class != SYM_PROTO)
+ cf_error("%s: Not a protocol", sym->name);
+ p = ((struct proto_config *)sym->def)->proto;
+ if (!p || p->proto != pr)
+ cf_error("%s: Not a %s protocol", sym->name, pr->name);
+ }
+ else
+ {
+ p = NULL;
+ WALK_LIST(q, proto_list)
+ if (q->proto == pr)
+ {
+ if (p)
+ cf_error("There are multiple %s protocols running", pr->name);
+ p = q;
+ }
+ if (!p)
+ cf_error("There is no %s protocol running", pr->name);
+ }
+ return p;
+}
diff --git a/nest/protocol.h b/nest/protocol.h
index 0962ccf..3e53c86 100644
--- a/nest/protocol.h
+++ b/nest/protocol.h
@@ -151,6 +151,7 @@ void proto_build(struct proto_config *);
void *proto_new(struct proto_config *, unsigned size);
void *proto_config_new(struct protocol *, unsigned size);
void proto_show(struct symbol *, int);
+struct proto *proto_get_named(struct symbol *, struct protocol *);
extern list proto_list;