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.
This commit is contained in:
Martin Mares 1998-11-29 22:01:03 +00:00
parent 49e4a4d1fd
commit ed45f2e126
2 changed files with 56 additions and 0 deletions

View file

@ -12,6 +12,7 @@
#include "nest/iface.h" #include "nest/iface.h"
#include "nest/protocol.h" #include "nest/protocol.h"
#include "lib/resource.h" #include "lib/resource.h"
#include "lib/string.h"
static pool *if_pool; static pool *if_pool;
@ -353,3 +354,44 @@ if_init(void)
neigh_slab = sl_new(if_pool, sizeof(neighbor)); neigh_slab = sl_new(if_pool, sizeof(neighbor));
init_list(&neigh_list); 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);
}

View file

@ -91,4 +91,18 @@ neighbor *neigh_find(struct proto *, ip_addr *, unsigned flags);
void neigh_dump(neighbor *); void neigh_dump(neighbor *);
void neigh_dump_all(void); 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 #endif