diff options
author | Martin Mares <mj@ucw.cz> | 1998-11-29 22:01:03 +0000 |
---|---|---|
committer | Martin Mares <mj@ucw.cz> | 1998-11-29 22:01:03 +0000 |
commit | ed45f2e126680c7197be2058f9c162f1d5019eeb (patch) | |
tree | 2d67bd66f969b2c9c96079abf5fdd3f81c7c2c4d /nest/iface.c | |
parent | 49e4a4d1fd64da045182f6ccd38753feb364f9c5 (diff) |
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.
Diffstat (limited to 'nest/iface.c')
-rw-r--r-- | nest/iface.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/nest/iface.c b/nest/iface.c index 5f356fd8..186fbd90 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); +} |