diff options
author | Martin Mares <mj@ucw.cz> | 1998-11-29 23:01:03 +0100 |
---|---|---|
committer | Martin Mares <mj@ucw.cz> | 1998-11-29 23:01:03 +0100 |
commit | ed45f2e126680c7197be2058f9c162f1d5019eeb (patch) | |
tree | 2d67bd66f969b2c9c96079abf5fdd3f81c7c2c4d | |
parent | 49e4a4d1fd64da045182f6ccd38753feb364f9c5 (diff) | |
download | bird-ed45f2e126680c7197be2058f9c162f1d5019eeb.tar bird-ed45f2e126680c7197be2058f9c162f1d5019eeb.zip |
Added functions for manipulating interface name pattern lists:
o iface_patt_match(list, iface) -- match interface against list
o iface_patts_equal(a, b, c) -- compare whether two pattern lists are
equal or not. c(x,y) is called for comparison of protocol-dependent
data.
-rw-r--r-- | nest/iface.c | 42 | ||||
-rw-r--r-- | nest/iface.h | 14 |
2 files changed, 56 insertions, 0 deletions
diff --git a/nest/iface.c b/nest/iface.c index 5f356fd..186fbd9 100644 --- a/nest/iface.c +++ b/nest/iface.c @@ -12,6 +12,7 @@ #include "nest/iface.h" #include "nest/protocol.h" #include "lib/resource.h" +#include "lib/string.h" static pool *if_pool; @@ -353,3 +354,44 @@ if_init(void) neigh_slab = sl_new(if_pool, sizeof(neighbor)); init_list(&neigh_list); } + +/* + * Interface Pattern Lists + */ + +struct iface_patt * +iface_patt_match(list *l, struct iface *i) +{ + struct iface_patt *p; + + WALK_LIST(p, *l) + { + char *t = p->pattern; + int ok = 1; + if (*t == '-') + { + t++; + ok = 0; + } + if (patmatch(t, i->name)) + return ok ? p : NULL; + } + return NULL; +} + +int +iface_patts_equal(list *a, list *b, int (*comp)(struct iface_patt *, struct iface_patt *)) +{ + struct iface_patt *x, *y; + + x = HEAD(*a); + y = HEAD(*b); + while (x->n.next && y->n.next) + { + if (strcmp(x->pattern, y->pattern) || comp && !comp(x, y)) + return 0; + x = (void *) x->n.next; + y = (void *) y->n.next; + } + return (!x->n.next && !y->n.next); +} diff --git a/nest/iface.h b/nest/iface.h index ea93720..62b3f94 100644 --- a/nest/iface.h +++ b/nest/iface.h @@ -91,4 +91,18 @@ neighbor *neigh_find(struct proto *, ip_addr *, unsigned flags); void neigh_dump(neighbor *); void neigh_dump_all(void); +/* + * Interface Pattern Lists + */ + +struct iface_patt { + node n; + byte *pattern; /* Interface name pattern */ + + /* Protocol-specific data follow */ +}; + +struct iface_patt *iface_patt_match(list *, struct iface *); +int iface_patts_equal(list *, list *, int (*)(struct iface_patt *, struct iface_patt *)); + #endif |