From ed45f2e126680c7197be2058f9c162f1d5019eeb Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Sun, 29 Nov 1998 22:01:03 +0000 Subject: [PATCH] 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. --- nest/iface.c | 42 ++++++++++++++++++++++++++++++++++++++++++ nest/iface.h | 14 ++++++++++++++ 2 files changed, 56 insertions(+) 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); +} diff --git a/nest/iface.h b/nest/iface.h index ea937207..62b3f94b 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