diff options
-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 |