[PATCH 2/2] utilities: kernelscan: remove use of pcre, use regex instead
Colin King
colin.king at canonical.com
Tue Nov 24 13:01:03 UTC 2015
From: Colin Ian King <colin.king at canonical.com>
Using pcre does not offer any extra benefit over regex and
requires an extra library dependency. Remove pcre and replace
with regex.
Signed-off-by: Colin Ian King <colin.king at canonical.com>
---
src/utilities/Makefile.am | 1 -
src/utilities/kernelscan.c | 34 +++++++++++++++-------------------
2 files changed, 15 insertions(+), 20 deletions(-)
diff --git a/src/utilities/Makefile.am b/src/utilities/Makefile.am
index 3160a35..9a47980 100644
--- a/src/utilities/Makefile.am
+++ b/src/utilities/Makefile.am
@@ -4,5 +4,4 @@ AM_CPPFLAGS = -Wall -Werror -Wextra -DDATAROOTDIR=\"$(datarootdir)\" \
bin_PROGRAMS = kernelscan
kernelscan_SOURCES = kernelscan.c
-kernelscan_LDFLAGS = -lpcre
diff --git a/src/utilities/kernelscan.c b/src/utilities/kernelscan.c
index 9dca440..10b51d6 100644
--- a/src/utilities/kernelscan.c
+++ b/src/utilities/kernelscan.c
@@ -23,9 +23,10 @@
#include <string.h>
#include <ctype.h>
#include <unistd.h>
-
-#include <pcre.h>
+#include <sys/types.h>
+#include <regex.h>
#include <json.h>
+
#include "config.h"
#define PARSER_OK 0
@@ -49,8 +50,8 @@ typedef enum {
typedef struct {
char *pattern; /* pattern that we compare to kernel messages */
compare_mode cm; /* 'r' regex or 's' string comparison */
- pcre *re; /* regex from pattern */
- pcre_extra *extra;
+ regex_t compiled; /* regex from pattern */
+ bool compiled_ok; /* regex compiled OK */
} klog_pattern;
/*
@@ -270,9 +271,7 @@ static klog_pattern *klog_load(const char *table)
/* Now fetch json objects and compile regex */
for (i = 0; i < n; i++) {
- const char *error;
const char *str;
- int erroffset;
json_object *obj;
#if JSON_HAS_GET_EX
json_object *obj_str;
@@ -320,15 +319,14 @@ static klog_pattern *klog_load(const char *table)
/* Pre-compile regular expressions to make things run a bit faster */
if (patterns[i].cm == COMPARE_REGEX) {
- if ((patterns[i].re = pcre_compile(patterns[i].pattern, 0, &error, &erroffset, NULL)) == NULL) {
- fprintf(stderr, "Regex %s failed to compile: %s.\n", patterns[i].pattern, error);
- patterns[i].re = NULL;
+ int rc;
+
+ rc = regcomp(&patterns[i].compiled, patterns[i].pattern, REG_EXTENDED);
+ if (rc) {
+ fprintf(stderr, "Regex %s failed to compile: %d.\n", patterns[i].pattern, rc);
+ patterns[i].compiled_ok = false;
} else {
- patterns[i].extra = pcre_study(patterns[i].re, 0, &error);
- if (error != NULL) {
- fprintf(stderr, "Regex %s failed to optimize: %s.\n", patterns[i].pattern, error);
- patterns[i].re = NULL;
- }
+ patterns[i].compiled_ok = true;
}
}
}
@@ -352,10 +350,9 @@ static bool klog_find(char *str, klog_pattern *patterns)
return true;
}
} else if (patterns[i].cm == COMPARE_REGEX) {
- int vector[1];
- if (pcre_exec(patterns[i].re, patterns[i].extra, str, strlen(str), 0, 0, vector, 1) == 0) {
+ if (patterns[i].compiled_ok &&
+ (!regexec(&patterns[i].compiled, str, 0, NULL, 0)))
return true;
- }
}
}
@@ -370,8 +367,7 @@ static void klog_free(klog_pattern *patterns)
int i;
for (i = 0; patterns[i].pattern; i++) {
- pcre_free(patterns[i].re);
- pcre_free(patterns[i].extra);
+ regfree(&patterns[i].compiled);
free(patterns[i].pattern);
}
free(patterns);
--
2.6.2
More information about the fwts-devel
mailing list