45 #include <sys/socket.h>
46 #include <netinet/in.h>
47 #include <arpa/inet.h>
82 static const char *dict_cidr_lookup(
DICT *dict,
const char *key)
94 return (entry->
value);
100 static void dict_cidr_close(
DICT *dict)
106 for (entry = dict_cidr->
head; entry; entry = next) {
116 static DICT_CIDR_ENTRY *dict_cidr_parse_rule(
char *p,
int lineno,
int nesting,
224 hostaddr.
buf,
sizeof(hostaddr.
buf)) == 0)
226 msg_info(
"dict_cidr_open: add %s/%d %s",
236 const char myname[] =
"dict_cidr_open";
253 #define DICT_CIDR_OPEN_RETURN(d) do { \
255 if (map_fp != 0 && vstream_fclose(map_fp)) \
256 msg_fatal("cidr map %s: read error: %m", mapname); \
257 if (line_buffer != 0) \
258 vstring_free(line_buffer); \
267 if (open_flags != O_RDONLY)
269 open_flags, dict_flags,
270 "%s:%s map requires O_RDONLY access mode",
278 open_flags, dict_flags,
279 "open %s: %m", mapname));
300 while (
readllines(line_buffer, map_fp, &last_line, &lineno)) {
301 rule = dict_cidr_parse_rule(
vstring_str(line_buffer), lineno,
304 msg_warn(
"cidr map %s, line %d: %s: skipping this rule",
311 sizeof(*rule_stack), nesting + 1,
316 rule_stack[nesting] = rule;
323 msg_panic(
"%s: ENDIF without IF", myname);
324 if_rule = rule_stack[nesting];
326 msg_panic(
"%s: unexpected rule stack element type %d",
331 dict_cidr->
head = rule;
337 while (nesting-- > 0)
338 msg_warn(
"cidr map %s, line %d: IF has no matching ENDIF",
339 mapname, rule_stack[nesting]->lineno);
void cidr_match_endif(CIDR_MATCH *ip)
char * mystrdup(const char *str)
void(* close)(struct DICT *)
NORETURN msg_panic(const char *fmt,...)
struct CIDR_MATCH * block_end
unsigned char net_bytes[CIDR_MATCH_ABYTES]
int strncasecmp(const char *s1, const char *s2, size_t n)
VSTREAM * vstream_fopen(const char *path, int flags, mode_t mode)
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)
void msg_warn(const char *fmt,...)
VSTRING * vstring_alloc(ssize_t len)
struct DICT_CIDR_ENTRY DICT_CIDR_ENTRY
VSTRING * vstring_sprintf(VSTRING *vp, const char *format,...)
const char *(* lookup)(struct DICT *, const char *)
char * mvect_free(MVECT *vect)
char * trimblanks(char *, ssize_t)
NORETURN msg_fatal(const char *fmt,...)
char * mvect_alloc(MVECT *vect, ssize_t elsize, ssize_t nelm, void(*init_fn)(char *, ssize_t), void(*wipe_fn)(char *, ssize_t))
VSTRING * readllines(VSTRING *buf, VSTREAM *fp, int *lineno, int *first_line)
#define DICT_FLAG_PATTERN
#define CIDR_MATCH_OP_ENDIF
void(* MVECT_FN)(char *, ssize_t)
char * mvect_realloc(MVECT *vect, ssize_t nelm)
VSTRING * cidr_match_parse(CIDR_MATCH *ip, char *pattern, int match, VSTRING *why)
#define DICT_CIDR_OPEN_RETURN(d)
DICT * dict_cidr_open(const char *mapname, int open_flags, int dict_flags)
unsigned char addr_family
#define vstream_fileno(vp)
DICT * dict_alloc(const char *, const char *, ssize_t)
DICT * dict_surrogate(const char *dict_type, const char *dict_name, int open_flags, int dict_flags, const char *fmt,...)
void * mymalloc(ssize_t len)
void msg_info(const char *fmt,...)