74 #include <sys/socket.h> 
   75 #include <netinet/in.h> 
   76 #include <arpa/inet.h> 
   95 #define CIDR_MATCH_ADDR_FAMILY(a) (strchr((a), ':') ? AF_INET6 : AF_INET) 
   96 #define CIDR_MATCH_ADDR_BIT_COUNT(f) \ 
   97     ((f) == AF_INET6 ? MAI_V6ADDR_BITS : \ 
   98      (f) == AF_INET ? MAI_V4ADDR_BITS : \ 
   99      (msg_panic("%s: bad address family %d", myname, (f)), 0)) 
  100 #define CIDR_MATCH_ADDR_BYTE_COUNT(f) \ 
  101     ((f) == AF_INET6 ? MAI_V6ADDR_BYTES : \ 
  102      (f) == AF_INET ? MAI_V4ADDR_BYTES : \ 
  103      (msg_panic("%s: bad address family %d", myname, (f)), 0)) 
  105 #define CIDR_MATCH_ADDR_FAMILY(a) (AF_INET) 
  106 #define CIDR_MATCH_ADDR_BIT_COUNT(f) \ 
  107     ((f) == AF_INET ? MAI_V4ADDR_BITS : \ 
  108      (msg_panic("%s: bad address family %d", myname, (f)), 0)) 
  109 #define CIDR_MATCH_ADDR_BYTE_COUNT(f) \ 
  110     ((f) == AF_INET ? MAI_V4ADDR_BYTES : \ 
  111      (msg_panic("%s: bad address family %d", myname, (f)), 0)) 
  116 static inline int cidr_match_entry(
CIDR_MATCH *entry,
 
  117                            unsigned char *addr_bytes)
 
  126          ap = addr_bytes;  ; np++, mp++, ap++) {
 
  128         return (entry->
match);
 
  129         if ((*ap & *mp) != *np)
 
  136          ap = addr_bytes;  ; np++, ap++) {
 
  138         return (entry->
match);
 
  143     return (!entry->
match);
 
  151     unsigned addr_family;
 
  155     if (
inet_pton(addr_family, addr, addr_bytes) != 1)
 
  158     for (entry = list; entry; entry = entry->
next) {
 
  164         if (cidr_match_entry(entry, addr_bytes))
 
  170         if (cidr_match_entry(entry, addr_bytes))
 
  189     const char *myname = 
"cidr_match_parse";
 
  202     if (*pattern == 
'[') {
 
  204     if ((mask_search = 
split_at(pattern, 
']')) == 0) {
 
  206                 "missing ']' character after \"[%s\"", pattern);
 
  208     } 
else if (*mask_search != 
'/') {
 
  209         if (*mask_search != 0) {
 
  211                 "garbage after \"[%s]\"", pattern);
 
  214         mask_search = pattern;
 
  217     mask_search = pattern;
 
  222     if ((mask = 
split_at(mask_search, 
'/')) != 0) {
 
  230               "bad net/mask pattern: \"%s/%s\"", pattern, mask);
 
  248                   sizeof(hostaddr.
buf)) == 0)
 
  251                 "non-null host address bits in \"%s/%s\", " 
  252                 "perhaps you should use \"%s/%d\" instead",
 
  268                 "bad address pattern: \"%s\"", pattern);
 
  303     memset(ip, 0, 
sizeof(*ip));
 
void cidr_match_endif(CIDR_MATCH *ip)
 
void mask_addr(unsigned char *addr_bytes, unsigned addr_byte_count, unsigned network_bits)
 
unsigned char addr_bit_count
 
#define CIDR_MATCH_ADDR_BIT_COUNT(f)
 
struct CIDR_MATCH * block_end
 
unsigned char net_bytes[CIDR_MATCH_ABYTES]
 
unsigned char addr_byte_count
 
#define CIDR_MATCH_ABYTES
 
int alldig(const char *string)
 
#define CIDR_MATCH_OP_MATCH
 
VSTRING * cidr_match_parse_if(CIDR_MATCH *ip, char *pattern, int match, VSTRING *why)
 
char buf[MAI_HOSTADDR_STRSIZE]
 
CIDR_MATCH * cidr_match_execute(CIDR_MATCH *list, const char *addr)
 
const char * inet_ntop(int af, const void *src, char *dst, SOCKADDR_SIZE size)
 
VSTRING * vstring_alloc(ssize_t len)
 
int inet_pton(int af, const char *src, void *dst)
 
VSTRING * vstring_sprintf(VSTRING *vp, const char *format,...)
 
NORETURN msg_fatal(const char *fmt,...)
 
unsigned char mask_bytes[CIDR_MATCH_ABYTES]
 
#define CIDR_MATCH_OP_ENDIF
 
#define CIDR_MATCH_ADDR_BYTE_COUNT(f)
 
VSTRING * cidr_match_parse(CIDR_MATCH *ip, char *pattern, int match, VSTRING *why)
 
unsigned char addr_family
 
char * split_at(char *string, int delimiter)
 
#define CIDR_MATCH_ADDR_FAMILY(a)