From d2a01e10c5fecc91e38ca8defc909021da18367d Mon Sep 17 00:00:00 2001 From: DL6ER Date: Tue, 7 Jul 2020 19:06:37 +0200 Subject: [PATCH] Add ;invert option Signed-off-by: DL6ER --- src/regex.c | 16 ++++++++++------ src/regex_r.h | 1 + 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/regex.c b/src/regex.c index a16ed73c..5d245b84 100644 --- a/src/regex.c +++ b/src/regex.c @@ -98,6 +98,10 @@ static bool compile_regex(const char *regexin, const enum regex_type regexid) free(extra); extra = NULL; } + else if(strcasecmp(part, "invert") == 0) + { + regex[index].inverted = true; + } } free(buf); } @@ -179,16 +183,15 @@ int match_regex(const char *input, const DNSCacheData* dns_cache, const int clie // Try to match the compiled regular expression against input #ifdef USE_TRE_REGEX - int errcode = tre_regexec(®ex[index].regex, input, 0, &match, 0); + int retval = tre_regexec(®ex[index].regex, input, 0, &match, 0); #else - int errcode = regexec(®ex[index].regex, input, 0, NULL, 0); + int retval = regexec(®ex[index].regex, input, 0, NULL, 0); #endif - // regexec() returns zero for a successful match or REG_NOMATCH for failure. - // We are only interested in the matching case here. - if (errcode == 0) + // regexec() returns REG_OK for a successful match or REG_NOMATCH for failure. + if ((retval == REG_OK && !regex[index].inverted) || + (retval == REG_NOMATCH && regex[index].inverted)) { // Check possible additional regex settings - logg("match-regex: dns_cache: %p", dns_cache); if(dns_cache != NULL) { // Check query type filtering @@ -204,6 +207,7 @@ int match_regex(const char *input, const DNSCacheData* dns_cache, const int clie continue; } } + // Match, return true match_idx = regex[index].database_id; diff --git a/src/regex_r.h b/src/regex_r.h index 091775c4..55c6248c 100644 --- a/src/regex_r.h +++ b/src/regex_r.h @@ -29,6 +29,7 @@ typedef struct regex_data { char *string; int database_id; bool available; + bool inverted; enum query_types query_type; } regex_data;