Add rule match log
This commit is contained in:
@@ -741,11 +741,22 @@ errout:
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void _dns_server_log_rule(char *domain, unsigned char *rule_key, int rule_key_len)
|
||||
{
|
||||
char rule_name[DNS_MAX_CNAME_LEN];
|
||||
reverse_string(rule_name, (char *)rule_key, rule_key_len);
|
||||
rule_name[rule_key_len - 1] = 0;
|
||||
tlog(TLOG_INFO, "RULE-MATCH, domain: %s, rule: %s", domain, rule_name);
|
||||
}
|
||||
|
||||
static struct dns_address *_dns_server_get_address_by_domain(char *domain, int qtype)
|
||||
{
|
||||
int domain_len;
|
||||
char domain_key[DNS_MAX_CNAME_LEN];
|
||||
char type = '4';
|
||||
unsigned char matched_key[DNS_MAX_CNAME_LEN];
|
||||
int matched_key_len = DNS_MAX_CNAME_LEN;
|
||||
struct dns_address *address = NULL;
|
||||
|
||||
switch (qtype) {
|
||||
case DNS_T_A:
|
||||
@@ -763,7 +774,18 @@ static struct dns_address *_dns_server_get_address_by_domain(char *domain, int q
|
||||
domain_key[0] = type;
|
||||
domain_len++;
|
||||
|
||||
return art_substring(&dns_conf_address, (unsigned char *)domain_key, domain_len);
|
||||
if (likely(dns_conf_log_level > TLOG_INFO)) {
|
||||
return art_substring(&dns_conf_address, (unsigned char *)domain_key, domain_len, NULL, NULL);
|
||||
}
|
||||
|
||||
address = art_substring(&dns_conf_address, (unsigned char *)domain_key, domain_len, matched_key, &matched_key_len);
|
||||
if (address == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
_dns_server_log_rule(domain, matched_key, matched_key_len);
|
||||
|
||||
return address;
|
||||
}
|
||||
|
||||
static int _dns_server_process_address(struct dns_request *request, struct dns_packet *packet)
|
||||
|
||||
@@ -193,7 +193,7 @@ void* art_search(const art_tree *t, const unsigned char *key, int key_len);
|
||||
* @return NULL if the item was not found, otherwise
|
||||
* the value pointer is returned.
|
||||
*/
|
||||
void *art_substring(const art_tree *t, const unsigned char *str, int str_len);
|
||||
void *art_substring(const art_tree *t, const unsigned char *str, int str_len, unsigned char *key, int *key_len);
|
||||
|
||||
/**
|
||||
* Returns the minimum valued leaf
|
||||
|
||||
@@ -998,7 +998,20 @@ static int str_prefix_matches(const art_leaf *n, const unsigned char *str, int s
|
||||
return memcmp(str, n->key, n->key_len);
|
||||
}
|
||||
|
||||
void *art_substring(const art_tree *t, const unsigned char *str, int str_len)
|
||||
static void art_copy_key(art_leaf *leaf, unsigned char *key, int *key_len)
|
||||
{
|
||||
int len;
|
||||
|
||||
if (key == NULL || key_len == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
len = leaf->key_len > *key_len ? *key_len : leaf->key_len;
|
||||
memcpy(key, leaf->key, len);
|
||||
*key_len = len;
|
||||
}
|
||||
|
||||
void *art_substring(const art_tree *t, const unsigned char *str, int str_len, unsigned char *key, int *key_len)
|
||||
{
|
||||
art_node **child;
|
||||
art_node *n = t->root;
|
||||
@@ -1013,7 +1026,8 @@ void *art_substring(const art_tree *t, const unsigned char *str, int str_len)
|
||||
// Check if the expanded path matches
|
||||
if (!str_prefix_matches((art_leaf*)n, str, str_len)) {
|
||||
found = (art_leaf*)n;
|
||||
}
|
||||
art_copy_key(found, key, key_len);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1025,6 +1039,7 @@ void *art_substring(const art_tree *t, const unsigned char *str, int str_len)
|
||||
// Check if the expanded path matches
|
||||
if (!str_prefix_matches((art_leaf*)m, str, str_len)) {
|
||||
found = (art_leaf*)m;
|
||||
art_copy_key(found, key, key_len);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user