diff options
Diffstat (limited to 'nest')
-rw-r--r-- | nest/proto.c | 29 | ||||
-rw-r--r-- | nest/protocol.h | 1 |
2 files changed, 30 insertions, 0 deletions
diff --git a/nest/proto.c b/nest/proto.c index 94bbbfd8..a0beb5fb 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 0962ccfd..3e53c86c 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; |