Control: tags -1 + patch Please find a patch attached (I was not able to test all plugins).
>From 1b55bb243cb69c8f1ce006f237187eca7fb47793 Mon Sep 17 00:00:00 2001 From: Yavor Doganov <ya...@gnu.org> Date: Sun, 3 Dec 2023 20:13:33 +0200 Subject: [PATCH] Port to PCRE2 (#1000044)
--- debian/changelog | 7 + debian/control | 2 +- debian/patches/pcre2.patch | 2807 ++++++++++++++++++++++++++++++++++++ debian/patches/series | 1 + 4 files changed, 2816 insertions(+), 1 deletion(-) create mode 100644 debian/patches/pcre2.patch diff --git a/debian/changelog b/debian/changelog index 9e9de97..95eb7a5 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +ccze (0.2.1-8) UNRELEASED; urgency=medium + + * debian/patches/pcre2.patch: New; port to PCRE2 (Closes: #1000044). + * debian/control (Build-Depends): Replace libpcre3-dev with libpcre2-dev. + + -- Yavor Doganov <ya...@gnu.org> Sun, 03 Dec 2023 20:00:06 +0200 + ccze (0.2.1-7) unstable; urgency=medium * Update debian/watch AGAIN with regards to Github changes. diff --git a/debian/control b/debian/control index 895d45e..2b67dd6 100644 --- a/debian/control +++ b/debian/control @@ -5,7 +5,7 @@ Maintainer: Axel Beckert <a...@debian.org> Standards-Version: 4.6.0 Build-Depends: debhelper-compat (= 13), libncurses5-dev, - libpcre3-dev + libpcre2-dev Vcs-Git: https://salsa.debian.org/debian/ccze.git Vcs-Browser: https://salsa.debian.org/debian/ccze Homepage: https://github.com/madhouse/ccze diff --git a/debian/patches/pcre2.patch b/debian/patches/pcre2.patch new file mode 100644 index 0000000..6b60dc8 --- /dev/null +++ b/debian/patches/pcre2.patch @@ -0,0 +1,2807 @@ +Description: Port to PCRE2. +Bug-Debian: https://bugs.debian.org/1000044 +Author: Yavor Doganov <ya...@gnu.org> +Forwarded: no +Last-Update: 2023-12-03 +--- + +--- ccze.orig/configure.ac ++++ ccze/configure.ac +@@ -102,14 +102,14 @@ + AC_CHECK_FUNC(getopt_long, [], [AC_CHECK_LIB(gnugetopt, getopt_long)]) + + if test -z "${PCRE_CONFIG}"; then +- AC_PATH_PROG(PCRE_CONFIG, pcre-config, no) ++ AC_PATH_PROG(PCRE_CONFIG, pcre2-config, no) + fi + AC_MSG_CHECKING(for PCRE) + if test "${PCRE_CONFIG}" = "no"; then + AC_ERROR(PCRE not found) + fi + PCRE_CFLAGS=$($PCRE_CONFIG --cflags) +-PCRE_LIBS=$($PCRE_CONFIG --libs) ++PCRE_LIBS=$($PCRE_CONFIG --libs8) + AC_SUBST(PCRE_CFLAGS) + AC_SUBST(PCRE_LIBS) + AC_MSG_RESULT(found) +--- ccze.orig/src/ccze-wordcolor.c ++++ ccze/src/ccze-wordcolor.c +@@ -29,9 +29,9 @@ + #include "ccze-private.h" + #include "ccze-compat.h" + +-static pcre *reg_pre, *reg_post, *reg_host, *reg_mac, *reg_email; +-static pcre *reg_uri, *reg_size, *reg_ver, *reg_time, *reg_addr; +-static pcre *reg_num, *reg_sig, *reg_email2, *reg_hostip, *reg_msgid; ++static pcre2_code *reg_pre, *reg_post, *reg_host, *reg_mac, *reg_email; ++static pcre2_code *reg_uri, *reg_size, *reg_ver, *reg_time, *reg_addr; ++static pcre2_code *reg_num, *reg_sig, *reg_email2, *reg_hostip, *reg_msgid; + + static char *words_bad[] = { + "warn", "restart", "exit", "stop", "end", "shutting", "down", "close", +@@ -71,33 +71,31 @@ + void + ccze_wordcolor_process_one (char *word, int slookup) + { +- size_t wlen; +- int offsets[99]; ++ size_t wlen, l; + ccze_color_t col; +- int match, printed = 0; ++ int printed = 0; + char *pre = NULL, *post = NULL, *tmp, *lword; ++ pcre2_match_data *offsets; + + col = CCZE_COLOR_DEFAULT; + ++ offsets = pcre2_match_data_create (99, NULL); ++ + /** prefix **/ +- if ((match = pcre_exec (reg_pre, NULL, word, strlen (word), 0, 0, +- offsets, 99)) >= 0) ++ if (pcre2_match (reg_pre, word, strlen (word), 0, 0, offsets, NULL) >= 0) + { +- pcre_get_substring (word, offsets, match, 1, (const char **)&pre); +- pcre_get_substring (word, offsets, match, 2, (const char **)&tmp); +- free (word); ++ pcre2_substring_get_bynumber (offsets, 1, (unsigned char **)&pre, &l); ++ pcre2_substring_get_bynumber (offsets, 2, (unsigned char **)&tmp, &l); + word = tmp; + } + else + pre = NULL; + + /** postfix **/ +- if ((match = pcre_exec (reg_post, NULL, word, strlen (word), 0, 0, +- offsets, 99)) >= 0) ++ if (pcre2_match (reg_post, word, strlen (word), 0, 0, offsets, NULL) >= 0) + { +- pcre_get_substring (word, offsets, match, 1, (const char **)&tmp); +- pcre_get_substring (word, offsets, match, 2, (const char **)&post); +- free (word); ++ pcre2_substring_get_bynumber (offsets, 1, (unsigned char **)&tmp, &l); ++ pcre2_substring_get_bynumber (offsets, 2, (unsigned char **)&post, &l); + word = tmp; + } + else +@@ -107,45 +105,45 @@ + lword = _stolower (word); + + /** Host **/ +- if (pcre_exec (reg_host, NULL, lword, wlen, 0, 0, offsets, 99) >= 0) ++ if (pcre2_match (reg_host, lword, wlen, 0, 0, offsets, NULL) >= 0) + col = CCZE_COLOR_HOST; + /** MAC address **/ +- else if (pcre_exec (reg_mac, NULL, lword, wlen, 0, 0, offsets, 99) >= 0) ++ else if (pcre2_match (reg_mac, lword, wlen, 0, 0, offsets, NULL) >= 0) + col = CCZE_COLOR_MAC; + /** Directory **/ + else if (lword[0] == '/') + col = CCZE_COLOR_DIR; + /** E-mail **/ +- else if (pcre_exec (reg_email, NULL, lword, wlen, 0, 0, offsets, 99) +- >= 0 && pcre_exec (reg_email2, NULL, lword, wlen, 0, 0, +- offsets,99) >= 0) ++ else if (pcre2_match (reg_email, lword, wlen, 0, 0, offsets, NULL) ++ >= 0 && pcre2_match (reg_email2, lword, wlen, 0, 0, ++ offsets, NULL) >= 0) + col = CCZE_COLOR_EMAIL; + /** Message-ID **/ +- else if (pcre_exec (reg_msgid, NULL, lword, wlen, 0, 0, offsets, 99) >= 0) ++ else if (pcre2_match (reg_msgid, lword, wlen, 0, 0, offsets, NULL) >= 0) + col = CCZE_COLOR_EMAIL; + /** URI **/ +- else if (pcre_exec (reg_uri, NULL, lword, wlen, 0, 0, offsets, 99) >= 0) ++ else if (pcre2_match (reg_uri, lword, wlen, 0, 0, offsets, NULL) >= 0) + col = CCZE_COLOR_URI; + /** Size **/ +- else if (pcre_exec (reg_size, NULL, lword, wlen, 0, 0, offsets, 99) >= 0) ++ else if (pcre2_match (reg_size, lword, wlen, 0, 0, offsets, NULL) >= 0) + col = CCZE_COLOR_SIZE; + /** Version **/ +- else if (pcre_exec (reg_ver, NULL, lword, wlen, 0, 0, offsets, 99) >= 0) ++ else if (pcre2_match (reg_ver, lword, wlen, 0, 0, offsets, NULL) >= 0) + col = CCZE_COLOR_VERSION; + /** Time **/ +- else if (pcre_exec (reg_time, NULL, lword, wlen, 0, 0, offsets, 99) >= 0) ++ else if (pcre2_match (reg_time, lword, wlen, 0, 0, offsets, NULL) >= 0) + col = CCZE_COLOR_DATE; + /** Address **/ +- else if (pcre_exec (reg_addr, NULL, lword, wlen, 0, 0, offsets, 99) >= 0) ++ else if (pcre2_match (reg_addr, lword, wlen, 0, 0, offsets, NULL) >= 0) + col = CCZE_COLOR_ADDRESS; + /** Number **/ +- else if (pcre_exec (reg_num, NULL, lword, wlen, 0, 0, offsets, 99) >= 0) ++ else if (pcre2_match (reg_num, lword, wlen, 0, 0, offsets, NULL) >= 0) + col = CCZE_COLOR_NUMBERS; + /** Signal **/ +- else if (pcre_exec (reg_sig, NULL, lword, wlen, 0, 0, offsets, 99) >= 0) ++ else if (pcre2_match (reg_sig, lword, wlen, 0, 0, offsets, NULL) >= 0) + col = CCZE_COLOR_SIGNAL; + /* Host + IP (postfix) */ +- else if (pcre_exec (reg_hostip, NULL, lword, wlen, 0, 0, offsets, 99) >= 0) ++ else if (pcre2_match (reg_hostip, lword, wlen, 0, 0, offsets, NULL) >= 0) + { + char *host, *ip; + size_t hostlen, iplen; +@@ -206,9 +204,9 @@ + } + + free (lword); +- free (word); +- free (post); +- free (pre); ++ pcre2_substring_free (post); ++ pcre2_substring_free (pre); ++ pcre2_match_data_free (offsets); + } + + void +@@ -260,64 +258,67 @@ + void + ccze_wordcolor_setup (void) + { +- const char *error; +- int errptr; ++ int error; ++ size_t errptr; + +- reg_pre = pcre_compile ("^([`'\".,!?:;(\\[{<]+)([^`'\".,!?:;(\\[{<]\\S*)$", +- 0, &error, &errptr, NULL); +- reg_post = pcre_compile ("^(\\S*[^`'\".,!?:;)\\]}>])([`'\".,!?:;)\\]}>]+)$", +- 0, &error, &errptr, NULL); +- reg_host = pcre_compile ("^(((\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})|" +- "(([a-z0-9-_]+\\.)+[a-z]{2,3})|(localhost)|" +- "(\\w*::\\w+)+)(:\\d{1,5})?)$", 0, &error, +- &errptr, NULL); +- reg_hostip = pcre_compile ("^(((\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})|" +- "(([a-z0-9-_\\.]+)+)|(localhost)|" +- "(\\w*::\\w+)+)(:\\d{1,5})?)" +- "\\[", +- 0, &error, &errptr, NULL); +- reg_mac = pcre_compile ("^([0-9a-f]{2}:){5}[0-9a-f]{2}$", 0, &error, +- &errptr, NULL); +- reg_email = pcre_compile +- ("^[a-z0-9-_=\\+]+@([a-z0-9-_\\.]+)+(\\.[a-z]{2,4})+", 0, +- &error, &errptr, NULL); +- reg_email2 = pcre_compile ("(\\.[a-z]{2,4})+$", 0, &error, &errptr, NULL); +- reg_uri = pcre_compile ("^\\w{2,}:\\/\\/(\\S+\\/?)+$", 0, &error, +- &errptr, NULL); +- reg_size = pcre_compile ("^\\d+(\\.\\d+)?[k|m|g|t]i?b?(ytes?)?", +- 0, &error, &errptr, NULL); +- reg_ver = pcre_compile ("^v?(\\d+\\.){1}((\\d|[a-z])+\\.)*(\\d|[a-z])+$", +- 0, &error, &errptr, NULL); +- reg_time = pcre_compile ("\\d{1,2}:\\d{1,2}(:\\d{1,2})?", 0, &error, +- &errptr, NULL); +- reg_addr = pcre_compile ("^0x(\\d|[a-f])+$", 0, &error, &errptr, NULL); +- reg_num = pcre_compile ("^[+-]?\\d+$", 0, &error, &errptr, NULL); +- reg_sig = pcre_compile ("^sig(hup|int|quit|ill|abrt|fpe|kill|segv|pipe|" +- "alrm|term|usr1|usr2|chld|cont|stop|tstp|tin|tout|" +- "bus|poll|prof|sys|trap|urg|vtalrm|xcpu|xfsz|iot|" +- "emt|stkflt|io|cld|pwr|info|lost|winch|unused)", 0, +- &error, &errptr, NULL); +- reg_msgid = pcre_compile +- ("^[a-z0-9-_\\.\\$=\\+]+@([a-z0-9-_\\.]+)+(\\.?[a-z]+)+", 0, &error, +- &errptr, NULL); ++ reg_pre = pcre2_compile ("^([`'\".,!?:;(\\[{<]+)([^`'\".,!?:;(\\[{<]\\S*)$", ++ PCRE2_ZERO_TERMINATED, 0, &error, &errptr, NULL); ++ reg_post = pcre2_compile ("^(\\S*[^`'\".,!?:;)\\]}>])([`'\".,!?:;)\\]}>]+)$", ++ PCRE2_ZERO_TERMINATED, 0, &error, &errptr, NULL); ++ reg_host = pcre2_compile ("^(((\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})|" ++ "(([a-z0-9-_]+\\.)+[a-z]{2,3})|(localhost)|" ++ "(\\w*::\\w+)+)(:\\d{1,5})?)$", ++ PCRE2_ZERO_TERMINATED, 0, &error, &errptr, NULL); ++ reg_hostip = pcre2_compile ("^(((\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})|" ++ "(([a-z0-9-_\\.]+)+)|(localhost)|" ++ "(\\w*::\\w+)+)(:\\d{1,5})?)" ++ "\\[", PCRE2_ZERO_TERMINATED, ++ 0, &error, &errptr, NULL); ++ reg_mac = pcre2_compile ("^([0-9a-f]{2}:){5}[0-9a-f]{2}$", ++ PCRE2_ZERO_TERMINATED, 0, &error, &errptr, NULL); ++ reg_email = pcre2_compile ++ ("^[a-z0-9-_=\\+]+@([a-z0-9-_\\.]+)+(\\.[a-z]{2,4})+", ++ PCRE2_ZERO_TERMINATED, 0, &error, &errptr, NULL); ++ reg_email2 = pcre2_compile ("(\\.[a-z]{2,4})+$", PCRE2_ZERO_TERMINATED, ++ 0, &error, &errptr, NULL); ++ reg_uri = pcre2_compile ("^\\w{2,}:\\/\\/(\\S+\\/?)+$", ++ PCRE2_ZERO_TERMINATED, 0, &error, &errptr, NULL); ++ reg_size = pcre2_compile ("^\\d+(\\.\\d+)?[k|m|g|t]i?b?(ytes?)?", ++ PCRE2_ZERO_TERMINATED, 0, &error, &errptr, NULL); ++ reg_ver = pcre2_compile ("^v?(\\d+\\.){1}((\\d|[a-z])+\\.)*(\\d|[a-z])+$", ++ PCRE2_ZERO_TERMINATED, 0, &error, &errptr, NULL); ++ reg_time = pcre2_compile ("\\d{1,2}:\\d{1,2}(:\\d{1,2})?", ++ PCRE2_ZERO_TERMINATED, 0, &error, &errptr, NULL); ++ reg_addr = pcre2_compile ("^0x(\\d|[a-f])+$", PCRE2_ZERO_TERMINATED, ++ 0, &error, &errptr, NULL); ++ reg_num = pcre2_compile ("^[+-]?\\d+$", PCRE2_ZERO_TERMINATED, ++ 0, &error, &errptr, NULL); ++ reg_sig = pcre2_compile ("^sig(hup|int|quit|ill|abrt|fpe|kill|segv|pipe|" ++ "alrm|term|usr1|usr2|chld|cont|stop|tstp|tin|tout|" ++ "bus|poll|prof|sys|trap|urg|vtalrm|xcpu|xfsz|iot|" ++ "emt|stkflt|io|cld|pwr|info|lost|winch|unused)", ++ PCRE2_ZERO_TERMINATED, 0, &error, &errptr, NULL); ++ reg_msgid = pcre2_compile ++ ("^[a-z0-9-_\\.\\$=\\+]+@([a-z0-9-_\\.]+)+(\\.?[a-z]+)+", ++ PCRE2_ZERO_TERMINATED, 0, &error, &errptr, NULL); + } + + void + ccze_wordcolor_shutdown (void) + { +- free (reg_pre); +- free (reg_post); +- free (reg_host); +- free (reg_mac); +- free (reg_email); +- free (reg_email2); +- free (reg_uri); +- free (reg_size); +- free (reg_ver); +- free (reg_time); +- free (reg_addr); +- free (reg_num); +- free (reg_sig); +- free (reg_hostip); +- free (reg_msgid); ++ pcre2_code_free (reg_pre); ++ pcre2_code_free (reg_post); ++ pcre2_code_free (reg_host); ++ pcre2_code_free (reg_mac); ++ pcre2_code_free (reg_email); ++ pcre2_code_free (reg_email2); ++ pcre2_code_free (reg_uri); ++ pcre2_code_free (reg_size); ++ pcre2_code_free (reg_ver); ++ pcre2_code_free (reg_time); ++ pcre2_code_free (reg_addr); ++ pcre2_code_free (reg_num); ++ pcre2_code_free (reg_sig); ++ pcre2_code_free (reg_hostip); ++ pcre2_code_free (reg_msgid); + } +--- ccze.orig/src/ccze.h ++++ ccze/src/ccze.h +@@ -25,7 +25,8 @@ + #ifdef HAVE_SYSTEM_H + # include "system.h" + #endif +-#include <pcre.h> ++#define PCRE2_CODE_UNIT_WIDTH 8 ++#include <pcre2.h> + #include <ncurses.h> + #include <stddef.h> + +--- ccze.orig/src/mod_apm.c ++++ ccze/src/mod_apm.c +@@ -27,21 +27,22 @@ + static void ccze_apm_shutdown (void); + static int ccze_apm_handle (const char *str, size_t length, char **rest); + +-static pcre *reg_apm; ++static pcre2_code *reg_apm; + + static char * +-ccze_apm_process (const char *str, int *offsets, int match) ++ccze_apm_process (pcre2_match_data *offsets) + { + char *battery, *charge, *rate, *stuff1, *elapsed, *remain; + char *stuff2; ++ size_t l; + +- pcre_get_substring (str, offsets, match, 1, (const char **)&battery); +- pcre_get_substring (str, offsets, match, 2, (const char **)&charge); +- pcre_get_substring (str, offsets, match, 4, (const char **)&rate); +- pcre_get_substring (str, offsets, match, 5, (const char **)&stuff1); +- pcre_get_substring (str, offsets, match, 6, (const char **)&elapsed); +- pcre_get_substring (str, offsets, match, 7, (const char **)&remain); +- pcre_get_substring (str, offsets, match, 8, (const char **)&stuff2); ++ pcre2_substring_get_bynumber (offsets, 1, (unsigned char **)&battery, &l); ++ pcre2_substring_get_bynumber (offsets, 2, (unsigned char **)&charge, &l); ++ pcre2_substring_get_bynumber (offsets, 4, (unsigned char **)&rate, &l); ++ pcre2_substring_get_bynumber (offsets, 5, (unsigned char **)&stuff1, &l); ++ pcre2_substring_get_bynumber (offsets, 6, (unsigned char **)&elapsed, &l); ++ pcre2_substring_get_bynumber (offsets, 7, (unsigned char **)&remain, &l); ++ pcre2_substring_get_bynumber (offsets, 8, (unsigned char **)&stuff2, &l); + + ccze_addstr (CCZE_COLOR_DEFAULT, "Battery:"); + ccze_space (); +@@ -62,12 +63,12 @@ + ccze_addstr (CCZE_COLOR_DATE, remain); + ccze_space (); + +- free (battery); +- free (charge); +- free (rate); +- free (stuff1); +- free (elapsed); +- free (remain); ++ pcre2_substring_free (battery); ++ pcre2_substring_free (charge); ++ pcre2_substring_free (rate); ++ pcre2_substring_free (stuff1); ++ pcre2_substring_free (elapsed); ++ pcre2_substring_free (remain); + + return stuff2; + } +@@ -75,35 +76,39 @@ + static void + ccze_apm_setup (void) + { +- const char *error; +- int errptr; ++ int error; ++ size_t errptr; + +- reg_apm = pcre_compile ++ reg_apm = pcre2_compile + ("Battery: (-?\\d*)%, ((.*)charging) \\((-?\\d*)% ([^ ]*) " +- "(\\d*:\\d*:\\d*)\\), (\\d*:\\d*:\\d*) (.*)", 0, &error, &errptr, NULL); ++ "(\\d*:\\d*:\\d*)\\), (\\d*:\\d*:\\d*) (.*)", PCRE2_ZERO_TERMINATED, ++ 0, &error, &errptr, NULL); + } + + static void + ccze_apm_shutdown (void) + { +- free (reg_apm); ++ pcre2_code_free (reg_apm); + } + + static int + ccze_apm_handle (const char *str, size_t length, char **rest) + { +- int match, offsets[99]; ++ pcre2_match_data *offsets; + +- if ((match = pcre_exec (reg_apm, NULL, str, length, +- 0, 0, offsets, 99)) >= 0) ++ offsets = pcre2_match_data_create (99, NULL); ++ if (pcre2_match (reg_apm, str, length, 0, 0, offsets, NULL) >= 0) + { + if (rest) +- *rest = ccze_apm_process (str, offsets, match); ++ *rest = ccze_apm_process (offsets); + else +- ccze_apm_process (str, offsets, match); ++ ccze_apm_process (offsets); + ++ pcre2_match_data_free (offsets); + return 1; + } ++ ++ pcre2_match_data_free (offsets); + + return 0; + } +--- ccze.orig/src/mod_distcc.c ++++ ccze/src/mod_distcc.c +@@ -29,17 +29,17 @@ + static void ccze_distcc_shutdown (void); + static int ccze_distcc_handle (const char *str, size_t length, char **rest); + +-static pcre *reg_distcc; +-static pcre_extra *hints_distcc; ++static pcre2_code *reg_distcc; + + static char * +-ccze_distcc_process (const char *str, int *offsets, int match) ++ccze_distcc_process (pcre2_match_data *offsets) + { + char *pid, *func, *rest; ++ size_t l; + +- pcre_get_substring (str, offsets, match, 1, (const char **)&pid); +- pcre_get_substring (str, offsets, match, 2, (const char **)&func); +- pcre_get_substring (str, offsets, match, 3, (const char **)&rest); ++ pcre2_substring_get_bynumber (offsets, 1, (unsigned char **)&pid, &l); ++ pcre2_substring_get_bynumber (offsets, 2, (unsigned char **)&func, &l); ++ pcre2_substring_get_bynumber (offsets, 3, (unsigned char **)&rest, &l); + + ccze_addstr (CCZE_COLOR_PROC, "distccd"); + ccze_addstr (CCZE_COLOR_PIDB, "["); +@@ -53,8 +53,8 @@ + ccze_space (); + } + +- free (pid); +- free (func); ++ pcre2_substring_free (pid); ++ pcre2_substring_free (func); + + return rest; + } +@@ -62,32 +62,33 @@ + static void + ccze_distcc_setup (void) + { +- const char *error; +- int errptr; ++ int error; ++ size_t errptr; + +- reg_distcc = pcre_compile ("^distccd\\[(\\d+)\\] (\\([^\\)]+\\))? ?(.*)", +- 0, &error, &errptr, NULL); +- hints_distcc = pcre_study (reg_distcc, 0, &error); ++ reg_distcc = pcre2_compile ("^distccd\\[(\\d+)\\] (\\([^\\)]+\\))? ?(.*)", ++ PCRE2_ZERO_TERMINATED, 0, &error, &errptr, NULL); + } + + static void + ccze_distcc_shutdown (void) + { +- free (reg_distcc); +- free (hints_distcc); ++ pcre2_code_free (reg_distcc); + } + + static int + ccze_distcc_handle (const char *str, size_t length, char **rest) + { +- int match, offsets[99]; ++ pcre2_match_data *offsets; + +- if ((match = pcre_exec (reg_distcc, hints_distcc, str, length, +- 0, 0, offsets, 99)) >= 0) ++ offsets = pcre2_match_data_create (99, NULL); ++ if (pcre2_match (reg_distcc, str, length, 0, 0, offsets, NULL) >= 0) + { +- *rest = ccze_distcc_process (str, offsets, match); ++ *rest = ccze_distcc_process (offsets); ++ pcre2_match_data_free (offsets); + return 1; + } ++ ++ pcre2_match_data_free (offsets); + + return 0; + } +--- ccze.orig/src/mod_dpkg.c ++++ ccze/src/mod_dpkg.c +@@ -28,17 +28,19 @@ + static int ccze_dpkg_handle (const char *str, size_t length, char **rest); + + +-static pcre *reg_dpkg_status, *reg_dpkg_action, *reg_dpkg_conffile; ++static pcre2_code *reg_dpkg_status, *reg_dpkg_action, *reg_dpkg_conffile; + + static char * +-ccze_dpkg_status_process(const char *str, int *offsets, int match) ++ccze_dpkg_status_process(pcre2_match_data *offsets) + { + char *date, *state, *pkg, *installed_version; ++ size_t l; + +- pcre_get_substring (str, offsets, match, 1, (const char **)&date); +- pcre_get_substring (str, offsets, match, 2, (const char **)&state); +- pcre_get_substring (str, offsets, match, 3, (const char **)&pkg); +- pcre_get_substring (str, offsets, match, 4, (const char **)&installed_version); ++ pcre2_substring_get_bynumber (offsets, 1, (unsigned char **)&date, &l); ++ pcre2_substring_get_bynumber (offsets, 2, (unsigned char **)&state, &l); ++ pcre2_substring_get_bynumber (offsets, 3, (unsigned char **)&pkg, &l); ++ pcre2_substring_get_bynumber (offsets, 4, ++ (unsigned char **)&installed_version, &l); + + ccze_print_date(date); + ccze_space(); +@@ -51,24 +53,27 @@ + ccze_addstr(CCZE_COLOR_DEFAULT, installed_version); + ccze_newline(); + +- free(date); +- free(state); +- free(pkg); +- free(installed_version); ++ pcre2_substring_free(date); ++ pcre2_substring_free(state); ++ pcre2_substring_free(pkg); ++ pcre2_substring_free(installed_version); + + return NULL; + } + + static char * +-ccze_dpkg_action_process(const char *str, int *offsets, int match) ++ccze_dpkg_action_process(pcre2_match_data *offsets) + { + char *date, *action, *pkg, *installed_version, *available_version; ++ size_t l; + +- pcre_get_substring (str, offsets, match, 1, (const char **)&date); +- pcre_get_substring (str, offsets, match, 2, (const char **)&action); +- pcre_get_substring (str, offsets, match, 3, (const char **)&pkg); +- pcre_get_substring (str, offsets, match, 4, (const char **)&installed_version); +- pcre_get_substring (str, offsets, match, 5, (const char **)&available_version); ++ pcre2_substring_get_bynumber (offsets, 1, (unsigned char **)&date, &l); ++ pcre2_substring_get_bynumber (offsets, 2, (unsigned char **)&action, &l); ++ pcre2_substring_get_bynumber (offsets, 3, (unsigned char **)&pkg, &l); ++ pcre2_substring_get_bynumber (offsets, 4, ++ (unsigned char **)&installed_version, &l); ++ pcre2_substring_get_bynumber (offsets, 5, ++ (unsigned char **)&available_version, &l); + + ccze_print_date(date); + ccze_space(); +@@ -81,24 +86,25 @@ + ccze_addstr(CCZE_COLOR_DEFAULT, available_version); + ccze_newline(); + +- free(date); +- free(action); +- free(pkg); +- free(installed_version); +- free(available_version); ++ pcre2_substring_free(date); ++ pcre2_substring_free(action); ++ pcre2_substring_free(pkg); ++ pcre2_substring_free(installed_version); ++ pcre2_substring_free(available_version); + + return NULL; + } + + static char * +-ccze_dpkg_conffile_process(const char *str, int *offsets, int match) ++ccze_dpkg_conffile_process(pcre2_match_data *offsets) + { + char *date, *filename, *decision; ++ size_t l; + /* YYYY-MM-DD HH:MM:SS conffile <filename> <decision> */ + +- pcre_get_substring (str, offsets, match, 1, (const char **)&date); +- pcre_get_substring (str, offsets, match, 2, (const char **)&filename); +- pcre_get_substring (str, offsets, match, 3, (const char **)&decision); ++ pcre2_substring_get_bynumber (offsets, 1, (unsigned char **)&date, &l); ++ pcre2_substring_get_bynumber (offsets, 2, (unsigned char **)&filename, &l); ++ pcre2_substring_get_bynumber (offsets, 3, (unsigned char **)&decision, &l); + + ccze_print_date(date); + ccze_space(); +@@ -109,9 +115,9 @@ + ccze_addstr(CCZE_COLOR_KEYWORD, decision); + ccze_newline(); + +- free(date); +- free(filename); +- free(decision); ++ pcre2_substring_free(date); ++ pcre2_substring_free(filename); ++ pcre2_substring_free(decision); + + return NULL; + } +@@ -120,60 +126,63 @@ + static void + ccze_dpkg_setup (void) + { +- const char *error; +- int errptr; ++ int error; ++ size_t errptr; + + /* YYYY-MM-DD HH:MM:SS status <state> <pkg> <installed-version> */ +- reg_dpkg_status = pcre_compile( ++ reg_dpkg_status = pcre2_compile( + "^([-\\d]{10}\\s[:\\d]{8})\\sstatus\\s(\\S+)\\s(\\S+)\\s(\\S+)$", +- 0, &error, &errptr, NULL); ++ PCRE2_ZERO_TERMINATED, 0, &error, &errptr, NULL); + + /* YYYY-MM-DD HH:MM:SS <action> <pkg> <installed-version> <available-version> */ +- reg_dpkg_action = pcre_compile( ++ reg_dpkg_action = pcre2_compile( + "^([-\\d]{10}\\s[:\\d]{8})\\s(install|upgrade|remove|purge)\\s(\\S+)\\s(\\S+)\\s(\\S+)$", +- 0, &error, &errptr, NULL); ++ PCRE2_ZERO_TERMINATED, 0, &error, &errptr, NULL); + + /* YYYY-MM-DD HH:MM:SS conffile <filename> <decision> */ +- reg_dpkg_conffile = pcre_compile( ++ reg_dpkg_conffile = pcre2_compile( + "^([-\\d]{10}\\s[:\\d]{8})\\sconffile\\s(\\S+)\\s(install|keep)$", +- 0, &error, &errptr, NULL); ++ PCRE2_ZERO_TERMINATED, 0, &error, &errptr, NULL); + + } + + static void + ccze_dpkg_shutdown (void) + { +- free (reg_dpkg_status); +- free (reg_dpkg_action); +- free (reg_dpkg_conffile); ++ pcre2_code_free (reg_dpkg_status); ++ pcre2_code_free (reg_dpkg_action); ++ pcre2_code_free (reg_dpkg_conffile); + } + + static int + ccze_dpkg_handle (const char *str, size_t length, char **rest) + { +- int match, offsets[99]; ++ pcre2_match_data *offsets; + +- if ((match = pcre_exec (reg_dpkg_status, NULL, str, length, +- 0, 0, offsets, 99)) >= 0) ++ offsets = pcre2_match_data_create (99, NULL); ++ if (pcre2_match (reg_dpkg_status, str, length, 0, 0, offsets, NULL) >= 0) + { +- *rest = ccze_dpkg_status_process (str, offsets, match); ++ *rest = ccze_dpkg_status_process (offsets); ++ pcre2_match_data_free (offsets); + return 1; + } + +- if ((match = pcre_exec (reg_dpkg_action, NULL, str, length, +- 0, 0, offsets, 99)) >= 0) ++ if (pcre2_match (reg_dpkg_action, str, length, 0, 0, offsets, NULL) >= 0) + { +- *rest = ccze_dpkg_action_process (str, offsets, match); ++ *rest = ccze_dpkg_action_process (offsets); ++ pcre2_match_data_free (offsets); + return 1; + } + +- if ((match = pcre_exec (reg_dpkg_conffile, NULL, str, length, +- 0, 0, offsets, 99)) >= 0) ++ if (pcre2_match (reg_dpkg_conffile, str, length, 0, 0, offsets, NULL) >= 0) + { +- *rest = ccze_dpkg_conffile_process (str, offsets, match); ++ *rest = ccze_dpkg_conffile_process (offsets); ++ pcre2_match_data_free (offsets); + return 1; + } + ++ pcre2_match_data_free (offsets); ++ + return 0; + } + +--- ccze.orig/src/mod_exim.c ++++ ccze/src/mod_exim.c +@@ -27,28 +27,29 @@ + static void ccze_exim_shutdown (void); + static int ccze_exim_handle (const char *str, size_t length, char **rest); + +-static pcre *reg_exim, *reg_exim_actiontype, *reg_exim_uniqn; +-static pcre_extra *hints_exim; ++static pcre2_code *reg_exim, *reg_exim_actiontype, *reg_exim_uniqn; + + static char * +-ccze_exim_process (const char *str, int *offsets, int match) ++ccze_exim_process (pcre2_match_data *offsets) + { + char *date, *msg=NULL, *action=NULL, *uniqn=NULL, *msgfull; +- int match2, offsets2[99]; ++ pcre2_match_data *offsets2; ++ size_t l; + ccze_color_t color = CCZE_COLOR_UNKNOWN; + +- pcre_get_substring (str, offsets, match, 1, (const char **)&date); +- pcre_get_substring (str, offsets, match, 2, (const char **)&msgfull); ++ pcre2_substring_get_bynumber (offsets, 1, (unsigned char **)&date, &l); ++ pcre2_substring_get_bynumber (offsets, 2, (unsigned char **)&msgfull, &l); + +- if ((match2 = pcre_exec (reg_exim_actiontype, NULL, msgfull, +- strlen (msgfull), 0, 0, offsets2, 99)) >= 0) ++ offsets2 = pcre2_match_data_create (99, NULL); ++ if (pcre2_match (reg_exim_actiontype, msgfull, strlen (msgfull), ++ 0, 0, offsets2, NULL) >= 0) + { +- pcre_get_substring (msgfull, offsets2, match2, 1, +- (const char **)&uniqn); +- pcre_get_substring (msgfull, offsets2, match2, 2, +- (const char **)&action); +- pcre_get_substring (msgfull, offsets2, match2, 3, +- (const char **)&msg); ++ pcre2_substring_get_bynumber (offsets2, 1, ++ (unsigned char **)&uniqn, &l); ++ pcre2_substring_get_bynumber (offsets2, 2, ++ (unsigned char **)&action, &l); ++ pcre2_substring_get_bynumber (offsets2, 3, ++ (unsigned char **)&msg, &l); + if (action[0] == '<') + color = CCZE_COLOR_INCOMING; + else if (action[1] == '>') +@@ -56,13 +57,13 @@ + else if (action[0] == '=' || action[0] == '*') + color = CCZE_COLOR_ERROR; + } +- else if ((match2 = pcre_exec (reg_exim_uniqn, NULL, msgfull, +- strlen (msgfull), 0, 0, offsets2, 99)) >= 0) ++ else if (pcre2_match (reg_exim_uniqn, msgfull, strlen (msgfull), ++ 0, 0, offsets2, NULL) >= 0) + { +- pcre_get_substring (msgfull, offsets2, match2, 1, +- (const char **)&uniqn); +- pcre_get_substring (msgfull, offsets2, match2, 2, +- (const char **)&msg); ++ pcre2_substring_get_bynumber (offsets2, 1, ++ (unsigned char **)&uniqn, &l); ++ pcre2_substring_get_bynumber (offsets2, 2, ++ (unsigned char **)&msg, &l); + } + else + msg = strdup (msgfull); +@@ -82,47 +83,54 @@ + ccze_space(); + } + ++ pcre2_substring_free (date); ++ pcre2_substring_free (msgfull); ++ pcre2_substring_free (uniqn); ++ pcre2_substring_free (action); ++ pcre2_match_data_free (offsets2); ++ + return msg; + } + + static void + ccze_exim_setup (void) + { +- const char *error; +- int errptr; ++ int error; ++ size_t errptr; + +- reg_exim = pcre_compile +- ("^(\\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}:\\d{2})\\s(.*)$", 0, +- &error, &errptr, NULL); +- hints_exim = pcre_study (reg_exim, 0, &error); +- +- reg_exim_actiontype = pcre_compile +- ("^(\\S{16})\\s([<=\\*][=>\\*])\\s(\\S+.*)$", 0, &error, +- &errptr, NULL); +- reg_exim_uniqn = pcre_compile ("^(\\S{16})\\s(.*)$", 0, &error, +- &errptr, NULL); ++ reg_exim = pcre2_compile ++ ("^(\\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}:\\d{2})\\s(.*)$", ++ PCRE2_ZERO_TERMINATED, 0, &error, &errptr, NULL); ++ ++ reg_exim_actiontype = pcre2_compile ++ ("^(\\S{16})\\s([<=\\*][=>\\*])\\s(\\S+.*)$", PCRE2_ZERO_TERMINATED, ++ 0, &error, &errptr, NULL); ++ reg_exim_uniqn = pcre2_compile ("^(\\S{16})\\s(.*)$", PCRE2_ZERO_TERMINATED, ++ 0, &error, &errptr, NULL); + } + + static void + ccze_exim_shutdown (void) + { +- free (reg_exim); +- free (hints_exim); +- free (reg_exim_actiontype); +- free (reg_exim_uniqn); ++ pcre2_code_free (reg_exim); ++ pcre2_code_free (reg_exim_actiontype); ++ pcre2_code_free (reg_exim_uniqn); + } + + static int + ccze_exim_handle (const char *str, size_t length, char **rest) + { +- int match, offsets[99]; ++ pcre2_match_data *offsets; + +- if ((match = pcre_exec (reg_exim, hints_exim, str, length, +- 0, 0, offsets, 99)) >= 0) ++ offsets = pcre2_match_data_create (99, NULL); ++ if (pcre2_match (reg_exim, str, length, 0, 0, offsets, NULL) >= 0) + { +- *rest = ccze_exim_process (str, offsets, match); ++ *rest = ccze_exim_process (offsets); ++ pcre2_match_data_free (offsets); + return 1; + } ++ ++ pcre2_match_data_free (offsets); + + return 0; + } +--- ccze.orig/src/mod_fetchmail.c ++++ ccze/src/mod_fetchmail.c +@@ -27,18 +27,19 @@ + static void ccze_fetchmail_shutdown (void); + static int ccze_fetchmail_handle (const char *str, size_t length, char **rest); + +-static pcre *reg_fetchmail; ++static pcre2_code *reg_fetchmail; + + static char * +-ccze_fetchmail_process (const char *str, int *offsets, int match) ++ccze_fetchmail_process (pcre2_match_data *offsets) + { + char *start, *addy, *current, *full, *rest; ++ size_t l; + +- pcre_get_substring (str, offsets, match, 1, (const char **)&start); +- pcre_get_substring (str, offsets, match, 2, (const char **)&addy); +- pcre_get_substring (str, offsets, match, 3, (const char **)¤t); +- pcre_get_substring (str, offsets, match, 4, (const char **)&full); +- pcre_get_substring (str, offsets, match, 5, (const char **)&rest); ++ pcre2_substring_get_bynumber (offsets, 1, (unsigned char **)&start, &l); ++ pcre2_substring_get_bynumber (offsets, 2, (unsigned char **)&addy, &l); ++ pcre2_substring_get_bynumber (offsets, 3, (unsigned char **)¤t, &l); ++ pcre2_substring_get_bynumber (offsets, 4, (unsigned char **)&full, &l); ++ pcre2_substring_get_bynumber (offsets, 5, (unsigned char **)&rest, &l); + + ccze_addstr (CCZE_COLOR_DEFAULT, start); + ccze_space (); +@@ -51,10 +52,10 @@ + ccze_addstr (CCZE_COLOR_NUMBERS, full); + ccze_space (); + +- free (start); +- free (addy); +- free (current); +- free (full); ++ pcre2_substring_free (start); ++ pcre2_substring_free (addy); ++ pcre2_substring_free (current); ++ pcre2_substring_free (full); + + return rest; + } +@@ -62,34 +63,38 @@ + static void + ccze_fetchmail_setup (void) + { +- const char *error; +- int errptr; ++ int error; ++ size_t errptr; + +- reg_fetchmail = pcre_compile +- ("(reading message) ([^@]*@[^:]*):([0-9]*) of ([0-9]*) (.*)", 0, +- &error, &errptr, NULL); ++ reg_fetchmail = pcre2_compile ++ ("(reading message) ([^@]*@[^:]*):([0-9]*) of ([0-9]*) (.*)", ++ PCRE2_ZERO_TERMINATED, 0, &error, &errptr, NULL); + } + + static void + ccze_fetchmail_shutdown (void) + { +- free (reg_fetchmail); ++ pcre2_code_free (reg_fetchmail); + } + + static int + ccze_fetchmail_handle (const char *str, size_t length, char **rest) + { +- int offsets[99], match; ++ pcre2_match_data *offsets; + +- if ((match = pcre_exec (reg_fetchmail, NULL, str, length, 0, 0, offsets, 99)) >= 0) ++ offsets = pcre2_match_data_create (99, NULL); ++ if (pcre2_match (reg_fetchmail, str, length, 0, 0, offsets, NULL) >= 0) + { + if (rest) +- *rest = ccze_fetchmail_process (str, offsets, match); ++ *rest = ccze_fetchmail_process (offsets); + else +- ccze_fetchmail_process (str, offsets, match); ++ ccze_fetchmail_process (offsets); + ++ pcre2_match_data_free (offsets); + return 1; + } ++ ++ pcre2_match_data_free (offsets); + + return 0; + } +--- ccze.orig/src/mod_ftpstats.c ++++ ccze/src/mod_ftpstats.c +@@ -29,22 +29,22 @@ + static void ccze_ftpstats_shutdown (void); + static int ccze_ftpstats_handle (const char *str, size_t length, char **rest); + +-static pcre *reg_ftpstats; +-static pcre_extra *hints_ftpstats; ++static pcre2_code *reg_ftpstats; + + static char * +-ccze_ftpstats_process (const char *str, int *offsets, int match) ++ccze_ftpstats_process (pcre2_match_data *offsets) + { + char *date, *sessionid, *user, *host, *type, *size, *duration, *file; ++ size_t l; + +- pcre_get_substring (str, offsets, match, 1, (const char **)&date); +- pcre_get_substring (str, offsets, match, 2, (const char **)&sessionid); +- pcre_get_substring (str, offsets, match, 3, (const char **)&user); +- pcre_get_substring (str, offsets, match, 4, (const char **)&host); +- pcre_get_substring (str, offsets, match, 5, (const char **)&type); +- pcre_get_substring (str, offsets, match, 6, (const char **)&size); +- pcre_get_substring (str, offsets, match, 7, (const char **)&duration); +- pcre_get_substring (str, offsets, match, 8, (const char **)&file); ++ pcre2_substring_get_bynumber (offsets, 1, (unsigned char **)&date, &l); ++ pcre2_substring_get_bynumber (offsets, 2, (unsigned char **)&sessionid, &l); ++ pcre2_substring_get_bynumber (offsets, 3, (unsigned char **)&user, &l); ++ pcre2_substring_get_bynumber (offsets, 4, (unsigned char **)&host, &l); ++ pcre2_substring_get_bynumber (offsets, 5, (unsigned char **)&type, &l); ++ pcre2_substring_get_bynumber (offsets, 6, (unsigned char **)&size, &l); ++ pcre2_substring_get_bynumber (offsets, 7, (unsigned char **)&duration, &l); ++ pcre2_substring_get_bynumber (offsets, 8, (unsigned char **)&file, &l); + + ccze_print_date (date); + ccze_space (); +@@ -63,14 +63,14 @@ + ccze_addstr (CCZE_COLOR_DIR, file); + ccze_newline (); + +- free (file); +- free (duration); +- free (size); +- free (type); +- free (host); +- free (user); +- free (sessionid); +- free (date); ++ pcre2_substring_free (file); ++ pcre2_substring_free (duration); ++ pcre2_substring_free (size); ++ pcre2_substring_free (type); ++ pcre2_substring_free (host); ++ pcre2_substring_free (user); ++ pcre2_substring_free (sessionid); ++ pcre2_substring_free (date); + + return NULL; + } +@@ -78,34 +78,35 @@ + static void + ccze_ftpstats_setup (void) + { +- const char *error; +- int errptr; ++ int error; ++ size_t errptr; + +- reg_ftpstats = pcre_compile ++ reg_ftpstats = pcre2_compile + ("^(\\d{9,10})\\s([\\da-f]+\\.[\\da-f]+)\\s([^\\s]+)\\s([^\\s]+)" + "\\s(U|D)\\s(\\d+)\\s(\\d+)\\s(.*)$", +- 0, &error, &errptr, NULL); +- hints_ftpstats = pcre_study (reg_ftpstats, 0, &error); ++ PCRE2_ZERO_TERMINATED, 0, &error, &errptr, NULL); + } + + static void + ccze_ftpstats_shutdown (void) + { +- free (reg_ftpstats); +- free (hints_ftpstats); ++ pcre2_code_free (reg_ftpstats); + } + + static int + ccze_ftpstats_handle (const char *str, size_t length, char **rest) + { +- int match, offsets[99]; ++ pcre2_match_data *offsets; + +- if ((match = pcre_exec (reg_ftpstats, hints_ftpstats, str, length, +- 0, 0, offsets, 99)) >= 0) ++ offsets = pcre2_match_data_create (99, NULL); ++ if (pcre2_match (reg_ftpstats, str, length, 0, 0, offsets, NULL) >= 0) + { +- *rest = ccze_ftpstats_process (str, offsets, match); ++ *rest = ccze_ftpstats_process (offsets); ++ pcre2_match_data_free (offsets); + return 1; + } ++ ++ pcre2_match_data_free (offsets); + + return 0; + } +--- ccze.orig/src/mod_httpd.c ++++ ccze/src/mod_httpd.c +@@ -27,8 +27,7 @@ + static void ccze_httpd_shutdown (void); + static int ccze_httpd_handle (const char *str, size_t length, char **rest); + +-static pcre *reg_httpd_access, *reg_httpd_error; +-static pcre_extra *hints_httpd_access, *hints_httpd_error; ++static pcre2_code *reg_httpd_access, *reg_httpd_error; + + static ccze_color_t + _ccze_httpd_error (const char *level) +@@ -45,20 +44,21 @@ + } + + static char * +-ccze_httpd_access_log_process (const char *str, int *offsets, int match) ++ccze_httpd_access_log_process (pcre2_match_data *offsets) + { + char *host, *vhost, *user, *date, *full_action, *method, *http_code; + char *gsize, *other; ++ size_t l; + +- pcre_get_substring (str, offsets, match, 1, (const char **)&vhost); +- pcre_get_substring (str, offsets, match, 2, (const char **)&host); +- pcre_get_substring (str, offsets, match, 3, (const char **)&user); +- pcre_get_substring (str, offsets, match, 4, (const char **)&date); +- pcre_get_substring (str, offsets, match, 5, (const char **)&full_action); +- pcre_get_substring (str, offsets, match, 6, (const char **)&method); +- pcre_get_substring (str, offsets, match, 7, (const char **)&http_code); +- pcre_get_substring (str, offsets, match, 8, (const char **)&gsize); +- pcre_get_substring (str, offsets, match, 9, (const char **)&other); ++ pcre2_substring_get_bynumber (offsets, 1, (unsigned char **)&vhost, &l); ++ pcre2_substring_get_bynumber (offsets, 2, (unsigned char **)&host, &l); ++ pcre2_substring_get_bynumber (offsets, 3, (unsigned char **)&user, &l); ++ pcre2_substring_get_bynumber (offsets, 4, (unsigned char **)&date, &l); ++ pcre2_substring_get_bynumber (offsets, 5, (unsigned char **)&full_action, &l); ++ pcre2_substring_get_bynumber (offsets, 6, (unsigned char **)&method, &l); ++ pcre2_substring_get_bynumber (offsets, 7, (unsigned char **)&http_code, &l); ++ pcre2_substring_get_bynumber (offsets, 8, (unsigned char **)&gsize, &l); ++ pcre2_substring_get_bynumber (offsets, 9, (unsigned char **)&other, &l); + + ccze_addstr (CCZE_COLOR_HOST, vhost); + ccze_space(); +@@ -86,26 +86,29 @@ + ccze_addstr (CCZE_COLOR_DEFAULT, other); + ccze_newline (); + +- free (host); +- free (user); +- free (date); +- free (method); +- free (full_action); +- free (http_code); +- free (gsize); ++ pcre2_substring_free (vhost); ++ pcre2_substring_free (host); ++ pcre2_substring_free (user); ++ pcre2_substring_free (date); ++ pcre2_substring_free (method); ++ pcre2_substring_free (full_action); ++ pcre2_substring_free (http_code); ++ pcre2_substring_free (gsize); ++ pcre2_substring_free (other); + + return NULL; + } + + static char * +-ccze_httpd_error_log_process (const char *str, int *offsets, int match) ++ccze_httpd_error_log_process (pcre2_match_data *offsets) + { + char *date, *level, *msg; + ccze_color_t lcol; ++ size_t l; + +- pcre_get_substring (str, offsets, match, 1, (const char **)&date); +- pcre_get_substring (str, offsets, match, 2, (const char **)&level); +- pcre_get_substring (str, offsets, match, 3, (const char **)&msg); ++ pcre2_substring_get_bynumber (offsets, 1, (unsigned char **)&date, &l); ++ pcre2_substring_get_bynumber (offsets, 2, (unsigned char **)&level, &l); ++ pcre2_substring_get_bynumber (offsets, 3, (unsigned char **)&msg, &l); + + ccze_addstr (CCZE_COLOR_DATE, date); + ccze_space (); +@@ -118,9 +121,9 @@ + + ccze_newline (); + +- free (date); +- free (level); +- free (msg); ++ pcre2_substring_free (date); ++ pcre2_substring_free (level); ++ pcre2_substring_free (msg); + + return NULL; + } +@@ -128,49 +131,49 @@ + static void + ccze_httpd_setup (void) + { +- const char *error; +- int errptr; ++ int error; ++ size_t errptr; + +- reg_httpd_access = pcre_compile ++ reg_httpd_access = pcre2_compile + ("^(\\S*)\\s(\\S*)?\\s?-\\s(\\S+)\\s(\\[\\d{1,2}\\/\\S*" + "\\/\\d{4}:\\d{2}:\\d{2}:\\d{2}.{0,6}[^\\]]*\\])\\s" + "(\"([^ \"]+)\\s*[^\"]*\")\\s(\\d{3})\\s(\\d+|-)\\s*(.*)$", +- 0, &error, &errptr, NULL); +- hints_httpd_access = pcre_study (reg_httpd_access, 0, &error); ++ PCRE2_ZERO_TERMINATED, 0, &error, &errptr, NULL); + +- reg_httpd_error = pcre_compile ++ reg_httpd_error = pcre2_compile + ("^(\\[\\w{3}\\s\\w{3}\\s{1,2}\\d{1,2}\\s\\d{2}:\\d{2}:\\d{2}\\s" +- "\\d{4}\\])\\s(\\[\\w*\\])\\s(.*)$", 0, &error, &errptr, NULL); +- hints_httpd_error = pcre_study (reg_httpd_error, 0, &error); ++ "\\d{4}\\])\\s(\\[\\w*\\])\\s(.*)$", ++ PCRE2_ZERO_TERMINATED, 0, &error, &errptr, NULL); + } + + static void + ccze_httpd_shutdown (void) + { +- free (reg_httpd_access); +- free (hints_httpd_access); +- free (reg_httpd_error); +- free (hints_httpd_error); ++ pcre2_code_free (reg_httpd_access); ++ pcre2_code_free (reg_httpd_error); + } + + static int + ccze_httpd_handle (const char *str, size_t length, char **rest) + { +- int match, offsets[99]; ++ pcre2_match_data *offsets; + +- if ((match = pcre_exec (reg_httpd_access, hints_httpd_access, +- str, length, 0, 0, offsets, 99)) >= 0) ++ offsets = pcre2_match_data_create (99, NULL); ++ if (pcre2_match (reg_httpd_access, str, length, 0, 0, offsets, NULL) >= 0) + { +- *rest = ccze_httpd_access_log_process (str, offsets, match); ++ *rest = ccze_httpd_access_log_process (offsets); ++ pcre2_match_data_free (offsets); + return 1; + } +- if ((match = pcre_exec (reg_httpd_error, hints_httpd_error, +- str, length, 0, 0, offsets, 99)) >= 0) ++ if (pcre2_match (reg_httpd_error, str, length, 0, 0, offsets, NULL) >= 0) + { +- *rest = ccze_httpd_error_log_process (str, offsets, match); ++ *rest = ccze_httpd_error_log_process (offsets); ++ pcre2_match_data_free (offsets); + return 1; + } + ++ pcre2_match_data_free (offsets); ++ + return 0; + } + +--- ccze.orig/src/mod_icecast.c ++++ ccze/src/mod_icecast.c +@@ -29,20 +29,20 @@ + static void ccze_icecast_shutdown (void); + static int ccze_icecast_handle (const char *str, size_t length, char **rest); + +-static pcre *reg_icecast, *reg_icecast_usage; +-static pcre_extra *hints_icecast, *hints_icecast_usage; ++static pcre2_code *reg_icecast, *reg_icecast_usage; + + static char * +-ccze_icecast_process (const char *str, int *offsets, int match) ++ccze_icecast_process (pcre2_match_data *offsets) + { + char *date = NULL, *admin = NULL, *threadno = NULL, *thread = NULL; + char *rest = NULL; ++ size_t l; + +- pcre_get_substring (str, offsets, match, 1, (const char **)&date); +- pcre_get_substring (str, offsets, match, 2, (const char **)&admin); +- pcre_get_substring (str, offsets, match, 4, (const char **)&threadno); +- pcre_get_substring (str, offsets, match, 5, (const char **)&thread); +- pcre_get_substring (str, offsets, match, 6, (const char **)&rest); ++ pcre2_substring_get_bynumber (offsets, 1, (unsigned char **)&date, &l); ++ pcre2_substring_get_bynumber (offsets, 2, (unsigned char **)&admin, &l); ++ pcre2_substring_get_bynumber (offsets, 4, (unsigned char **)&threadno, &l); ++ pcre2_substring_get_bynumber (offsets, 5, (unsigned char **)&thread, &l); ++ pcre2_substring_get_bynumber (offsets, 6, (unsigned char **)&rest, &l); + + ccze_addstr (CCZE_COLOR_DATE, date); + ccze_space (); +@@ -65,29 +65,30 @@ + } + ccze_space (); + +- free (date); +- free (admin); +- free (threadno); +- free (thread); ++ pcre2_substring_free (date); ++ pcre2_substring_free (admin); ++ pcre2_substring_free (threadno); ++ pcre2_substring_free (thread); + + return rest; + } + + static char * +-ccze_icecast_usage_process (const char *str, int *offsets, int match) ++ccze_icecast_usage_process (pcre2_match_data *offsets) + { + char *date, *threadno, *thread, *date2, *bw, *src; + char *unit, *clients, *admins; ++ size_t l; + +- pcre_get_substring (str, offsets, match, 1, (const char **)&date); +- pcre_get_substring (str, offsets, match, 3, (const char **)&threadno); +- pcre_get_substring (str, offsets, match, 4, (const char **)&thread); +- pcre_get_substring (str, offsets, match, 5, (const char **)&date2); +- pcre_get_substring (str, offsets, match, 6, (const char **)&bw); +- pcre_get_substring (str, offsets, match, 7, (const char **)&unit); +- pcre_get_substring (str, offsets, match, 8, (const char **)&src); +- pcre_get_substring (str, offsets, match, 9, (const char **)&clients); +- pcre_get_substring (str, offsets, match, 10, (const char **)&admins); ++ pcre2_substring_get_bynumber (offsets, 1, (unsigned char **)&date, &l); ++ pcre2_substring_get_bynumber (offsets, 3, (unsigned char **)&threadno, &l); ++ pcre2_substring_get_bynumber (offsets, 4, (unsigned char **)&thread, &l); ++ pcre2_substring_get_bynumber (offsets, 5, (unsigned char **)&date2, &l); ++ pcre2_substring_get_bynumber (offsets, 6, (unsigned char **)&bw, &l); ++ pcre2_substring_get_bynumber (offsets, 7, (unsigned char **)&unit, &l); ++ pcre2_substring_get_bynumber (offsets, 8, (unsigned char **)&src, &l); ++ pcre2_substring_get_bynumber (offsets, 9, (unsigned char **)&clients, &l); ++ pcre2_substring_get_bynumber (offsets, 10, (unsigned char **)&admins, &l); + + + ccze_addstr (CCZE_COLOR_DATE, date); +@@ -121,15 +122,15 @@ + + ccze_newline (); + +- free (date); +- free (threadno); +- free (thread); +- free (date2); +- free (bw); +- free (unit); +- free (src); +- free (clients); +- free (admins); ++ pcre2_substring_free (date); ++ pcre2_substring_free (threadno); ++ pcre2_substring_free (thread); ++ pcre2_substring_free (date2); ++ pcre2_substring_free (bw); ++ pcre2_substring_free (unit); ++ pcre2_substring_free (src); ++ pcre2_substring_free (clients); ++ pcre2_substring_free (admins); + + return NULL; + } +@@ -137,51 +138,51 @@ + static void + ccze_icecast_setup (void) + { +- const char *error; +- int errptr; ++ int error; ++ size_t errptr; + +- reg_icecast = pcre_compile ("^(\\[\\d+/.../\\d+:\\d+:\\d+:\\d+\\]) " +- "(Admin)? *(\\[(\\d+)?:?([^\\]]*)\\]) (.*)$", +- 0, &error, &errptr, NULL); +- hints_icecast = pcre_study (reg_icecast, 0, &error); +- +- reg_icecast_usage = pcre_compile ("^(\\[\\d+/.../\\d+:\\d+:\\d+:\\d+\\]) " +- "(\\[(\\d+):([^\\]]*)\\]) " +- "(\\[\\d+/.../\\d+:\\d+:\\d+:\\d+\\]) " +- "Bandwidth:([\\d\\.]+)([^ ]*) " +- "Sources:(\\d+) " +- "Clients:(\\d+) Admins:(\\d+)", +- 0, &error, &errptr, NULL); +- hints_icecast_usage = pcre_study (reg_icecast_usage, 0, &error); ++ reg_icecast = pcre2_compile ("^(\\[\\d+/.../\\d+:\\d+:\\d+:\\d+\\]) " ++ "(Admin)? *(\\[(\\d+)?:?([^\\]]*)\\]) (.*)$", ++ PCRE2_ZERO_TERMINATED, 0, &error, &errptr, NULL); ++ ++ reg_icecast_usage = pcre2_compile ("^(\\[\\d+/.../\\d+:\\d+:\\d+:\\d+\\]) " ++ "(\\[(\\d+):([^\\]]*)\\]) " ++ "(\\[\\d+/.../\\d+:\\d+:\\d+:\\d+\\]) " ++ "Bandwidth:([\\d\\.]+)([^ ]*) " ++ "Sources:(\\d+) " ++ "Clients:(\\d+) Admins:(\\d+)", ++ PCRE2_ZERO_TERMINATED, 0, ++ &error, &errptr, NULL); + } + + static void + ccze_icecast_shutdown (void) + { +- free (reg_icecast); +- free (hints_icecast); +- free (reg_icecast_usage); +- free (hints_icecast_usage); ++ pcre2_code_free (reg_icecast); ++ pcre2_code_free (reg_icecast_usage); + } + + static int + ccze_icecast_handle (const char *str, size_t length, char **rest) + { +- int match, offsets[99]; ++ pcre2_match_data *offsets; + +- if ((match = pcre_exec (reg_icecast_usage, hints_icecast_usage, +- str, length, 0, 0, offsets, 99)) >= 0) ++ offsets = pcre2_match_data_create (99, NULL); ++ if (pcre2_match (reg_icecast_usage, str, length, 0, 0, offsets, NULL) >= 0) + { +- *rest = ccze_icecast_usage_process (str, offsets, match); ++ *rest = ccze_icecast_usage_process (offsets); ++ pcre2_match_data_free (offsets); + return 1; + } + +- if ((match = pcre_exec (reg_icecast, hints_icecast, str, length, +- 0, 0, offsets, 99)) >= 0) ++ if (pcre2_match (reg_icecast, str, length, 0, 0, offsets, NULL) >= 0) + { +- *rest = ccze_icecast_process (str, offsets, match); ++ *rest = ccze_icecast_process (offsets); ++ pcre2_match_data_free (offsets); + return 1; + } ++ ++ pcre2_match_data_free (offsets); + + return 0; + } +--- ccze.orig/src/mod_oops.c ++++ ccze/src/mod_oops.c +@@ -29,21 +29,21 @@ + static void ccze_oops_shutdown (void); + static int ccze_oops_handle (const char *str, size_t length, char **rest); + +-static pcre *reg_oops; +-static pcre_extra *hints_oops; ++static pcre2_code *reg_oops; + + static char * +-ccze_oops_process (const char *str, int *offsets, int match) ++ccze_oops_process (pcre2_match_data *offsets) + { + char *date, *sp1, *id, *field, *sp2, *value, *etc; ++ size_t l; + +- pcre_get_substring (str, offsets, match, 1, (const char **)&date); +- pcre_get_substring (str, offsets, match, 4, (const char **)&sp1); +- pcre_get_substring (str, offsets, match, 5, (const char **)&id); +- pcre_get_substring (str, offsets, match, 6, (const char **)&field); +- pcre_get_substring (str, offsets, match, 7, (const char **)&sp2); +- pcre_get_substring (str, offsets, match, 8, (const char **)&value); +- pcre_get_substring (str, offsets, match, 9, (const char **)&etc); ++ pcre2_substring_get_bynumber (offsets, 1, (unsigned char **)&date, &l); ++ pcre2_substring_get_bynumber (offsets, 4, (unsigned char **)&sp1, &l); ++ pcre2_substring_get_bynumber (offsets, 5, (unsigned char **)&id, &l); ++ pcre2_substring_get_bynumber (offsets, 6, (unsigned char **)&field, &l); ++ pcre2_substring_get_bynumber (offsets, 7, (unsigned char **)&sp2, &l); ++ pcre2_substring_get_bynumber (offsets, 8, (unsigned char **)&value, &l); ++ pcre2_substring_get_bynumber (offsets, 9, (unsigned char **)&etc, &l); + + ccze_addstr (CCZE_COLOR_DATE, date); + ccze_addstr (CCZE_COLOR_DEFAULT, sp1); +@@ -65,13 +65,13 @@ + + ccze_newline (); + +- free (date); +- free (sp1); +- free (id); +- free (field); +- free (sp2); +- free (value); +- free (etc); ++ pcre2_substring_free (date); ++ pcre2_substring_free (sp1); ++ pcre2_substring_free (id); ++ pcre2_substring_free (field); ++ pcre2_substring_free (sp2); ++ pcre2_substring_free (value); ++ pcre2_substring_free (etc); + + return NULL; + } +@@ -79,36 +79,37 @@ + static void + ccze_oops_setup (void) + { +- const char *error; +- int errptr; ++ int error; ++ size_t errptr; + +- reg_oops = pcre_compile ++ reg_oops = pcre2_compile + ("^((Mon|Tue|Wed|Thu|Fri|Sat|Sun) " + "(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) " + "\\d+ \\d+:\\d+:\\d+ \\d+)(\\s+)\\[([\\dxa-fA-F]+)\\]" + "statistics\\(\\): ([\\S]+)(\\s*): (\\d+)(.*)", +- 0, &error, &errptr, NULL); +- hints_oops = pcre_study (reg_oops, 0, &error); ++ PCRE2_ZERO_TERMINATED, 0, &error, &errptr, NULL); + } + + static void + ccze_oops_shutdown (void) + { +- free (reg_oops); +- free (hints_oops); ++ pcre2_code_free (reg_oops); + } + + static int + ccze_oops_handle (const char *str, size_t length, char **rest) + { +- int match, offsets[99]; ++ pcre2_match_data *offsets; + +- if ((match = pcre_exec (reg_oops, hints_oops, str, length, +- 0, 0, offsets, 99)) >= 0) ++ offsets = pcre2_match_data_create (99, NULL); ++ if (pcre2_match (reg_oops, str, length, 0, 0, offsets, NULL) >= 0) + { +- *rest = ccze_oops_process (str, offsets, match); ++ *rest = ccze_oops_process (offsets); ++ pcre2_match_data_free (offsets); + return 1; + } ++ ++ pcre2_match_data_free (offsets); + + return 0; + } +--- ccze.orig/src/mod_php.c ++++ ccze/src/mod_php.c +@@ -29,23 +29,23 @@ + static void ccze_php_shutdown (void); + static int ccze_php_handle (const char *str, size_t length, char **rest); + +-static pcre *reg_php; +-static pcre_extra *hints_php; ++static pcre2_code *reg_php; + + static char * +-ccze_php_process (const char *str, int *offsets, int match) ++ccze_php_process (pcre2_match_data *offsets) + { + char *date = NULL, *rest = NULL; ++ size_t l; + +- pcre_get_substring (str, offsets, match, 1, (const char **)&date); +- pcre_get_substring (str, offsets, match, 2, (const char **)&rest); ++ pcre2_substring_get_bynumber (offsets, 1, (unsigned char **)&date, &l); ++ pcre2_substring_get_bynumber (offsets, 2, (unsigned char **)&rest, &l); + + ccze_addstr (CCZE_COLOR_DATE, date); + ccze_space (); + ccze_addstr (CCZE_COLOR_KEYWORD, "PHP"); + ccze_space (); + +- free (date); ++ pcre2_substring_free (date); + + return rest; + } +@@ -53,32 +53,33 @@ + static void + ccze_php_setup (void) + { +- const char *error; +- int errptr; ++ int error; ++ size_t errptr; + +- reg_php = pcre_compile ("^(\\[\\d+-...-\\d+ \\d+:\\d+:\\d+\\]) PHP (.*)$", +- 0, &error, &errptr, NULL); +- hints_php = pcre_study (reg_php, 0, &error); ++ reg_php = pcre2_compile ("^(\\[\\d+-...-\\d+ \\d+:\\d+:\\d+\\]) PHP (.*)$", ++ PCRE2_ZERO_TERMINATED, 0, &error, &errptr, NULL); + } + + static void + ccze_php_shutdown (void) + { +- free (reg_php); +- free (hints_php); ++ pcre2_code_free (reg_php); + } + + static int + ccze_php_handle (const char *str, size_t length, char **rest) + { +- int match, offsets[99]; ++ pcre2_match_data *offsets; + +- if ((match = pcre_exec (reg_php, hints_php, str, length, +- 0, 0, offsets, 99)) >= 0) ++ offsets = pcre2_match_data_create (99, NULL); ++ if (pcre2_match (reg_php, str, length, 0, 0, offsets, NULL) >= 0) + { +- *rest = ccze_php_process (str, offsets, match); ++ *rest = ccze_php_process (offsets); ++ pcre2_match_data_free (offsets); + return 1; + } ++ ++ pcre2_match_data_free (offsets); + + return 0; + } +--- ccze.orig/src/mod_postfix.c ++++ ccze/src/mod_postfix.c +@@ -29,7 +29,7 @@ + static void ccze_postfix_shutdown (void); + static int ccze_postfix_handle (const char *str, size_t length, char **rest); + +-static pcre *reg_postfix; ++static pcre2_code *reg_postfix; + + static int + _ccze_postfix_process_one (const char *s, char **rest) +@@ -53,14 +53,15 @@ + } + + static char * +-ccze_postfix_process (const char *str, int *offsets, int match) ++ccze_postfix_process (pcre2_match_data *offsets) + { + char *spoolid, *s, *rest, *tmp; + int r; ++ size_t l; + +- pcre_get_substring (str, offsets, match, 1, (const char **)&spoolid); +- pcre_get_substring (str, offsets, match, 2, (const char **)&s); +- pcre_get_substring (str, offsets, match, 4, (const char **)&rest); ++ pcre2_substring_get_bynumber (offsets, 1, (unsigned char **)&spoolid, &l); ++ pcre2_substring_get_bynumber (offsets, 2, (unsigned char **)&s, &l); ++ pcre2_substring_get_bynumber (offsets, 4, (unsigned char **)&rest, &l); + + ccze_addstr (CCZE_COLOR_UNIQN, spoolid); + ccze_addstr (CCZE_COLOR_DEFAULT, ": "); +@@ -77,6 +78,10 @@ + if (tmp) + ccze_addstr (CCZE_COLOR_DEFAULT, ","); + } while (!r && (tmp != NULL)); ++ ++ pcre2_substring_free (spoolid); ++ pcre2_substring_free (s); ++ pcre2_substring_free (rest); + + return NULL; + } +@@ -84,35 +89,38 @@ + static void + ccze_postfix_setup (void) + { +- const char *error; +- int errptr; ++ int error; ++ size_t errptr; + +- reg_postfix = pcre_compile ++ reg_postfix = pcre2_compile + ("^([\\dA-F]+): ((client|to|message-id|uid|resent-message-id|from)(=.*))", +- 0, &error, &errptr, NULL); ++ PCRE2_ZERO_TERMINATED, 0, &error, &errptr, NULL); + } + + static void + ccze_postfix_shutdown (void) + { +- free (reg_postfix); ++ pcre2_code_free (reg_postfix); + } + + static int + ccze_postfix_handle (const char *str, size_t length, char **rest) + { +- int match, offsets[99]; ++ pcre2_match_data *offsets; + +- if ((match = pcre_exec (reg_postfix, NULL, str, length, +- 0, 0, offsets, 99)) >= 0) ++ offsets = pcre2_match_data_create (99, NULL); ++ if (pcre2_match (reg_postfix, str, length, 0, 0, offsets, NULL) >= 0) + { + if (rest) +- *rest = ccze_postfix_process (str, offsets, match); ++ *rest = ccze_postfix_process (offsets); + else +- ccze_postfix_process (str, offsets, match); ++ ccze_postfix_process (offsets); + ++ pcre2_match_data_free (offsets); + return 1; + } ++ ++ pcre2_match_data_free (offsets); + + return 0; + } +--- ccze.orig/src/mod_procmail.c ++++ ccze/src/mod_procmail.c +@@ -27,44 +27,49 @@ + static void ccze_procmail_shutdown (void); + static int ccze_procmail_handle (const char *str, size_t length, char **rest); + +-static pcre *reg_procmail; +-static pcre_extra *hints_procmail; ++static pcre2_code *reg_procmail; + + static char * +-ccze_procmail_process (const char *str, int *offsets, int match) ++ccze_procmail_process (const char *str, pcre2_match_data *offsets) + { + char *header = NULL, *value = NULL, *space1 = NULL; + char *space2 = NULL, *extra = NULL; + int handled = 0; ++ size_t l; + ccze_color_t col = CCZE_COLOR_UNKNOWN; + +- pcre_get_substring (str, offsets, match, 1, (const char **)&space1); +- pcre_get_substring (str, offsets, match, 2, (const char **)&header); +- pcre_get_substring (str, offsets, match, 3, (const char **)&value); +- pcre_get_substring (str, offsets, match, 4, (const char **)&space2); +- pcre_get_substring (str, offsets, match, 5, (const char **)&extra); ++ pcre2_substring_get_bynumber (offsets, 1, (unsigned char **)&space1, &l); ++ pcre2_substring_get_bynumber (offsets, 2, (unsigned char **)&header, &l); ++ pcre2_substring_get_bynumber (offsets, 3, (unsigned char **)&value, &l); ++ pcre2_substring_get_bynumber (offsets, 4, (unsigned char **)&space2, &l); ++ pcre2_substring_get_bynumber (offsets, 5, (unsigned char **)&extra, &l); + +- if (!strcasecmp ("from", header) || !strcasecmp (">from", header)) ++ if (header) + { +- col = CCZE_COLOR_EMAIL; +- handled = 1; +- } +- if (!strcasecmp ("subject:", header)) +- { +- col = CCZE_COLOR_SUBJECT; +- handled = 1; +- } +- if (!strcasecmp ("folder:", header)) +- { +- col = CCZE_COLOR_DIR; +- handled = 1; ++ if (!strcasecmp ("from", header) || !strcasecmp (">from", header)) ++ { ++ col = CCZE_COLOR_EMAIL; ++ handled = 1; ++ } ++ if (!strcasecmp ("subject:", header)) ++ { ++ col = CCZE_COLOR_SUBJECT; ++ handled = 1; ++ } ++ if (!strcasecmp ("folder:", header)) ++ { ++ col = CCZE_COLOR_DIR; ++ handled = 1; ++ } + } + + if (!handled) + { +- free (header); +- free (value); +- free (extra); ++ pcre2_substring_free (header); ++ pcre2_substring_free (value); ++ pcre2_substring_free (extra); ++ pcre2_substring_free (space1); ++ pcre2_substring_free (space2); + return strdup (str); + } + +@@ -85,9 +90,11 @@ + ccze_addstr (col, extra); + ccze_newline(); + +- free (extra); +- free (header); +- free (value); ++ pcre2_substring_free (extra); ++ pcre2_substring_free (header); ++ pcre2_substring_free (value); ++ pcre2_substring_free (space1); ++ pcre2_substring_free (space2); + + return NULL; + } +@@ -95,33 +102,34 @@ + static void + ccze_procmail_setup (void) + { +- const char *error; +- int errptr; ++ int error; ++ size_t errptr; + +- reg_procmail = pcre_compile +- ("^(\\s*)(>?From|Subject:|Folder:)?\\s(\\S+)(\\s+)?(.*)", 0, +- &error, &errptr, NULL); +- hints_procmail = pcre_study (reg_procmail, 0, &error); ++ reg_procmail = pcre2_compile ++ ("^(\\s*)(>?From|Subject:|Folder:)?\\s(\\S+)(\\s+)?(.*)", ++ PCRE2_ZERO_TERMINATED, 0, &error, &errptr, NULL); + } + + static void + ccze_procmail_shutdown (void) + { +- free (reg_procmail); +- free (hints_procmail); ++ pcre2_code_free (reg_procmail); + } + + static int + ccze_procmail_handle (const char *str, size_t length, char **rest) + { +- int match, offsets[99]; ++ pcre2_match_data *offsets; + +- if ((match = pcre_exec (reg_procmail, hints_procmail, str, length, +- 0, 0, offsets, 99)) >= 0) ++ offsets = pcre2_match_data_create (99, NULL); ++ if (pcre2_match (reg_procmail, str, length, 0, 0, offsets, NULL) >= 0) + { +- *rest = ccze_procmail_process (str, offsets, match); ++ *rest = ccze_procmail_process (str, offsets); ++ pcre2_match_data_free (offsets); + return 1; + } ++ ++ pcre2_match_data_free (offsets); + + return 0; + } +--- ccze.orig/src/mod_proftpd.c ++++ ccze/src/mod_proftpd.c +@@ -27,22 +27,22 @@ + static void ccze_proftpd_shutdown (void); + static int ccze_proftpd_handle (const char *str, size_t length, char **rest); + +-static pcre *reg_proftpd_access, *reg_proftpd_auth; +-static pcre_extra *hints_proftpd_access, *hints_proftpd_auth; ++static pcre2_code *reg_proftpd_access, *reg_proftpd_auth; + + static char * +-ccze_proftpd_access_log_process (const char *str, int *offsets, int match) ++ccze_proftpd_access_log_process (pcre2_match_data *offsets) + { + char *host, *user, *auser, *date, *command, *file, *ftpcode, *size; ++ size_t l; + +- pcre_get_substring (str, offsets, match, 1, (const char **)&host); +- pcre_get_substring (str, offsets, match, 2, (const char **)&user); +- pcre_get_substring (str, offsets, match, 3, (const char **)&auser); +- pcre_get_substring (str, offsets, match, 4, (const char **)&date); +- pcre_get_substring (str, offsets, match, 5, (const char **)&command); +- pcre_get_substring (str, offsets, match, 6, (const char **)&file); +- pcre_get_substring (str, offsets, match, 7, (const char **)&ftpcode); +- pcre_get_substring (str, offsets, match, 8, (const char **)&size); ++ pcre2_substring_get_bynumber (offsets, 1, (unsigned char **)&host, &l); ++ pcre2_substring_get_bynumber (offsets, 2, (unsigned char **)&user, &l); ++ pcre2_substring_get_bynumber (offsets, 3, (unsigned char **)&auser, &l); ++ pcre2_substring_get_bynumber (offsets, 4, (unsigned char **)&date, &l); ++ pcre2_substring_get_bynumber (offsets, 5, (unsigned char **)&command, &l); ++ pcre2_substring_get_bynumber (offsets, 6, (unsigned char **)&file, &l); ++ pcre2_substring_get_bynumber (offsets, 7, (unsigned char **)&ftpcode, &l); ++ pcre2_substring_get_bynumber (offsets, 8, (unsigned char **)&size, &l); + + ccze_addstr (CCZE_COLOR_HOST, host); + ccze_space (); +@@ -69,30 +69,31 @@ + + ccze_newline (); + +- free (size); +- free (ftpcode); +- free (file); +- free (command); +- free (date); +- free (auser); +- free (user); +- free (host); ++ pcre2_substring_free (size); ++ pcre2_substring_free (ftpcode); ++ pcre2_substring_free (file); ++ pcre2_substring_free (command); ++ pcre2_substring_free (date); ++ pcre2_substring_free (auser); ++ pcre2_substring_free (user); ++ pcre2_substring_free (host); + + return NULL; + } + + static char * +-ccze_proftpd_auth_log_process (const char *str, int *offsets, int match) ++ccze_proftpd_auth_log_process (pcre2_match_data *offsets) + { + char *servhost, *pid, *remhost, *date, *cmd, *value, *ftpcode; ++ size_t l; + +- pcre_get_substring (str, offsets, match, 1, (const char **)&servhost); +- pcre_get_substring (str, offsets, match, 2, (const char **)&pid); +- pcre_get_substring (str, offsets, match, 3, (const char **)&remhost); +- pcre_get_substring (str, offsets, match, 4, (const char **)&date); +- pcre_get_substring (str, offsets, match, 5, (const char **)&cmd); +- pcre_get_substring (str, offsets, match, 6, (const char **)&value); +- pcre_get_substring (str, offsets, match, 7, (const char **)&ftpcode); ++ pcre2_substring_get_bynumber (offsets, 1, (unsigned char **)&servhost, &l); ++ pcre2_substring_get_bynumber (offsets, 2, (unsigned char **)&pid, &l); ++ pcre2_substring_get_bynumber (offsets, 3, (unsigned char **)&remhost, &l); ++ pcre2_substring_get_bynumber (offsets, 4, (unsigned char **)&date, &l); ++ pcre2_substring_get_bynumber (offsets, 5, (unsigned char **)&cmd, &l); ++ pcre2_substring_get_bynumber (offsets, 6, (unsigned char **)&value, &l); ++ pcre2_substring_get_bynumber (offsets, 7, (unsigned char **)&ftpcode, &l); + + ccze_addstr (CCZE_COLOR_HOST, servhost); + ccze_space (); +@@ -118,13 +119,13 @@ + + ccze_newline (); + +- free (ftpcode); +- free (value); +- free (cmd); +- free (date); +- free (remhost); +- free (pid); +- free (servhost); ++ pcre2_substring_free (ftpcode); ++ pcre2_substring_free (value); ++ pcre2_substring_free (cmd); ++ pcre2_substring_free (date); ++ pcre2_substring_free (remhost); ++ pcre2_substring_free (pid); ++ pcre2_substring_free (servhost); + + return NULL; + } +@@ -132,49 +133,50 @@ + static void + ccze_proftpd_setup (void) + { +- const char *error; +- int errptr; ++ int error; ++ size_t errptr; + +- reg_proftpd_access = pcre_compile ++ reg_proftpd_access = pcre2_compile + ("^(\\d+\\.\\d+\\.\\d+\\.\\d+) (\\S+) (\\S+) " + "\\[(\\d{2}/.{3}/\\d{4}:\\d{2}:\\d{2}:\\d{2} [\\-\\+]\\d{4})\\] " +- "\"([A-Z]+) ([^\"]+)\" (\\d{3}) (-|\\d+)", 0, &error, &errptr, NULL); +- hints_proftpd_access = pcre_study (reg_proftpd_access, 0, &error); ++ "\"([A-Z]+) ([^\"]+)\" (\\d{3}) (-|\\d+)", PCRE2_ZERO_TERMINATED, ++ 0, &error, &errptr, NULL); + +- reg_proftpd_auth = pcre_compile ++ reg_proftpd_auth = pcre2_compile + ("^(\\S+) ftp server \\[(\\d+)\\] (\\d+\\.\\d+\\.\\d+\\.\\d+) " + "\\[(\\d{2}/.{3}/\\d{4}:\\d{2}:\\d{2}:\\d{2} [\\-\\+]\\d{4})\\] " +- "\"([A-Z]+) ([^\"]+)\" (\\d{3})", 0, &error, &errptr, NULL); +- hints_proftpd_auth = pcre_study (reg_proftpd_auth, 0, &error); ++ "\"([A-Z]+) ([^\"]+)\" (\\d{3})", PCRE2_ZERO_TERMINATED, ++ 0, &error, &errptr, NULL); + } + + static void + ccze_proftpd_shutdown (void) + { +- free (reg_proftpd_auth); +- free (hints_proftpd_auth); +- free (reg_proftpd_access); +- free (hints_proftpd_access); ++ pcre2_code_free (reg_proftpd_auth); ++ pcre2_code_free (reg_proftpd_access); + } + + static int + ccze_proftpd_handle (const char *str, size_t length, char **rest) + { +- int match, offsets[99]; ++ pcre2_match_data *offsets; + +- if ((match = pcre_exec (reg_proftpd_access, hints_proftpd_access, +- str, length, 0, 0, offsets, 99)) >= 0) ++ offsets = pcre2_match_data_create (99, NULL); ++ if (pcre2_match (reg_proftpd_access, str, length, 0, 0, offsets, NULL) >= 0) + { +- *rest = ccze_proftpd_access_log_process (str, offsets, match); ++ *rest = ccze_proftpd_access_log_process (offsets); ++ pcre2_match_data_free (offsets); + return 1; + } +- if ((match = pcre_exec (reg_proftpd_auth, hints_proftpd_auth, +- str, length, 0, 0, offsets, 99)) >= 0) ++ if (pcre2_match (reg_proftpd_auth, str, length, 0, 0, offsets, NULL) >= 0) + { +- *rest = ccze_proftpd_auth_log_process (str, offsets, match); ++ *rest = ccze_proftpd_auth_log_process (offsets); ++ pcre2_match_data_free (offsets); + return 1; + } + ++ pcre2_match_data_free (offsets); ++ + return 0; + } + +--- ccze.orig/src/mod_squid.c ++++ ccze/src/mod_squid.c +@@ -27,8 +27,7 @@ + static void ccze_squid_shutdown (void); + static int ccze_squid_handle (const char *str, size_t length, char **rest); + +-static pcre *reg_squid_access, *reg_squid_store, *reg_squid_cache; +-static pcre_extra *hints_squid_access, *hints_squid_store, *hints_squid_cache; ++static pcre2_code *reg_squid_access, *reg_squid_store, *reg_squid_cache; + + static ccze_color_t + _ccze_proxy_action (const char *action) +@@ -82,24 +81,25 @@ + } + + static char * +-ccze_squid_access_log_process (const char *str, int *offsets, int match) ++ccze_squid_access_log_process (pcre2_match_data *offsets) + { + char *date, *espace, *elaps, *host, *action, *httpc, *gsize; + char *method, *uri, *ident, *hierar, *fhost, *ctype; ++ size_t l; + +- pcre_get_substring (str, offsets, match, 1, (const char **)&date); +- pcre_get_substring (str, offsets, match, 2, (const char **)&espace); +- pcre_get_substring (str, offsets, match, 3, (const char **)&elaps); +- pcre_get_substring (str, offsets, match, 4, (const char **)&host); +- pcre_get_substring (str, offsets, match, 5, (const char **)&action); +- pcre_get_substring (str, offsets, match, 6, (const char **)&httpc); +- pcre_get_substring (str, offsets, match, 7, (const char **)&gsize); +- pcre_get_substring (str, offsets, match, 8, (const char **)&method); +- pcre_get_substring (str, offsets, match, 9, (const char **)&uri); +- pcre_get_substring (str, offsets, match, 10, (const char **)&ident); +- pcre_get_substring (str, offsets, match, 11, (const char **)&hierar); +- pcre_get_substring (str, offsets, match, 12, (const char **)&fhost); +- pcre_get_substring (str, offsets, match, 13, (const char **)&ctype); ++ pcre2_substring_get_bynumber (offsets, 1, (unsigned char **)&date, &l); ++ pcre2_substring_get_bynumber (offsets, 2, (unsigned char **)&espace, &l); ++ pcre2_substring_get_bynumber (offsets, 3, (unsigned char **)&elaps, &l); ++ pcre2_substring_get_bynumber (offsets, 4, (unsigned char **)&host, &l); ++ pcre2_substring_get_bynumber (offsets, 5, (unsigned char **)&action, &l); ++ pcre2_substring_get_bynumber (offsets, 6, (unsigned char **)&httpc, &l); ++ pcre2_substring_get_bynumber (offsets, 7, (unsigned char **)&gsize, &l); ++ pcre2_substring_get_bynumber (offsets, 8, (unsigned char **)&method, &l); ++ pcre2_substring_get_bynumber (offsets, 9, (unsigned char **)&uri, &l); ++ pcre2_substring_get_bynumber (offsets, 10, (unsigned char **)&ident, &l); ++ pcre2_substring_get_bynumber (offsets, 11, (unsigned char **)&hierar, &l); ++ pcre2_substring_get_bynumber (offsets, 12, (unsigned char **)&fhost, &l); ++ pcre2_substring_get_bynumber (offsets, 13, (unsigned char **)&ctype, &l); + + ccze_print_date (date); + ccze_addstr (CCZE_COLOR_DEFAULT, espace); +@@ -135,63 +135,65 @@ + + ccze_newline (); + +- free (date); +- free (espace); +- free (elaps); +- free (host); +- free (action); +- free (httpc); +- free (gsize); +- free (method); +- free (uri); +- free (ident); +- free (hierar); +- free (fhost); +- free (ctype); ++ pcre2_substring_free (date); ++ pcre2_substring_free (espace); ++ pcre2_substring_free (elaps); ++ pcre2_substring_free (host); ++ pcre2_substring_free (action); ++ pcre2_substring_free (httpc); ++ pcre2_substring_free (gsize); ++ pcre2_substring_free (method); ++ pcre2_substring_free (uri); ++ pcre2_substring_free (ident); ++ pcre2_substring_free (hierar); ++ pcre2_substring_free (fhost); ++ pcre2_substring_free (ctype); + + return NULL; + } + + static char * +-ccze_squid_cache_log_process (const char *str, int *offsets, int match) ++ccze_squid_cache_log_process (pcre2_match_data *offsets) + { + char *date, *other; ++ size_t l; + +- pcre_get_substring (str, offsets, match, 1, (const char **)&date); +- pcre_get_substring (str, offsets, match, 3, (const char **)&other); ++ pcre2_substring_get_bynumber (offsets, 1, (unsigned char **)&date, &l); ++ pcre2_substring_get_bynumber (offsets, 3, (unsigned char **)&other, &l); + + ccze_addstr (CCZE_COLOR_DATE, date); + ccze_space(); + +- free (date); ++ pcre2_substring_free (date); + return other; + } + + static char * +-ccze_squid_store_log_process (const char *str, int *offsets, int match) ++ccze_squid_store_log_process (pcre2_match_data *offsets) + { + char *date, *tag, *swapnum, *swapname, *swapsum, *space1, *hcode; + char *hdate, *lmdate, *expire, *ctype, *size, *read, *method; + char *uri, *space2, *space3, *space4; ++ size_t l; + +- pcre_get_substring (str, offsets, match, 1, (const char **)&date); +- pcre_get_substring (str, offsets, match, 2, (const char **)&tag); +- pcre_get_substring (str, offsets, match, 3, (const char **)&swapnum); +- pcre_get_substring (str, offsets, match, 4, (const char **)&swapname); +- pcre_get_substring (str, offsets, match, 5, (const char **)&swapsum); +- pcre_get_substring (str, offsets, match, 6, (const char **)&space1); +- pcre_get_substring (str, offsets, match, 7, (const char **)&hcode); +- pcre_get_substring (str, offsets, match, 8, (const char **)&space2); +- pcre_get_substring (str, offsets, match, 9, (const char **)&hdate); +- pcre_get_substring (str, offsets, match, 10, (const char **)&space3); +- pcre_get_substring (str, offsets, match, 11, (const char **)&lmdate); +- pcre_get_substring (str, offsets, match, 12, (const char **)&space4); +- pcre_get_substring (str, offsets, match, 13, (const char **)&expire); +- pcre_get_substring (str, offsets, match, 14, (const char **)&ctype); +- pcre_get_substring (str, offsets, match, 15, (const char **)&size); +- pcre_get_substring (str, offsets, match, 16, (const char **)&read); +- pcre_get_substring (str, offsets, match, 17, (const char **)&method); +- pcre_get_substring (str, offsets, match, 18, (const char **)&uri); ++ pcre2_substring_get_bynumber (offsets, 1, (unsigned char **)&date, &l); ++ pcre2_substring_get_bynumber (offsets, 2, (unsigned char **)&tag, &l); ++ pcre2_substring_get_bynumber (offsets, 3, (unsigned char **)&swapnum, &l); ++ pcre2_substring_get_bynumber (offsets, 4, (unsigned char **)&swapname, &l); ++ pcre2_substring_get_bynumber (offsets, 5, (unsigned char **)&swapsum, &l); ++ pcre2_substring_get_bynumber (offsets, 6, (unsigned char **)&space1, &l); ++ pcre2_substring_get_bynumber (offsets, 7, (unsigned char **)&hcode, &l); ++ pcre2_substring_get_bynumber (offsets, 8, (unsigned char **)&space2, &l); ++ pcre2_substring_get_bynumber (offsets, 9, (unsigned char **)&hdate, &l); ++ pcre2_substring_get_bynumber (offsets, 10, (unsigned char **)&space3, &l); ++ pcre2_substring_get_bynumber (offsets, 11, (unsigned char **)&lmdate, &l); ++ pcre2_substring_get_bynumber (offsets, 12, (unsigned char **)&space4, &l); ++ pcre2_substring_get_bynumber (offsets, 13, (unsigned char **)&expire, &l); ++ pcre2_substring_get_bynumber (offsets, 14, (unsigned char **)&ctype, &l); ++ pcre2_substring_get_bynumber (offsets, 15, (unsigned char **)&size, &l); ++ pcre2_substring_get_bynumber (offsets, 16, (unsigned char **)&read, &l); ++ pcre2_substring_get_bynumber (offsets, 17, (unsigned char **)&method, &l); ++ pcre2_substring_get_bynumber (offsets, 18, (unsigned char **)&uri, &l); + + ccze_print_date (date); + ccze_space(); +@@ -223,24 +225,24 @@ + + ccze_newline (); + +- free (date); +- free (tag); +- free (swapnum); +- free (swapname); +- free (swapsum); +- free (space1); +- free (hcode); +- free (hdate); +- free (lmdate); +- free (expire); +- free (ctype); +- free (size); +- free (read); +- free (method); +- free (uri); +- free (space2); +- free (space3); +- free (space4); ++ pcre2_substring_free (date); ++ pcre2_substring_free (tag); ++ pcre2_substring_free (swapnum); ++ pcre2_substring_free (swapname); ++ pcre2_substring_free (swapsum); ++ pcre2_substring_free (space1); ++ pcre2_substring_free (hcode); ++ pcre2_substring_free (hdate); ++ pcre2_substring_free (lmdate); ++ pcre2_substring_free (expire); ++ pcre2_substring_free (ctype); ++ pcre2_substring_free (size); ++ pcre2_substring_free (read); ++ pcre2_substring_free (method); ++ pcre2_substring_free (uri); ++ pcre2_substring_free (space2); ++ pcre2_substring_free (space3); ++ pcre2_substring_free (space4); + + return NULL; + } +@@ -248,65 +250,62 @@ + static void + ccze_squid_setup (void) + { +- const char *error; +- int errptr; ++ int error; ++ size_t errptr; + +- reg_squid_access = pcre_compile ++ reg_squid_access = pcre2_compile + ("^(\\d{9,10}\\.\\d{3})(\\s+)(\\d+)\\s(\\S+)\\s(\\w+)\\/(\\d{3})" + "\\s(\\d+)\\s(\\w+)\\s(\\S+)\\s(\\S+)\\s(\\w+)\\/([\\d\\.]+|-)\\s(.*)", +- 0, &error, &errptr, NULL); +- hints_squid_access = pcre_study (reg_squid_access, 0, &error); ++ PCRE2_ZERO_TERMINATED, 0, &error, &errptr, NULL); + +- reg_squid_cache = pcre_compile +- ("^(\\d{4}\\/\\d{2}\\/\\d{2}\\s(\\d{2}:){2}\\d{2}\\|)\\s(.*)$", 0, +- &error, &errptr, NULL); +- hints_squid_cache = pcre_study (reg_squid_cache, 0, &error); ++ reg_squid_cache = pcre2_compile ++ ("^(\\d{4}\\/\\d{2}\\/\\d{2}\\s(\\d{2}:){2}\\d{2}\\|)\\s(.*)$", ++ PCRE2_ZERO_TERMINATED, 0, &error, &errptr, NULL); + +- reg_squid_store = pcre_compile ++ reg_squid_store = pcre2_compile + ("^([\\d\\.]+)\\s(\\w+)\\s(\\-?[\\dA-F]+)\\s+(\\S+)\\s([\\dA-F]+)" + "(\\s+)(\\d{3}|\\?)(\\s+)(\\-?[\\d\\?]+)(\\s+)(\\-?[\\d\\?]+)(\\s+)" + "(\\-?[\\d\\?]+)\\s(\\S+)\\s(\\-?[\\d|\\?]+)\\/(\\-?[\\d|\\?]+)\\s" +- "(\\S+)\\s(.*)", 0, &error, &errptr, NULL); +- hints_squid_store = pcre_study (reg_squid_store, 0, &error); ++ "(\\S+)\\s(.*)", PCRE2_ZERO_TERMINATED, 0, &error, &errptr, NULL); + } + + static void + ccze_squid_shutdown (void) + { +- free (reg_squid_access); +- free (hints_squid_access); +- free (reg_squid_cache); +- free (hints_squid_cache); +- free (reg_squid_store); +- free (hints_squid_store); ++ pcre2_code_free (reg_squid_access); ++ pcre2_code_free (reg_squid_cache); ++ pcre2_code_free (reg_squid_store); + } + + static int + ccze_squid_handle (const char *str, size_t length, char **rest) + { +- int match, offsets[99]; ++ pcre2_match_data *offsets; + +- if ((match = pcre_exec (reg_squid_access, hints_squid_access, str, +- length, 0, 0, offsets, 99)) >= 0) ++ offsets = pcre2_match_data_create (99, NULL); ++ if (pcre2_match (reg_squid_access, str, length, 0, 0, offsets, NULL) >= 0) + { +- *rest = ccze_squid_access_log_process (str, offsets, match); ++ *rest = ccze_squid_access_log_process (offsets); ++ pcre2_match_data_free (offsets); + return 1; + } + +- if ((match = pcre_exec (reg_squid_store, hints_squid_store, str, +- length, 0, 0, offsets, 99)) >= 0) ++ if (pcre2_match (reg_squid_store, str, length, 0, 0, offsets, NULL) >= 0) + { +- *rest = ccze_squid_store_log_process (str, offsets, match); ++ *rest = ccze_squid_store_log_process (offsets); ++ pcre2_match_data_free (offsets); + return 1; + } + +- if ((match = pcre_exec (reg_squid_cache, hints_squid_cache, str, +- length, 0, 0, offsets, 99)) >= 0) ++ if (pcre2_match (reg_squid_cache, str, length, 0, 0, offsets, NULL) >= 0) + { +- *rest = ccze_squid_cache_log_process (str, offsets, match); ++ *rest = ccze_squid_cache_log_process (offsets); ++ pcre2_match_data_free (offsets); + return 1; + } + ++ pcre2_match_data_free (offsets); ++ + return 0; + } + +--- ccze.orig/src/mod_sulog.c ++++ ccze/src/mod_sulog.c +@@ -26,19 +26,19 @@ + static void ccze_sulog_shutdown (void); + static int ccze_sulog_handle (const char *str, size_t length, char **rest); + +-static pcre *reg_sulog; +-static pcre_extra *hints_sulog; ++static pcre2_code *reg_sulog; + + static char * +-ccze_sulog_process (const char *str, int *offsets, int match) ++ccze_sulog_process (pcre2_match_data *offsets) + { + char *date, *islogin, *tty, *fromuser, *touser; ++ size_t l; + +- pcre_get_substring (str, offsets, match, 1, (const char **)&date); +- pcre_get_substring (str, offsets, match, 2, (const char **)&islogin); +- pcre_get_substring (str, offsets, match, 3, (const char **)&tty); +- pcre_get_substring (str, offsets, match, 4, (const char **)&fromuser); +- pcre_get_substring (str, offsets, match, 5, (const char **)&touser); ++ pcre2_substring_get_bynumber (offsets, 1, (unsigned char **)&date, &l); ++ pcre2_substring_get_bynumber (offsets, 2, (unsigned char **)&islogin, &l); ++ pcre2_substring_get_bynumber (offsets, 3, (unsigned char **)&tty, &l); ++ pcre2_substring_get_bynumber (offsets, 4, (unsigned char **)&fromuser, &l); ++ pcre2_substring_get_bynumber (offsets, 5, (unsigned char **)&touser, &l); + + ccze_addstr (CCZE_COLOR_DEFAULT, "SU "); + ccze_addstr (CCZE_COLOR_DATE, date); +@@ -61,11 +61,11 @@ + + ccze_newline (); + +- free (date); +- free (islogin); +- free (tty); +- free (fromuser); +- free (touser); ++ pcre2_substring_free (date); ++ pcre2_substring_free (islogin); ++ pcre2_substring_free (tty); ++ pcre2_substring_free (fromuser); ++ pcre2_substring_free (touser); + + return NULL; + } +@@ -73,33 +73,34 @@ + static void + ccze_sulog_setup (void) + { +- const char *error; +- int errptr; ++ int error; ++ size_t errptr; + +- reg_sulog = pcre_compile ("^SU (\\d{2}\\/\\d{2} \\d{2}:\\d{2}) ([\\+\\-]) " +- "(\\S+) ([^\\-]+)-(.*)$", 0, &error, &errptr, +- NULL); +- hints_sulog = pcre_study (reg_sulog, 0, &error); ++ reg_sulog = pcre2_compile ("^SU (\\d{2}\\/\\d{2} \\d{2}:\\d{2}) ([\\+\\-]) " ++ "(\\S+) ([^\\-]+)-(.*)$", PCRE2_ZERO_TERMINATED, ++ 0, &error, &errptr, NULL); + } + + static void + ccze_sulog_shutdown (void) + { +- free (reg_sulog); +- free (hints_sulog); ++ pcre2_code_free (reg_sulog); + } + + static int + ccze_sulog_handle (const char *str, size_t length, char **rest) + { +- int match, offsets[99]; ++ pcre2_match_data *offsets; + +- if ((match = pcre_exec (reg_sulog, hints_sulog, str, length, +- 0, 0, offsets, 99)) >= 0) ++ offsets = pcre2_match_data_create (99, NULL); ++ if (pcre2_match (reg_sulog, str, length, 0, 0, offsets, NULL) >= 0) + { +- *rest = ccze_sulog_process (str, offsets, match); ++ *rest = ccze_sulog_process (offsets); ++ pcre2_match_data_free (offsets); + return 1; + } ++ ++ pcre2_match_data_free (offsets); + + return 0; + } +--- ccze.orig/src/mod_super.c ++++ ccze/src/mod_super.c +@@ -26,19 +26,19 @@ + static void ccze_super_shutdown (void); + static int ccze_super_handle (const char *str, size_t length, char **rest); + +-static pcre *reg_super; +-static pcre_extra *hints_super; ++static pcre2_code *reg_super; + + static char * +-ccze_super_process (const char *str, int *offsets, int match) ++ccze_super_process (pcre2_match_data *offsets) + { + char *email, *date, *space, *suptag, *other; ++ size_t l; + +- pcre_get_substring (str, offsets, match, 1, (const char **)&email); +- pcre_get_substring (str, offsets, match, 2, (const char **)&date); +- pcre_get_substring (str, offsets, match, 3, (const char **)&space); +- pcre_get_substring (str, offsets, match, 4, (const char **)&suptag); +- pcre_get_substring (str, offsets, match, 5, (const char **)&other); ++ pcre2_substring_get_bynumber (offsets, 1, (unsigned char **)&email, &l); ++ pcre2_substring_get_bynumber (offsets, 2, (unsigned char **)&date, &l); ++ pcre2_substring_get_bynumber (offsets, 3, (unsigned char **)&space, &l); ++ pcre2_substring_get_bynumber (offsets, 4, (unsigned char **)&suptag, &l); ++ pcre2_substring_get_bynumber (offsets, 5, (unsigned char **)&other, &l); + + ccze_addstr (CCZE_COLOR_EMAIL, email); + ccze_space (); +@@ -51,6 +51,12 @@ + ccze_addstr (CCZE_COLOR_PIDB, ")"); + + ccze_newline (); ++ ++ pcre2_substring_free (email); ++ pcre2_substring_free (date); ++ pcre2_substring_free (space); ++ pcre2_substring_free (suptag); ++ pcre2_substring_free (other); + + return NULL; + } +@@ -58,33 +64,35 @@ + static void + ccze_super_setup (void) + { +- const char *error; +- int errptr; ++ int error; ++ size_t errptr; + +- reg_super = pcre_compile ++ reg_super = pcre2_compile + ("^(\\S+)\\s(\\w+\\s+\\w+\\s+\\d+\\s+\\d+:\\d+:\\d+\\s+\\d+)" +- "(\\s+)(\\S+)\\s\\(([^\\)]+)\\)", 0, &error, &errptr, NULL); +- hints_super = pcre_study (reg_super, 0, &error); ++ "(\\s+)(\\S+)\\s\\(([^\\)]+)\\)", PCRE2_ZERO_TERMINATED, ++ 0, &error, &errptr, NULL); + } + + static void + ccze_super_shutdown (void) + { +- free (reg_super); +- free (hints_super); ++ pcre2_code_free (reg_super); + } + + static int + ccze_super_handle (const char *str, size_t length, char **rest) + { +- int match, offsets[99]; ++ pcre2_match_data *offsets; + +- if ((match = pcre_exec (reg_super, hints_super, str, length, +- 0, 0, offsets, 99)) >= 0) ++ offsets = pcre2_match_data_create (99, NULL); ++ if (pcre2_match (reg_super, str, length, 0, 0, offsets, NULL) >= 0) + { +- *rest = ccze_super_process (str, offsets, match); ++ *rest = ccze_super_process (offsets); ++ pcre2_match_data_free (offsets); + return 1; + } ++ ++ pcre2_match_data_free (offsets); + + return 0; + } +--- ccze.orig/src/mod_syslog.c ++++ ccze/src/mod_syslog.c +@@ -29,26 +29,26 @@ + static void ccze_syslog_shutdown (void); + static int ccze_syslog_handle (const char *str, size_t length, char **rest); + +-static pcre *reg_syslog; +-static pcre_extra *hints_syslog; ++static pcre2_code *reg_syslog; + + static char * +-ccze_syslog_process (const char *str, int *offsets, int match) ++ccze_syslog_process (pcre2_match_data *offsets) + { + char *date = NULL, *host = NULL, *send = NULL, *process = NULL; + char *msg = NULL, *pid = NULL, *tmp = NULL, *toret; ++ size_t l; + +- pcre_get_substring (str, offsets, match, 1, (const char **)&date); +- pcre_get_substring (str, offsets, match, 2, (const char **)&host); +- pcre_get_substring (str, offsets, match, 3, (const char **)&send); ++ pcre2_substring_get_bynumber (offsets, 1, (unsigned char **)&date, &l); ++ pcre2_substring_get_bynumber (offsets, 2, (unsigned char **)&host, &l); ++ pcre2_substring_get_bynumber (offsets, 3, (unsigned char **)&send, &l); + + if ((strstr (send, "last message repeated") && strstr (send, "times")) || + (strstr (send, "-- MARK --"))) + msg = strdup (send); + else + { +- pcre_get_substring (str, offsets, match, 4, (const char **)&process); +- pcre_get_substring (str, offsets, match, 5, (const char **)&msg); ++ pcre2_substring_get_bynumber (offsets, 4, (unsigned char **)&process, &l); ++ pcre2_substring_get_bynumber (offsets, 5, (unsigned char **)&msg, &l); + } + + if (process) +@@ -87,12 +87,13 @@ + else + toret = strdup (send); + +- free (date); +- free (host); +- free (send); +- free (process); +- free (msg); ++ pcre2_substring_free (date); ++ pcre2_substring_free (host); ++ pcre2_substring_free (send); ++ pcre2_substring_free (process); ++ pcre2_substring_free (msg); + free (pid); ++ free (tmp); + + return toret; + } +@@ -100,33 +101,34 @@ + static void + ccze_syslog_setup (void) + { +- const char *error; +- int errptr; ++ int error; ++ size_t errptr; + +- reg_syslog = pcre_compile ("^(\\S*\\s{1,2}\\d{1,2}\\s\\d\\d:\\d\\d:\\d\\d)" +- "\\s(\\S+)\\s+((\\S+:?)\\s(.*))$", 0, &error, +- &errptr, NULL); +- hints_syslog = pcre_study (reg_syslog, 0, &error); ++ reg_syslog = pcre2_compile ("^(\\S*\\s{1,2}\\d{1,2}\\s\\d\\d:\\d\\d:\\d\\d)" ++ "\\s(\\S+)\\s+((\\S+:?)\\s(.*))$", ++ PCRE2_ZERO_TERMINATED, 0, &error, &errptr, NULL); + } + + static void + ccze_syslog_shutdown (void) + { +- free (reg_syslog); +- free (hints_syslog); ++ pcre2_code_free (reg_syslog); + } + + static int + ccze_syslog_handle (const char *str, size_t length, char **rest) + { +- int match, offsets[99]; ++ pcre2_match_data *offsets; + +- if ((match = pcre_exec (reg_syslog, hints_syslog, str, length, +- 0, 0, offsets, 99)) >= 0) ++ offsets = pcre2_match_data_create (99, NULL); ++ if (pcre2_match (reg_syslog, str, length, 0, 0, offsets, NULL) >= 0) + { +- *rest = ccze_syslog_process (str, offsets, match); ++ *rest = ccze_syslog_process (offsets); ++ pcre2_match_data_free (offsets); + return 1; + } ++ ++ pcre2_match_data_free (offsets); + + return 0; + } +--- ccze.orig/src/mod_ulogd.c ++++ ccze/src/mod_ulogd.c +@@ -29,7 +29,7 @@ + static void ccze_ulogd_shutdown (void); + static int ccze_ulogd_handle (const char *str, size_t length, char **rest); + +-static pcre *reg_ulogd; ++static pcre2_code *reg_ulogd; + + static char * + ccze_ulogd_process (const char *msg) +@@ -64,34 +64,38 @@ + static void + ccze_ulogd_setup (void) + { +- const char *error; +- int errptr; ++ int error; ++ size_t errptr; + +- reg_ulogd = pcre_compile +- ("(IN|OUT|MAC|TTL|SRC|TOS|PREC|SPT)=", 0, &error, ++ reg_ulogd = pcre2_compile ++ ("(IN|OUT|MAC|TTL|SRC|TOS|PREC|SPT)=", PCRE2_ZERO_TERMINATED, 0, &error, + &errptr, NULL); + } + + static void + ccze_ulogd_shutdown (void) + { +- free (reg_ulogd); ++ pcre2_code_free (reg_ulogd); + } + + static int + ccze_ulogd_handle (const char *str, size_t length, char **rest) + { +- int offsets[10]; ++ pcre2_match_data *offsets; + +- if (pcre_exec (reg_ulogd, NULL, str, length, 0, 0, offsets, 2) >= 0) ++ offsets = pcre2_match_data_create (10, NULL); ++ if (pcre2_match (reg_ulogd, str, length, 0, 0, offsets, NULL) >= 0) + { + if (rest) + *rest = ccze_ulogd_process (str); + else + ccze_ulogd_process (str); + ++ pcre2_match_data_free (offsets); + return 1; + } ++ ++ pcre2_match_data_free (offsets); + + return 0; + } +--- ccze.orig/src/mod_vsftpd.c ++++ ccze/src/mod_vsftpd.c +@@ -26,19 +26,19 @@ + static void ccze_vsftpd_shutdown (void); + static int ccze_vsftpd_handle (const char *str, size_t length, char **rest); + +-static pcre *reg_vsftpd; +-static pcre_extra *hints_vsftpd; ++static pcre2_code *reg_vsftpd; + + static char * +-ccze_vsftpd_log_process (const char *str, int *offsets, int match) ++ccze_vsftpd_log_process (pcre2_match_data *offsets) + { + char *date, *sspace, *pid, *user, *other; ++ size_t l; + +- pcre_get_substring (str, offsets, match, 1, (const char **)&date); +- pcre_get_substring (str, offsets, match, 2, (const char **)&sspace); +- pcre_get_substring (str, offsets, match, 3, (const char **)&pid); +- pcre_get_substring (str, offsets, match, 5, (const char **)&user); +- pcre_get_substring (str, offsets, match, 6, (const char **)&other); ++ pcre2_substring_get_bynumber (offsets, 1, (unsigned char **)&date, &l); ++ pcre2_substring_get_bynumber (offsets, 2, (unsigned char **)&sspace, &l); ++ pcre2_substring_get_bynumber (offsets, 3, (unsigned char **)&pid, &l); ++ pcre2_substring_get_bynumber (offsets, 5, (unsigned char **)&user, &l); ++ pcre2_substring_get_bynumber (offsets, 6, (unsigned char **)&other, &l); + + ccze_addstr (CCZE_COLOR_DATE, date); + ccze_addstr (CCZE_COLOR_DEFAULT, sspace); +@@ -57,10 +57,10 @@ + ccze_space (); + } + +- free (date); +- free (sspace); +- free (pid); +- free (user); ++ pcre2_substring_free (date); ++ pcre2_substring_free (sspace); ++ pcre2_substring_free (pid); ++ pcre2_substring_free (user); + + return other; + } +@@ -68,34 +68,35 @@ + static void + ccze_vsftpd_setup (void) + { +- const char *error; +- int errptr; ++ int error; ++ size_t errptr; + +- reg_vsftpd = pcre_compile ++ reg_vsftpd = pcre2_compile + ("^(\\S+\\s+\\S+\\s+\\d{1,2}\\s+\\d{1,2}:\\d{1,2}:\\d{1,2}\\s+\\d+)" +- "(\\s+)\\[pid (\\d+)\\]\\s+(\\[(\\S+)\\])?\\s*(.*)$", 0, &error, +- &errptr, NULL); +- hints_vsftpd = pcre_study (reg_vsftpd, 0, &error); ++ "(\\s+)\\[pid (\\d+)\\]\\s+(\\[(\\S+)\\])?\\s*(.*)$", ++ PCRE2_ZERO_TERMINATED, 0, &error, &errptr, NULL); + } + + static void + ccze_vsftpd_shutdown (void) + { +- free (reg_vsftpd); +- free (hints_vsftpd); ++ pcre2_code_free (reg_vsftpd); + } + + static int + ccze_vsftpd_handle (const char *str, size_t length, char **rest) + { +- int match, offsets[99]; ++ pcre2_match_data *offsets; + +- if ((match = pcre_exec (reg_vsftpd, hints_vsftpd, str, length, +- 0, 0, offsets, 99)) >= 0) ++ offsets = pcre2_match_data_create (99, NULL); ++ if (pcre2_match (reg_vsftpd, str, length, 0, 0, offsets, NULL) >= 0) + { +- *rest = ccze_vsftpd_log_process (str, offsets, match); ++ *rest = ccze_vsftpd_log_process (offsets); ++ pcre2_match_data_free (offsets); + return 1; + } ++ ++ pcre2_match_data_free (offsets); + + return 0; + } +--- ccze.orig/src/mod_xferlog.c ++++ ccze/src/mod_xferlog.c +@@ -26,30 +26,30 @@ + static void ccze_xferlog_shutdown (void); + static int ccze_xferlog_handle (const char *str, size_t length, char **rest); + +-static pcre *reg_xferlog; +-static pcre_extra *hints_xferlog; ++static pcre2_code *reg_xferlog; + + static char * +-ccze_xferlog_log_process (const char *str, int *offsets, int match) ++ccze_xferlog_log_process (pcre2_match_data *offsets) + { + char *curtime, *transtime, *host, *fsize, *fname, *transtype; + char *actionflag, *direction, *amode, *user, *service, *amethod; + char *auid, *status; ++ size_t l; + +- pcre_get_substring (str, offsets, match, 1, (const char **)&curtime); +- pcre_get_substring (str, offsets, match, 2, (const char **)&transtime); +- pcre_get_substring (str, offsets, match, 3, (const char **)&host); +- pcre_get_substring (str, offsets, match, 4, (const char **)&fsize); +- pcre_get_substring (str, offsets, match, 5, (const char **)&fname); +- pcre_get_substring (str, offsets, match, 6, (const char **)&transtype); +- pcre_get_substring (str, offsets, match, 7, (const char **)&actionflag); +- pcre_get_substring (str, offsets, match, 8, (const char **)&direction); +- pcre_get_substring (str, offsets, match, 9, (const char **)&amode); +- pcre_get_substring (str, offsets, match, 10, (const char **)&user); +- pcre_get_substring (str, offsets, match, 11, (const char **)&service); +- pcre_get_substring (str, offsets, match, 12, (const char **)&amethod); +- pcre_get_substring (str, offsets, match, 13, (const char **)&auid); +- pcre_get_substring (str, offsets, match, 14, (const char **)&status); ++ pcre2_substring_get_bynumber (offsets, 1, (unsigned char **)&curtime, &l); ++ pcre2_substring_get_bynumber (offsets, 2, (unsigned char **)&transtime, &l); ++ pcre2_substring_get_bynumber (offsets, 3, (unsigned char **)&host, &l); ++ pcre2_substring_get_bynumber (offsets, 4, (unsigned char **)&fsize, &l); ++ pcre2_substring_get_bynumber (offsets, 5, (unsigned char **)&fname, &l); ++ pcre2_substring_get_bynumber (offsets, 6, (unsigned char **)&transtype, &l); ++ pcre2_substring_get_bynumber (offsets, 7, (unsigned char **)&actionflag, &l); ++ pcre2_substring_get_bynumber (offsets, 8, (unsigned char **)&direction, &l); ++ pcre2_substring_get_bynumber (offsets, 9, (unsigned char **)&amode, &l); ++ pcre2_substring_get_bynumber (offsets, 10, (unsigned char **)&user, &l); ++ pcre2_substring_get_bynumber (offsets, 11, (unsigned char **)&service, &l); ++ pcre2_substring_get_bynumber (offsets, 12, (unsigned char **)&amethod, &l); ++ pcre2_substring_get_bynumber (offsets, 13, (unsigned char **)&auid, &l); ++ pcre2_substring_get_bynumber (offsets, 14, (unsigned char **)&status, &l); + + ccze_addstr (CCZE_COLOR_DATE, curtime); + ccze_space (); +@@ -81,20 +81,20 @@ + + ccze_newline (); + +- free (curtime); +- free (transtime); +- free (host); +- free (fsize); +- free (fname); +- free (transtype); +- free (actionflag); +- free (direction); +- free (amode); +- free (user); +- free (service); +- free (amethod); +- free (auid); +- free (status); ++ pcre2_substring_free (curtime); ++ pcre2_substring_free (transtime); ++ pcre2_substring_free (host); ++ pcre2_substring_free (fsize); ++ pcre2_substring_free (fname); ++ pcre2_substring_free (transtype); ++ pcre2_substring_free (actionflag); ++ pcre2_substring_free (direction); ++ pcre2_substring_free (amode); ++ pcre2_substring_free (user); ++ pcre2_substring_free (service); ++ pcre2_substring_free (amethod); ++ pcre2_substring_free (auid); ++ pcre2_substring_free (status); + + return NULL; + } +@@ -102,36 +102,37 @@ + static void + ccze_xferlog_setup (void) + { +- const char *error; +- int errptr; ++ int error; ++ size_t errptr; + + /* FIXME: Does not handle spaces in filenames! */ +- reg_xferlog = pcre_compile ++ reg_xferlog = pcre2_compile + ("^(... ... +\\d{1,2} +\\d{1,2}:\\d{1,2}:\\d{1,2} \\d+) (\\d+) ([^ ]+) " + "(\\d+) (\\S+) (a|b) (C|U|T|_) (o|i) (a|g|r) ([^ ]+) ([^ ]+) " +- "(0|1) ([^ ]+) (c|i)", 0, &error, ++ "(0|1) ([^ ]+) (c|i)", PCRE2_ZERO_TERMINATED, 0, &error, + &errptr, NULL); +- hints_xferlog = pcre_study (reg_xferlog, 0, &error); + } + + static void + ccze_xferlog_shutdown (void) + { +- free (reg_xferlog); +- free (hints_xferlog); ++ pcre2_code_free (reg_xferlog); + } + + static int + ccze_xferlog_handle (const char *str, size_t length, char **rest) + { +- int match, offsets[99]; ++ pcre2_match_data *offsets; + +- if ((match = pcre_exec (reg_xferlog, hints_xferlog, str, length, +- 0, 0, offsets, 99)) >= 0) ++ offsets = pcre2_match_data_create (99, NULL); ++ if (pcre2_match (reg_xferlog, str, length, 0, 0, offsets, NULL) >= 0) + { +- *rest = ccze_xferlog_log_process (str, offsets, match); ++ *rest = ccze_xferlog_log_process (offsets); ++ pcre2_match_data_free (offsets); + return 1; + } ++ ++ pcre2_match_data_free (offsets); + + return 0; + } diff --git a/debian/patches/series b/debian/patches/series index 7ee3812..378343e 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -9,3 +9,4 @@ fix_passing_LDFLAGS_for_ccze-cssdump.patch fix_capitalization_typo.patch fix-national-encoding.patch cross.patch +pcre2.patch -- 2.43.0