summaryrefslogtreecommitdiffstats
path: root/nest/iface.c
diff options
context:
space:
mode:
authorMartin Mares <mj@ucw.cz>1998-11-29 23:01:03 +0100
committerMartin Mares <mj@ucw.cz>1998-11-29 23:01:03 +0100
commited45f2e126680c7197be2058f9c162f1d5019eeb (patch)
tree2d67bd66f969b2c9c96079abf5fdd3f81c7c2c4d /nest/iface.c
parent49e4a4d1fd64da045182f6ccd38753feb364f9c5 (diff)
downloadbird-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.
Diffstat (limited to 'nest/iface.c')
-rw-r--r--nest/iface.c42
1 files changed, 42 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);
+}