71 #include <netinet/in.h>
72 #include <arpa/inet.h>
86 #define MATCH_DICTIONARY(pattern) \
87 ((pattern)[0] != '[' && strchr((pattern), ':') != 0)
115 const char *myname =
"match_string";
119 msg_info(
"%s: %s: %s ~? %s", myname, list->
pname,
string, pattern);
126 msg_panic(
"%s: unknown dictionary: %s", myname, pattern);
130 return (match_error(list,
"%s:%s: table lookup problem",
139 if (strcmp(
string, pattern) == 0) {
153 const char *myname =
"match_hostname";
161 msg_info(
"%s: %s: %s ~? %s", myname, list->
pname, name, pattern);
170 msg_panic(
"%s: unknown dictionary: %s", myname, pattern);
172 for (entry = name; *entry != 0; entry = next) {
174 match = (
dict_get(dict, entry) != 0);
176 msg_info(
"%s: %s: lookup %s:%s %s: %s",
178 entry, match ?
"found" :
"notfound");
182 return (match_error(list,
"%s:%s: table lookup problem",
185 if ((next = strchr(entry + 1,
'.')) == 0)
197 if (strcmp(name, pattern) == 0) {
207 pd = name + strlen(name) - strlen(pattern);
208 if (pd > name && pd[-1] ==
'.' && strcmp(pd, pattern) == 0)
210 }
else if (pattern[0] ==
'.') {
211 pd = name + strlen(name) - strlen(pattern);
212 if (pd > name && strcmp(pd, pattern) == 0)
223 const char *myname =
"match_hostaddr";
231 msg_info(
"%s: %s: %s ~? %s", myname, list->
pname, addr, pattern);
233 #define V4_ADDR_STRING_CHARS "01234567890."
234 #define V6_ADDR_STRING_CHARS V4_ADDR_STRING_CHARS "abcdefABCDEF:"
244 msg_panic(
"%s: unknown dictionary: %s", myname, pattern);
248 return (match_error(list,
"%s:%s: table lookup problem",
257 if (pattern[0] !=
'[') {
258 if (strcmp(addr, pattern) == 0)
261 size_t addr_len = strlen(addr);
263 if (strncmp(addr, pattern + 1, addr_len) == 0
264 && strcmp(pattern + 1 + addr_len,
"]") == 0)
288 if (!strchr(addr,
':') != !strchr(pattern,
':')
289 || pattern[strcspn(pattern,
":/")] == 0
#define MATCH_FLAG_RETURN
char * mystrdup(const char *str)
NORETURN msg_panic(const char *fmt,...)
int match_hostaddr(MATCH_LIST *list, const char *addr, const char *pattern)
#define V6_ADDR_STRING_CHARS
#define V4_ADDR_STRING_CHARS
VSTRING * vstring_vsprintf(VSTRING *vp, const char *format, va_list ap)
int match_string(MATCH_LIST *list, const char *string, const char *pattern)
#define dict_get(dp, key)
#define MATCH_FLAG_PARENT
CIDR_MATCH * cidr_match_execute(CIDR_MATCH *list, const char *addr)
DICT * dict_handle(const char *dict_name)
void msg_warn(const char *fmt,...)
VSTRING * vstring_alloc(ssize_t len)
NORETURN msg_fatal(const char *fmt,...)
int match_hostname(MATCH_LIST *list, const char *name, const char *pattern)
VSTRING * cidr_match_parse(CIDR_MATCH *ip, char *pattern, int match, VSTRING *why)
VSTRING * vstring_free(VSTRING *vp)
#define MATCH_DICTIONARY(pattern)
void msg_info(const char *fmt,...)