Skip to content

Commit

Permalink
various: add pcre2 support
Browse files Browse the repository at this point in the history
without removing pcre1 support

Based on a patch from @yselkowitz in cyrusimap#4545
  • Loading branch information
elliefm committed Nov 16, 2023
1 parent cb5bb5c commit e689754
Show file tree
Hide file tree
Showing 11 changed files with 62 additions and 25 deletions.
21 changes: 21 additions & 0 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -667,6 +667,8 @@ AC_ARG_ENABLE(sieve,
[AS_HELP_STRING([--disable-sieve], [disable Sieve support])],,[enable_sieve="yes";])
AC_ARG_ENABLE(pcre,
[AS_HELP_STRING([--disable-pcre], [disable PCRE library])],[cyrus_cv_pcre_utf8="$enableval"])
AC_ARG_ENABLE(pcre2,
[AS_HELP_STRING([--disable-pcre2], [disable PCRE2 library])],[cyrus_cv_pcre2_utf8="$enableval"])

if test "$enable_sieve" != "no"; then
AC_DEFINE(USE_SIEVE,[],[Build in Sieve support?])
Expand Down Expand Up @@ -700,11 +702,29 @@ if test "$enable_pcre" != "no"; then
fi
fi

if test "$enable_pcre2" != "no"; then
AC_CHECK_HEADER(pcre2posix.h)
if test "$ac_cv_header_pcre2posix_h" = "yes"; then
AC_MSG_CHECKING(for utf8 enabled pcre2)
AC_CACHE_VAL(cyrus_cv_pcre2_utf8, AC_TRY_CPP([#include <pcre2posix.h>
#ifndef REG_UTF
#include </nonexistent>
#endif],cyrus_cv_pcre2_utf8=yes,cyrus_cv_pcre2_utf8=no))
AC_MSG_RESULT($cyrus_cv_pcre2_utf8)
else
cyrus_cv_pcre2_utf8="no"
fi
fi

LIB_REGEX=
if test "$cyrus_cv_pcre_utf8" = "yes"; then
LIB_REGEX="-lpcre -lpcreposix";
AC_DEFINE(ENABLE_REGEX, [], [Do we have a regex library?])
AC_DEFINE(HAVE_PCREPOSIX_H, [], [Do we have usable pcre library?])
elif test "$cyrus_cv_pcre2_utf8" = "yes"; then
LIB_REGEX="-lpcre2-posix -lpcre2-8";
AC_DEFINE(ENABLE_REGEX, [], [Do we have a regex library?])
AC_DEFINE(HAVE_PCRE2POSIX_H, [], [Do we have usable pcre2 library?])
else
AC_CHECK_HEADERS(rxposix.h)
if test "$ac_cv_header_rxposix_h" = "yes"; then
Expand Down Expand Up @@ -2469,6 +2489,7 @@ External dependencies:
zlib: $with_zlib
jansson: $with_jansson
pcre: $cyrus_cv_pcre_utf8
pcre2: $cyrus_cv_pcre2_utf8
clamav: $with_clamav
-----------------------
caringo: $with_caringo
Expand Down
2 changes: 1 addition & 1 deletion docsrc/assets/cyrus-build-devpkg.rst
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ automated test facility.
debhelper flex g++ git gperf groff heimdal-dev libbsd-resource-perl libclone-perl libconfig-inifiles-perl \
libcunit1-dev libdatetime-perl libbsd-dev libdb-dev libdigest-sha-perl libencode-imaputf7-perl \ libfile-chdir-perl libglib2.0-dev libical-dev libio-socket-inet6-perl \
libio-stringy-perl libldap2-dev libmysqlclient-dev \
libnet-server-perl libnews-nntpclient-perl libpam0g-dev libpcre3-dev libsasl2-dev \
libnet-server-perl libnews-nntpclient-perl libpam0g-dev libpcre2-dev libsasl2-dev \
libsqlite3-dev libssl-dev libtest-unit-perl libtool libunix-syslog-perl liburi-perl \
libxapian-dev libxml-generator-perl libxml-xpath-perl libxml2-dev libwrap0-dev libzephyr-dev lsb-base \
net-tools perl php-cli php-curl pkg-config po-debconf tcl-dev \
Expand Down
2 changes: 1 addition & 1 deletion docsrc/assets/cyrus-build-reqpkg.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@
sudo apt-get install git build-essential autoconf automake libtool \
pkg-config bison flex libssl-dev libjansson-dev libxml2-dev \
libsqlite3-dev libical-dev libsasl2-dev libpcre3-dev uuid-dev \
libsqlite3-dev libical-dev libsasl2-dev libpcre2-dev uuid-dev \
libicu-dev
sudo apt-get -t jessie-backports install libxapian-dev
3 changes: 2 additions & 1 deletion docsrc/imap/developer/compiling.rst
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ Other
to enable **ptloader** to interface with LDAP directly, for canonification
of login usernames to mailbox names, and verification of login usernames,
ACL subjects and group membership. Configure option: ``--with-ldap``."
`pcre`_, libpcre3-dev, pcre-devel, "yes", "PCRE 1 (8.x) - for utf-8/unicode
`pcre2`_, libpcre2-dev, pcre2-devel, "yes", "PCRE 2 (10.x) - for utf-8/unicode
regular expression matching. Could be replaced by something else in the
future. See `issues/1731`_ for more information."
`perl(Term::ReadLine)`_,,, "no", "Perl library needed by **cyradm**."
Expand All @@ -211,6 +211,7 @@ Other
.. _nghttp2: https://nghttp2.org/
.. _openldap: http://www.openldap.org/
.. _pcre: http://www.pcre.org/
.. _pcre2: http://www.pcre.org/
.. _perl(Term::ReadLine): https://metacpan.org/pod/Term::ReadLine
.. _perl(ExtUtils::MakeMaker): http://search.cpan.org/dist/ExtUtils-MakeMaker/
.. _perl(Pod::POM::View::Restructured): https://metacpan.org/pod/Pod::POM::View::Restructured
Expand Down
2 changes: 1 addition & 1 deletion docsrc/imap/download/upgrade.rst
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ packages) for Debian is::
debhelper flex g++ git gperf groff heimdal-dev libbsd-resource-perl libclone-perl libconfig-inifiles-perl \
libcunit1-dev libdatetime-perl libdb-dev libdigest-sha-perl libencode-imaputf7-perl libfile-chdir-perl \
libglib2.0-dev libical-dev libio-socket-inet6-perl libio-stringy-perl libjansson-dev libldap2-dev \
libmysqlclient-dev libnet-server-perl libnews-nntpclient-perl libpam0g-dev libpcre3-dev libsasl2-dev \
libmysqlclient-dev libnet-server-perl libnews-nntpclient-perl libpam0g-dev libpcre2-dev libsasl2-dev \
libsqlite3-dev libssl-dev libtest-unit-perl libtool libunix-syslog-perl liburi-perl \
libxapian-dev libxml-generator-perl libxml-xpath-perl libxml2-dev libwrap0-dev libzephyr-dev lsb-base \
net-tools perl php-cli php-curl pkg-config po-debconf tcl-dev \
Expand Down
5 changes: 5 additions & 0 deletions imap/cyr_buildinfo.c
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,11 @@ static json_t *buildinfo()
#else
json_object_set_new(dependency, "pcre", json_false());
#endif
#if defined(ENABLE_REGEX) && defined(HAVE_PCRE2POSIX_H)
json_object_set_new(dependency, "pcre2", json_true());
#else
json_object_set_new(dependency, "pcre2", json_false());
#endif
#ifdef HAVE_CLAMAV
json_object_set_new(dependency, "clamav", json_true());
#else
Expand Down
21 changes: 12 additions & 9 deletions lib/util.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,17 +71,20 @@
extern const char CYRUS_VERSION[];

#ifdef ENABLE_REGEX
# ifdef HAVE_PCREPOSIX_H
# if defined HAVE_PCREPOSIX_H
# include <pcre.h>
# include <pcreposix.h>
# else /* !HAVE_PCREPOSIX_H */
# ifdef HAVE_RXPOSIX_H
# include <rxposix.h>
# else /* !HAVE_RXPOSIX_H */
# include <regex.h>
# endif /* HAVE_RXPOSIX_H */
# endif /* HAVE_PCREPOSIX_H */
#endif /* ENABLE_REGEX */
# elif defined HAVE_PCRE2POSIX_H
# ifndef PCRE2POSIX_H_INCLUDED
# include <pcre2posix.h>
# define PCRE2POSIX_H_INCLUDED
# endif
# elif defined HAVE_RXPOSIX_H
# include <rxposix.h>
# else
# include <regex.h>
# endif
#endif

#ifdef HAVE_LIBUUID
#include <uuid/uuid.h>
Expand Down
2 changes: 1 addition & 1 deletion ptclient/test3.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/*
* test ptsmodule_standard_root_dn
* gcc -lz -lpcreposix -I.. -I ../lib ../lib/.libs/util.o ../lib/.libs/xmalloc.o ../lib/.libs/map_shared.o ../lib/.libs/retry.o ../lib/.libs/assert.o test3.c
* gcc -I.. -I ../lib ../lib/.libs/util.o ../lib/.libs/xmalloc.o ../lib/.libs/map_shared.o ../lib/.libs/retry.o ../lib/.libs/assert.o test3.c -lz -lpcre2-posix
*/
#include <assert.h>
#include <stdio.h>
Expand Down
4 changes: 3 additions & 1 deletion sieve/bc_eval.c
Original file line number Diff line number Diff line change
Expand Up @@ -316,9 +316,11 @@ static int regcomp_flags(int comparator, int requires)
{
int cflags = REG_EXTENDED;

#ifdef HAVE_PCREPOSIX_H
/* support UTF8 comparisons */
#if defined HAVE_PCREPOSIX_H
cflags |= REG_UTF8;
#elif defined HAVE_PCRE2POSIX_H
cflags |= REG_UTF;
#endif

if (comparator == B_ASCIICASEMAP) {
Expand Down
21 changes: 12 additions & 9 deletions sieve/comparator.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,17 +47,20 @@
#include <sys/types.h>

#ifdef ENABLE_REGEX
# ifdef HAVE_PCREPOSIX_H
# if defined HAVE_PCREPOSIX_H
# include <pcre.h>
# include <pcreposix.h>
# else /* !HAVE_PCREPOSIX_H */
# ifdef HAVE_RXPOSIX_H
# include <rxposix.h>
# else /* !HAVE_RXPOSIX_H */
# include <regex.h>
# endif /* HAVE_RXPOSIX_H */
# endif /* HAVE_PCREPOSIX_H */
#endif /* ENABLE_REGEX */
# elif defined HAVE_PCRE2POSIX_H
# ifndef PCRE2POSIX_H_INCLUDED
# include <pcre2posix.h>
# define PCRE2POSIX_H_INCLUDED
# endif
# elif defined HAVE_RXPOSIX_H
# include <rxposix.h>
# else
# include <regex.h>
# endif
#endif

#include "sieve_interface.h"
#include "strarray.h"
Expand Down
4 changes: 3 additions & 1 deletion sieve/sieve.y
Original file line number Diff line number Diff line change
Expand Up @@ -2068,9 +2068,11 @@ static int verify_regexlist(sieve_script_t *sscript,
regex_t reg;
int cflags = REG_EXTENDED | REG_NOSUB;

#ifdef HAVE_PCREPOSIX_H
/* support UTF8 comparisons */
#if defined HAVE_PCREPOSIX_H
cflags |= REG_UTF8;
#elif defined HAVE_PCRE2POSIX_H
cflags |= REG_UTF;
#endif

if (collation == B_ASCIICASEMAP) {
Expand Down

0 comments on commit e689754

Please sign in to comment.