From 707fc4ba760bac1d356c0268e933885f9da1f616 Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Sun, 3 Jun 2007 21:38:13 +0200 Subject: [PATCH] Exported the addrmasks and their matching. --- lib/ipaccess.c | 28 ++++++++++++++-------------- lib/ipaccess.h | 12 +++++++++++- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/lib/ipaccess.c b/lib/ipaccess.c index 79508ab0..215fb534 100644 --- a/lib/ipaccess.c +++ b/lib/ipaccess.c @@ -1,7 +1,7 @@ /* * UCW Library -- IP address access lists * - * (c) 1997--2006 Martin Mares + * (c) 1997--2007 Martin Mares * * This software may be freely distributed and used according to the terms * of the GNU Lesser General Public License. @@ -16,15 +16,10 @@ #include -struct addrmask { - u32 addr; - u32 mask; -}; - struct ipaccess_entry { cnode n; int allow; - struct addrmask addr; + struct ip_addrmask addr; }; static byte * @@ -34,7 +29,7 @@ addrmask_parser(byte *c, void *ptr) * This is tricky: addrmasks will be compared by memcmp(), so we must ensure * that even the padding between structure members is zeroed out. */ - struct addrmask *am = ptr; + struct ip_addrmask *am = ptr; bzero(am, sizeof(*am)); byte *p = strchr(c, '/'); @@ -59,13 +54,13 @@ addrmask_parser(byte *c, void *ptr) static void addrmask_dumper(struct fastbuf *fb, void *ptr) { - struct addrmask *am = ptr; + struct ip_addrmask *am = ptr; bprintf(fb, "%08x/%08x ", am->addr, am->mask); } -static struct cf_user_type addrmask_type = { - .size = sizeof(struct addrmask), - .name = "addrmask", +struct cf_user_type ip_addrmask_type = { + .size = sizeof(struct ip_addrmask), + .name = "ip_addrmask", .parser = addrmask_parser, .dumper = addrmask_dumper }; @@ -74,16 +69,21 @@ struct cf_section ipaccess_cf = { CF_TYPE(struct ipaccess_entry), CF_ITEMS { CF_LOOKUP("Mode", PTR_TO(struct ipaccess_entry, allow), ((byte*[]) { "deny", "allow", NULL })), - CF_USER("IP", PTR_TO(struct ipaccess_entry, addr), &addrmask_type), + CF_USER("IP", PTR_TO(struct ipaccess_entry, addr), &ip_addrmask_type), CF_END } }; +int ip_addrmask_match(struct ip_addrmask *am, u32 ip) +{ + return !((ip ^ am->addr) & am->mask); +} + int ipaccess_check(clist *l, u32 ip) { CLIST_FOR_EACH(struct ipaccess_entry *, a, *l) - if (! ((ip ^ a->addr.addr) & a->addr.mask)) + if (ip_addrmask_match(&a->addr, ip)) return a->allow; return 0; } diff --git a/lib/ipaccess.h b/lib/ipaccess.h index a38c5fe3..b4077838 100644 --- a/lib/ipaccess.h +++ b/lib/ipaccess.h @@ -1,7 +1,7 @@ /* * UCW Library -- IP address access lists * - * (c) 1997--2006 Martin Mares + * (c) 1997--2007 Martin Mares * * This software may be freely distributed and used according to the terms * of the GNU Lesser General Public License. @@ -15,4 +15,14 @@ extern struct cf_section ipaccess_cf; int ipaccess_check(clist *l, u32 ip); +/* Low-level handling of addresses and masks */ + +struct ip_addrmask { + u32 addr; + u32 mask; +}; + +extern struct cf_user_type ip_addrmask_type; +int ip_addrmask_match(struct ip_addrmask *am, u32 ip); + #endif -- 2.39.2