Hi Yavor!
> This one seems to loose the @RRDPARAM@ parameter when calling rrdtool,
> if the pcre2 patch is applied. I'm still debugging but didn't find
> out yet why this happens, since the patch doesn't seem to touch
> rrdparam.
Digging deeper shows me, that the issue seems to be in the following
part of the patch:
--- xymon.orig/web/showgraph.c
+++ xymon/web/showgraph.c
@@ -1021,7 +1027,7 @@
/* We have a matching file! */
rrddbs[rrddbcount].rrdfn = strdup(d->d_name);
- if (pcre_copy_substring(d->d_name, ovector, result, 1,
param, sizeof(param)) > 0) {
+ if (pcre2_substring_copy_bynumber(ovector, 1, param,
&l) > 0) {
/*
* This is ugly, but I cannot find a pretty way
of un-mangling
* the disk- and http-data that has been
molested by the back-end.
Debugging this, I see, that rrddbs[rrddbcount].rrdfn is filled (for
example with "inode,root.rrd" or "inode,var.rrd" or the like), but
after this I observe that the "else" part of
if (pcre2_substring_copy_bynumber(ovector, 1, param, &l) > 0)
is executed (while I expected that the "then" part is executed where
rrddbs[rrddbcount].rrdparam
should be set to some useful value (while it now is set to NULL in the
else part).
Oh, now I see the problem: pcre_copy_substring() returns the length of
the string on match, while pcre2_substring_copy_bynumber() returns 0
on success. So the above has to be changed from "> 0" to "== 0".
+ if (pcre2_substring_copy_bynumber(ovector, 1, param,
&l) == 0) {
For showgraph.c this fixes the issue, but there are more places where
the return code of pcre2_substring_copy_bynumber() is checked, which
also may need adoption. I found the following places:
--- a/lib/acknowledgementslog.c
+++ b/lib/acknowledgementslog.c
@@ -1083,7 +1084,7 @@ Last-Update: 2023-12-21
/* We have a matching file! */
rrddbs[rrddbcount].rrdfn = strdup(d->d_name);
- if (pcre_copy_substring(d->d_name, ovector, result, 1,
param, sizeof(param)) > 0) {
-+ if (pcre2_substring_copy_bynumber(ovector, 1, param,
&l) > 0) {
++ if (pcre2_substring_copy_bynumber(ovector, 1, param,
&l) == 0) {
/*
* This is ugly, but I cannot find a pretty way
of un-mangling
* the disk- and http-data that has been
molested by the back-end.
@@ -1240,7 +1241,7 @@ Last-Update: 2023-12-21
char delaytxt[4096];
- if (pcre_copy_substring(subjectline, ovector, result, 1,
delaytxt, sizeof(delaytxt)) > 0) {
+ l = sizeof(delaytxt);
-+ if (pcre2_substring_copy_bynumber(ovector, 1, delaytxt, &l) >
0) {
++ if (pcre2_substring_copy_bynumber(ovector, 1, delaytxt, &l) ==
0) {
duration = durationvalue(delaytxt);
}
}
@@ -1261,7 +1262,7 @@ Last-Update: 2023-12-21
char msgtxt[4096];
- if (pcre_copy_substring(subjectline, ovector, result, 1,
msgtxt, sizeof(msgtxt)) > 0) {
+ l = sizeof(msgtxt);
-+ if (pcre2_substring_copy_bynumber(ovector, 1, msgtxt, &l) > 0) {
++ if (pcre2_substring_copy_bynumber(ovector, 1, msgtxt, &l) == 0)
{
firsttxtline = strdup(msgtxt);
}
}
diff --git a/web/showgraph.c b/web/showgraph.c
index c6b891e..b3741ac 100644
--- a/web/showgraph.c
+++ b/web/showgraph.c
@@ -1027,7 +1027,7 @@ void generate_graph(char *gdeffn, char *rrddir, char
*graphfn)
/* We have a matching file! */
rrddbs[rrddbcount].rrdfn = strdup(d->d_name);
- if (pcre2_substring_copy_bynumber(ovector, 1, param,
&l) > 0) {
+ if (pcre2_substring_copy_bynumber(ovector, 1, param,
&l) == 0) {
/*
* This is ugly, but I cannot find a pretty way
of un-mangling
* the disk- and http-data that has been
molested by the back-end.
diff --git a/xymond/xymon-mailack.c b/xymond/xymon-mailack.c
index 1c66942..7ee7cc0 100644
--- a/xymond/xymon-mailack.c
+++ b/xymond/xymon-mailack.c
@@ -128,7 +128,7 @@ int main(int argc, char *argv[])
if (result >= 0) {
char delaytxt[4096];
l = sizeof(delaytxt);
- if (pcre2_substring_copy_bynumber(ovector, 1, delaytxt, &l) >
0) {
+ if (pcre2_substring_copy_bynumber(ovector, 1, delaytxt, &l) ==
0) {
duration = durationvalue(delaytxt);
}
}
@@ -145,7 +145,7 @@ int main(int argc, char *argv[])
if (result >= 0) {
char msgtxt[4096];
l = sizeof(msgtxt);
- if (pcre2_substring_copy_bynumber(ovector, 1, msgtxt, &l) > 0) {
+ if (pcre2_substring_copy_bynumber(ovector, 1, msgtxt, &l) == 0)
{
firsttxtline = strdup(msgtxt);
}
}
The resulting (updated) patch is attached.
Greetings
Roland
From: Yavor Doganov <[email protected]>
Date: Thu, 21 Dec 2023 18:52:13 +0200
Bug-Debian: https://bugs.debian.org/999921
Forwarded: https://lists.xymon.com/pipermail/xymon/2024-February/048291.html
Last-Update: 2024-02-12
Subject: Port to PCRE2.
pcre2_substring_copy_bynumber() return value fixup by Roland Rosenfeld.
--- a/lib/acknowledgementslog.c
+++ b/lib/acknowledgementslog.c
@@ -26,7 +26,8 @@ static char rcsid[] = "$Id: acknowledgem
#include <errno.h>
#include <time.h>
-#include <pcre.h>
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include <pcre2.h>
#include "libxymon.h"
@@ -103,16 +104,17 @@ void do_acknowledgementslog(FILE *output
char title[200];
/* For the PCRE matching */
- const char *errmsg = NULL;
- int errofs = 0;
- pcre *pageregexp = NULL;
- pcre *expageregexp = NULL;
- pcre *hostregexp = NULL;
- pcre *exhostregexp = NULL;
- pcre *testregexp = NULL;
- pcre *extestregexp = NULL;
- pcre *rcptregexp = NULL;
- pcre *exrcptregexp = NULL;
+ int err;
+ PCRE2_SIZE errofs;
+ pcre2_code *pageregexp = NULL;
+ pcre2_code *expageregexp = NULL;
+ pcre2_code *hostregexp = NULL;
+ pcre2_code *exhostregexp = NULL;
+ pcre2_code *testregexp = NULL;
+ pcre2_code *extestregexp = NULL;
+ pcre2_code *rcptregexp = NULL;
+ pcre2_code *exrcptregexp = NULL;
+ pcre2_match_data *ovector;
if (maxminutes && (fromtime || totime)) {
fprintf(output, "<B>Only one time interval type is allowed!</B>");
@@ -147,14 +149,14 @@ void do_acknowledgementslog(FILE *output
if (!maxcount) maxcount = 100;
- if (pageregex && *pageregex) pageregexp = pcre_compile(pageregex, PCRE_CASELESS, &errmsg, &errofs, NULL);
- if (expageregex && *expageregex) expageregexp = pcre_compile(expageregex, PCRE_CASELESS, &errmsg, &errofs, NULL);
- if (hostregex && *hostregex) hostregexp = pcre_compile(hostregex, PCRE_CASELESS, &errmsg, &errofs, NULL);
- if (exhostregex && *exhostregex) exhostregexp = pcre_compile(exhostregex, PCRE_CASELESS, &errmsg, &errofs, NULL);
- if (testregex && *testregex) testregexp = pcre_compile(testregex, PCRE_CASELESS, &errmsg, &errofs, NULL);
- if (extestregex && *extestregex) extestregexp = pcre_compile(extestregex, PCRE_CASELESS, &errmsg, &errofs, NULL);
- if (rcptregex && *rcptregex) rcptregexp = pcre_compile(rcptregex, PCRE_CASELESS, &errmsg, &errofs, NULL);
- if (exrcptregex && *exrcptregex) exrcptregexp = pcre_compile(exrcptregex, PCRE_CASELESS, &errmsg, &errofs, NULL);
+ if (pageregex && *pageregex) pageregexp = pcre2_compile(pageregex, strlen(pageregex), PCRE2_CASELESS, &err, &errofs, NULL);
+ if (expageregex && *expageregex) expageregexp = pcre2_compile(expageregex, strlen(expageregex), PCRE2_CASELESS, &err, &errofs, NULL);
+ if (hostregex && *hostregex) hostregexp = pcre2_compile(hostregex, strlen(hostregex), PCRE2_CASELESS, &err, &errofs, NULL);
+ if (exhostregex && *exhostregex) exhostregexp = pcre2_compile(exhostregex, strlen(exhostregex), PCRE2_CASELESS, &err, &errofs, NULL);
+ if (testregex && *testregex) testregexp = pcre2_compile(testregex, strlen(testregex), PCRE2_CASELESS, &err, &errofs, NULL);
+ if (extestregex && *extestregex) extestregexp = pcre2_compile(extestregex, strlen(extestregex), PCRE2_CASELESS, &err, &errofs, NULL);
+ if (rcptregex && *rcptregex) rcptregexp = pcre2_compile(rcptregex, strlen(rcptregex), PCRE2_CASELESS, &err, &errofs, NULL);
+ if (exrcptregex && *exrcptregex) exrcptregexp = pcre2_compile(exrcptregex, strlen(exrcptregex), PCRE2_CASELESS, &err, &errofs, NULL);
snprintf(acknowledgementslogfilename, sizeof(acknowledgementslogfilename), "%s/acknowledge.log", xgetenv("XYMONSERVERLOGS"));
acknowledgementslog = fopen(acknowledgementslogfilename, "r");
@@ -194,6 +196,7 @@ void do_acknowledgementslog(FILE *output
}
head = NULL;
+ ovector = pcre2_match_data_create(30, NULL);
while (acknowledgementslog && (fgets(l, sizeof(l), acknowledgementslog))) {
@@ -211,7 +214,6 @@ void do_acknowledgementslog(FILE *output
acknowledgements_t *newrec;
void *eventhost;
struct htnames_t *eventcolumn;
- int ovector[30];
/* 2015-03-07 18:17:03 myserver disk andy 1 1425724570 1425752223 1425838623 testing message */
itemsfound = sscanf(l, "%*u-%*u-%*u %*u:%*u:%*u %s %s %s %*u %*u %u %u %[^\t\n]", host, svc, recipient, &etim, &valid, message);
@@ -254,8 +256,8 @@ void do_acknowledgementslog(FILE *output
pagename = xmh_item_multi(eventhost, XMH_PAGEPATH);
pagematch = 0;
while (!pagematch && pagename) {
- pagematch = (pcre_exec(pageregexp, NULL, pagename, strlen(pagename), 0, 0,
- ovector, (sizeof(ovector)/sizeof(int))) >= 0);
+ pagematch = (pcre2_match(pageregexp, pagename, strlen(pagename), 0, 0,
+ ovector, NULL) >= 0);
pagename = xmh_item_multi(NULL, XMH_PAGEPATH);
}
}
@@ -269,8 +271,8 @@ void do_acknowledgementslog(FILE *output
pagename = xmh_item_multi(eventhost, XMH_PAGEPATH);
pagematch = 0;
while (!pagematch && pagename) {
- pagematch = (pcre_exec(expageregexp, NULL, pagename, strlen(pagename), 0, 0,
- ovector, (sizeof(ovector)/sizeof(int))) >= 0);
+ pagematch = (pcre2_match(expageregexp, pagename, strlen(pagename), 0, 0,
+ ovector, NULL) >= 0);
pagename = xmh_item_multi(NULL, XMH_PAGEPATH);
}
}
@@ -279,43 +281,43 @@ void do_acknowledgementslog(FILE *output
if (pagematch) continue;
if (hostregexp)
- hostmatch = (pcre_exec(hostregexp, NULL, hostname, strlen(hostname), 0, 0,
- ovector, (sizeof(ovector)/sizeof(int))) >= 0);
+ hostmatch = (pcre2_match(hostregexp, hostname, strlen(hostname), 0, 0,
+ ovector, NULL) >= 0);
else
hostmatch = 1;
if (!hostmatch) continue;
if (exhostregexp)
- hostmatch = (pcre_exec(exhostregexp, NULL, hostname, strlen(hostname), 0, 0,
- ovector, (sizeof(ovector)/sizeof(int))) >= 0);
+ hostmatch = (pcre2_match(exhostregexp, hostname, strlen(hostname), 0, 0,
+ ovector, NULL) >= 0);
else
hostmatch = 0;
if (hostmatch) continue;
if (testregexp)
- testmatch = (pcre_exec(testregexp, NULL, svcname, strlen(svcname), 0, 0,
- ovector, (sizeof(ovector)/sizeof(int))) >= 0);
+ testmatch = (pcre2_match(testregexp, svcname, strlen(svcname), 0, 0,
+ ovector, NULL) >= 0);
else
testmatch = 1;
if (!testmatch) continue;
if (extestregexp)
- testmatch = (pcre_exec(extestregexp, NULL, svcname, strlen(svcname), 0, 0,
- ovector, (sizeof(ovector)/sizeof(int))) >= 0);
+ testmatch = (pcre2_match(extestregexp, svcname, strlen(svcname), 0, 0,
+ ovector, NULL) >= 0);
else
testmatch = 0;
if (testmatch) continue;
if (rcptregexp)
- rcptmatch = (pcre_exec(rcptregexp, NULL, recipient, strlen(recipient), 0, 0,
- ovector, (sizeof(ovector)/sizeof(int))) >= 0);
+ rcptmatch = (pcre2_match(rcptregexp, recipient, strlen(recipient), 0, 0,
+ ovector, NULL) >= 0);
else
rcptmatch = 1;
if (!rcptmatch) continue;
if (exrcptregexp)
- rcptmatch = (pcre_exec(exrcptregexp, NULL, recipient, strlen(recipient), 0, 0,
- ovector, (sizeof(ovector)/sizeof(int))) >= 0);
+ rcptmatch = (pcre2_match(exrcptregexp, recipient, strlen(recipient), 0, 0,
+ ovector, NULL) >= 0);
else
rcptmatch = 0;
if (rcptmatch) continue;
@@ -405,13 +407,14 @@ void do_acknowledgementslog(FILE *output
if (acknowledgementslog) fclose(acknowledgementslog);
- if (pageregexp) pcre_free(pageregexp);
- if (expageregexp) pcre_free(expageregexp);
- if (hostregexp) pcre_free(hostregexp);
- if (exhostregexp) pcre_free(exhostregexp);
- if (testregexp) pcre_free(testregexp);
- if (extestregexp) pcre_free(extestregexp);
- if (rcptregexp) pcre_free(rcptregexp);
- if (exrcptregexp) pcre_free(exrcptregexp);
+ if (pageregexp) pcre2_code_free(pageregexp);
+ if (expageregexp) pcre2_code_free(expageregexp);
+ if (hostregexp) pcre2_code_free(hostregexp);
+ if (exhostregexp) pcre2_code_free(exhostregexp);
+ if (testregexp) pcre2_code_free(testregexp);
+ if (extestregexp) pcre2_code_free(extestregexp);
+ if (rcptregexp) pcre2_code_free(rcptregexp);
+ if (exrcptregexp) pcre2_code_free(exrcptregexp);
+ pcre2_match_data_free(ovector);
}
--- a/lib/eventlog.c
+++ b/lib/eventlog.c
@@ -28,7 +28,8 @@ static char rcsid[] = "$Id: eventlog.c 8
#include <errno.h>
#include <time.h>
-#include <pcre.h>
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include <pcre2.h>
#include "libxymon.h"
@@ -176,32 +177,36 @@ void dump_countlists(countlist_t *hosthe
}
static int eventfilter(void *hinfo, char *testname,
- pcre *pageregexp, pcre *expageregexp,
- pcre *hostregexp, pcre *exhostregexp,
- pcre *testregexp, pcre *extestregexp,
+ pcre2_code *pageregexp, pcre2_code *expageregexp,
+ pcre2_code *hostregexp, pcre2_code *exhostregexp,
+ pcre2_code *testregexp, pcre2_code *extestregexp,
int ignoredialups, f_hostcheck hostcheck)
{
int pagematch, hostmatch, testmatch;
char *hostname = xmh_item(hinfo, XMH_HOSTNAME);
- int ovector[30];
+ pcre2_match_data *ovector;
if (ignoredialups && xmh_item(hinfo, XMH_FLAG_DIALUP)) return 0;
if (hostcheck && (hostcheck(hostname) == 0)) return 0;
+ ovector = pcre2_match_data_create(30, NULL);
if (pageregexp) {
char *pagename;
pagename = xmh_item_multi(hinfo, XMH_PAGEPATH);
pagematch = 0;
while (!pagematch && pagename) {
- pagematch = (pcre_exec(pageregexp, NULL, pagename, strlen(pagename), 0, 0,
- ovector, (sizeof(ovector)/sizeof(int))) >= 0);
+ pagematch = (pcre2_match(pageregexp, pagename, strlen(pagename), 0, 0,
+ ovector, NULL) >= 0);
pagename = xmh_item_multi(NULL, XMH_PAGEPATH);
}
}
else
pagematch = 1;
- if (!pagematch) return 0;
+ if (!pagematch) {
+ pcre2_match_data_free(ovector);
+ return 0;
+ }
if (expageregexp) {
char *pagename;
@@ -209,51 +214,67 @@ static int eventfilter(void *hinfo, cha
pagename = xmh_item_multi(hinfo, XMH_PAGEPATH);
pagematch = 0;
while (!pagematch && pagename) {
- pagematch = (pcre_exec(expageregexp, NULL, pagename, strlen(pagename), 0, 0,
- ovector, (sizeof(ovector)/sizeof(int))) >= 0);
+ pagematch = (pcre2_match(expageregexp, pagename, strlen(pagename), 0, 0,
+ ovector, NULL) >= 0);
pagename = xmh_item_multi(NULL, XMH_PAGEPATH);
}
}
else
pagematch = 0;
- if (pagematch) return 0;
+ if (pagematch) {
+ pcre2_match_data_free(ovector);
+ return 0;
+ }
if (hostregexp)
- hostmatch = (pcre_exec(hostregexp, NULL, hostname, strlen(hostname), 0, 0,
- ovector, (sizeof(ovector)/sizeof(int))) >= 0);
+ hostmatch = (pcre2_match(hostregexp, hostname, strlen(hostname), 0, 0,
+ ovector, NULL) >= 0);
else
hostmatch = 1;
- if (!hostmatch) return 0;
+ if (!hostmatch) {
+ pcre2_match_data_free(ovector);
+ return 0;
+ }
if (exhostregexp)
- hostmatch = (pcre_exec(exhostregexp, NULL, hostname, strlen(hostname), 0, 0,
- ovector, (sizeof(ovector)/sizeof(int))) >= 0);
+ hostmatch = (pcre2_match(exhostregexp, hostname, strlen(hostname), 0, 0,
+ ovector, NULL) >= 0);
else
hostmatch = 0;
- if (hostmatch) return 0;
+ if (hostmatch) {
+ pcre2_match_data_free(ovector);
+ return 0;
+ }
if (testregexp)
- testmatch = (pcre_exec(testregexp, NULL, testname, strlen(testname), 0, 0,
- ovector, (sizeof(ovector)/sizeof(int))) >= 0);
+ testmatch = (pcre2_match(testregexp, testname, strlen(testname), 0, 0,
+ ovector, NULL) >= 0);
else
testmatch = 1;
- if (!testmatch) return 0;
+ if (!testmatch) {
+ pcre2_match_data_free(ovector);
+ return 0;
+ }
if (extestregexp)
- testmatch = (pcre_exec(extestregexp, NULL, testname, strlen(testname), 0, 0,
- ovector, (sizeof(ovector)/sizeof(int))) >= 0);
+ testmatch = (pcre2_match(extestregexp, testname, strlen(testname), 0, 0,
+ ovector, NULL) >= 0);
else
testmatch = 0;
- if (testmatch) return 0;
+ if (testmatch) {
+ pcre2_match_data_free(ovector);
+ return 0;
+ }
+ pcre2_match_data_free(ovector);
return 1;
}
static void count_duration(time_t fromtime, time_t totime,
- pcre *pageregexp, pcre *expageregexp,
- pcre *hostregexp, pcre *exhostregexp,
- pcre *testregexp, pcre *extestregexp,
+ pcre2_code *pageregexp, pcre2_code *expageregexp,
+ pcre2_code *hostregexp, pcre2_code *exhostregexp,
+ pcre2_code *testregexp, pcre2_code *extestregexp,
int ignoredialups, f_hostcheck hostcheck,
event_t *eventhead, countlist_t **hostcounthead, countlist_t **svccounthead)
{
@@ -515,15 +536,16 @@ void do_eventlog(FILE *output, int maxco
char title[200];
/* For the PCRE matching */
- const char *errmsg = NULL;
- int errofs = 0;
- pcre *pageregexp = NULL;
- pcre *expageregexp = NULL;
- pcre *hostregexp = NULL;
- pcre *exhostregexp = NULL;
- pcre *testregexp = NULL;
- pcre *extestregexp = NULL;
- pcre *colrregexp = NULL;
+ int err;
+ PCRE2_SIZE errofs;
+ pcre2_code *pageregexp = NULL;
+ pcre2_code *expageregexp = NULL;
+ pcre2_code *hostregexp = NULL;
+ pcre2_code *exhostregexp = NULL;
+ pcre2_code *testregexp = NULL;
+ pcre2_code *extestregexp = NULL;
+ pcre2_code *colrregexp = NULL;
+ pcre2_match_data *ovector;
countlist_t *hostcounthead = NULL, *svccounthead = NULL;
if (eventlist) *eventlist = NULL;
@@ -569,13 +591,13 @@ void do_eventlog(FILE *output, int maxco
if (!maxcount) maxcount = 100;
- if (pageregex && *pageregex) pageregexp = pcre_compile(pageregex, PCRE_CASELESS, &errmsg, &errofs, NULL);
- if (expageregex && *expageregex) expageregexp = pcre_compile(expageregex, PCRE_CASELESS, &errmsg, &errofs, NULL);
- if (hostregex && *hostregex) hostregexp = pcre_compile(hostregex, PCRE_CASELESS, &errmsg, &errofs, NULL);
- if (exhostregex && *exhostregex) exhostregexp = pcre_compile(exhostregex, PCRE_CASELESS, &errmsg, &errofs, NULL);
- if (testregex && *testregex) testregexp = pcre_compile(testregex, PCRE_CASELESS, &errmsg, &errofs, NULL);
- if (extestregex && *extestregex) extestregexp = pcre_compile(extestregex, PCRE_CASELESS, &errmsg, &errofs, NULL);
- if (colrregex && *colrregex) colrregexp = pcre_compile(colrregex, PCRE_CASELESS, &errmsg, &errofs, NULL);
+ if (pageregex && *pageregex) pageregexp = pcre2_compile(pageregex, strlen(pageregex), PCRE2_CASELESS, &err, &errofs, NULL);
+ if (expageregex && *expageregex) expageregexp = pcre2_compile(expageregex, strlen(expageregex), PCRE2_CASELESS, &err, &errofs, NULL);
+ if (hostregex && *hostregex) hostregexp = pcre2_compile(hostregex, strlen(hostregex), PCRE2_CASELESS, &err, &errofs, NULL);
+ if (exhostregex && *exhostregex) exhostregexp = pcre2_compile(exhostregex, strlen(exhostregex), PCRE2_CASELESS, &err, &errofs, NULL);
+ if (testregex && *testregex) testregexp = pcre2_compile(testregex, strlen(testregex), PCRE2_CASELESS, &err, &errofs, NULL);
+ if (extestregex && *extestregex) extestregexp = pcre2_compile(extestregex, strlen(extestregex), PCRE2_CASELESS, &err, &errofs, NULL);
+ if (colrregex && *colrregex) colrregexp = pcre2_compile(colrregex, strlen(colrregex), PCRE2_CASELESS, &err, &errofs, NULL);
snprintf(eventlogfilename, sizeof(eventlogfilename), "%s/allevents", xgetenv("XYMONHISTDIR"));
eventlog = fopen(eventlogfilename, "r");
@@ -618,6 +640,7 @@ void do_eventlog(FILE *output, int maxco
}
eventhead = NULL;
+ ovector = pcre2_match_data_create(30, NULL);
while (eventlog && (fgets(l, sizeof(l), eventlog))) {
@@ -629,7 +652,6 @@ void do_eventlog(FILE *output, int maxco
event_t *newevent;
void *eventhost;
struct htnames_t *eventcolumn;
- int ovector[30];
eventcount_t *countrec;
itemsfound = sscanf(l, "%s %s %u %u %u %s %s %d",
@@ -657,10 +679,10 @@ void do_eventlog(FILE *output, int maxco
/* For duration counts, record all events. We'll filter out the colors later. */
if (colrregexp && (counttype != XYMON_COUNT_DURATION)) {
- colrmatch = ( (pcre_exec(colrregexp, NULL, newcolname, strlen(newcolname), 0, 0,
- ovector, (sizeof(ovector)/sizeof(int))) >= 0) ||
- (pcre_exec(colrregexp, NULL, oldcolname, strlen(oldcolname), 0, 0,
- ovector, (sizeof(ovector)/sizeof(int))) >= 0) );
+ colrmatch = ( (pcre2_match(colrregexp, newcolname, strlen(newcolname), 0, 0,
+ ovector, NULL) >= 0) ||
+ (pcre2_match(colrregexp, oldcolname, strlen(oldcolname), 0, 0,
+ ovector, NULL) >= 0) );
}
else
colrmatch = 1;
@@ -842,10 +864,11 @@ void do_eventlog(FILE *output, int maxco
if (eventlog) fclose(eventlog);
- if (pageregexp) pcre_free(pageregexp);
- if (hostregexp) pcre_free(hostregexp);
- if (testregexp) pcre_free(testregexp);
- if (colrregexp) pcre_free(colrregexp);
+ if (pageregexp) pcre2_code_free(pageregexp);
+ if (hostregexp) pcre2_code_free(hostregexp);
+ if (testregexp) pcre2_code_free(testregexp);
+ if (colrregexp) pcre2_code_free(colrregexp);
+ pcre2_match_data_free(ovector);
/* Return the event- and count-lists, if wanted - or clean them up */
if (eventlist) {
--- a/lib/headfoot.c
+++ b/lib/headfoot.c
@@ -22,7 +22,8 @@ static char rcsid[] = "$Id: headfoot.c 8
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
-#include <pcre.h>
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include <pcre2.h>
#include "libxymon.h"
#include "version.h"
@@ -50,13 +51,13 @@ static char *statusboard = NULL;
static char *scheduleboard = NULL;
static char *hostpattern_text = NULL;
-static pcre *hostpattern = NULL;
+static pcre2_code *hostpattern = NULL;
static char *pagepattern_text = NULL;
-static pcre *pagepattern = NULL;
+static pcre2_code *pagepattern = NULL;
static char *ippattern_text = NULL;
-static pcre *ippattern = NULL;
+static pcre2_code *ippattern = NULL;
static char *classpattern_text = NULL;
-static pcre *classpattern = NULL;
+static pcre2_code *classpattern = NULL;
static void * hostnames;
static void * testnames;
@@ -158,34 +159,34 @@ void sethostenv_pagepath(char *s)
void sethostenv_filter(char *hostptn, char *pageptn, char *ipptn, char *classptn)
{
- const char *errmsg;
- int errofs;
+ int err;
+ PCRE2_SIZE errofs;
if (hostpattern_text) xfree(hostpattern_text);
- if (hostpattern) { pcre_free(hostpattern); hostpattern = NULL; }
+ if (hostpattern) { pcre2_code_free(hostpattern); hostpattern = NULL; }
if (pagepattern_text) xfree(pagepattern_text);
- if (pagepattern) { pcre_free(pagepattern); pagepattern = NULL; }
+ if (pagepattern) { pcre2_code_free(pagepattern); pagepattern = NULL; }
if (ippattern_text) xfree(ippattern_text);
- if (ippattern) { pcre_free(ippattern); ippattern = NULL; }
+ if (ippattern) { pcre2_code_free(ippattern); ippattern = NULL; }
if (classpattern_text) xfree(classpattern_text);
- if (classpattern) { pcre_free(classpattern); classpattern = NULL; }
+ if (classpattern) { pcre2_code_free(classpattern); classpattern = NULL; }
/* Setup the pattern to match names against */
if (hostptn) {
hostpattern_text = strdup(hostptn);
- hostpattern = pcre_compile(hostptn, PCRE_CASELESS, &errmsg, &errofs, NULL);
+ hostpattern = pcre2_compile(hostptn, strlen(hostptn), PCRE2_CASELESS, &err, &errofs, NULL);
}
if (pageptn) {
pagepattern_text = strdup(pageptn);
- pagepattern = pcre_compile(pageptn, PCRE_CASELESS, &errmsg, &errofs, NULL);
+ pagepattern = pcre2_compile(pageptn, strlen(pageptn), PCRE2_CASELESS, &err, &errofs, NULL);
}
if (ipptn) {
ippattern_text = strdup(ipptn);
- ippattern = pcre_compile(ipptn, PCRE_CASELESS, &errmsg, &errofs, NULL);
+ ippattern = pcre2_compile(ipptn, strlen(ipptn), PCRE2_CASELESS, &err, &errofs, NULL);
}
if (classptn) {
classpattern_text = strdup(classptn);
- classpattern = pcre_compile(classptn, PCRE_CASELESS, &errmsg, &errofs, NULL);
+ classpattern = pcre2_compile(classptn, strlen(classptn), PCRE2_CASELESS, &err, &errofs, NULL);
}
}
@@ -371,38 +372,53 @@ char *wkdayselect(char wkday, char *valt
static void *wanted_host(char *hostname)
{
void *hinfo = hostinfo(hostname);
- int result, ovector[30];
+ int result;
+ pcre2_match_data *ovector;
if (!hinfo) return NULL;
+ ovector = pcre2_match_data_create(30, NULL);
if (hostpattern) {
- result = pcre_exec(hostpattern, NULL, hostname, strlen(hostname), 0, 0,
- ovector, (sizeof(ovector)/sizeof(int)));
- if (result < 0) return NULL;
+ result = pcre2_match(hostpattern, hostname, strlen(hostname), 0, 0,
+ ovector, NULL);
+ if (result < 0) {
+ pcre2_match_data_free(ovector);
+ return NULL;
+ }
}
if (pagepattern && hinfo) {
char *pname = xmh_item(hinfo, XMH_PAGEPATH);
- result = pcre_exec(pagepattern, NULL, pname, strlen(pname), 0, 0,
- ovector, (sizeof(ovector)/sizeof(int)));
- if (result < 0) return NULL;
+ result = pcre2_match(pagepattern, pname, strlen(pname), 0, 0,
+ ovector, NULL);
+ if (result < 0) {
+ pcre2_match_data_free(ovector);
+ return NULL;
+ }
}
if (ippattern && hinfo) {
char *hostip = xmh_item(hinfo, XMH_IP);
- result = pcre_exec(ippattern, NULL, hostip, strlen(hostip), 0, 0,
- ovector, (sizeof(ovector)/sizeof(int)));
- if (result < 0) return NULL;
+ result = pcre2_match(ippattern, hostip, strlen(hostip), 0, 0,
+ ovector, NULL);
+ if (result < 0) {
+ pcre2_match_data_free(ovector);
+ return NULL;
+ }
}
if (classpattern && hinfo) {
char *hostclass = xmh_item(hinfo, XMH_CLASS);
if (!hostclass) return NULL;
- result = pcre_exec(classpattern, NULL, hostclass, strlen(hostclass), 0, 0,
- ovector, (sizeof(ovector)/sizeof(int)));
- if (result < 0) return NULL;
+ result = pcre2_match(classpattern, hostclass, strlen(hostclass), 0, 0,
+ ovector, NULL);
+ if (result < 0) {
+ pcre2_match_data_free(ovector);
+ return NULL;
+ }
}
+ pcre2_match_data_free(ovector);
return hinfo;
}
--- a/lib/loadalerts.c
+++ b/lib/loadalerts.c
@@ -25,7 +25,8 @@ static char rcsid[] = "$Id: loadalerts.c
#include <limits.h>
#include <errno.h>
-#include <pcre.h>
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include <pcre2.h>
#include "libxymon.h"
@@ -164,29 +165,29 @@ static void free_criteria(criteria_t *cr
{
if (crit->cfline) xfree(crit->cfline);
if (crit->pagespec) xfree(crit->pagespec);
- if (crit->pagespecre) pcre_free(crit->pagespecre);
+ if (crit->pagespecre) pcre2_code_free(crit->pagespecre);
if (crit->expagespec) xfree(crit->expagespec);
- if (crit->expagespecre) pcre_free(crit->expagespecre);
+ if (crit->expagespecre) pcre2_code_free(crit->expagespecre);
if (crit->dgspec) xfree(crit->dgspec);
- if (crit->dgspecre) pcre_free(crit->dgspecre);
+ if (crit->dgspecre) pcre2_code_free(crit->dgspecre);
if (crit->exdgspec) xfree(crit->exdgspec);
- if (crit->exdgspecre) pcre_free(crit->exdgspecre);
+ if (crit->exdgspecre) pcre2_code_free(crit->exdgspecre);
if (crit->hostspec) xfree(crit->hostspec);
- if (crit->hostspecre) pcre_free(crit->hostspecre);
+ if (crit->hostspecre) pcre2_code_free(crit->hostspecre);
if (crit->exhostspec) xfree(crit->exhostspec);
- if (crit->exhostspecre) pcre_free(crit->exhostspecre);
+ if (crit->exhostspecre) pcre2_code_free(crit->exhostspecre);
if (crit->svcspec) xfree(crit->svcspec);
- if (crit->svcspecre) pcre_free(crit->svcspecre);
+ if (crit->svcspecre) pcre2_code_free(crit->svcspecre);
if (crit->exsvcspec) xfree(crit->exsvcspec);
- if (crit->exsvcspecre) pcre_free(crit->exsvcspecre);
+ if (crit->exsvcspecre) pcre2_code_free(crit->exsvcspecre);
if (crit->classspec) xfree(crit->classspec);
- if (crit->classspecre) pcre_free(crit->classspecre);
+ if (crit->classspecre) pcre2_code_free(crit->classspecre);
if (crit->exclassspec) xfree(crit->exclassspec);
- if (crit->exclassspecre) pcre_free(crit->exclassspecre);
+ if (crit->exclassspecre) pcre2_code_free(crit->exclassspecre);
if (crit->groupspec) xfree(crit->groupspec);
- if (crit->groupspecre) pcre_free(crit->groupspecre);
+ if (crit->groupspecre) pcre2_code_free(crit->groupspecre);
if (crit->exgroupspec) xfree(crit->exgroupspec);
- if (crit->exgroupspecre) pcre_free(crit->exgroupspecre);
+ if (crit->exgroupspecre) pcre2_code_free(crit->exgroupspecre);
if (crit->timespec) xfree(crit->timespec);
if (crit->extimespec) xfree(crit->extimespec);
}
--- a/lib/matching.c
+++ b/lib/matching.c
@@ -18,55 +18,60 @@ static char rcsid[] = "$Id: matching.c 7
#include <string.h>
#include <stdlib.h>
-#include <pcre.h>
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include <pcre2.h>
#include "libxymon.h"
-pcre *compileregex_opts(const char *pattern, int flags)
+pcre2_code *compileregex_opts(const char *pattern, uint32_t flags)
{
- pcre *result;
- const char *errmsg;
- int errofs;
+ pcre2_code *result;
+ char errmsg[120];
+ int err;
+ PCRE2_SIZE errofs;
dbgprintf("Compiling regex %s\n", pattern);
- result = pcre_compile(pattern, flags, &errmsg, &errofs, NULL);
+ result = pcre2_compile(pattern, strlen(pattern), flags, &err, &errofs, NULL);
if (result == NULL) {
- errprintf("pcre compile '%s' failed (offset %d): %s\n", pattern, errofs, errmsg);
+ pcre2_get_error_message(err, errmsg, sizeof(errmsg));
+ errprintf("pcre compile '%s' failed (offset %zu): %s\n", pattern, errofs, errmsg);
return NULL;
}
return result;
}
-pcre *compileregex(const char *pattern)
+pcre2_code *compileregex(const char *pattern)
{
- return compileregex_opts(pattern, PCRE_CASELESS);
+ return compileregex_opts(pattern, PCRE2_CASELESS);
}
-pcre *multilineregex(const char *pattern)
+pcre2_code *multilineregex(const char *pattern)
{
- return compileregex_opts(pattern, PCRE_CASELESS|PCRE_MULTILINE);
+ return compileregex_opts(pattern, PCRE2_CASELESS|PCRE2_MULTILINE);
}
-int matchregex(const char *needle, pcre *pcrecode)
+int matchregex(const char *needle, pcre2_code *pcrecode)
{
- int ovector[30];
+ pcre2_match_data *ovector;
int result;
if (!needle || !pcrecode) return 0;
- result = pcre_exec(pcrecode, NULL, needle, strlen(needle), 0, 0, ovector, (sizeof(ovector)/sizeof(int)));
+ ovector = pcre2_match_data_create(30, NULL);
+ result = pcre2_match(pcrecode, needle, strlen(needle), 0, 0, ovector, NULL);
+ pcre2_match_data_free(ovector);
return (result >= 0);
}
-void freeregex(pcre *pcrecode)
+void freeregex(pcre2_code *pcrecode)
{
if (!pcrecode) return;
- pcre_free(pcrecode);
+ pcre2_code_free(pcrecode);
}
-int namematch(const char *needle, char *haystack, pcre *pcrecode)
+int namematch(const char *needle, char *haystack, pcre2_code *pcrecode)
{
char *xhay;
char *tokbuf = NULL, *tok;
@@ -118,7 +123,7 @@ int namematch(const char *needle, char *
return result;
}
-int patternmatch(char *datatosearch, char *pattern, pcre *pcrecode)
+int patternmatch(char *datatosearch, char *pattern, pcre2_code *pcrecode)
{
if (pcrecode) {
/* Do regex matching. The regex has already been compiled for us. */
@@ -133,17 +138,17 @@ int patternmatch(char *datatosearch, cha
return (strstr(datatosearch, pattern) != NULL);
}
-pcre **compile_exprs(char *id, const char **patterns, int count)
+pcre2_code **compile_exprs(char *id, const char **patterns, int count)
{
- pcre **result = NULL;
+ pcre2_code **result = NULL;
int i;
- result = (pcre **)calloc(count, sizeof(pcre *));
+ result = (pcre2_code **)calloc(count, sizeof(pcre2_code *));
for (i=0; (i < count); i++) {
result[i] = compileregex(patterns[i]);
if (!result[i]) {
errprintf("Internal error: %s pickdata PCRE-compile failed\n", id);
- for (i=0; (i < count); i++) if (result[i]) pcre_free(result[i]);
+ for (i=0; (i < count); i++) if (result[i]) pcre2_code_free(result[i]);
xfree(result);
return NULL;
}
@@ -152,24 +157,30 @@ pcre **compile_exprs(char *id, const cha
return result;
}
-int pickdata(char *buf, pcre *expr, int dupok, ...)
+int pickdata(char *buf, pcre2_code *expr, int dupok, ...)
{
int res, i;
- int ovector[30];
+ pcre2_match_data *ovector;
va_list ap;
char **ptr;
char w[100];
+ PCRE2_SIZE l;
if (!expr) return 0;
- res = pcre_exec(expr, NULL, buf, strlen(buf), 0, 0, ovector, (sizeof(ovector)/sizeof(int)));
- if (res < 0) return 0;
+ ovector = pcre2_match_data_create(30, NULL);
+ res = pcre2_match(expr, buf, strlen(buf), 0, 0, ovector, NULL);
+ if (res < 0) {
+ pcre2_match_data_free(ovector);
+ return 0;
+ }
va_start(ap, dupok);
for (i=1; (i < res); i++) {
*w = '\0';
- pcre_copy_substring(buf, ovector, res, i, w, sizeof(w));
+ l = sizeof(w);
+ pcre2_substring_copy_bynumber(ovector, i, w, &l);
ptr = va_arg(ap, char **);
if (dupok) {
if (*ptr) xfree(*ptr);
@@ -186,6 +197,7 @@ int pickdata(char *buf, pcre *expr, int
}
va_end(ap);
+ pcre2_match_data_free(ovector);
return 1;
}
--- a/lib/matching.h
+++ b/lib/matching.h
@@ -13,11 +13,12 @@
/* The clients probably don't have the pcre headers */
#if defined(LOCALCLIENT) || !defined(CLIENTONLY)
-#include <pcre.h>
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include <pcre2.h>
#include <stdarg.h>
-extern pcre *compileregex(const char *pattern);
-extern pcre *compileregex_opts(const char *pattern, int flags);
+extern pcre2_code *compileregex(const char *pattern);
+extern pcre2_code *compileregex_opts(const char *pattern, uint32_t flags);
#ifdef PCRE_FIRSTLINE
#define firstlineregex(P) compileregex_opts(P, PCRE_FIRSTLINE);
#define firstlineregexnocase(P) compileregex_opts(P, PCRE_CASELESS|PCRE_FIRSTLINE);
@@ -25,13 +26,13 @@ extern pcre *compileregex_opts(const cha
#define firstlineregex(P) compileregex_opts(P, 0);
#define firstlineregexnocase(P) compileregex_opts(P, PCRE_CASELESS);
#endif
-extern pcre *multilineregex(const char *pattern);
-extern int matchregex(const char *needle, pcre *pcrecode);
-extern void freeregex(pcre *pcrecode);
-extern int namematch(const char *needle, char *haystack, pcre *pcrecode);
-extern int patternmatch(char *datatosearch, char *pattern, pcre *pcrecode);
-extern pcre **compile_exprs(char *id, const char **patterns, int count);
-extern int pickdata(char *buf, pcre *expr, int dupok, ...);
+extern pcre2_code *multilineregex(const char *pattern);
+extern int matchregex(const char *needle, pcre2_code *pcrecode);
+extern void freeregex(pcre2_code *pcrecode);
+extern int namematch(const char *needle, char *haystack, pcre2_code *pcrecode);
+extern int patternmatch(char *datatosearch, char *pattern, pcre2_code *pcrecode);
+extern pcre2_code **compile_exprs(char *id, const char **patterns, int count);
+extern int pickdata(char *buf, pcre2_code *expr, int dupok, ...);
extern int timematch(char *holidaykey, char *tspec);
#endif
--- a/lib/notifylog.c
+++ b/lib/notifylog.c
@@ -26,7 +26,8 @@ static char rcsid[] = "$Id: notifylog.c
#include <errno.h>
#include <time.h>
-#include <pcre.h>
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include <pcre2.h>
#include "libxymon.h"
@@ -101,16 +102,17 @@ void do_notifylog(FILE *output,
char title[200];
/* For the PCRE matching */
- const char *errmsg = NULL;
- int errofs = 0;
- pcre *pageregexp = NULL;
- pcre *expageregexp = NULL;
- pcre *hostregexp = NULL;
- pcre *exhostregexp = NULL;
- pcre *testregexp = NULL;
- pcre *extestregexp = NULL;
- pcre *rcptregexp = NULL;
- pcre *exrcptregexp = NULL;
+ int err;
+ PCRE2_SIZE errofs;
+ pcre2_code *pageregexp = NULL;
+ pcre2_code *expageregexp = NULL;
+ pcre2_code *hostregexp = NULL;
+ pcre2_code *exhostregexp = NULL;
+ pcre2_code *testregexp = NULL;
+ pcre2_code *extestregexp = NULL;
+ pcre2_code *rcptregexp = NULL;
+ pcre2_code *exrcptregexp = NULL;
+ pcre2_match_data *ovector;
if (maxminutes && (fromtime || totime)) {
fprintf(output, "<B>Only one time interval type is allowed!</B>");
@@ -145,14 +147,14 @@ void do_notifylog(FILE *output,
if (!maxcount) maxcount = 100;
- if (pageregex && *pageregex) pageregexp = pcre_compile(pageregex, PCRE_CASELESS, &errmsg, &errofs, NULL);
- if (expageregex && *expageregex) expageregexp = pcre_compile(expageregex, PCRE_CASELESS, &errmsg, &errofs, NULL);
- if (hostregex && *hostregex) hostregexp = pcre_compile(hostregex, PCRE_CASELESS, &errmsg, &errofs, NULL);
- if (exhostregex && *exhostregex) exhostregexp = pcre_compile(exhostregex, PCRE_CASELESS, &errmsg, &errofs, NULL);
- if (testregex && *testregex) testregexp = pcre_compile(testregex, PCRE_CASELESS, &errmsg, &errofs, NULL);
- if (extestregex && *extestregex) extestregexp = pcre_compile(extestregex, PCRE_CASELESS, &errmsg, &errofs, NULL);
- if (rcptregex && *rcptregex) rcptregexp = pcre_compile(rcptregex, PCRE_CASELESS, &errmsg, &errofs, NULL);
- if (exrcptregex && *exrcptregex) exrcptregexp = pcre_compile(exrcptregex, PCRE_CASELESS, &errmsg, &errofs, NULL);
+ if (pageregex && *pageregex) pageregexp = pcre2_compile(pageregex, strlen(pageregex), PCRE2_CASELESS, &err, &errofs, NULL);
+ if (expageregex && *expageregex) expageregexp = pcre2_compile(expageregex, strlen(expageregex), PCRE2_CASELESS, &err, &errofs, NULL);
+ if (hostregex && *hostregex) hostregexp = pcre2_compile(hostregex, strlen(hostregex), PCRE2_CASELESS, &err, &errofs, NULL);
+ if (exhostregex && *exhostregex) exhostregexp = pcre2_compile(exhostregex, strlen(exhostregex), PCRE2_CASELESS, &err, &errofs, NULL);
+ if (testregex && *testregex) testregexp = pcre2_compile(testregex, strlen(testregex), PCRE2_CASELESS, &err, &errofs, NULL);
+ if (extestregex && *extestregex) extestregexp = pcre2_compile(extestregex, strlen(extestregex), PCRE2_CASELESS, &err, &errofs, NULL);
+ if (rcptregex && *rcptregex) rcptregexp = pcre2_compile(rcptregex, strlen(rcptregex), PCRE2_CASELESS, &err, &errofs, NULL);
+ if (exrcptregex && *exrcptregex) exrcptregexp = pcre2_compile(exrcptregex, strlen(exrcptregex), PCRE2_CASELESS, &err, &errofs, NULL);
snprintf(notifylogfilename, sizeof(notifylogfilename), "%s/notifications.log", xgetenv("XYMONSERVERLOGS"));
notifylog = fopen(notifylogfilename, "r");
@@ -188,6 +190,7 @@ void do_notifylog(FILE *output,
}
head = NULL;
+ ovector = pcre2_match_data_create(30, NULL);
while (notifylog && (fgets(l, sizeof(l), notifylog))) {
@@ -200,7 +203,6 @@ void do_notifylog(FILE *output,
notification_t *newrec;
void *eventhost;
struct htnames_t *eventcolumn;
- int ovector[30];
itemsfound = sscanf(l, "%*s %*s %*u %*u:%*u:%*u %*u %s %*s %s %u %*d", hostsvc, recipient, &etim);
eventtime = etim;
@@ -221,8 +223,8 @@ void do_notifylog(FILE *output,
pagename = xmh_item_multi(eventhost, XMH_PAGEPATH);
pagematch = 0;
while (!pagematch && pagename) {
- pagematch = (pcre_exec(pageregexp, NULL, pagename, strlen(pagename), 0, 0,
- ovector, (sizeof(ovector)/sizeof(int))) >= 0);
+ pagematch = (pcre2_match(pageregexp, pagename, strlen(pagename), 0, 0,
+ ovector, NULL) >= 0);
pagename = xmh_item_multi(NULL, XMH_PAGEPATH);
}
}
@@ -236,8 +238,8 @@ void do_notifylog(FILE *output,
pagename = xmh_item_multi(eventhost, XMH_PAGEPATH);
pagematch = 0;
while (!pagematch && pagename) {
- pagematch = (pcre_exec(expageregexp, NULL, pagename, strlen(pagename), 0, 0,
- ovector, (sizeof(ovector)/sizeof(int))) >= 0);
+ pagematch = (pcre2_match(expageregexp, pagename, strlen(pagename), 0, 0,
+ ovector, NULL) >= 0);
pagename = xmh_item_multi(NULL, XMH_PAGEPATH);
}
}
@@ -246,43 +248,43 @@ void do_notifylog(FILE *output,
if (pagematch) continue;
if (hostregexp)
- hostmatch = (pcre_exec(hostregexp, NULL, hostname, strlen(hostname), 0, 0,
- ovector, (sizeof(ovector)/sizeof(int))) >= 0);
+ hostmatch = (pcre2_match(hostregexp, hostname, strlen(hostname), 0, 0,
+ ovector, NULL) >= 0);
else
hostmatch = 1;
if (!hostmatch) continue;
if (exhostregexp)
- hostmatch = (pcre_exec(exhostregexp, NULL, hostname, strlen(hostname), 0, 0,
- ovector, (sizeof(ovector)/sizeof(int))) >= 0);
+ hostmatch = (pcre2_match(exhostregexp, hostname, strlen(hostname), 0, 0,
+ ovector, NULL) >= 0);
else
hostmatch = 0;
if (hostmatch) continue;
if (testregexp)
- testmatch = (pcre_exec(testregexp, NULL, svcname, strlen(svcname), 0, 0,
- ovector, (sizeof(ovector)/sizeof(int))) >= 0);
+ testmatch = (pcre2_match(testregexp, svcname, strlen(svcname), 0, 0,
+ ovector, NULL) >= 0);
else
testmatch = 1;
if (!testmatch) continue;
if (extestregexp)
- testmatch = (pcre_exec(extestregexp, NULL, svcname, strlen(svcname), 0, 0,
- ovector, (sizeof(ovector)/sizeof(int))) >= 0);
+ testmatch = (pcre2_match(extestregexp, svcname, strlen(svcname), 0, 0,
+ ovector, NULL) >= 0);
else
testmatch = 0;
if (testmatch) continue;
if (rcptregexp)
- rcptmatch = (pcre_exec(rcptregexp, NULL, recipient, strlen(recipient), 0, 0,
- ovector, (sizeof(ovector)/sizeof(int))) >= 0);
+ rcptmatch = (pcre2_match(rcptregexp, recipient, strlen(recipient), 0, 0,
+ ovector, NULL) >= 0);
else
rcptmatch = 1;
if (!rcptmatch) continue;
if (exrcptregexp)
- rcptmatch = (pcre_exec(exrcptregexp, NULL, recipient, strlen(recipient), 0, 0,
- ovector, (sizeof(ovector)/sizeof(int))) >= 0);
+ rcptmatch = (pcre2_match(exrcptregexp, recipient, strlen(recipient), 0, 0,
+ ovector, NULL) >= 0);
else
rcptmatch = 0;
if (rcptmatch) continue;
@@ -367,13 +369,14 @@ void do_notifylog(FILE *output,
if (notifylog) fclose(notifylog);
- if (pageregexp) pcre_free(pageregexp);
- if (expageregexp) pcre_free(expageregexp);
- if (hostregexp) pcre_free(hostregexp);
- if (exhostregexp) pcre_free(exhostregexp);
- if (testregexp) pcre_free(testregexp);
- if (extestregexp) pcre_free(extestregexp);
- if (rcptregexp) pcre_free(rcptregexp);
- if (exrcptregexp) pcre_free(exrcptregexp);
+ if (pageregexp) pcre2_code_free(pageregexp);
+ if (expageregexp) pcre2_code_free(expageregexp);
+ if (hostregexp) pcre2_code_free(hostregexp);
+ if (exhostregexp) pcre2_code_free(exhostregexp);
+ if (testregexp) pcre2_code_free(testregexp);
+ if (extestregexp) pcre2_code_free(extestregexp);
+ if (rcptregexp) pcre2_code_free(rcptregexp);
+ if (exrcptregexp) pcre2_code_free(exrcptregexp);
+ pcre2_match_data_free(ovector);
}
--- a/web/showgraph.c
+++ b/web/showgraph.c
@@ -27,7 +27,8 @@ static char rcsid[] = "$Id: showgraph.c
#include <sys/un.h>
#include <fcntl.h>
-#include <pcre.h>
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include <pcre2.h>
#include <rrd.h>
#include "libxymon.h"
@@ -950,10 +951,11 @@ void generate_graph(char *gdeffn, char *
}
else {
struct dirent *d;
- pcre *pat, *expat = NULL;
- const char *errmsg;
- int errofs, result;
- int ovector[30];
+ pcre2_code *pat, *expat = NULL;
+ char errmsg[120];
+ int err, result;
+ PCRE2_SIZE errofs;
+ pcre2_match_data *ovector;
struct stat st;
time_t now = getcurrenttime(NULL);
@@ -961,21 +963,23 @@ void generate_graph(char *gdeffn, char *
dir = opendir("."); if (dir == NULL) errormsg("Unexpected error while accessing RRD directory");
/* Setup the pattern to match filenames against */
- pat = pcre_compile(gdef->fnpat, PCRE_CASELESS, &errmsg, &errofs, NULL);
+ pat = pcre2_compile(gdef->fnpat, strlen(gdef->fnpat), PCRE2_CASELESS, &err, &errofs, NULL);
if (!pat) {
char msg[8192];
- snprintf(msg, sizeof(msg), "graphs.cfg error, PCRE pattern %s invalid: %s, offset %d\n",
+ pcre2_get_error_message(err, errmsg, sizeof(errmsg));
+ snprintf(msg, sizeof(msg), "graphs.cfg error, PCRE pattern %s invalid: %s, offset %zu\n",
htmlquoted(gdef->fnpat), errmsg, errofs);
errormsg(msg);
}
if (gdef->exfnpat) {
- expat = pcre_compile(gdef->exfnpat, PCRE_CASELESS, &errmsg, &errofs, NULL);
+ expat = pcre2_compile(gdef->exfnpat, strlen(gdef->exfnpat), PCRE2_CASELESS, &err, &errofs, NULL);
if (!expat) {
char msg[8192];
+ pcre2_get_error_message(err, errmsg, sizeof(errmsg));
snprintf(msg, sizeof(msg),
- "graphs.cfg error, PCRE pattern %s invalid: %s, offset %d\n",
+ "graphs.cfg error, PCRE pattern %s invalid: %s, offset %zu\n",
htmlquoted(gdef->exfnpat), errmsg, errofs);
errormsg(msg);
}
@@ -985,9 +989,11 @@ void generate_graph(char *gdeffn, char *
rrddbsize = 5;
rrddbs = (rrddb_t *) malloc((rrddbsize+1) * sizeof(rrddb_t));
+ ovector = pcre2_match_data_create(30, NULL);
while ((d = readdir(dir)) != NULL) {
char *ext;
char param[PATH_MAX];
+ PCRE2_SIZE l = sizeof(param);
/* Ignore dot-files and files with names shorter than ".rrd" */
if (*(d->d_name) == '.') continue;
@@ -996,14 +1002,14 @@ void generate_graph(char *gdeffn, char *
/* First check the exclude pattern. */
if (expat) {
- result = pcre_exec(expat, NULL, d->d_name, strlen(d->d_name), 0, 0,
- ovector, (sizeof(ovector)/sizeof(int)));
+ result = pcre2_match(expat, d->d_name, strlen(d->d_name), 0, 0,
+ ovector, NULL);
if (result >= 0) continue;
}
/* Then see if the include pattern matches. */
- result = pcre_exec(pat, NULL, d->d_name, strlen(d->d_name), 0, 0,
- ovector, (sizeof(ovector)/sizeof(int)));
+ result = pcre2_match(pat, d->d_name, strlen(d->d_name), 0, 0,
+ ovector, NULL);
if (result < 0) continue;
if (wantsingle) {
@@ -1021,7 +1027,7 @@ void generate_graph(char *gdeffn, char *
/* We have a matching file! */
rrddbs[rrddbcount].rrdfn = strdup(d->d_name);
- if (pcre_copy_substring(d->d_name, ovector, result, 1, param, sizeof(param)) > 0) {
+ if (pcre2_substring_copy_bynumber(ovector, 1, param, &l) == 0) {
/*
* This is ugly, but I cannot find a pretty way of un-mangling
* the disk- and http-data that has been molested by the back-end.
@@ -1059,8 +1065,9 @@ void generate_graph(char *gdeffn, char *
rrddbs = (rrddb_t *)realloc(rrddbs, (rrddbsize+1) * sizeof(rrddb_t));
}
}
- pcre_free(pat);
- if (expat) pcre_free(expat);
+ pcre2_code_free(pat);
+ if (expat) pcre2_code_free(expat);
+ pcre2_match_data_free(ovector);
closedir(dir);
}
rrddbs[rrddbcount].key = rrddbs[rrddbcount].rrdfn = rrddbs[rrddbcount].rrdparam = NULL;
--- a/xymond/client_config.c
+++ b/xymond/client_config.c
@@ -28,14 +28,15 @@ static char rcsid[] = "$Id: client_confi
#include <limits.h>
#include <errno.h>
-#include <pcre.h>
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include <pcre2.h>
#include "libxymon.h"
#include "client_config.h"
typedef struct exprlist_t {
char *pattern;
- pcre *exp;
+ pcre2_code *exp;
struct exprlist_t *next;
} exprlist_t;
@@ -592,7 +593,7 @@ int load_client_config(char *configfn)
exprlist_t *tmp = exprhead;
exprhead = exprhead->next;
if (tmp->pattern) xfree(tmp->pattern);
- if (tmp->exp) pcre_free(tmp->exp);
+ if (tmp->exp) pcre2_code_free(tmp->exp);
xfree(tmp);
}
exprhead = NULL;
--- a/xymond/do_rrd.c
+++ b/xymond/do_rrd.c
@@ -23,7 +23,8 @@ static char rcsid[] = "$Id: do_rrd.c 760
#include <utime.h>
#include <rrd.h>
-#include <pcre.h>
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include <pcre2.h>
#include "libxymon.h"
--- a/xymond/rrd/do_netstat.c
+++ b/xymond/rrd/do_netstat.c
@@ -65,7 +65,7 @@ static void prepare_update(char *outp)
outp += sprintf(outp, ":%s", (tcpretranspackets ? tcpretranspackets : "U")); if (tcpretranspackets) xfree(tcpretranspackets);
}
-static int handle_pcre_netstat(char *msg, pcre **pcreset, char *outp)
+static int handle_pcre_netstat(char *msg, pcre2_code **pcreset, char *outp)
{
enum { AT_NONE, AT_TCP, AT_UDP } sect = AT_NONE;
int havedata = 0;
@@ -432,12 +432,12 @@ static int do_valbeforemarker(char *layo
int do_netstat_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp)
{
static int pcres_compiled = 0;
- static pcre **netstat_osf_pcres = NULL;
- static pcre **netstat_aix_pcres = NULL;
- static pcre **netstat_irix_pcres = NULL;
- static pcre **netstat_hpux_pcres = NULL;
- static pcre **netstat_bsd_pcres = NULL;
- static pcre **netstat_sco_sv_pcres = NULL;
+ static pcre2_code **netstat_osf_pcres = NULL;
+ static pcre2_code **netstat_aix_pcres = NULL;
+ static pcre2_code **netstat_irix_pcres = NULL;
+ static pcre2_code **netstat_hpux_pcres = NULL;
+ static pcre2_code **netstat_bsd_pcres = NULL;
+ static pcre2_code **netstat_sco_sv_pcres = NULL;
enum ostype_t ostype;
char *datapart = msg;
--- a/xymond/xymon-mailack.c
+++ b/xymond/xymon-mailack.c
@@ -17,7 +17,8 @@ static char rcsid[] = "$Id: xymon-mailac
#include <ctype.h>
#include <stdio.h>
#include <string.h>
-#include <pcre.h>
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include <pcre2.h>
#include "libxymon.h"
@@ -31,11 +32,12 @@ int main(int argc, char *argv[])
char *firsttxtline = NULL;
int inheaders = 1;
char *p;
- pcre *subjexp;
- const char *errmsg;
- int errofs, result;
- int ovector[30];
+ pcre2_code *subjexp;
+ int err, result;
+ PCRE2_SIZE errofs;
+ pcre2_match_data *ovector;
char cookie[10];
+ PCRE2_SIZE l = sizeof(cookie);
int duration = 0;
int argi;
char *envarea = NULL;
@@ -96,51 +98,58 @@ int main(int argc, char *argv[])
}
/* Get the alert cookie */
- subjexp = pcre_compile(".*(Xymon|Hobbit|BB)[ -]* \\[*(-*[0-9]+)[\\]!]*", PCRE_CASELESS, &errmsg, &errofs, NULL);
+ subjexp = pcre2_compile(".*(Xymon|Hobbit|BB)[ -]* \\[*(-*[0-9]+)[\\]!]*", PCRE2_ZERO_TERMINATED, PCRE2_CASELESS, &err, &errofs, NULL);
if (subjexp == NULL) {
dbgprintf("pcre compile failed - 1\n");
return 2;
}
- result = pcre_exec(subjexp, NULL, subjectline, strlen(subjectline), 0, 0, ovector, (sizeof(ovector)/sizeof(int)));
+ ovector = pcre2_match_data_create(30, NULL);
+ result = pcre2_match(subjexp, subjectline, strlen(subjectline), 0, 0, ovector, NULL);
if (result < 0) {
+ pcre2_match_data_free(ovector);
dbgprintf("Subject line did not match pattern\n");
return 3; /* Subject did not match what we expected */
}
- if (pcre_copy_substring(subjectline, ovector, result, 2, cookie, sizeof(cookie)) <= 0) {
+ if (pcre2_substring_copy_bynumber(ovector, 2, cookie, &l) <= 0) {
+ pcre2_match_data_free(ovector);
dbgprintf("Could not find cookie value\n");
return 4; /* No cookie */
}
- pcre_free(subjexp);
+ pcre2_code_free(subjexp);
/* See if there's a "DELAY=" delay-value also */
- subjexp = pcre_compile(".*DELAY[ =]+([0-9]+[mhdw]*)", PCRE_CASELESS, &errmsg, &errofs, NULL);
+ subjexp = pcre2_compile(".*DELAY[ =]+([0-9]+[mhdw]*)", PCRE2_ZERO_TERMINATED, PCRE2_CASELESS, &err, &errofs, NULL);
if (subjexp == NULL) {
+ pcre2_match_data_free(ovector);
dbgprintf("pcre compile failed - 2\n");
return 2;
}
- result = pcre_exec(subjexp, NULL, subjectline, strlen(subjectline), 0, 0, ovector, (sizeof(ovector)/sizeof(int)));
+ result = pcre2_match(subjexp, subjectline, strlen(subjectline), 0, 0, ovector, NULL);
if (result >= 0) {
char delaytxt[4096];
- if (pcre_copy_substring(subjectline, ovector, result, 1, delaytxt, sizeof(delaytxt)) > 0) {
+ l = sizeof(delaytxt);
+ if (pcre2_substring_copy_bynumber(ovector, 1, delaytxt, &l) == 0) {
duration = durationvalue(delaytxt);
}
}
- pcre_free(subjexp);
+ pcre2_code_free(subjexp);
/* See if there's a "msg" text also */
- subjexp = pcre_compile(".*MSG[ =]+(.*)", PCRE_CASELESS, &errmsg, &errofs, NULL);
+ subjexp = pcre2_compile(".*MSG[ =]+(.*)", PCRE2_ZERO_TERMINATED, PCRE2_CASELESS, &err, &errofs, NULL);
if (subjexp == NULL) {
+ pcre2_match_data_free(ovector);
dbgprintf("pcre compile failed - 3\n");
return 2;
}
- result = pcre_exec(subjexp, NULL, subjectline, strlen(subjectline), 0, 0, ovector, (sizeof(ovector)/sizeof(int)));
+ result = pcre2_match(subjexp, subjectline, strlen(subjectline), 0, 0, ovector, NULL);
if (result >= 0) {
char msgtxt[4096];
- if (pcre_copy_substring(subjectline, ovector, result, 1, msgtxt, sizeof(msgtxt)) > 0) {
+ l = sizeof(msgtxt);
+ if (pcre2_substring_copy_bynumber(ovector, 1, msgtxt, &l) == 0) {
firsttxtline = strdup(msgtxt);
}
}
- pcre_free(subjexp);
+ pcre2_code_free(subjexp);
/* Use the "return-path:" header if we didn't see a From: line */
if ((fromline == NULL) && returnpathline) fromline = returnpathline;
--- a/xymond/xymond_capture.c
+++ b/xymond/xymond_capture.c
@@ -34,13 +34,14 @@ int main(int argc, char *argv[])
int running;
int argi, seq;
struct timespec *timeout = NULL;
- pcre *hostexp = NULL;
- pcre *exhostexp = NULL;
- pcre *testexp = NULL;
- pcre *extestexp = NULL;
- pcre *colorexp = NULL;
- const char *errmsg = NULL;
- int errofs = 0;
+ pcre2_code *hostexp = NULL;
+ pcre2_code *exhostexp = NULL;
+ pcre2_code *testexp = NULL;
+ pcre2_code *extestexp = NULL;
+ pcre2_code *colorexp = NULL;
+ pcre2_match_data *ovector;
+ int err;
+ PCRE2_SIZE errofs;
FILE *logfd = stdout;
int batchtimeout = 30;
char *batchcmd = NULL;
@@ -75,27 +76,27 @@ int main(int argc, char *argv[])
}
else if (argnmatch(argv[argi], "--hosts=")) {
char *exp = strchr(argv[argi], '=') + 1;
- hostexp = pcre_compile(exp, PCRE_CASELESS, &errmsg, &errofs, NULL);
+ hostexp = pcre2_compile(exp, strlen(exp), PCRE2_CASELESS, &err, &errofs, NULL);
if (hostexp == NULL) printf("Invalid expression '%s'\n", exp);
}
else if (argnmatch(argv[argi], "--exhosts=")) {
char *exp = strchr(argv[argi], '=') + 1;
- exhostexp = pcre_compile(exp, PCRE_CASELESS, &errmsg, &errofs, NULL);
+ exhostexp = pcre2_compile(exp, strlen(exp), PCRE2_CASELESS, &err, &errofs, NULL);
if (exhostexp == NULL) printf("Invalid expression '%s'\n", exp);
}
else if (argnmatch(argv[argi], "--tests=")) {
char *exp = strchr(argv[argi], '=') + 1;
- testexp = pcre_compile(exp, PCRE_CASELESS, &errmsg, &errofs, NULL);
+ testexp = pcre2_compile(exp, strlen(exp), PCRE2_CASELESS, &err, &errofs, NULL);
if (testexp == NULL) printf("Invalid expression '%s'\n", exp);
}
else if (argnmatch(argv[argi], "--extests=")) {
char *exp = strchr(argv[argi], '=') + 1;
- extestexp = pcre_compile(exp, PCRE_CASELESS, &errmsg, &errofs, NULL);
+ extestexp = pcre2_compile(exp, strlen(exp), PCRE2_CASELESS, &err, &errofs, NULL);
if (extestexp == NULL) printf("Invalid expression '%s'\n", exp);
}
else if (argnmatch(argv[argi], "--colors=")) {
char *exp = strchr(argv[argi], '=') + 1;
- colorexp = pcre_compile(exp, PCRE_CASELESS, &errmsg, &errofs, NULL);
+ colorexp = pcre2_compile(exp, strlen(exp), PCRE2_CASELESS, &err, &errofs, NULL);
if (colorexp == NULL) printf("Invalid expression '%s'\n", exp);
}
else if (argnmatch(argv[argi], "--outfile=")) {
@@ -127,6 +128,7 @@ int main(int argc, char *argv[])
signal(SIGCHLD, SIG_IGN);
+ ovector = pcre2_match_data_create(30, NULL);
running = 1;
while (running) {
char *eoln, *restofmsg, *p;
@@ -245,7 +247,6 @@ int main(int argc, char *argv[])
* Process this message.
*/
else {
- int ovector[30];
int match, i;
char *hostname = metadata[hostnameitem];
char *testname = metadata[testnameitem];
@@ -298,23 +299,23 @@ int main(int argc, char *argv[])
if (hostexp) {
- match = (pcre_exec(hostexp, NULL, hostname, strlen(hostname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0);
+ match = (pcre2_match(hostexp, hostname, strlen(hostname), 0, 0, ovector, NULL) >= 0);
if (!match) continue;
}
if (exhostexp) {
- match = (pcre_exec(exhostexp, NULL, hostname, strlen(hostname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0);
+ match = (pcre2_match(exhostexp, hostname, strlen(hostname), 0, 0, ovector, NULL) >= 0);
if (match) continue;
}
if (testexp) {
- match = (pcre_exec(testexp, NULL, testname, strlen(testname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0);
+ match = (pcre2_match(testexp, testname, strlen(testname), 0, 0, ovector, NULL) >= 0);
if (!match) continue;
}
if (extestexp) {
- match = (pcre_exec(extestexp, NULL, testname, strlen(testname), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0);
+ match = (pcre2_match(extestexp, testname, strlen(testname), 0, 0, ovector, NULL) >= 0);
if (match) continue;
}
if (colorexp) {
- match = (pcre_exec(colorexp, NULL, color, strlen(color), 0, 0, ovector, (sizeof(ovector)/sizeof(int))) >= 0);
+ match = (pcre2_match(colorexp, color, strlen(color), 0, 0, ovector, NULL) >= 0);
if (!match) continue;
}
@@ -338,6 +339,7 @@ int main(int argc, char *argv[])
}
}
}
+ pcre2_match_data_free(ovector);
return 0;
}
--- a/build/test-pcre.c
+++ b/build/test-pcre.c
@@ -1,11 +1,12 @@
-#include <pcre.h>
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include <pcre2.h>
int main(int argc, char *argv[])
{
- pcre *result;
- const char *errmsg;
- int errofs;
- result = pcre_compile("xymon.*", PCRE_CASELESS, &errmsg, &errofs, NULL);
+ pcre2_code *result;
+ int err;
+ PCRE2_SIZE errofs;
+ result = pcre2_compile("xymon.*", PCRE2_ZERO_TERMINATED, PCRE2_CASELESS, &err, &errofs, NULL);
return 0;
}
--- a/build/Makefile.test-pcre
+++ b/build/Makefile.test-pcre
@@ -4,7 +4,7 @@ test-compile:
@$(CC) $(CFLAGS) $(PCREINC) -o test-pcre.o -c test-pcre.c
test-link:
- @$(CC) $(CFLAGS) $(PCRELIB) -o test-pcre test-pcre.o -lpcre
+ @$(CC) $(CFLAGS) $(PCRELIB) -o test-pcre test-pcre.o -lpcre2-8
clean:
@rm -f test-pcre.o test-pcre
--- a/lib/loadalerts.h
+++ b/lib/loadalerts.h
@@ -16,7 +16,8 @@
/* The clients probably don't have the pcre headers */
#if defined(LOCALCLIENT) || !defined(CLIENTONLY)
-#include <pcre.h>
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include <pcre2.h>
typedef enum { A_PAGING, A_NORECIP, A_ACKED, A_RECOVERED, A_DISABLED, A_NOTIFY, A_DEAD } astate_t;
@@ -50,29 +51,29 @@ typedef struct criteria_t {
int cfid;
char *cfline;
char *pagespec; /* Pages to include */
- pcre *pagespecre;
+ pcre2_code *pagespecre;
char *expagespec; /* Pages to exclude */
- pcre *expagespecre;
+ pcre2_code *expagespecre;
char *dgspec; /* Display groups to include */
- pcre *dgspecre;
+ pcre2_code *dgspecre;
char *exdgspec; /* Display groups to exclude */
- pcre *exdgspecre;
+ pcre2_code *exdgspecre;
char *hostspec; /* Hosts to include */
- pcre *hostspecre;
+ pcre2_code *hostspecre;
char *exhostspec; /* Hosts to exclude */
- pcre *exhostspecre;
+ pcre2_code *exhostspecre;
char *svcspec; /* Services to include */
- pcre *svcspecre;
+ pcre2_code *svcspecre;
char *exsvcspec; /* Services to exclude */
- pcre *exsvcspecre;
+ pcre2_code *exsvcspecre;
char *classspec;
- pcre *classspecre;
+ pcre2_code *classspecre;
char *exclassspec;
- pcre *exclassspecre;
+ pcre2_code *exclassspecre;
char *groupspec;
- pcre *groupspecre;
+ pcre2_code *groupspecre;
char *exgroupspec;
- pcre *exgroupspecre;
+ pcre2_code *exgroupspecre;
int colors;
char *timespec;
char *extimespec;
--- a/lib/clientlocal.c
+++ b/lib/clientlocal.c
@@ -16,11 +16,13 @@ static char rcsid[] = "$Id: clientlocal.
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include <pcre2.h>
#include "libxymon.h"
typedef struct clientconfig_t {
- pcre *hostptn, *classptn, *osptn;
+ pcre2_code *hostptn, *classptn, *osptn;
strbuffer_t *config;
struct clientconfig_t *next;
} clientconfig_t;
@@ -117,7 +119,7 @@ void load_clientconfig(void)
if (!insection) {
if (*STRBUF(buf) == '[') {
- pcre *hostptn = NULL, *classptn = NULL, *osptn = NULL;
+ pcre2_code *hostptn = NULL, *classptn = NULL, *osptn = NULL;
clientconfig_t *newrec;
p = STRBUF(buf) + strcspn(STRBUF(buf), "\r\n");
--- a/configure.server
+++ b/configure.server
@@ -470,10 +470,10 @@ then
echo "PCREINCDIR = -I$PCREINC" >>Makefile
fi
if test "$PCRELIB" != ""; then
- echo "PCRELIBS = -L$PCRELIB -lpcre" >>Makefile
+ echo "PCRELIBS = -L$PCRELIB -lpcre2-8" >>Makefile
echo "RPATHVAL += ${PCRELIB}" >>Makefile
else
- echo "PCRELIBS = -lpcre" >>Makefile
+ echo "PCRELIBS = -lpcre2-8" >>Makefile
fi
fi
echo "" >>Makefile
--- a/xymonnet/httpresult.c
+++ b/xymonnet/httpresult.c
@@ -80,7 +80,7 @@ static int statuscolor_by_set(testedhost
{
int result = -1;
char codestr[15];
- pcre *ptn;
+ pcre2_code *ptn;
/* Use code 999 to indicate we could not fetch the URL */
snprintf(codestr, sizeof(codestr), "%d", (status ? status : 999));
--- a/xymonnet/beastat.c
+++ b/xymonnet/beastat.c
@@ -22,8 +22,6 @@ static char rcsid[] = "$Id: beastat.c 80
#include <sys/types.h>
#include <sys/stat.h>
-#include <pcre.h>
-
#include "libxymon.h"
#include "version.h"
--- a/xymond/xymond.c
+++ b/xymond/xymond.c
@@ -361,7 +361,7 @@ enum filtertype_t { FILTER_XMH, FILTER_P
typedef struct hostfilter_rec_t {
enum filtertype_t filtertype;
- pcre *wantedptn; int wantedvalue;
+ pcre2_code *wantedptn; int wantedvalue;
struct hostfilter_rec_t *next;
enum xmh_item_t field; /* Only for filtertype == FILTER_XMH */
enum boardfield_t boardfield; /* Only for filtertype == FILTER_FIELD(TIME) */
@@ -2870,7 +2870,7 @@ hostfilter_rec_t *setup_filter(char *buf
{
char *tok;
hostfilter_rec_t *filterhead = NULL, *filtertail = NULL;
- static pcre *xmhptn = NULL;
+ static pcre2_code *xmhptn = NULL;
dbgprintf("-> setup_filter: %s\n", buf);
--- a/xymond/xymond_channel.c
+++ b/xymond/xymond_channel.c
@@ -426,8 +426,8 @@ int main(int argc, char *argv[])
char *pidfile = NULL;
char *envarea = NULL;
int cnid = -1;
- pcre *msgfilter = NULL;
- pcre *stdfilter = NULL;
+ pcre2_code *msgfilter = NULL;
+ pcre2_code *stdfilter = NULL;
int argi;
struct sigaction sa;
--- a/xymond/do_alert.c
+++ b/xymond/do_alert.c
@@ -27,8 +27,6 @@ static char rcsid[] = "$Id: do_alert.c 7
#include <errno.h>
#include <sys/wait.h>
-#include <pcre.h>
-
#include "libxymon.h"
/*
--- a/xymond/client/irix.c
+++ b/xymond/client/irix.c
@@ -16,7 +16,7 @@ void handle_irix_client(char *hostname,
void *hinfo, char *sender, time_t timestamp,
char *clientdata)
{
- static pcre *memptn = NULL;
+ static pcre2_code *memptn = NULL;
char *timestr;
char *uptimestr;
char *clockstr;
@@ -69,8 +69,9 @@ void handle_irix_client(char *hostname,
if (topstr) {
char *memline, *eoln = NULL;
int res;
- int ovector[20];
+ pcre2_match_data *ovector;
char w[20];
+ PCRE2_SIZE l;
long memphystotal = -1, memphysused = -1, memphysfree = 0,
memacttotal = -1, memactused = -1, memactfree = -1,
memswaptotal = -1, memswapused = -1, memswapfree = 0;
@@ -79,40 +80,47 @@ void handle_irix_client(char *hostname,
memptn = compileregex("^Memory: (\\d+)M max, (\\d+)M avail, (\\d+)M free, (\\d+)M swap, (\\d+)M free swap");
}
+ ovector = pcre2_match_data_create(20, NULL);
memline = strstr(topstr, "\nMemory:");
if (memline) {
memline++;
eoln = strchr(memline, '\n'); if (eoln) *eoln = '\0';
- res = pcre_exec(memptn, NULL, memline, strlen(memline), 0, 0, ovector, (sizeof(ovector)/sizeof(int)));
+ res = pcre2_match(memptn, memline, strlen(memline), 0, 0, ovector, NULL);
}
else res = -1;
if (res > 1) {
- pcre_copy_substring(memline, ovector, res, 1, w, sizeof(w));
+ l = sizeof(w);
+ pcre2_substring_copy_bynumber(ovector, 1, w, &l);
memphystotal = atol(w);
}
if (res > 2) {
- pcre_copy_substring(memline, ovector, res, 2, w, sizeof(w));
+ l = sizeof(w);
+ pcre2_substring_copy_bynumber(ovector, 2, w, &l);
memactfree = atol(w);
memacttotal = memphystotal;
memactused = memphystotal - memactfree;
}
if (res > 3) {
- pcre_copy_substring(memline, ovector, res, 3, w, sizeof(w));
+ l = sizeof(w);
+ pcre2_substring_copy_bynumber(ovector, 3, w, &l);
memphysfree = atol(w);
memphysused = memphystotal - memphysfree;
}
if (res > 4) {
- pcre_copy_substring(memline, ovector, res, 4, w, sizeof(w));
+ l = sizeof(w);
+ pcre2_substring_copy_bynumber(ovector, 4, w, &l);
memswaptotal = atol(w);
}
if (res > 5) {
- pcre_copy_substring(memline, ovector, res, 5, w, sizeof(w));
+ l = sizeof(w);
+ pcre2_substring_copy_bynumber(ovector, 5, w, &l);
memswapfree = atol(w);
}
memswapused = memswaptotal - memswapfree;
+ pcre2_match_data_free(ovector);
if (eoln) *eoln = '\n';
--- a/xymond/rrd/do_ifstat.c
+++ b/xymond/rrd/do_ifstat.c
@@ -120,17 +120,17 @@ static const char *ifstat_bbwin_exprs[]
int do_ifstat_rrd(char *hostname, char *testname, char *classname, char *pagepaths, char *msg, time_t tstamp)
{
static int pcres_compiled = 0;
- static pcre **ifstat_linux_pcres = NULL;
- static pcre **ifstat_freebsd_pcres = NULL;
- static pcre **ifstat_freebsdV8_pcres = NULL;
- static pcre **ifstat_openbsd_pcres = NULL;
- static pcre **ifstat_netbsd_pcres = NULL;
- static pcre **ifstat_darwin_pcres = NULL;
- static pcre **ifstat_solaris_pcres = NULL;
- static pcre **ifstat_aix_pcres = NULL;
- static pcre **ifstat_hpux_pcres = NULL;
- static pcre **ifstat_sco_sv_pcres = NULL;
- static pcre **ifstat_bbwin_pcres = NULL;
+ static pcre2_code **ifstat_linux_pcres = NULL;
+ static pcre2_code **ifstat_freebsd_pcres = NULL;
+ static pcre2_code **ifstat_freebsdV8_pcres = NULL;
+ static pcre2_code **ifstat_openbsd_pcres = NULL;
+ static pcre2_code **ifstat_netbsd_pcres = NULL;
+ static pcre2_code **ifstat_darwin_pcres = NULL;
+ static pcre2_code **ifstat_solaris_pcres = NULL;
+ static pcre2_code **ifstat_aix_pcres = NULL;
+ static pcre2_code **ifstat_hpux_pcres = NULL;
+ static pcre2_code **ifstat_sco_sv_pcres = NULL;
+ static pcre2_code **ifstat_bbwin_pcres = NULL;
enum ostype_t ostype;
char *datapart = msg;
@@ -138,7 +138,7 @@ int do_ifstat_rrd(char *hostname, char *
int dmatch;
void *xmh;
- pcre *ifname_filter_pcre = NULL;
+ pcre2_code *ifname_filter_pcre = NULL;
xmh = hostinfo(hostname);
if (xmh) {
--- a/xymond/rrd/do_dbcheck.c
+++ b/xymond/rrd/do_dbcheck.c
@@ -223,28 +223,36 @@ int do_dbcheck_tablespace_rrd(char *host
char *eoln, *curline;
static int ptnsetup = 0;
- static pcre *inclpattern = NULL;
- static pcre *exclpattern = NULL;
+ static pcre2_code *inclpattern = NULL;
+ static pcre2_code *exclpattern = NULL;
+ pcre2_match_data *ovector;
if (tablespace_tpl == NULL) tablespace_tpl = setup_template(tablespace_params);
if (!ptnsetup) {
- const char *errmsg;
- int errofs;
+ char errmsg[120];
+ int err;
+ PCRE2_SIZE errofs;
char *ptn;
ptnsetup = 1;
ptn = getenv("RRDDISKS");
if (ptn && strlen(ptn)) {
- inclpattern = pcre_compile(ptn, PCRE_CASELESS, &errmsg, &errofs, NULL);
- if (!inclpattern) errprintf("PCRE compile of RRDDISKS='%s' failed, error %s, offset %d\n",
+ inclpattern = pcre2_compile(ptn, strlen(ptn), PCRE2_CASELESS, &err, &errofs, NULL);
+ if (!inclpattern) {
+ pcre2_get_error_message(err, errmsg, sizeof(errmsg));
+ errprintf("PCRE compile of RRDDISKS='%s' failed, error %s, offset %zu\n",
ptn, errmsg, errofs);
+ }
}
ptn = getenv("NORRDDISKS");
if (ptn && strlen(ptn)) {
- exclpattern = pcre_compile(ptn, PCRE_CASELESS, &errmsg, &errofs, NULL);
- if (!exclpattern) errprintf("PCRE compile of NORRDDISKS='%s' failed, error %s, offset %d\n",
+ exclpattern = pcre2_compile(ptn, strlen(ptn), PCRE2_CASELESS, &err, &errofs, NULL);
+ if (!exclpattern) {
+ pcre2_get_error_message(err, errmsg, sizeof(errmsg));
+ errprintf("PCRE compile of NORRDDISKS='%s' failed, error %s, offset %zu\n",
ptn, errmsg, errofs);
+ }
}
}
@@ -261,6 +269,7 @@ int do_dbcheck_tablespace_rrd(char *host
eoln = strchr(curline, '\n');
curline = (eoln ? (eoln+1) : NULL);
}
+ ovector = pcre2_match_data_create(30, NULL);
while (curline) {
char *fsline, *p;
@@ -307,20 +316,18 @@ int do_dbcheck_tablespace_rrd(char *host
/* Check include/exclude patterns */
wanteddisk = 1;
if (exclpattern) {
- int ovector[30];
int result;
- result = pcre_exec(exclpattern, NULL, diskname, strlen(diskname),
- 0, 0, ovector, (sizeof(ovector)/sizeof(int)));
+ result = pcre2_match(exclpattern, diskname, strlen(diskname),
+ 0, 0, ovector, NULL);
wanteddisk = (result < 0);
}
if (wanteddisk && inclpattern) {
- int ovector[30];
int result;
- result = pcre_exec(inclpattern, NULL, diskname, strlen(diskname),
- 0, 0, ovector, (sizeof(ovector)/sizeof(int)));
+ result = pcre2_match(inclpattern, diskname, strlen(diskname),
+ 0, 0, ovector, NULL);
wanteddisk = (result >= 0);
}
@@ -350,6 +357,7 @@ int do_dbcheck_tablespace_rrd(char *host
nextline:
curline = (eoln ? (eoln+1) : NULL);
}
+ pcre2_match_data_free(ovector);
return 0;
}
--- a/xymond/rrd/do_devmon.c
+++ b/xymond/rrd/do_devmon.c
@@ -18,8 +18,8 @@ int do_devmon_rrd(char *hostname, char *
char *eoln, *curline;
static int ptnsetup = 0;
- static pcre *inclpattern = NULL;
- static pcre *exclpattern = NULL;
+ static pcre2_code *inclpattern = NULL;
+ static pcre2_code *exclpattern = NULL;
int in_devmon = 1;
int numds = 0;
char *rrdbasename;
--- a/xymond/rrd/do_disk.c
+++ b/xymond/rrd/do_disk.c
@@ -18,8 +18,9 @@ int do_disk_rrd(char *hostname, char *te
enum { DT_IRIX, DT_AS400, DT_NT, DT_UNIX, DT_NETAPP, DT_NETWARE, DT_BBWIN } dsystype;
char *eoln, *curline;
static int ptnsetup = 0;
- static pcre *inclpattern = NULL;
- static pcre *exclpattern = NULL;
+ static pcre2_code *inclpattern = NULL;
+ static pcre2_code *exclpattern = NULL;
+ pcre2_match_data *ovector;
int seen_root_fs = 0;
if (strstr(msg, "netapp.pl")) return do_netapp_disk_rrd(hostname, testname, classname, pagepaths, msg, tstamp);
@@ -28,22 +29,29 @@ int do_disk_rrd(char *hostname, char *te
if (disk_tpl == NULL) disk_tpl = setup_template(disk_params);
if (!ptnsetup) {
- const char *errmsg;
- int errofs;
+ char errmsg[120];
+ int err;
+ PCRE2_SIZE errofs;
char *ptn;
ptnsetup = 1;
ptn = getenv("RRDDISKS");
if (ptn && strlen(ptn)) {
- inclpattern = pcre_compile(ptn, PCRE_CASELESS, &errmsg, &errofs, NULL);
- if (!inclpattern) errprintf("PCRE compile of RRDDISKS='%s' failed, error %s, offset %d\n",
+ inclpattern = pcre2_compile(ptn, strlen(ptn), PCRE2_CASELESS, &err, &errofs, NULL);
+ if (!inclpattern) {
+ pcre2_get_error_message(err, errmsg, sizeof(errmsg));
+ errprintf("PCRE compile of RRDDISKS='%s' failed, error %s, offset %zu\n",
ptn, errmsg, errofs);
+ }
}
ptn = getenv("NORRDDISKS");
if (ptn && strlen(ptn)) {
- exclpattern = pcre_compile(ptn, PCRE_CASELESS, &errmsg, &errofs, NULL);
- if (!exclpattern) errprintf("PCRE compile of NORRDDISKS='%s' failed, error %s, offset %d\n",
+ exclpattern = pcre2_compile(ptn, strlen(ptn), PCRE2_CASELESS, &err, &errofs, NULL);
+ if (!exclpattern) {
+ pcre2_get_error_message(err, errmsg, sizeof(errmsg));
+ errprintf("PCRE compile of NORRDDISKS='%s' failed, error %s, offset %zu\n",
ptn, errmsg, errofs);
+ }
}
}
@@ -72,6 +80,7 @@ int do_disk_rrd(char *hostname, char *te
* line - we never have any disk reports there anyway.
*/
curline = strchr(msg, '\n'); if (curline) curline++;
+ ovector = pcre2_match_data_create(30, NULL);
while (curline) {
char *fsline, *p;
char *columns[20];
@@ -178,20 +187,18 @@ int do_disk_rrd(char *hostname, char *te
seen_root_fs = 1;
}
if (exclpattern) {
- int ovector[30];
int result;
- result = pcre_exec(exclpattern, NULL, diskname, strlen(diskname),
- 0, 0, ovector, (sizeof(ovector)/sizeof(int)));
+ result = pcre2_match(exclpattern, diskname, strlen(diskname),
+ 0, 0, ovector, NULL);
wanteddisk = (result < 0);
}
if (wanteddisk && inclpattern) {
- int ovector[30];
int result;
- result = pcre_exec(inclpattern, NULL, diskname, strlen(diskname),
- 0, 0, ovector, (sizeof(ovector)/sizeof(int)));
+ result = pcre2_match(inclpattern, diskname, strlen(diskname),
+ 0, 0, ovector, NULL);
wanteddisk = (result >= 0);
}
@@ -221,6 +228,7 @@ int do_disk_rrd(char *hostname, char *te
nextline:
curline = (eoln ? (eoln+1) : NULL);
}
+ pcre2_match_data_free(ovector);
return 0;
}
--- a/xymond/rrd/do_la.c
+++ b/xymond/rrd/do_la.c
@@ -17,8 +17,8 @@ int do_la_rrd(char *hostname, char *test
static char *clock_params[] = { "DS:la:GAUGE:600:U:U", NULL }; /* "la" is a misnomer, but to stay compatiable with existing RRD files */
static void *clock_tpl = NULL;
- static pcre *as400_exp = NULL;
- static pcre *zVM_exp = NULL;
+ static pcre2_code *as400_exp = NULL;
+ static pcre2_code *zVM_exp = NULL;
static time_t starttime = 0;
char *p, *eoln = NULL;
@@ -66,25 +66,28 @@ int do_la_rrd(char *hostname, char *test
* the operating system name is part of the message (as in the tests above).
*/
- int ovector[30];
+ pcre2_match_data *ovector;
char w[100];
+ PCRE2_SIZE l = sizeof(w);
int res;
if (zVM_exp == NULL) {
- const char *errmsg = NULL;
- int errofs = 0;
+ int err;
+ PCRE2_SIZE errofs;
- zVM_exp = pcre_compile(".* CPU Utilization *([0-9]+)%", PCRE_CASELESS, &errmsg, &errofs, NULL);
+ zVM_exp = pcre2_compile(".* CPU Utilization *([0-9]+)%", PCRE2_ZERO_TERMINATED, PCRE2_CASELESS, &err, &errofs, NULL);
}
- res = pcre_exec(zVM_exp, NULL, msg, strlen(msg), 0, 0, ovector, (sizeof(ovector)/sizeof(int)));
+ ovector = pcre2_match_data_create(30, NULL);
+ res = pcre2_match(zVM_exp, msg, strlen(msg), 0, 0, ovector, NULL);
if (res >= 0) {
/* We have a match - pick up the data. */
- *w = '\0'; if (res > 0) pcre_copy_substring(msg, ovector, res, 1, w, sizeof(w));
+ *w = '\0'; if (res > 0) pcre2_substring_copy_bynumber(ovector, 1, w, &l);
if (strlen(w)) {
load = atoi(w); gotload = 1;
}
}
+ pcre2_match_data_free(ovector);
goto done_parsing;
}
@@ -139,31 +142,34 @@ int do_la_rrd(char *hostname, char *test
* No "uptime" in message - could be from an AS/400. They look like this:
* green March 21, 2005 12:33:24 PM EST deltacdc 108 users 45525 jobs(126 batch,0 waiting for message), load=26%
*/
- int ovector[30];
+ pcre2_match_data *ovector;
char w[100];
+ PCRE2_SIZE l = sizeof(w);
int res;
if (as400_exp == NULL) {
- const char *errmsg = NULL;
- int errofs = 0;
+ int err;
+ PCRE2_SIZE errofs;
- as400_exp = pcre_compile(".* ([0-9]+) users ([0-9]+) jobs.* load=([0-9]+)\\%",
- PCRE_CASELESS, &errmsg, &errofs, NULL);
+ as400_exp = pcre2_compile(".* ([0-9]+) users ([0-9]+) jobs.* load=([0-9]+)\\%",
+ PCRE2_ZERO_TERMINATED, PCRE2_CASELESS, &err, &errofs, NULL);
}
- res = pcre_exec(as400_exp, NULL, msg, strlen(msg), 0, 0, ovector, (sizeof(ovector)/sizeof(int)));
+ ovector = pcre2_match_data_create(30, NULL);
+ res = pcre2_match(as400_exp, msg, strlen(msg), 0, 0, ovector, NULL);
if (res >= 0) {
/* We have a match - pick up the AS/400 data. */
- *w = '\0'; if (res > 0) pcre_copy_substring(msg, ovector, res, 1, w, sizeof(w));
+ *w = '\0'; if (res > 0) pcre2_substring_copy_bynumber(ovector, 1, w, &l);
if (strlen(w)) {
users = atoi(w); gotusers = 1;
}
- *w = '\0'; if (res > 0) pcre_copy_substring(msg, ovector, res, 3, w, sizeof(w));
+ *w = '\0'; l = sizeof(w); if (res > 0) pcre2_substring_copy_bynumber(ovector, 3, w, &l);
if (strlen(w)) {
load = atoi(w); gotload = 1;
}
}
+ pcre2_match_data_free(ovector);
}
done_parsing:
--- a/xymond/rrd/do_netapp.c
+++ b/xymond/rrd/do_netapp.c
@@ -492,8 +492,9 @@ int do_netapp_disk_rrd(char *hostname, c
char *eoln, *curline;
static int ptnsetup = 0;
- static pcre *inclpattern = NULL;
- static pcre *exclpattern = NULL;
+ static pcre2_code *inclpattern = NULL;
+ static pcre2_code *exclpattern = NULL;
+ pcre2_match_data *ovector;
int newdfreport;
newdfreport = (strstr(msg,"netappnewdf") != NULL);
@@ -501,22 +502,29 @@ int do_netapp_disk_rrd(char *hostname, c
if (netapp_disk_tpl == NULL) netapp_disk_tpl = setup_template(netapp_disk_params);
if (!ptnsetup) {
- const char *errmsg;
- int errofs;
+ char errmsg[120];
+ int err;
+ PCRE2_SIZE errofs;
char *ptn;
ptnsetup = 1;
ptn = getenv("RRDDISKS");
if (ptn && strlen(ptn)) {
- inclpattern = pcre_compile(ptn, PCRE_CASELESS, &errmsg, &errofs, NULL);
- if (!inclpattern) errprintf("PCRE compile of RRDDISKS='%s' failed, error %s, offset %d\n",
+ inclpattern = pcre2_compile(ptn, strlen(ptn), PCRE2_CASELESS, &err, &errofs, NULL);
+ if (!inclpattern) {
+ pcre2_get_error_message(err, errmsg, sizeof(errmsg));
+ errprintf("PCRE compile of RRDDISKS='%s' failed, error %s, offset %zu\n",
ptn, errmsg, errofs);
+ }
}
ptn = getenv("NORRDDISKS");
if (ptn && strlen(ptn)) {
- exclpattern = pcre_compile(ptn, PCRE_CASELESS, &errmsg, &errofs, NULL);
- if (!exclpattern) errprintf("PCRE compile of NORRDDISKS='%s' failed, error %s, offset %d\n",
+ exclpattern = pcre2_compile(ptn, strlen(ptn), PCRE2_CASELESS, &err, &errofs, NULL);
+ if (!exclpattern) {
+ pcre2_get_error_message(err, errmsg, sizeof(errmsg));
+ errprintf("PCRE compile of NORRDDISKS='%s' failed, error %s, offset %zu\n",
ptn, errmsg, errofs);
+ }
}
}
@@ -527,6 +535,7 @@ int do_netapp_disk_rrd(char *hostname, c
* line - we never have any disk reports there anyway.
*/
curline = strchr(msg, '\n'); if (curline) curline++;
+ ovector = pcre2_match_data_create(30, NULL);
while (curline) {
char *fsline, *p;
@@ -592,20 +601,18 @@ int do_netapp_disk_rrd(char *hostname, c
/* Check include/exclude patterns */
wanteddisk = 1;
if (exclpattern) {
- int ovector[30];
int result;
- result = pcre_exec(exclpattern, NULL, diskname, strlen(diskname),
- 0, 0, ovector, (sizeof(ovector)/sizeof(int)));
+ result = pcre2_match(exclpattern, diskname, strlen(diskname),
+ 0, 0, ovector, NULL);
wanteddisk = (result < 0);
}
if (wanteddisk && inclpattern) {
- int ovector[30];
int result;
- result = pcre_exec(inclpattern, NULL, diskname, strlen(diskname),
- 0, 0, ovector, (sizeof(ovector)/sizeof(int)));
+ result = pcre2_match(inclpattern, diskname, strlen(diskname),
+ 0, 0, ovector, NULL);
wanteddisk = (result >= 0);
}
@@ -635,6 +642,7 @@ int do_netapp_disk_rrd(char *hostname, c
nextline:
curline = (eoln ? (eoln+1) : NULL);
}
+ pcre2_match_data_free(ovector);
return 0;
}
--- a/web/acknowledge.c
+++ b/web/acknowledge.c
@@ -264,7 +264,7 @@ int main(int argc, char *argv[])
if (obeycookies && !gotfilter && ((hostname = get_cookie("host")) != NULL)) {
if (*hostname) {
- pcre *dummy;
+ pcre2_code *dummy;
SBUF_DEFINE(re);
SBUF_MALLOC(re, 3+strlen(hostname));
@@ -286,7 +286,7 @@ int main(int argc, char *argv[])
if (obeycookies && !gotfilter && ((pagename = get_cookie("pagepath")) != NULL)) {
if (*pagename) {
- pcre *dummy;
+ pcre2_code *dummy;
SBUF_DEFINE(re);
SBUF_MALLOC(re, 8 + strlen(pagename)*2);
--- a/web/svcstatus.c
+++ b/web/svcstatus.c
@@ -359,7 +359,7 @@ int do_request(void)
/* We need not check that hostname is valid, has already been done with loadhostdata() */
if (!complist) {
- pcre *dummy = NULL;
+ pcre2_code *dummy = NULL;
/* Check service as a pcre pattern. And no spaces in servicenames */
if (strchr(service, ' ') == NULL) dummy = compileregex(service);
@@ -373,7 +373,7 @@ int do_request(void)
snprintf(xymondreq, xymondreq_buflen, "xymondlog host=%s test=%s fields=hostname,testname,color,flags,lastchange,logtime,validtime,acktime,disabletime,sender,cookie,ackmsg,dismsg,client,acklist,XMH_IP,XMH_DISPLAYNAME,clntstamp,flapinfo,modifiers", hostname, service);
}
else {
- pcre *dummy = NULL;
+ pcre2_code *dummy = NULL;
SBUF_DEFINE(re);
SBUF_MALLOC(re, 5 + strlen(complist));
--- a/web/confreport.c
+++ b/web/confreport.c
@@ -693,7 +693,7 @@ int main(int argc, char *argv[])
/* Fetch the list of host+test statuses we currently know about */
if (pagepattern) {
- pcre *dummy;
+ pcre2_code *dummy;
SBUF_DEFINE(re);
SBUF_MALLOC(re, 8 + 2*strlen(pagepattern));
@@ -716,7 +716,7 @@ int main(int argc, char *argv[])
xfree(re);
}
else if (hostpattern) {
- pcre *dummy;
+ pcre2_code *dummy;
SBUF_DEFINE(re);
SBUF_MALLOC(re,3 + strlen(hostpattern));
--- a/web/statusreport.c
+++ b/web/statusreport.c
@@ -128,7 +128,7 @@ int main(int argc, char *argv[])
/* Setup the filter we use for the report */
cookie = get_cookie("pagepath");
if (cookie && *cookie) {
- pcre *dummy;
+ pcre2_code *dummy;
SBUF_DEFINE(re);
SBUF_MALLOC(re, 8 + 2*strlen(cookie));
--- a/web/hostlist.c
+++ b/web/hostlist.c
@@ -71,7 +71,7 @@ int main(int argc, char *argv[])
int argi, res;
sendreturn_t *sres;
char *cookie;
- pcre *dummy;
+ pcre2_code *dummy;
init_timestamp();
for (argi=1; (argi < argc); argi++) {
--- a/web/perfdata.c
+++ b/web/perfdata.c
@@ -21,7 +21,8 @@ static char rcsid[] = "$Id: perfdata.c 8
#include <dirent.h>
#include <rrd.h>
-#include <pcre.h>
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include <pcre2.h>
#include "libxymon.h"
@@ -314,7 +315,7 @@ void format_rrdtime(char *t, char **tday
int main(int argc, char **argv)
{
- pcre *hostptn, *exhostptn, *pageptn, *expageptn;
+ pcre2_code *hostptn, *exhostptn, *pageptn, *expageptn;
void *hwalk;
char *hostname, *pagename;