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)