commit 2b1a94407fddf20cd3bebf6656de8919e0520020 Author: MSVSphere Packaging Team Date: Tue Nov 26 15:34:19 2024 +0300 import apr-util-1.6.3-20.el10 diff --git a/.apr-util.metadata b/.apr-util.metadata new file mode 100644 index 0000000..153653c --- /dev/null +++ b/.apr-util.metadata @@ -0,0 +1 @@ +8c6293a787b69986ce43bc49c7c247d4ff5fc828 SOURCES/apr-util-1.6.3.tar.bz2 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a65ccc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/apr-util-1.6.3.tar.bz2 diff --git a/SOURCES/apr-util-1.2.7-pkgconf.patch b/SOURCES/apr-util-1.2.7-pkgconf.patch new file mode 100644 index 0000000..0e394ec --- /dev/null +++ b/SOURCES/apr-util-1.2.7-pkgconf.patch @@ -0,0 +1,25 @@ +--- apr-util-1.2.7/Makefile.in.pkgconf ++++ apr-util-1.2.7/Makefile.in +@@ -51,7 +51,7 @@ + + # Create apu-config script suitable for the install tree + apu-config.out: $(APU_CONFIG) +- sed 's,^\(location=\).*$$,\1installed,' < $(APU_CONFIG) > $@ ++ sed 's,^\(location=\).*$$,\1installed,;s,^\(APR_.*_DIR\)=.*,\1="$${libdir}/build",' < $(APU_CONFIG) > $@ + + install: $(TARGETS) install-modules + $(APR_MKDIR) $(DESTDIR)$(includedir) $(DESTDIR)$(libdir)/pkgconfig \ +--- apr-util-1.2.7/apu-config.in.pkgconf ++++ apr-util-1.2.7/apu-config.in +@@ -24,9 +24,10 @@ + prefix="@prefix@" + exec_prefix="@exec_prefix@" + bindir="@bindir@" +-libdir="@libdir@" + includedir="@includedir@" + ++libdir=`pkg-config --variable=libdir apr-util-@APRUTIL_MAJOR_VERSION@` ++ + LIBS="@APRUTIL_EXPORT_LIBS@" + INCLUDES="@APRUTIL_INCLUDES@" + LDFLAGS="@APRUTIL_LDFLAGS@" diff --git a/SOURCES/apr-util-1.4.1-private.patch b/SOURCES/apr-util-1.4.1-private.patch new file mode 100644 index 0000000..296362e --- /dev/null +++ b/SOURCES/apr-util-1.4.1-private.patch @@ -0,0 +1,10 @@ +--- apr-util-1.4.1/apr-util.pc.in~ 2008-05-23 16:27:37.000000000 -0500 ++++ apr-util-1.4.1/apr-util.pc.in 2013-02-07 08:55:09.717312176 -0600 +@@ -9,5 +9,6 @@ + Version: @APRUTIL_DOTTED_VERSION@ + # assume that apr-util requires libapr of same major version + Requires: apr-@APRUTIL_MAJOR_VERSION@ +-Libs: -L${libdir} -l@APRUTIL_LIBNAME@ @LDADD_ldap@ @APRUTIL_EXPORT_LIBS@ ++Libs: -L${libdir} -l@APRUTIL_LIBNAME@ @LDADD_ldap@ ++Libs.private: @APRUTIL_EXPORT_LIBS@ + Cflags: -I${includedir} diff --git a/SOURCES/apr-util-1.6.3-allow-ipv6.patch b/SOURCES/apr-util-1.6.3-allow-ipv6.patch new file mode 100644 index 0000000..b964a63 --- /dev/null +++ b/SOURCES/apr-util-1.6.3-allow-ipv6.patch @@ -0,0 +1,123 @@ +From 828d644c8eba8765843985d9293f033898ed0592 Mon Sep 17 00:00:00 2001 +From: Joe Orton +Date: Fri, 3 Feb 2023 15:12:10 +0000 +Subject: [PATCH] * memcache/apr_memcache.c (conn_connect): Allow use of IPv6 + rather than forcing name resolution to IPv4 only. + +Submitted by: Lubos Uhliarik +Github: closes #39 + + +git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@1907242 13f79535-47bb-0310-9956-ffa450edef68 +--- + memcache/apr_memcache.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/memcache/apr_memcache.c b/memcache/apr_memcache.c +index 5f8135c52c..18806281a4 100644 +--- a/memcache/apr_memcache.c ++++ b/memcache/apr_memcache.c +@@ -290,9 +290,9 @@ static apr_status_t conn_connect(apr_memcache_conn_t *conn) + apr_status_t rv = APR_SUCCESS; + apr_sockaddr_t *sa; + #if APR_HAVE_SOCKADDR_UN +- apr_int32_t family = conn->ms->host[0] != '/' ? APR_INET : APR_UNIX; ++ apr_int32_t family = conn->ms->host[0] != '/' ? APR_UNSPEC : APR_UNIX; + #else +- apr_int32_t family = APR_INET; ++ apr_int32_t family = APR_UNSPEC; + #endif + + rv = apr_sockaddr_info_get(&sa, conn->ms->host, family, conn->ms->port, 0, conn->p); +@@ -328,9 +328,9 @@ mc_conn_construct(void **conn_, void *params, apr_pool_t *pool) + apr_pool_t *tp; + apr_memcache_server_t *ms = params; + #if APR_HAVE_SOCKADDR_UN +- apr_int32_t family = ms->host[0] != '/' ? APR_INET : APR_UNIX; ++ apr_int32_t family = ms->host[0] != '/' ? APR_UNSPEC : APR_UNIX; + #else +- apr_int32_t family = APR_INET; ++ apr_int32_t family = APR_UNSPEC; + #endif + + rv = apr_pool_create(&np, pool); + +From 59341af138dd2c6fe9444ee9c865b769c0053bdd Mon Sep 17 00:00:00 2001 +From: Joe Orton +Date: Tue, 27 Jun 2023 14:06:09 +0000 +Subject: [PATCH] * memcache/apr_memcache.c (conn_connect, mc_conn_construct): + Fix regression in IPv4 handling in r1907242. Cycle through the address + list handling v4/v6 addresses correctly. + +Submitted by: Lubos Uhliarik +Github: closes #44 + + +git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@1910629 13f79535-47bb-0310-9956-ffa450edef68 +--- + memcache/apr_memcache.c | 36 ++++++++++++++++++------------------ + 1 file changed, 18 insertions(+), 18 deletions(-) + +diff --git a/memcache/apr_memcache.c b/memcache/apr_memcache.c +index 41b93a0a33..09779d91b5 100644 +--- a/memcache/apr_memcache.c ++++ b/memcache/apr_memcache.c +@@ -300,14 +300,26 @@ static apr_status_t conn_connect(apr_memcache_conn_t *conn) + return rv; + } + +- rv = apr_socket_timeout_set(conn->sock, 1 * APR_USEC_PER_SEC); +- if (rv != APR_SUCCESS) { +- return rv; ++ /* Cycle through address until a connect() succeeds. */ ++ for (; sa; sa = sa->next) { ++ rv = apr_socket_create(&conn->sock, sa->family, SOCK_STREAM, 0, conn->p); ++ if (rv == APR_SUCCESS) { ++ rv = apr_socket_timeout_set(conn->sock, 1 * APR_USEC_PER_SEC); ++ if (rv != APR_SUCCESS) { ++ return rv; ++ } ++ ++ rv = apr_socket_connect(conn->sock, sa); ++ if (rv == APR_SUCCESS) { ++ break; ++ } ++ ++ apr_socket_close(conn->sock); ++ } + } + +- rv = apr_socket_connect(conn->sock, sa); +- if (rv != APR_SUCCESS) { +- return rv; ++ if (!sa) { ++ return APR_ECONNREFUSED; + } + + rv = apr_socket_timeout_set(conn->sock, -1); +@@ -327,11 +339,6 @@ mc_conn_construct(void **conn_, void *params, apr_pool_t *pool) + apr_pool_t *np; + apr_pool_t *tp; + apr_memcache_server_t *ms = params; +-#if APR_HAVE_SOCKADDR_UN +- apr_int32_t family = ms->host[0] != '/' ? APR_UNSPEC : APR_UNIX; +-#else +- apr_int32_t family = APR_UNSPEC; +-#endif + + rv = apr_pool_create(&np, pool); + if (rv != APR_SUCCESS) { +@@ -349,13 +356,6 @@ mc_conn_construct(void **conn_, void *params, apr_pool_t *pool) + conn->p = np; + conn->tp = tp; + +- rv = apr_socket_create(&conn->sock, family, SOCK_STREAM, 0, np); +- +- if (rv != APR_SUCCESS) { +- apr_pool_destroy(np); +- return rv; +- } +- + conn->buffer = apr_palloc(conn->p, BUFFER_SIZE + 1); + conn->blen = 0; + conn->ms = ms; diff --git a/SOURCES/apr-util-1.6.3-drop-engine-headers.patch b/SOURCES/apr-util-1.6.3-drop-engine-headers.patch new file mode 100644 index 0000000..c1afa35 --- /dev/null +++ b/SOURCES/apr-util-1.6.3-drop-engine-headers.patch @@ -0,0 +1,23 @@ +diff --git a/crypto/apr_crypto_openssl.c b/crypto/apr_crypto_openssl.c +index 34d0559..4069cf9 100644 +--- a/crypto/apr_crypto_openssl.c ++++ b/crypto/apr_crypto_openssl.c +@@ -37,7 +37,6 @@ + + #include + #include +-#include + #include + #if OPENSSL_VERSION_NUMBER >= 0x30000000 + #include +@@ -92,6 +91,10 @@ + #define APR_USE_OPENSSL_ENGINE_API 0 + #endif + ++#if APR_USE_OPENSSL_ENGINE_API ++#include ++#endif ++ + #define LOG_PREFIX "apr_crypto_openssl: " + + struct apr_crypto_t { diff --git a/SOURCES/apr-util-1.6.3-lmdb-support.patch b/SOURCES/apr-util-1.6.3-lmdb-support.patch new file mode 100644 index 0000000..440d3d9 --- /dev/null +++ b/SOURCES/apr-util-1.6.3-lmdb-support.patch @@ -0,0 +1,745 @@ +commit 3df6492e1ef6f027629d81f0834636e791bdd4f3 +Author: Luboš Uhliarik +Date: Wed Oct 25 12:45:58 2023 +0200 + + Add lmdb support + +diff --git a/Makefile.in b/Makefile.in +index 811ca1d..3be9864 100644 +--- a/Makefile.in ++++ b/Makefile.in +@@ -39,6 +39,7 @@ LDADD_dbd_odbc = @LDADD_dbd_odbc@ + LDADD_dbm_db = @LDADD_dbm_db@ + LDADD_dbm_gdbm = @LDADD_dbm_gdbm@ + LDADD_dbm_ndbm = @LDADD_dbm_ndbm@ ++LDADD_dbm_lmdb = @LDADD_dbm_lmdb@ + LDADD_ldap = @LDADD_ldap@ + LDADD_crypto_openssl = @LDADD_crypto_openssl@ + LDADD_crypto_nss = @LDADD_crypto_nss@ +diff --git a/build-outputs.mk b/build-outputs.mk +index a8ae1c9..4aedd4a 100644 +--- a/build-outputs.mk ++++ b/build-outputs.mk +@@ -145,6 +145,12 @@ MODULE_dbm_ndbm = dbm/apr_dbm_ndbm.la + dbm/apr_dbm_ndbm.la: dbm/apr_dbm_ndbm.lo + $(LINK_MODULE) -o $@ $(OBJECTS_dbm_ndbm) $(LDADD_dbm_ndbm) + ++dbm/apr_dbm_lmdb.lo: dbm/apr_dbm_lmdb.c .make.dirs include/apr_dbm.h include/private/apr_dbm_private.h ++OBJECTS_dbm_lmdb = dbm/apr_dbm_lmdb.lo ++MODULE_dbm_lmdb = dbm/apr_dbm_lmdb.la ++dbm/apr_dbm_lmdb.la: dbm/apr_dbm_lmdb.lo ++ $(LINK_MODULE) -o $@ $(OBJECTS_dbm_lmdb) $(LDADD_dbm_lmdb) ++ + BUILD_DIRS = buckets crypto dbd dbm dbm/sdbm encoding hooks ldap memcache misc redis strmatch uri xlate xml + + .make.dirs: $(srcdir)/build-outputs.mk +diff --git a/build.conf b/build.conf +index 86e8c34..60e6084 100644 +--- a/build.conf ++++ b/build.conf +@@ -41,7 +41,7 @@ headers = include/*.h include/private/*.h + modules = + ldap crypto_openssl crypto_nss crypto_commoncrypto dbd_pgsql + dbd_sqlite2 dbd_sqlite3 dbd_oracle dbd_mysql dbd_odbc +- dbm_db dbm_gdbm dbm_ndbm ++ dbm_db dbm_gdbm dbm_ndbm dbm_lmdb + + # gen_uri_delim.c + +@@ -102,3 +102,6 @@ paths = ldap/apr_ldap_init.c + ldap/apr_ldap_rebind.c + target = ldap/apr_ldap.la + ++[dbm_lmdb] ++paths = dbm/apr_dbm_lmdb.c ++target = dbm/apr_dbm_lmdb.la +diff --git a/build/dbm.m4 b/build/dbm.m4 +index ffdbdbc..247fe18 100644 +--- a/build/dbm.m4 ++++ b/build/dbm.m4 +@@ -498,11 +498,13 @@ dnl APU_CHECK_DBM: see what kind of DBM backend to use for apr_dbm. + dnl + AC_DEFUN([APU_CHECK_DBM], [ + apu_use_sdbm=0 ++ apu_use_lmdb=0 + apu_use_ndbm=0 + apu_use_gdbm=0 + apu_use_db=0 + dnl it's in our codebase + apu_have_sdbm=1 ++ apu_have_lmdb=0 + apu_have_gdbm=0 + apu_have_ndbm=0 + apu_have_db=0 +@@ -514,7 +516,7 @@ AC_DEFUN([APU_CHECK_DBM], [ + # Although we search for all versions up to 6.9, + # we should only include existing versions in our + # help string. +- dbm_list="sdbm, gdbm, ndbm, db, db1, db185, db2, db3, db4" ++ dbm_list="sdbm, lmdb, gdbm, ndbm, db, db1, db185, db2, db3, db4" + db_max_version=48 + db_min_version=41 + db_version="$db_min_version" +@@ -541,7 +543,7 @@ AC_DEFUN([APU_CHECK_DBM], [ + done + + AC_ARG_WITH(dbm, [APR_HELP_STRING([--with-dbm=DBM], [choose the DBM type to use. +- DBM={sdbm,gdbm,ndbm,db,db1,db185,db2,db3,db4,db4X,db5X,db6X} for some X=0,...,9])], ++ DBM={sdbm,lmdb,gdbm,ndbm,db,db1,db185,db2,db3,db4,db4X,db5X,db6X} for some X=0,...,9])], + [ + if test "$withval" = "yes"; then + AC_MSG_ERROR([--with-dbm needs to specify a DBM type to use. +@@ -552,6 +554,35 @@ AC_DEFUN([APU_CHECK_DBM], [ + requested=default + ]) + ++ AC_ARG_WITH([lmdb], [APR_HELP_STRING([--with-lmdb=DIR], [enable LMDB support])], ++ [ ++ apu_have_lmdb=0 ++ if test "$withval" = "yes"; then ++ AC_CHECK_HEADER(lmdb.h, AC_CHECK_LIB(lmdb, mdb_dbi_open, [apu_have_lmdb=1])) ++ elif test "$withval" = "no"; then ++ apu_have_lmdb=0 ++ else ++ saved_cppflags="$CPPFLAGS" ++ saved_ldflags="$LDFLAGS" ++ CPPFLAGS="$CPPFLAGS -I$withval/include" ++ LDFLAGS="$LDFLAGS -L$withval/lib " ++ ++ AC_MSG_CHECKING(checking for lmdb in $withval) ++ AC_CHECK_HEADER(lmdb.h, AC_CHECK_LIB(lmdb, mdb_dbi_open, [apu_have_lmdb=1])) ++ if test "$apu_have_lmdb" != "0"; then ++ APR_ADDTO(LDFLAGS, [-L$withval/lib]) ++ APR_ADDTO(INCLUDES, [-I$withval/include]) ++ fi ++ CPPFLAGS="$saved_cppflags" ++ LDFLAGS="$saved_ldflags" ++ fi ++ ++ if test "$requested" = "lmdb" -a "$apu_have_lmdb" = 0; then ++ AC_MSG_ERROR([LMDB requested, but not found]) ++ fi ++ ]) ++ ++ + dnl We don't pull in GDBM unless the user asks for it, since it's GPL + AC_ARG_WITH([gdbm], [APR_HELP_STRING([--with-gdbm=DIR], [enable GDBM support])], + [ +@@ -668,6 +699,7 @@ AC_DEFUN([APU_CHECK_DBM], [ + fi + + if test "$apu_want_db" != "0"; then ++ AC_MSG_NOTICE([checking for Berkeley DB $requested in $user_places]) + APU_CHECK_DB($requested, $user_places) + if test "$apu_have_db" = "0"; then + AC_ERROR(Berkeley DB not found.) +@@ -680,7 +712,7 @@ AC_DEFUN([APU_CHECK_DBM], [ + fi + + case "$requested" in +- sdbm | gdbm | ndbm | db) ++ lmdb | sdbm | gdbm | ndbm | db) + eval "apu_use_$requested=1" + apu_default_dbm=$requested + ;; +@@ -709,11 +741,13 @@ AC_DEFUN([APU_CHECK_DBM], [ + AC_MSG_CHECKING(for default DBM) + AC_MSG_RESULT($apu_default_dbm) + ++ AC_SUBST(apu_use_lmdb) + AC_SUBST(apu_use_sdbm) + AC_SUBST(apu_use_gdbm) + AC_SUBST(apu_use_ndbm) + AC_SUBST(apu_use_db) + ++ AC_SUBST(apu_have_lmdb) + AC_SUBST(apu_have_sdbm) + AC_SUBST(apu_have_gdbm) + AC_SUBST(apu_have_ndbm) +@@ -738,8 +772,13 @@ AC_DEFUN([APU_CHECK_DBM], [ + APR_ADDTO(LDADD_dbm_ndbm, [-l$apu_ndbm_lib]) + fi + ++ if test "$apu_have_lmdb" = "1"; then ++ APR_ADDTO(LDADD_dbm_lmdb, [-llmdb]) ++ fi ++ + AC_SUBST(LDADD_dbm_db) + AC_SUBST(LDADD_dbm_gdbm) + AC_SUBST(LDADD_dbm_ndbm) ++ AC_SUBST(LDADD_dbm_lmdb) + ]) + +diff --git a/build/dso.m4 b/build/dso.m4 +index 2c5df6b..7ac6e03 100644 +--- a/build/dso.m4 ++++ b/build/dso.m4 +@@ -60,6 +60,7 @@ yes + test $apu_have_db = 1 && objs="$objs dbm/apr_dbm_berkeleydb.lo" + test $apu_have_gdbm = 1 && objs="$objs dbm/apr_dbm_gdbm.lo" + test $apu_have_ndbm = 1 && objs="$objs dbm/apr_dbm_ndbm.lo" ++ test $apu_have_lmdb = 1 && objs="$objs dbm/apr_dbm_lmdb.lo" + test $apu_has_ldap = 1 && objs="$objs ldap/apr_ldap_init.lo" + test $apu_has_ldap = 1 && objs="$objs ldap/apr_ldap_option.lo" + test $apu_has_ldap = 1 && objs="$objs ldap/apr_ldap_rebind.lo" +@@ -81,11 +82,11 @@ yes + + APRUTIL_LIBS="$APRUTIL_LIBS $LDADD_crypto_openssl $LDADD_crypto_nss $LDADD_crypto_commoncrypto" + APRUTIL_LIBS="$APRUTIL_LIBS $LDADD_dbd_pgsql $LDADD_dbd_sqlite2 $LDADD_dbd_sqlite3 $LDADD_dbd_oracle $LDADD_dbd_mysql $LDADD_dbd_odbc" +- APRUTIL_LIBS="$APRUTIL_LIBS $LDADD_dbm_db $LDADD_dbm_gdbm $LDADD_dbm_ndbm" ++ APRUTIL_LIBS="$APRUTIL_LIBS $LDADD_dbm_db $LDADD_dbm_gdbm $LDADD_dbm_ndbm $LDADD_dbm_lmdb" + APRUTIL_LIBS="$APRUTIL_LIBS $LDADD_ldap" + APRUTIL_EXPORT_LIBS="$APRUTIL_EXPORT_LIBS $LDADD_crypto_openssl $LDADD_crypto_nss $LDADD_crypto_commoncrypto" + APRUTIL_EXPORT_LIBS="$APRUTIL_EXPORT_LIBS $LDADD_dbd_pgsql $LDADD_dbd_sqlite2 $LDADD_dbd_sqlite3 $LDADD_dbd_oracle $LDADD_dbd_mysql $LDADD_dbd_odbc" +- APRUTIL_EXPORT_LIBS="$APRUTIL_EXPORT_LIBS $LDADD_dbm_db $LDADD_dbm_gdbm $LDADD_dbm_ndbm" ++ APRUTIL_EXPORT_LIBS="$APRUTIL_EXPORT_LIBS $LDADD_dbm_db $LDADD_dbm_gdbm $LDADD_dbm_ndbm $LDADD_dbm_lmdb" + APRUTIL_EXPORT_LIBS="$APRUTIL_EXPORT_LIBS $LDADD_ldap" + + else +@@ -104,6 +105,7 @@ yes + test $apu_have_db = 1 && dsos="$dsos dbm/apr_dbm_db.la" + test $apu_have_gdbm = 1 && dsos="$dsos dbm/apr_dbm_gdbm.la" + test $apu_have_ndbm = 1 && dsos="$dsos dbm/apr_dbm_ndbm.la" ++ test $apu_have_lmdb = 1 && dsos="$dsos dbm/apr_dbm_lmdb.la" + test $apu_has_ldap = 1 && dsos="$dsos ldap/apr_ldap.la" + + if test -n "$dsos"; then +diff --git a/dbm/apr_dbm.c b/dbm/apr_dbm.c +index 8b58f83..c846dd0 100644 +--- a/dbm/apr_dbm.c ++++ b/dbm/apr_dbm.c +@@ -53,6 +53,9 @@ + #elif APU_USE_SDBM + #define DBM_VTABLE apr_dbm_type_sdbm + #define DBM_NAME "sdbm" ++#elif APU_USE_LMDB ++#define DBM_VTABLE apr_dbm_type_lmdb ++#define DBM_NAME "lmdb" + #else /* Not in the USE_xDBM list above */ + #error a DBM implementation was not specified + #endif +@@ -85,6 +88,9 @@ static apr_status_t dbm_open_type(apr_dbm_type_t const* * vtable, + if (!strcasecmp(type, "default")) *vtable = &DBM_VTABLE; + #if APU_HAVE_DB + else if (!strcasecmp(type, "db")) *vtable = &apr_dbm_type_db; ++#endif ++#if APU_HAVE_LMDB ++ else if (!strcasecmp(type, "lmdb")) *vtable = &apr_dbm_type_lmdb; + #endif + else if (*type && !strcasecmp(type + 1, "dbm")) { + #if APU_HAVE_GDBM +@@ -112,6 +118,7 @@ static apr_status_t dbm_open_type(apr_dbm_type_t const* * vtable, + + if (!strcasecmp(type, "default")) type = DBM_NAME; + else if (!strcasecmp(type, "db")) type = "db"; ++ else if (!strcasecmp(type, "lmdb")) type = "lmdb"; + else if (*type && !strcasecmp(type + 1, "dbm")) { + if (*type == 'G' || *type == 'g') type = "gdbm"; + else if (*type == 'N' || *type == 'n') type = "ndbm"; +diff --git a/dbm/apr_dbm_lmdb.c b/dbm/apr_dbm_lmdb.c +new file mode 100644 +index 0000000..fe76779 +--- /dev/null ++++ b/dbm/apr_dbm_lmdb.c +@@ -0,0 +1,376 @@ ++/* Licensed to the Apache Software Foundation (ASF) under one or more ++ * contributor license agreements. See the NOTICE file distributed with ++ * this work for additional information regarding copyright ownership. ++ * The ASF licenses this file to You under the Apache License, Version 2.0 ++ * (the "License"); you may not use this file except in compliance with ++ * the License. You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#include "apr_strings.h" ++#define APR_WANT_MEMFUNC ++#include "apr_want.h" ++#include ++ ++#if APR_HAVE_STDLIB_H ++#include /* for abort() */ ++#endif ++ ++#include "apu.h" ++ ++#if APU_HAVE_LMDB ++ ++#include ++ ++#include "apr_dbm_private.h" ++ ++typedef struct { ++ MDB_dbi dbi; ++ MDB_cursor *cursor; ++ MDB_txn *txn; ++ MDB_env *env; ++} real_file_t; ++ ++ ++#define APR_DBM_LMDBMODE_RO MDB_RDONLY ++#define APR_DBM_LMDBMODE_RWCREATE MDB_CREATE ++#define APR_DBM_LMDBMODE_RW (MDB_RDONLY + MDB_CREATE + 1) ++#define APR_DBM_LMDBMODE_RWTRUNC (APR_DBM_LMDBMODE_RW + 1) ++ ++/* -------------------------------------------------------------------------- ++** ++** UTILITY FUNCTIONS ++*/ ++ ++/* Map a DB error to an apr_status_t */ ++static apr_status_t db2s(int dberr) ++{ ++ /* MDB_* error codes are negative, which are mapped to EGENERAL; ++ * positive error codes are errno which maps directly to ++ * apr_status_t. MDB_ codes could be mapped to some status code ++ * region. */ ++ return dberr < 0 ? APR_EGENERAL : dberr; ++} ++ ++/* Handle the return code of an mdb_* function (dberr), store the ++ * error string for access via apr_dbm_geterror(), return translated ++ * to an apr_status_t. */ ++static apr_status_t set_error(apr_dbm_t *dbm, int dberr) ++{ ++ if ((dbm->errcode = dberr) == MDB_SUCCESS) { ++ dbm->errmsg = NULL; ++ } ++ else { ++ dbm->errmsg = mdb_strerror(dberr); ++ } ++ ++ return db2s(dberr); ++} ++ ++ ++/* -------------------------------------------------------------------------- ++** ++** DEFINE THE VTABLE FUNCTIONS FOR LMDB ++** ++*/ ++ ++#define DEFAULT_ENV_FLAGS (MDB_NOSUBDIR|MDB_NOSYNC) ++ ++static apr_status_t vt_lmdb_open(apr_dbm_t **pdb, const char *pathname, ++ apr_int32_t mode, apr_fileperms_t perm, ++ apr_pool_t *pool) ++{ ++ real_file_t file; ++ int dbi_open_flags = 0; ++ int dbmode = 0; ++ int truncate = 0; ++ ++ *pdb = NULL; ++ switch (mode) { ++ case APR_DBM_READONLY: ++ dbmode = APR_DBM_LMDBMODE_RO; ++ break; ++ case APR_DBM_READWRITE: ++ dbmode = APR_DBM_LMDBMODE_RW; ++ break; ++ case APR_DBM_RWCREATE: ++ dbi_open_flags = APR_DBM_LMDBMODE_RWCREATE; ++ break; ++ case APR_DBM_RWTRUNC: ++ truncate = APR_DBM_LMDBMODE_RWTRUNC; ++ break; ++ default: ++ return APR_EINVAL; ++ } ++ ++ { ++ int dberr; ++ file.txn = NULL; ++ file.cursor = NULL; ++ file.env = NULL; ++ ++ dberr = mdb_env_create(&file.env); ++ if (dberr == 0) { ++ /* Default to 2GB map size which limits the total database ++ * size to something reasonable. */ ++ dberr = mdb_env_set_mapsize(file.env, INT32_MAX); ++ } ++ ++ if (dberr == 0) { ++ dberr = mdb_env_open(file.env, pathname, dbmode | DEFAULT_ENV_FLAGS, apr_posix_perms2mode(perm)); ++ } ++ ++ if (dberr == 0) { ++ dberr = mdb_txn_begin(file.env, NULL, dbmode, &file.txn); ++ } ++ ++ if (dberr == 0) { ++ dberr = mdb_dbi_open(file.txn, NULL, dbi_open_flags, &file.dbi); ++ ++ /* if mode == APR_DBM_RWTRUNC, drop database */ ++ if ((dberr == 0) && truncate) { ++ dberr = mdb_drop(file.txn, file.dbi, 0); ++ if (dberr != 0) { ++ mdb_dbi_close(file.env, file.dbi); ++ } ++ } ++ } ++ ++ if (dberr != 0) { ++ /* close the env handler */ ++ if (file.env) ++ mdb_env_close(file.env); ++ ++ return db2s(dberr); ++ } ++ } ++ ++ /* we have an open database... return it */ ++ *pdb = apr_pcalloc(pool, sizeof(**pdb)); ++ (*pdb)->pool = pool; ++ (*pdb)->type = &apr_dbm_type_lmdb; ++ (*pdb)->file = apr_pmemdup(pool, &file, sizeof(file)); ++ ++ /* ### register a cleanup to close the DBM? */ ++ ++ return APR_SUCCESS; ++} ++ ++static void vt_lmdb_close(apr_dbm_t *dbm) ++{ ++ real_file_t *f = dbm->file; ++ ++ /* try to commit all transactions that haven't been commited yet on close */ ++ if (f->txn) { ++ mdb_txn_commit(f->txn); ++ f->txn = NULL; ++ f->cursor = NULL; ++ } ++ ++ if (f->cursor) { ++ mdb_cursor_close(f->cursor); ++ f->cursor = NULL; ++ } ++ ++ mdb_dbi_close(f->env, f->dbi); ++ mdb_env_close(f->env); ++ ++ f->env = NULL; ++ f->dbi = 0; ++} ++ ++static apr_status_t vt_lmdb_fetch(apr_dbm_t *dbm, apr_datum_t key, ++ apr_datum_t * pvalue) ++{ ++ real_file_t *f = dbm->file; ++ MDB_val ckey = { 0 }; ++ MDB_val rd = { 0 }; ++ int dberr; ++ ++ ckey.mv_data = key.dptr; ++ ckey.mv_size = key.dsize; ++ ++ dberr = mdb_get(f->txn, f->dbi, &(ckey), &(rd)); ++ ++ /* "not found" is not an error. return zero'd value. */ ++ if (dberr == MDB_NOTFOUND) { ++ memset(&rd, 0, sizeof(rd)); ++ dberr = 0; ++ } ++ ++ pvalue->dptr = rd.mv_data; ++ pvalue->dsize = rd.mv_size; ++ ++ /* store the error info into DBM, and return a status code. Also, note ++ that *pvalue should have been cleared on error. */ ++ return set_error(dbm, dberr); ++} ++ ++static apr_status_t vt_lmdb_store(apr_dbm_t *dbm, apr_datum_t key, ++ apr_datum_t value) ++{ ++ real_file_t *f = dbm->file; ++ int rv; ++ MDB_val ckey = { 0 }; ++ MDB_val cvalue = { 0 }; ++ ++ ckey.mv_data = key.dptr; ++ ckey.mv_size = key.dsize; ++ ++ cvalue.mv_data = value.dptr; ++ cvalue.mv_size = value.dsize; ++ ++ if ((rv = mdb_put(f->txn, f->dbi, &ckey, &cvalue, 0)) == 0) { ++ /* commit transaction */ ++ if ((rv = mdb_txn_commit(f->txn)) == MDB_SUCCESS) { ++ f->cursor = NULL; ++ rv = mdb_txn_begin(f->env, NULL, 0, &f->txn); ++ } ++ ++ /* if mdb_txn_commit OR mdb_txn_begin fails ... */ ++ if (rv != MDB_SUCCESS) { ++ f->txn = NULL; ++ } ++ } ++ ++ /* store any error info into DBM, and return a status code. */ ++ return set_error(dbm, rv); ++} ++ ++static apr_status_t vt_lmdb_del(apr_dbm_t *dbm, apr_datum_t key) ++{ ++ real_file_t *f = dbm->file; ++ int rv; ++ MDB_val ckey = { 0 }; ++ ++ ckey.mv_data = key.dptr; ++ ckey.mv_size = key.dsize; ++ ++ if ((rv = mdb_del(f->txn, f->dbi, &ckey, NULL)) == 0) { ++ /* commit transaction */ ++ if ((rv = mdb_txn_commit(f->txn)) == MDB_SUCCESS) { ++ f->cursor = NULL; ++ rv = mdb_txn_begin(f->env, NULL, 0, &f->txn); ++ } ++ ++ /* if mdb_txn_commit OR mdb_txn_begin fails ... */ ++ if (rv != MDB_SUCCESS) { ++ f->txn = NULL; ++ } ++ } ++ ++ /* store any error info into DBM, and return a status code. */ ++ return set_error(dbm, rv); ++} ++ ++static int vt_lmdb_exists(apr_dbm_t *dbm, apr_datum_t key) ++{ ++ real_file_t *f = dbm->file; ++ MDB_val ckey = { 0 }; /* converted key */ ++ MDB_val data = { 0 }; ++ int dberr; ++ ++ ckey.mv_data = key.dptr; ++ ckey.mv_size = key.dsize; ++ ++ dberr = mdb_get(f->txn, f->dbi, &(ckey), &(data)); ++ ++ /* note: the result data is "loaned" to us; we don't need to free it */ ++ ++ /* DB returns DB_NOTFOUND if it doesn't exist. but we want to say ++ that *any* error means it doesn't exist. */ ++ return dberr == 0; ++} ++ ++static apr_status_t vt_lmdb_firstkey(apr_dbm_t *dbm, apr_datum_t * pkey) ++{ ++ real_file_t *f = dbm->file; ++ MDB_val first, data; ++ int dberr; ++ ++ if ((dberr = mdb_cursor_open(f->txn, f->dbi, &f->cursor)) == 0) { ++ dberr = mdb_cursor_get(f->cursor, &first, &data, MDB_FIRST); ++ if (dberr == MDB_NOTFOUND) { ++ memset(&first, 0, sizeof(first)); ++ mdb_cursor_close(f->cursor); ++ f->cursor = NULL; ++ dberr = 0; ++ } ++ } ++ else { ++ /* clear first if mdb_cursor_open fails */ ++ memset(&first, 0, sizeof(first)); ++ } ++ ++ pkey->dptr = first.mv_data; ++ pkey->dsize = first.mv_size; ++ ++ /* store any error info into DBM, and return a status code. */ ++ return set_error(dbm, dberr); ++} ++ ++static apr_status_t vt_lmdb_nextkey(apr_dbm_t *dbm, apr_datum_t * pkey) ++{ ++ real_file_t *f = dbm->file; ++ MDB_val ckey, data; ++ int dberr; ++ ++ ckey.mv_data = pkey->dptr; ++ ckey.mv_size = pkey->dsize; ++ ++ if (f->cursor == NULL) { ++ return APR_EINVAL; ++ } ++ ++ dberr = mdb_cursor_get(f->cursor, &ckey, &data, MDB_NEXT); ++ if (dberr == MDB_NOTFOUND) { ++ mdb_cursor_close(f->cursor); ++ f->cursor = NULL; ++ dberr = 0; ++ ckey.mv_data = NULL; ++ ckey.mv_size = 0; ++ } ++ ++ pkey->dptr = ckey.mv_data; ++ pkey->dsize = ckey.mv_size; ++ ++ /* store any error info into DBM, and return a status code. */ ++ return set_error(dbm, dberr); ++} ++ ++static void vt_lmdb_freedatum(apr_dbm_t *dbm, apr_datum_t data) ++{ ++ /* nothing to do */ ++} ++ ++static void vt_lmdb_usednames(apr_pool_t *pool, const char *pathname, ++ const char **used1, const char **used2) ++{ ++ *used1 = apr_pstrdup(pool, pathname); ++ *used2 = apr_pstrcat(pool, pathname, "-lock", NULL); ++} ++ ++ ++APU_MODULE_DECLARE_DATA const apr_dbm_type_t apr_dbm_type_lmdb = { ++ "lmdb", ++ ++ vt_lmdb_open, ++ vt_lmdb_close, ++ vt_lmdb_fetch, ++ vt_lmdb_store, ++ vt_lmdb_del, ++ vt_lmdb_exists, ++ vt_lmdb_firstkey, ++ vt_lmdb_nextkey, ++ vt_lmdb_freedatum, ++ vt_lmdb_usednames ++}; ++ ++#endif /* APU_HAVE_LMDB */ +diff --git a/include/apr_dbm.h b/include/apr_dbm.h +index ad1b4f3..fba0cdd 100644 +--- a/include/apr_dbm.h ++++ b/include/apr_dbm.h +@@ -64,6 +64,7 @@ typedef struct + * @param type The type of the DBM (not all may be available at run time) + *
+  *  db   for Berkeley DB files
++ *  lmdb for LMDB files
+  *  gdbm for GDBM files
+  *  ndbm for NDBM files
+  *  sdbm for SDBM files (always available)
+diff --git a/include/apu.h.in b/include/apu.h.in
+index 184682d..cb89779 100644
+--- a/include/apu.h.in
++++ b/include/apu.h.in
+@@ -100,6 +100,7 @@
+  * we always have SDBM (it's in our codebase)
+  */
+ #define APU_HAVE_SDBM   @apu_have_sdbm@
++#define APU_HAVE_LMDB   @apu_have_lmdb@
+ #define APU_HAVE_GDBM   @apu_have_gdbm@
+ #define APU_HAVE_NDBM   @apu_have_ndbm@
+ #define APU_HAVE_DB     @apu_have_db@
+diff --git a/include/apu.hnw b/include/apu.hnw
+index 0bc3a2c..c902bae 100644
+--- a/include/apu.hnw
++++ b/include/apu.hnw
+@@ -86,6 +86,7 @@
+ #define APU_HAVE_SDBM           1
+ 
+ #ifndef APU_DSO_MODULE_BUILD
++#define APU_HAVE_LMDB           0
+ #define APU_HAVE_GDBM           0
+ #define APU_HAVE_NDBM           0
+ #define APU_HAVE_DB             0
+diff --git a/include/apu.hw b/include/apu.hw
+index 21fbedf..e86bdb4 100644
+--- a/include/apu.hw
++++ b/include/apu.hw
+@@ -108,6 +108,7 @@
+ #define APU_HAVE_SDBM           1
+ 
+ #ifndef APU_DSO_MODULE_BUILD
++#define APU_HAVE_LMDB           0
+ #define APU_HAVE_GDBM           0
+ #define APU_HAVE_NDBM           0
+ #define APU_HAVE_DB             0
+diff --git a/include/apu.hwc b/include/apu.hwc
+index 2c3fa00..6eebe0b 100644
+--- a/include/apu.hwc
++++ b/include/apu.hwc
+@@ -108,6 +108,7 @@
+ #define APU_HAVE_SDBM           1
+ 
+ #ifndef APU_DSO_MODULE_BUILD
++#define APU_HAVE_LMDB           0
+ #define APU_HAVE_GDBM           0
+ #define APU_HAVE_NDBM           0
+ #define APU_HAVE_DB             0
+diff --git a/include/private/apr_dbm_private.h b/include/private/apr_dbm_private.h
+index 020d3a6..e2032b4 100644
+--- a/include/private/apr_dbm_private.h
++++ b/include/private/apr_dbm_private.h
+@@ -112,6 +112,7 @@ struct apr_dbm_t
+ APU_MODULE_DECLARE_DATA extern const apr_dbm_type_t apr_dbm_type_sdbm;
+ APU_MODULE_DECLARE_DATA extern const apr_dbm_type_t apr_dbm_type_gdbm;
+ APU_MODULE_DECLARE_DATA extern const apr_dbm_type_t apr_dbm_type_ndbm;
++APU_MODULE_DECLARE_DATA extern const apr_dbm_type_t apr_dbm_type_lmdb;
+ APU_MODULE_DECLARE_DATA extern const apr_dbm_type_t apr_dbm_type_db;
+ 
+ #ifdef __cplusplus
+diff --git a/include/private/apu_select_dbm.h.in b/include/private/apu_select_dbm.h.in
+index b69aec0..b431c61 100644
+--- a/include/private/apu_select_dbm.h.in
++++ b/include/private/apu_select_dbm.h.in
+@@ -21,6 +21,7 @@
+ ** The following macros control what features APRUTIL will use
+ */
+ #define APU_USE_SDBM    @apu_use_sdbm@
++#define APU_USE_LMDB    @apu_use_lmdb@
+ #define APU_USE_NDBM    @apu_use_ndbm@
+ #define APU_USE_GDBM    @apu_use_gdbm@
+ #define APU_USE_DB      @apu_use_db@
+diff --git a/test/testdbm.c b/test/testdbm.c
+index 4f6becb..df679f4 100644
+--- a/test/testdbm.c
++++ b/test/testdbm.c
+@@ -153,6 +153,9 @@ static void test_dbm_traversal(abts_case *tc, apr_dbm_t *db, dbm_table_t *table)
+ 
+         rv = apr_dbm_nextkey(db, &key);
+         ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
++
++        /** avoid infinite loop */
++        if (rv != APR_SUCCESS) break;
+     } while (1);
+ 
+     for (i = 0; i < NUM_TABLE_ROWS; i++) {
+@@ -170,6 +173,7 @@ static void test_dbm(abts_case *tc, void *data)
+     dbm_table_t *table;
+     const char *type = data;
+     const char *file = apr_pstrcat(p, "data/test-", type, NULL);
++    const char *nofile = apr_pstrcat(p, "data/no-such-test-", type, NULL);
+ 
+     rv = apr_dbm_open_ex(&db, type, file, APR_DBM_RWCREATE, APR_OS_DEFAULT, p);
+     ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+@@ -198,12 +202,18 @@ static void test_dbm(abts_case *tc, void *data)
+     test_dbm_fetch(tc, db, table);
+ 
+     apr_dbm_close(db);
++
++    rv = apr_dbm_open_ex(&db, type, nofile, APR_DBM_READONLY, APR_FPROT_OS_DEFAULT, p);
++    ABTS_TRUE(tc, rv != APR_SUCCESS);
+ }
+ 
+ abts_suite *testdbm(abts_suite *suite)
+ {
+     suite = ADD_SUITE(suite);
+ 
++#if APU_HAVE_LMDB
++    abts_run_test(suite, test_dbm, "lmdb");
++#endif
+ #if APU_HAVE_GDBM
+     abts_run_test(suite, test_dbm, "gdbm");
+ #endif
diff --git a/SOURCES/apr-util-1.6.3-r1908584.patch b/SOURCES/apr-util-1.6.3-r1908584.patch
new file mode 100644
index 0000000..102ed7c
--- /dev/null
+++ b/SOURCES/apr-util-1.6.3-r1908584.patch
@@ -0,0 +1,486 @@
+# ./pullrev.sh 1908584
+
+http://svn.apache.org/viewvc?view=revision&revision=1908584
+
++ Forcibly disable ENGINE support.
+
+--- apr-1.6.3/build/crypto.m4
++++ apr-1.6.3/build/crypto.m4
+@@ -53,11 +53,11 @@
+             crypto_library_enabled=1
+           fi
+         done
+-	if test "$crypto_library_enabled" = "1"; then
++        if test "$crypto_library_enabled" = "1"; then
+           AC_MSG_NOTICE([Crypto was requested but no crypto library was found; autodetecting possible libraries])
+         else
+           AC_ERROR([Crypto was requested but all possible crypto libraries were disabled.])
+-	fi
++        fi
+       fi
+ 
+       APU_CHECK_CRYPTO_OPENSSL
+@@ -91,15 +91,14 @@
+     if test "$withval" = "yes"; then
+       AC_CHECK_HEADERS(openssl/x509.h, [openssl_have_headers=1])
+       AC_CHECK_LIB(crypto, EVP_CIPHER_CTX_new, AC_CHECK_LIB(ssl, SSL_accept, [openssl_have_libs=1],,-lcrypto))
+-      if test "$openssl_have_headers" != "0" && test "$openssl_have_libs" != "0"; then
++      if test "$openssl_have_headers" = "1" && test "$openssl_have_libs" = "1"; then
+         apu_have_openssl=1
+       fi
+     elif test "$withval" = "no"; then
+       apu_have_openssl=0
+     else
+-
+       openssl_CPPFLAGS="-I$withval/include"
+-      openssl_LDFLAGS="-L$withval/lib "
++      openssl_LDFLAGS="-L$withval/lib -L$withval/lib64"
+ 
+       APR_ADDTO(CPPFLAGS, [$openssl_CPPFLAGS])
+       APR_ADDTO(LDFLAGS, [$openssl_LDFLAGS])
+@@ -107,16 +106,16 @@
+       AC_MSG_NOTICE(checking for openssl in $withval)
+       AC_CHECK_HEADERS(openssl/x509.h, [openssl_have_headers=1])
+       AC_CHECK_LIB(crypto, EVP_CIPHER_CTX_new, AC_CHECK_LIB(ssl, SSL_accept, [openssl_have_libs=1],,-lcrypto))
+-      if test "$openssl_have_headers" != "0" && test "$openssl_have_libs" != "0"; then
++      if test "$openssl_have_headers" = "1" && test "$openssl_have_libs" = "1"; then
+         apu_have_openssl=1
+-        APR_ADDTO(APRUTIL_LDFLAGS, [-L$withval/lib])
+-        APR_ADDTO(APRUTIL_INCLUDES, [-I$withval/include])
++        APR_ADDTO(APRUTIL_INCLUDES, [$openssl_CPPFLAGS])
++        APR_ADDTO(APRUTIL_LDFLAGS, [$openssl_LDFLAGS])
+       fi
+-
+-      AC_CHECK_DECLS([EVP_PKEY_CTX_new], [], [],
+-                     [#include ])
+-
+     fi
++    if test "$apu_have_openssl" = "1"; then
++        AC_CHECK_LIB(crypto, OPENSSL_init_crypto)
++        AC_CHECK_FUNCS([OPENSSL_init_crypto])
++    fi
+   ], [
+     apu_have_openssl=0
+   ])
+@@ -130,18 +129,12 @@
+     apu_have_crypto=1
+ 
+     AC_MSG_CHECKING([for const input buffers in OpenSSL])
+-    AC_TRY_COMPILE([#include ],
+-        [ const unsigned char * buf;
+-          unsigned char * outbuf;
+-          RSA rsa;
+-
+-                RSA_private_decrypt(1,
+-                                                        buf,
+-                                                        outbuf,
+-                                                        &rsa,
+-                                                        RSA_PKCS1_PADDING);
+-
+-        ],
++    AC_TRY_COMPILE(
++        [#include ],
++        [ EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
++          const unsigned char key[128] = {0}, iv[128] = {0};
++          EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv);
++          EVP_CIPHER_CTX_free(ctx); ],
+         [AC_MSG_RESULT([yes])]
+         [AC_DEFINE([CRYPTO_OPENSSL_CONST_BUFFERS], 1, [Define that OpenSSL uses const buffers])],
+         [AC_MSG_RESULT([no])])
+--- apr-1.6.3/crypto/apr_crypto_openssl.c
++++ apr-1.6.3/crypto/apr_crypto_openssl.c
+@@ -17,6 +17,7 @@
+ #include "apr_lib.h"
+ #include "apu.h"
+ #include "apu_errno.h"
++#include "apu_config.h"
+ 
+ #include 
+ #include 
+@@ -30,24 +31,69 @@
+ 
+ #if APU_HAVE_CRYPTO
+ 
++#ifndef OPENSSL_API_COMPAT
++#define OPENSSL_API_COMPAT 0x10101000L /* for ENGINE API */
++#endif
++
+ #include 
+ #include 
+ #include 
++#include 
++#if OPENSSL_VERSION_NUMBER >= 0x30000000
++#include 
++#include 
++#endif
+ 
+-#define LOG_PREFIX "apr_crypto_openssl: "
++#if defined(LIBRESSL_VERSION_NUMBER)
+ 
+-#ifndef APR_USE_OPENSSL_PRE_1_1_API
+-#if defined(LIBRESSL_VERSION_NUMBER)
+ /* LibreSSL declares OPENSSL_VERSION_NUMBER == 2.0 but does not include most
+  * changes from OpenSSL >= 1.1 (new functions, macros, deprecations, ...), so
+  * we have to work around this...
+  */
+-#define APR_USE_OPENSSL_PRE_1_1_API (1)
++#define APR_USE_OPENSSL_PRE_1_0_API     0
++#if LIBRESSL_VERSION_NUMBER < 0x2070000f
++#define APR_USE_OPENSSL_PRE_1_1_API     1
+ #else
+-#define APR_USE_OPENSSL_PRE_1_1_API (OPENSSL_VERSION_NUMBER < 0x10100000L)
++#define APR_USE_OPENSSL_PRE_1_1_API     0
+ #endif
++/* TODO: keep up with LibreSSL latest versions */
++#define APR_USE_OPENSSL_PRE_1_1_1_API   1
++#define APR_USE_OPENSSL_PRE_3_0_API     1
++
++#else  /* defined(LIBRESSL_VERSION_NUMBER) */
++
++#if OPENSSL_VERSION_NUMBER < 0x10000000L
++#define APR_USE_OPENSSL_PRE_1_0_API     1
++#else
++#define APR_USE_OPENSSL_PRE_1_0_API     0
+ #endif
++#if OPENSSL_VERSION_NUMBER < 0x10100000L
++#define APR_USE_OPENSSL_PRE_1_1_API     1
++#else
++#define APR_USE_OPENSSL_PRE_1_1_API     0
++#endif
++#if OPENSSL_VERSION_NUMBER < 0x10101000L
++#define APR_USE_OPENSSL_PRE_1_1_1_API   1
++#else
++#define APR_USE_OPENSSL_PRE_1_1_1_API   0
++#endif
++#if OPENSSL_VERSION_NUMBER < 0x30000000L
++#define APR_USE_OPENSSL_PRE_3_0_API     1
++#else
++#define APR_USE_OPENSSL_PRE_3_0_API     0
++#endif
+ 
++#endif /* defined(LIBRESSL_VERSION_NUMBER) */
++
++#if APR_USE_OPENSSL_PRE_3_0_API \
++    || (defined(OPENSSL_API_LEVEL) && OPENSSL_API_LEVEL < 30000)
++#define APR_USE_OPENSSL_ENGINE_API 0
++#else
++#define APR_USE_OPENSSL_ENGINE_API 0
++#endif
++
++#define LOG_PREFIX "apr_crypto_openssl: "
++
+ struct apr_crypto_t {
+     apr_pool_t *pool;
+     const apr_crypto_driver_t *provider;
+@@ -58,7 +104,11 @@
+ };
+ 
+ struct apr_crypto_config_t {
++#if APR_USE_OPENSSL_ENGINE_API
+     ENGINE *engine;
++#else
++    void *engine;
++#endif
+ };
+ 
+ struct apr_crypto_key_t {
+@@ -113,9 +163,21 @@
+  */
+ static apr_status_t crypto_shutdown(void)
+ {
++#if HAVE_OPENSSL_INIT_CRYPTO
++    /* Openssl v1.1+ handles all termination automatically. Do
++     * nothing in this case.
++     */
++
++#else
++    /* Termination below is for legacy Openssl versions v1.0.x and
++     * older.
++     */
++
+     ERR_free_strings();
+     EVP_cleanup();
+     ENGINE_cleanup();
++#endif
++
+     return APR_SUCCESS;
+ }
+ 
+@@ -130,6 +192,19 @@
+ static apr_status_t crypto_init(apr_pool_t *pool, const char *params,
+         const apu_err_t **result)
+ {
++#if HAVE_OPENSSL_INIT_CRYPTO
++    /* Openssl v1.1+ handles all initialisation automatically, apart
++     * from hints as to how we want to use the library.
++     *
++     * We tell openssl we want to include engine support.
++     */
++    OPENSSL_init_crypto(OPENSSL_INIT_ENGINE_ALL_BUILTIN, NULL);
++
++#else
++    /* Configuration below is for legacy versions Openssl v1.0 and
++     * older.
++     */
++
+ #if APR_USE_OPENSSL_PRE_1_1_API
+     (void)CRYPTO_malloc_init();
+ #else
+@@ -140,6 +215,7 @@
+     OpenSSL_add_all_algorithms();
+     ENGINE_load_builtin_engines();
+     ENGINE_register_all_complete();
++#endif
+ 
+     apr_pool_cleanup_register(pool, pool, crypto_shutdown_helper,
+             apr_pool_cleanup_null);
+@@ -203,12 +279,13 @@
+  */
+ static apr_status_t crypto_cleanup(apr_crypto_t *f)
+ {
+-
++#if APR_USE_OPENSSL_ENGINE_API
+     if (f->config->engine) {
+         ENGINE_finish(f->config->engine);
+         ENGINE_free(f->config->engine);
+         f->config->engine = NULL;
+     }
++#endif
+     return APR_SUCCESS;
+ 
+ }
+@@ -235,11 +312,10 @@
+         const apr_crypto_driver_t *provider, const char *params,
+         apr_pool_t *pool)
+ {
+-    apr_crypto_config_t *config = NULL;
+-    apr_crypto_t *f = apr_pcalloc(pool, sizeof(apr_crypto_t));
+-
++    apr_crypto_t *f;
++    apr_crypto_config_t *config;
+     const char *engine = NULL;
+-
++    apr_status_t status = APR_SUCCESS;
+     struct {
+         const char *field;
+         const char *value;
+@@ -253,8 +329,9 @@
+     char **elts = NULL;
+     char *elt;
+     int i = 0, j;
+-    apr_status_t status;
+ 
++    *ff = NULL;
++
+     if (params) {
+         if (APR_SUCCESS != (status = apr_tokenize_to_argv(params, &elts, pool))) {
+             return status;
+@@ -287,25 +364,45 @@
+         engine = fields[0].value;
+     }
+ 
++    f = apr_pcalloc(pool, sizeof(apr_crypto_t));
+     if (!f) {
+         return APR_ENOMEM;
+     }
+-    *ff = f;
+-    f->pool = pool;
+-    f->provider = provider;
+-    config = f->config = apr_pcalloc(pool, sizeof(apr_crypto_config_t));
++    f->config = config = apr_pcalloc(pool, sizeof(apr_crypto_config_t));
+     if (!config) {
+         return APR_ENOMEM;
+     }
++    f->pool = pool;
++    f->provider = provider;
+ 
++    /* The default/builtin "openssl" engine is the same as NULL though with
++     * openssl-3+ it's called something else, keep NULL for that name.
++     */
++    if (engine && strcasecmp(engine, "openssl") != 0) {
++#if APR_USE_OPENSSL_ENGINE_API
++        config->engine = ENGINE_by_id(engine);
++        if (!config->engine) {
++            return APR_ENOENGINE;
++        }
++        if (!ENGINE_init(config->engine)) {
++            status = APR_EINITENGINE;
++            goto cleanup;
++        }
++#else
++        return APR_ENOTIMPL;
++#endif
++    }
++
+     f->result = apr_pcalloc(pool, sizeof(apu_err_t));
+     if (!f->result) {
+-        return APR_ENOMEM;
++        status = APR_ENOMEM;
++        goto cleanup;
+     }
+ 
+     f->types = apr_hash_make(pool);
+     if (!f->types) {
+-        return APR_ENOMEM;
++        status = APR_ENOMEM;
++        goto cleanup;
+     }
+     apr_hash_set(f->types, "3des192", APR_HASH_KEY_STRING, &(key_types[0]));
+     apr_hash_set(f->types, "aes128", APR_HASH_KEY_STRING, &(key_types[1]));
+@@ -314,28 +411,20 @@
+ 
+     f->modes = apr_hash_make(pool);
+     if (!f->modes) {
+-        return APR_ENOMEM;
++        status = APR_ENOMEM;
++        goto cleanup;
+     }
+     apr_hash_set(f->modes, "ecb", APR_HASH_KEY_STRING, &(key_modes[0]));
+     apr_hash_set(f->modes, "cbc", APR_HASH_KEY_STRING, &(key_modes[1]));
+ 
++    *ff = f;
+     apr_pool_cleanup_register(pool, f, crypto_cleanup_helper,
+-            apr_pool_cleanup_null);
+-
+-    if (engine) {
+-        config->engine = ENGINE_by_id(engine);
+-        if (!config->engine) {
+-            return APR_ENOENGINE;
+-        }
+-        if (!ENGINE_init(config->engine)) {
+-            ENGINE_free(config->engine);
+-            config->engine = NULL;
+-            return APR_EINITENGINE;
+-        }
+-    }
+-
++                              apr_pool_cleanup_null);
+     return APR_SUCCESS;
+ 
++cleanup:
++    crypto_cleanup(f);
++    return status;
+ }
+ 
+ /**
+@@ -435,7 +524,7 @@
+         return APR_ENOMEM;
+     }
+     apr_crypto_clear(p, key->key, key->keyLen);
+-
++ 
+     return APR_SUCCESS;
+ }
+ 
+--- apr-1.6.3/test/testcrypto.c
++++ apr-1.6.3/test/testcrypto.c
+@@ -483,6 +483,10 @@
+ 
+     f1 = make(tc, pool, driver1);
+     f2 = make(tc, pool, driver2);
++    if (!f1 || !f2) {
++        return;
++    }
++
+     key1 = passphrase(tc, pool, driver1, f1, type, mode, doPad, description);
+     key2 = passphrase(tc, pool, driver2, f2, type, mode, doPad, description);
+ 
+@@ -577,6 +581,10 @@
+     driver = get_openssl_driver(tc, pool);
+ 
+     f = make(tc, pool, driver);
++    if (!f) {
++        return;
++    }
++
+     keysecret(tc, pool, driver, f, APR_KEY_AES_256, APR_MODE_CBC, 1, 32,
+             "KEY_AES_256/MODE_CBC");
+     apr_pool_destroy(pool);
+@@ -596,6 +604,10 @@
+     driver = get_nss_driver(tc, pool);
+ 
+     f = make(tc, pool, driver);
++    if (!f) {
++        return;
++    }
++
+     keysecret(tc, pool, driver, f, APR_KEY_AES_256, APR_MODE_CBC, 1, 32,
+             "KEY_AES_256/MODE_CBC");
+     apr_pool_destroy(pool);
+@@ -615,6 +627,10 @@
+     driver = get_commoncrypto_driver(tc, pool);
+ 
+     f = make(tc, pool, driver);
++    if (!f) {
++        return;
++    }
++
+     keysecret(tc, pool, driver, f, APR_KEY_AES_256, APR_MODE_CBC, 1, 32,
+             "KEY_AES_256/MODE_CBC");
+     apr_pool_destroy(pool);
+@@ -1166,6 +1182,10 @@
+     if (driver) {
+ 
+         f = make(tc, pool, driver);
++        if (!f) {
++            return;
++        }
++
+         apr_crypto_get_block_key_types(&types, f);
+ 
+         key_3des_192 = apr_hash_get(types, "3des192", APR_HASH_KEY_STRING);
+@@ -1209,6 +1229,10 @@
+     if (driver) {
+ 
+         f = make(tc, pool, driver);
++        if (!f) {
++            return;
++        }
++
+         apr_crypto_get_block_key_types(&types, f);
+ 
+         key_3des_192 = apr_hash_get(types, "3des192", APR_HASH_KEY_STRING);
+@@ -1252,6 +1276,10 @@
+     if (driver) {
+ 
+         f = make(tc, pool, driver);
++        if (!f) {
++            return;
++        }
++
+         apr_crypto_get_block_key_types(&types, f);
+ 
+         key_3des_192 = apr_hash_get(types, "3des192", APR_HASH_KEY_STRING);
+@@ -1293,6 +1321,10 @@
+     if (driver) {
+ 
+         f = make(tc, pool, driver);
++        if (!f) {
++            return;
++        }
++
+         apr_crypto_get_block_key_modes(&modes, f);
+ 
+         mode_ecb = apr_hash_get(modes, "ecb", APR_HASH_KEY_STRING);
+@@ -1326,6 +1358,10 @@
+     if (driver) {
+ 
+         f = make(tc, pool, driver);
++        if (!f) {
++            return;
++        }
++
+         apr_crypto_get_block_key_modes(&modes, f);
+ 
+         mode_ecb = apr_hash_get(modes, "ecb", APR_HASH_KEY_STRING);
+@@ -1359,6 +1395,10 @@
+     if (driver) {
+ 
+         f = make(tc, pool, driver);
++        if (!f) {
++            return;
++        }
++
+         apr_crypto_get_block_key_modes(&modes, f);
+ 
+         mode_ecb = apr_hash_get(modes, "ecb", APR_HASH_KEY_STRING);
diff --git a/SOURCES/apr-util-1.6.3-r1908585.patch b/SOURCES/apr-util-1.6.3-r1908585.patch
new file mode 100644
index 0000000..e2abbbc
--- /dev/null
+++ b/SOURCES/apr-util-1.6.3-r1908585.patch
@@ -0,0 +1,22 @@
+# ./pullrev.sh 1908585
+http://svn.apache.org/viewvc?view=revision&revision=1908585
+
+--- apr-util-1.6.3/test/testbuckets.c
++++ apr-util-1.6.3/test/testbuckets.c
+@@ -100,12 +100,12 @@
+     apr_size_t len = elen;
+     char msg[200];
+ 
+-    sprintf(msg, "%s: flatten brigade", ctx);
++    apr_snprintf(msg, sizeof msg, "%s: flatten brigade", ctx);
+     apr_assert_success(tc, msg, apr_brigade_flatten(bb, buf, &len));
+-    sprintf(msg, "%s: length match (%ld not %ld)", ctx,
+-            (long)len, (long)elen);
++    apr_snprintf(msg, sizeof msg, "%s: length match (%ld not %ld)", ctx,
++                 (long)len, (long)elen);
+     ABTS_ASSERT(tc, msg, len == elen);
+-    sprintf(msg, "%s: result match", msg);
++    apr_snprintf(msg, sizeof msg, "%s: result match", ctx);
+     ABTS_STR_NEQUAL(tc, expect, buf, len);
+     free(buf);
+ }
diff --git a/SOURCES/apr-util-1.6.3-r1908586.patch b/SOURCES/apr-util-1.6.3-r1908586.patch
new file mode 100644
index 0000000..d7dcfbf
--- /dev/null
+++ b/SOURCES/apr-util-1.6.3-r1908586.patch
@@ -0,0 +1,16 @@
+
+https://svn.apache.org/viewvc?view=revision&revision=1908586
+
+--- apr-util/dbd/apr_dbd_odbc.c
++++ apr-util/dbd/apr_dbd_odbc.c
+@@ -582,8 +582,8 @@
+                     (textmode ? atoi(args[*argp]) : *(short *)args[*argp]);
+                 break;
+             case SQL_INTEGER:
+-                ptr = apr_palloc(pool, sizeof(int));
+-                len = sizeof(int);
++                ptr = apr_palloc(pool, sizeof(long));
++                len = sizeof(long);
+                 *(long *)ptr =
+                     (textmode ? atol(args[*argp]) : *(long *)args[*argp]);
+                 break;
diff --git a/SOURCES/apr-util-configure-c99.patch b/SOURCES/apr-util-configure-c99.patch
new file mode 100644
index 0000000..4e387be
--- /dev/null
+++ b/SOURCES/apr-util-configure-c99.patch
@@ -0,0 +1,18 @@
+Add a missing implied int in the Berkeley DB configure probe.  This
+avoids build failures with future Fedora toolchain defaults.
+ 
+Submitted upstream: 
+
+diff --git a/build/dbm.m4 b/build/dbm.m4
+index 57bd131fc3b74099..ffdbdbc0f43e04da 100644
+--- a/build/dbm.m4
++++ b/build/dbm.m4
+@@ -235,7 +235,7 @@ AC_DEFUN([APU_TRY_BERKELEY_DB],
+ #include 
+ #include 
+ #include <$apu_try_berkeley_db_header>
+-main ()
++int main ()
+ {
+   int major, minor, patch;
+ 
diff --git a/SPECS/apr-util.spec b/SPECS/apr-util.spec
new file mode 100644
index 0000000..f300bcb
--- /dev/null
+++ b/SPECS/apr-util.spec
@@ -0,0 +1,823 @@
+
+%define aprver 1
+
+%if 0%{?fedora} < 39 && 0%{?rhel} <= 9
+%global with_lmdb 0
+%else
+%global with_lmdb 1
+%endif
+
+%if %{with_lmdb}
+%define dbdep lmdb-devel
+%else
+%if 0%{?fedora} < 18 && 0%{?rhel} < 7
+%define dbdep db4-devel
+%else
+%define dbdep libdb-devel
+%endif
+%endif
+
+%if 0%{?fedora} < 27 && 0%{?rhel} <= 7
+%global with_nss 1
+%else
+%global with_nss 0
+%endif
+
+%if 0%{?fedora} < 36 && 0%{?rhel} <= 9
+%global ldaplib ldap_r
+%else
+%global ldaplib ldap
+%endif
+
+# Disable .la file removal since the .la file is exported via apu-config.
+%global __brp_remove_la_files %nil
+
+%define apuver 1
+
+Summary: Apache Portable Runtime Utility library
+Name: apr-util
+Version: 1.6.3
+Release: 20%{?dist}
+# Apache-2.0:  everything
+# RSA-MD:      https://gitlab.com/fedora/legal/fedora-legal-docs/-/merge_requests/187
+#              include\apr_md5.h, passwd\apr_md5.c, crypto\apr_md4.c, include\apr_md4.h
+#
+# LicenseRef-Fedora-Public-Domain: crypto\crypt_blowfish.c, crypto\crypt_blowfish.h
+# Beerware:                        passwd\apr_md5.c
+# OLDAP-2.7 AND BSD-4.3RENO:       ldap/apr_ldap_url.c
+License: Apache-2.0 AND (Beerware AND LicenseRef-Fedora-Public-Domain AND OLDAP-2.7 AND BSD-4.3RENO)
+URL: https://apr.apache.org/
+Source0: https://www.apache.org/dist/apr/%{name}-%{version}.tar.bz2
+Patch1: apr-util-1.2.7-pkgconf.patch
+Patch2: apr-util-1.4.1-private.patch
+Patch3: apr-util-1.6.3-allow-ipv6.patch
+Patch4: apr-util-configure-c99.patch
+Patch5: apr-util-1.6.3-lmdb-support.patch
+Patch6: apr-util-1.6.3-r1908584.patch
+Patch7: apr-util-1.6.3-r1908585.patch
+Patch8: apr-util-1.6.3-r1908586.patch
+Patch9: apr-util-1.6.3-drop-engine-headers.patch
+BuildRequires: gcc
+BuildRequires: autoconf, apr-devel >= 1.3.0
+BuildRequires: %{dbdep}, expat-devel, libuuid-devel
+Recommends: apr-util-openssl%{_isa} = %{version}-%{release}
+%if %{with_lmdb}
+Recommends: apr-util-lmdb%{_isa} = %{version}-%{release}
+%else
+%if 0%{?fedora} < 27
+Requires: apr-util-bdb%{?_isa} = %{version}-%{release}
+%else
+Recommends: apr-util-bdb%{_isa} = %{version}-%{release}
+%endif
+%endif
+
+%description
+The mission of the Apache Portable Runtime (APR) is to provide a
+free library of C data structures and routines.  This library
+contains additional utility interfaces for APR; including support
+for XML, LDAP, database interfaces, URI parsing and more.
+
+%package devel
+Summary: APR utility library development kit
+Requires: apr-util%{?_isa} = %{version}-%{release}, apr-devel%{?_isa}, pkgconfig
+Requires: expat-devel%{?_isa}, openldap-devel%{?_isa}
+
+%description devel
+This package provides the support files which can be used to 
+build applications using the APR utility library.  The mission 
+of the Apache Portable Runtime (APR) is to provide a free 
+library of C data structures and routines.
+
+%package pgsql
+Summary: APR utility library PostgreSQL DBD driver
+BuildRequires: libpq-devel
+Requires: apr-util%{?_isa} = %{version}-%{release}
+
+%description pgsql
+This package provides the PostgreSQL driver for the apr-util
+DBD (database abstraction) interface.
+
+%if %{with_lmdb}
+%package lmdb
+Summary: APR utility library LMDB driver
+Requires: apr-util%{?_isa} = %{version}-%{release}
+# Remove libdb dependency from apr-util
+# https://bugzilla.redhat.com/show_bug.cgi?id=1779267
+Obsoletes: apr-util-bdb < 1.6.3-13
+Provides: apr-util-%{aprver}(dbm)%{?_isa} = %{version}-%{release}
+
+%description lmdb
+This package provides the LMDB driver for the apr-util
+DBM (database abstraction) interface.
+%else
+%package bdb
+Summary: APR utility library Berkeley DB driver
+Requires: apr-util%{?_isa} = %{version}-%{release}
+Provides: apr-util-%{aprver}(dbm)%{?_isa} = %{version}-%{release}
+
+%description bdb
+This package provides the Berkeley DB driver for the apr-util
+DBM (database abstraction) interface.
+%endif
+
+%package mysql
+Summary: APR utility library MySQL DBD driver
+BuildRequires: mariadb-connector-c-devel
+Requires: apr-util%{?_isa} = %{version}-%{release}
+
+%description mysql
+This package provides the MySQL driver for the apr-util DBD
+(database abstraction) interface.
+
+%package sqlite
+Summary: APR utility library SQLite DBD driver
+BuildRequires: sqlite-devel >= 3.0.0
+Requires: apr-util%{?_isa} = %{version}-%{release}
+
+%description sqlite
+This package provides the SQLite driver for the apr-util DBD
+(database abstraction) interface.
+
+%package odbc
+Summary: APR utility library ODBC DBD driver
+BuildRequires: unixODBC-devel
+Requires: apr-util%{?_isa} = %{version}-%{release}
+
+%description odbc
+This package provides the ODBC driver for the apr-util DBD
+(database abstraction) interface.
+
+%package ldap
+Summary: APR utility library LDAP support
+BuildRequires: openldap-devel
+Requires: apr-util%{?_isa} = %{version}-%{release}
+
+%description ldap
+This package provides the LDAP support for the apr-util.
+
+%package openssl
+Summary: APR utility library OpenSSL crypto support
+BuildRequires: openssl-devel
+Requires: apr-util%{?_isa} = %{version}-%{release}
+
+%description openssl
+This package provides the OpenSSL crypto support for the apr-util.
+
+%if %{with_nss}
+%package nss
+Summary: APR utility library NSS crypto support
+BuildRequires: nss-devel
+BuildRequires: make
+Requires: apr-util%{?_isa} = %{version}-%{release}
+
+%description nss
+This package provides the NSS crypto support for the apr-util.
+%endif
+
+%prep
+%autosetup -p1
+
+: Configured for LDAP library: %{ldaplib}
+: Configured for DBM library: %{dbdep}
+
+%build
+autoheader && autoconf
+# A fragile autoconf test which fails if the code trips
+# any other warning; force correct result for OpenLDAP:
+export ac_cv_ldap_set_rebind_proc_style=three
+%configure --with-apr=%{_prefix} \
+        --includedir=%{_includedir}/apr-%{apuver} \
+        --with-ldap=%{ldaplib} --without-gdbm \
+        --with-sqlite3 --with-pgsql --with-mysql --with-odbc \
+%if %{with_lmdb}
+        --with-dbm=lmdb --with-lmdb \
+%else
+        --with-dbm=db5 --with-berkeley-db \
+%endif
+        --without-sqlite2 \
+        --with-crypto --with-openssl \
+%if %{with_nss}
+        --with-nss \
+%else
+        --without-nss \
+%endif
+   || { cat config.log; exit 1; }
+%{make_build}
+
+%install
+rm -rf $RPM_BUILD_ROOT
+%{make_install}
+
+mkdir -p $RPM_BUILD_ROOT/%{_datadir}/aclocal
+install -m 644 build/find_apu.m4 $RPM_BUILD_ROOT/%{_datadir}/aclocal
+
+# Unpackaged files; remove the static libaprutil
+rm -f $RPM_BUILD_ROOT%{_libdir}/aprutil.exp \
+      $RPM_BUILD_ROOT%{_libdir}/libapr*.a
+
+# And remove the reference to the static libaprutil from the .la
+# file.
+sed -i '/^old_library/s,libapr.*\.a,,' \
+      $RPM_BUILD_ROOT%{_libdir}/libapr*.la
+
+# Remove unnecessary exports from dependency_libs
+sed -ri '/^dependency_libs/{s,-l(pq|sqlite[0-9]|rt|dl|uuid) ,,g}' \
+      $RPM_BUILD_ROOT%{_libdir}/libapr*.la
+
+# Trim libtool DSO cruft
+rm -f $RPM_BUILD_ROOT%{_libdir}/apr-util-%{apuver}/*.*a
+
+%check
+# Run the less verbose test suites
+export MALLOC_CHECK_=2 MALLOC_PERTURB_=$(($RANDOM % 255 + 1))
+cd test
+%{make_build} testall
+# testall breaks with DBD DSO; ignore
+export LD_LIBRARY_PATH=%{buildroot}/%{_libdir}/apr-util-%{apuver}
+./testall -v -q
+
+%ldconfig_scriptlets
+
+%files
+%doc CHANGES LICENSE NOTICE
+%{_libdir}/libaprutil-%{apuver}.so.*
+%dir %{_libdir}/apr-util-%{apuver}
+
+%if %{with_lmdb}
+%files lmdb
+%{_libdir}/apr-util-%{apuver}/apr_dbm_lmdb*
+%else
+%files bdb
+%{_libdir}/apr-util-%{apuver}/apr_dbm_db*
+%endif
+
+%files pgsql
+%{_libdir}/apr-util-%{apuver}/apr_dbd_pgsql*
+
+%files mysql
+%{_libdir}/apr-util-%{apuver}/apr_dbd_mysql*
+
+%files sqlite
+%{_libdir}/apr-util-%{apuver}/apr_dbd_sqlite*
+
+%files odbc
+%{_libdir}/apr-util-%{apuver}/apr_dbd_odbc*
+
+%files ldap
+%{_libdir}/apr-util-%{apuver}/apr_ldap*
+
+%files openssl
+%{_libdir}/apr-util-%{apuver}/apr_crypto_openssl*
+
+%if %{with_nss}
+%files nss
+%{_libdir}/apr-util-%{apuver}/apr_crypto_nss*
+%endif
+
+%files devel
+%{_bindir}/apu-%{apuver}-config
+%{_libdir}/libaprutil-%{apuver}.la
+%{_libdir}/libaprutil-%{apuver}.so
+%{_includedir}/apr-%{apuver}/*.h
+%{_libdir}/pkgconfig/*.pc
+%{_datadir}/aclocal/*.m4
+
+%changelog
+* Tue Aug  6 2024 Joe Orton  - 1.6.3-20
+- restore -devel dep on openldap-devel to fix mod_perl FTBFS
+  Related: RHEL-50386
+
+* Mon Jul 29 2024 Luboš Uhliarik  - 1.6.3-19
+- Resolves: RHEL-50386 - drop unnecessary apr-util-devel dependencies
+- Related: RHEL-33728 - drop ENGINE support from apr_crypto
+
+* Tue Jun 25 2024 Joe Orton  - 1.6.3-18
+- drop ENGINE support from apr_crypto (RHEL-33728)
+- fix (harmless) gcc snprintf warning in testbuckets.c
+
+* Mon Jun 24 2024 Troy Dawson  - 1.6.3-17
+- Bump release for June 2024 mass rebuild
+
+* Thu Feb  8 2024 Joe Orton  - 1.6.3-16
+- fix ODBC type mismatch (r1908586)
+- use autosetup
+
+* Mon Jan 22 2024 Fedora Release Engineering  - 1.6.3-15
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
+
+* Fri Jan 19 2024 Fedora Release Engineering  - 1.6.3-14
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
+
+* Tue Dec 12 2023 Joe Orton  - 1.6.3-13
+- re-enable LMDB by default again for Fedora >= 40 (#1779267)
+
+* Thu Nov  2 2023 Joe Orton  - 1.6.3-12
+- add apr-util-1(dbm) as virtual provide for dbm drivers
+- disable LMDB for now
+
+* Fri Oct 27 2023 Joe Orton  - 1.6.3-11
+- remove Provides: for -bdb
+
+* Tue Oct 24 2023 Luboš Uhliarik  - 1.6.3-10
+- add LMDB support and use it on Fedora >= 40
+- Resolves: #1779267 - Remove libdb dependency from apr-util
+
+* Tue Oct 03 2023 Luboš Uhliarik  - 1.6.3-7
+- SPDX migration
+
+* Wed Aug 30 2023 Florian Weimer  - 1.6.3-5
+- Restore configure script port to C99
+
+* Wed Jul 19 2023 Fedora Release Engineering  - 1.6.3-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
+
+* Fri Jun 23 2023 Luboš Uhliarik  - 1.6.3-3
+- regression in IPv4 handling in r1907242. Cycle through the address list
+  handling v4/v6 addresses correctly
+
+* Fri Feb 10 2023 Luboš Uhliarik  - 1.6.3-2
+- memcache/apr_memcache.c (conn_connect): Allow use of IPv6
+
+* Thu Feb 02 2023 Luboš Uhliarik  - 1.6.3-1
+- new version 1.6.3
+
+* Wed Jan 18 2023 Fedora Release Engineering  - 1.6.1-24
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
+
+* Thu Dec 22 2022 Florian Weimer  - 1.6.1-23
+- Port configure script to C99
+
+* Wed Jul 20 2022 Fedora Release Engineering  - 1.6.1-22
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
+
+* Fri May 13 2022 Joe Orton  - 1.6.1-21
+- disable .la file removal
+
+* Fri Jan 28 2022 Joe Orton  - 1.6.1-20
+- fix build with OpenLDAP 2.6 (#2032706)
+
+* Wed Jan 19 2022 Fedora Release Engineering  - 1.6.1-19
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
+
+* Tue Sep 14 2021 Sahana Prasad  - 1.6.1-18
+- Rebuilt with OpenSSL 3.0.0
+
+* Wed Jul 21 2021 Fedora Release Engineering  - 1.6.1-17
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
+
+* Mon Feb 08 2021 Pavel Raiskup  - 1.6.1-16
+- rebuild for libpq ABI fix rhbz#1908268
+
+* Tue Jan 26 2021 Fedora Release Engineering  - 1.6.1-15
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
+
+* Mon Jul 27 2020 Fedora Release Engineering  - 1.6.1-14
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
+
+* Mon May 04 2020 Tom Stellard  - 1.6.1-13
+- Use make_build and make_install macros
+- https://docs.fedoraproject.org/en-US/packaging-guidelines/#_parallel_make
+
+* Tue Jan 28 2020 Fedora Release Engineering  - 1.6.1-12
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
+
+* Wed Jul 24 2019 Fedora Release Engineering  - 1.6.1-11
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
+
+* Thu Jan 31 2019 Fedora Release Engineering  - 1.6.1-10
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
+
+* Mon Jan 14 2019 Björn Esser  - 1.6.1-9
+- Rebuilt for libcrypt.so.2 (#1666033)
+
+* Wed Sep 26 2018 Joe Orton  - 1.6.1-8
+- Recommends: -openssl and -bdb so default crypto, dbm drivers are
+  always available (#1491151, #1633152)
+
+* Thu Jul 12 2018 Fedora Release Engineering  - 1.6.1-7
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
+
+* Fri Mar  9 2018 Bojan Smojver  - 1.6.1-6
+- add gcc build requirement
+
+* Wed Feb 07 2018 Fedora Release Engineering  - 1.6.1-5
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
+
+* Fri Jan 26 2018 Florian Weimer  - 1.6.1-4
+- Rebuild with new build flags embedded in apr
+
+* Sat Jan 20 2018 Björn Esser  - 1.6.1-3
+- Rebuilt for switch to libxcrypt
+
+* Tue Dec 19 2017 Honza Horak  - 1.6.1-2
+- Build with mariadb-connector-c
+
+* Wed Oct 25 2017 Luboš Uhliarik  - 1.6.1-1
+- new version 1.6.1
+
+* Mon Aug 21 2017 Joe Orton  - 1.6.0-1
+- update to 1.6.0 (#1460831)
+- move bdb support to loadable DSO in apr-util-dbd subpackage
+- drop NSS, freetds support
+
+* Wed Aug 02 2017 Fedora Release Engineering  - 1.5.4-7
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild
+
+* Wed Jul 26 2017 Fedora Release Engineering  - 1.5.4-6
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
+
+* Fri Feb 10 2017 Fedora Release Engineering  - 1.5.4-5
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
+
+* Mon Nov 14 2016 Joe Orton  - 1.5.4-4
+- update for OpenSSL 1.1.0
+
+* Wed Feb 03 2016 Fedora Release Engineering  - 1.5.4-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
+
+* Wed Jun 17 2015 Fedora Release Engineering  - 1.5.4-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
+
+* Mon Sep 22 2014 Jan Kaluza  - 1.5.4-1
+- update to 1.5.4
+
+* Fri Aug 15 2014 Fedora Release Engineering  - 1.5.3-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
+
+* Sat Jun 07 2014 Fedora Release Engineering  - 1.5.3-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
+
+* Tue Nov 26 2013 Joe Orton  - 1.5.3-1
+- update to 1.5.3
+
+* Sat Aug 03 2013 Fedora Release Engineering  - 1.5.2-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild
+
+* Thu May 09 2013 Jan Kaluza  - 1.5.2-3
+- do not build with freetds when it is not available
+
+* Tue Apr  9 2013 Joe Orton  - 1.5.2-2
+- update for aarch64
+
+* Tue Apr  9 2013 Joe Orton  - 1.5.2-1
+- update to 1.5.2
+
+* Thu Feb 07 2013 Jon Ciesla  - 1.4.1-8
+- Apply private patch from Merge Review BZ 225254.
+
+* Wed Nov 07 2012 Jan Kaluza  - 1.4.1-7
+- ensure we use latest libdb5 (not libdb4)
+
+* Thu Oct 18 2012 Joe Orton  - 1.4.1-6
+- use -lldap_r instead of -lldap
+
+* Wed Jul 18 2012 Fedora Release Engineering  - 1.4.1-5
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
+
+* Wed Jun  6 2012 Joe Orton  - 1.4.1-4
+- fix crypt_r failure modes (#819650)
+
+* Tue Apr 24 2012 Joe Orton  - 1.4.1-3
+- apply _isa to deps
+
+* Mon Apr 23 2012 Joe Orton  - 1.4.1-2
+- switch to libdb-devel
+
+* Thu Jan 12 2012 Fedora Release Engineering  - 1.4.1-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild
+
+* Thu Dec 15 2011 Bojan Smojver  - 1.4.1-1
+- bump up to 1.4.1
+
+* Fri May 20 2011 Bojan Smojver  - 1.3.12-1
+- bump up to 1.3.12
+
+* Wed May 11 2011 Bojan Smojver  - 1.3.11-2
+- fix crash in apr_ldap_rebind_init()
+
+* Mon May  9 2011 Bojan Smojver  - 1.3.11-1
+- bump up to 1.3.11
+
+* Wed Mar 23 2011 Dan Horák  - 1.3.10-7
+- rebuilt for mysql 5.5.10 (soname bump in libmysqlclient)
+
+* Wed Mar 23 2011 Joe Orton  - 1.3.10-6
+- rebuild for MySQL soname bump
+
+* Wed Mar  2 2011 Joe Orton  - 1.3.10-5
+- fix build
+
+* Wed Mar  2 2011 Joe Orton  - 1.3.10-4
+- rebuild
+
+* Mon Feb 07 2011 Fedora Release Engineering  - 1.3.10-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
+
+* Wed Dec 29 2010 Bojan Smojver  - 1.3.10-2
+- rebuild for MySQL 5.5.x
+
+* Tue Oct  5 2010 Joe Orton  - 1.3.10-1
+- update to 1.3.10
+
+* Wed Nov 25 2009 Joe Orton  - 1.3.9-3
+- rebuild for new BDB
+
+* Fri Aug 21 2009 Tomas Mraz  - 1.3.9-2
+- rebuilt with new openssl
+
+* Thu Aug  6 2009 Bojan Smojver  - 1.3.9-1
+- bump up to 1.3.9
+- CVE-2009-2412
+- allocator alignment fixes
+
+* Fri Jul 24 2009 Fedora Release Engineering  - 1.3.8-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild
+
+* Wed Jul 15 2009 Bojan Smojver  1.3.8-2
+- adjust apr-util-1.3.7-nodbmdso.patch
+
+* Wed Jul 15 2009 Bojan Smojver  1.3.8-1
+- bump up to 1.3.8
+
+* Wed Jul 15 2009 Bojan Smojver  1.3.7-5
+- BR: +libuuid-devel, -e2fsprogs-devel
+
+* Tue Jun  9 2009 Joe Orton  1.3.7-4
+- disable DBM-drivers-as-DSO support
+- backport r783046 from upstream
+
+* Mon Jun  8 2009 Bojan Smojver  - 1.3.7-3
+- make export of LD_LIBRARY_PATH simpler
+
+* Mon Jun  8 2009 Bojan Smojver  - 1.3.7-2
+- revert tests
+
+* Mon Jun  8 2009 Bojan Smojver  - 1.3.7-1
+- bump up to 1.3.7
+- CVE-2009-0023
+- "billion laughs" fix of apr_xml_* interface
+
+* Mon Feb 23 2009 Fedora Release Engineering  - 1.3.4-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild
+
+* Fri Jan 23 2009 Joe Orton  1.3.4-2
+- rebuild for new MySQL
+
+* Sat Aug 16 2008 Bojan Smojver  - 1.3.4-1
+- bump up to 1.3.4
+- drop PostgreSQL patch, fixed upstream
+
+* Wed Jul 16 2008 Bojan Smojver  - 1.3.2-8
+- beat the fuzz, rework apr-util-1.2.7-pkgconf.patch
+
+* Wed Jul 16 2008 Bojan Smojver  - 1.3.2-7
+- ship find_apu.m4, fix bug #455189
+
+* Thu Jul 10 2008 Tom "spot" Callaway  1.3.2-6
+- rebuild for new db4-4.7
+
+* Tue Jul  8 2008 Joe Orton  1.3.2-5
+- restore requires for openldap-devel from -devel
+
+* Wed Jul  2 2008 Bojan Smojver  - 1.3.2-4
+- properly fix PostgreSQL detection
+
+* Wed Jul  2 2008 Bojan Smojver  - 1.3.2-3
+- revert build dependencies, change from -2 didn't help
+- add apr-util-1.3.2-pgsql.patch (remove pgsql_LIBS during detection)
+
+* Wed Jul  2 2008 Bojan Smojver  - 1.3.2-2
+- try adding postgresql-server to build dependencies to pull some libs in
+
+* Thu Jun 19 2008 Bojan Smojver  - 1.3.2-1
+- bump up to 1.3.2
+
+* Sun Jun  1 2008 Bojan Smojver  - 1.3.0-1
+- bump up to 1.3.0
+
+* Tue Feb 19 2008 Fedora Release Engineering  - 1.2.12-5
+- Autorebuild for GCC 4.3
+
+* Tue Dec  4 2007 Joe Orton  1.2.12-4
+- rebuild for OpenLDAP soname bump
+
+* Mon Dec  3 2007 Bojan Smojver  - 1.2.12-3
+- remove all instances of MySQL flags being added to APRUTIL_LDFLAGS
+
+* Tue Nov 27 2007 Bojan Smojver  - 1.2.12-1
+- bump up to 1.2.12
+- drop MySQL DBD driver, shipped upstream
+- adjust various patches to apply
+- rework tests in %%check (1.2.x got tests from trunk)
+
+* Mon Sep 24 2007 Jesse Keating  - 1.2.10-2
+- Rebuild for upgrade path (add dist since that's now on F-7 branch)
+
+* Sun Sep  9 2007 Bojan Smojver  1.2.10-1
+- bump up to 1.2.10
+- pick up newly checked in MySQL DBD driver directly from ASF
+- remove dbdopen patch (fixed upstream)
+- remove xmlns patch (fixed upstream)
+- remove autoexpat patch (fixed upstream)
+
+* Sun Sep  2 2007 Joe Orton  1.2.8-12
+- rebuild for fixed APR 32-bit ABI
+- remove sqlite driver from main package (#274521)
+
+* Wed Aug 22 2007 Joe Orton  1.2.8-11
+- rebuild for expat soname bump
+
+* Tue Aug 21 2007 Joe Orton  1.2.8-10
+- fix License
+
+* Wed Aug  8 2007 Joe Orton  1.2.8-9
+- add rewrite of expat autoconf code (upstream r493791)
+- fix build for new glibc open()-as-macro
+- split out sqlite subpackage
+
+* Tue Jul  3 2007 Joe Orton  1.2.8-8
+- add fix for attribute namespace handling in apr_xml (PR 41908)
+
+* Thu Apr  5 2007 Joe Orton  1.2.8-7
+- remove old Conflicts, doxygen BR (#225254)
+
+* Fri Mar 23 2007 Joe Orton  1.2.8-6
+- add DBD DSO lifetime fix (r521327)
+
+* Thu Mar 22 2007 Joe Orton  1.2.8-5
+- drop doxygen documentation (which caused multilib conflicts)
+
+* Wed Feb 28 2007 Joe Orton  1.2.8-4
+- add mysql driver in -mysql subpackage (Bojan Smojver, #222237)
+
+* Tue Feb 27 2007 Joe Orton  1.2.8-3
+- build DBD drivers as DSOs (w/Bojan Smojver, #192922)
+- split out pgsql driver into -pgsql subpackage
+
+* Tue Dec  5 2006 Joe Orton  1.2.8-2
+- update to 1.2.8, pick up new libpq soname
+
+* Fri Dec  1 2006 Joe Orton  1.2.7-5
+- really rebuild for db45
+
+* Sat Nov 11 2006 Joe Orton  1.2.7-4
+- add support for BDB 4.5 from upstream, rebuild
+
+* Wed Jul 19 2006 Joe Orton  1.2.7-3
+- fix buildconf with autoconf 2.60
+
+* Wed Jul 12 2006 Jesse Keating  - 1.2.7-2.1
+- rebuild
+
+* Tue May  2 2006 Joe Orton  1.2.7-2
+- update to 1.2.7
+- use pkg-config in apu-1-config to make it libdir-agnostic
+
+* Thu Apr  6 2006 Joe Orton  1.2.6-2
+- update to 1.2.6
+- define LDAP_DEPRECATED in apr_ldap.h (r391985, #188073)
+
+* Fri Feb 10 2006 Jesse Keating  - 1.2.2-4.2
+- bump again for double-long bug on ppc(64)
+
+* Tue Feb 07 2006 Jesse Keating  - 1.2.2-4.1
+- rebuilt for new gcc4.1 snapshot and glibc changes
+
+* Mon Jan 30 2006 Joe Orton  1.2.2-4
+- rebuild to drop reference to libexpat.la
+
+* Wed Jan 18 2006 Joe Orton  1.2.2-3
+- disable sqlite2 support
+- BuildRequire e2fsprogs-devel
+- enable malloc paranoia in %%check
+
+* Tue Jan  3 2006 Jesse Keating  1.2.2-2.2
+- rebuilt again
+
+* Fri Dec 09 2005 Jesse Keating 
+- rebuilt
+
+* Tue Dec  6 2005 Joe Orton  1.2.2-2
+- trim exports from .la file/--libs output (#174924)
+
+* Fri Nov 25 2005 Joe Orton  1.2.2-1
+- update to 1.2.2
+
+* Thu Oct 20 2005 Joe Orton  0.9.7-3
+- fix epoch again
+
+* Thu Oct 20 2005 Joe Orton  0.9.7-2
+- update to 0.9.7
+- drop static libs (#170051)
+
+* Tue Jul 26 2005 Joe Orton  0.9.6-3
+- add FILE bucket fix for truncated files (#159191)
+- add epoch to dependencies
+
+* Fri Mar  4 2005 Joe Orton  0.9.6-2
+- rebuild
+
+* Wed Feb  9 2005 Joe Orton  0.9.6-1
+- update to 0.9.6
+
+* Wed Jan 19 2005 Joe Orton  0.9.5-3
+- restore db-4.3 detection lost in 0.9.5 upgrade
+
+* Wed Jan 19 2005 Joe Orton  0.9.5-2
+- rebuild
+
+* Mon Nov 22 2004 Joe Orton  0.9.5-1
+- update to 0.9.5
+
+* Thu Nov 11 2004 Jeff Johnson  0.9.4-19
+- actually explicitly check for and detect db-4.3.
+
+* Thu Nov 11 2004 Jeff Johnson  0.9.4-18
+- rebuild against db-4.3.21.
+
+* Fri Sep 17 2004 Joe Orton  0.9.4-17
+- add security fix for CAN-2004-0786
+
+* Sat Jun 19 2004 Joe Orton  0.9.4-16
+- have -devel require matching release of apr-util
+
+* Tue Jun 15 2004 Elliot Lee 
+- rebuilt
+
+* Thu Apr  1 2004 Joe Orton  0.9.4-14
+- fix use of SHA1 passwords (#119651)
+
+* Tue Mar 30 2004 Joe Orton  0.9.4-13
+- remove fundamentally broken check_sbcs() from xlate code
+
+* Fri Mar 19 2004 Joe Orton  0.9.4-12
+- tweak xlate fix
+
+* Fri Mar 19 2004 Joe Orton  0.9.4-11
+- rebuild with xlate fixes and tests enabled
+
+* Tue Mar 02 2004 Elliot Lee  0.9.4-10.1
+- rebuilt
+
+* Tue Mar  2 2004 Joe Orton  0.9.4-10
+- rename sdbm_* symbols to apu__sdbm_*
+
+* Mon Feb 16 2004 Joe Orton  0.9.4-9
+- fix sdbm apr_dbm_exists() on s390x/ppc64
+
+* Fri Feb 13 2004 Elliot Lee  0.9.4-8
+- rebuilt
+
+* Thu Feb  5 2004 Joe Orton  0.9.4-7
+- fix warnings from use of apr_optional*.h with gcc 3.4
+
+* Thu Jan 29 2004 Joe Orton  0.9.4-6
+- drop gdbm support
+
+* Thu Jan  8 2004 Joe Orton  0.9.4-5
+- fix DB library detection
+
+* Sat Dec 13 2003 Jeff Johnson  0.9.4-4
+- rebuild against db-4.2.52.
+
+* Mon Oct 13 2003 Jeff Johnson  0.9.4-3
+- rebuild against db-4.2.42.
+
+* Mon Oct  6 2003 Joe Orton  0.9.4-2
+- fix 'apu-config --apu-la-file' output
+
+* Mon Oct  6 2003 Joe Orton  0.9.4-1
+- update to 0.9.4.
+
+* Tue Jul 22 2003 Nalin Dahyabhai  0.9.3-10
+- rebuild
+
+* Mon Jul  7 2003 Joe Orton  0.9.3-9
+- rebuild
+- don't run testuuid test because of #98677
+
+* Thu Jul  3 2003 Joe Orton  0.9.3-8
+- rebuild
+
+* Wed Jun 04 2003 Elliot Lee 
+- rebuilt
+
+* Tue May 20 2003 Joe Orton  0.9.3-6
+- fix to detect crypt_r correctly (CAN-2003-0195)
+
+* Thu May 15 2003 Joe Orton  0.9.3-5
+- fix to try linking against -ldb first (#90917)
+- depend on openldap, gdbm, db4, expat appropriately.
+
+* Tue May 13 2003 Joe Orton  0.9.3-4
+- rebuild
+
+* Wed May  7 2003 Joe Orton  0.9.3-3
+- make devel package conflict with old subversion-devel
+- run the less crufty parts of the test suite
+
+* Tue Apr 29 2003 Joe Orton  0.9.3-2
+- run ldconfig in post/postun
+
+* Mon Apr 28 2003 Joe Orton  0.9.3-1
+- initial build