-static int match_addrpat(int af, const struct addrpat *ap,
- const union addr *a)
-{
- if (!ap->len)
- return (1);
- switch (af) {
- case AF_INET: {
- unsigned mask = htonl((MASK32 << (32 - ap->len)) & MASK32);
- return (((ap->addr.ipv4.s_addr ^ a->ipv4.s_addr) & mask) == 0);
- }
- case AF_INET6: {
- unsigned i, m, n = ap->len;
- for (i = 0; n >= 8; i++, n -= 8) {
- if (ap->addr.ipv6.s6_addr[i] != a->ipv6.s6_addr[i])
- return (0);
- }
- if (!n) return (1);
- m = (MASK8 << (8 - n)) & MASK8;
- return (((ap->addr.ipv6.s6_addr[i] ^ a->ipv6.s6_addr[i]) & m) == 0);
- }
- }
- return (0);
-}
-