summaryrefslogtreecommitdiff
path: root/libmu_sieve/comparator.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmu_sieve/comparator.c')
-rw-r--r--libmu_sieve/comparator.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/libmu_sieve/comparator.c b/libmu_sieve/comparator.c
index 591b4d4a8..5e10c83bd 100644
--- a/libmu_sieve/comparator.c
+++ b/libmu_sieve/comparator.c
@@ -25,7 +25,6 @@
#include <unistd.h>
#include <string.h>
#include <sieve-priv.h>
-#include <fnmatch.h>
#include <regex.h>
#include <mailutils/cctype.h>
#include <mailutils/cstr.h>
@@ -102,6 +101,25 @@ compile_pattern (mu_sieve_machine_t mach, mu_sieve_string_t *pattern, int flags)
pattern->rx = preg;
}
+static void
+compile_wildcard (mu_sieve_machine_t mach, mu_sieve_string_t *pattern,
+ int flags)
+{
+ int rc;
+ regex_t *preg;
+
+ if (pattern->rx)
+ return;
+ preg = mu_sieve_malloc (mach, sizeof (*preg));
+ rc = mu_glob_compile (preg, pattern->orig, flags);
+ if (rc)
+ {
+ mu_sieve_error (mach, _("can't compile pattern"));
+ mu_sieve_abort (mach);
+ }
+ pattern->rx = preg;
+}
+
static int
comp_false (mu_sieve_machine_t mach, mu_sieve_string_t *pattern,
const char *text)
@@ -263,7 +281,8 @@ static int
i_octet_matches (mu_sieve_machine_t mach, mu_sieve_string_t *pattern,
const char *text)
{
- return fnmatch (pattern->orig, text, 0) == 0;
+ compile_wildcard (mach, pattern, 0);
+ return regexec ((regex_t *)pattern->rx, text, 0, NULL, 0) == 0;
}
static int
@@ -300,7 +319,8 @@ static int
i_ascii_casemap_matches (mu_sieve_machine_t mach,
mu_sieve_string_t *pattern, const char *text)
{
- return fnmatch (pattern->orig, text, FNM_CASEFOLD) == 0;
+ compile_wildcard (mach, pattern, MU_GLOBF_ICASE);
+ return regexec ((regex_t *)pattern->rx, text, 0, NULL, 0) == 0;
}
static int

Return to:

Send suggestions and report system problems to the System administrator.