aboutsummaryrefslogtreecommitdiff
path: root/contrib/apr-util
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/apr-util')
-rw-r--r--contrib/apr-util/CHANGES162
-rw-r--r--contrib/apr-util/LICENSE443
-rw-r--r--contrib/apr-util/Makefile.in123
-rw-r--r--contrib/apr-util/Makefile.win365
-rw-r--r--contrib/apr-util/NOTICE14
-rw-r--r--contrib/apr-util/NWGNUmakefile308
-rw-r--r--contrib/apr-util/README111
-rw-r--r--contrib/apr-util/apr-util.pc.in13
-rw-r--r--contrib/apr-util/apr-util.spec214
-rw-r--r--contrib/apr-util/aprutil.dsw479
-rw-r--r--contrib/apr-util/apu-config.in225
-rw-r--r--contrib/apr-util/buckets/apr_brigade.c736
-rw-r--r--contrib/apr-util/buckets/apr_buckets.c46
-rw-r--r--contrib/apr-util/buckets/apr_buckets_alloc.c202
-rw-r--r--contrib/apr-util/buckets/apr_buckets_eos.c54
-rw-r--r--contrib/apr-util/buckets/apr_buckets_file.c228
-rw-r--r--contrib/apr-util/buckets/apr_buckets_flush.c54
-rw-r--r--contrib/apr-util/buckets/apr_buckets_heap.c96
-rw-r--r--contrib/apr-util/buckets/apr_buckets_mmap.c144
-rw-r--r--contrib/apr-util/buckets/apr_buckets_pipe.c119
-rw-r--r--contrib/apr-util/buckets/apr_buckets_pool.c142
-rw-r--r--contrib/apr-util/buckets/apr_buckets_refcount.c64
-rw-r--r--contrib/apr-util/buckets/apr_buckets_simple.c137
-rw-r--r--contrib/apr-util/buckets/apr_buckets_socket.c114
-rw-r--r--contrib/apr-util/build-outputs.mk150
-rw-r--r--contrib/apr-util/build.conf102
-rwxr-xr-xcontrib/apr-util/buildconf116
-rw-r--r--contrib/apr-util/config.layout232
-rwxr-xr-xcontrib/apr-util/configure25672
-rw-r--r--contrib/apr-util/configure.in292
-rw-r--r--contrib/apr-util/crypto/apr_crypto.c529
-rw-r--r--contrib/apr-util/crypto/apr_crypto_nss.c870
-rw-r--r--contrib/apr-util/crypto/apr_crypto_openssl.c798
-rw-r--r--contrib/apr-util/crypto/apr_md4.c404
-rw-r--r--contrib/apr-util/crypto/apr_md5.c666
-rw-r--r--contrib/apr-util/crypto/apr_passwd.c200
-rw-r--r--contrib/apr-util/crypto/apr_sha1.c368
-rw-r--r--contrib/apr-util/crypto/crypt_blowfish.c902
-rw-r--r--contrib/apr-util/crypto/crypt_blowfish.h27
-rw-r--r--contrib/apr-util/crypto/getuuid.c208
-rw-r--r--contrib/apr-util/crypto/uuid.c130
-rw-r--r--contrib/apr-util/dbd/NWGNUdbdfreetds296
-rw-r--r--contrib/apr-util/dbd/NWGNUdbdmysql295
-rw-r--r--contrib/apr-util/dbd/NWGNUdbdpgsql301
-rw-r--r--contrib/apr-util/dbd/NWGNUdbdsqli2296
-rw-r--r--contrib/apr-util/dbd/NWGNUdbdsqli3298
-rw-r--r--contrib/apr-util/dbd/NWGNUmakefile262
-rw-r--r--contrib/apr-util/dbd/apr_dbd.c576
-rw-r--r--contrib/apr-util/dbd/apr_dbd_freetds.c805
-rw-r--r--contrib/apr-util/dbd/apr_dbd_mysql.c1305
-rw-r--r--contrib/apr-util/dbd/apr_dbd_odbc.c1750
-rw-r--r--contrib/apr-util/dbd/apr_dbd_oracle.c2220
-rw-r--r--contrib/apr-util/dbd/apr_dbd_pgsql.c1315
-rw-r--r--contrib/apr-util/dbd/apr_dbd_sqlite2.c566
-rw-r--r--contrib/apr-util/dbd/apr_dbd_sqlite3.c914
-rw-r--r--contrib/apr-util/dbm/NWGNUdbmdb299
-rw-r--r--contrib/apr-util/dbm/NWGNUdbmgdbm298
-rw-r--r--contrib/apr-util/dbm/NWGNUmakefile251
-rw-r--r--contrib/apr-util/dbm/apr_dbm.c307
-rw-r--r--contrib/apr-util/dbm/apr_dbm_berkeleydb.c404
-rw-r--r--contrib/apr-util/dbm/apr_dbm_gdbm.c255
-rw-r--r--contrib/apr-util/dbm/apr_dbm_ndbm.c238
-rw-r--r--contrib/apr-util/dbm/apr_dbm_sdbm.c223
-rw-r--r--contrib/apr-util/dbm/sdbm/sdbm.c584
-rw-r--r--contrib/apr-util/dbm/sdbm/sdbm_hash.c63
-rw-r--r--contrib/apr-util/dbm/sdbm/sdbm_lock.c79
-rw-r--r--contrib/apr-util/dbm/sdbm/sdbm_pair.c319
-rw-r--r--contrib/apr-util/dbm/sdbm/sdbm_pair.h40
-rw-r--r--contrib/apr-util/dbm/sdbm/sdbm_private.h84
-rw-r--r--contrib/apr-util/dbm/sdbm/sdbm_tune.h40
-rw-r--r--contrib/apr-util/docs/doxygen.conf32
-rw-r--r--contrib/apr-util/encoding/apr_base64.c268
-rw-r--r--contrib/apr-util/export_vars.sh.in13
-rw-r--r--contrib/apr-util/hooks/apr_hooks.c414
-rw-r--r--contrib/apr-util/include/apr_anylock.h128
-rw-r--r--contrib/apr-util/include/apr_base64.h113
-rw-r--r--contrib/apr-util/include/apr_buckets.h1571
-rw-r--r--contrib/apr-util/include/apr_crypto.h419
-rw-r--r--contrib/apr-util/include/apr_date.h106
-rw-r--r--contrib/apr-util/include/apr_dbd.h552
-rw-r--r--contrib/apr-util/include/apr_dbm.h227
-rw-r--r--contrib/apr-util/include/apr_hooks.h358
-rw-r--r--contrib/apr-util/include/apr_ldap.h.in197
-rw-r--r--contrib/apr-util/include/apr_ldap.hnw158
-rw-r--r--contrib/apr-util/include/apr_ldap.hw197
-rw-r--r--contrib/apr-util/include/apr_ldap_init.h165
-rw-r--r--contrib/apr-util/include/apr_ldap_option.h254
-rw-r--r--contrib/apr-util/include/apr_ldap_rebind.h98
-rw-r--r--contrib/apr-util/include/apr_ldap_url.h120
-rw-r--r--contrib/apr-util/include/apr_md4.h135
-rw-r--r--contrib/apr-util/include/apr_md5.h176
-rw-r--r--contrib/apr-util/include/apr_memcache.h444
-rw-r--r--contrib/apr-util/include/apr_optional.h92
-rw-r--r--contrib/apr-util/include/apr_optional_hooks.h117
-rw-r--r--contrib/apr-util/include/apr_queue.h138
-rw-r--r--contrib/apr-util/include/apr_reslist.h183
-rw-r--r--contrib/apr-util/include/apr_rmm.h137
-rw-r--r--contrib/apr-util/include/apr_sdbm.h176
-rw-r--r--contrib/apr-util/include/apr_sha1.h121
-rw-r--r--contrib/apr-util/include/apr_strmatch.h81
-rw-r--r--contrib/apr-util/include/apr_thread_pool.h299
-rw-r--r--contrib/apr-util/include/apr_uri.h178
-rw-r--r--contrib/apr-util/include/apr_uuid.h76
-rw-r--r--contrib/apr-util/include/apr_xlate.h163
-rw-r--r--contrib/apr-util/include/apr_xml.h356
-rw-r--r--contrib/apr-util/include/apu.h.in128
-rw-r--r--contrib/apr-util/include/apu.hnw124
-rw-r--r--contrib/apr-util/include/apu.hw146
-rw-r--r--contrib/apr-util/include/apu_errno.h173
-rw-r--r--contrib/apr-util/include/apu_version.h139
-rw-r--r--contrib/apr-util/include/apu_want.h.in51
-rw-r--r--contrib/apr-util/include/apu_want.hnw52
-rw-r--r--contrib/apr-util/include/apu_want.hw52
-rw-r--r--contrib/apr-util/include/private/apr_crypto_internal.h278
-rw-r--r--contrib/apr-util/include/private/apr_dbd_internal.h365
-rw-r--r--contrib/apr-util/include/private/apr_dbd_odbc_v2.h119
-rw-r--r--contrib/apr-util/include/private/apr_dbm_private.h121
-rw-r--r--contrib/apr-util/include/private/apu_config.h.in176
-rw-r--r--contrib/apr-util/include/private/apu_config.hnw53
-rw-r--r--contrib/apr-util/include/private/apu_config.hw52
-rw-r--r--contrib/apr-util/include/private/apu_internal.h73
-rw-r--r--contrib/apr-util/include/private/apu_select_dbm.h.in28
-rw-r--r--contrib/apr-util/include/private/apu_select_dbm.hw28
-rw-r--r--contrib/apr-util/ldap/NWGNUmakefile263
-rw-r--r--contrib/apr-util/ldap/apr_ldap_init.c235
-rw-r--r--contrib/apr-util/ldap/apr_ldap_option.c652
-rw-r--r--contrib/apr-util/ldap/apr_ldap_rebind.c377
-rw-r--r--contrib/apr-util/ldap/apr_ldap_stub.c145
-rw-r--r--contrib/apr-util/ldap/apr_ldap_url.c694
-rw-r--r--contrib/apr-util/libaprutil.rc69
-rw-r--r--contrib/apr-util/memcache/apr_memcache.c1709
-rw-r--r--contrib/apr-util/misc/apr_date.c637
-rw-r--r--contrib/apr-util/misc/apr_queue.c398
-rw-r--r--contrib/apr-util/misc/apr_reslist.c473
-rw-r--r--contrib/apr-util/misc/apr_rmm.c457
-rw-r--r--contrib/apr-util/misc/apr_thread_pool.c956
-rw-r--r--contrib/apr-util/misc/apu_dso.c209
-rw-r--r--contrib/apr-util/misc/apu_version.c37
-rw-r--r--contrib/apr-util/renames_pending2
-rw-r--r--contrib/apr-util/strmatch/apr_strmatch.c118
-rw-r--r--contrib/apr-util/test/Makefile.in90
-rw-r--r--contrib/apr-util/test/Makefile.win171
-rw-r--r--contrib/apr-util/test/NWGNUaputest281
-rw-r--r--contrib/apr-util/test/NWGNUmakefile258
-rw-r--r--contrib/apr-util/test/abts.c423
-rw-r--r--contrib/apr-util/test/abts.h101
-rw-r--r--contrib/apr-util/test/abts_tests.h46
-rw-r--r--contrib/apr-util/test/data/billion-laughs.xml36
-rw-r--r--contrib/apr-util/test/dbd.c407
-rw-r--r--contrib/apr-util/test/nw_misc.c23
-rw-r--r--contrib/apr-util/test/test_apu.h100
-rw-r--r--contrib/apr-util/test/testall.dsw530
-rw-r--r--contrib/apr-util/test/testbuckets.c535
-rw-r--r--contrib/apr-util/test/testcrypto.c888
-rw-r--r--contrib/apr-util/test/testdate.c202
-rw-r--r--contrib/apr-util/test/testdbd.c245
-rw-r--r--contrib/apr-util/test/testdbm.c221
-rw-r--r--contrib/apr-util/test/testldap.c250
-rw-r--r--contrib/apr-util/test/testmd4.c119
-rw-r--r--contrib/apr-util/test/testmd5.c103
-rw-r--r--contrib/apr-util/test/testmemcache.c626
-rw-r--r--contrib/apr-util/test/testpass.c217
-rw-r--r--contrib/apr-util/test/testqueue.c135
-rw-r--r--contrib/apr-util/test/testreslist.c272
-rw-r--r--contrib/apr-util/test/testrmm.c191
-rw-r--r--contrib/apr-util/test/teststrmatch.c92
-rw-r--r--contrib/apr-util/test/testuri.c331
-rw-r--r--contrib/apr-util/test/testutil.c60
-rw-r--r--contrib/apr-util/test/testutil.h71
-rw-r--r--contrib/apr-util/test/testuuid.c56
-rw-r--r--contrib/apr-util/test/testxlate.c134
-rw-r--r--contrib/apr-util/test/testxml.c205
-rw-r--r--contrib/apr-util/uri/apr_uri.c962
-rw-r--r--contrib/apr-util/xlate/xlate.c458
-rw-r--r--contrib/apr-util/xml/NWGNUmakefile259
-rw-r--r--contrib/apr-util/xml/apr_xml.c1015
176 files changed, 78906 insertions, 0 deletions
diff --git a/contrib/apr-util/CHANGES b/contrib/apr-util/CHANGES
new file mode 100644
index 000000000000..a0dc3789a89d
--- /dev/null
+++ b/contrib/apr-util/CHANGES
@@ -0,0 +1,162 @@
+ -*- coding: utf-8 -*-
+Changes with APR-util 1.5.4
+
+ *) MySQL driver: Fix incorrect handling of bad parameter in the
+ driver support for apr_dbd_transaction_end(). PR 56330.
+ [Weiqiang Li <weiqiang_li hotmail.com>]
+
+ *) apr_crypto_get_driver(): Fix invalid storage reference on error path.
+ [Philip Martin <philip.martin wandisco.com>]
+
+ *) Fix compile failure for Android. PR 56627. [Fredrik Fornwall
+ <fredrik fornwall.net>, Jeff Trawick]
+
+ *) Fix to let ODBC driver build with MSVC6, which does not have intptr_t
+ [Tom Donovan]
+
+ *) Windows cmake build: Fix incompatiblities with Visual Studio
+ generators with all cmake versions, and the NMake Makefile generator
+ with cmake 2.8.12 and later. PR 56616 and other bugs. [Jeff Trawick,
+ Bert Huijben]
+
+ *) Fix detection of Berkeley DB 6.0. PR 55277.
+ [Lars Wendler <polynomial-c gentoo.org>]
+
+ *) Improve platform detection for bundled expat by updating
+ config.guess and config.sub. [Rainer Jung]
+
+Changes with APR-util 1.5.3
+
+ *) Cygwin: Use correct file extension when loading APR DSOs. PR 55587.
+ [Carlo Bramini <carlo.bramix libero.it>]
+
+ *) Add experimental cmake-based build system for Windows. Refer to
+ README.cmake for more information. [Jeff Trawick, Tom Donovan]
+
+ *) Fix warnings in odbc driver on 64bit systems.
+ PR 55197 [Tom Donovan]
+
+ *) Add support to apr_memcache for unix domain sockets. PR 54573 [Remi
+ Gacogne <rgacogne+asf aquaray.com>]
+
+ *) Add support for Berkeley DB 6.0. [Rainer Jung]
+
+ *) Improve platform detection for bundled expat by updating
+ config.guess and config.sub. [Rainer Jung]
+
+Changes with APR-util 1.5.2
+
+ *) Windows: Add command line makefiles. [Gregg Smith]
+
+ *) apr_uri_parse(): Do not accept invalid characters in the scheme.
+ Per RFC 3986 3.3, enforce that the first segment of a relative path does
+ not contain a colon. PR 52479. [Stefan Fritsch]
+
+ *) Fix memory leak in hook sorting function. PR 51256.
+ [<horowity checkpoint com>]
+
+ *) Speedup md5 calculation by avoiding some copying on little endian
+ architectures. PR 49011. [Stefan Fritsch, Stefan Fuhrmann
+ <stefanfuhrmann alice-dsl de>]
+
+ *) Use heap memory for crypt in apr_password_validate(), to reduce stack
+ usage. PR 54572. [Stefan Fritsch]
+
+ *) Fix password validation failure for all crypt and crypt_r based
+ algorithms. PR 54603. [Harvey Eneman <harvey.eneman oracle.com>]
+
+ *) Fix syntax error in crypto/apr_passwd.c on non-glibc systems. PR 54275.
+ [Stefan Fritsch]
+
+ *) Fix potential data corruption in apr_brigade_write() and friends if
+ the last bucket of the brigade is a heap bucket that has been split,
+ and there are still references to the next part of the original bucket
+ in use. [Stefan Fritsch]
+
+ *) Remove duplicated logic in apr_brigade_puts(). PR 53740. [Christophe
+ Jaillet <christophe jaillet wanadoo fr>]
+
+ *) apr_crypto: If --with-crypto is passed to configure but no crypto
+ libraries are enabled, autodetect available libraries. [Jeff Trawick]
+
+ *) memcache: Fix dead server retry logic. [Gavin Shelley <columbusmonkey me.com>]
+
+Changes with APR-util 1.5.1
+
+ *) testmemcache: Fix crash. PR 52705. [Peter Poeml <peter poeml de>]
+
+ *) MinGW: Support shared builds of apr-util when apr is shared.
+ PR 46175. [Carlo Bramini <carlo.bramix libero.it>, Jeff Trawick]
+
+ *) Add support for Berkeley DB 5.2 and 5.3. Simplify detection script.
+ PR 53684. [Rainer Jung]
+
+ *) configure: Allow to specify library specific custom linker flags
+ via the LDADD_XXX variables. [Rainer Jung]
+
+ *) apr_password_validate(): Fix intermittent errors on systems
+ such as FreeBSD where the crypt() function is used.
+ (Broken only in 1.5.0) [Jeff Trawick]
+
+ *) Improve platform detection for bundled expat by updating
+ config.guess and config.sub. [Rainer Jung]
+
+Changes with APR-util 1.5.0
+
+ *) dbd_pgsql_escape: Use PQescapeStringConn. [Nick Kew]
+
+ *) apr_password_validate, apr_bcrypt_encode: Add support for bcrypt encoded
+ passwords. The bcrypt implementation uses code from crypt_blowfish
+ written by Solar Designer <solar openwall com>. apr_bcrypt_encode creates
+ hashes with "$2y$" prefix, but apr_password_validate also accepts the old
+ prefix "$2a$". PR 49288. [Stefan Fritsch]
+
+ *) APR dbd: Allow to use apr_dbd_get_row() with a different pool than
+ apr_dbd_select(). PR 53533. [<arthur echo gmail com>]
+
+ *) APR dbd FreeTDS support: Fix spurious API errors caused by uninitialized
+ fields. [TROY.LIU 劉春偉 <TROY.LIU deltaww.com.cn>]
+
+ *) apr_password_validate: Increase maximum hash string length to allow
+ more than 9999 rounds with sha512-crypt. PR 53410. [Stefan Fritsch]
+
+ *) Fix segfaults in crypt() and crypt_r() failure modes.
+ PR 47272. [Arkadiusz Miskiewicz <arekm pld-linux.org>]
+
+ *) apr_crypto: Ensure that the if/else that governs the static
+ initialisation of each crypto driver works when the first driver
+ isn't in use. [Graham Leggett]
+
+ *) apr_crypto: Ensure the *driver variable is initialised when a statically
+ compiled library is initialised for the first time. [Graham Leggett]
+
+ *) apr_crypto: Ensure the *driver variable is initialised when the library
+ has already been loaded. Fix ported from apr_dbd. [Graham Leggett]
+
+ *) apr_crypto: Move the static initialisation of DRIVER_LOAD from
+ apr_crypto_init() to apr_crypto_get_driver(), so that we don't lose
+ the parameters. [Graham Leggett]
+
+Changes with APR-util 1.4.x and later:
+
+ *) http://svn.apache.org/viewvc/apr/apr-util/branches/1.4.x/CHANGES?view=markup
+
+Changes for APR-util 1.3.x and later:
+
+ *) http://svn.apache.org/viewvc/apr/apr-util/branches/1.3.x/CHANGES?view=markup
+
+Changes for APR-util 1.2.x and later:
+
+ *) http://svn.apache.org/viewvc/apr/apr-util/branches/1.2.x/CHANGES?view=markup
+
+Changes for APR-util 1.1.x and later:
+
+ *) http://svn.apache.org/viewvc/apr/apr-util/branches/1.1.x/CHANGES?view=markup
+
+Changes for APR-util 1.0.x and later:
+
+ *) http://svn.apache.org/viewvc/apr/apr-util/branches/1.0.x/CHANGES?view=markup
+
+Changes for APR-util 0.9.x and later/earlier:
+
+ *) http://svn.apache.org/viewvc/apr/apr-util/branches/0.9.x/CHANGES?view=markup
diff --git a/contrib/apr-util/LICENSE b/contrib/apr-util/LICENSE
new file mode 100644
index 000000000000..7771972d8546
--- /dev/null
+++ b/contrib/apr-util/LICENSE
@@ -0,0 +1,443 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed 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.
+
+
+
+APACHE PORTABLE RUNTIME SUBCOMPONENTS:
+
+The Apache Portable Runtime includes a number of subcomponents with
+separate copyright notices and license terms. Your use of the source
+code for the these subcomponents is subject to the terms and
+conditions of the following licenses.
+
+For the include\apr_md5.h component:
+/*
+ * This is work is derived from material Copyright RSA Data Security, Inc.
+ *
+ * The RSA copyright statement and Licence for that original material is
+ * included below. This is followed by the Apache copyright statement and
+ * licence for the modifications made to that material.
+ */
+
+/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
+ rights reserved.
+
+ License to copy and use this software is granted provided that it
+ is identified as the "RSA Data Security, Inc. MD5 Message-Digest
+ Algorithm" in all material mentioning or referencing this software
+ or this function.
+
+ License is also granted to make and use derivative works provided
+ that such works are identified as "derived from the RSA Data
+ Security, Inc. MD5 Message-Digest Algorithm" in all material
+ mentioning or referencing the derived work.
+
+ RSA Data Security, Inc. makes no representations concerning either
+ the merchantability of this software or the suitability of this
+ software for any particular purpose. It is provided "as is"
+ without express or implied warranty of any kind.
+
+ These notices must be retained in any copies of any part of this
+ documentation and/or software.
+ */
+
+For the passwd\apr_md5.c component:
+
+/*
+ * This is work is derived from material Copyright RSA Data Security, Inc.
+ *
+ * The RSA copyright statement and Licence for that original material is
+ * included below. This is followed by the Apache copyright statement and
+ * licence for the modifications made to that material.
+ */
+
+/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
+ */
+
+/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
+ rights reserved.
+
+ License to copy and use this software is granted provided that it
+ is identified as the "RSA Data Security, Inc. MD5 Message-Digest
+ Algorithm" in all material mentioning or referencing this software
+ or this function.
+
+ License is also granted to make and use derivative works provided
+ that such works are identified as "derived from the RSA Data
+ Security, Inc. MD5 Message-Digest Algorithm" in all material
+ mentioning or referencing the derived work.
+
+ RSA Data Security, Inc. makes no representations concerning either
+ the merchantability of this software or the suitability of this
+ software for any particular purpose. It is provided "as is"
+ without express or implied warranty of any kind.
+
+ These notices must be retained in any copies of any part of this
+ documentation and/or software.
+ */
+/*
+ * The apr_md5_encode() routine uses much code obtained from the FreeBSD 3.0
+ * MD5 crypt() function, which is licenced as follows:
+ * ----------------------------------------------------------------------------
+ * "THE BEER-WARE LICENSE" (Revision 42):
+ * <phk@login.dknet.dk> wrote this file. As long as you retain this notice you
+ * can do whatever you want with this stuff. If we meet some day, and you think
+ * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
+ * ----------------------------------------------------------------------------
+ */
+
+For the crypto\apr_md4.c component:
+
+ * This is derived from material copyright RSA Data Security, Inc.
+ * Their notice is reproduced below in its entirety.
+ *
+ * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
+ * rights reserved.
+ *
+ * License to copy and use this software is granted provided that it
+ * is identified as the "RSA Data Security, Inc. MD4 Message-Digest
+ * Algorithm" in all material mentioning or referencing this software
+ * or this function.
+ *
+ * License is also granted to make and use derivative works provided
+ * that such works are identified as "derived from the RSA Data
+ * Security, Inc. MD4 Message-Digest Algorithm" in all material
+ * mentioning or referencing the derived work.
+ *
+ * RSA Data Security, Inc. makes no representations concerning either
+ * the merchantability of this software or the suitability of this
+ * software for any particular purpose. It is provided "as is"
+ * without express or implied warranty of any kind.
+ *
+ * These notices must be retained in any copies of any part of this
+ * documentation and/or software.
+ */
+
+For the include\apr_md4.h component:
+
+ *
+ * This is derived from material copyright RSA Data Security, Inc.
+ * Their notice is reproduced below in its entirety.
+ *
+ * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
+ * rights reserved.
+ *
+ * License to copy and use this software is granted provided that it
+ * is identified as the "RSA Data Security, Inc. MD4 Message-Digest
+ * Algorithm" in all material mentioning or referencing this software
+ * or this function.
+ *
+ * License is also granted to make and use derivative works provided
+ * that such works are identified as "derived from the RSA Data
+ * Security, Inc. MD4 Message-Digest Algorithm" in all material
+ * mentioning or referencing the derived work.
+ *
+ * RSA Data Security, Inc. makes no representations concerning either
+ * the merchantability of this software or the suitability of this
+ * software for any particular purpose. It is provided "as is"
+ * without express or implied warranty of any kind.
+ *
+ * These notices must be retained in any copies of any part of this
+ * documentation and/or software.
+ */
+
+For the test\testmd4.c component:
+
+ *
+ * This is derived from material copyright RSA Data Security, Inc.
+ * Their notice is reproduced below in its entirety.
+ *
+ * Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All
+ * rights reserved.
+ *
+ * RSA Data Security, Inc. makes no representations concerning either
+ * the merchantability of this software or the suitability of this
+ * software for any particular purpose. It is provided "as is"
+ * without express or implied warranty of any kind.
+ *
+ * These notices must be retained in any copies of any part of this
+ * documentation and/or software.
+ */
+
+For the xml\expat\conftools\install-sh component:
+
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission. M.I.T. makes no representations about the
+# suitability of this software for any purpose. It is provided "as is"
+# without express or implied warranty.
+#
+
+For the expat xml parser component:
+
+Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
+ and Clark Cooper
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+====================================================================
+
+For the ldap/apr_ldap_url.c component:
+
+/* Portions Copyright 1998-2002 The OpenLDAP Foundation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted only as authorized by the OpenLDAP
+ * Public License. A copy of this license is available at
+ * http://www.OpenLDAP.org/license.html or in file LICENSE in the
+ * top-level directory of the distribution.
+ *
+ * OpenLDAP is a registered trademark of the OpenLDAP Foundation.
+ *
+ * Individual files and/or contributed packages may be copyright by
+ * other parties and subject to additional restrictions.
+ *
+ * This work is derived from the University of Michigan LDAP v3.3
+ * distribution. Information concerning this software is available
+ * at: http://www.umich.edu/~dirsvcs/ldap/
+ *
+ * This work also contains materials derived from public sources.
+ *
+ * Additional information about OpenLDAP can be obtained at:
+ * http://www.openldap.org/
+ */
+
+/*
+ * Portions Copyright (c) 1992-1996 Regents of the University of Michigan.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and that due credit is given
+ * to the University of Michigan at Ann Arbor. The name of the University
+ * may not be used to endorse or promote products derived from this
+ * software without specific prior written permission. This software
+ * is provided ``as is'' without express or implied warranty.
+ */
+
diff --git a/contrib/apr-util/Makefile.in b/contrib/apr-util/Makefile.in
new file mode 100644
index 000000000000..963feada79ad
--- /dev/null
+++ b/contrib/apr-util/Makefile.in
@@ -0,0 +1,123 @@
+#
+# Top-level Makefile for APRUTIL
+#
+CPP = @CPP@
+
+# gets substituted into some targets
+APRUTIL_MAJOR_VERSION=@APRUTIL_MAJOR_VERSION@
+APRUTIL_DOTTED_VERSION=@APRUTIL_DOTTED_VERSION@
+
+srcdir = @srcdir@
+VPATH = @srcdir@
+
+INCLUDES = @APRUTIL_PRIV_INCLUDES@ @APR_INCLUDES@ @APRUTIL_INCLUDES@
+APRUTIL_LDFLAGS = @APRUTIL_LDFLAGS@
+APRUTIL_LIBS = @APRUTIL_LIBS@
+
+TARGET_LIB = lib@APRUTIL_LIBNAME@.la
+INSTALL_SUBDIRS = @APR_ICONV_DIR@ @APR_XML_DIR@
+EXTRA_SOURCE_DIRS = @APR_ICONV_DIR@ @APR_XML_DIR@
+APRUTIL_PCFILE = apr-util-$(APRUTIL_MAJOR_VERSION).pc
+APU_CONFIG = apu-$(APRUTIL_MAJOR_VERSION)-config
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+
+APU_MODULES = @APU_MODULES@
+LINK_MODULE = $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) $(LT_LDFLAGS) $(ALL_CFLAGS) $(ALL_LDFLAGS) $(APRUTIL_LDFLAGS) -release $(APRUTIL_MAJOR_VERSION) -module -rpath $(APU_DSO_LIBDIR)
+APU_DSO_LIBDIR = @APU_DSO_LIBDIR@
+
+LT_VERSION = @APU_LTVERSION@
+
+EXTRA_OBJECTS = @EXTRA_OBJECTS@
+
+LDADD_dbd_pgsql = @LDADD_dbd_pgsql@
+LDADD_dbd_oracle = @LDADD_dbd_oracle@
+LDADD_dbd_sqlite2 = @LDADD_dbd_sqlite2@
+LDADD_dbd_sqlite3 = @LDADD_dbd_sqlite3@
+LDADD_dbd_mysql = @LDADD_dbd_mysql@
+LDADD_dbd_freetds = @LDADD_dbd_freetds@
+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_ldap = @LDADD_ldap@
+LDADD_crypto_openssl = @LDADD_crypto_openssl@
+LDADD_crypto_nss = @LDADD_crypto_nss@
+
+TARGETS = $(TARGET_LIB) aprutil.exp apu-config.out $(APU_MODULES)
+
+# bring in rules.mk for standard functionality
+@INCLUDE_RULES@
+@INCLUDE_OUTPUTS@
+
+CLEAN_SUBDIRS = test @APR_ICONV_DIR@ @APR_XML_DIR@
+
+CLEAN_TARGETS = exports.c export_vars.c aprutil.exp .make.dirs apu-config.out
+DISTCLEAN_TARGETS = config.cache config.log config.status libtool \
+ include/private/apu_config.h include/private/apu_private.h \
+ include/private/apu_select_dbm.h include/apr_ldap.h include/apu.h \
+ export_vars.sh $(APU_CONFIG) build/rules.mk include/apu_want.h \
+ apr-util.pc build/pkg/pkginfo
+EXTRACLEAN_TARGETS = configure aclocal.m4 include/private/apu_config.h.in \
+ exports.c build-outputs.mk \
+ build/apr_common.m4 build/find_apr.m4 build/install.sh \
+ build/config.guess build/config.sub
+
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+bindir=@bindir@
+libdir=@libdir@
+includedir=@includedir@
+top_srcdir=@abs_srcdir@
+top_blddir=@abs_builddir@
+
+# Create apu-config script suitable for the install tree
+apu-config.out: $(APU_CONFIG)
+ sed 's,^\(location=\).*$$,\1installed,' < $(APU_CONFIG) > $@
+
+install: $(TARGETS) install-modules
+ $(APR_MKDIR) $(DESTDIR)$(includedir) $(DESTDIR)$(libdir)/pkgconfig \
+ $(DESTDIR)$(libdir) $(DESTDIR)$(bindir)
+ for f in $(top_srcdir)/include/*.h $(top_blddir)/include/*.h; do \
+ $(INSTALL_DATA) $${f} $(DESTDIR)$(includedir); \
+ done
+ $(INSTALL_DATA) apr-util.pc $(DESTDIR)$(libdir)/pkgconfig/$(APRUTIL_PCFILE)
+ list='$(INSTALL_SUBDIRS)'; for i in $$list; do \
+ ( cd $$i ; $(MAKE) DESTDIR=$(DESTDIR) install ); \
+ done
+ $(LIBTOOL) --mode=install $(INSTALL) -m 755 $(TARGET_LIB) $(DESTDIR)$(libdir)
+ $(INSTALL_DATA) aprutil.exp $(DESTDIR)$(libdir)
+ $(INSTALL) -m 755 apu-config.out $(DESTDIR)$(bindir)/$(APU_CONFIG)
+
+$(TARGET_LIB): $(OBJECTS) $(EXTRA_OBJECTS)
+ $(LINK) @lib_target@ $(EXTRA_OBJECTS) $(ALL_LIBS) $(APRUTIL_LDFLAGS) $(APRUTIL_LIBS)
+
+install-modules: install-modules-@APU_HAVE_MODULES@
+
+install-modules-no:
+
+install-modules-yes: $(APU_MODULES)
+ $(APR_MKDIR) $(DESTDIR)$(APU_DSO_LIBDIR)
+ @for m in $(APU_MODULES); do $(LIBTOOL) $(LT_LTFLAGS) $(LTFLAGS) --mode=install $(INSTALL) -m 755 $$m $(DESTDIR)$(APU_DSO_LIBDIR); done
+
+exports.c: $(HEADERS)
+ $(APR_MKEXPORT) $(HEADERS) > $@
+
+export_vars.c: $(HEADERS)
+ $(APR_MKVAREXPORT) $(HEADERS) > $@
+
+aprutil.exp: exports.c export_vars.c
+ @echo "#! lib@APRUTIL_LIBNAME@.so" > $@
+ @echo "* This file was AUTOGENERATED at build time." >> $@
+ @echo "* Please do not edit by hand." >> $@
+ $(CPP) $(ALL_CPPFLAGS) $(ALL_INCLUDES) exports.c | grep "ap_hack_" | sed -e 's/^.*[)]\(.*\);$$/\1/' >> $@
+ $(CPP) $(ALL_CPPFLAGS) $(ALL_INCLUDES) export_vars.c | sed -e 's/^\#[^!]*//' | sed -e '/^$$/d' >> $@
+
+dox:
+ doxygen $(top_srcdir)/docs/doxygen.conf
+
+test: check
+check: $(TARGET_LIB)
+ cd test && $(MAKE) all check
+
+.PHONY: install-modules install-modules-yes install-modules-no dox test check
diff --git a/contrib/apr-util/Makefile.win b/contrib/apr-util/Makefile.win
new file mode 100644
index 000000000000..b4b420e1c2e6
--- /dev/null
+++ b/contrib/apr-util/Makefile.win
@@ -0,0 +1,365 @@
+# Makefile.win for Win32 APR + APR-iconv + APR-util
+#
+# Targets are:
+#
+# buildall - compile everything
+# checkall - run APR + APR-util regression tests
+# install - compile everything
+# clean - mop up everything
+#
+# You can override the build mechanism, choose only one;
+#
+# USEMAK=1 - compile from exported make files
+# USEDSW=1 - compile from .dsw / .dsp VC6 projects
+# USESLN=1 - compile from converted .sln / .vcproj VC7+ files
+#
+# Define ARCH to your desired preference (your PATH must point
+# to the correct compiler tools!) Choose only one;
+#
+# ARCH="Win32 Release"
+# ARCH="Win32 Debug"
+# ARCH="Win32 Release9x"
+# ARCH="Win32 Debug9x"
+# ARCH="x64 Release"
+# ARCH="x64 Debug"
+#
+# Provide the APR_PATH, API_PATH and APU_PATH entirely relative
+# to one another! At this time, building the libraries themselves
+# is only expected to work if the defaults (../apr, ../apr-iconv
+# and ../apr-util) are used, or if they are built with USEMAK=1.
+#
+# APR_PATH=..\apr-1.3.0
+# API_PATH=..\apr-iconv-1.3.0
+# APU_PATH=..\apr-util-1.3.0
+#
+# Provide a DBD_LIST argument after configuring LIB and INCLUDE with
+# the SDK paths of the corresponding client support libraries.
+# ODBC is always built on Windows, so it does not get included in DBD_LIST
+# Note that at this time, none of these are supported on win32, per say.
+#
+# DBD_LIST="sqlite3 pgsql oracle mysql freetds"
+#
+# Provide a DBM_LIST argument after configuring LIB and INCLUDE with
+# the SDK paths of the corresponding database support libraries. Right
+# now only db has been configured, gdbm and ndbm require additional study.
+# Note that at this time, none of these are supported on win32, per say.
+#
+# DBM_LIST="db gdbm"
+#
+# Provide a CRYPTO_LIST argument after configuring LIB and INCLUDE with
+# the SDK paths of the corresponding cryptographic support libraries.
+#
+# CRYPTO_LIST="nss openssl"
+#
+# For example;
+#
+# nmake -f Makefile.win PREFIX=C:\APR buildall checkall installall clean
+#
+
+!IF EXIST("aprutil.sln") && ([devenv /help > NUL 2>&1] == 0) \
+ && !defined(USEMAK) && !defined(USEDSW)
+USESLN=1
+USEMAK=0
+USEDSW=0
+!ELSEIF EXIST("aprutil.mak") && !defined(USEDSW)
+USESLN=0
+USEMAK=1
+USEDSW=0
+!ELSE
+USESLN=0
+USEMAK=0
+USEDSW=1
+!ENDIF
+
+PREFIX=..\apr-dist
+
+!IF [$(COMSPEC) /c cl /nologo /? \
+ | $(SystemRoot)\System32\find.exe "x64" >NUL ] == 0
+ARCH=x64 Release
+!ELSE
+ARCH=Win32 Release
+!ENDIF
+
+APR_PATH=..\apr
+API_PATH=..\apr-iconv
+APU_PATH=..\apr-util
+
+!MESSAGE ARCH = $(ARCH)
+!MESSAGE APR_PATH = $(APR_PATH)
+!MESSAGE API_PATH = $(API_PATH) (apr-iconv)
+!MESSAGE APU_PATH = $(APU_PATH) (apr-util)
+!MESSAGE PREFIX = $(PREFIX) (install path)
+!MESSAGE DBD_LIST = $(DBD_LIST)
+!MESSAGE DBM_LIST = $(DBM_LIST)
+!MESSAGE CRYPTO_LIST = $(CRYPTO_LIST)
+
+# Utility and Translation things, nothing here for the user
+#
+!IF "$(ARCH)" == "Win32 Release"
+SLNARCH=Release|Win32
+ARCHPATH=Release
+LIBSPATH=LibR
+ARCHOSPATH=Release
+LIBSOSPATH=LibR
+!ELSEIF "$(ARCH)" == "Win32 Debug"
+SLNARCH=Debug|Win32
+ARCHPATH=Debug
+LIBSPATH=LibD
+ARCHOSPATH=Debug
+LIBSOSPATH=LibD
+!ELSEIF "$(ARCH)" == "Win32 Release9x"
+SLNARCH=Release9x|Win32
+ARCHPATH=Release
+LIBSPATH=LibR
+ARCHOSPATH=9x\Release
+LIBSOSPATH=9x\LibR
+!ELSEIF "$(ARCH)" == "Win32 Debug9x"
+SLNARCH=Debug9x|Win32
+ARCHPATH=Debug
+LIBSPATH=LibD
+ARCHOSPATH=9x\Debug
+LIBSOSPATH=9x\LibD
+!ELSEIF "$(ARCH)" == "x64 Release"
+SLNARCH=Release|x64
+ARCHPATH=x64\Release
+LIBSPATH=x64\LibR
+ARCHOSPATH=x64\Release
+LIBSOSPATH=x64\LibR
+!ELSEIF "$(ARCH)" == "x64 Debug"
+SLNARCH=Debug|x64
+ARCHPATH=x64\Debug
+LIBSPATH=x64\LibD
+ARCHOSPATH=x64\Debug
+LIBSOSPATH=x64\LibD
+!ENDIF
+
+!IFNDEF MAKEOPT
+# Only default the behavior if MAKEOPT= is omitted
+!IFDEF _NMAKE_VER
+# Microsoft NMake options
+MAKEOPT=-nologo
+!ELSEIF "$(MAKE)" == "make"
+# Borland make options? Not really supported (yet)
+MAKEOPT=-s -N
+!ENDIF
+!ENDIF
+
+
+# Sanity Checks
+#
+!IF !EXIST("$(APR_PATH)\apr.dsp") || !EXIST("$(API_PATH)\apriconv.dsp") \
+ || !EXIST("$(APU_PATH)\aprutil.dsp")
+!MESSAGE Please check out or download and unpack the Apache Portability Runtime
+!MESSAGE sources (apr, apr-iconv and apr-util) under a single parent dir,
+!MESSAGE or provide APR_PATH, API_PATH and APU_PATH (all relative to each other,
+!MESSAGE or all absolute paths).
+!MESSAGE Apache cannot build without these libraries!
+!MESSAGE
+!ERROR Need apr and apr-iconv alongside apr-util to build!
+!ENDIF
+
+
+all: buildall checkall
+
+# To help win32 pick up the locations where they don't fall in the usual
+# path locations. This may not be completely effective for USESLN/USEDSP
+# oriented builds, just yet
+#
+LIB=$(APR_PATH)\$(ARCHOSPATH);$(APR_PATH)\$(LIBSOSPATH);$(API_PATH)\$(ARCHPATH);$(API_PATH)\$(LIBSPATH);$(APU_PATH)\$(ARCHPATH);$(APU_PATH)\$(LIBSPATH);$(LIB)
+INCLUDE=$(APR_PATH)\include;$(API_PATH)\include;$(INCLUDE)
+
+!IF $(USEMAK) == 1
+
+clean:
+ $(MAKE) $(MAKEOPT) -f Makefile.win ARCH="$(ARCH)" \
+ CTARGET=CLEAN buildall
+
+buildall:
+ cd $(APR_PATH)
+ $(MAKE) $(MAKEOPT) -f apr.mak CFG="apr - $(ARCH)" RECURSE=0 $(CTARGET)
+ $(MAKE) $(MAKEOPT) -f libapr.mak CFG="libapr - $(ARCH)" RECURSE=0 $(CTARGET)
+ cd build
+ $(MAKE) $(MAKEOPT) -f aprapp.mak CFG="aprapp - $(ARCH)" RECURSE=0 $(CTARGET)
+ $(MAKE) $(MAKEOPT) -f libaprapp.mak CFG="libaprapp - $(ARCH)" RECURSE=0 $(CTARGET)
+ cd ..
+ cd $(API_PATH)
+ $(MAKE) $(MAKEOPT) -f apriconv.mak CFG="apriconv - $(ARCH)" RECURSE=0 $(CTARGET)
+ $(MAKE) $(MAKEOPT) -f libapriconv.mak CFG="libapriconv - $(ARCH)" RECURSE=0 $(CTARGET)
+!IF "$(CTARGET)" == "CLEAN"
+ $(MAKE) $(MAKEOPT) -f build\modules.mk.win clean \
+ BUILD_MODE="$(ARCH)" BIND_MODE=shared API_SOURCE=.
+!ELSE
+ cd ccs
+ $(MAKE) $(MAKEOPT) -f Makefile.win all \
+ BUILD_MODE="$(ARCH)" BIND_MODE=shared
+ cd ..\ces
+ $(MAKE) $(MAKEOPT) -f Makefile.win all \
+ BUILD_MODE="$(ARCH)" BIND_MODE=shared
+ cd ..
+!ENDIF
+ cd $(APU_PATH)\xml\expat\lib
+ $(MAKE) $(MAKEOPT) -f xml.mak CFG="xml - $(ARCH)" RECURSE=0 $(CTARGET)
+ cd ..\..\..
+ $(MAKE) $(MAKEOPT) -f aprutil.mak CFG="aprutil - $(ARCH)" RECURSE=0 $(CTARGET)
+ $(MAKE) $(MAKEOPT) -f libaprutil.mak CFG="libaprutil - $(ARCH)" RECURSE=0 $(CTARGET)
+ cd ldap
+ $(MAKE) $(MAKEOPT) -f apr_ldap.mak CFG="apr_ldap - $(ARCH)" RECURSE=0 $(CTARGET)
+ cd ..
+ cd dbd
+ for %d in (odbc $(DBD_LIST)) do \
+ $(MAKE) $(MAKEOPT) -f apr_dbd_%d.mak CFG="apr_dbd_%d - $(ARCH)" RECURSE=0 $(CTARGET)
+ cd ..
+ cd dbm
+ for %d in ($(DBM_LIST) x) do if not %d == x \
+ $(MAKE) $(MAKEOPT) -f apr_dbm_%d.mak CFG="apr_dbm_%d - $(ARCH)" RECURSE=0 $(CTARGET)
+ cd ..
+ cd crypto
+ for %d in ($(CRYPTO_LIST) x) do if not %d == x \
+ $(MAKE) $(MAKEOPT) -f apr_crypto_%d.mak CFG="apr_crypto_%d - $(ARCH)" RECURSE=0 $(CTARGET)
+ cd ..
+
+!ELSEIF $(USESLN) == 1
+
+clean:
+ -for %d in (odbc $(DBD_LIST)) do \
+ devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project apr_dbd_%d
+ -for %d in ($(DBM_LIST) x) do if not %d == x \
+ devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project apr_dbm_%d
+ -for %d in ($(CRYPTO_LIST) x) do if not %d == x \
+ devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project apr_crypto_%d
+ -devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project apr_ldap
+ -devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project libaprutil
+ -devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project aprutil
+ cd $(API_PATH)
+ -$(MAKE) $(MAKEOPT) -f build\modules.mk.win clean \
+ BUILD_MODE="$(ARCH)" BIND_MODE=shared API_SOURCE=.
+ cd $(APU_PATH)
+ -devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project libapriconv
+ -devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project apriconv
+ -devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project libaprapp
+ -devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project aprapp
+ -devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project libapr
+ -devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project apr
+
+buildall:
+ devenv aprutil.sln /useenv /build "$(SLNARCH)" /project aprapp
+ devenv aprutil.sln /useenv /build "$(SLNARCH)" /project libaprapp
+ devenv aprutil.sln /useenv /build "$(SLNARCH)" /project aprutil
+ devenv aprutil.sln /useenv /build "$(SLNARCH)" /project libaprutil
+ devenv aprutil.sln /useenv /build "$(SLNARCH)" /project apr_ldap
+ for %d in (odbc $(DBD_LIST)) do \
+ devenv aprutil.sln /useenv /build "$(SLNARCH)" /project apr_dbd_%d
+ for %d in ($(DBM_LIST) x) do if not %d == x \
+ devenv aprutil.sln /useenv /build "$(SLNARCH)" /project apr_dbm_%d
+ for %d in ($(CRYPTO_LIST) x) do if not %d == x \
+ devenv aprutil.sln /useenv /build "$(SLNARCH)" /project apr_crypto_%d
+
+!ELSE
+# $(USEDSP) == 1
+
+clean:
+ -for %d in (odbc $(DBD_LIST)) do \
+ msdev aprutil.dsw /USEENV /MAKE "apr_dbd_%d - $(ARCH)" /CLEAN
+ -for %d in ($(DBM_LIST) x) do if not %d == x \
+ msdev aprutil.dsw /USEENV /MAKE "apr_dbm_%d - $(ARCH)" /CLEAN
+ -for %d in ($(CRYPTO_LIST) x) do if not %d == x \
+ msdev aprutil.dsw /USEENV /MAKE "apr_crypto_%d - $(ARCH)" /CLEAN
+ -msdev aprutil.dsw /USEENV /MAKE "apr_ldap - $(ARCH)" /CLEAN
+ -msdev aprutil.dsw /USEENV /MAKE "libaprutil - $(ARCH)" /CLEAN
+ -msdev aprutil.dsw /USEENV /MAKE "aprutil - $(ARCH)" /CLEAN
+ cd $(API_PATH)
+ $(MAKE) $(MAKEOPT) -f build\modules.mk.win clean \
+ BUILD_MODE="$(ARCH)" BIND_MODE=shared API_SOURCE=.
+ cd $(APU_PATH)
+ -msdev aprutil.dsw /USEENV /MAKE "libapriconv - $(ARCH)" /CLEAN
+ -msdev aprutil.dsw /USEENV /MAKE "apriconv - $(ARCH)" /CLEAN
+ -msdev aprutil.dsw /USEENV /MAKE "libaprapp - $(ARCH)" /CLEAN
+ -msdev aprutil.dsw /USEENV /MAKE "aprapp - $(ARCH)" /CLEAN
+ -msdev aprutil.dsw /USEENV /MAKE "libapr - $(ARCH)" /CLEAN
+ -msdev aprutil.dsw /USEENV /MAKE "apr - $(ARCH)" /CLEAN
+
+buildall:
+ @msdev aprutil.dsw /USEENV /MAKE "aprapp - $(ARCH)"
+ @msdev aprutil.dsw /USEENV /MAKE "aprutil - $(ARCH)"
+ @msdev aprutil.dsw /USEENV /MAKE "libaprapp - $(ARCH)"
+ @msdev aprutil.dsw /USEENV /MAKE "libaprutil - $(ARCH)"
+ @msdev aprutil.dsw /USEENV /MAKE "apr_ldap - $(ARCH)"
+ @for %d in (odbc $(DBD_LIST)) do \
+ msdev aprutil.dsw /USEENV /MAKE "apr_dbd_%d - $(ARCH)"
+ @for %d in ($(DBM_LIST) x) do if not %d == x \
+ msdev aprutil.dsw /USEENV /MAKE "apr_dbm_%d - $(ARCH)"
+ @for %d in ($(CRYPTO_LIST) x) do if not %d == x \
+ msdev aprutil.dsw /USEENV /MAKE "apr_crypto_%d - $(ARCH)"
+
+!ENDIF
+
+
+checkapr:
+ cd $(APR_PATH)\test
+ $(MAKE) $(MAKEOPT) -f Makefile.win MODEL=static \
+ OUTDIR=$(LIBSOSPATH) check
+ $(MAKE) $(MAKEOPT) -f Makefile.win MODEL=dynamic \
+ OUTDIR=$(ARCHOSPATH) check
+ cd ..
+ cd $(APU_PATH)
+
+checkapu:
+ cd $(APU_PATH)
+ cd test
+ $(MAKE) $(MAKEOPT) -f Makefile.win MODEL=static \
+ OUTDIR=$(LIBSPATH) APROUTDIR=$(LIBSOSPATH) \
+ APR_PATH=..\$(APR_PATH) API_PATH=..\$(API_PATH) check
+ $(MAKE) $(MAKEOPT) -f Makefile.win MODEL=dynamic \
+ OUTDIR=$(ARCHPATH) APROUTDIR=$(ARCHOSPATH) \
+ APR_PATH=..\$(APR_PATH) API_PATH=..\$(API_PATH) check
+ cd ..
+
+checkall: checkapr checkapu
+
+
+install:
+ echo Y >.y
+ echo A >.A
+ @if NOT EXIST "$(PREFIX)\." mkdir "$(PREFIX)"
+ @if NOT EXIST "$(PREFIX)\bin\." mkdir "$(PREFIX)\bin"
+ @if NOT EXIST "$(PREFIX)\bin\iconv\." mkdir "$(PREFIX)\bin\iconv"
+ @if NOT EXIST "$(PREFIX)\include\." mkdir "$(PREFIX)\include"
+ @if NOT EXIST "$(PREFIX)\lib\." mkdir "$(PREFIX)\lib"
+ copy CHANGES "$(PREFIX)\CHANGES.txt" <.y
+ copy LICENSE "$(PREFIX)\LICENSE.txt" <.y
+ copy NOTICE "$(PREFIX)\NOTICE.txt" <.y
+ xcopy $(APR_PATH)\include\*.h "$(PREFIX)\include\" /d < .a
+ xcopy $(APU_PATH)\include\*.h "$(PREFIX)\include\" /d < .a
+ copy $(APR_PATH)\$(LIBSOSPATH)\apr-1.lib "$(PREFIX)\lib\" <.y
+ copy $(APR_PATH)\$(LIBSOSPATH)\apr-1.pdb "$(PREFIX)\lib\" <.y
+ copy $(APU_PATH)\$(LIBSPATH)\aprutil-1.lib "$(PREFIX)\lib\" <.y
+ copy $(APU_PATH)\$(LIBSPATH)\aprutil-1.pdb "$(PREFIX)\lib\" <.y
+ copy $(APR_PATH)\$(ARCHOSPATH)\libapr-1.lib "$(PREFIX)\lib\" <.y
+ copy $(APR_PATH)\$(ARCHOSPATH)\libapr-1.exp "$(PREFIX)\lib\" <.y
+ copy $(APU_PATH)\$(ARCHPATH)\libaprutil-1.lib "$(PREFIX)\lib\" <.y
+ copy $(APU_PATH)\$(ARCHPATH)\libaprutil-1.exp "$(PREFIX)\lib\" <.y
+ copy $(APR_PATH)\$(ARCHOSPATH)\libapr-1.dll "$(PREFIX)\bin\" <.y
+ copy $(APR_PATH)\$(ARCHOSPATH)\libapr-1.pdb "$(PREFIX)\bin\" <.y
+ copy $(API_PATH)\$(ARCHPATH)\libapriconv-1.dll "$(PREFIX)\bin\" <.y
+ copy $(API_PATH)\$(ARCHPATH)\libapriconv-1.pdb "$(PREFIX)\bin\" <.y
+ copy $(APU_PATH)\$(ARCHPATH)\libaprutil-1.dll "$(PREFIX)\bin\" <.y
+ copy $(APU_PATH)\$(ARCHPATH)\libaprutil-1.pdb "$(PREFIX)\bin\" <.y
+ copy $(APU_PATH)\ldap\$(ARCHPATH)\apr_ldap-1.dll "$(PREFIX)\bin\" <.y
+ copy $(APU_PATH)\ldap\$(ARCHPATH)\apr_ldap-1.pdb "$(PREFIX)\bin\" <.y
+ for %d in (odbc $(DBD_LIST)) do ( \
+ copy $(APU_PATH)\dbd\$(ARCHPATH)\apr_dbd_%d-1.dll "$(PREFIX)\bin\" <.y && \
+ copy $(APU_PATH)\dbd\$(ARCHPATH)\apr_dbd_%d-1.pdb "$(PREFIX)\bin\" <.y \
+ )
+ for %d in ($(DBM_LIST) x) do if not %d == x ( \
+ copy $(APU_PATH)\dbm\$(ARCHPATH)\apr_dbm_%d-1.dll "$(PREFIX)\bin\" <.y && \
+ copy $(APU_PATH)\dbm\$(ARCHPATH)\apr_dbm_%d-1.pdb "$(PREFIX)\bin\" <.y \
+ )
+ for %d in ($(CRYPTO_LIST) x) do if not %d == x ( \
+ copy $(APU_PATH)\crypto\$(ARCHPATH)\apr_crypto_%d-1.dll "$(PREFIX)\bin\" <.y && \
+ copy $(APU_PATH)\crypto\$(ARCHPATH)\apr_crypto_%d-1.pdb "$(PREFIX)\bin\" <.y \
+ )
+ xcopy $(API_PATH)\$(ARCHPATH)\iconv\*.so "$(PREFIX)\bin\iconv\" /d < .a
+ xcopy $(API_PATH)\$(ARCHPATH)\iconv\*.pdb "$(PREFIX)\bin\iconv\" /d < .a
+ del .y
+ del .a
+
diff --git a/contrib/apr-util/NOTICE b/contrib/apr-util/NOTICE
new file mode 100644
index 000000000000..a107139ef37e
--- /dev/null
+++ b/contrib/apr-util/NOTICE
@@ -0,0 +1,14 @@
+Apache Portable Runtime Utility Library
+Copyright (c) 2000-2014 The Apache Software Foundation.
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+Portions of this software were developed at the National Center
+for Supercomputing Applications (NCSA) at the University of
+Illinois at Urbana-Champaign.
+
+This software contains code derived from the RSA Data Security
+Inc. MD5 Message-Digest Algorithm, including various
+modifications by Spyglass Inc., Carnegie Mellon University, and
+Bell Communications Research, Inc (Bellcore).
diff --git a/contrib/apr-util/NWGNUmakefile b/contrib/apr-util/NWGNUmakefile
new file mode 100644
index 000000000000..e089b6fc7f36
--- /dev/null
+++ b/contrib/apr-util/NWGNUmakefile
@@ -0,0 +1,308 @@
+#
+# Declare the sub-directories to be built here
+#
+
+SUBDIRS = \
+ ldap \
+ xml \
+ $(EOLIST)
+
+ifdef WITH_APR_DBD
+SUBDIRS += \
+ dbd \
+ $(EOLIST)
+endif
+
+ifdef WITH_APR_DBM
+SUBDIRS += \
+ dbm \
+ $(EOLIST)
+endif
+
+#
+# Get the 'head' of the build environment. This includes default targets and
+# paths to tools
+#
+
+include $(APR_WORK)/build/NWGNUhead.inc
+
+#
+# Make sure all needed macro's are defined
+#
+
+#
+# These directories will be at the beginning of the include list, followed by
+# INCDIRS
+#
+XINCDIRS += \
+ $(APR)/include \
+ $(APR)/include/arch/NetWare \
+ $(APU)/include \
+ $(APU)/uri \
+ $(APU)/dbm/sdbm \
+ $(APU)/include/private \
+ $(APUXML)/expat/lib \
+ $(LDAPSDK)/inc \
+ $(EOLIST)
+
+#
+# These flags will come after CFLAGS
+#
+XCFLAGS += \
+ $(EOLIST)
+
+#
+# These defines will come after DEFINES
+#
+XDEFINES += \
+ $(EOLIST)
+
+#
+# These flags will be added to the link.opt file
+#
+XLFLAGS += \
+ $(EOLIST)
+
+#
+# These values will be appended to the correct variables based on the value of
+# RELEASE
+#
+ifeq "$(RELEASE)" "debug"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "noopt"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "release"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+#
+# These are used by the link target if an NLM is being generated
+# This is used by the link 'name' directive to name the nlm. If left blank
+# TARGET_nlm (see below) will be used.
+#
+NLM_NAME =
+
+#
+# This is used by the link '-desc ' directive.
+# If left blank, NLM_NAME will be used.
+#
+NLM_DESCRIPTION =
+
+#
+# This is used by the '-threadname' directive. If left blank,
+# NLM_NAME Thread will be used.
+#
+NLM_THREAD_NAME =
+#
+# If this is specified, it will override VERSION value in
+# $(APR_WORK)/build/NWGNUenvironment.inc
+#
+NLM_VERSION =
+
+#
+# If this is specified, it will override the default of 64K
+#
+NLM_STACK_SIZE =
+
+#
+# If this is specified it will be used by the link '-entry' directive
+#
+NLM_ENTRY_SYM =
+
+#
+# If this is specified it will be used by the link '-exit' directive
+#
+NLM_EXIT_SYM =
+
+#
+# If this is specified it will be used by the link '-check' directive
+#
+NLM_CHECK_SYM =
+
+#
+# If this is specified it will be used by the link '-flags' directive
+#
+NLM_FLAGS =
+
+#
+# If this is specified it will be linked in with the XDCData option in the def
+# file instead of the default of $(APR)/misc/netware/apache.xdc. XDCData can
+# be disabled by setting APACHE_UNIPROC in the environment
+#
+XDCDATA =
+
+#
+# Declare all target files (you must add your files here)
+#
+
+#
+# If there is an NLM target, put it here
+#
+TARGET_nlm = \
+ $(EOLIST)
+
+#
+# If there is an LIB target, put it here
+#
+TARGET_lib = \
+ $(OBJDIR)/apulib.lib \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the NLM target above.
+# Paths must all use the '/' character
+#
+FILES_nlm_objs = \
+ $(EOLIST)
+
+#
+# These are the LIB files needed to create the NLM target above.
+# These will be added as a library command in the link.opt file.
+#
+FILES_nlm_libs = \
+ $(EOLIST)
+
+#
+# These are the modules that the above NLM target depends on to load.
+# These will be added as a module command in the link.opt file.
+#
+FILES_nlm_modules = \
+ $(EOLIST)
+
+#
+# If the nlm has a msg file, put it's path here
+#
+FILE_nlm_msg =
+
+#
+# If the nlm has a hlp file put it's path here
+#
+FILE_nlm_hlp =
+
+#
+# If this is specified, it will override $(NWOS)\copyright.txt.
+#
+FILE_nlm_copyright =
+
+#
+# Any additional imports go here
+#
+FILES_nlm_Ximports = \
+ $(EOLIST)
+
+#
+# Any symbols exported to here
+#
+FILES_nlm_exports = \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the LIB target above.
+# Paths must all use the '/' character
+#
+FILES_lib_objs = \
+ $(OBJDIR)/apr_base64.o \
+ $(OBJDIR)/apr_brigade.o \
+ $(OBJDIR)/apr_buckets.o \
+ $(OBJDIR)/apr_buckets_alloc.o \
+ $(OBJDIR)/apr_buckets_eos.o \
+ $(OBJDIR)/apr_buckets_file.o \
+ $(OBJDIR)/apr_buckets_flush.o \
+ $(OBJDIR)/apr_buckets_heap.o \
+ $(OBJDIR)/apr_buckets_mmap.o \
+ $(OBJDIR)/apr_buckets_pipe.o \
+ $(OBJDIR)/apr_buckets_pool.o \
+ $(OBJDIR)/apr_buckets_refcount.o \
+ $(OBJDIR)/apr_buckets_simple.o \
+ $(OBJDIR)/apr_buckets_socket.o \
+ $(OBJDIR)/apr_crypto.o \
+ $(OBJDIR)/apr_date.o \
+ $(OBJDIR)/apr_dbm.o \
+ $(OBJDIR)/apr_dbd.o \
+ $(OBJDIR)/apr_dbm_sdbm.o \
+ $(OBJDIR)/apu_dso.o \
+ $(OBJDIR)/apr_hooks.o \
+ $(OBJDIR)/apr_md4.o \
+ $(OBJDIR)/apr_md5.o \
+ $(OBJDIR)/apr_memcache.o \
+ $(OBJDIR)/apr_passwd.o \
+ $(OBJDIR)/apr_queue.o \
+ $(OBJDIR)/apr_reslist.o \
+ $(OBJDIR)/apr_rmm.o \
+ $(OBJDIR)/apr_sha1.o \
+ $(OBJDIR)/apu_version.o \
+ $(OBJDIR)/getuuid.o \
+ $(OBJDIR)/uuid.o \
+ $(OBJDIR)/apr_strmatch.o \
+ $(OBJDIR)/apr_thread_pool.o \
+ $(OBJDIR)/apr_uri.o \
+ $(OBJDIR)/crypt_blowfish.o \
+ $(OBJDIR)/sdbm.o \
+ $(OBJDIR)/sdbm_hash.o \
+ $(OBJDIR)/sdbm_lock.o \
+ $(OBJDIR)/sdbm_pair.o \
+ $(OBJDIR)/xlate.o \
+ $(EOLIST)
+
+#
+# implement targets and dependancies (leave this section alone)
+#
+
+libs :: $(OBJDIR) $(TARGET_lib)
+
+nlms :: libs $(TARGET_nlm)
+
+#
+# Updated this target to create necessary directories and copy files to the
+# correct place. (See $(APR_WORK)/build/NWGNUhead.inc for examples)
+#
+install :: nlms FORCE
+
+#
+# Any specialized rules here
+#
+
+vpath %.c buckets:crypto:dbd:dbm:dbm/sdbm:encoding:hooks:ldap:memcache:misc:strmatch:uri:xlate:xml
+
+#
+# Include the 'tail' makefile that has targets that depend on variables defined
+# in this makefile
+#
+
+include $(APRBUILD)/NWGNUtail.inc
+
+
diff --git a/contrib/apr-util/README b/contrib/apr-util/README
new file mode 100644
index 000000000000..3a685698bee8
--- /dev/null
+++ b/contrib/apr-util/README
@@ -0,0 +1,111 @@
+Apache Portable Runtime Utility Library README
+----------------------------------------------
+
+ The Apache Portable Runtime Utility Library provides a predictable
+ and consistent interface to underlying client library interfaces.
+ This API assures predictable if not identical behavior regardless
+ of which libraries are available on a given platform.
+
+ APR and its companion libraries are implemented entirely in C
+ and provide a common programming interface across a wide variety
+ of operating system platforms without sacrificing performance.
+ Currently supported platforms include:
+
+ UNIX variants
+ Windows
+ Netware
+ Mac OS X
+ OS/2
+
+ To give a brief overview, the primary core
+ subsystems of APR-util 1.3 include the following:
+
+ Hashing and UUID services
+ Multiple SQL DBD client interfaces
+ Multiple flat-database DBM client interfaces
+ Typesafe function Hooks abstraction
+ LDAP SSL connections for a variety of LDAP toolkits
+ MemCache interface
+ Date parsing rourtines
+ Resource Lists
+ Thread Pools
+ Queues
+ Relocatable Memory Management functions
+ String filename-style pattern matching
+ URI Parsing
+ Charset translation (iconv based)
+ XML parsing (expat based)
+
+ For a more complete list, please refer to the following URLs:
+
+ http://apr.apache.org/docs/apr-util/modules.html
+
+ Users of APR 0.9 should be aware that migrating to the APR 1.x
+ programming interfaces may require some adjustments; APR 1.x is
+ neither source nor binary compatible with earlier APR 0.9 releases.
+ Users of APR 1.x can expect consistent interfaces and binary backwards
+ compatibility throughout the entire APR 1.x release cycle, as defined
+ in our versioning rules:
+
+ http://apr.apache.org/versioning.html
+
+ APR is already used extensively by the Apache HTTP Server
+ version 2 and the Subversion revision control system, to
+ name but a few. We list all known projects using APR at
+ http://apr.apache.org/projects.html -- so please let us know
+ if you find our libraries useful in your own projects!
+
+
+Database Providers
+------------------
+As of apr-util version 1.2.11, MySQL DBD driver is shipped as part of the
+distribution. However, to avoid licensing incompatibilities, it is not
+built by default. To enable MySQL support, use the --with-mysql option,
+but be aware that the MySQL license may introduce licensing implications
+for your compiled code. Similarly, the bindings for propritary drivers
+such as Oracle (--with-oracle option) must also be explicitly enabled.
+
+On windows, selection of supported drivers is via the environment values
+DBD_LIST (for freetds, mysql, oracle, pgsql, sqlite2 and/or sqlite3)
+and DBM_LIST (db and/or gdbm). DBD odbc and DBM sdbm are unconditionally
+compiled and installed, do not include these in the list.
+
+Whenever distributing apr-util in combination with database client
+drivers, always review the license requirements of all components.
+
+
+Cryptographic Software Notice
+-----------------------------
+This distribution includes cryptographic software. The country in
+which you currently reside may have restrictions on the import,
+possession, use, and/or re-export to another country, of
+encryption software. BEFORE using any encryption software, please
+check your country's laws, regulations and policies concerning the
+import, possession, or use, and re-export of encryption software, to
+see if this is permitted. See http://www.wassenaar.org/ for more
+information.
+
+The U.S. Government Department of Commerce, Bureau of Industry and
+Security (BIS), has classified this software as Export Commodity
+Control Number (ECCN) 5D002.C.1, which includes information security
+software using or performing cryptographic functions with asymmetric
+algorithms. The form and manner of this Apache Software Foundation
+distribution makes it eligible for export under the License Exception
+ENC Technology Software Unrestricted (TSU) exception (see the BIS
+Export Administration Regulations, Section 740.13) for both object
+code and source code.
+
+The following provides more details on the included cryptographic
+software:
+
+ APR-Util provides an abstract interface for symmetrical cryptographic
+ functions that make use of a general-purpose encryption library,
+ such as OpenSSL, NSS, or the operating system's platform-specific
+ facilities. This interface is known as the apr_crypto interface,
+ with implementation beneath the /crypto directory.
+
+ APR-Util provides an abstract interface for SSL encrypted LDAP (ldaps
+ and STARTTLS style) connections, which can be powered by OpenLDAP,
+ Netscape LDAP SDK, Mozilla LDAP SDK, or other platform specific ldap
+ interfaces.
+
diff --git a/contrib/apr-util/apr-util.pc.in b/contrib/apr-util/apr-util.pc.in
new file mode 100644
index 000000000000..5b146af3de81
--- /dev/null
+++ b/contrib/apr-util/apr-util.pc.in
@@ -0,0 +1,13 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+APRUTIL_MAJOR_VERSION=@APRUTIL_MAJOR_VERSION@
+includedir=@includedir@
+
+Name: APR Utils
+Description: Companion library for APR
+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@
+Cflags: -I${includedir}
diff --git a/contrib/apr-util/apr-util.spec b/contrib/apr-util/apr-util.spec
new file mode 100644
index 000000000000..e9dc24b08da7
--- /dev/null
+++ b/contrib/apr-util/apr-util.spec
@@ -0,0 +1,214 @@
+
+%define apuver 1
+
+Summary: Apache Portable Runtime Utility library
+Name: apr-util
+Version: 1.5.4
+Release: 1
+License: Apache Software License
+Group: System Environment/Libraries
+URL: http://apr.apache.org/
+Source0: http://www.apache.org/dist/apr/%{name}-%{version}.tar.bz2
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot
+BuildRequires: autoconf, libtool, doxygen, apr-devel >= 1.4.0
+BuildRequires: expat-devel, libuuid-devel
+
+%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
+Group: Development/Libraries
+Summary: APR utility library development kit
+Requires: apr-util = %{version}-%{release}, apr-devel
+Requires: db4-devel, expat-devel
+
+%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 dbm
+Group: Development/Libraries
+Summary: APR utility library DBM driver
+BuildRequires: db4-devel
+Requires: apr-util = %{version}-%{release}
+
+%description dbm
+This package provides the DBM driver for the apr-util.
+
+%package pgsql
+Group: Development/Libraries
+Summary: APR utility library PostgreSQL DBD driver
+BuildRequires: postgresql-devel
+Requires: apr-util = %{version}-%{release}
+
+%description pgsql
+This package provides the PostgreSQL driver for the apr-util
+DBD (database abstraction) interface.
+
+%package mysql
+Group: Development/Libraries
+Summary: APR utility library MySQL DBD driver
+BuildRequires: mysql-devel
+Requires: apr-util = %{version}-%{release}
+
+%description mysql
+This package provides the MySQL driver for the apr-util DBD
+(database abstraction) interface.
+
+%package sqlite
+Group: Development/Libraries
+Summary: APR utility library SQLite DBD driver
+BuildRequires: sqlite-devel >= 3.0.0
+Requires: apr-util = %{version}-%{release}
+
+%description sqlite
+This package provides the SQLite driver for the apr-util DBD
+(database abstraction) interface.
+
+%package freetds
+Group: Development/Libraries
+Summary: APR utility library FreeTDS DBD driver
+BuildRequires: freetds-devel
+Requires: apr-util = %{version}-%{release}
+
+%description freetds
+This package provides the FreeTDS driver for the apr-util DBD
+(database abstraction) interface.
+
+%package odbc
+Group: Development/Libraries
+Summary: APR utility library ODBC DBD driver
+BuildRequires: unixODBC-devel
+Requires: apr-util = %{version}-%{release}
+
+%description odbc
+This package provides the ODBC driver for the apr-util DBD
+(database abstraction) interface.
+
+%package ldap
+Group: Development/Libraries
+Summary: APR utility library LDAP support
+BuildRequires: openldap-devel
+Requires: apr-util = %{version}-%{release}
+
+%description ldap
+This package provides the LDAP support for the apr-util.
+
+%package openssl
+Group: Development/Libraries
+Summary: APR utility library OpenSSL crypto support
+BuildRequires: openssl-devel
+Requires: apr-util = %{version}-%{release}
+
+%description openssl
+This package provides crypto support for apr-util based on OpenSSL.
+
+%package nss
+Group: Development/Libraries
+Summary: APR utility library NSS crypto support
+BuildRequires: nss-devel
+Requires: apr-util = %{version}-%{release}
+
+%description nss
+This package provides crypto support for apr-util based on Mozilla NSS.
+
+%prep
+%setup -q
+
+%build
+%configure --with-apr=%{_prefix} \
+ --includedir=%{_includedir}/apr-%{apuver} \
+ --with-ldap --without-gdbm \
+ --with-sqlite3 --with-pgsql --with-mysql --with-freetds --with-odbc \
+ --with-berkeley-db \
+ --with-crypto --with-openssl --with-nss \
+ --without-sqlite2
+make %{?_smp_mflags} && make dox
+
+%check
+# Run non-interactive tests
+pushd test
+make %{?_smp_mflags} all CFLAGS=-fno-strict-aliasing
+make check || exit 1
+popd
+
+%install
+rm -rf $RPM_BUILD_ROOT
+make install DESTDIR=$RPM_BUILD_ROOT
+
+# Documentation
+mv docs/dox/html html
+
+# Unpackaged files
+rm -f $RPM_BUILD_ROOT%{_libdir}/aprutil.exp
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%post -p /sbin/ldconfig
+
+%postun -p /sbin/ldconfig
+
+%files
+%defattr(-,root,root,-)
+%doc CHANGES LICENSE NOTICE
+%{_libdir}/libaprutil-%{apuver}.so.*
+%dir %{_libdir}/apr-util-%{apuver}
+
+%files dbm
+%defattr(-,root,root,-)
+%{_libdir}/apr-util-%{apuver}/apr_dbm_db*
+
+%files pgsql
+%defattr(-,root,root,-)
+%{_libdir}/apr-util-%{apuver}/apr_dbd_pgsql*
+
+%files mysql
+%defattr(-,root,root,-)
+%{_libdir}/apr-util-%{apuver}/apr_dbd_mysql*
+
+%files sqlite
+%defattr(-,root,root,-)
+%{_libdir}/apr-util-%{apuver}/apr_dbd_sqlite*
+
+%files freetds
+%defattr(-,root,root,-)
+%{_libdir}/apr-util-%{apuver}/apr_dbd_freetds*
+
+%files odbc
+%defattr(-,root,root,-)
+%{_libdir}/apr-util-%{apuver}/apr_dbd_odbc*
+
+%files ldap
+%defattr(-,root,root,-)
+%{_libdir}/apr-util-%{apuver}/apr_ldap*
+
+%files openssl
+%defattr(-,root,root,-)
+%{_libdir}/apr-util-%{apuver}/apr_crypto_openssl*
+
+%files nss
+%defattr(-,root,root,-)
+%{_libdir}/apr-util-%{apuver}/apr_crypto_nss*
+
+%files devel
+%defattr(-,root,root,-)
+%{_bindir}/apu-%{apuver}-config
+%{_libdir}/libaprutil-%{apuver}.*a
+%{_libdir}/libaprutil-%{apuver}.so
+%{_libdir}/pkgconfig/apr-util-%{apuver}.pc
+%{_includedir}/apr-%{apuver}/*.h
+%doc --parents html
+
+%changelog
+* Tue Jun 22 2004 Graham Leggett <minfrin@sharp.fm> 1.0.0-1
+- update to support v1.0.0 of APR
+
+* Tue Jun 22 2004 Graham Leggett <minfrin@sharp.fm> 1.0.0-1
+- derived from Fedora Core apr.spec
+
diff --git a/contrib/apr-util/aprutil.dsw b/contrib/apr-util/aprutil.dsw
new file mode 100644
index 000000000000..9d60aff83a8e
--- /dev/null
+++ b/contrib/apr-util/aprutil.dsw
@@ -0,0 +1,479 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "apr"="..\apr\apr.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "apr_crypto_nss"=".\crypto\apr_crypto_nss.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libaprutil
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "apr_crypto_openssl"=".\crypto\apr_crypto_openssl.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libaprutil
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "apr_dbd_freetds"=".\dbd\apr_dbd_freetds.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libaprutil
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "apr_dbd_mysql"=".\dbd\apr_dbd_mysql.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libaprutil
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "apr_dbd_odbc"=".\dbd\apr_dbd_odbc.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libaprutil
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "apr_dbd_oracle"=".\dbd\apr_dbd_oracle.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libaprutil
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "apr_dbd_pgsql"=".\dbd\apr_dbd_pgsql.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libaprutil
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "apr_dbd_sqlite2"=".\dbd\apr_dbd_sqlite2.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libaprutil
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "apr_dbd_sqlite3"=".\dbd\apr_dbd_sqlite3.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libaprutil
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "apr_dbm_db"=".\dbm\apr_dbm_db.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libaprutil
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "apr_dbm_gdbm"=".\dbm\apr_dbm_gdbm.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libaprutil
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "apr_ldap"=".\ldap\apr_ldap.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libaprutil
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "aprapp"="..\apr\build\aprapp.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name preaprapp
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "apriconv"="..\apr-iconv\apriconv.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name preapriconv
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "aprutil"=".\aprutil.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name preaprutil
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name apriconv
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name xml
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "libapr"="..\apr\libapr.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "libaprapp"="..\apr\build\libaprapp.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name prelibaprapp
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "libapriconv"="..\apr-iconv\libapriconv.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "libapriconv_ccs_modules"="..\apr-iconv\ccs\libapriconv_ccs_modules.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libapriconv
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "libapriconv_ces_modules"="..\apr-iconv\ces\libapriconv_ces_modules.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libapriconv
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "libaprutil"=".\libaprutil.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libaprapp
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libapriconv
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libapriconv_ccs_modules
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libapriconv_ces_modules
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name xml
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "preaprapp"="..\apr\build\preaprapp.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name apr
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "preapriconv"="..\apr-iconv\build\preapriconv.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name apr
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "preaprutil"=".\build\preaprutil.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name apr
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name aprapp
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "prelibaprapp"="..\apr\build\prelibaprapp.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "xml"=".\xml\expat\lib\xml.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/contrib/apr-util/apu-config.in b/contrib/apr-util/apu-config.in
new file mode 100644
index 000000000000..e181e44ae319
--- /dev/null
+++ b/contrib/apr-util/apu-config.in
@@ -0,0 +1,225 @@
+#!/bin/sh
+# 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.
+#
+
+# APR-util script designed to allow easy command line access to APR-util
+# configuration parameters.
+
+APRUTIL_MAJOR_VERSION="@APRUTIL_MAJOR_VERSION@"
+APRUTIL_DOTTED_VERSION="@APRUTIL_DOTTED_VERSION@"
+
+prefix="@prefix@"
+exec_prefix="@exec_prefix@"
+bindir="@bindir@"
+libdir="@libdir@"
+includedir="@includedir@"
+
+LIBS="@APRUTIL_EXPORT_LIBS@"
+INCLUDES="@APRUTIL_INCLUDES@"
+LDFLAGS="@APRUTIL_LDFLAGS@"
+LDAP_LIBS="@LDADD_ldap@"
+DBM_LIBS="@LDADD_dbm_db@ @LDADD_dbm_gdbm@ @LDADD_dbm_ndbm@"
+
+APRUTIL_LIBNAME="@APRUTIL_LIBNAME@"
+
+APU_SOURCE_DIR="@abs_srcdir@"
+APU_BUILD_DIR="@abs_builddir@"
+APR_XML_EXPAT_OLD="@APR_XML_EXPAT_OLD@"
+APU_DB_VERSION="@apu_db_version@"
+
+# NOTE: the following line is modified during 'make install': alter with care!
+location=@APU_CONFIG_LOCATION@
+
+show_usage()
+{
+ cat << EOF
+Usage: apu-$APRUTIL_MAJOR_VERSION-config [OPTION]
+
+Known values for OPTION are:
+ --prefix[=DIR] change prefix to DIR
+ --bindir print location where binaries are installed
+ --includes print include information
+ --includedir print location where headers are installed
+ --ldflags print linker flags
+ --libs print library information
+ --avoid-ldap do not include ldap library information with --libs
+ --ldap-libs print library information to link with ldap
+ --avoid-dbm do not include DBM library information with --libs
+ --dbm-libs print additional library information to link with DBM
+ --srcdir print APR-util source directory
+ --link-ld print link switch(es) for linking to APR-util
+ --link-libtool print the libtool inputs for linking to APR-util
+ --apu-la-file print the path to the .la file, if available
+ --old-expat indicate if APR-util was built against an old expat
+ --db-version print the DB version
+ --version print APR-util's version as a dotted triple
+ --help print this help
+
+When linking with libtool, an application should do something like:
+ APU_LIBS="\`apu-$APRUTIL_MAJOR_VERSION-config --link-libtool --libs\`"
+or when linking directly:
+ APU_LIBS="\`apu-$APRUTIL_MAJOR_VERSION-config --link-ld --libs\`"
+
+An application should use the results of --includes, and --ldflags in
+their build process.
+EOF
+}
+
+if test $# -eq 0; then
+ show_usage
+ exit 1
+fi
+
+if test "$location" = "installed"; then
+ LA_FILE="$libdir/lib${APRUTIL_LIBNAME}.la"
+
+ LIBS=`echo "$LIBS" | sed -e "s $APU_BUILD_DIR/xml/expat $prefix g" -e "s $prefix/libexpat.la -lexpat g"`
+ LDFLAGS=`echo "$LDFLAGS" | sed -e "s $APU_BUILD_DIR/xml/expat $prefix g"`
+ INCLUDES=`echo "$INCLUDES" | sed -e "s $APU_BUILD_DIR/xml/expat $prefix g" -e "s -I$prefix/lib g"`
+else
+ LA_FILE="$APU_BUILD_DIR/lib${APRUTIL_LIBNAME}.la"
+fi
+
+flags=""
+
+while test $# -gt 0; do
+ # Normalize the prefix.
+ case "$1" in
+ -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) optarg= ;;
+ esac
+
+ case "$1" in
+ # It is possible for the user to override our prefix.
+ --prefix=*)
+ prefix=$optarg
+ ;;
+ --prefix)
+ echo $prefix
+ exit 0
+ ;;
+ --bindir)
+ echo $bindir
+ exit 0
+ ;;
+ --avoid-ldap)
+ LDAP_LIBS=""
+ ;;
+ --avoid-dbm)
+ DBM_LIBS=""
+ ;;
+ --libs)
+ flags="$flags $LDAP_LIBS $DBM_LIBS $LIBS"
+ ;;
+ --ldap-libs)
+ flags="$flags $LDAP_LIBS"
+ ;;
+ --dbm-libs)
+ flags="$flags $DBM_LIBS"
+ ;;
+ --includedir)
+ if test "$location" = "installed"; then
+ flags="$includedir"
+ elif test "$location" = "source"; then
+ flags="$APU_SOURCE_DIR/include"
+ else
+ # this is for VPATH builds
+ flags="$APU_BUILD_DIR/include $APU_SOURCE_DIR/include"
+ fi
+ echo $flags
+ exit 0
+ ;;
+ --includes)
+ if test "$location" = "installed"; then
+ flags="$flags -I$includedir $INCLUDES"
+ elif test "$location" = "source"; then
+ flags="$flags -I$APU_SOURCE_DIR/include $INCLUDES"
+ else
+ # this is for VPATH builds
+ flags="$flags -I$APU_BUILD_DIR/include -I$APU_SOURCE_DIR/include $INCLUDES"
+ fi
+ ;;
+ --ldflags)
+ flags="$flags $LDFLAGS"
+ ;;
+ --srcdir)
+ echo $APU_SOURCE_DIR
+ exit 0
+ ;;
+ --version)
+ echo $APRUTIL_DOTTED_VERSION
+ exit 0
+ ;;
+ --link-ld)
+ if test "$location" = "installed"; then
+ ### avoid using -L if libdir is a "standard" location like /usr/lib
+ flags="$flags -L$libdir -l$APRUTIL_LIBNAME"
+ else
+ flags="$flags -L$APU_BUILD_DIR -l$APRUTIL_LIBNAME"
+ fi
+ ;;
+ --link-libtool)
+ # If the LA_FILE exists where we think it should be, use it. If we're
+ # installed and the LA_FILE does not exist, assume to use -L/-l
+ # (the LA_FILE may not have been installed). If we're building ourselves,
+ # we'll assume that at some point the .la file be created.
+ if test -f "$LA_FILE"; then
+ flags="$flags $LA_FILE"
+ elif test "$location" = "installed"; then
+ ### avoid using -L if libdir is a "standard" location like /usr/lib
+ # Since the user is specifying they are linking with libtool, we
+ # *know* that -R will be recognized by libtool.
+ flags="$flags -L$libdir -R$libdir -l$APRUTIL_LIBNAME"
+ else
+ flags="$flags $LA_FILE"
+ fi
+ ;;
+ --apu-la-file)
+ if test -f "$LA_FILE"; then
+ flags="$flags $LA_FILE"
+ fi
+ ;;
+ --old-expat)
+ if test ! -n "$APR_XML_EXPAT_OLD"; then
+ echo "no"
+ else
+ echo "$APR_XML_EXPAT_OLD"
+ fi
+ exit 0
+ ;;
+ --db-version)
+ echo $APU_DB_VERSION
+ exit 0
+ ;;
+ --help)
+ show_usage
+ exit 0
+ ;;
+ *)
+ show_usage
+ exit 1
+ ;;
+ esac
+
+ # Next please.
+ shift
+done
+
+if test -n "$flags"; then
+ echo "$flags"
+fi
+
+exit 0
diff --git a/contrib/apr-util/buckets/apr_brigade.c b/contrib/apr-util/buckets/apr_brigade.c
new file mode 100644
index 000000000000..1f2ba1729963
--- /dev/null
+++ b/contrib/apr-util/buckets/apr_brigade.c
@@ -0,0 +1,736 @@
+/* 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.h"
+#include "apr_lib.h"
+#include "apr_strings.h"
+#include "apr_pools.h"
+#include "apr_tables.h"
+#include "apr_buckets.h"
+#include "apr_errno.h"
+#define APR_WANT_MEMFUNC
+#define APR_WANT_STRFUNC
+#include "apr_want.h"
+
+#if APR_HAVE_SYS_UIO_H
+#include <sys/uio.h>
+#endif
+
+static apr_status_t brigade_cleanup(void *data)
+{
+ return apr_brigade_cleanup(data);
+}
+
+APU_DECLARE(apr_status_t) apr_brigade_cleanup(void *data)
+{
+ apr_bucket_brigade *b = data;
+ apr_bucket *e;
+
+ while (!APR_BRIGADE_EMPTY(b)) {
+ e = APR_BRIGADE_FIRST(b);
+ apr_bucket_delete(e);
+ }
+ /* We don't need to free(bb) because it's allocated from a pool. */
+ return APR_SUCCESS;
+}
+
+APU_DECLARE(apr_status_t) apr_brigade_destroy(apr_bucket_brigade *b)
+{
+ apr_pool_cleanup_kill(b->p, b, brigade_cleanup);
+ return apr_brigade_cleanup(b);
+}
+
+APU_DECLARE(apr_bucket_brigade *) apr_brigade_create(apr_pool_t *p,
+ apr_bucket_alloc_t *list)
+{
+ apr_bucket_brigade *b;
+
+ b = apr_palloc(p, sizeof(*b));
+ b->p = p;
+ b->bucket_alloc = list;
+
+ APR_RING_INIT(&b->list, apr_bucket, link);
+
+ apr_pool_cleanup_register(b->p, b, brigade_cleanup, apr_pool_cleanup_null);
+ return b;
+}
+
+APU_DECLARE(apr_bucket_brigade *) apr_brigade_split_ex(apr_bucket_brigade *b,
+ apr_bucket *e,
+ apr_bucket_brigade *a)
+{
+ apr_bucket *f;
+
+ if (!a) {
+ a = apr_brigade_create(b->p, b->bucket_alloc);
+ }
+ else if (!APR_BRIGADE_EMPTY(a)) {
+ apr_brigade_cleanup(a);
+ }
+ /* Return an empty brigade if there is nothing left in
+ * the first brigade to split off
+ */
+ if (e != APR_BRIGADE_SENTINEL(b)) {
+ f = APR_RING_LAST(&b->list);
+ APR_RING_UNSPLICE(e, f, link);
+ APR_RING_SPLICE_HEAD(&a->list, e, f, apr_bucket, link);
+ }
+
+ APR_BRIGADE_CHECK_CONSISTENCY(a);
+ APR_BRIGADE_CHECK_CONSISTENCY(b);
+
+ return a;
+}
+
+APU_DECLARE(apr_bucket_brigade *) apr_brigade_split(apr_bucket_brigade *b,
+ apr_bucket *e)
+{
+ return apr_brigade_split_ex(b, e, NULL);
+}
+
+APU_DECLARE(apr_status_t) apr_brigade_partition(apr_bucket_brigade *b,
+ apr_off_t point,
+ apr_bucket **after_point)
+{
+ apr_bucket *e;
+ const char *s;
+ apr_size_t len;
+ apr_uint64_t point64;
+ apr_status_t rv;
+
+ if (point < 0) {
+ /* this could cause weird (not necessarily SEGV) things to happen */
+ return APR_EINVAL;
+ }
+ if (point == 0) {
+ *after_point = APR_BRIGADE_FIRST(b);
+ return APR_SUCCESS;
+ }
+
+ /*
+ * Try to reduce the following casting mess: We know that point will be
+ * larger equal 0 now and forever and thus that point (apr_off_t) and
+ * apr_size_t will fit into apr_uint64_t in any case.
+ */
+ point64 = (apr_uint64_t)point;
+
+ APR_BRIGADE_CHECK_CONSISTENCY(b);
+
+ for (e = APR_BRIGADE_FIRST(b);
+ e != APR_BRIGADE_SENTINEL(b);
+ e = APR_BUCKET_NEXT(e))
+ {
+ /* For an unknown length bucket, while 'point64' is beyond the possible
+ * size contained in apr_size_t, read and continue...
+ */
+ if ((e->length == (apr_size_t)(-1))
+ && (point64 > (apr_uint64_t)APR_SIZE_MAX)) {
+ /* point64 is too far out to simply split this bucket,
+ * we must fix this bucket's size and keep going... */
+ rv = apr_bucket_read(e, &s, &len, APR_BLOCK_READ);
+ if (rv != APR_SUCCESS) {
+ *after_point = e;
+ return rv;
+ }
+ }
+ else if ((point64 < (apr_uint64_t)e->length)
+ || (e->length == (apr_size_t)(-1))) {
+ /* We already consumed buckets where point64 is beyond
+ * our interest ( point64 > APR_SIZE_MAX ), above.
+ * Here point falls between 0 and APR_SIZE_MAX
+ * and is within this bucket, or this bucket's len
+ * is undefined, so now we are ready to split it.
+ * First try to split the bucket natively... */
+ if ((rv = apr_bucket_split(e, (apr_size_t)point64))
+ != APR_ENOTIMPL) {
+ *after_point = APR_BUCKET_NEXT(e);
+ return rv;
+ }
+
+ /* if the bucket cannot be split, we must read from it,
+ * changing its type to one that can be split */
+ rv = apr_bucket_read(e, &s, &len, APR_BLOCK_READ);
+ if (rv != APR_SUCCESS) {
+ *after_point = e;
+ return rv;
+ }
+
+ /* this assumes that len == e->length, which is okay because e
+ * might have been morphed by the apr_bucket_read() above, but
+ * if it was, the length would have been adjusted appropriately */
+ if (point64 < (apr_uint64_t)e->length) {
+ rv = apr_bucket_split(e, (apr_size_t)point64);
+ *after_point = APR_BUCKET_NEXT(e);
+ return rv;
+ }
+ }
+ if (point64 == (apr_uint64_t)e->length) {
+ *after_point = APR_BUCKET_NEXT(e);
+ return APR_SUCCESS;
+ }
+ point64 -= (apr_uint64_t)e->length;
+ }
+ *after_point = APR_BRIGADE_SENTINEL(b);
+ return APR_INCOMPLETE;
+}
+
+APU_DECLARE(apr_status_t) apr_brigade_length(apr_bucket_brigade *bb,
+ int read_all, apr_off_t *length)
+{
+ apr_off_t total = 0;
+ apr_bucket *bkt;
+ apr_status_t status = APR_SUCCESS;
+
+ for (bkt = APR_BRIGADE_FIRST(bb);
+ bkt != APR_BRIGADE_SENTINEL(bb);
+ bkt = APR_BUCKET_NEXT(bkt))
+ {
+ if (bkt->length == (apr_size_t)(-1)) {
+ const char *ignore;
+ apr_size_t len;
+
+ if (!read_all) {
+ total = -1;
+ break;
+ }
+
+ if ((status = apr_bucket_read(bkt, &ignore, &len,
+ APR_BLOCK_READ)) != APR_SUCCESS) {
+ break;
+ }
+ }
+
+ total += bkt->length;
+ }
+
+ *length = total;
+ return status;
+}
+
+APU_DECLARE(apr_status_t) apr_brigade_flatten(apr_bucket_brigade *bb,
+ char *c, apr_size_t *len)
+{
+ apr_size_t actual = 0;
+ apr_bucket *b;
+
+ for (b = APR_BRIGADE_FIRST(bb);
+ b != APR_BRIGADE_SENTINEL(bb);
+ b = APR_BUCKET_NEXT(b))
+ {
+ const char *str;
+ apr_size_t str_len;
+ apr_status_t status;
+
+ status = apr_bucket_read(b, &str, &str_len, APR_BLOCK_READ);
+ if (status != APR_SUCCESS) {
+ return status;
+ }
+
+ /* If we would overflow. */
+ if (str_len + actual > *len) {
+ str_len = *len - actual;
+ }
+
+ /* XXX: It appears that overflow of the final bucket
+ * is DISCARDED without any warning to the caller.
+ *
+ * No, we only copy the data up to their requested size. -- jre
+ */
+ memcpy(c, str, str_len);
+
+ c += str_len;
+ actual += str_len;
+
+ /* This could probably be actual == *len, but be safe from stray
+ * photons. */
+ if (actual >= *len) {
+ break;
+ }
+ }
+
+ *len = actual;
+ return APR_SUCCESS;
+}
+
+APU_DECLARE(apr_status_t) apr_brigade_pflatten(apr_bucket_brigade *bb,
+ char **c,
+ apr_size_t *len,
+ apr_pool_t *pool)
+{
+ apr_off_t actual;
+ apr_size_t total;
+ apr_status_t rv;
+
+ apr_brigade_length(bb, 1, &actual);
+
+ /* XXX: This is dangerous beyond belief. At least in the
+ * apr_brigade_flatten case, the user explicitly stated their
+ * buffer length - so we don't up and palloc 4GB for a single
+ * file bucket. This API must grow a useful max boundry,
+ * either compiled-in or preset via the *len value.
+ *
+ * Shouldn't both fn's grow an additional return value for
+ * the case that the brigade couldn't be flattened into the
+ * provided or allocated buffer (such as APR_EMOREDATA?)
+ * Not a failure, simply an advisory result.
+ */
+ total = (apr_size_t)actual;
+
+ *c = apr_palloc(pool, total);
+
+ rv = apr_brigade_flatten(bb, *c, &total);
+
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+
+ *len = total;
+ return APR_SUCCESS;
+}
+
+APU_DECLARE(apr_status_t) apr_brigade_split_line(apr_bucket_brigade *bbOut,
+ apr_bucket_brigade *bbIn,
+ apr_read_type_e block,
+ apr_off_t maxbytes)
+{
+ apr_off_t readbytes = 0;
+
+ while (!APR_BRIGADE_EMPTY(bbIn)) {
+ const char *pos;
+ const char *str;
+ apr_size_t len;
+ apr_status_t rv;
+ apr_bucket *e;
+
+ e = APR_BRIGADE_FIRST(bbIn);
+ rv = apr_bucket_read(e, &str, &len, block);
+
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+
+ pos = memchr(str, APR_ASCII_LF, len);
+ /* We found a match. */
+ if (pos != NULL) {
+ apr_bucket_split(e, pos - str + 1);
+ APR_BUCKET_REMOVE(e);
+ APR_BRIGADE_INSERT_TAIL(bbOut, e);
+ return APR_SUCCESS;
+ }
+ APR_BUCKET_REMOVE(e);
+ if (APR_BUCKET_IS_METADATA(e) || len > APR_BUCKET_BUFF_SIZE/4) {
+ APR_BRIGADE_INSERT_TAIL(bbOut, e);
+ }
+ else {
+ if (len > 0) {
+ rv = apr_brigade_write(bbOut, NULL, NULL, str, len);
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+ }
+ apr_bucket_destroy(e);
+ }
+ readbytes += len;
+ /* We didn't find an APR_ASCII_LF within the maximum line length. */
+ if (readbytes >= maxbytes) {
+ break;
+ }
+ }
+
+ return APR_SUCCESS;
+}
+
+
+APU_DECLARE(apr_status_t) apr_brigade_to_iovec(apr_bucket_brigade *b,
+ struct iovec *vec, int *nvec)
+{
+ int left = *nvec;
+ apr_bucket *e;
+ struct iovec *orig;
+ apr_size_t iov_len;
+ const char *iov_base;
+ apr_status_t rv;
+
+ orig = vec;
+
+ for (e = APR_BRIGADE_FIRST(b);
+ e != APR_BRIGADE_SENTINEL(b);
+ e = APR_BUCKET_NEXT(e))
+ {
+ if (left-- == 0)
+ break;
+
+ rv = apr_bucket_read(e, &iov_base, &iov_len, APR_NONBLOCK_READ);
+ if (rv != APR_SUCCESS)
+ return rv;
+ /* Set indirectly since types differ: */
+ vec->iov_len = iov_len;
+ vec->iov_base = (void *)iov_base;
+ ++vec;
+ }
+
+ *nvec = (int)(vec - orig);
+ return APR_SUCCESS;
+}
+
+APU_DECLARE(apr_status_t) apr_brigade_vputstrs(apr_bucket_brigade *b,
+ apr_brigade_flush flush,
+ void *ctx,
+ va_list va)
+{
+#define MAX_VECS 8
+ struct iovec vec[MAX_VECS];
+ apr_size_t i = 0;
+
+ for (;;) {
+ char *str = va_arg(va, char *);
+ apr_status_t rv;
+
+ if (str == NULL)
+ break;
+
+ vec[i].iov_base = str;
+ vec[i].iov_len = strlen(str);
+ i++;
+
+ if (i == MAX_VECS) {
+ rv = apr_brigade_writev(b, flush, ctx, vec, i);
+ if (rv != APR_SUCCESS)
+ return rv;
+ i = 0;
+ }
+ }
+ if (i != 0)
+ return apr_brigade_writev(b, flush, ctx, vec, i);
+
+ return APR_SUCCESS;
+}
+
+APU_DECLARE(apr_status_t) apr_brigade_putc(apr_bucket_brigade *b,
+ apr_brigade_flush flush, void *ctx,
+ const char c)
+{
+ return apr_brigade_write(b, flush, ctx, &c, 1);
+}
+
+APU_DECLARE(apr_status_t) apr_brigade_write(apr_bucket_brigade *b,
+ apr_brigade_flush flush,
+ void *ctx,
+ const char *str, apr_size_t nbyte)
+{
+ apr_bucket *e = APR_BRIGADE_LAST(b);
+ apr_size_t remaining = APR_BUCKET_BUFF_SIZE;
+ char *buf = NULL;
+
+ /*
+ * If the last bucket is a heap bucket and its buffer is not shared with
+ * another bucket, we may write into that bucket.
+ */
+ if (!APR_BRIGADE_EMPTY(b) && APR_BUCKET_IS_HEAP(e)
+ && ((apr_bucket_heap *)(e->data))->refcount.refcount == 1) {
+ apr_bucket_heap *h = e->data;
+
+ /* HEAP bucket start offsets are always in-memory, safe to cast */
+ remaining = h->alloc_len - (e->length + (apr_size_t)e->start);
+ buf = h->base + e->start + e->length;
+ }
+
+ if (nbyte > remaining) {
+ /* either a buffer bucket exists but is full,
+ * or no buffer bucket exists and the data is too big
+ * to buffer. In either case, we should flush. */
+ if (flush) {
+ e = apr_bucket_transient_create(str, nbyte, b->bucket_alloc);
+ APR_BRIGADE_INSERT_TAIL(b, e);
+ return flush(b, ctx);
+ }
+ else {
+ e = apr_bucket_heap_create(str, nbyte, NULL, b->bucket_alloc);
+ APR_BRIGADE_INSERT_TAIL(b, e);
+ return APR_SUCCESS;
+ }
+ }
+ else if (!buf) {
+ /* we don't have a buffer, but the data is small enough
+ * that we don't mind making a new buffer */
+ buf = apr_bucket_alloc(APR_BUCKET_BUFF_SIZE, b->bucket_alloc);
+ e = apr_bucket_heap_create(buf, APR_BUCKET_BUFF_SIZE,
+ apr_bucket_free, b->bucket_alloc);
+ APR_BRIGADE_INSERT_TAIL(b, e);
+ e->length = 0; /* We are writing into the brigade, and
+ * allocating more memory than we need. This
+ * ensures that the bucket thinks it is empty just
+ * after we create it. We'll fix the length
+ * once we put data in it below.
+ */
+ }
+
+ /* there is a sufficiently big buffer bucket available now */
+ memcpy(buf, str, nbyte);
+ e->length += nbyte;
+
+ return APR_SUCCESS;
+}
+
+APU_DECLARE(apr_status_t) apr_brigade_writev(apr_bucket_brigade *b,
+ apr_brigade_flush flush,
+ void *ctx,
+ const struct iovec *vec,
+ apr_size_t nvec)
+{
+ apr_bucket *e;
+ apr_size_t total_len;
+ apr_size_t i;
+ char *buf;
+
+ /* Compute the total length of the data to be written.
+ */
+ total_len = 0;
+ for (i = 0; i < nvec; i++) {
+ total_len += vec[i].iov_len;
+ }
+
+ /* If the data to be written is very large, try to convert
+ * the iovec to transient buckets rather than copying.
+ */
+ if (total_len > APR_BUCKET_BUFF_SIZE) {
+ if (flush) {
+ for (i = 0; i < nvec; i++) {
+ e = apr_bucket_transient_create(vec[i].iov_base,
+ vec[i].iov_len,
+ b->bucket_alloc);
+ APR_BRIGADE_INSERT_TAIL(b, e);
+ }
+ return flush(b, ctx);
+ }
+ else {
+ for (i = 0; i < nvec; i++) {
+ e = apr_bucket_heap_create((const char *) vec[i].iov_base,
+ vec[i].iov_len, NULL,
+ b->bucket_alloc);
+ APR_BRIGADE_INSERT_TAIL(b, e);
+ }
+ return APR_SUCCESS;
+ }
+ }
+
+ i = 0;
+
+ /* If there is a heap bucket at the end of the brigade
+ * already, and its refcount is 1, copy into the existing bucket.
+ */
+ e = APR_BRIGADE_LAST(b);
+ if (!APR_BRIGADE_EMPTY(b) && APR_BUCKET_IS_HEAP(e)
+ && ((apr_bucket_heap *)(e->data))->refcount.refcount == 1) {
+ apr_bucket_heap *h = e->data;
+ apr_size_t remaining = h->alloc_len -
+ (e->length + (apr_size_t)e->start);
+ buf = h->base + e->start + e->length;
+
+ if (remaining >= total_len) {
+ /* Simple case: all the data will fit in the
+ * existing heap bucket
+ */
+ for (; i < nvec; i++) {
+ apr_size_t len = vec[i].iov_len;
+ memcpy(buf, (const void *) vec[i].iov_base, len);
+ buf += len;
+ }
+ e->length += total_len;
+ return APR_SUCCESS;
+ }
+ else {
+ /* More complicated case: not all of the data
+ * will fit in the existing heap bucket. The
+ * total data size is <= APR_BUCKET_BUFF_SIZE,
+ * so we'll need only one additional bucket.
+ */
+ const char *start_buf = buf;
+ for (; i < nvec; i++) {
+ apr_size_t len = vec[i].iov_len;
+ if (len > remaining) {
+ break;
+ }
+ memcpy(buf, (const void *) vec[i].iov_base, len);
+ buf += len;
+ remaining -= len;
+ }
+ e->length += (buf - start_buf);
+ total_len -= (buf - start_buf);
+
+ if (flush) {
+ apr_status_t rv = flush(b, ctx);
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+ }
+
+ /* Now fall through into the case below to
+ * allocate another heap bucket and copy the
+ * rest of the array. (Note that i is not
+ * reset to zero here; it holds the index
+ * of the first vector element to be
+ * written to the new bucket.)
+ */
+ }
+ }
+
+ /* Allocate a new heap bucket, and copy the data into it.
+ * The checks above ensure that the amount of data to be
+ * written here is no larger than APR_BUCKET_BUFF_SIZE.
+ */
+ buf = apr_bucket_alloc(APR_BUCKET_BUFF_SIZE, b->bucket_alloc);
+ e = apr_bucket_heap_create(buf, APR_BUCKET_BUFF_SIZE,
+ apr_bucket_free, b->bucket_alloc);
+ for (; i < nvec; i++) {
+ apr_size_t len = vec[i].iov_len;
+ memcpy(buf, (const void *) vec[i].iov_base, len);
+ buf += len;
+ }
+ e->length = total_len;
+ APR_BRIGADE_INSERT_TAIL(b, e);
+
+ return APR_SUCCESS;
+}
+
+APU_DECLARE(apr_status_t) apr_brigade_puts(apr_bucket_brigade *bb,
+ apr_brigade_flush flush, void *ctx,
+ const char *str)
+{
+ return apr_brigade_write(bb, flush, ctx, str, strlen(str));
+}
+
+APU_DECLARE_NONSTD(apr_status_t) apr_brigade_putstrs(apr_bucket_brigade *b,
+ apr_brigade_flush flush,
+ void *ctx, ...)
+{
+ va_list va;
+ apr_status_t rv;
+
+ va_start(va, ctx);
+ rv = apr_brigade_vputstrs(b, flush, ctx, va);
+ va_end(va);
+ return rv;
+}
+
+APU_DECLARE_NONSTD(apr_status_t) apr_brigade_printf(apr_bucket_brigade *b,
+ apr_brigade_flush flush,
+ void *ctx,
+ const char *fmt, ...)
+{
+ va_list ap;
+ apr_status_t rv;
+
+ va_start(ap, fmt);
+ rv = apr_brigade_vprintf(b, flush, ctx, fmt, ap);
+ va_end(ap);
+ return rv;
+}
+
+struct brigade_vprintf_data_t {
+ apr_vformatter_buff_t vbuff;
+
+ apr_bucket_brigade *b; /* associated brigade */
+ apr_brigade_flush *flusher; /* flushing function */
+ void *ctx;
+
+ char *cbuff; /* buffer to flush from */
+};
+
+static apr_status_t brigade_flush(apr_vformatter_buff_t *buff)
+{
+ /* callback function passed to ap_vformatter to be
+ * called when vformatter needs to buff and
+ * buff.curpos > buff.endpos
+ */
+
+ /* "downcast," have really passed a brigade_vprintf_data_t* */
+ struct brigade_vprintf_data_t *vd = (struct brigade_vprintf_data_t*)buff;
+ apr_status_t res = APR_SUCCESS;
+
+ res = apr_brigade_write(vd->b, *vd->flusher, vd->ctx, vd->cbuff,
+ APR_BUCKET_BUFF_SIZE);
+
+ if(res != APR_SUCCESS) {
+ return -1;
+ }
+
+ vd->vbuff.curpos = vd->cbuff;
+ vd->vbuff.endpos = vd->cbuff + APR_BUCKET_BUFF_SIZE;
+
+ return res;
+}
+
+APU_DECLARE(apr_status_t) apr_brigade_vprintf(apr_bucket_brigade *b,
+ apr_brigade_flush flush,
+ void *ctx,
+ const char *fmt, va_list va)
+{
+ /* the cast, in order of appearance */
+ struct brigade_vprintf_data_t vd;
+ char buf[APR_BUCKET_BUFF_SIZE];
+ int written;
+
+ vd.vbuff.curpos = buf;
+ vd.vbuff.endpos = buf + APR_BUCKET_BUFF_SIZE;
+ vd.b = b;
+ vd.flusher = &flush;
+ vd.ctx = ctx;
+ vd.cbuff = buf;
+
+ written = apr_vformatter(brigade_flush, &vd.vbuff, fmt, va);
+
+ if (written == -1) {
+ return -1;
+ }
+
+ /* write out what remains in the buffer */
+ return apr_brigade_write(b, flush, ctx, buf, vd.vbuff.curpos - buf);
+}
+
+/* A "safe" maximum bucket size, 1Gb */
+#define MAX_BUCKET_SIZE (0x40000000)
+
+APU_DECLARE(apr_bucket *) apr_brigade_insert_file(apr_bucket_brigade *bb,
+ apr_file_t *f,
+ apr_off_t start,
+ apr_off_t length,
+ apr_pool_t *p)
+{
+ apr_bucket *e;
+
+ if (sizeof(apr_off_t) == sizeof(apr_size_t) || length < MAX_BUCKET_SIZE) {
+ e = apr_bucket_file_create(f, start, (apr_size_t)length, p,
+ bb->bucket_alloc);
+ }
+ else {
+ /* Several buckets are needed. */
+ e = apr_bucket_file_create(f, start, MAX_BUCKET_SIZE, p,
+ bb->bucket_alloc);
+
+ while (length > MAX_BUCKET_SIZE) {
+ apr_bucket *ce;
+ apr_bucket_copy(e, &ce);
+ APR_BRIGADE_INSERT_TAIL(bb, ce);
+ e->start += MAX_BUCKET_SIZE;
+ length -= MAX_BUCKET_SIZE;
+ }
+ e->length = (apr_size_t)length; /* Resize just the last bucket */
+ }
+
+ APR_BRIGADE_INSERT_TAIL(bb, e);
+ return e;
+}
diff --git a/contrib/apr-util/buckets/apr_buckets.c b/contrib/apr-util/buckets/apr_buckets.c
new file mode 100644
index 000000000000..802f4e259694
--- /dev/null
+++ b/contrib/apr-util/buckets/apr_buckets.c
@@ -0,0 +1,46 @@
+/* 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_buckets.h"
+
+APU_DECLARE_NONSTD(apr_status_t) apr_bucket_setaside_noop(apr_bucket *data,
+ apr_pool_t *pool)
+{
+ return APR_SUCCESS;
+}
+
+APU_DECLARE_NONSTD(apr_status_t) apr_bucket_setaside_notimpl(apr_bucket *data,
+ apr_pool_t *pool)
+{
+ return APR_ENOTIMPL;
+}
+
+APU_DECLARE_NONSTD(apr_status_t) apr_bucket_split_notimpl(apr_bucket *data,
+ apr_size_t point)
+{
+ return APR_ENOTIMPL;
+}
+
+APU_DECLARE_NONSTD(apr_status_t) apr_bucket_copy_notimpl(apr_bucket *e,
+ apr_bucket **c)
+{
+ return APR_ENOTIMPL;
+}
+
+APU_DECLARE_NONSTD(void) apr_bucket_destroy_noop(void *data)
+{
+ return;
+}
diff --git a/contrib/apr-util/buckets/apr_buckets_alloc.c b/contrib/apr-util/buckets/apr_buckets_alloc.c
new file mode 100644
index 000000000000..15baa3396655
--- /dev/null
+++ b/contrib/apr-util/buckets/apr_buckets_alloc.c
@@ -0,0 +1,202 @@
+/* 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 <stdlib.h>
+
+#include "apr_buckets.h"
+#include "apr_allocator.h"
+
+#define ALLOC_AMT (8192 - APR_MEMNODE_T_SIZE)
+
+typedef struct node_header_t {
+ apr_size_t size;
+ apr_bucket_alloc_t *alloc;
+ apr_memnode_t *memnode;
+ struct node_header_t *next;
+} node_header_t;
+
+#define SIZEOF_NODE_HEADER_T APR_ALIGN_DEFAULT(sizeof(node_header_t))
+#define SMALL_NODE_SIZE (APR_BUCKET_ALLOC_SIZE + SIZEOF_NODE_HEADER_T)
+
+/** A list of free memory from which new buckets or private bucket
+ * structures can be allocated.
+ */
+struct apr_bucket_alloc_t {
+ apr_pool_t *pool;
+ apr_allocator_t *allocator;
+ node_header_t *freelist;
+ apr_memnode_t *blocks;
+};
+
+static apr_status_t alloc_cleanup(void *data)
+{
+ apr_bucket_alloc_t *list = data;
+
+ apr_allocator_free(list->allocator, list->blocks);
+
+#if APR_POOL_DEBUG
+ if (list->pool && list->allocator != apr_pool_allocator_get(list->pool)) {
+ apr_allocator_destroy(list->allocator);
+ }
+#endif
+
+ return APR_SUCCESS;
+}
+
+APU_DECLARE_NONSTD(apr_bucket_alloc_t *) apr_bucket_alloc_create(apr_pool_t *p)
+{
+ apr_allocator_t *allocator = apr_pool_allocator_get(p);
+ apr_bucket_alloc_t *list;
+
+#if APR_POOL_DEBUG
+ /* may be NULL for debug mode. */
+ if (allocator == NULL) {
+ if (apr_allocator_create(&allocator) != APR_SUCCESS) {
+ apr_abortfunc_t fn = apr_pool_abort_get(p);
+ if (fn)
+ (fn)(APR_ENOMEM);
+ abort();
+ }
+ }
+#endif
+ list = apr_bucket_alloc_create_ex(allocator);
+ if (list == NULL) {
+ apr_abortfunc_t fn = apr_pool_abort_get(p);
+ if (fn)
+ (fn)(APR_ENOMEM);
+ abort();
+ }
+ list->pool = p;
+ apr_pool_cleanup_register(list->pool, list, alloc_cleanup,
+ apr_pool_cleanup_null);
+
+ return list;
+}
+
+APU_DECLARE_NONSTD(apr_bucket_alloc_t *) apr_bucket_alloc_create_ex(
+ apr_allocator_t *allocator)
+{
+ apr_bucket_alloc_t *list;
+ apr_memnode_t *block;
+
+ block = apr_allocator_alloc(allocator, ALLOC_AMT);
+ if (!block) {
+ return NULL;
+ }
+ list = (apr_bucket_alloc_t *)block->first_avail;
+ list->pool = NULL;
+ list->allocator = allocator;
+ list->freelist = NULL;
+ list->blocks = block;
+ block->first_avail += APR_ALIGN_DEFAULT(sizeof(*list));
+
+ return list;
+}
+
+APU_DECLARE_NONSTD(void) apr_bucket_alloc_destroy(apr_bucket_alloc_t *list)
+{
+ if (list->pool) {
+ apr_pool_cleanup_kill(list->pool, list, alloc_cleanup);
+ }
+
+ apr_allocator_free(list->allocator, list->blocks);
+
+#if APR_POOL_DEBUG
+ if (list->pool && list->allocator != apr_pool_allocator_get(list->pool)) {
+ apr_allocator_destroy(list->allocator);
+ }
+#endif
+}
+
+APU_DECLARE_NONSTD(void *) apr_bucket_alloc(apr_size_t size,
+ apr_bucket_alloc_t *list)
+{
+ node_header_t *node;
+ apr_memnode_t *active = list->blocks;
+ char *endp;
+
+ size += SIZEOF_NODE_HEADER_T;
+ if (size <= SMALL_NODE_SIZE) {
+ if (list->freelist) {
+ node = list->freelist;
+ list->freelist = node->next;
+ }
+ else {
+ endp = active->first_avail + SMALL_NODE_SIZE;
+ if (endp >= active->endp) {
+ list->blocks = apr_allocator_alloc(list->allocator, ALLOC_AMT);
+ if (!list->blocks) {
+ list->blocks = active;
+ return NULL;
+ }
+ list->blocks->next = active;
+ active = list->blocks;
+ endp = active->first_avail + SMALL_NODE_SIZE;
+ }
+ node = (node_header_t *)active->first_avail;
+ node->alloc = list;
+ node->memnode = active;
+ node->size = SMALL_NODE_SIZE;
+ active->first_avail = endp;
+ }
+ }
+ else {
+ apr_memnode_t *memnode = apr_allocator_alloc(list->allocator, size);
+ if (!memnode) {
+ return NULL;
+ }
+ node = (node_header_t *)memnode->first_avail;
+ node->alloc = list;
+ node->memnode = memnode;
+ node->size = size;
+ }
+ return ((char *)node) + SIZEOF_NODE_HEADER_T;
+}
+
+#ifdef APR_BUCKET_DEBUG
+#if APR_HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+static void check_not_already_free(node_header_t *node)
+{
+ apr_bucket_alloc_t *list = node->alloc;
+ node_header_t *curr = list->freelist;
+
+ while (curr) {
+ if (node == curr) {
+ abort();
+ }
+ curr = curr->next;
+ }
+}
+#else
+#define check_not_already_free(node)
+#endif
+
+APU_DECLARE_NONSTD(void) apr_bucket_free(void *mem)
+{
+ node_header_t *node = (node_header_t *)((char *)mem - SIZEOF_NODE_HEADER_T);
+ apr_bucket_alloc_t *list = node->alloc;
+
+ if (node->size == SMALL_NODE_SIZE) {
+ check_not_already_free(node);
+ node->next = list->freelist;
+ list->freelist = node;
+ }
+ else {
+ apr_allocator_free(list->allocator, node->memnode);
+ }
+}
diff --git a/contrib/apr-util/buckets/apr_buckets_eos.c b/contrib/apr-util/buckets/apr_buckets_eos.c
new file mode 100644
index 000000000000..25cff756252c
--- /dev/null
+++ b/contrib/apr-util/buckets/apr_buckets_eos.c
@@ -0,0 +1,54 @@
+/* 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_buckets.h"
+
+static apr_status_t eos_bucket_read(apr_bucket *b, const char **str,
+ apr_size_t *len, apr_read_type_e block)
+{
+ *str = NULL;
+ *len = 0;
+ return APR_SUCCESS;
+}
+
+APU_DECLARE(apr_bucket *) apr_bucket_eos_make(apr_bucket *b)
+{
+ b->length = 0;
+ b->start = 0;
+ b->data = NULL;
+ b->type = &apr_bucket_type_eos;
+
+ return b;
+}
+
+APU_DECLARE(apr_bucket *) apr_bucket_eos_create(apr_bucket_alloc_t *list)
+{
+ apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
+
+ APR_BUCKET_INIT(b);
+ b->free = apr_bucket_free;
+ b->list = list;
+ return apr_bucket_eos_make(b);
+}
+
+APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_eos = {
+ "EOS", 5, APR_BUCKET_METADATA,
+ apr_bucket_destroy_noop,
+ eos_bucket_read,
+ apr_bucket_setaside_noop,
+ apr_bucket_split_notimpl,
+ apr_bucket_simple_copy
+};
diff --git a/contrib/apr-util/buckets/apr_buckets_file.c b/contrib/apr-util/buckets/apr_buckets_file.c
new file mode 100644
index 000000000000..0644cd82ce7a
--- /dev/null
+++ b/contrib/apr-util/buckets/apr_buckets_file.c
@@ -0,0 +1,228 @@
+/* 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.h"
+#include "apr_general.h"
+#include "apr_file_io.h"
+#include "apr_buckets.h"
+
+#if APR_HAS_MMAP
+#include "apr_mmap.h"
+
+/* mmap support for static files based on ideas from John Heidemann's
+ * patch against 1.0.5. See
+ * <http://www.isi.edu/~johnh/SOFTWARE/APACHE/index.html>.
+ */
+
+#endif /* APR_HAS_MMAP */
+
+static void file_bucket_destroy(void *data)
+{
+ apr_bucket_file *f = data;
+
+ if (apr_bucket_shared_destroy(f)) {
+ /* no need to close the file here; it will get
+ * done automatically when the pool gets cleaned up */
+ apr_bucket_free(f);
+ }
+}
+
+#if APR_HAS_MMAP
+static int file_make_mmap(apr_bucket *e, apr_size_t filelength,
+ apr_off_t fileoffset, apr_pool_t *p)
+{
+ apr_bucket_file *a = e->data;
+ apr_mmap_t *mm;
+
+ if (!a->can_mmap) {
+ return 0;
+ }
+
+ if (filelength > APR_MMAP_LIMIT) {
+ if (apr_mmap_create(&mm, a->fd, fileoffset, APR_MMAP_LIMIT,
+ APR_MMAP_READ, p) != APR_SUCCESS)
+ {
+ return 0;
+ }
+ apr_bucket_split(e, APR_MMAP_LIMIT);
+ filelength = APR_MMAP_LIMIT;
+ }
+ else if ((filelength < APR_MMAP_THRESHOLD) ||
+ (apr_mmap_create(&mm, a->fd, fileoffset, filelength,
+ APR_MMAP_READ, p) != APR_SUCCESS))
+ {
+ return 0;
+ }
+ apr_bucket_mmap_make(e, mm, 0, filelength);
+ file_bucket_destroy(a);
+ return 1;
+}
+#endif
+
+static apr_status_t file_bucket_read(apr_bucket *e, const char **str,
+ apr_size_t *len, apr_read_type_e block)
+{
+ apr_bucket_file *a = e->data;
+ apr_file_t *f = a->fd;
+ apr_bucket *b = NULL;
+ char *buf;
+ apr_status_t rv;
+ apr_size_t filelength = e->length; /* bytes remaining in file past offset */
+ apr_off_t fileoffset = e->start;
+#if APR_HAS_THREADS && !APR_HAS_XTHREAD_FILES
+ apr_int32_t flags;
+#endif
+
+#if APR_HAS_MMAP
+ if (file_make_mmap(e, filelength, fileoffset, a->readpool)) {
+ return apr_bucket_read(e, str, len, block);
+ }
+#endif
+
+#if APR_HAS_THREADS && !APR_HAS_XTHREAD_FILES
+ if ((flags = apr_file_flags_get(f)) & APR_FOPEN_XTHREAD) {
+ /* this file descriptor is shared across multiple threads and
+ * this OS doesn't support that natively, so as a workaround
+ * we must reopen the file into a->readpool */
+ const char *fname;
+ apr_file_name_get(&fname, f);
+
+ rv = apr_file_open(&f, fname, (flags & ~APR_FOPEN_XTHREAD), 0, a->readpool);
+ if (rv != APR_SUCCESS)
+ return rv;
+
+ a->fd = f;
+ }
+#endif
+
+ *len = (filelength > APR_BUCKET_BUFF_SIZE)
+ ? APR_BUCKET_BUFF_SIZE
+ : filelength;
+ *str = NULL; /* in case we die prematurely */
+ buf = apr_bucket_alloc(*len, e->list);
+
+ /* Handle offset ... */
+ rv = apr_file_seek(f, APR_SET, &fileoffset);
+ if (rv != APR_SUCCESS) {
+ apr_bucket_free(buf);
+ return rv;
+ }
+ rv = apr_file_read(f, buf, len);
+ if (rv != APR_SUCCESS && rv != APR_EOF) {
+ apr_bucket_free(buf);
+ return rv;
+ }
+ filelength -= *len;
+ /*
+ * Change the current bucket to refer to what we read,
+ * even if we read nothing because we hit EOF.
+ */
+ apr_bucket_heap_make(e, buf, *len, apr_bucket_free);
+
+ /* If we have more to read from the file, then create another bucket */
+ if (filelength > 0 && rv != APR_EOF) {
+ /* for efficiency, we can just build a new apr_bucket struct
+ * to wrap around the existing file bucket */
+ b = apr_bucket_alloc(sizeof(*b), e->list);
+ b->start = fileoffset + (*len);
+ b->length = filelength;
+ b->data = a;
+ b->type = &apr_bucket_type_file;
+ b->free = apr_bucket_free;
+ b->list = e->list;
+ APR_BUCKET_INSERT_AFTER(e, b);
+ }
+ else {
+ file_bucket_destroy(a);
+ }
+
+ *str = buf;
+ return rv;
+}
+
+APU_DECLARE(apr_bucket *) apr_bucket_file_make(apr_bucket *b, apr_file_t *fd,
+ apr_off_t offset,
+ apr_size_t len, apr_pool_t *p)
+{
+ apr_bucket_file *f;
+
+ f = apr_bucket_alloc(sizeof(*f), b->list);
+ f->fd = fd;
+ f->readpool = p;
+#if APR_HAS_MMAP
+ f->can_mmap = 1;
+#endif
+
+ b = apr_bucket_shared_make(b, f, offset, len);
+ b->type = &apr_bucket_type_file;
+
+ return b;
+}
+
+APU_DECLARE(apr_bucket *) apr_bucket_file_create(apr_file_t *fd,
+ apr_off_t offset,
+ apr_size_t len, apr_pool_t *p,
+ apr_bucket_alloc_t *list)
+{
+ apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
+
+ APR_BUCKET_INIT(b);
+ b->free = apr_bucket_free;
+ b->list = list;
+ return apr_bucket_file_make(b, fd, offset, len, p);
+}
+
+APU_DECLARE(apr_status_t) apr_bucket_file_enable_mmap(apr_bucket *e,
+ int enabled)
+{
+#if APR_HAS_MMAP
+ apr_bucket_file *a = e->data;
+ a->can_mmap = enabled;
+ return APR_SUCCESS;
+#else
+ return APR_ENOTIMPL;
+#endif /* APR_HAS_MMAP */
+}
+
+
+static apr_status_t file_bucket_setaside(apr_bucket *data, apr_pool_t *reqpool)
+{
+ apr_bucket_file *a = data->data;
+ apr_file_t *fd = NULL;
+ apr_file_t *f = a->fd;
+ apr_pool_t *curpool = apr_file_pool_get(f);
+
+ if (apr_pool_is_ancestor(curpool, reqpool)) {
+ return APR_SUCCESS;
+ }
+
+ if (!apr_pool_is_ancestor(a->readpool, reqpool)) {
+ a->readpool = reqpool;
+ }
+
+ apr_file_setaside(&fd, f, reqpool);
+ a->fd = fd;
+ return APR_SUCCESS;
+}
+
+APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_file = {
+ "FILE", 5, APR_BUCKET_DATA,
+ file_bucket_destroy,
+ file_bucket_read,
+ file_bucket_setaside,
+ apr_bucket_shared_split,
+ apr_bucket_shared_copy
+};
diff --git a/contrib/apr-util/buckets/apr_buckets_flush.c b/contrib/apr-util/buckets/apr_buckets_flush.c
new file mode 100644
index 000000000000..a5d84d7551aa
--- /dev/null
+++ b/contrib/apr-util/buckets/apr_buckets_flush.c
@@ -0,0 +1,54 @@
+/* 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_buckets.h"
+
+static apr_status_t flush_bucket_read(apr_bucket *b, const char **str,
+ apr_size_t *len, apr_read_type_e block)
+{
+ *str = NULL;
+ *len = 0;
+ return APR_SUCCESS;
+}
+
+APU_DECLARE(apr_bucket *) apr_bucket_flush_make(apr_bucket *b)
+{
+ b->length = 0;
+ b->start = 0;
+ b->data = NULL;
+ b->type = &apr_bucket_type_flush;
+
+ return b;
+}
+
+APU_DECLARE(apr_bucket *) apr_bucket_flush_create(apr_bucket_alloc_t *list)
+{
+ apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
+
+ APR_BUCKET_INIT(b);
+ b->free = apr_bucket_free;
+ b->list = list;
+ return apr_bucket_flush_make(b);
+}
+
+APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_flush = {
+ "FLUSH", 5, APR_BUCKET_METADATA,
+ apr_bucket_destroy_noop,
+ flush_bucket_read,
+ apr_bucket_setaside_noop,
+ apr_bucket_split_notimpl,
+ apr_bucket_simple_copy
+};
diff --git a/contrib/apr-util/buckets/apr_buckets_heap.c b/contrib/apr-util/buckets/apr_buckets_heap.c
new file mode 100644
index 000000000000..00f9808b922e
--- /dev/null
+++ b/contrib/apr-util/buckets/apr_buckets_heap.c
@@ -0,0 +1,96 @@
+/* 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_buckets.h"
+#define APR_WANT_MEMFUNC
+#include "apr_want.h"
+
+static apr_status_t heap_bucket_read(apr_bucket *b, const char **str,
+ apr_size_t *len, apr_read_type_e block)
+{
+ apr_bucket_heap *h = b->data;
+
+ *str = h->base + b->start;
+ *len = b->length;
+ return APR_SUCCESS;
+}
+
+static void heap_bucket_destroy(void *data)
+{
+ apr_bucket_heap *h = data;
+
+ if (apr_bucket_shared_destroy(h)) {
+ (*h->free_func)(h->base);
+ apr_bucket_free(h);
+ }
+}
+
+/* Warning: if you change this function, be sure to
+ * change apr_bucket_pool_make() too! */
+APU_DECLARE(apr_bucket *) apr_bucket_heap_make(apr_bucket *b, const char *buf,
+ apr_size_t length,
+ void (*free_func)(void *data))
+{
+ apr_bucket_heap *h;
+
+ h = apr_bucket_alloc(sizeof(*h), b->list);
+
+ if (!free_func) {
+ h->alloc_len = length;
+ h->base = apr_bucket_alloc(h->alloc_len, b->list);
+ if (h->base == NULL) {
+ apr_bucket_free(h);
+ return NULL;
+ }
+ h->free_func = apr_bucket_free;
+ memcpy(h->base, buf, length);
+ }
+ else {
+ /* XXX: we lose the const qualifier here which indicates
+ * there's something screwy with the API...
+ */
+ h->base = (char *) buf;
+ h->alloc_len = length;
+ h->free_func = free_func;
+ }
+
+ b = apr_bucket_shared_make(b, h, 0, length);
+ b->type = &apr_bucket_type_heap;
+
+ return b;
+}
+
+APU_DECLARE(apr_bucket *) apr_bucket_heap_create(const char *buf,
+ apr_size_t length,
+ void (*free_func)(void *data),
+ apr_bucket_alloc_t *list)
+{
+ apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
+
+ APR_BUCKET_INIT(b);
+ b->free = apr_bucket_free;
+ b->list = list;
+ return apr_bucket_heap_make(b, buf, length, free_func);
+}
+
+APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_heap = {
+ "HEAP", 5, APR_BUCKET_DATA,
+ heap_bucket_destroy,
+ heap_bucket_read,
+ apr_bucket_setaside_noop,
+ apr_bucket_shared_split,
+ apr_bucket_shared_copy
+};
diff --git a/contrib/apr-util/buckets/apr_buckets_mmap.c b/contrib/apr-util/buckets/apr_buckets_mmap.c
new file mode 100644
index 000000000000..19de291b5332
--- /dev/null
+++ b/contrib/apr-util/buckets/apr_buckets_mmap.c
@@ -0,0 +1,144 @@
+/* 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_buckets.h"
+
+#if APR_HAS_MMAP
+
+static apr_status_t mmap_bucket_read(apr_bucket *b, const char **str,
+ apr_size_t *length, apr_read_type_e block)
+{
+ apr_bucket_mmap *m = b->data;
+ apr_status_t ok;
+ void *addr;
+
+ if (!m->mmap) {
+ /* the apr_mmap_t was already cleaned up out from under us */
+ return APR_EINVAL;
+ }
+
+ ok = apr_mmap_offset(&addr, m->mmap, b->start);
+ if (ok != APR_SUCCESS) {
+ return ok;
+ }
+ *str = addr;
+ *length = b->length;
+ return APR_SUCCESS;
+}
+
+static apr_status_t mmap_bucket_cleanup(void *data)
+{
+ /* the apr_mmap_t is about to disappear out from under us, so we
+ * have no choice but to pretend it doesn't exist anymore. the
+ * refcount is now useless because there's nothing to refer to
+ * anymore. so the only valid action on any remaining referrer
+ * is to delete it. no more reads, no more anything. */
+ apr_bucket_mmap *m = data;
+
+ m->mmap = NULL;
+ return APR_SUCCESS;
+}
+
+static void mmap_bucket_destroy(void *data)
+{
+ apr_bucket_mmap *m = data;
+
+ if (apr_bucket_shared_destroy(m)) {
+ if (m->mmap) {
+ apr_pool_cleanup_kill(m->mmap->cntxt, m, mmap_bucket_cleanup);
+ apr_mmap_delete(m->mmap);
+ }
+ apr_bucket_free(m);
+ }
+}
+
+/*
+ * XXX: are the start and length arguments useful?
+ */
+APU_DECLARE(apr_bucket *) apr_bucket_mmap_make(apr_bucket *b, apr_mmap_t *mm,
+ apr_off_t start,
+ apr_size_t length)
+{
+ apr_bucket_mmap *m;
+
+ m = apr_bucket_alloc(sizeof(*m), b->list);
+ m->mmap = mm;
+
+ apr_pool_cleanup_register(mm->cntxt, m, mmap_bucket_cleanup,
+ apr_pool_cleanup_null);
+
+ b = apr_bucket_shared_make(b, m, start, length);
+ b->type = &apr_bucket_type_mmap;
+
+ return b;
+}
+
+
+APU_DECLARE(apr_bucket *) apr_bucket_mmap_create(apr_mmap_t *mm,
+ apr_off_t start,
+ apr_size_t length,
+ apr_bucket_alloc_t *list)
+{
+ apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
+
+ APR_BUCKET_INIT(b);
+ b->free = apr_bucket_free;
+ b->list = list;
+ return apr_bucket_mmap_make(b, mm, start, length);
+}
+
+static apr_status_t mmap_bucket_setaside(apr_bucket *b, apr_pool_t *p)
+{
+ apr_bucket_mmap *m = b->data;
+ apr_mmap_t *mm = m->mmap;
+ apr_mmap_t *new_mm;
+ apr_status_t ok;
+
+ if (!mm) {
+ /* the apr_mmap_t was already cleaned up out from under us */
+ return APR_EINVAL;
+ }
+
+ /* shortcut if possible */
+ if (apr_pool_is_ancestor(mm->cntxt, p)) {
+ return APR_SUCCESS;
+ }
+
+ /* duplicate apr_mmap_t into new pool */
+ ok = apr_mmap_dup(&new_mm, mm, p);
+ if (ok != APR_SUCCESS) {
+ return ok;
+ }
+
+ /* decrement refcount on old apr_bucket_mmap */
+ mmap_bucket_destroy(m);
+
+ /* create new apr_bucket_mmap pointing to new apr_mmap_t */
+ apr_bucket_mmap_make(b, new_mm, b->start, b->length);
+
+ return APR_SUCCESS;
+}
+
+APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_mmap = {
+ "MMAP", 5, APR_BUCKET_DATA,
+ mmap_bucket_destroy,
+ mmap_bucket_read,
+ mmap_bucket_setaside,
+ apr_bucket_shared_split,
+ apr_bucket_shared_copy
+};
+
+#endif
diff --git a/contrib/apr-util/buckets/apr_buckets_pipe.c b/contrib/apr-util/buckets/apr_buckets_pipe.c
new file mode 100644
index 000000000000..46b469705d6b
--- /dev/null
+++ b/contrib/apr-util/buckets/apr_buckets_pipe.c
@@ -0,0 +1,119 @@
+/* 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_buckets.h"
+
+static apr_status_t pipe_bucket_read(apr_bucket *a, const char **str,
+ apr_size_t *len, apr_read_type_e block)
+{
+ apr_file_t *p = a->data;
+ char *buf;
+ apr_status_t rv;
+ apr_interval_time_t timeout;
+
+ if (block == APR_NONBLOCK_READ) {
+ apr_file_pipe_timeout_get(p, &timeout);
+ apr_file_pipe_timeout_set(p, 0);
+ }
+
+ *str = NULL;
+ *len = APR_BUCKET_BUFF_SIZE;
+ buf = apr_bucket_alloc(*len, a->list); /* XXX: check for failure? */
+
+ rv = apr_file_read(p, buf, len);
+
+ if (block == APR_NONBLOCK_READ) {
+ apr_file_pipe_timeout_set(p, timeout);
+ }
+
+ if (rv != APR_SUCCESS && rv != APR_EOF) {
+ apr_bucket_free(buf);
+ return rv;
+ }
+ /*
+ * If there's more to read we have to keep the rest of the pipe
+ * for later. Otherwise, we'll close the pipe.
+ * XXX: Note that more complicated bucket types that
+ * refer to data not in memory and must therefore have a read()
+ * function similar to this one should be wary of copying this
+ * code because if they have a destroy function they probably
+ * want to migrate the bucket's subordinate structure from the
+ * old bucket to a raw new one and adjust it as appropriate,
+ * rather than destroying the old one and creating a completely
+ * new bucket.
+ */
+ if (*len > 0) {
+ apr_bucket_heap *h;
+ /* Change the current bucket to refer to what we read */
+ a = apr_bucket_heap_make(a, buf, *len, apr_bucket_free);
+ h = a->data;
+ h->alloc_len = APR_BUCKET_BUFF_SIZE; /* note the real buffer size */
+ *str = buf;
+ APR_BUCKET_INSERT_AFTER(a, apr_bucket_pipe_create(p, a->list));
+ }
+ else {
+ apr_bucket_free(buf);
+ a = apr_bucket_immortal_make(a, "", 0);
+ *str = a->data;
+ if (rv == APR_EOF) {
+ apr_file_close(p);
+ }
+ }
+ return APR_SUCCESS;
+}
+
+APU_DECLARE(apr_bucket *) apr_bucket_pipe_make(apr_bucket *b, apr_file_t *p)
+{
+ /*
+ * A pipe is closed when the end is reached in pipe_bucket_read(). If
+ * the pipe isn't read to the end (e.g., error path), the pipe will be
+ * closed when its pool goes away.
+ *
+ * Note that typically the pipe is allocated from the request pool
+ * so it will disappear when the request is finished. However the
+ * core filter may decide to set aside the tail end of a CGI
+ * response if the connection is pipelined. This turns out not to
+ * be a problem because the core will have read to the end of the
+ * stream so the bucket(s) that it sets aside will be the heap
+ * buckets created by pipe_bucket_read() above.
+ */
+ b->type = &apr_bucket_type_pipe;
+ b->length = (apr_size_t)(-1);
+ b->start = -1;
+ b->data = p;
+
+ return b;
+}
+
+APU_DECLARE(apr_bucket *) apr_bucket_pipe_create(apr_file_t *p,
+ apr_bucket_alloc_t *list)
+{
+ apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
+
+ APR_BUCKET_INIT(b);
+ b->free = apr_bucket_free;
+ b->list = list;
+ return apr_bucket_pipe_make(b, p);
+}
+
+APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_pipe = {
+ "PIPE", 5, APR_BUCKET_DATA,
+ apr_bucket_destroy_noop,
+ pipe_bucket_read,
+ apr_bucket_setaside_notimpl,
+ apr_bucket_split_notimpl,
+ apr_bucket_copy_notimpl
+};
diff --git a/contrib/apr-util/buckets/apr_buckets_pool.c b/contrib/apr-util/buckets/apr_buckets_pool.c
new file mode 100644
index 000000000000..56ba585e0588
--- /dev/null
+++ b/contrib/apr-util/buckets/apr_buckets_pool.c
@@ -0,0 +1,142 @@
+/* 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_buckets.h"
+#define APR_WANT_MEMFUNC
+#include "apr_want.h"
+
+static apr_status_t pool_bucket_cleanup(void *data)
+{
+ apr_bucket_pool *p = data;
+
+ /*
+ * If the pool gets cleaned up, we have to copy the data out
+ * of the pool and onto the heap. But the apr_buckets out there
+ * that point to this pool bucket need to be notified such that
+ * they can morph themselves into a regular heap bucket the next
+ * time they try to read. To avoid having to manipulate
+ * reference counts and b->data pointers, the apr_bucket_pool
+ * actually _contains_ an apr_bucket_heap as its first element,
+ * so the two share their apr_bucket_refcount member, and you
+ * can typecast a pool bucket struct to make it look like a
+ * regular old heap bucket struct.
+ */
+ p->heap.base = apr_bucket_alloc(p->heap.alloc_len, p->list);
+ memcpy(p->heap.base, p->base, p->heap.alloc_len);
+ p->base = NULL;
+ p->pool = NULL;
+
+ return APR_SUCCESS;
+}
+
+static apr_status_t pool_bucket_read(apr_bucket *b, const char **str,
+ apr_size_t *len, apr_read_type_e block)
+{
+ apr_bucket_pool *p = b->data;
+ const char *base = p->base;
+
+ if (p->pool == NULL) {
+ /*
+ * pool has been cleaned up... masquerade as a heap bucket from now
+ * on. subsequent bucket operations will use the heap bucket code.
+ */
+ b->type = &apr_bucket_type_heap;
+ base = p->heap.base;
+ }
+ *str = base + b->start;
+ *len = b->length;
+ return APR_SUCCESS;
+}
+
+static void pool_bucket_destroy(void *data)
+{
+ apr_bucket_pool *p = data;
+
+ /* If the pool is cleaned up before the last reference goes
+ * away, the data is really now on the heap; heap_destroy() takes
+ * over. free() in heap_destroy() thinks it's freeing
+ * an apr_bucket_heap, when in reality it's freeing the whole
+ * apr_bucket_pool for us.
+ */
+ if (p->pool) {
+ /* the shared resource is still in the pool
+ * because the pool has not been cleaned up yet
+ */
+ if (apr_bucket_shared_destroy(p)) {
+ apr_pool_cleanup_kill(p->pool, p, pool_bucket_cleanup);
+ apr_bucket_free(p);
+ }
+ }
+ else {
+ /* the shared resource is no longer in the pool, it's
+ * on the heap, but this reference still thinks it's a pool
+ * bucket. we should just go ahead and pass control to
+ * heap_destroy() for it since it doesn't know any better.
+ */
+ apr_bucket_type_heap.destroy(p);
+ }
+}
+
+APU_DECLARE(apr_bucket *) apr_bucket_pool_make(apr_bucket *b,
+ const char *buf, apr_size_t length, apr_pool_t *pool)
+{
+ apr_bucket_pool *p;
+
+ p = apr_bucket_alloc(sizeof(*p), b->list);
+
+ /* XXX: we lose the const qualifier here which indicates
+ * there's something screwy with the API...
+ */
+ /* XXX: why is this? buf is const, p->base is const... what's
+ * the problem? --jcw */
+ p->base = (char *) buf;
+ p->pool = pool;
+ p->list = b->list;
+
+ b = apr_bucket_shared_make(b, p, 0, length);
+ b->type = &apr_bucket_type_pool;
+
+ /* pre-initialize heap bucket member */
+ p->heap.alloc_len = length;
+ p->heap.base = NULL;
+ p->heap.free_func = apr_bucket_free;
+
+ apr_pool_cleanup_register(p->pool, p, pool_bucket_cleanup,
+ apr_pool_cleanup_null);
+ return b;
+}
+
+APU_DECLARE(apr_bucket *) apr_bucket_pool_create(const char *buf,
+ apr_size_t length,
+ apr_pool_t *pool,
+ apr_bucket_alloc_t *list)
+{
+ apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
+
+ APR_BUCKET_INIT(b);
+ b->free = apr_bucket_free;
+ b->list = list;
+ return apr_bucket_pool_make(b, buf, length, pool);
+}
+
+APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_pool = {
+ "POOL", 5, APR_BUCKET_DATA,
+ pool_bucket_destroy,
+ pool_bucket_read,
+ apr_bucket_setaside_noop, /* don't need to setaside thanks to the cleanup*/
+ apr_bucket_shared_split,
+ apr_bucket_shared_copy
+};
diff --git a/contrib/apr-util/buckets/apr_buckets_refcount.c b/contrib/apr-util/buckets/apr_buckets_refcount.c
new file mode 100644
index 000000000000..0e765d94a2f5
--- /dev/null
+++ b/contrib/apr-util/buckets/apr_buckets_refcount.c
@@ -0,0 +1,64 @@
+/* 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_buckets.h"
+
+APU_DECLARE_NONSTD(apr_status_t) apr_bucket_shared_split(apr_bucket *a,
+ apr_size_t point)
+{
+ apr_bucket_refcount *r = a->data;
+ apr_status_t rv;
+
+ if ((rv = apr_bucket_simple_split(a, point)) != APR_SUCCESS) {
+ return rv;
+ }
+ r->refcount++;
+
+ return APR_SUCCESS;
+}
+
+APU_DECLARE_NONSTD(apr_status_t) apr_bucket_shared_copy(apr_bucket *a,
+ apr_bucket **b)
+{
+ apr_bucket_refcount *r = a->data;
+
+ apr_bucket_simple_copy(a, b);
+ r->refcount++;
+
+ return APR_SUCCESS;
+}
+
+APU_DECLARE(int) apr_bucket_shared_destroy(void *data)
+{
+ apr_bucket_refcount *r = data;
+ r->refcount--;
+ return (r->refcount == 0);
+}
+
+APU_DECLARE(apr_bucket *) apr_bucket_shared_make(apr_bucket *b, void *data,
+ apr_off_t start,
+ apr_size_t length)
+{
+ apr_bucket_refcount *r = data;
+
+ b->data = r;
+ b->start = start;
+ b->length = length;
+ /* caller initializes the type field */
+ r->refcount = 1;
+
+ return b;
+}
diff --git a/contrib/apr-util/buckets/apr_buckets_simple.c b/contrib/apr-util/buckets/apr_buckets_simple.c
new file mode 100644
index 000000000000..cef748be79d7
--- /dev/null
+++ b/contrib/apr-util/buckets/apr_buckets_simple.c
@@ -0,0 +1,137 @@
+/* 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_buckets.h"
+
+APU_DECLARE_NONSTD(apr_status_t) apr_bucket_simple_copy(apr_bucket *a,
+ apr_bucket **b)
+{
+ *b = apr_bucket_alloc(sizeof(**b), a->list); /* XXX: check for failure? */
+ **b = *a;
+
+ return APR_SUCCESS;
+}
+
+APU_DECLARE_NONSTD(apr_status_t) apr_bucket_simple_split(apr_bucket *a,
+ apr_size_t point)
+{
+ apr_bucket *b;
+
+ if (point > a->length) {
+ return APR_EINVAL;
+ }
+
+ apr_bucket_simple_copy(a, &b);
+
+ a->length = point;
+ b->length -= point;
+ b->start += point;
+
+ APR_BUCKET_INSERT_AFTER(a, b);
+
+ return APR_SUCCESS;
+}
+
+static apr_status_t simple_bucket_read(apr_bucket *b, const char **str,
+ apr_size_t *len, apr_read_type_e block)
+{
+ *str = (char *)b->data + b->start;
+ *len = b->length;
+ return APR_SUCCESS;
+}
+
+APU_DECLARE(apr_bucket *) apr_bucket_immortal_make(apr_bucket *b,
+ const char *buf,
+ apr_size_t length)
+{
+ b->data = (char *)buf;
+ b->length = length;
+ b->start = 0;
+ b->type = &apr_bucket_type_immortal;
+
+ return b;
+}
+
+APU_DECLARE(apr_bucket *) apr_bucket_immortal_create(const char *buf,
+ apr_size_t length,
+ apr_bucket_alloc_t *list)
+{
+ apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
+
+ APR_BUCKET_INIT(b);
+ b->free = apr_bucket_free;
+ b->list = list;
+ return apr_bucket_immortal_make(b, buf, length);
+}
+
+/*
+ * XXX: This function could do with some tweaking to reduce memory
+ * usage in various cases, e.g. share buffers in the heap between all
+ * the buckets that are set aside, or even spool set-aside data to
+ * disk if it gets too voluminous (but if it does then that's probably
+ * a bug elsewhere). There should probably be a apr_brigade_setaside()
+ * function that co-ordinates the action of all the bucket setaside
+ * functions to improve memory efficiency.
+ */
+static apr_status_t transient_bucket_setaside(apr_bucket *b, apr_pool_t *pool)
+{
+ b = apr_bucket_heap_make(b, (char *)b->data + b->start, b->length, NULL);
+ if (b == NULL) {
+ return APR_ENOMEM;
+ }
+ return APR_SUCCESS;
+}
+
+APU_DECLARE(apr_bucket *) apr_bucket_transient_make(apr_bucket *b,
+ const char *buf,
+ apr_size_t length)
+{
+ b->data = (char *)buf;
+ b->length = length;
+ b->start = 0;
+ b->type = &apr_bucket_type_transient;
+ return b;
+}
+
+APU_DECLARE(apr_bucket *) apr_bucket_transient_create(const char *buf,
+ apr_size_t length,
+ apr_bucket_alloc_t *list)
+{
+ apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
+
+ APR_BUCKET_INIT(b);
+ b->free = apr_bucket_free;
+ b->list = list;
+ return apr_bucket_transient_make(b, buf, length);
+}
+
+const apr_bucket_type_t apr_bucket_type_immortal = {
+ "IMMORTAL", 5, APR_BUCKET_DATA,
+ apr_bucket_destroy_noop,
+ simple_bucket_read,
+ apr_bucket_setaside_noop,
+ apr_bucket_simple_split,
+ apr_bucket_simple_copy
+};
+
+APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_transient = {
+ "TRANSIENT", 5, APR_BUCKET_DATA,
+ apr_bucket_destroy_noop,
+ simple_bucket_read,
+ transient_bucket_setaside,
+ apr_bucket_simple_split,
+ apr_bucket_simple_copy
+};
diff --git a/contrib/apr-util/buckets/apr_buckets_socket.c b/contrib/apr-util/buckets/apr_buckets_socket.c
new file mode 100644
index 000000000000..68eae43befd7
--- /dev/null
+++ b/contrib/apr-util/buckets/apr_buckets_socket.c
@@ -0,0 +1,114 @@
+/* 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_buckets.h"
+
+static apr_status_t socket_bucket_read(apr_bucket *a, const char **str,
+ apr_size_t *len, apr_read_type_e block)
+{
+ apr_socket_t *p = a->data;
+ char *buf;
+ apr_status_t rv;
+ apr_interval_time_t timeout;
+
+ if (block == APR_NONBLOCK_READ) {
+ apr_socket_timeout_get(p, &timeout);
+ apr_socket_timeout_set(p, 0);
+ }
+
+ *str = NULL;
+ *len = APR_BUCKET_BUFF_SIZE;
+ buf = apr_bucket_alloc(*len, a->list); /* XXX: check for failure? */
+
+ rv = apr_socket_recv(p, buf, len);
+
+ if (block == APR_NONBLOCK_READ) {
+ apr_socket_timeout_set(p, timeout);
+ }
+
+ if (rv != APR_SUCCESS && rv != APR_EOF) {
+ apr_bucket_free(buf);
+ return rv;
+ }
+ /*
+ * If there's more to read we have to keep the rest of the socket
+ * for later. XXX: Note that more complicated bucket types that
+ * refer to data not in memory and must therefore have a read()
+ * function similar to this one should be wary of copying this
+ * code because if they have a destroy function they probably
+ * want to migrate the bucket's subordinate structure from the
+ * old bucket to a raw new one and adjust it as appropriate,
+ * rather than destroying the old one and creating a completely
+ * new bucket.
+ *
+ * Even if there is nothing more to read, don't close the socket here
+ * as we have to use it to send any response :) We could shut it
+ * down for reading, but there is no benefit to doing so.
+ */
+ if (*len > 0) {
+ apr_bucket_heap *h;
+ /* Change the current bucket to refer to what we read */
+ a = apr_bucket_heap_make(a, buf, *len, apr_bucket_free);
+ h = a->data;
+ h->alloc_len = APR_BUCKET_BUFF_SIZE; /* note the real buffer size */
+ *str = buf;
+ APR_BUCKET_INSERT_AFTER(a, apr_bucket_socket_create(p, a->list));
+ }
+ else {
+ apr_bucket_free(buf);
+ a = apr_bucket_immortal_make(a, "", 0);
+ *str = a->data;
+ }
+ return APR_SUCCESS;
+}
+
+APU_DECLARE(apr_bucket *) apr_bucket_socket_make(apr_bucket *b, apr_socket_t *p)
+{
+ /*
+ * XXX: We rely on a cleanup on some pool or other to actually
+ * destroy the socket. We should probably explicitly call apr to
+ * destroy it instead.
+ *
+ * Note that typically the socket is allocated from the connection pool
+ * so it will disappear when the connection is finished.
+ */
+ b->type = &apr_bucket_type_socket;
+ b->length = (apr_size_t)(-1);
+ b->start = -1;
+ b->data = p;
+
+ return b;
+}
+
+APU_DECLARE(apr_bucket *) apr_bucket_socket_create(apr_socket_t *p,
+ apr_bucket_alloc_t *list)
+{
+ apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
+
+ APR_BUCKET_INIT(b);
+ b->free = apr_bucket_free;
+ b->list = list;
+ return apr_bucket_socket_make(b, p);
+}
+
+APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_socket = {
+ "SOCKET", 5, APR_BUCKET_DATA,
+ apr_bucket_destroy_noop,
+ socket_bucket_read,
+ apr_bucket_setaside_notimpl,
+ apr_bucket_split_notimpl,
+ apr_bucket_copy_notimpl
+};
diff --git a/contrib/apr-util/build-outputs.mk b/contrib/apr-util/build-outputs.mk
new file mode 100644
index 000000000000..b624532ebd2b
--- /dev/null
+++ b/contrib/apr-util/build-outputs.mk
@@ -0,0 +1,150 @@
+# DO NOT EDIT. AUTOMATICALLY GENERATED.
+
+buckets/apr_brigade.lo: buckets/apr_brigade.c .make.dirs include/apr_buckets.h
+buckets/apr_buckets.lo: buckets/apr_buckets.c .make.dirs include/apr_buckets.h
+buckets/apr_buckets_alloc.lo: buckets/apr_buckets_alloc.c .make.dirs include/apr_buckets.h
+buckets/apr_buckets_eos.lo: buckets/apr_buckets_eos.c .make.dirs include/apr_buckets.h
+buckets/apr_buckets_file.lo: buckets/apr_buckets_file.c .make.dirs include/apr_buckets.h
+buckets/apr_buckets_flush.lo: buckets/apr_buckets_flush.c .make.dirs include/apr_buckets.h
+buckets/apr_buckets_heap.lo: buckets/apr_buckets_heap.c .make.dirs include/apr_buckets.h
+buckets/apr_buckets_mmap.lo: buckets/apr_buckets_mmap.c .make.dirs include/apr_buckets.h
+buckets/apr_buckets_pipe.lo: buckets/apr_buckets_pipe.c .make.dirs include/apr_buckets.h
+buckets/apr_buckets_pool.lo: buckets/apr_buckets_pool.c .make.dirs include/apr_buckets.h
+buckets/apr_buckets_refcount.lo: buckets/apr_buckets_refcount.c .make.dirs include/apr_buckets.h
+buckets/apr_buckets_simple.lo: buckets/apr_buckets_simple.c .make.dirs include/apr_buckets.h
+buckets/apr_buckets_socket.lo: buckets/apr_buckets_socket.c .make.dirs include/apr_buckets.h
+crypto/apr_crypto.lo: crypto/apr_crypto.c .make.dirs include/apr_crypto.h include/apu_errno.h include/apu_version.h include/private/apr_crypto_internal.h include/private/apu_internal.h
+crypto/apr_md4.lo: crypto/apr_md4.c .make.dirs include/apr_md4.h include/apr_xlate.h
+crypto/apr_md5.lo: crypto/apr_md5.c .make.dirs include/apr_md5.h include/apr_xlate.h
+crypto/apr_passwd.lo: crypto/apr_passwd.c .make.dirs include/apr_md5.h include/apr_sha1.h include/apr_xlate.h
+crypto/apr_sha1.lo: crypto/apr_sha1.c .make.dirs include/apr_base64.h include/apr_sha1.h include/apr_xlate.h
+crypto/crypt_blowfish.lo: crypto/crypt_blowfish.c .make.dirs
+crypto/getuuid.lo: crypto/getuuid.c .make.dirs include/apr_md5.h include/apr_uuid.h include/apr_xlate.h
+crypto/uuid.lo: crypto/uuid.c .make.dirs include/apr_uuid.h
+dbd/apr_dbd.lo: dbd/apr_dbd.c .make.dirs include/apr_dbd.h include/apu_version.h include/private/apr_dbd_internal.h include/private/apu_internal.h
+dbm/apr_dbm.lo: dbm/apr_dbm.c .make.dirs include/apr_dbm.h include/apu_version.h include/private/apr_dbm_private.h include/private/apu_internal.h
+dbm/apr_dbm_sdbm.lo: dbm/apr_dbm_sdbm.c .make.dirs include/apr_dbm.h include/apr_sdbm.h include/private/apr_dbm_private.h
+dbm/sdbm/sdbm.lo: dbm/sdbm/sdbm.c .make.dirs include/apr_sdbm.h
+dbm/sdbm/sdbm_hash.lo: dbm/sdbm/sdbm_hash.c .make.dirs include/apr_sdbm.h
+dbm/sdbm/sdbm_lock.lo: dbm/sdbm/sdbm_lock.c .make.dirs include/apr_sdbm.h
+dbm/sdbm/sdbm_pair.lo: dbm/sdbm/sdbm_pair.c .make.dirs include/apr_sdbm.h
+encoding/apr_base64.lo: encoding/apr_base64.c .make.dirs include/apr_base64.h include/apr_xlate.h
+hooks/apr_hooks.lo: hooks/apr_hooks.c .make.dirs include/apr_hooks.h include/apr_optional.h include/apr_optional_hooks.h
+ldap/apr_ldap_stub.lo: ldap/apr_ldap_stub.c .make.dirs include/apu_version.h include/private/apu_internal.h
+ldap/apr_ldap_url.lo: ldap/apr_ldap_url.c .make.dirs
+memcache/apr_memcache.lo: memcache/apr_memcache.c .make.dirs include/apr_buckets.h include/apr_memcache.h include/apr_reslist.h
+misc/apr_date.lo: misc/apr_date.c .make.dirs include/apr_date.h
+misc/apr_queue.lo: misc/apr_queue.c .make.dirs include/apr_queue.h
+misc/apr_reslist.lo: misc/apr_reslist.c .make.dirs include/apr_reslist.h
+misc/apr_rmm.lo: misc/apr_rmm.c .make.dirs include/apr_anylock.h include/apr_rmm.h
+misc/apr_thread_pool.lo: misc/apr_thread_pool.c .make.dirs include/apr_thread_pool.h
+misc/apu_dso.lo: misc/apu_dso.c .make.dirs include/apu_version.h include/private/apu_internal.h
+misc/apu_version.lo: misc/apu_version.c .make.dirs include/apu_version.h
+strmatch/apr_strmatch.lo: strmatch/apr_strmatch.c .make.dirs include/apr_strmatch.h
+uri/apr_uri.lo: uri/apr_uri.c .make.dirs include/apr_uri.h
+xlate/xlate.lo: xlate/xlate.c .make.dirs include/apr_xlate.h
+xml/apr_xml.lo: xml/apr_xml.c .make.dirs include/apr_xlate.h include/apr_xml.h
+
+OBJECTS_all = buckets/apr_brigade.lo buckets/apr_buckets.lo buckets/apr_buckets_alloc.lo buckets/apr_buckets_eos.lo buckets/apr_buckets_file.lo buckets/apr_buckets_flush.lo buckets/apr_buckets_heap.lo buckets/apr_buckets_mmap.lo buckets/apr_buckets_pipe.lo buckets/apr_buckets_pool.lo buckets/apr_buckets_refcount.lo buckets/apr_buckets_simple.lo buckets/apr_buckets_socket.lo crypto/apr_crypto.lo crypto/apr_md4.lo crypto/apr_md5.lo crypto/apr_passwd.lo crypto/apr_sha1.lo crypto/crypt_blowfish.lo crypto/getuuid.lo crypto/uuid.lo dbd/apr_dbd.lo dbm/apr_dbm.lo dbm/apr_dbm_sdbm.lo dbm/sdbm/sdbm.lo dbm/sdbm/sdbm_hash.lo dbm/sdbm/sdbm_lock.lo dbm/sdbm/sdbm_pair.lo encoding/apr_base64.lo hooks/apr_hooks.lo ldap/apr_ldap_stub.lo ldap/apr_ldap_url.lo memcache/apr_memcache.lo misc/apr_date.lo misc/apr_queue.lo misc/apr_reslist.lo misc/apr_rmm.lo misc/apr_thread_pool.lo misc/apu_dso.lo misc/apu_version.lo strmatch/apr_strmatch.lo uri/apr_uri.lo xlate/xlate.lo xml/apr_xml.lo
+
+OBJECTS_unix = $(OBJECTS_all)
+
+OBJECTS_aix = $(OBJECTS_all)
+
+OBJECTS_beos = $(OBJECTS_all)
+
+OBJECTS_os2 = $(OBJECTS_all)
+
+OBJECTS_os390 = $(OBJECTS_all)
+
+OBJECTS_win32 = $(OBJECTS_all)
+
+HEADERS = $(top_srcdir)/include/apr_anylock.h $(top_srcdir)/include/apr_base64.h $(top_srcdir)/include/apr_buckets.h $(top_srcdir)/include/apr_crypto.h $(top_srcdir)/include/apr_date.h $(top_srcdir)/include/apr_dbd.h $(top_srcdir)/include/apr_dbm.h $(top_srcdir)/include/apr_hooks.h $(top_srcdir)/include/apr_ldap_init.h $(top_srcdir)/include/apr_ldap_option.h $(top_srcdir)/include/apr_ldap_rebind.h $(top_srcdir)/include/apr_ldap_url.h $(top_srcdir)/include/apr_md4.h $(top_srcdir)/include/apr_md5.h $(top_srcdir)/include/apr_memcache.h $(top_srcdir)/include/apr_optional.h $(top_srcdir)/include/apr_optional_hooks.h $(top_srcdir)/include/apr_queue.h $(top_srcdir)/include/apr_reslist.h $(top_srcdir)/include/apr_rmm.h $(top_srcdir)/include/apr_sdbm.h $(top_srcdir)/include/apr_sha1.h $(top_srcdir)/include/apr_strmatch.h $(top_srcdir)/include/apr_thread_pool.h $(top_srcdir)/include/apr_uri.h $(top_srcdir)/include/apr_uuid.h $(top_srcdir)/include/apr_xlate.h $(top_srcdir)/include/apr_xml.h $(top_srcdir)/include/apu_errno.h $(top_srcdir)/include/apu_version.h $(top_srcdir)/include/private/apr_crypto_internal.h $(top_srcdir)/include/private/apr_dbd_internal.h $(top_srcdir)/include/private/apr_dbd_odbc_v2.h $(top_srcdir)/include/private/apr_dbm_private.h $(top_srcdir)/include/private/apu_internal.h
+
+SOURCE_DIRS = xml dbm encoding hooks buckets uri misc crypto dbd strmatch memcache dbm/sdbm ldap xlate $(EXTRA_SOURCE_DIRS)
+
+ldap/apr_ldap_init.lo: ldap/apr_ldap_init.c .make.dirs include/private/apu_internal.h
+ldap/apr_ldap_option.lo: ldap/apr_ldap_option.c .make.dirs
+ldap/apr_ldap_rebind.lo: ldap/apr_ldap_rebind.c .make.dirs include/apr_ldap_rebind.h
+OBJECTS_ldap = ldap/apr_ldap_init.lo ldap/apr_ldap_option.lo ldap/apr_ldap_rebind.lo
+MODULE_ldap = ldap/apr_ldap.la
+ldap/apr_ldap.la: ldap/apr_ldap_init.lo ldap/apr_ldap_option.lo ldap/apr_ldap_rebind.lo
+ $(LINK_MODULE) -o $@ $(OBJECTS_ldap) $(LDADD_ldap)
+
+crypto/apr_crypto_openssl.lo: crypto/apr_crypto_openssl.c .make.dirs include/apr_buckets.h include/apr_crypto.h include/apu_errno.h include/private/apr_crypto_internal.h
+OBJECTS_crypto_openssl = crypto/apr_crypto_openssl.lo
+MODULE_crypto_openssl = crypto/apr_crypto_openssl.la
+crypto/apr_crypto_openssl.la: crypto/apr_crypto_openssl.lo
+ $(LINK_MODULE) -o $@ $(OBJECTS_crypto_openssl) $(LDADD_crypto_openssl)
+
+crypto/apr_crypto_nss.lo: crypto/apr_crypto_nss.c .make.dirs include/apr_buckets.h include/apr_crypto.h include/apu_errno.h include/private/apr_crypto_internal.h
+OBJECTS_crypto_nss = crypto/apr_crypto_nss.lo
+MODULE_crypto_nss = crypto/apr_crypto_nss.la
+crypto/apr_crypto_nss.la: crypto/apr_crypto_nss.lo
+ $(LINK_MODULE) -o $@ $(OBJECTS_crypto_nss) $(LDADD_crypto_nss)
+
+dbd/apr_dbd_pgsql.lo: dbd/apr_dbd_pgsql.c .make.dirs include/apr_buckets.h include/apr_dbd.h include/private/apr_dbd_internal.h
+OBJECTS_dbd_pgsql = dbd/apr_dbd_pgsql.lo
+MODULE_dbd_pgsql = dbd/apr_dbd_pgsql.la
+dbd/apr_dbd_pgsql.la: dbd/apr_dbd_pgsql.lo
+ $(LINK_MODULE) -o $@ $(OBJECTS_dbd_pgsql) $(LDADD_dbd_pgsql)
+
+dbd/apr_dbd_sqlite2.lo: dbd/apr_dbd_sqlite2.c .make.dirs include/apr_buckets.h include/apr_dbd.h include/private/apr_dbd_internal.h
+OBJECTS_dbd_sqlite2 = dbd/apr_dbd_sqlite2.lo
+MODULE_dbd_sqlite2 = dbd/apr_dbd_sqlite2.la
+dbd/apr_dbd_sqlite2.la: dbd/apr_dbd_sqlite2.lo
+ $(LINK_MODULE) -o $@ $(OBJECTS_dbd_sqlite2) $(LDADD_dbd_sqlite2)
+
+dbd/apr_dbd_sqlite3.lo: dbd/apr_dbd_sqlite3.c .make.dirs include/apr_buckets.h include/apr_dbd.h include/private/apr_dbd_internal.h
+OBJECTS_dbd_sqlite3 = dbd/apr_dbd_sqlite3.lo
+MODULE_dbd_sqlite3 = dbd/apr_dbd_sqlite3.la
+dbd/apr_dbd_sqlite3.la: dbd/apr_dbd_sqlite3.lo
+ $(LINK_MODULE) -o $@ $(OBJECTS_dbd_sqlite3) $(LDADD_dbd_sqlite3)
+
+dbd/apr_dbd_oracle.lo: dbd/apr_dbd_oracle.c .make.dirs include/apr_buckets.h include/apr_dbd.h include/private/apr_dbd_internal.h
+OBJECTS_dbd_oracle = dbd/apr_dbd_oracle.lo
+MODULE_dbd_oracle = dbd/apr_dbd_oracle.la
+dbd/apr_dbd_oracle.la: dbd/apr_dbd_oracle.lo
+ $(LINK_MODULE) -o $@ $(OBJECTS_dbd_oracle) $(LDADD_dbd_oracle)
+
+dbd/apr_dbd_mysql.lo: dbd/apr_dbd_mysql.c .make.dirs include/apr_buckets.h include/apr_dbd.h include/apu_version.h include/private/apr_dbd_internal.h
+OBJECTS_dbd_mysql = dbd/apr_dbd_mysql.lo
+MODULE_dbd_mysql = dbd/apr_dbd_mysql.la
+dbd/apr_dbd_mysql.la: dbd/apr_dbd_mysql.lo
+ $(LINK_MODULE) -o $@ $(OBJECTS_dbd_mysql) $(LDADD_dbd_mysql)
+
+dbd/apr_dbd_freetds.lo: dbd/apr_dbd_freetds.c .make.dirs include/apr_dbd.h include/private/apr_dbd_internal.h
+OBJECTS_dbd_freetds = dbd/apr_dbd_freetds.lo
+MODULE_dbd_freetds = dbd/apr_dbd_freetds.la
+dbd/apr_dbd_freetds.la: dbd/apr_dbd_freetds.lo
+ $(LINK_MODULE) -o $@ $(OBJECTS_dbd_freetds) $(LDADD_dbd_freetds)
+
+dbd/apr_dbd_odbc.lo: dbd/apr_dbd_odbc.c .make.dirs include/apr_buckets.h include/apr_dbd.h include/apu_version.h include/private/apr_dbd_internal.h include/private/apr_dbd_odbc_v2.h
+OBJECTS_dbd_odbc = dbd/apr_dbd_odbc.lo
+MODULE_dbd_odbc = dbd/apr_dbd_odbc.la
+dbd/apr_dbd_odbc.la: dbd/apr_dbd_odbc.lo
+ $(LINK_MODULE) -o $@ $(OBJECTS_dbd_odbc) $(LDADD_dbd_odbc)
+
+dbm/apr_dbm_berkeleydb.lo: dbm/apr_dbm_berkeleydb.c .make.dirs include/apr_dbm.h include/private/apr_dbm_private.h
+OBJECTS_dbm_db = dbm/apr_dbm_berkeleydb.lo
+MODULE_dbm_db = dbm/apr_dbm_db.la
+dbm/apr_dbm_db.la: dbm/apr_dbm_berkeleydb.lo
+ $(LINK_MODULE) -o $@ $(OBJECTS_dbm_db) $(LDADD_dbm_db)
+
+dbm/apr_dbm_gdbm.lo: dbm/apr_dbm_gdbm.c .make.dirs include/apr_dbm.h include/private/apr_dbm_private.h
+OBJECTS_dbm_gdbm = dbm/apr_dbm_gdbm.lo
+MODULE_dbm_gdbm = dbm/apr_dbm_gdbm.la
+dbm/apr_dbm_gdbm.la: dbm/apr_dbm_gdbm.lo
+ $(LINK_MODULE) -o $@ $(OBJECTS_dbm_gdbm) $(LDADD_dbm_gdbm)
+
+dbm/apr_dbm_ndbm.lo: dbm/apr_dbm_ndbm.c .make.dirs include/apr_dbm.h include/private/apr_dbm_private.h
+OBJECTS_dbm_ndbm = dbm/apr_dbm_ndbm.lo
+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)
+
+BUILD_DIRS = buckets crypto dbd dbm dbm/sdbm encoding hooks ldap memcache misc strmatch uri xlate xml
+
+.make.dirs: $(srcdir)/build-outputs.mk
+ @for d in $(BUILD_DIRS); do test -d $$d || mkdir $$d; done
+ @echo timestamp > $@
diff --git a/contrib/apr-util/build.conf b/contrib/apr-util/build.conf
new file mode 100644
index 000000000000..d34d004fe33a
--- /dev/null
+++ b/contrib/apr-util/build.conf
@@ -0,0 +1,102 @@
+#
+# Configuration file for APRUTIL. Used by APR/build/gen-build.py
+#
+
+[options]
+
+# the platform-independent .c files
+paths =
+ buckets/*.c
+ crypto/apr_crypto.c
+ crypto/apr_md4.c
+ crypto/apr_md5.c
+ crypto/apr_passwd.c
+ crypto/apr_sha1.c
+ crypto/getuuid.c
+ crypto/uuid.c
+ crypto/crypt_blowfish.c
+ dbm/apr_dbm_sdbm.c
+ dbm/apr_dbm.c
+ dbm/sdbm/*.c
+ encoding/*.c
+ hooks/*.c
+ ldap/apr_ldap_stub.c
+ ldap/apr_ldap_url.c
+ misc/*.c
+ memcache/*.c
+ uri/apr_uri.c
+ xml/*.c
+ strmatch/*.c
+ xlate/*.c
+ dbd/apr_dbd.c
+
+# we have no platform-specific subdirs
+platform_dirs =
+
+# the public headers
+headers = include/*.h include/private/*.h
+
+modules =
+ ldap crypto_openssl crypto_nss dbd_pgsql
+ dbd_sqlite2 dbd_sqlite3 dbd_oracle dbd_mysql dbd_freetds dbd_odbc
+ dbm_db dbm_gdbm dbm_ndbm
+
+# gen_uri_delim.c
+
+# we have a recursive makefile for the test files (for now)
+# test/*.c
+
+[crypto_openssl]
+paths = crypto/apr_crypto_openssl.c
+target = crypto/apr_crypto_openssl.la
+
+[crypto_nss]
+paths = crypto/apr_crypto_nss.c
+target = crypto/apr_crypto_nss.la
+
+[dbd_pgsql]
+paths = dbd/apr_dbd_pgsql.c
+target = dbd/apr_dbd_pgsql.la
+
+[dbd_sqlite2]
+paths = dbd/apr_dbd_sqlite2.c
+target = dbd/apr_dbd_sqlite2.la
+
+[dbd_sqlite3]
+paths = dbd/apr_dbd_sqlite3.c
+target = dbd/apr_dbd_sqlite3.la
+
+[dbd_oracle]
+paths = dbd/apr_dbd_oracle.c
+target = dbd/apr_dbd_oracle.la
+
+[dbd_mysql]
+paths = dbd/apr_dbd_mysql.c
+target = dbd/apr_dbd_mysql.la
+
+[dbd_freetds]
+paths = dbd/apr_dbd_freetds.c
+target = dbd/apr_dbd_freetds.la
+
+[dbd_odbc]
+paths = dbd/apr_dbd_odbc.c
+target = dbd/apr_dbd_odbc.la
+
+[dbm_db]
+paths = dbm/apr_dbm_berkeleydb.c
+target = dbm/apr_dbm_db.la
+
+[dbm_gdbm]
+paths = dbm/apr_dbm_gdbm.c
+target = dbm/apr_dbm_gdbm.la
+
+[dbm_ndbm]
+paths = dbm/apr_dbm_ndbm.c
+target = dbm/apr_dbm_ndbm.la
+
+[ldap]
+paths = ldap/apr_ldap_init.c
+ ldap/apr_ldap_option.c
+ ldap/apr_ldap_rebind.c
+target = ldap/apr_ldap.la
+
diff --git a/contrib/apr-util/buildconf b/contrib/apr-util/buildconf
new file mode 100755
index 000000000000..5d6536f5cf32
--- /dev/null
+++ b/contrib/apr-util/buildconf
@@ -0,0 +1,116 @@
+#!/bin/sh
+#
+# 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.
+#
+#
+
+if [ "$1" = "--verbose" -o "$1" = "-v" ]; then
+ verbose="--verbose"
+ shift
+fi
+
+# Default place to look for apr source. Can be overridden with
+# --with-apr=[directory]
+apr_src_dir=../apr
+
+while test $# -gt 0
+do
+ # Normalize
+ case "$1" in
+ -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) optarg= ;;
+ esac
+
+ case "$1" in
+ --with-apr=*)
+ apr_src_dir=$optarg
+ ;;
+ esac
+
+ shift
+done
+
+if [ -f "$apr_src_dir/build/apr_common.m4" ]; then
+ apr_src_dir=`cd $apr_src_dir; pwd`
+ echo ""
+ echo "Looking for apr source in $apr_src_dir"
+else
+ echo ""
+ echo "Problem finding apr source in $apr_src_dir."
+ echo "Use:"
+ echo " --with-apr=[directory]"
+ exit 1
+fi
+
+set -e
+
+# Remove some files, then copy them from apr source tree
+rm -f build/apr_common.m4 build/find_apr.m4 build/install.sh \
+ build/config.guess build/config.sub build/get-version.sh
+cp -p $apr_src_dir/build/apr_common.m4 $apr_src_dir/build/find_apr.m4 \
+ $apr_src_dir/build/install.sh $apr_src_dir/build/config.guess \
+ $apr_src_dir/build/config.sub $apr_src_dir/build/get-version.sh \
+ build/
+
+# Remove aclocal.m4 as it'll break some builds...
+rm -rf aclocal.m4 autom4te*.cache
+
+#
+# Generate the autoconf header (include/apu_config.h) and ./configure
+#
+echo "Creating include/private/apu_config.h ..."
+${AUTOHEADER:-autoheader} $verbose
+
+echo "Creating configure ..."
+### do some work to toss config.cache?
+if ${AUTOCONF:-autoconf} $verbose; then
+ :
+else
+ echo "autoconf failed"
+ exit 1
+fi
+
+#
+# Generate build-outputs.mk for the build system
+#
+echo "Generating 'make' outputs ..."
+$apr_src_dir/build/gen-build.py $verbose make
+
+#
+# If Expat has been bundled, then go and configure the thing
+#
+if [ -f xml/expat/buildconf.sh ]; then
+ echo "Invoking xml/expat/buildconf.sh ..."
+ (cd xml/expat; ./buildconf.sh $verbose)
+fi
+
+# Remove autoconf cache again
+rm -rf autom4te*.cache
+
+# Create RPM Spec file
+if [ -f `which cut` ]; then
+ echo rebuilding rpm spec file
+ REVISION=`build/get-version.sh all include/apu_version.h APU`
+ VERSION=`echo $REVISION | cut -d- -s -f1`
+ RELEASE=`echo $REVISION | cut -d- -s -f2`
+ if [ "x$VERSION" = "x" ]; then
+ VERSION=$REVISION
+ RELEASE=1
+ fi
+ sed -e "s/APU_VERSION/$VERSION/" -e "s/APU_RELEASE/$RELEASE/" \
+ ./build/rpm/apr-util.spec.in > apr-util.spec
+fi
+
diff --git a/contrib/apr-util/config.layout b/contrib/apr-util/config.layout
new file mode 100644
index 000000000000..907d0bb11693
--- /dev/null
+++ b/contrib/apr-util/config.layout
@@ -0,0 +1,232 @@
+##
+## config.layout -- Pre-defined Installation Path Layouts
+##
+## Hints:
+## - layouts can be loaded with configure's --enable-layout=ID option
+## - when no --enable-layout option is given, the default layout is `apr'
+## - a trailing plus character (`+') on paths is replaced with a
+## `/<target>' suffix where <target> is currently hardcoded to 'apr'.
+## (This may become a configurable parameter at some point.)
+##
+
+# Classical APR-util path layout designed for parallel installs.
+<Layout apr-util>
+ prefix: /usr/local/apr
+ exec_prefix: ${prefix}
+ bindir: ${exec_prefix}/bin
+ sbindir: ${exec_prefix}/bin
+ libdir: ${exec_prefix}/lib
+ libexecdir: ${exec_prefix}/modules
+ mandir: ${prefix}/man
+ sysconfdir: ${prefix}/conf
+ datadir: ${prefix}
+ installbuilddir: ${datadir}/build
+ includedir: ${prefix}/include/apr-${APRUTIL_MAJOR_VERSION}
+ localstatedir: ${prefix}
+ libsuffix: -${APRUTIL_MAJOR_VERSION}
+</Layout>
+
+# Classical single-installation APR path layout.
+<Layout classic>
+ prefix: /usr/local/apr
+ exec_prefix: ${prefix}
+ bindir: ${exec_prefix}/bin
+ sbindir: ${exec_prefix}/bin
+ libdir: ${exec_prefix}/lib
+ libexecdir: ${exec_prefix}/modules
+ mandir: ${prefix}/man
+ sysconfdir: ${prefix}/conf
+ datadir: ${prefix}
+ installbuilddir: ${datadir}/build
+ includedir: ${prefix}/include
+ localstatedir: ${prefix}
+</Layout>
+
+# GNU standards conforming path layout.
+# See FSF's GNU project `make-stds' document for details.
+<Layout GNU>
+ prefix: /usr/local
+ exec_prefix: ${prefix}
+ bindir: ${exec_prefix}/bin
+ sbindir: ${exec_prefix}/sbin
+ libdir: ${exec_prefix}/lib
+ libexecdir: ${exec_prefix}/libexec
+ mandir: ${prefix}/man
+ sysconfdir: ${prefix}/etc+
+ datadir: ${prefix}/share+
+ installbuilddir: ${datadir}/build
+ includedir: ${prefix}/include+
+ localstatedir: ${prefix}/var+
+ runtimedir: ${localstatedir}/run
+</Layout>
+
+# Mac OS X Server (Rhapsody)
+<Layout Mac OS X Server>
+ prefix: /Local/Library/WebServer
+ exec_prefix: /usr
+ bindir: ${exec_prefix}/bin
+ sbindir: ${exec_prefix}/sbin
+ libdir: ${exec_prefix}/lib
+ libexecdir: /System/Library/apr/Modules
+ mandir: ${exec_prefix}/share/man
+ sysconfdir: ${prefix}/Configuration
+ datadir: ${prefix}
+ installbuilddir: /System/Library/apr/Build
+ includedir: /System/Library/Frameworks/apr.framework/Versions/2.0/Headers
+ localstatedir: /var
+ runtimedir: ${prefix}/Logs
+</Layout>
+
+# Darwin/Mac OS Layout
+<Layout Darwin>
+ prefix: /usr
+ exec_prefix: ${prefix}
+ bindir: ${exec_prefix}/bin
+ sbindir: ${exec_prefix}/sbin
+ libdir: ${exec_prefix}/lib
+ libexecdir: ${exec_prefix}/libexec+
+ mandir: ${prefix}/share/man
+ datadir: /Library/WebServer
+ sysconfdir: /etc+
+ installbuilddir: ${prefix}/share/httpd/build
+ includedir: ${prefix}/include+
+ localstatedir: /var
+ runtimedir: ${localstatedir}/run
+</Layout>
+
+# Red Hat Linux 7.x layout
+<Layout RedHat>
+ prefix: /usr
+ exec_prefix: ${prefix}
+ bindir: ${prefix}/bin
+ sbindir: ${prefix}/sbin
+ libdir: ${prefix}/lib
+ libexecdir: ${prefix}/lib/apr
+ mandir: ${prefix}/man
+ sysconfdir: /etc/httpd/conf
+ datadir: /var/www
+ installbuilddir: ${datadir}/build
+ includedir: ${prefix}/include/apr
+ localstatedir: /var
+ runtimedir: ${localstatedir}/run
+</Layout>
+
+# According to the /opt filesystem conventions
+<Layout opt>
+ prefix: /opt/apr
+ exec_prefix: ${prefix}
+ bindir: ${exec_prefix}/bin
+ sbindir: ${exec_prefix}/sbin
+ libdir: ${exec_prefix}/lib
+ libexecdir: ${exec_prefix}/libexec
+ mandir: ${prefix}/man
+ sysconfdir: /etc${prefix}
+ datadir: ${prefix}/share
+ installbuilddir: ${datadir}/build
+ includedir: ${prefix}/include
+ localstatedir: /var${prefix}
+ runtimedir: ${localstatedir}/run
+</Layout>
+
+# BeOS layout...
+<Layout beos>
+ prefix: /boot/home/apr
+ exec_prefix: ${prefix}
+ bindir: ${exec_prefix}/bin
+ sbindir: ${exec_prefix}/bin
+ libdir: ${exec_prefix}/lib
+ libexecdir: ${exec_prefix}/libexec
+ mandir: ${prefix}/man
+ sysconfdir: ${prefix}/conf
+ datadir: ${prefix}
+ installbuilddir: ${datadir}/build
+ includedir: ${prefix}/include
+ localstatedir: ${prefix}
+ runtimedir: ${localstatedir}/logs
+</Layout>
+
+# SuSE 6.x layout
+<Layout SuSE>
+ prefix: /usr
+ exec_prefix: ${prefix}
+ bindir: ${prefix}/bin
+ sbindir: ${prefix}/sbin
+ libdir: ${prefix}/lib
+ libexecdir: ${prefix}/lib/apr
+ mandir: ${prefix}/share/man
+ sysconfdir: /etc/httpd
+ datadir: /usr/local/httpd
+ installbuilddir: ${datadir}/build
+ includedir: ${prefix}/include/apr
+ localstatedir: /var/lib/httpd
+ runtimedir: /var/run
+</Layout>
+
+# BSD/OS layout
+<Layout BSDI>
+ prefix: /var/www
+ exec_prefix: /usr/contrib
+ bindir: ${exec_prefix}/bin
+ sbindir: ${exec_prefix}/bin
+ libdir: ${exec_prefix}/lib
+ libexecdir: ${exec_prefix}/libexec/apr
+ mandir: ${exec_prefix}/man
+ sysconfdir: ${prefix}/conf
+ datadir: ${prefix}
+ installbuilddir: ${datadir}/build
+ includedir: ${exec_prefix}/include/apr
+ localstatedir: /var
+ runtimedir: ${localstatedir}/run
+</Layout>
+
+# Solaris 8 Layout
+<Layout Solaris>
+ prefix: /usr/apr
+ exec_prefix: ${prefix}
+ bindir: ${exec_prefix}/bin
+ sbindir: ${exec_prefix}/bin
+ libdir: ${exec_prefix}/lib
+ libexecdir: ${exec_prefix}/libexec
+ mandir: ${exec_prefix}/man
+ sysconfdir: /etc/apr
+ datadir: /var/apr
+ installbuilddir: ${datadir}/build
+ includedir: ${exec_prefix}/include
+ localstatedir: ${prefix}
+ runtimedir: /var/run
+</Layout>
+
+# OpenBSD Layout
+<Layout OpenBSD>
+ prefix: /var/www
+ exec_prefix: /usr
+ bindir: ${exec_prefix}/bin
+ sbindir: ${exec_prefix}/sbin
+ libdir: ${exec_prefix}/lib
+ libexecdir: ${exec_prefix}/lib/apr/modules
+ mandir: ${exec_prefix}/share/man
+ sysconfdir: ${prefix}/conf
+ datadir: ${prefix}
+ installbuilddir: ${prefix}/build
+ includedir: ${exec_prefix}/lib/apr/include
+ localstatedir: ${prefix}
+ runtimedir: ${prefix}/logs
+</Layout>
+
+# Debian layout
+<Layout Debian>
+ prefix:
+ exec_prefix: ${prefix}/usr
+ bindir: ${exec_prefix}/bin
+ sbindir: ${exec_prefix}/sbin
+ libdir: ${exec_prefix}/lib
+ libexecdir: ${exec_prefix}/lib/apr/modules
+ mandir: ${exec_prefix}/share/man
+ datadir: ${exec_prefix}/share/apr
+ includedir: ${exec_prefix}/include/apr-${APRUTIL_MAJOR_VERSION}
+ localstatedir: ${prefix}/var/run
+ runtimedir: ${prefix}/var/run
+ infodir: ${exec_prefix}/share/info
+ libsuffix: -${APRUTIL_MAJOR_VERSION}
+ installbuilddir: ${prefix}/usr/share/apache2/build
+</Layout>
diff --git a/contrib/apr-util/configure b/contrib/apr-util/configure
new file mode 100755
index 000000000000..8ddd0e88f058
--- /dev/null
+++ b/contrib/apr-util/configure
@@ -0,0 +1,25672 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.69.
+#
+#
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# Use a proper internal environment variable to ensure we don't fall
+ # into an infinite loop, continuously re-executing ourselves.
+ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+ _as_can_reexec=no; export _as_can_reexec;
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+ fi
+ # We don't want this to propagate to other subprocesses.
+ { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+ as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '\${1+\"\$@\"}'='\"\$@\"'
+ setopt NO_GLOB_SUBST
+else
+ case \`(set -o) 2>/dev/null\` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+"
+ as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+ exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
+ as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+ as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+ eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+ test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+ if (eval "$as_required") 2>/dev/null; then :
+ as_have_required=yes
+else
+ as_have_required=no
+fi
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ as_found=:
+ case $as_dir in #(
+ /*)
+ for as_base in sh bash ksh sh5; do
+ # Try only shells that exist, to save several forks.
+ as_shell=$as_dir/$as_base
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ CONFIG_SHELL=$as_shell as_have_required=yes
+ if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ break 2
+fi
+fi
+ done;;
+ esac
+ as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+ if test "x$CONFIG_SHELL" != x; then :
+ export CONFIG_SHELL
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+ if test x$as_have_required = xno; then :
+ $as_echo "$0: This script requires a shell more modern than all"
+ $as_echo "$0: the shells that I found on your system."
+ if test x${ZSH_VERSION+set} = xset ; then
+ $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+ else
+ $as_echo "$0: Please tell bug-autoconf@gnu.org about your system,
+$0: including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+ fi
+ exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+ as_lineno_1=$LINENO as_lineno_1a=$LINENO
+ as_lineno_2=$LINENO as_lineno_2a=$LINENO
+ eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+ test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+ # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+ # already done that, so ensure we don't try to do so again and fall
+ # in an infinite loop. This has already happened in practice.
+ _as_can_reexec=no; export _as_can_reexec
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+PACKAGE_URL=
+
+ac_unique_file="export_vars.sh.in"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='LTLIBOBJS
+LIBOBJS
+INCLUDE_OUTPUTS
+INCLUDE_RULES
+APRUTIL_LIBS
+APRUTIL_LDFLAGS
+APRUTIL_INCLUDES
+APRUTIL_PRIV_INCLUDES
+APRUTIL_EXPORT_LIBS
+EXTRA_OBJECTS
+APU_MODULES
+APU_DSO_LIBDIR
+APU_HAVE_MODULES
+APRUTIL_LIBNAME
+lib_target
+so_ext
+have_apr_iconv
+have_iconv
+APR_XML_DIR
+apu_dbd_tests
+LDADD_dbd_odbc
+apu_have_odbc
+ODBC_CONFIG
+LDADD_dbd_freetds
+apu_have_freetds
+LDADD_dbd_oracle
+apu_have_oracle
+LDADD_dbd_sqlite2
+apu_have_sqlite2
+LDADD_dbd_sqlite3
+apu_have_sqlite3
+LDADD_dbd_mysql
+apu_have_mysql
+MYSQL_CONFIG
+LDADD_dbd_pgsql
+apu_have_pgsql
+PGSQL_CONFIG
+LDADD_dbm_ndbm
+LDADD_dbm_gdbm
+LDADD_dbm_db
+apu_db_version
+apu_db_header
+apu_have_db
+apu_have_ndbm
+apu_have_gdbm
+apu_have_sdbm
+apu_use_db
+apu_use_ndbm
+apu_use_gdbm
+apu_use_sdbm
+LDADD_ldap
+apu_has_ldap_other
+apu_has_ldap_zos
+apu_has_ldap_tivoli
+apu_has_ldap_mozilla
+apu_has_ldap_netscape
+apu_has_ldap_microsoft
+apu_has_ldap_novell
+apu_has_ldap_solaris
+apu_has_ldap_openldap
+apu_has_ldap
+apu_has_ldapssl_install_routines
+apu_has_ldap_sslinit
+apu_has_ldapssl_init
+apu_has_ldap_start_tls_s
+apu_has_ldapssl_add_trusted_cert
+apu_has_ldapssl_client_deinit
+apu_has_ldapssl_client_init
+ldap_ssl_h
+lber_h
+ldap_h
+LDADD_crypto_nss
+apu_have_nss
+PKG_CONFIG
+apu_have_crypto
+LDADD_crypto_openssl
+apu_have_openssl
+EGREP
+GREP
+CPP
+APR_ICONV_DIR
+apr_shlibpath_var
+APR_BUILD_DIR
+APR_LIBS
+APR_INCLUDES
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+APU_LTVERSION
+APRUTIL_MAJOR_VERSION
+APRUTIL_DOTTED_VERSION
+abs_builddir
+abs_srcdir
+top_builddir
+LT_NO_INSTALL
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_os
+target_vendor
+target_cpu
+target
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+APU_CONFIG_LOCATION
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_layout
+with_apr
+with_apr_iconv
+with_crypto
+with_openssl
+with_nss
+with_lber
+with_ldap_include
+with_ldap_lib
+with_ldap
+with_dbm
+with_gdbm
+with_ndbm
+with_berkeley_db
+with_pgsql
+with_mysql
+with_sqlite3
+with_sqlite2
+with_oracle_include
+with_oracle
+with_freetds
+with_odbc
+with_expat
+with_iconv
+enable_util_dso
+'
+ ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval $ac_prev=\$ac_option
+ ac_prev=
+ continue
+ fi
+
+ case $ac_option in
+ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+ *=) ac_optarg= ;;
+ *) ac_optarg=yes ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_dashdash$ac_option in
+ --)
+ ac_dashdash=yes ;;
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=*)
+ datadir=$ac_optarg ;;
+
+ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+ | --dataroo | --dataro | --datar)
+ ac_prev=datarootdir ;;
+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+ datarootdir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=no ;;
+
+ -docdir | --docdir | --docdi | --doc | --do)
+ ac_prev=docdir ;;
+ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+ docdir=$ac_optarg ;;
+
+ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+ ac_prev=dvidir ;;
+ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+ dvidir=$ac_optarg ;;
+
+ -enable-* | --enable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=\$ac_optarg ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+ ac_prev=htmldir ;;
+ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+ | --ht=*)
+ htmldir=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localedir | --localedir | --localedi | --localed | --locale)
+ ac_prev=localedir ;;
+ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+ localedir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst | --locals)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+ ac_prev=pdfdir ;;
+ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+ pdfdir=$ac_optarg ;;
+
+ -psdir | --psdir | --psdi | --psd | --ps)
+ ac_prev=psdir ;;
+ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+ psdir=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=\$ac_optarg ;;
+
+ -without-* | --without-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=no ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ case $ac_envvar in #(
+ '' | [0-9]* | *[!_$as_cr_alnum]* )
+ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+ esac
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+ case $enable_option_checking in
+ no) ;;
+ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+ *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
+ datadir sysconfdir sharedstatedir localstatedir includedir \
+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+ libdir localedir mandir
+do
+ eval ac_val=\$$ac_var
+ # Remove trailing slashes.
+ case $ac_val in
+ */ )
+ ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+ eval $ac_var=\$ac_val;;
+ esac
+ # Be sure to have absolute directory names.
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+ as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+ as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then the parent directory.
+ ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_myself" : 'X\(//\)[^/]' \| \
+ X"$as_myself" : 'X\(//\)$' \| \
+ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r "$srcdir/$ac_unique_file"; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+ pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+ srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+ eval ac_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_env_${ac_var}_value=\$${ac_var}
+ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking ...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+ --infodir=DIR info documentation [DATAROOTDIR/info]
+ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
+ --mandir=DIR man documentation [DATAROOTDIR/man]
+ --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE]
+ --htmldir=DIR html documentation [DOCDIR]
+ --dvidir=DIR dvi documentation [DOCDIR]
+ --pdfdir=DIR pdf documentation [DOCDIR]
+ --psdir=DIR ps documentation [DOCDIR]
+_ACEOF
+
+ cat <<\_ACEOF
+
+System types:
+ --build=BUILD configure for building on BUILD [guessed]
+ --host=HOST cross-compile to build programs to run on HOST [BUILD]
+ --target=TARGET configure for building compilers for TARGET [HOST]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-option-checking ignore unrecognized --enable/--with options
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --enable-layout=LAYOUT
+ --disable-util-dso disable DSO build of modular components (crypto,
+ dbd, dbm, ldap)
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-apr=PATH prefix for installed APR or the full path to
+ apr-config
+ --with-apr-iconv=DIR relative path to apr-iconv source
+ --with-crypto enable crypto support
+ --with-openssl=DIR specify location of OpenSSL
+ --with-nss=DIR specify location of NSS
+ --with-lber=library lber library to use
+ --with-ldap-include=path path to ldap include files with trailing slash
+ --with-ldap-lib=path path to ldap lib file
+ --with-ldap=library ldap library to use
+ --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
+ --with-gdbm=DIR enable GDBM support
+ --with-ndbm=PATH Find the NDBM header and library in `PATH/include'
+ and `PATH/lib'. If PATH is of the form `HEADER:LIB',
+ then search for header files in HEADER, and the
+ library in LIB. If you omit the `=PATH' part
+ completely, the configure script will search for
+ NDBM in a number of standard places.
+ --with-berkeley-db=PATH Find the Berkeley DB header and library in
+ `PATH/include' and `PATH/lib'. If PATH is of the
+ form `HEADER:LIB', then search for header files in
+ HEADER, and the library in LIB. If you omit the
+ `=PATH' part completely, the configure script will
+ search for Berkeley DB in a number of standard
+ places.
+ --with-pgsql=DIR specify PostgreSQL location
+ --with-mysql=DIR enable MySQL DBD driver
+ --with-sqlite3=DIR enable sqlite3 DBD driver
+ --with-sqlite2=DIR enable sqlite2 DBD driver
+ --with-oracle-include=DIR
+ path to Oracle include files
+ --with-oracle=DIR enable Oracle DBD driver; giving ORACLE_HOME as DIR
+ --with-freetds=DIR specify FreeTDS location
+ --with-odbc=DIR specify ODBC location
+ --with-expat=DIR specify Expat location, or 'builtin'
+ --with-iconv=DIR path to iconv installation
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ LIBS libraries to pass to the linker, e.g. -l<library>
+ CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+ you have headers in a nonstandard directory <include dir>
+ CPP C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to the package provider.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d "$ac_dir" ||
+ { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+ continue
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+ cd "$ac_dir" || { ac_status=$?; continue; }
+ # Check for guested configure.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+ elif test -f "$ac_srcdir/configure"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure" --help=recursive
+ else
+ $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi || ac_status=$?
+ cd "$ac_pwd" || { ac_status=$?; break; }
+ done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+ cat <<\_ACEOF
+configure
+generated by GNU Autoconf 2.69
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } > conftest.i && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_c_check_header_mongrel ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if eval \${$3+:} false; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_header_compiler=yes
+else
+ ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <$2>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ ac_header_preproc=yes
+else
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+ yes:no: )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+ ;;
+ no:yes:* )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+ ;;
+esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_mongrel
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: program exited with status $ac_status" >&5
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=$ac_status
+fi
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES
+# ---------------------------------------------
+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
+# accordingly.
+ac_fn_c_check_decl ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ as_decl_name=`echo $2|sed 's/ *(.*//'`
+ as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
+$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+#ifndef $as_decl_name
+#ifdef __cplusplus
+ (void) $as_decl_use;
+#else
+ (void) $as_decl_name;
+#endif
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_decl
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $2 (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.69. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ $as_echo "PATH: $as_dir"
+ done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *\'*)
+ ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+ 2)
+ as_fn_append ac_configure_args1 " '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ as_fn_append ac_configure_args " '$ac_arg'"
+ ;;
+ esac
+ done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+(
+ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+ (set) 2>&1 |
+ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ sed -n \
+ "s/'\''/'\''\\\\'\'''\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+ ;; #(
+ *)
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+)
+ echo
+
+ $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ $as_echo "$as_me: caught signal $ac_signal"
+ $as_echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core core.conftest.* &&
+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+ # We do not want a PATH search for config.site.
+ case $CONFIG_SITE in #((
+ -*) ac_site_file1=./$CONFIG_SITE;;
+ */*) ac_site_file1=$CONFIG_SITE;;
+ *) ac_site_file1=./$CONFIG_SITE;;
+ esac
+elif test "x$prefix" != xNONE; then
+ ac_site_file1=$prefix/share/config.site
+ ac_site_file2=$prefix/etc/config.site
+else
+ ac_site_file1=$ac_default_prefix/share/config.site
+ ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+ test "x$ac_site_file" = xNONE && continue
+ if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file" \
+ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special files
+ # actually), so we avoid doing that. DJGPP emulates it as a regular file.
+ if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val=\$ac_cv_env_${ac_var}_value
+ eval ac_new_val=\$ac_env_${ac_var}_value
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ # differences in whitespace do not lead to failure.
+ ac_old_val_w=`echo x $ac_old_val`
+ ac_new_val_w=`echo x $ac_new_val`
+ if test "$ac_old_val_w" != "$ac_new_val_w"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ ac_cache_corrupted=:
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ eval $ac_var=\$ac_old_val
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+ac_config_headers="$ac_config_headers include/private/apu_config.h"
+
+ac_aux_dir=
+for ac_dir in build "$srcdir"/build; do
+ if test -f "$ac_dir/install-sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f "$ac_dir/install.sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f "$ac_dir/shtool"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ as_fn_error $? "cannot find install-sh, install.sh, or shtool in build \"$srcdir\"/build" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ rm -f config.nice
+ cat >config.nice<<EOF
+#! /bin/sh
+#
+# Created by configure
+
+EOF
+ if test -n "$CC"; then
+ echo "CC=\"$CC\"; export CC" >> config.nice
+ fi
+ if test -n "$CFLAGS"; then
+ echo "CFLAGS=\"$CFLAGS\"; export CFLAGS" >> config.nice
+ fi
+ if test -n "$CPPFLAGS"; then
+ echo "CPPFLAGS=\"$CPPFLAGS\"; export CPPFLAGS" >> config.nice
+ fi
+ if test -n "$LDFLAGS"; then
+ echo "LDFLAGS=\"$LDFLAGS\"; export LDFLAGS" >> config.nice
+ fi
+ if test -n "$LTFLAGS"; then
+ echo "LTFLAGS=\"$LTFLAGS\"; export LTFLAGS" >> config.nice
+ fi
+ if test -n "$LIBS"; then
+ echo "LIBS=\"$LIBS\"; export LIBS" >> config.nice
+ fi
+ if test -n "$INCLUDES"; then
+ echo "INCLUDES=\"$INCLUDES\"; export INCLUDES" >> config.nice
+ fi
+ if test -n "$NOTEST_CFLAGS"; then
+ echo "NOTEST_CFLAGS=\"$NOTEST_CFLAGS\"; export NOTEST_CFLAGS" >> config.nice
+ fi
+ if test -n "$NOTEST_CPPFLAGS"; then
+ echo "NOTEST_CPPFLAGS=\"$NOTEST_CPPFLAGS\"; export NOTEST_CPPFLAGS" >> config.nice
+ fi
+ if test -n "$NOTEST_LDFLAGS"; then
+ echo "NOTEST_LDFLAGS=\"$NOTEST_LDFLAGS\"; export NOTEST_LDFLAGS" >> config.nice
+ fi
+ if test -n "$NOTEST_LIBS"; then
+ echo "NOTEST_LIBS=\"$NOTEST_LIBS\"; export NOTEST_LIBS" >> config.nice
+ fi
+
+ # Retrieve command-line arguments.
+ eval "set x $0 $ac_configure_args"
+ shift
+
+ for arg
+ do
+
+ap_last=
+ap_cur="$arg"
+while test "x${ap_cur}" != "x${ap_last}";
+do
+ ap_last="${ap_cur}"
+ ap_cur=`eval "echo ${ap_cur}"`
+done
+arg="${ap_cur}"
+
+ echo "\"$arg\" \\" >> config.nice
+ done
+ echo '"$@"' >> config.nice
+ chmod +x config.nice
+
+
+
+abs_srcdir=`(cd $srcdir && pwd)`
+abs_builddir=`pwd`
+
+if test "$abs_builddir" != "$abs_srcdir"; then
+ USE_VPATH=1
+ APU_CONFIG_LOCATION=build
+else
+ APU_CONFIG_LOCATION=source
+fi
+
+
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+ as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+ ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+ as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "x$host_alias" = x; then
+ ac_cv_host=$ac_cv_build
+else
+ ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
+$as_echo_n "checking target system type... " >&6; }
+if ${ac_cv_target+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "x$target_alias" = x; then
+ ac_cv_target=$ac_cv_host
+else
+ ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` ||
+ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
+$as_echo "$ac_cv_target" >&6; }
+case $ac_cv_target in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
+esac
+target=$ac_cv_target
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_target
+shift
+target_cpu=$1
+target_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+target_os=$*
+IFS=$ac_save_IFS
+case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
+
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+test -n "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+ ./ | .// | /[cC]/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ rm -rf conftest.one conftest.two conftest.dir
+ echo one > conftest.one
+ echo two > conftest.two
+ mkdir conftest.dir
+ if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+ test -s conftest.one && test -s conftest.two &&
+ test -s conftest.dir/conftest.one &&
+ test -s conftest.dir/conftest.two
+ then
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+
+ done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ INSTALL=$ac_install_sh
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+
+# Use -no-install or -no-fast-install to link the test
+# programs on all platforms but Darwin, where it would cause
+# the programs to be linked against installed versions of
+# libapr instead of those just built.
+case $host in
+ *-apple-darwin*)
+ LT_NO_INSTALL=""
+ ;;
+ *-mingw*)
+ LT_NO_INSTALL="-no-fast-install"
+ ;;
+ *)
+ LT_NO_INSTALL="-no-install"
+ ;;
+esac
+
+
+top_builddir="$abs_builddir"
+
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mkdir -p" >&5
+$as_echo_n "checking for working mkdir -p... " >&6; }
+if ${ac_cv_mkdir_p+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ test -d conftestdir && rm -rf conftestdir
+ mkdir -p conftestdir/somedir >/dev/null 2>&1
+ if test -d conftestdir/somedir; then
+ ac_cv_mkdir_p=yes
+ else
+ ac_cv_mkdir_p=no
+ fi
+ rm -rf conftestdir
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_mkdir_p" >&5
+$as_echo "$ac_cv_mkdir_p" >&6; }
+ if test "$ac_cv_mkdir_p" = "yes"; then
+ mkdir_p="mkdir -p"
+ else
+ mkdir_p="$abs_srcdir/build/mkdir.sh"
+ fi
+
+
+get_version="$abs_srcdir/build/get-version.sh"
+version_hdr="$abs_srcdir/include/apu_version.h"
+APRUTIL_MAJOR_VERSION="`$get_version major $version_hdr APU`"
+APRUTIL_DOTTED_VERSION="`$get_version all $version_hdr APU`"
+
+APU_LTVERSION="-version-info `$get_version libtool $version_hdr APU`"
+
+
+
+
+
+echo "APR-util Version: ${APRUTIL_DOTTED_VERSION}"
+
+
+# Check whether --enable-layout was given.
+if test "${enable_layout+set}" = set; then :
+ enableval=$enable_layout;
+ LAYOUT=$enableval
+
+fi
+
+
+if test -z "$LAYOUT"; then
+ LAYOUT="apr-util"
+fi
+
+ if test ! -f $srcdir/config.layout; then
+ echo "** Error: Layout file $srcdir/config.layout not found"
+ echo "** Error: Cannot use undefined layout '$LAYOUT'"
+ exit 1
+ fi
+ # Catch layout names including a slash which will otherwise
+ # confuse the heck out of the sed script.
+ case $LAYOUT in
+ */*)
+ echo "** Error: $LAYOUT is not a valid layout name"
+ exit 1 ;;
+ esac
+ pldconf=./config.pld
+
+ sed -e "1s/[ ]*<[lL]ayout[ ]*$LAYOUT[ ]*>[ ]*//;1t" \
+ -e "1,/[ ]*<[lL]ayout[ ]*$LAYOUT[ ]*>[ ]*/d" \
+ -e '/[ ]*<\/Layout>[ ]*/,$d' \
+ -e "s/^[ ]*//g" \
+ -e "s/:[ ]*/=\'/g" \
+ -e "s/[ ]*$/'/g" \
+ $srcdir/config.layout > $pldconf
+ layout_name=$LAYOUT
+ if test ! -s $pldconf; then
+ echo "** Error: unable to find layout $layout_name"
+ exit 1
+ fi
+ . $pldconf
+ rm $pldconf
+ for var in prefix exec_prefix bindir sbindir libexecdir mandir \
+ sysconfdir datadir includedir localstatedir runtimedir \
+ logfiledir libdir installbuilddir libsuffix ; do
+ eval "val=\"\$$var\""
+ case $val in
+ *+)
+ val=`echo $val | sed -e 's;\+$;;'`
+ eval "$var=\"\$val\""
+ autosuffix=yes
+ ;;
+ *)
+ autosuffix=no
+ ;;
+ esac
+ val=`echo $val | sed -e 's:\(.\)/*$:\1:'`
+ val=`echo $val | sed -e 's:[\$]\([a-z_]*\):$\1:g'`
+ if test "$autosuffix" = "yes"; then
+ if echo $val | grep apache >/dev/null; then
+ addtarget=no
+ else
+ addtarget=yes
+ fi
+ if test "$addtarget" = "yes"; then
+ val="$val/apache2"
+ fi
+ fi
+ eval "$var='$val'"
+ done
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for chosen layout" >&5
+$as_echo_n "checking for chosen layout... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $layout_name" >&5
+$as_echo "$layout_name" >&6; }
+
+
+ac_prev=
+# Retrieve the command-line arguments. The eval is needed because
+# the arguments are quoted to preserve accuracy.
+eval "set x $ac_configure_args"
+shift
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+ case $ac_option in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir="$ac_optarg" ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir="$ac_optarg" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix="$ac_optarg" ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir="$ac_optarg" ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir="$ac_optarg" ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir="$ac_optarg" ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir="$ac_optarg" ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir="$ac_optarg" ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir="$ac_optarg" ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix="$ac_optarg" ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir="$ac_optarg" ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir="$ac_optarg" ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir="$ac_optarg" ;;
+
+ esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+ *) as_fn_error $? "expected an absolute path for --$ac_var: $ac_val" "$LINENO" 5;;
+ esac
+done
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ fi
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl.exe
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl.exe
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CC" && break
+done
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+ esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link_default") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile. We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+ then :; else
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ fi
+ # We set ac_cv_exeext here because the later test for it is not
+ # safe: cross compilers may not add the suffix if given an `-o'
+ # argument, so we may need to know it at that point already.
+ # Even if this section looks crufty: it has the advantage of
+ # actually working.
+ break;;
+ * )
+ break;;
+ esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+ ac_file=''
+fi
+if test -z "$ac_file"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+ { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if { ac_try='./conftest$ac_cv_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ for ac_file in conftest.o conftest.obj conftest.*; do
+ test -f "$ac_file" || continue;
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_compiler_gnu=yes
+else
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_save_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ ac_cv_prog_cc_g=no
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_g=yes
+else
+ CFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not '\xHH' hex character constants.
+ These don't provoke an error unfortunately, instead are silently treated
+ as 'x'. The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
+ array size at least. It's necessary to write '\x00'==0 to get something
+ that's true only with -std. */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+ test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+ x)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+ xno)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+ *)
+ CC="$CC $ac_cv_prog_cc_c89"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+if test "x$apu_preload_done" != "xyes" ; then
+ apu_preload_done="yes"
+
+ echo "Applying apr-util hints file rules for $host"
+
+ case "$host" in
+ *-dec-osf*)
+
+ if test -z "$apu_crypt_threadsafe"; then
+ test "x$silent" != "xyes" && echo " setting apu_crypt_threadsafe to \"1\""
+ apu_crypt_threadsafe="1"
+ fi
+
+ ;;
+ *-hp-hpux11.*)
+
+ if test -z "$apu_crypt_threadsafe"; then
+ test "x$silent" != "xyes" && echo " setting apu_crypt_threadsafe to \"1\""
+ apu_crypt_threadsafe="1"
+ fi
+
+ ;;
+ *-ibm-aix4*|*-ibm-aix5.1*)
+
+ if test -z "$apu_iconv_inbuf_const"; then
+ test "x$silent" != "xyes" && echo " setting apu_iconv_inbuf_const to \"1\""
+ apu_iconv_inbuf_const="1"
+ fi
+
+ ;;
+ *-ibm-os390)
+
+ if test -z "$apu_crypt_threadsafe"; then
+ test "x$silent" != "xyes" && echo " setting apu_crypt_threadsafe to \"1\""
+ apu_crypt_threadsafe="1"
+ fi
+
+ ;;
+ *-solaris2*)
+
+ if test -z "$apu_iconv_inbuf_const"; then
+ test "x$silent" != "xyes" && echo " setting apu_iconv_inbuf_const to \"1\""
+ apu_iconv_inbuf_const="1"
+ fi
+
+
+ if test -z "$apu_crypt_threadsafe"; then
+ test "x$silent" != "xyes" && echo " setting apu_crypt_threadsafe to \"1\""
+ apu_crypt_threadsafe="1"
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing fdatasync" >&5
+$as_echo_n "checking for library containing fdatasync... " >&6; }
+if ${ac_cv_search_fdatasync+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char fdatasync ();
+int
+main ()
+{
+return fdatasync ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' rt posix4; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_search_fdatasync=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_fdatasync+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_fdatasync+:} false; then :
+
+else
+ ac_cv_search_fdatasync=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_fdatasync" >&5
+$as_echo "$ac_cv_search_fdatasync" >&6; }
+ac_res=$ac_cv_search_fdatasync
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+ ;;
+ *-sco3.2v5*)
+
+ if test -z "$apu_db_xtra_libs"; then
+ test "x$silent" != "xyes" && echo " setting apu_db_xtra_libs to \"-lsocket\""
+ apu_db_xtra_libs="-lsocket"
+ fi
+
+ ;;
+ esac
+
+fi
+
+
+
+APRUTIL_INCLUDES=""
+APRUTIL_PRIV_INCLUDES="-I$top_builddir/include -I$top_builddir/include/private"
+if test -n "$USE_VPATH"; then
+ APRUTIL_PRIV_INCLUDES="$APRUTIL_PRIV_INCLUDES -I$abs_srcdir/include/private -I$abs_srcdir/include"
+fi
+
+
+
+
+ apr_found="no"
+
+ if test "$target_os" = "os2-emx"; then
+ # Scripts don't pass test -x on OS/2
+ TEST_X="test -f"
+ else
+ TEST_X="test -x"
+ fi
+
+ acceptable_majors="1"
+
+ apr_temp_acceptable_apr_config=""
+ for apr_temp_major in $acceptable_majors
+ do
+ case $apr_temp_major in
+ 0)
+ apr_temp_acceptable_apr_config="$apr_temp_acceptable_apr_config apr-config"
+ ;;
+ *)
+ apr_temp_acceptable_apr_config="$apr_temp_acceptable_apr_config apr-$apr_temp_major-config"
+ ;;
+ esac
+ done
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for APR" >&5
+$as_echo_n "checking for APR... " >&6; }
+
+# Check whether --with-apr was given.
+if test "${with_apr+set}" = set; then :
+ withval=$with_apr;
+ if test "$withval" = "no" || test "$withval" = "yes"; then
+ as_fn_error $? "--with-apr requires a directory or file to be provided" "$LINENO" 5
+ fi
+
+ for apr_temp_apr_config_file in $apr_temp_acceptable_apr_config
+ do
+ for lookdir in "$withval/bin" "$withval"
+ do
+ if $TEST_X "$lookdir/$apr_temp_apr_config_file"; then
+ apr_config="$lookdir/$apr_temp_apr_config_file"
+
+ apr_found="yes"
+ break 2
+ fi
+ done
+ done
+
+ if test "$apr_found" != "yes" && $TEST_X "$withval" && $withval --help > /dev/null 2>&1 ; then
+ apr_config="$withval"
+ apr_found="yes"
+ fi
+
+ if test "$apr_found" != "yes"; then
+ as_fn_error $? "the --with-apr parameter is incorrect. It must specify an install prefix, a build directory, or an apr-config file." "$LINENO" 5
+ fi
+
+else
+
+ if test -n "" && test "" = "1"; then
+ for apr_temp_apr_config_file in $apr_temp_acceptable_apr_config
+ do
+ if $apr_temp_apr_config_file --help > /dev/null 2>&1 ; then
+ apr_config="$apr_temp_apr_config_file"
+
+ apr_found="yes"
+ break
+ else
+ for lookdir in /usr /usr/local /usr/local/apr /opt/apr; do
+ if $TEST_X "$lookdir/bin/$apr_temp_apr_config_file"; then
+ apr_config="$lookdir/bin/$apr_temp_apr_config_file"
+
+ apr_found="yes"
+ break 2
+ fi
+ done
+ fi
+ done
+ fi
+ if test "$apr_found" = "no" && test -d ""; then
+ apr_temp_abs_srcdir="`cd \"\" && pwd`"
+ apr_found="reconfig"
+ apr_bundled_major="`sed -n '/#define.*APR_MAJOR_VERSION/s/^[^0-9]*\([0-9]*\).*$/\1/p' \"/include/apr_version.h\"`"
+ case $apr_bundled_major in
+ "")
+ as_fn_error $? "failed to find major version of bundled APR" "$LINENO" 5
+ ;;
+ 0)
+ apr_temp_apr_config_file="apr-config"
+ ;;
+ *)
+ apr_temp_apr_config_file="apr-$apr_bundled_major-config"
+ ;;
+ esac
+ if test -n ""; then
+ apr_config="/$apr_temp_apr_config_file"
+ else
+ apr_config="/$apr_temp_apr_config_file"
+ fi
+ fi
+
+fi
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $apr_found" >&5
+$as_echo "$apr_found" >&6; }
+
+ if test "$apr_found" = "no"; then
+ as_fn_error $? "APR could not be located. Please use the --with-apr option." "$LINENO" 5
+ fi
+
+ APR_BUILD_DIR="`$apr_config --installbuilddir`"
+
+ APR_BUILD_DIR="`cd $APR_BUILD_DIR && pwd`"
+
+ APR_INCLUDES="`$apr_config --includes`"
+ APR_LIBS="`$apr_config --link-libtool --libs`"
+ APR_SO_EXT="`$apr_config --apr-so-ext`"
+ APR_LIB_TARGET="`$apr_config --apr-lib-target`"
+
+
+
+
+
+
+
+ if test -z "$CC"; then
+ test "x$silent" != "xyes" && echo " setting CC to \"`$apr_config --cc`\""
+ CC="`$apr_config --cc`"
+ fi
+
+
+ if test -z "$CPP"; then
+ test "x$silent" != "xyes" && echo " setting CPP to \"`$apr_config --cpp`\""
+ CPP="`$apr_config --cpp`"
+ fi
+
+
+ if test "x$CFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting CFLAGS to \"`$apr_config --cflags`\""
+ CFLAGS="`$apr_config --cflags`"
+ else
+ apr_addto_bugger="`$apr_config --cflags`"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $CFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to CFLAGS"
+ CFLAGS="$CFLAGS $i"
+ fi
+ done
+ fi
+
+
+ if test "x$CPPFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"`$apr_config --cppflags`\""
+ CPPFLAGS="`$apr_config --cppflags`"
+ else
+ apr_addto_bugger="`$apr_config --cppflags`"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $CPPFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $i"
+ fi
+ done
+ fi
+
+apr_shlibpath_var=`$apr_config --shlib-path-var`
+
+
+
+# Check whether --with-apr-iconv was given.
+if test "${with_apr_iconv+set}" = set; then :
+ withval=$with_apr_iconv; apu_apriconv_dir="$withval"
+ if test "$apu_apriconv_dir" != "no"; then
+ if test -d "$apu_apriconv_dir"; then
+
+ # save our work to this point; this allows the sub-package to use it
+ cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+
+ (set) 2>&1 |
+ case $as_nl`(ac_space=' '; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ # `set' does not quote correctly, so add quotes: double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \.
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;; #(
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+) |
+ sed '
+ /^ac_cv_env_/b end
+ t clear
+ :clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+ if test "x$cache_file" != "x/dev/null"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+ if test ! -f "$cache_file" || test -h "$cache_file"; then
+ cat confcache >"$cache_file"
+ else
+ case $cache_file in #(
+ */* | ?:*)
+ mv -f confcache "$cache_file"$$ &&
+ mv -f "$cache_file"$$ "$cache_file" ;; #(
+ *)
+ mv -f confcache "$cache_file" ;;
+ esac
+ fi
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ fi
+fi
+rm -f confcache
+
+ echo "configuring package in "$apu_apriconv_dir" now"
+ ac_popdir=`pwd`
+ apr_config_subdirs=""$apu_apriconv_dir""
+ test -d "$apu_apriconv_dir" || $mkdir_p "$apu_apriconv_dir"
+ ac_abs_srcdir=`(cd $srcdir/"$apu_apriconv_dir" && pwd)`
+ cd "$apu_apriconv_dir"
+
+ # A "../" for each directory in /$config_subdirs.
+ ac_dots=`echo $apr_config_subdirs|sed -e 's%^\./%%' -e 's%[^/]$%&/%' -e 's%[^/]*/%../%g'`
+
+ # Make the cache file pathname absolute for the subdirs
+ # required to correctly handle subdirs that might actually
+ # be symlinks
+ case "$cache_file" in
+ /*) # already absolute
+ ac_sub_cache_file=$cache_file ;;
+ *) # Was relative path.
+ ac_sub_cache_file="$ac_popdir/$cache_file" ;;
+ esac
+
+
+ apr_configure_args=
+ apr_sep=
+ for apr_configure_arg in $ac_configure_args
+ do
+ case "$apr_configure_arg" in
+ --enable-layout=*|\'--enable-layout=*)
+ continue ;;
+ esac
+ apr_configure_args="$apr_configure_args$apr_sep'$apr_configure_arg'"
+ apr_sep=" "
+ done
+
+
+ test "x$silent" = "xyes" && apr_configure_args="$apr_configure_args --silent"
+
+ apr_configure_args="--disable-option-checking $apr_configure_args"
+
+ if eval $SHELL $ac_abs_srcdir/configure $apr_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_abs_srcdir $apache_apr_flags \
+ --prefix=$prefix \
+ --exec-prefix=$exec_prefix \
+ --libdir=$libdir \
+ --includedir=$includedir \
+ --bindir=$bindir \
+ --datadir=$datadir \
+ --with-installbuilddir=$installbuilddir
+ then :
+ echo ""$apu_apriconv_dir" configured properly"
+ else
+ echo "configure failed for "$apu_apriconv_dir""
+ exit 1
+ fi
+
+ cd $ac_popdir
+
+ # grab any updates from the sub-package
+ if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special files
+ # actually), so we avoid doing that. DJGPP emulates it as a regular file.
+ if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+
+ APRUTIL_EXPORT_LIBS="$abs_srcdir/$apu_apriconv_dir/lib/libapriconv.la \
+ $APRUTIL_EXPORT_LIBS"
+ APRUTIL_INCLUDES="-I$abs_srcdir/$apu_apriconv_dir/include \
+ $APRUTIL_INCLUDES"
+ APR_ICONV_DIR="$apu_apriconv_dir"
+ else
+ APR_ICONV_DIR=""
+ fi
+ else
+ APR_ICONV_DIR=""
+ fi
+
+fi
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if ${ac_cv_prog_CPP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ # Double quotes because CPP needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$GREP"; then
+ ac_path_GREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in grep ggrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+ # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'GREP' >> "conftest.nl"
+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_GREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_GREP="$ac_path_GREP"
+ ac_path_GREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_GREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_GREP"; then
+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ if test -z "$EGREP"; then
+ ac_path_EGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in egrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP="$ac_path_EGREP"
+ ac_path_EGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_EGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_EGREP=$EGREP
+fi
+
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_header_stdc=yes
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then :
+ :
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ return 2;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ inttypes.h stdint.h unistd.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+ apu_have_crypto=0
+ apu_have_openssl=0
+ apu_have_nss=0
+
+ old_libs="$LIBS"
+ old_cppflags="$CPPFLAGS"
+ old_ldflags="$LDFLAGS"
+
+
+# Check whether --with-crypto was given.
+if test "${with_crypto+set}" = set; then :
+ withval=$with_crypto;
+ cryptolibs="openssl nss"
+
+ if test "$withval" = "yes"; then
+
+ crypto_library_enabled=0
+ for cryptolib in $cryptolibs; do
+ eval v=\$with_$cryptolib
+ if test "$v" != "" -a "$v" != "no"; then
+ crypto_library_enabled=1
+ fi
+ done
+
+ if test "$crypto_library_enabled" = "0"; then
+ for cryptolib in $cryptolibs; do
+ eval v=\$with_$cryptolib
+ if test "$v" != "no"; then
+ eval with_$cryptolib=yes
+ crypto_library_enabled=1
+ fi
+ done
+ if test "$crypto_library_enabled" = "1"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Crypto was requested but no crypto library was found; autodetecting possible libraries" >&5
+$as_echo "$as_me: Crypto was requested but no crypto library was found; autodetecting possible libraries" >&6;}
+ else
+ as_fn_error $? "Crypto was requested but all possible crypto libraries were disabled." "$LINENO" 5
+ fi
+ fi
+
+
+ openssl_have_headers=0
+ openssl_have_libs=0
+
+ old_libs="$LIBS"
+ old_cppflags="$CPPFLAGS"
+ old_ldflags="$LDFLAGS"
+
+
+# Check whether --with-openssl was given.
+if test "${with_openssl+set}" = set; then :
+ withval=$with_openssl;
+ if test "$withval" = "yes"; then
+ for ac_header in openssl/x509.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "openssl/x509.h" "ac_cv_header_openssl_x509_h" "$ac_includes_default"
+if test "x$ac_cv_header_openssl_x509_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_OPENSSL_X509_H 1
+_ACEOF
+ openssl_have_headers=1
+fi
+
+done
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BN_init in -lcrypto" >&5
+$as_echo_n "checking for BN_init in -lcrypto... " >&6; }
+if ${ac_cv_lib_crypto_BN_init+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcrypto $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char BN_init ();
+int
+main ()
+{
+return BN_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_crypto_BN_init=yes
+else
+ ac_cv_lib_crypto_BN_init=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypto_BN_init" >&5
+$as_echo "$ac_cv_lib_crypto_BN_init" >&6; }
+if test "x$ac_cv_lib_crypto_BN_init" = xyes; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SSL_accept in -lssl" >&5
+$as_echo_n "checking for SSL_accept in -lssl... " >&6; }
+if ${ac_cv_lib_ssl_SSL_accept+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lssl -lcrypto $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char SSL_accept ();
+int
+main ()
+{
+return SSL_accept ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_ssl_SSL_accept=yes
+else
+ ac_cv_lib_ssl_SSL_accept=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ssl_SSL_accept" >&5
+$as_echo "$ac_cv_lib_ssl_SSL_accept" >&6; }
+if test "x$ac_cv_lib_ssl_SSL_accept" = xyes; then :
+ openssl_have_libs=1
+fi
+
+fi
+
+ if test "$openssl_have_headers" != "0" && test "$openssl_have_libs" != "0"; 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 "
+
+
+ if test "x$CPPFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"$openssl_CPPFLAGS\""
+ CPPFLAGS="$openssl_CPPFLAGS"
+ else
+ apr_addto_bugger="$openssl_CPPFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $CPPFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $i"
+ fi
+ done
+ fi
+
+
+ if test "x$LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$openssl_LDFLAGS\""
+ LDFLAGS="$openssl_LDFLAGS"
+ else
+ apr_addto_bugger="$openssl_LDFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS"
+ LDFLAGS="$LDFLAGS $i"
+ fi
+ done
+ fi
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for openssl in $withval" >&5
+$as_echo "$as_me: checking for openssl in $withval" >&6;}
+ for ac_header in openssl/x509.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "openssl/x509.h" "ac_cv_header_openssl_x509_h" "$ac_includes_default"
+if test "x$ac_cv_header_openssl_x509_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_OPENSSL_X509_H 1
+_ACEOF
+ openssl_have_headers=1
+fi
+
+done
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BN_init in -lcrypto" >&5
+$as_echo_n "checking for BN_init in -lcrypto... " >&6; }
+if ${ac_cv_lib_crypto_BN_init+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcrypto $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char BN_init ();
+int
+main ()
+{
+return BN_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_crypto_BN_init=yes
+else
+ ac_cv_lib_crypto_BN_init=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypto_BN_init" >&5
+$as_echo "$ac_cv_lib_crypto_BN_init" >&6; }
+if test "x$ac_cv_lib_crypto_BN_init" = xyes; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SSL_accept in -lssl" >&5
+$as_echo_n "checking for SSL_accept in -lssl... " >&6; }
+if ${ac_cv_lib_ssl_SSL_accept+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lssl -lcrypto $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char SSL_accept ();
+int
+main ()
+{
+return SSL_accept ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_ssl_SSL_accept=yes
+else
+ ac_cv_lib_ssl_SSL_accept=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ssl_SSL_accept" >&5
+$as_echo "$ac_cv_lib_ssl_SSL_accept" >&6; }
+if test "x$ac_cv_lib_ssl_SSL_accept" = xyes; then :
+ openssl_have_libs=1
+fi
+
+fi
+
+ if test "$openssl_have_headers" != "0" && test "$openssl_have_libs" != "0"; then
+ apu_have_openssl=1
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$withval/lib\""
+ APRUTIL_LDFLAGS="-L$withval/lib"
+ else
+ apr_addto_bugger="-L$withval/lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$withval/include\""
+ APRUTIL_INCLUDES="-I$withval/include"
+ else
+ apr_addto_bugger="-I$withval/include"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+ fi
+
+ if test "$apu_have_openssl" != "1"; then
+ for ac_header in openssl/x509.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "openssl/x509.h" "ac_cv_header_openssl_x509_h" "$ac_includes_default"
+if test "x$ac_cv_header_openssl_x509_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_OPENSSL_X509_H 1
+_ACEOF
+ openssl_have_headers=1
+fi
+
+done
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BN_init in -lcrypto" >&5
+$as_echo_n "checking for BN_init in -lcrypto... " >&6; }
+if ${ac_cv_lib_crypto_BN_init+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcrypto $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char BN_init ();
+int
+main ()
+{
+return BN_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_crypto_BN_init=yes
+else
+ ac_cv_lib_crypto_BN_init=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypto_BN_init" >&5
+$as_echo "$ac_cv_lib_crypto_BN_init" >&6; }
+if test "x$ac_cv_lib_crypto_BN_init" = xyes; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SSL_accept in -lssl" >&5
+$as_echo_n "checking for SSL_accept in -lssl... " >&6; }
+if ${ac_cv_lib_ssl_SSL_accept+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lssl -lcrypto $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char SSL_accept ();
+int
+main ()
+{
+return SSL_accept ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_ssl_SSL_accept=yes
+else
+ ac_cv_lib_ssl_SSL_accept=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ssl_SSL_accept" >&5
+$as_echo "$ac_cv_lib_ssl_SSL_accept" >&6; }
+if test "x$ac_cv_lib_ssl_SSL_accept" = xyes; then :
+ openssl_have_libs=1
+fi
+
+fi
+
+ if test "$openssl_have_headers" != "0" && test "$openssl_have_libs" != "0"; then
+ apu_have_openssl=1
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$withval/lib\""
+ APRUTIL_LDFLAGS="-L$withval/lib"
+ else
+ apr_addto_bugger="-L$withval/lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$withval/include\""
+ APRUTIL_INCLUDES="-I$withval/include"
+ else
+ apr_addto_bugger="-I$withval/include"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+ fi
+ fi
+
+ ac_fn_c_check_decl "$LINENO" "EVP_PKEY_CTX_new" "ac_cv_have_decl_EVP_PKEY_CTX_new" "#include <openssl/evp.h>
+"
+if test "x$ac_cv_have_decl_EVP_PKEY_CTX_new" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_EVP_PKEY_CTX_NEW $ac_have_decl
+_ACEOF
+
+
+ fi
+
+else
+
+ apu_have_openssl=0
+
+fi
+
+
+
+
+ if test "$apu_have_openssl" = "1"; then
+
+ if test "x$LDADD_crypto_openssl" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDADD_crypto_openssl to \"$openssl_LDFLAGS -lssl -lcrypto\""
+ LDADD_crypto_openssl="$openssl_LDFLAGS -lssl -lcrypto"
+ else
+ apr_addto_bugger="$openssl_LDFLAGS -lssl -lcrypto"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDADD_crypto_openssl; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDADD_crypto_openssl"
+ LDADD_crypto_openssl="$LDADD_crypto_openssl $i"
+ fi
+ done
+ fi
+
+ apu_have_crypto=1
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for const input buffers in OpenSSL" >&5
+$as_echo_n "checking for const input buffers in OpenSSL... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <openssl/rsa.h>
+int
+main ()
+{
+ const unsigned char * buf;
+ unsigned char * outbuf;
+ RSA rsa;
+
+ RSA_private_decrypt(1,
+ buf,
+ outbuf,
+ &rsa,
+ RSA_PKCS1_PADDING);
+
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define CRYPTO_OPENSSL_CONST_BUFFERS 1" >>confdefs.h
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+ fi
+
+
+
+ LIBS="$old_libs"
+ CPPFLAGS="$old_cppflags"
+ LDFLAGS="$old_ldflags"
+
+
+ nss_have_libs=0
+
+ old_libs="$LIBS"
+ old_cppflags="$CPPFLAGS"
+ old_ldflags="$LDFLAGS"
+
+
+# Check whether --with-nss was given.
+if test "${with_nss+set}" = set; then :
+ withval=$with_nss;
+ if test "$withval" = "yes"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PKG_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $PKG_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+ ac_pt_PKG_CONFIG=$PKG_CONFIG
+ # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $ac_pt_PKG_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
+$as_echo "$ac_pt_PKG_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_pt_PKG_CONFIG" = x; then
+ PKG_CONFIG=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ PKG_CONFIG=$ac_pt_PKG_CONFIG
+ fi
+else
+ PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+ if test -n "$PKG_CONFIG"; then
+ nss_CPPFLAGS=`$PKG_CONFIG --cflags-only-I nss`
+ nss_LDFLAGS=`$PKG_CONFIG --libs nss`
+
+ if test "x$CPPFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"$nss_CPPFLAGS\""
+ CPPFLAGS="$nss_CPPFLAGS"
+ else
+ apr_addto_bugger="$nss_CPPFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $CPPFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $i"
+ fi
+ done
+ fi
+
+
+ if test "x$LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$nss_LDFLAGS\""
+ LDFLAGS="$nss_LDFLAGS"
+ else
+ apr_addto_bugger="$nss_LDFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS"
+ LDFLAGS="$LDFLAGS $i"
+ fi
+ done
+ fi
+
+ fi
+ nss_have_prerrorh=0
+ nss_have_nssh=0
+ nss_have_pk11pubh=0
+ for ac_header in prerror.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "prerror.h" "ac_cv_header_prerror_h" "$ac_includes_default"
+if test "x$ac_cv_header_prerror_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_PRERROR_H 1
+_ACEOF
+ nss_have_prerrorh=1
+fi
+
+done
+
+ for ac_header in nss/nss.h nss.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+ nss_have_nssh=1
+fi
+
+done
+
+ for ac_header in nss/pk11pub.h pk11pub.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+ nss_have_pk11pubh=1
+fi
+
+done
+
+ nss_have_headers=${nss_have_prerrorh}${nss_have_nssh}${nss_have_pk11pubh}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PR_Initialize in -lnspr4" >&5
+$as_echo_n "checking for PR_Initialize in -lnspr4... " >&6; }
+if ${ac_cv_lib_nspr4_PR_Initialize+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnspr4 $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char PR_Initialize ();
+int
+main ()
+{
+return PR_Initialize ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_nspr4_PR_Initialize=yes
+else
+ ac_cv_lib_nspr4_PR_Initialize=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nspr4_PR_Initialize" >&5
+$as_echo "$ac_cv_lib_nspr4_PR_Initialize" >&6; }
+if test "x$ac_cv_lib_nspr4_PR_Initialize" = xyes; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PK11_CreatePBEV2AlgorithmID in -lnss3" >&5
+$as_echo_n "checking for PK11_CreatePBEV2AlgorithmID in -lnss3... " >&6; }
+if ${ac_cv_lib_nss3_PK11_CreatePBEV2AlgorithmID+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnss3 -lnspr4 $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char PK11_CreatePBEV2AlgorithmID ();
+int
+main ()
+{
+return PK11_CreatePBEV2AlgorithmID ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_nss3_PK11_CreatePBEV2AlgorithmID=yes
+else
+ ac_cv_lib_nss3_PK11_CreatePBEV2AlgorithmID=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nss3_PK11_CreatePBEV2AlgorithmID" >&5
+$as_echo "$ac_cv_lib_nss3_PK11_CreatePBEV2AlgorithmID" >&6; }
+if test "x$ac_cv_lib_nss3_PK11_CreatePBEV2AlgorithmID" = xyes; then :
+ nss_have_libs=1
+fi
+
+fi
+
+ if test "$nss_have_headers" = "111" && test "$nss_have_libs" != "0"; then
+ apu_have_nss=1
+ fi
+ elif test "$withval" = "no"; then
+ apu_have_nss=0
+ elif test "x$withval" != "x"; then
+
+ nss_CPPFLAGS="-I$withval/include/nss -I$withval/include/nss3 -I$withval/include/nspr -I$withval/include/nspr4 -I$withval/include -I$withval/../public"
+ nss_LDFLAGS="-L$withval/lib "
+
+
+ if test "x$CPPFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"$nss_CPPFLAGS\""
+ CPPFLAGS="$nss_CPPFLAGS"
+ else
+ apr_addto_bugger="$nss_CPPFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $CPPFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $i"
+ fi
+ done
+ fi
+
+
+ if test "x$LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$nss_LDFLAGS\""
+ LDFLAGS="$nss_LDFLAGS"
+ else
+ apr_addto_bugger="$nss_LDFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS"
+ LDFLAGS="$LDFLAGS $i"
+ fi
+ done
+ fi
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nss in $withval" >&5
+$as_echo "$as_me: checking for nss in $withval" >&6;}
+ nss_have_prerrorh=0
+ nss_have_nssh=0
+ nss_have_pk11pubh=0
+ for ac_header in prerror.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "prerror.h" "ac_cv_header_prerror_h" "$ac_includes_default"
+if test "x$ac_cv_header_prerror_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_PRERROR_H 1
+_ACEOF
+ nss_have_prerrorh=1
+fi
+
+done
+
+ for ac_header in nss/nss.h nss.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+ nss_have_nssh=1
+fi
+
+done
+
+ for ac_header in nss/pk11pub.h pk11pub.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+ nss_have_pk11pubh=1
+fi
+
+done
+
+ nss_have_headers=${nss_have_prerrorh}${nss_have_nssh}${nss_have_pk11pubh}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PR_Initialize in -lnspr4" >&5
+$as_echo_n "checking for PR_Initialize in -lnspr4... " >&6; }
+if ${ac_cv_lib_nspr4_PR_Initialize+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnspr4 $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char PR_Initialize ();
+int
+main ()
+{
+return PR_Initialize ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_nspr4_PR_Initialize=yes
+else
+ ac_cv_lib_nspr4_PR_Initialize=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nspr4_PR_Initialize" >&5
+$as_echo "$ac_cv_lib_nspr4_PR_Initialize" >&6; }
+if test "x$ac_cv_lib_nspr4_PR_Initialize" = xyes; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PK11_CreatePBEV2AlgorithmID in -lnss3" >&5
+$as_echo_n "checking for PK11_CreatePBEV2AlgorithmID in -lnss3... " >&6; }
+if ${ac_cv_lib_nss3_PK11_CreatePBEV2AlgorithmID+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnss3 -lnspr4 $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char PK11_CreatePBEV2AlgorithmID ();
+int
+main ()
+{
+return PK11_CreatePBEV2AlgorithmID ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_nss3_PK11_CreatePBEV2AlgorithmID=yes
+else
+ ac_cv_lib_nss3_PK11_CreatePBEV2AlgorithmID=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nss3_PK11_CreatePBEV2AlgorithmID" >&5
+$as_echo "$ac_cv_lib_nss3_PK11_CreatePBEV2AlgorithmID" >&6; }
+if test "x$ac_cv_lib_nss3_PK11_CreatePBEV2AlgorithmID" = xyes; then :
+ nss_have_libs=1
+fi
+
+fi
+
+ if test "$nss_have_headers" = "111" && test "$nss_have_libs" != "0"; then
+ apu_have_nss=1
+ fi
+
+ fi
+ if test "$apu_have_nss" != "0"; then
+
+ if test "x$APRUTIL_PRIV_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_PRIV_INCLUDES to \"$nss_CPPFLAGS\""
+ APRUTIL_PRIV_INCLUDES="$nss_CPPFLAGS"
+ else
+ apr_addto_bugger="$nss_CPPFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_PRIV_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_PRIV_INCLUDES"
+ APRUTIL_PRIV_INCLUDES="$APRUTIL_PRIV_INCLUDES $i"
+ fi
+ done
+ fi
+
+ fi
+
+else
+
+ apu_have_nss=0
+
+fi
+
+
+
+
+ if test "$apu_have_nss" = "1"; then
+
+ if test "x$LDADD_crypto_nss" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDADD_crypto_nss to \"$nss_LDFLAGS -lnspr4 -lnss3\""
+ LDADD_crypto_nss="$nss_LDFLAGS -lnspr4 -lnss3"
+ else
+ apr_addto_bugger="$nss_LDFLAGS -lnspr4 -lnss3"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDADD_crypto_nss; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDADD_crypto_nss"
+ LDADD_crypto_nss="$LDADD_crypto_nss $i"
+ fi
+ done
+ fi
+
+ apu_have_crypto=1
+ fi
+
+
+
+ LIBS="$old_libs"
+ CPPFLAGS="$old_cppflags"
+ LDFLAGS="$old_ldflags"
+
+ if test "$apu_have_crypto" = "0"; then
+ as_fn_error $? "Crypto was requested but no crypto library could be enabled; specify the location of a crypto library using --with-openssl, --with-nss, etc." "$LINENO" 5
+ fi
+ fi
+
+else
+
+ apu_have_crypto=0
+
+fi
+
+
+
+
+
+
+
+echo $ac_n "${nl}checking for ldap support..."
+
+apu_has_ldap="0";
+apu_has_ldapssl_client_init="0"
+apu_has_ldapssl_client_deinit="0"
+apu_has_ldapssl_add_trusted_cert="0"
+apu_has_ldap_start_tls_s="0"
+apu_has_ldapssl_init="0"
+apu_has_ldap_sslinit="0"
+apu_has_ldapssl_install_routines="0"
+apu_has_ldap_openldap="0"
+apu_has_ldap_solaris="0"
+apu_has_ldap_novell="0"
+apu_has_ldap_microsoft="0"
+apu_has_ldap_netscape="0"
+apu_has_ldap_mozilla="0"
+apu_has_ldap_tivoli="0"
+apu_has_ldap_zos="0"
+apu_has_ldap_other="0"
+LDADD_ldap_found=""
+
+
+# Check whether --with-lber was given.
+if test "${with_lber+set}" = set; then :
+ withval=$with_lber;
+ if test "$withval" = "yes"; then
+ apu_liblber_name="lber"
+ else
+ apu_liblber_name="$withval"
+ fi
+
+else
+
+ apu_liblber_name="lber"
+
+fi
+
+
+
+# Check whether --with-ldap-include was given.
+if test "${with_ldap_include+set}" = set; then :
+ withval=$with_ldap_include;
+fi
+
+
+# Check whether --with-ldap-lib was given.
+if test "${with_ldap_lib+set}" = set; then :
+ withval=$with_ldap_lib;
+fi
+
+
+# Check whether --with-ldap was given.
+if test "${with_ldap+set}" = set; then :
+ withval=$with_ldap;
+ if test "$with_ldap" != "no"; then
+ save_cppflags="$CPPFLAGS"
+ save_ldflags="$LDFLAGS"
+ save_libs="$LIBS"
+ if test -n "$with_ldap_include"; then
+ CPPFLAGS="$CPPFLAGS -I$with_ldap_include"
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$with_ldap_include\""
+ APRUTIL_INCLUDES="-I$with_ldap_include"
+ else
+ apr_addto_bugger="-I$with_ldap_include"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+ fi
+ if test -n "$with_ldap_lib"; then
+ LDFLAGS="$LDFLAGS -L$with_ldap_lib"
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$with_ldap_lib\""
+ APRUTIL_LDFLAGS="-L$with_ldap_lib"
+ else
+ apr_addto_bugger="-L$with_ldap_lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ fi
+
+ LIBLDAP="$withval"
+ if test "$LIBLDAP" = "yes"; then
+
+ if test ${apu_has_ldap} != "1"; then
+ ldaplib="ldap50"
+ extralib="-lnspr4 -lplc4 -lplds4 -liutil50 -llber50 -lldif50 -lnss3 -lprldap50 -lssl3 -lssldap50"
+ # Clear the cache entry for subsequent APU_FIND_LDAPLIB invocations.
+
+ ldaplib_cache_id="`echo $ldaplib | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+ unset ac_cv_lib_${ldaplib_cache_id}_ldap_init
+ unset ac_cv_lib_${ldaplib_cache_id}___ldap_init
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_init ();
+int
+main ()
+{
+return ldap_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+
+ LDADD_ldap_found="-l${ldaplib} ${extralib}"
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_client_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_client_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_client_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_client_init ();
+int
+main ()
+{
+return ldapssl_client_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_client_init="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_client_deinit" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_client_deinit in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_client_deinit in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_client_deinit ();
+int
+main ()
+{
+return ldapssl_client_deinit ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_client_deinit="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_add_trusted_cert" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_add_trusted_cert in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_add_trusted_cert in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_add_trusted_cert ();
+int
+main ()
+{
+return ldapssl_add_trusted_cert ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_add_trusted_cert="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_start_tls_s" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_start_tls_s in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_start_tls_s in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_start_tls_s ();
+int
+main ()
+{
+return ldap_start_tls_s ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldap_start_tls_s="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_sslinit" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_sslinit in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_sslinit in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_sslinit ();
+int
+main ()
+{
+return ldap_sslinit ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldap_sslinit="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_init ();
+int
+main ()
+{
+return ldapssl_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_init="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_install_routines" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_install_routines in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_install_routines in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_install_routines ();
+int
+main ()
+{
+return ldapssl_install_routines ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_install_routines="1"
+fi
+
+ apu_has_ldap="1";
+
+fi
+
+ fi
+
+
+ if test ${apu_has_ldap} != "1"; then
+ ldaplib="ldapssl41"
+ extralib="-lnspr3 -lplc3 -lplds3"
+ # Clear the cache entry for subsequent APU_FIND_LDAPLIB invocations.
+
+ ldaplib_cache_id="`echo $ldaplib | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+ unset ac_cv_lib_${ldaplib_cache_id}_ldap_init
+ unset ac_cv_lib_${ldaplib_cache_id}___ldap_init
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_init ();
+int
+main ()
+{
+return ldap_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+
+ LDADD_ldap_found="-l${ldaplib} ${extralib}"
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_client_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_client_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_client_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_client_init ();
+int
+main ()
+{
+return ldapssl_client_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_client_init="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_client_deinit" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_client_deinit in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_client_deinit in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_client_deinit ();
+int
+main ()
+{
+return ldapssl_client_deinit ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_client_deinit="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_add_trusted_cert" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_add_trusted_cert in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_add_trusted_cert in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_add_trusted_cert ();
+int
+main ()
+{
+return ldapssl_add_trusted_cert ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_add_trusted_cert="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_start_tls_s" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_start_tls_s in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_start_tls_s in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_start_tls_s ();
+int
+main ()
+{
+return ldap_start_tls_s ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldap_start_tls_s="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_sslinit" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_sslinit in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_sslinit in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_sslinit ();
+int
+main ()
+{
+return ldap_sslinit ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldap_sslinit="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_init ();
+int
+main ()
+{
+return ldapssl_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_init="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_install_routines" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_install_routines in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_install_routines in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_install_routines ();
+int
+main ()
+{
+return ldapssl_install_routines ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_install_routines="1"
+fi
+
+ apu_has_ldap="1";
+
+fi
+
+ fi
+
+
+ if test ${apu_has_ldap} != "1"; then
+ ldaplib="ldapssl40"
+ extralib=
+ # Clear the cache entry for subsequent APU_FIND_LDAPLIB invocations.
+
+ ldaplib_cache_id="`echo $ldaplib | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+ unset ac_cv_lib_${ldaplib_cache_id}_ldap_init
+ unset ac_cv_lib_${ldaplib_cache_id}___ldap_init
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_init ();
+int
+main ()
+{
+return ldap_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+
+ LDADD_ldap_found="-l${ldaplib} ${extralib}"
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_client_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_client_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_client_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_client_init ();
+int
+main ()
+{
+return ldapssl_client_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_client_init="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_client_deinit" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_client_deinit in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_client_deinit in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_client_deinit ();
+int
+main ()
+{
+return ldapssl_client_deinit ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_client_deinit="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_add_trusted_cert" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_add_trusted_cert in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_add_trusted_cert in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_add_trusted_cert ();
+int
+main ()
+{
+return ldapssl_add_trusted_cert ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_add_trusted_cert="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_start_tls_s" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_start_tls_s in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_start_tls_s in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_start_tls_s ();
+int
+main ()
+{
+return ldap_start_tls_s ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldap_start_tls_s="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_sslinit" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_sslinit in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_sslinit in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_sslinit ();
+int
+main ()
+{
+return ldap_sslinit ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldap_sslinit="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_init ();
+int
+main ()
+{
+return ldapssl_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_init="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_install_routines" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_install_routines in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_install_routines in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_install_routines ();
+int
+main ()
+{
+return ldapssl_install_routines ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_install_routines="1"
+fi
+
+ apu_has_ldap="1";
+
+fi
+
+ fi
+
+
+ if test ${apu_has_ldap} != "1"; then
+ ldaplib="ldapssl30"
+ extralib=
+ # Clear the cache entry for subsequent APU_FIND_LDAPLIB invocations.
+
+ ldaplib_cache_id="`echo $ldaplib | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+ unset ac_cv_lib_${ldaplib_cache_id}_ldap_init
+ unset ac_cv_lib_${ldaplib_cache_id}___ldap_init
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_init ();
+int
+main ()
+{
+return ldap_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+
+ LDADD_ldap_found="-l${ldaplib} ${extralib}"
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_client_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_client_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_client_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_client_init ();
+int
+main ()
+{
+return ldapssl_client_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_client_init="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_client_deinit" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_client_deinit in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_client_deinit in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_client_deinit ();
+int
+main ()
+{
+return ldapssl_client_deinit ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_client_deinit="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_add_trusted_cert" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_add_trusted_cert in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_add_trusted_cert in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_add_trusted_cert ();
+int
+main ()
+{
+return ldapssl_add_trusted_cert ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_add_trusted_cert="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_start_tls_s" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_start_tls_s in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_start_tls_s in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_start_tls_s ();
+int
+main ()
+{
+return ldap_start_tls_s ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldap_start_tls_s="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_sslinit" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_sslinit in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_sslinit in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_sslinit ();
+int
+main ()
+{
+return ldap_sslinit ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldap_sslinit="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_init ();
+int
+main ()
+{
+return ldapssl_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_init="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_install_routines" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_install_routines in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_install_routines in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_install_routines ();
+int
+main ()
+{
+return ldapssl_install_routines ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_install_routines="1"
+fi
+
+ apu_has_ldap="1";
+
+fi
+
+ fi
+
+
+ if test ${apu_has_ldap} != "1"; then
+ ldaplib="ldapssl20"
+ extralib=
+ # Clear the cache entry for subsequent APU_FIND_LDAPLIB invocations.
+
+ ldaplib_cache_id="`echo $ldaplib | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+ unset ac_cv_lib_${ldaplib_cache_id}_ldap_init
+ unset ac_cv_lib_${ldaplib_cache_id}___ldap_init
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_init ();
+int
+main ()
+{
+return ldap_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+
+ LDADD_ldap_found="-l${ldaplib} ${extralib}"
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_client_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_client_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_client_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_client_init ();
+int
+main ()
+{
+return ldapssl_client_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_client_init="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_client_deinit" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_client_deinit in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_client_deinit in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_client_deinit ();
+int
+main ()
+{
+return ldapssl_client_deinit ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_client_deinit="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_add_trusted_cert" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_add_trusted_cert in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_add_trusted_cert in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_add_trusted_cert ();
+int
+main ()
+{
+return ldapssl_add_trusted_cert ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_add_trusted_cert="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_start_tls_s" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_start_tls_s in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_start_tls_s in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_start_tls_s ();
+int
+main ()
+{
+return ldap_start_tls_s ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldap_start_tls_s="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_sslinit" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_sslinit in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_sslinit in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_sslinit ();
+int
+main ()
+{
+return ldap_sslinit ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldap_sslinit="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_init ();
+int
+main ()
+{
+return ldapssl_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_init="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_install_routines" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_install_routines in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_install_routines in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_install_routines ();
+int
+main ()
+{
+return ldapssl_install_routines ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_install_routines="1"
+fi
+
+ apu_has_ldap="1";
+
+fi
+
+ fi
+
+
+ if test ${apu_has_ldap} != "1"; then
+ ldaplib="ldapsdk"
+ extralib="-lldapx -lldapssl -lldapgss -lgssapi_krb5"
+ # Clear the cache entry for subsequent APU_FIND_LDAPLIB invocations.
+
+ ldaplib_cache_id="`echo $ldaplib | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+ unset ac_cv_lib_${ldaplib_cache_id}_ldap_init
+ unset ac_cv_lib_${ldaplib_cache_id}___ldap_init
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_init ();
+int
+main ()
+{
+return ldap_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+
+ LDADD_ldap_found="-l${ldaplib} ${extralib}"
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_client_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_client_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_client_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_client_init ();
+int
+main ()
+{
+return ldapssl_client_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_client_init="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_client_deinit" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_client_deinit in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_client_deinit in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_client_deinit ();
+int
+main ()
+{
+return ldapssl_client_deinit ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_client_deinit="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_add_trusted_cert" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_add_trusted_cert in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_add_trusted_cert in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_add_trusted_cert ();
+int
+main ()
+{
+return ldapssl_add_trusted_cert ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_add_trusted_cert="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_start_tls_s" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_start_tls_s in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_start_tls_s in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_start_tls_s ();
+int
+main ()
+{
+return ldap_start_tls_s ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldap_start_tls_s="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_sslinit" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_sslinit in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_sslinit in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_sslinit ();
+int
+main ()
+{
+return ldap_sslinit ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldap_sslinit="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_init ();
+int
+main ()
+{
+return ldapssl_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_init="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_install_routines" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_install_routines in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_install_routines in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_install_routines ();
+int
+main ()
+{
+return ldapssl_install_routines ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_install_routines="1"
+fi
+
+ apu_has_ldap="1";
+
+fi
+
+ fi
+
+
+ if test ${apu_has_ldap} != "1"; then
+ ldaplib="ldapsdk"
+ extralib="-lldapx -lldapssl -lldapgss -lgss -lresolv -lsocket"
+ # Clear the cache entry for subsequent APU_FIND_LDAPLIB invocations.
+
+ ldaplib_cache_id="`echo $ldaplib | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+ unset ac_cv_lib_${ldaplib_cache_id}_ldap_init
+ unset ac_cv_lib_${ldaplib_cache_id}___ldap_init
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_init ();
+int
+main ()
+{
+return ldap_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+
+ LDADD_ldap_found="-l${ldaplib} ${extralib}"
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_client_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_client_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_client_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_client_init ();
+int
+main ()
+{
+return ldapssl_client_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_client_init="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_client_deinit" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_client_deinit in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_client_deinit in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_client_deinit ();
+int
+main ()
+{
+return ldapssl_client_deinit ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_client_deinit="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_add_trusted_cert" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_add_trusted_cert in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_add_trusted_cert in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_add_trusted_cert ();
+int
+main ()
+{
+return ldapssl_add_trusted_cert ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_add_trusted_cert="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_start_tls_s" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_start_tls_s in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_start_tls_s in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_start_tls_s ();
+int
+main ()
+{
+return ldap_start_tls_s ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldap_start_tls_s="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_sslinit" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_sslinit in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_sslinit in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_sslinit ();
+int
+main ()
+{
+return ldap_sslinit ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldap_sslinit="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_init ();
+int
+main ()
+{
+return ldapssl_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_init="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_install_routines" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_install_routines in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_install_routines in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_install_routines ();
+int
+main ()
+{
+return ldapssl_install_routines ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_install_routines="1"
+fi
+
+ apu_has_ldap="1";
+
+fi
+
+ fi
+
+
+ if test ${apu_has_ldap} != "1"; then
+ ldaplib="ldap"
+ extralib="-llber"
+ # Clear the cache entry for subsequent APU_FIND_LDAPLIB invocations.
+
+ ldaplib_cache_id="`echo $ldaplib | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+ unset ac_cv_lib_${ldaplib_cache_id}_ldap_init
+ unset ac_cv_lib_${ldaplib_cache_id}___ldap_init
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_init ();
+int
+main ()
+{
+return ldap_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+
+ LDADD_ldap_found="-l${ldaplib} ${extralib}"
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_client_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_client_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_client_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_client_init ();
+int
+main ()
+{
+return ldapssl_client_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_client_init="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_client_deinit" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_client_deinit in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_client_deinit in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_client_deinit ();
+int
+main ()
+{
+return ldapssl_client_deinit ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_client_deinit="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_add_trusted_cert" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_add_trusted_cert in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_add_trusted_cert in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_add_trusted_cert ();
+int
+main ()
+{
+return ldapssl_add_trusted_cert ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_add_trusted_cert="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_start_tls_s" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_start_tls_s in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_start_tls_s in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_start_tls_s ();
+int
+main ()
+{
+return ldap_start_tls_s ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldap_start_tls_s="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_sslinit" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_sslinit in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_sslinit in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_sslinit ();
+int
+main ()
+{
+return ldap_sslinit ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldap_sslinit="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_init ();
+int
+main ()
+{
+return ldapssl_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_init="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_install_routines" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_install_routines in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_install_routines in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_install_routines ();
+int
+main ()
+{
+return ldapssl_install_routines ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_install_routines="1"
+fi
+
+ apu_has_ldap="1";
+
+fi
+
+ fi
+
+
+ if test ${apu_has_ldap} != "1"; then
+ ldaplib="ldap"
+ extralib="-llber -lresolv"
+ # Clear the cache entry for subsequent APU_FIND_LDAPLIB invocations.
+
+ ldaplib_cache_id="`echo $ldaplib | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+ unset ac_cv_lib_${ldaplib_cache_id}_ldap_init
+ unset ac_cv_lib_${ldaplib_cache_id}___ldap_init
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_init ();
+int
+main ()
+{
+return ldap_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+
+ LDADD_ldap_found="-l${ldaplib} ${extralib}"
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_client_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_client_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_client_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_client_init ();
+int
+main ()
+{
+return ldapssl_client_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_client_init="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_client_deinit" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_client_deinit in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_client_deinit in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_client_deinit ();
+int
+main ()
+{
+return ldapssl_client_deinit ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_client_deinit="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_add_trusted_cert" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_add_trusted_cert in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_add_trusted_cert in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_add_trusted_cert ();
+int
+main ()
+{
+return ldapssl_add_trusted_cert ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_add_trusted_cert="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_start_tls_s" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_start_tls_s in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_start_tls_s in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_start_tls_s ();
+int
+main ()
+{
+return ldap_start_tls_s ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldap_start_tls_s="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_sslinit" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_sslinit in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_sslinit in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_sslinit ();
+int
+main ()
+{
+return ldap_sslinit ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldap_sslinit="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_init ();
+int
+main ()
+{
+return ldapssl_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_init="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_install_routines" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_install_routines in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_install_routines in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_install_routines ();
+int
+main ()
+{
+return ldapssl_install_routines ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_install_routines="1"
+fi
+
+ apu_has_ldap="1";
+
+fi
+
+ fi
+
+
+ if test ${apu_has_ldap} != "1"; then
+ ldaplib="ldap"
+ extralib="-llber -lresolv -lsocket -lnsl"
+ # Clear the cache entry for subsequent APU_FIND_LDAPLIB invocations.
+
+ ldaplib_cache_id="`echo $ldaplib | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+ unset ac_cv_lib_${ldaplib_cache_id}_ldap_init
+ unset ac_cv_lib_${ldaplib_cache_id}___ldap_init
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_init ();
+int
+main ()
+{
+return ldap_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+
+ LDADD_ldap_found="-l${ldaplib} ${extralib}"
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_client_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_client_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_client_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_client_init ();
+int
+main ()
+{
+return ldapssl_client_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_client_init="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_client_deinit" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_client_deinit in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_client_deinit in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_client_deinit ();
+int
+main ()
+{
+return ldapssl_client_deinit ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_client_deinit="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_add_trusted_cert" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_add_trusted_cert in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_add_trusted_cert in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_add_trusted_cert ();
+int
+main ()
+{
+return ldapssl_add_trusted_cert ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_add_trusted_cert="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_start_tls_s" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_start_tls_s in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_start_tls_s in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_start_tls_s ();
+int
+main ()
+{
+return ldap_start_tls_s ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldap_start_tls_s="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_sslinit" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_sslinit in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_sslinit in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_sslinit ();
+int
+main ()
+{
+return ldap_sslinit ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldap_sslinit="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_init ();
+int
+main ()
+{
+return ldapssl_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_init="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_install_routines" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_install_routines in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_install_routines in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_install_routines ();
+int
+main ()
+{
+return ldapssl_install_routines ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_install_routines="1"
+fi
+
+ apu_has_ldap="1";
+
+fi
+
+ fi
+
+
+ if test ${apu_has_ldap} != "1"; then
+ ldaplib="ldap"
+ extralib="-ldl -lpthread"
+ # Clear the cache entry for subsequent APU_FIND_LDAPLIB invocations.
+
+ ldaplib_cache_id="`echo $ldaplib | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+ unset ac_cv_lib_${ldaplib_cache_id}_ldap_init
+ unset ac_cv_lib_${ldaplib_cache_id}___ldap_init
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_init ();
+int
+main ()
+{
+return ldap_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+
+ LDADD_ldap_found="-l${ldaplib} ${extralib}"
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_client_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_client_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_client_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_client_init ();
+int
+main ()
+{
+return ldapssl_client_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_client_init="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_client_deinit" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_client_deinit in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_client_deinit in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_client_deinit ();
+int
+main ()
+{
+return ldapssl_client_deinit ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_client_deinit="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_add_trusted_cert" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_add_trusted_cert in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_add_trusted_cert in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_add_trusted_cert ();
+int
+main ()
+{
+return ldapssl_add_trusted_cert ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_add_trusted_cert="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_start_tls_s" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_start_tls_s in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_start_tls_s in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_start_tls_s ();
+int
+main ()
+{
+return ldap_start_tls_s ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldap_start_tls_s="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_sslinit" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_sslinit in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_sslinit in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_sslinit ();
+int
+main ()
+{
+return ldap_sslinit ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldap_sslinit="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_init ();
+int
+main ()
+{
+return ldapssl_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_init="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_install_routines" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_install_routines in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_install_routines in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_install_routines ();
+int
+main ()
+{
+return ldapssl_install_routines ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_install_routines="1"
+fi
+
+ apu_has_ldap="1";
+
+fi
+
+ fi
+
+ else
+
+ if test ${apu_has_ldap} != "1"; then
+ ldaplib=$LIBLDAP
+ extralib=
+ # Clear the cache entry for subsequent APU_FIND_LDAPLIB invocations.
+
+ ldaplib_cache_id="`echo $ldaplib | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+ unset ac_cv_lib_${ldaplib_cache_id}_ldap_init
+ unset ac_cv_lib_${ldaplib_cache_id}___ldap_init
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_init ();
+int
+main ()
+{
+return ldap_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+
+ LDADD_ldap_found="-l${ldaplib} ${extralib}"
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_client_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_client_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_client_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_client_init ();
+int
+main ()
+{
+return ldapssl_client_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_client_init="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_client_deinit" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_client_deinit in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_client_deinit in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_client_deinit ();
+int
+main ()
+{
+return ldapssl_client_deinit ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_client_deinit="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_add_trusted_cert" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_add_trusted_cert in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_add_trusted_cert in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_add_trusted_cert ();
+int
+main ()
+{
+return ldapssl_add_trusted_cert ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_add_trusted_cert="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_start_tls_s" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_start_tls_s in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_start_tls_s in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_start_tls_s ();
+int
+main ()
+{
+return ldap_start_tls_s ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldap_start_tls_s="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_sslinit" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_sslinit in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_sslinit in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_sslinit ();
+int
+main ()
+{
+return ldap_sslinit ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldap_sslinit="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_init ();
+int
+main ()
+{
+return ldapssl_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_init="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_install_routines" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_install_routines in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_install_routines in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_install_routines ();
+int
+main ()
+{
+return ldapssl_install_routines ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_install_routines="1"
+fi
+
+ apu_has_ldap="1";
+
+fi
+
+ fi
+
+
+ if test ${apu_has_ldap} != "1"; then
+ ldaplib=$LIBLDAP
+ extralib="-lresolv"
+ # Clear the cache entry for subsequent APU_FIND_LDAPLIB invocations.
+
+ ldaplib_cache_id="`echo $ldaplib | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+ unset ac_cv_lib_${ldaplib_cache_id}_ldap_init
+ unset ac_cv_lib_${ldaplib_cache_id}___ldap_init
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_init ();
+int
+main ()
+{
+return ldap_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+
+ LDADD_ldap_found="-l${ldaplib} ${extralib}"
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_client_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_client_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_client_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_client_init ();
+int
+main ()
+{
+return ldapssl_client_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_client_init="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_client_deinit" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_client_deinit in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_client_deinit in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_client_deinit ();
+int
+main ()
+{
+return ldapssl_client_deinit ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_client_deinit="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_add_trusted_cert" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_add_trusted_cert in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_add_trusted_cert in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_add_trusted_cert ();
+int
+main ()
+{
+return ldapssl_add_trusted_cert ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_add_trusted_cert="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_start_tls_s" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_start_tls_s in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_start_tls_s in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_start_tls_s ();
+int
+main ()
+{
+return ldap_start_tls_s ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldap_start_tls_s="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_sslinit" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_sslinit in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_sslinit in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_sslinit ();
+int
+main ()
+{
+return ldap_sslinit ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldap_sslinit="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_init ();
+int
+main ()
+{
+return ldapssl_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_init="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_install_routines" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_install_routines in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_install_routines in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_install_routines ();
+int
+main ()
+{
+return ldapssl_install_routines ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_install_routines="1"
+fi
+
+ apu_has_ldap="1";
+
+fi
+
+ fi
+
+
+ if test ${apu_has_ldap} != "1"; then
+ ldaplib=$LIBLDAP
+ extralib="-lresolv -lsocket -lnsl"
+ # Clear the cache entry for subsequent APU_FIND_LDAPLIB invocations.
+
+ ldaplib_cache_id="`echo $ldaplib | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+ unset ac_cv_lib_${ldaplib_cache_id}_ldap_init
+ unset ac_cv_lib_${ldaplib_cache_id}___ldap_init
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_init ();
+int
+main ()
+{
+return ldap_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+
+ LDADD_ldap_found="-l${ldaplib} ${extralib}"
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_client_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_client_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_client_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_client_init ();
+int
+main ()
+{
+return ldapssl_client_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_client_init="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_client_deinit" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_client_deinit in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_client_deinit in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_client_deinit ();
+int
+main ()
+{
+return ldapssl_client_deinit ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_client_deinit="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_add_trusted_cert" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_add_trusted_cert in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_add_trusted_cert in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_add_trusted_cert ();
+int
+main ()
+{
+return ldapssl_add_trusted_cert ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_add_trusted_cert="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_start_tls_s" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_start_tls_s in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_start_tls_s in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_start_tls_s ();
+int
+main ()
+{
+return ldap_start_tls_s ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldap_start_tls_s="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_sslinit" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_sslinit in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_sslinit in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_sslinit ();
+int
+main ()
+{
+return ldap_sslinit ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldap_sslinit="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_init ();
+int
+main ()
+{
+return ldapssl_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_init="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_install_routines" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_install_routines in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_install_routines in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_install_routines ();
+int
+main ()
+{
+return ldapssl_install_routines ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_install_routines="1"
+fi
+
+ apu_has_ldap="1";
+
+fi
+
+ fi
+
+
+ if test ${apu_has_ldap} != "1"; then
+ ldaplib=$LIBLDAP
+ extralib="-ldl -lpthread"
+ # Clear the cache entry for subsequent APU_FIND_LDAPLIB invocations.
+
+ ldaplib_cache_id="`echo $ldaplib | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+ unset ac_cv_lib_${ldaplib_cache_id}_ldap_init
+ unset ac_cv_lib_${ldaplib_cache_id}___ldap_init
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_init ();
+int
+main ()
+{
+return ldap_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+
+ LDADD_ldap_found="-l${ldaplib} ${extralib}"
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_client_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_client_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_client_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_client_init ();
+int
+main ()
+{
+return ldapssl_client_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_client_init="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_client_deinit" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_client_deinit in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_client_deinit in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_client_deinit ();
+int
+main ()
+{
+return ldapssl_client_deinit ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_client_deinit="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_add_trusted_cert" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_add_trusted_cert in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_add_trusted_cert in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_add_trusted_cert ();
+int
+main ()
+{
+return ldapssl_add_trusted_cert ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_add_trusted_cert="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_start_tls_s" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_start_tls_s in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_start_tls_s in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_start_tls_s ();
+int
+main ()
+{
+return ldap_start_tls_s ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldap_start_tls_s="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldap_sslinit" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_sslinit in -l${ldaplib}" >&5
+$as_echo_n "checking for ldap_sslinit in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldap_sslinit ();
+int
+main ()
+{
+return ldap_sslinit ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldap_sslinit="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_init in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_init in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_init ();
+int
+main ()
+{
+return ldapssl_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_init="1"
+fi
+
+ as_ac_Lib=`$as_echo "ac_cv_lib_${ldaplib}''_ldapssl_install_routines" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_install_routines in -l${ldaplib}" >&5
+$as_echo_n "checking for ldapssl_install_routines in -l${ldaplib}... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l${ldaplib} ${extralib} $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ldapssl_install_routines ();
+int
+main ()
+{
+return ldapssl_install_routines ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ apu_has_ldapssl_install_routines="1"
+fi
+
+ apu_has_ldap="1";
+
+fi
+
+ fi
+
+ fi
+
+ if test ${apu_has_ldap} != "1"; then
+ as_fn_error $? "could not find an LDAP library" "$LINENO" 5
+ else
+
+ if test "x$LDADD_ldap" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDADD_ldap to \"$LDADD_ldap_found\""
+ LDADD_ldap="$LDADD_ldap_found"
+ else
+ apr_addto_bugger="$LDADD_ldap_found"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDADD_ldap; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDADD_ldap"
+ LDADD_ldap="$LDADD_ldap $i"
+ fi
+ done
+ fi
+
+ fi
+ as_ac_Lib=`$as_echo "ac_cv_lib_$apu_liblber_name''_ber_init" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ber_init in -l$apu_liblber_name" >&5
+$as_echo_n "checking for ber_init in -l$apu_liblber_name... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$apu_liblber_name $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ber_init ();
+int
+main ()
+{
+return ber_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+
+ if test "x$LDADD_ldap" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDADD_ldap to \"-l${apu_liblber_name}\""
+ LDADD_ldap="-l${apu_liblber_name}"
+ else
+ apr_addto_bugger="-l${apu_liblber_name}"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDADD_ldap; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDADD_ldap"
+ LDADD_ldap="$LDADD_ldap $i"
+ fi
+ done
+ fi
+
+fi
+
+
+ for ac_header in lber.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "lber.h" "ac_cv_header_lber_h" "$ac_includes_default"
+if test "x$ac_cv_header_lber_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LBER_H 1
+_ACEOF
+ lber_h="#include <lber.h>"
+fi
+
+done
+
+
+ # Solaris has a problem in <ldap.h> which prevents it from
+ # being included by itself. Check for <ldap.h> manually,
+ # including lber.h first.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap.h" >&5
+$as_echo_n "checking for ldap.h... " >&6; }
+if ${apr_cv_hdr_ldap_h+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef HAVE_LBER_H
+ #include <lber.h>
+ #endif
+ #include <ldap.h>
+
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ apr_cv_hdr_ldap_h=yes
+else
+ apr_cv_hdr_ldap_h=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $apr_cv_hdr_ldap_h" >&5
+$as_echo "$apr_cv_hdr_ldap_h" >&6; }
+ if test "$apr_cv_hdr_ldap_h" = "yes"; then
+ ldap_h="#include <ldap.h>"
+
+$as_echo "#define HAVE_LDAP_H 1" >>confdefs.h
+
+ fi
+
+ for ac_header in ldap_ssl.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "ldap_ssl.h" "ac_cv_header_ldap_ssl_h" "$ac_includes_default"
+if test "x$ac_cv_header_ldap_ssl_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LDAP_SSL_H 1
+_ACEOF
+ ldap_ssl_h="#include <ldap_ssl.h>"
+fi
+
+done
+
+
+ if test "$apr_cv_hdr_ldap_h" = "yes"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LDAP toolkit" >&5
+$as_echo_n "checking for LDAP toolkit... " >&6; }
+if ${apr_cv_ldap_toolkit+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ if test "x$apr_cv_ldap_toolkit" = "x"; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$lber_h
+ $ldap_h
+ LDAP_VENDOR_NAME
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "OpenLDAP" >/dev/null 2>&1; then :
+ apu_has_ldap_openldap="1"
+ apr_cv_ldap_toolkit="OpenLDAP"
+fi
+rm -f conftest*
+
+ fi
+ if test "x$apr_cv_ldap_toolkit" = "x"; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$lber_h
+ $ldap_h
+ LDAP_VENDOR_NAME
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Sun Microsystems Inc." >/dev/null 2>&1; then :
+ apu_has_ldap_solaris="1"
+ apr_cv_ldap_toolkit="Solaris"
+fi
+rm -f conftest*
+
+ fi
+ if test "x$apr_cv_ldap_toolkit" = "x"; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$lber_h
+ $ldap_h
+ LDAP_VENDOR_NAME
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Novell" >/dev/null 2>&1; then :
+ apu_has_ldap_novell="1"
+ apr_cv_ldap_toolkit="Novell"
+fi
+rm -f conftest*
+
+ fi
+ if test "x$apr_cv_ldap_toolkit" = "x"; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$lber_h
+ $ldap_h
+ LDAP_VENDOR_NAME
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Microsoft Corporation." >/dev/null 2>&1; then :
+ apu_has_ldap_microsoft="1"
+ apr_cv_ldap_toolkit="Microsoft"
+fi
+rm -f conftest*
+
+ fi
+ if test "x$apr_cv_ldap_toolkit" = "x"; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$lber_h
+ $ldap_h
+ LDAP_VENDOR_NAME
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Netscape Communications Corp." >/dev/null 2>&1; then :
+ apu_has_ldap_netscape="1"
+ apr_cv_ldap_toolkit="Netscape"
+fi
+rm -f conftest*
+
+ fi
+ if test "x$apr_cv_ldap_toolkit" = "x"; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$lber_h
+ $ldap_h
+ LDAP_VENDOR_NAME
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "mozilla.org" >/dev/null 2>&1; then :
+ apu_has_ldap_mozilla="1"
+ apr_cv_ldap_toolkit="Mozilla"
+fi
+rm -f conftest*
+
+ fi
+ if test "x$apr_cv_ldap_toolkit" = "x"; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$lber_h
+ $ldap_h
+ LDAP_VENDOR_NAME
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "International Business Machines" >/dev/null 2>&1; then :
+ apu_has_ldap_tivoli="1"
+ apr_cv_ldap_toolkit="Tivoli"
+fi
+rm -f conftest*
+
+ fi
+ if test "x$apr_cv_ldap_toolkit" = "x"; then
+ case "$host" in
+ *-ibm-os390)
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$lber_h
+ $ldap_h
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "IBM" >/dev/null 2>&1; then :
+ apu_has_ldap_zos="1"
+ apr_cv_ldap_toolkit="z/OS"
+fi
+rm -f conftest*
+
+ ;;
+ esac
+ fi
+ if test "x$apr_cv_ldap_toolkit" = "x"; then
+ apu_has_ldap_other="1"
+ apr_cv_ldap_toolkit="unknown"
+ fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $apr_cv_ldap_toolkit" >&5
+$as_echo "$apr_cv_ldap_toolkit" >&6; }
+ fi
+
+ CPPFLAGS=$save_cppflags
+ LDFLAGS=$save_ldflags
+ LIBS=$save_libs
+ fi
+
+fi
+
+
+if test "$apu_has_ldap_openldap" = "1"; then
+ save_cppflags="$CPPFLAGS"
+ save_ldflags="$LDFLAGS"
+ save_libs="$LIBS"
+
+ CPPFLAGS="$CPPFLAGS $APRUTIL_INCLUDES"
+ LDFLAGS="$LDFLAGS $APRUTIL_LDFLAGS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking style of ldap_set_rebind_proc routine" >&5
+$as_echo_n "checking style of ldap_set_rebind_proc routine... " >&6; }
+if ${ac_cv_ldap_set_rebind_proc_style+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ apr_save_CFLAGS=$CFLAGS
+ CFLAGS="$CFLAGS $CFLAGS_WARN"
+ if test "$ac_cv_c_compiler_gnu" = "yes"; then
+ CFLAGS="$CFLAGS -Werror"
+ fi
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include "confdefs.h"
+
+
+ #ifdef HAVE_LBER_H
+ #include <lber.h>
+ #endif
+ #ifdef HAVE_LDAP_H
+ #include <ldap.h>
+ #endif
+
+ int main(int argc, const char *const *argv) {
+
+ ldap_set_rebind_proc((LDAP *)0, (LDAP_REBIND_PROC *)0, (void *)0);
+
+ return 0; }
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_ldap_set_rebind_proc_style=three
+else
+ ac_cv_ldap_set_rebind_proc_style=two
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CFLAGS=$apr_save_CFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_ldap_set_rebind_proc_style" >&5
+$as_echo "$ac_cv_ldap_set_rebind_proc_style" >&6; }
+
+ if test "$ac_cv_ldap_set_rebind_proc_style" = "three"; then
+
+$as_echo "#define LDAP_SET_REBIND_PROC_THREE 1" >>confdefs.h
+
+ fi
+
+ CPPFLAGS="$save_cppflags"
+ LDFLAGS="$save_ldflags"
+ LIBS="$save_libs"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ apu_use_sdbm=0
+ apu_use_ndbm=0
+ apu_use_gdbm=0
+ apu_use_db=0
+ apu_have_sdbm=1
+ apu_have_gdbm=0
+ apu_have_ndbm=0
+ apu_have_db=0
+
+ apu_db_header=db.h # default so apu_select_dbm.h is syntactically correct
+ apu_db_version=0
+
+ # Maximum supported version announced in help string.
+ # 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"
+ db_max_version=48
+ db_min_version=41
+ db_version="$db_min_version"
+ while [ $db_version -le $db_max_version ]
+ do
+ dbm_list="$dbm_list, db$db_version"
+ db_version=`expr $db_version + 1`
+ done
+ db_max_version=53
+ db_min_version=50
+ db_version="$db_min_version"
+ while [ $db_version -le $db_max_version ]
+ do
+ dbm_list="$dbm_list, db$db_version"
+ db_version=`expr $db_version + 1`
+ done
+ db_max_version=60
+ db_min_version=60
+ db_version="$db_min_version"
+ while [ $db_version -le $db_max_version ]
+ do
+ dbm_list="$dbm_list, db$db_version"
+ db_version=`expr $db_version + 1`
+ done
+
+
+# Check whether --with-dbm was given.
+if test "${with_dbm+set}" = set; then :
+ withval=$with_dbm;
+ if test "$withval" = "yes"; then
+ as_fn_error $? "--with-dbm needs to specify a DBM type to use.
+ One of: $dbm_list" "$LINENO" 5
+ fi
+ requested="$withval"
+
+else
+
+ requested=default
+
+fi
+
+
+
+# Check whether --with-gdbm was given.
+if test "${with_gdbm+set}" = set; then :
+ withval=$with_gdbm;
+ apu_have_gdbm=0
+ if test "$withval" = "yes"; then
+ ac_fn_c_check_header_mongrel "$LINENO" "gdbm.h" "ac_cv_header_gdbm_h" "$ac_includes_default"
+if test "x$ac_cv_header_gdbm_h" = xyes; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdbm_open in -lgdbm" >&5
+$as_echo_n "checking for gdbm_open in -lgdbm... " >&6; }
+if ${ac_cv_lib_gdbm_gdbm_open+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgdbm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char gdbm_open ();
+int
+main ()
+{
+return gdbm_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_gdbm_gdbm_open=yes
+else
+ ac_cv_lib_gdbm_gdbm_open=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gdbm_gdbm_open" >&5
+$as_echo "$ac_cv_lib_gdbm_gdbm_open" >&6; }
+if test "x$ac_cv_lib_gdbm_gdbm_open" = xyes; then :
+ apu_have_gdbm=1
+fi
+
+fi
+
+
+ elif test "$withval" = "no"; then
+ apu_have_gdbm=0
+ else
+ saved_cppflags="$CPPFLAGS"
+ saved_ldflags="$LDFLAGS"
+ CPPFLAGS="$CPPFLAGS -I$withval/include"
+ LDFLAGS="$LDFLAGS -L$withval/lib "
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking checking for gdbm in $withval" >&5
+$as_echo_n "checking checking for gdbm in $withval... " >&6; }
+ ac_fn_c_check_header_mongrel "$LINENO" "gdbm.h" "ac_cv_header_gdbm_h" "$ac_includes_default"
+if test "x$ac_cv_header_gdbm_h" = xyes; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdbm_open in -lgdbm" >&5
+$as_echo_n "checking for gdbm_open in -lgdbm... " >&6; }
+if ${ac_cv_lib_gdbm_gdbm_open+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgdbm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char gdbm_open ();
+int
+main ()
+{
+return gdbm_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_gdbm_gdbm_open=yes
+else
+ ac_cv_lib_gdbm_gdbm_open=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gdbm_gdbm_open" >&5
+$as_echo "$ac_cv_lib_gdbm_gdbm_open" >&6; }
+if test "x$ac_cv_lib_gdbm_gdbm_open" = xyes; then :
+ apu_have_gdbm=1
+fi
+
+fi
+
+
+ if test "$apu_have_gdbm" != "0"; then
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$withval/lib\""
+ APRUTIL_LDFLAGS="-L$withval/lib"
+ else
+ apr_addto_bugger="-L$withval/lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$withval/include\""
+ APRUTIL_INCLUDES="-I$withval/include"
+ else
+ apr_addto_bugger="-I$withval/include"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+ fi
+ CPPFLAGS="$saved_cppflags"
+ LDFLAGS="$saved_ldflags"
+ fi
+
+fi
+
+
+
+# Check whether --with-ndbm was given.
+if test "${with_ndbm+set}" = set; then :
+ withval=$with_ndbm;
+ apu_have_ndbm=0
+ if test "$withval" = "yes"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking checking for ndbm in the usual places" >&5
+$as_echo_n "checking checking for ndbm in the usual places... " >&6; }
+ apu_want_ndbm=1
+ NDBM_INC=""
+ NDBM_LDFLAGS=""
+ elif test "$withval" = "no"; then
+ apu_want_ndbm=0
+ else
+ apu_want_ndbm=1
+ case "$withval" in
+ *":"*)
+ NDBM_INC="-I`echo $withval |sed -e 's/:.*$//'`"
+ NDBM_LDFLAGS="-L`echo $withval |sed -e 's/^.*://'`"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking checking for ndbm includes with $NDBM_INC libs with $NDBM_LDFLAGS " >&5
+$as_echo_n "checking checking for ndbm includes with $NDBM_INC libs with $NDBM_LDFLAGS ... " >&6; }
+ ;;
+ *)
+ NDBM_INC="-I$withval/include"
+ NDBM_LDFLAGS="-L$withval/lib"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking checking for ndbm includes in $withval" >&5
+$as_echo_n "checking checking for ndbm includes in $withval... " >&6; }
+ ;;
+ esac
+ fi
+
+ save_cppflags="$CPPFLAGS"
+ save_ldflags="$LDFLAGS"
+ CPPFLAGS="$CPPFLAGS $NDBM_INC"
+ LDFLAGS="$LDFLAGS $NDBM_LDFLAGS"
+ if test "$apu_want_ndbm" != "0"; then
+ ac_fn_c_check_header_mongrel "$LINENO" "ndbm.h" "ac_cv_header_ndbm_h" "$ac_includes_default"
+if test "x$ac_cv_header_ndbm_h" = xyes; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dbm_open in -lc" >&5
+$as_echo_n "checking for dbm_open in -lc... " >&6; }
+if ${ac_cv_lib_c_dbm_open+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lc $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dbm_open ();
+int
+main ()
+{
+return dbm_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_c_dbm_open=yes
+else
+ ac_cv_lib_c_dbm_open=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_dbm_open" >&5
+$as_echo "$ac_cv_lib_c_dbm_open" >&6; }
+if test "x$ac_cv_lib_c_dbm_open" = xyes; then :
+ apu_have_ndbm=1;apu_ndbm_lib=c
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dbm_open in -ldbm" >&5
+$as_echo_n "checking for dbm_open in -ldbm... " >&6; }
+if ${ac_cv_lib_dbm_dbm_open+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldbm $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dbm_open ();
+int
+main ()
+{
+return dbm_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_dbm_dbm_open=yes
+else
+ ac_cv_lib_dbm_dbm_open=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dbm_dbm_open" >&5
+$as_echo "$ac_cv_lib_dbm_dbm_open" >&6; }
+if test "x$ac_cv_lib_dbm_dbm_open" = xyes; then :
+ apu_have_ndbm=1;apu_ndbm_lib=dbm
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dbm_open in -ldb" >&5
+$as_echo_n "checking for dbm_open in -ldb... " >&6; }
+if ${ac_cv_lib_db_dbm_open+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldb $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dbm_open ();
+int
+main ()
+{
+return dbm_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_db_dbm_open=yes
+else
+ ac_cv_lib_db_dbm_open=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_db_dbm_open" >&5
+$as_echo "$ac_cv_lib_db_dbm_open" >&6; }
+if test "x$ac_cv_lib_db_dbm_open" = xyes; then :
+ apu_have_ndbm=1;apu_ndbm_lib=db
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __db_ndbm_open in -ldb" >&5
+$as_echo_n "checking for __db_ndbm_open in -ldb... " >&6; }
+if ${ac_cv_lib_db___db_ndbm_open+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldb $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char __db_ndbm_open ();
+int
+main ()
+{
+return __db_ndbm_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_db___db_ndbm_open=yes
+else
+ ac_cv_lib_db___db_ndbm_open=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_db___db_ndbm_open" >&5
+$as_echo "$ac_cv_lib_db___db_ndbm_open" >&6; }
+if test "x$ac_cv_lib_db___db_ndbm_open" = xyes; then :
+ apu_have_ndbm=1;apu_ndbm_lib=db
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+ if test "$apu_have_ndbm" != "0"; then
+ if test "$withval" != "yes"; then
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"$NDBM_INC\""
+ APRUTIL_INCLUDES="$NDBM_INC"
+ else
+ apr_addto_bugger="$NDBM_INC"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"$NDBM_LDFLAGS\""
+ APRUTIL_LDFLAGS="$NDBM_LDFLAGS"
+ else
+ apr_addto_bugger="$NDBM_LDFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ fi
+ elif test "$withval" != "yes"; then
+ as_fn_error $? "NDBM not found in the specified directory" "$LINENO" 5
+ fi
+ fi
+ CPPFLAGS="$save_cppflags"
+ LDFLAGS="$save_ldflags"
+
+else
+
+ apu_have_ndbm=0
+
+fi
+
+
+
+ if test -n "$apu_db_xtra_libs"; then
+ saveddbxtralibs="$LIBS"
+ LIBS="$apu_db_xtra_libs $LIBS"
+ fi
+
+
+# Check whether --with-berkeley-db was given.
+if test "${with_berkeley_db+set}" = set; then :
+ withval=$with_berkeley_db;
+ if test "$withval" = "yes"; then
+ apu_want_db=1
+ user_places=""
+ elif test "$withval" = "no"; then
+ apu_want_db=0
+ else
+ apu_want_db=1
+ user_places="$withval"
+ fi
+
+ if test "$apu_want_db" != "0"; then
+
+ requested=$requested
+ check_places=$user_places
+
+ case "$requested" in
+ db)
+
+ all_places="$check_places"
+
+ # Start version search at version 6.9
+ db_version=69
+ while [ $db_version -ge 40 ]
+ do
+ db_major=`echo $db_version | sed -e 's/.$//'`
+ db_minor=`echo $db_version | sed -e 's/.//'`
+
+ places="$all_places"
+ db_major="$db_major"
+ db_minor="$db_minor"
+ if test -z "$places"; then
+ places="std /usr/local /usr/local/BerkeleyDB.${db_major}.${db_minor} /boot/home/config"
+ fi
+
+ bdb_version="${db_major}"
+ if test ""${db_minor}"" != "-1"; then
+ bdb_version="$bdb_version."${db_minor}""
+ if test ""-1"" != "-1"; then
+ bdb_version="$bdb_version."-1""
+ fi
+ fi
+ bdb_places="$places"
+ bdb_default_search_headers="db${db_major}${db_minor}/db.h db${db_major}/db.h db.h"
+ bdb_default_search_lib_names="db-${db_major}.${db_minor} db${db_major}-${db_major}.${db_minor} db${db_major}${db_minor} db-${db_major} db${db_major} db"
+
+
+ apu_have_db=0
+
+ # Save the original values of the flags we tweak.
+ apu_check_lib_save_libs="$LIBS"
+ apu_check_lib_save_ldflags="$LDFLAGS"
+ apu_check_lib_save_cppflags="$CPPFLAGS"
+
+ # The variable `found' is the prefix under which we've found
+ # Berkeley DB, or `not' if we haven't found it anywhere yet.
+ found=not
+ for bdb_place in $bdb_places; do
+
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+ case "$bdb_place" in
+ "std" )
+ description="the standard places"
+ ;;
+ *":"* )
+ header="`echo $bdb_place | sed -e 's/:.*$//'`"
+ lib="`echo $bdb_place | sed -e 's/^.*://'`"
+ CPPFLAGS="$CPPFLAGS -I$header"
+ LDFLAGS="$LDFLAGS -L$lib"
+ description="$header and $lib"
+ ;;
+ * )
+ if test -d $bdb_place; then
+ LDFLAGS="$LDFLAGS -L$bdb_place/lib"
+ CPPFLAGS="$CPPFLAGS -I$bdb_place/include"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $bdb_place" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $bdb_place... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: directory not found" >&5
+$as_echo "directory not found" >&6; }
+ continue
+ fi
+ description="$bdb_place"
+ ;;
+ esac
+
+ # Since there is no AC_MSG_NOTICE in autoconf 2.13, we use this
+ # trick to display a message instead.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $description" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $description... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
+$as_echo "" >&6; }
+
+ for bdb_libname in $bdb_default_search_lib_names; do
+ for bdb_header in $bdb_default_search_headers; do
+ # Clear the header cache variable for each location
+
+ cache_id="`echo ac_cv_header_${bdb_header} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+ unset $cache_id
+ as_ac_Header=`$as_echo "ac_cv_header_$bdb_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$bdb_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+
+ if test ""${db_major}"" = "3" -o ""${db_major}"" = "4" -o ""${db_major}"" = "5" -o ""${db_major}"" = "6"; then
+ # We generate a separate cache variable for each prefix and libname
+ # we search under. That way, we avoid caching information that
+ # changes if the user runs `configure' with a different set of
+ # switches.
+
+ cache_id="`echo apu_cv_check_berkeley_db_"${db_major}"_"${db_minor}"_"-1"_${bdb_header}_${bdb_libname}_in_${bdb_place} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -l$bdb_libname" >&5
+$as_echo_n "checking for -l$bdb_libname... " >&6; }
+ if eval \${$cache_id+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+
+ apu_try_berkeley_db_save_libs="$LIBS"
+
+ apu_check_berkeley_db_major="${db_major}"
+ apu_check_berkeley_db_minor="${db_minor}"
+ apu_check_berkeley_db_patch="-1"
+ apu_try_berkeley_db_header=$bdb_header
+ apu_try_berkeley_db_libname=$bdb_libname
+
+ LIBS="$LIBS -l$apu_try_berkeley_db_libname"
+ if test "$cross_compiling" = yes; then :
+ apu_try_berkeley_db=yes
+
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <$apu_try_berkeley_db_header>
+main ()
+{
+ int major, minor, patch;
+
+ db_version(&major, &minor, &patch);
+
+ /* Sanity check: ensure that db.h constants actually match the db library */
+ if (major != DB_VERSION_MAJOR
+ || minor != DB_VERSION_MINOR
+ || patch != DB_VERSION_PATCH)
+ exit (1);
+
+ /* Run-time check: ensure the library claims to be the correct version. */
+
+ if ($apu_check_berkeley_db_major != -1) {
+ if (major < $apu_check_berkeley_db_major)
+ exit (1);
+ if (major > $apu_check_berkeley_db_major)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_minor != -1) {
+ if (minor < $apu_check_berkeley_db_minor)
+ exit (1);
+ if (minor > $apu_check_berkeley_db_minor)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_patch == -1
+ || patch >= $apu_check_berkeley_db_patch)
+ exit (0);
+ else
+ exit (1);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ apu_try_berkeley_db=yes
+else
+ apu_try_berkeley_db=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+ LIBS="$apu_try_berkeley_db_save_libs"
+
+
+ eval "$cache_id=$apu_try_berkeley_db"
+
+fi
+
+ result="`eval echo '$'$cache_id`"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5
+$as_echo "$result" >&6; }
+ elif test ""${db_major}"" = "1"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_dbopen" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dbopen in -l$bdb_libname" >&5
+$as_echo_n "checking for dbopen in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dbopen ();
+int
+main ()
+{
+return dbopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ elif test ""${db_major}"" = "2"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_db_open" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for db_open in -l$bdb_libname" >&5
+$as_echo_n "checking for db_open in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char db_open ();
+int
+main ()
+{
+return db_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ fi
+
+else
+ result="no"
+fi
+
+
+
+ # If we found it, no need to search any more.
+ if test "$result" = "yes"; then
+ found="$bdb_place"
+ break
+ fi
+ done
+ test "$found" != "not" && break
+ done
+ test "$found" != "not" && break
+ done
+
+ # Restore the original values of the flags we tweak.
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+
+ case "$found" in
+ "not")
+ apu_have_db=0
+ ;;
+ "std")
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *":"*)
+ header="`echo $found | sed -e 's/:.*$//'`"
+ lib="`echo $found | sed -e 's/^.*://'`"
+
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$header\""
+ APRUTIL_INCLUDES="-I$header"
+ else
+ apr_addto_bugger="-I$header"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$lib\""
+ APRUTIL_LDFLAGS="-L$lib"
+ else
+ apr_addto_bugger="-L$lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *)
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$found/include\""
+ APRUTIL_INCLUDES="-I$found/include"
+ else
+ apr_addto_bugger="-I$found/include"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$found/lib\""
+ APRUTIL_LDFLAGS="-L$found/lib"
+ else
+ apr_addto_bugger="-L$found/lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ esac
+
+ if test "$apu_have_db" = "1"; then
+ apu_db_version=${db_major}
+ fi
+
+ if test "$apu_have_db" = "1"; then
+ break
+ fi
+ db_version=`expr $db_version - 1`
+ done
+ if test "$apu_have_db" = "0"; then
+
+ places="$all_places"
+ if test -z "$places"; then
+ places="std"
+ fi
+
+ bdb_version=3
+ if test "-1" != "-1"; then
+ bdb_version="$bdb_version.-1"
+ if test "-1" != "-1"; then
+ bdb_version="$bdb_version.-1"
+ fi
+ fi
+ bdb_places="$places"
+ bdb_default_search_headers="db3/db.h db.h"
+ bdb_default_search_lib_names="db3 db"
+
+
+ apu_have_db=0
+
+ # Save the original values of the flags we tweak.
+ apu_check_lib_save_libs="$LIBS"
+ apu_check_lib_save_ldflags="$LDFLAGS"
+ apu_check_lib_save_cppflags="$CPPFLAGS"
+
+ # The variable `found' is the prefix under which we've found
+ # Berkeley DB, or `not' if we haven't found it anywhere yet.
+ found=not
+ for bdb_place in $bdb_places; do
+
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+ case "$bdb_place" in
+ "std" )
+ description="the standard places"
+ ;;
+ *":"* )
+ header="`echo $bdb_place | sed -e 's/:.*$//'`"
+ lib="`echo $bdb_place | sed -e 's/^.*://'`"
+ CPPFLAGS="$CPPFLAGS -I$header"
+ LDFLAGS="$LDFLAGS -L$lib"
+ description="$header and $lib"
+ ;;
+ * )
+ if test -d $bdb_place; then
+ LDFLAGS="$LDFLAGS -L$bdb_place/lib"
+ CPPFLAGS="$CPPFLAGS -I$bdb_place/include"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $bdb_place" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $bdb_place... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: directory not found" >&5
+$as_echo "directory not found" >&6; }
+ continue
+ fi
+ description="$bdb_place"
+ ;;
+ esac
+
+ # Since there is no AC_MSG_NOTICE in autoconf 2.13, we use this
+ # trick to display a message instead.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $description" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $description... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
+$as_echo "" >&6; }
+
+ for bdb_libname in $bdb_default_search_lib_names; do
+ for bdb_header in $bdb_default_search_headers; do
+ # Clear the header cache variable for each location
+
+ cache_id="`echo ac_cv_header_${bdb_header} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+ unset $cache_id
+ as_ac_Header=`$as_echo "ac_cv_header_$bdb_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$bdb_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+
+ if test "3" = "3" -o "3" = "4" -o "3" = "5" -o "3" = "6"; then
+ # We generate a separate cache variable for each prefix and libname
+ # we search under. That way, we avoid caching information that
+ # changes if the user runs `configure' with a different set of
+ # switches.
+
+ cache_id="`echo apu_cv_check_berkeley_db_3_-1_-1_${bdb_header}_${bdb_libname}_in_${bdb_place} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -l$bdb_libname" >&5
+$as_echo_n "checking for -l$bdb_libname... " >&6; }
+ if eval \${$cache_id+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+
+ apu_try_berkeley_db_save_libs="$LIBS"
+
+ apu_check_berkeley_db_major=3
+ apu_check_berkeley_db_minor=-1
+ apu_check_berkeley_db_patch=-1
+ apu_try_berkeley_db_header=$bdb_header
+ apu_try_berkeley_db_libname=$bdb_libname
+
+ LIBS="$LIBS -l$apu_try_berkeley_db_libname"
+ if test "$cross_compiling" = yes; then :
+ apu_try_berkeley_db=yes
+
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <$apu_try_berkeley_db_header>
+main ()
+{
+ int major, minor, patch;
+
+ db_version(&major, &minor, &patch);
+
+ /* Sanity check: ensure that db.h constants actually match the db library */
+ if (major != DB_VERSION_MAJOR
+ || minor != DB_VERSION_MINOR
+ || patch != DB_VERSION_PATCH)
+ exit (1);
+
+ /* Run-time check: ensure the library claims to be the correct version. */
+
+ if ($apu_check_berkeley_db_major != -1) {
+ if (major < $apu_check_berkeley_db_major)
+ exit (1);
+ if (major > $apu_check_berkeley_db_major)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_minor != -1) {
+ if (minor < $apu_check_berkeley_db_minor)
+ exit (1);
+ if (minor > $apu_check_berkeley_db_minor)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_patch == -1
+ || patch >= $apu_check_berkeley_db_patch)
+ exit (0);
+ else
+ exit (1);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ apu_try_berkeley_db=yes
+else
+ apu_try_berkeley_db=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+ LIBS="$apu_try_berkeley_db_save_libs"
+
+
+ eval "$cache_id=$apu_try_berkeley_db"
+
+fi
+
+ result="`eval echo '$'$cache_id`"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5
+$as_echo "$result" >&6; }
+ elif test "3" = "1"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_dbopen" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dbopen in -l$bdb_libname" >&5
+$as_echo_n "checking for dbopen in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dbopen ();
+int
+main ()
+{
+return dbopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ elif test "3" = "2"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_db_open" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for db_open in -l$bdb_libname" >&5
+$as_echo_n "checking for db_open in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char db_open ();
+int
+main ()
+{
+return db_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ fi
+
+else
+ result="no"
+fi
+
+
+
+ # If we found it, no need to search any more.
+ if test "$result" = "yes"; then
+ found="$bdb_place"
+ break
+ fi
+ done
+ test "$found" != "not" && break
+ done
+ test "$found" != "not" && break
+ done
+
+ # Restore the original values of the flags we tweak.
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+
+ case "$found" in
+ "not")
+ apu_have_db=0
+ ;;
+ "std")
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *":"*)
+ header="`echo $found | sed -e 's/:.*$//'`"
+ lib="`echo $found | sed -e 's/^.*://'`"
+
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$header\""
+ APRUTIL_INCLUDES="-I$header"
+ else
+ apr_addto_bugger="-I$header"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$lib\""
+ APRUTIL_LDFLAGS="-L$lib"
+ else
+ apr_addto_bugger="-L$lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *)
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$found/include\""
+ APRUTIL_INCLUDES="-I$found/include"
+ else
+ apr_addto_bugger="-I$found/include"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$found/lib\""
+ APRUTIL_LDFLAGS="-L$found/lib"
+ else
+ apr_addto_bugger="-L$found/lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ esac
+
+ if test "$apu_have_db" = "1"; then
+ apu_db_version=3
+ fi
+
+ fi
+ if test "$apu_have_db" = "0"; then
+
+ places="$all_places"
+ if test -z "$places"; then
+ places="std"
+ fi
+
+ bdb_version=2
+ if test "-1" != "-1"; then
+ bdb_version="$bdb_version.-1"
+ if test "-1" != "-1"; then
+ bdb_version="$bdb_version.-1"
+ fi
+ fi
+ bdb_places="$places"
+ bdb_default_search_headers="db2/db.h db.h"
+ bdb_default_search_lib_names="db2 db"
+
+
+ apu_have_db=0
+
+ # Save the original values of the flags we tweak.
+ apu_check_lib_save_libs="$LIBS"
+ apu_check_lib_save_ldflags="$LDFLAGS"
+ apu_check_lib_save_cppflags="$CPPFLAGS"
+
+ # The variable `found' is the prefix under which we've found
+ # Berkeley DB, or `not' if we haven't found it anywhere yet.
+ found=not
+ for bdb_place in $bdb_places; do
+
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+ case "$bdb_place" in
+ "std" )
+ description="the standard places"
+ ;;
+ *":"* )
+ header="`echo $bdb_place | sed -e 's/:.*$//'`"
+ lib="`echo $bdb_place | sed -e 's/^.*://'`"
+ CPPFLAGS="$CPPFLAGS -I$header"
+ LDFLAGS="$LDFLAGS -L$lib"
+ description="$header and $lib"
+ ;;
+ * )
+ if test -d $bdb_place; then
+ LDFLAGS="$LDFLAGS -L$bdb_place/lib"
+ CPPFLAGS="$CPPFLAGS -I$bdb_place/include"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $bdb_place" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $bdb_place... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: directory not found" >&5
+$as_echo "directory not found" >&6; }
+ continue
+ fi
+ description="$bdb_place"
+ ;;
+ esac
+
+ # Since there is no AC_MSG_NOTICE in autoconf 2.13, we use this
+ # trick to display a message instead.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $description" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $description... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
+$as_echo "" >&6; }
+
+ for bdb_libname in $bdb_default_search_lib_names; do
+ for bdb_header in $bdb_default_search_headers; do
+ # Clear the header cache variable for each location
+
+ cache_id="`echo ac_cv_header_${bdb_header} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+ unset $cache_id
+ as_ac_Header=`$as_echo "ac_cv_header_$bdb_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$bdb_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+
+ if test "2" = "3" -o "2" = "4" -o "2" = "5" -o "2" = "6"; then
+ # We generate a separate cache variable for each prefix and libname
+ # we search under. That way, we avoid caching information that
+ # changes if the user runs `configure' with a different set of
+ # switches.
+
+ cache_id="`echo apu_cv_check_berkeley_db_2_-1_-1_${bdb_header}_${bdb_libname}_in_${bdb_place} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -l$bdb_libname" >&5
+$as_echo_n "checking for -l$bdb_libname... " >&6; }
+ if eval \${$cache_id+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+
+ apu_try_berkeley_db_save_libs="$LIBS"
+
+ apu_check_berkeley_db_major=2
+ apu_check_berkeley_db_minor=-1
+ apu_check_berkeley_db_patch=-1
+ apu_try_berkeley_db_header=$bdb_header
+ apu_try_berkeley_db_libname=$bdb_libname
+
+ LIBS="$LIBS -l$apu_try_berkeley_db_libname"
+ if test "$cross_compiling" = yes; then :
+ apu_try_berkeley_db=yes
+
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <$apu_try_berkeley_db_header>
+main ()
+{
+ int major, minor, patch;
+
+ db_version(&major, &minor, &patch);
+
+ /* Sanity check: ensure that db.h constants actually match the db library */
+ if (major != DB_VERSION_MAJOR
+ || minor != DB_VERSION_MINOR
+ || patch != DB_VERSION_PATCH)
+ exit (1);
+
+ /* Run-time check: ensure the library claims to be the correct version. */
+
+ if ($apu_check_berkeley_db_major != -1) {
+ if (major < $apu_check_berkeley_db_major)
+ exit (1);
+ if (major > $apu_check_berkeley_db_major)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_minor != -1) {
+ if (minor < $apu_check_berkeley_db_minor)
+ exit (1);
+ if (minor > $apu_check_berkeley_db_minor)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_patch == -1
+ || patch >= $apu_check_berkeley_db_patch)
+ exit (0);
+ else
+ exit (1);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ apu_try_berkeley_db=yes
+else
+ apu_try_berkeley_db=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+ LIBS="$apu_try_berkeley_db_save_libs"
+
+
+ eval "$cache_id=$apu_try_berkeley_db"
+
+fi
+
+ result="`eval echo '$'$cache_id`"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5
+$as_echo "$result" >&6; }
+ elif test "2" = "1"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_dbopen" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dbopen in -l$bdb_libname" >&5
+$as_echo_n "checking for dbopen in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dbopen ();
+int
+main ()
+{
+return dbopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ elif test "2" = "2"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_db_open" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for db_open in -l$bdb_libname" >&5
+$as_echo_n "checking for db_open in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char db_open ();
+int
+main ()
+{
+return db_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ fi
+
+else
+ result="no"
+fi
+
+
+
+ # If we found it, no need to search any more.
+ if test "$result" = "yes"; then
+ found="$bdb_place"
+ break
+ fi
+ done
+ test "$found" != "not" && break
+ done
+ test "$found" != "not" && break
+ done
+
+ # Restore the original values of the flags we tweak.
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+
+ case "$found" in
+ "not")
+ apu_have_db=0
+ ;;
+ "std")
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *":"*)
+ header="`echo $found | sed -e 's/:.*$//'`"
+ lib="`echo $found | sed -e 's/^.*://'`"
+
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$header\""
+ APRUTIL_INCLUDES="-I$header"
+ else
+ apr_addto_bugger="-I$header"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$lib\""
+ APRUTIL_LDFLAGS="-L$lib"
+ else
+ apr_addto_bugger="-L$lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *)
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$found/include\""
+ APRUTIL_INCLUDES="-I$found/include"
+ else
+ apr_addto_bugger="-I$found/include"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$found/lib\""
+ APRUTIL_LDFLAGS="-L$found/lib"
+ else
+ apr_addto_bugger="-L$found/lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ esac
+
+ if test "$apu_have_db" = "1"; then
+ apu_db_version=2
+ fi
+
+ fi
+ if test "$apu_have_db" = "0"; then
+
+ places="$all_places"
+ if test -z "$places"; then
+ places="std"
+ fi
+
+ bdb_version=1
+ if test "0" != "-1"; then
+ bdb_version="$bdb_version.0"
+ if test "0" != "-1"; then
+ bdb_version="$bdb_version.0"
+ fi
+ fi
+ bdb_places="$places"
+ bdb_default_search_headers="db1/db.h db.h"
+ bdb_default_search_lib_names="db1"
+
+
+ apu_have_db=0
+
+ # Save the original values of the flags we tweak.
+ apu_check_lib_save_libs="$LIBS"
+ apu_check_lib_save_ldflags="$LDFLAGS"
+ apu_check_lib_save_cppflags="$CPPFLAGS"
+
+ # The variable `found' is the prefix under which we've found
+ # Berkeley DB, or `not' if we haven't found it anywhere yet.
+ found=not
+ for bdb_place in $bdb_places; do
+
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+ case "$bdb_place" in
+ "std" )
+ description="the standard places"
+ ;;
+ *":"* )
+ header="`echo $bdb_place | sed -e 's/:.*$//'`"
+ lib="`echo $bdb_place | sed -e 's/^.*://'`"
+ CPPFLAGS="$CPPFLAGS -I$header"
+ LDFLAGS="$LDFLAGS -L$lib"
+ description="$header and $lib"
+ ;;
+ * )
+ if test -d $bdb_place; then
+ LDFLAGS="$LDFLAGS -L$bdb_place/lib"
+ CPPFLAGS="$CPPFLAGS -I$bdb_place/include"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $bdb_place" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $bdb_place... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: directory not found" >&5
+$as_echo "directory not found" >&6; }
+ continue
+ fi
+ description="$bdb_place"
+ ;;
+ esac
+
+ # Since there is no AC_MSG_NOTICE in autoconf 2.13, we use this
+ # trick to display a message instead.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $description" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $description... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
+$as_echo "" >&6; }
+
+ for bdb_libname in $bdb_default_search_lib_names; do
+ for bdb_header in $bdb_default_search_headers; do
+ # Clear the header cache variable for each location
+
+ cache_id="`echo ac_cv_header_${bdb_header} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+ unset $cache_id
+ as_ac_Header=`$as_echo "ac_cv_header_$bdb_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$bdb_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+
+ if test "1" = "3" -o "1" = "4" -o "1" = "5" -o "1" = "6"; then
+ # We generate a separate cache variable for each prefix and libname
+ # we search under. That way, we avoid caching information that
+ # changes if the user runs `configure' with a different set of
+ # switches.
+
+ cache_id="`echo apu_cv_check_berkeley_db_1_0_0_${bdb_header}_${bdb_libname}_in_${bdb_place} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -l$bdb_libname" >&5
+$as_echo_n "checking for -l$bdb_libname... " >&6; }
+ if eval \${$cache_id+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+
+ apu_try_berkeley_db_save_libs="$LIBS"
+
+ apu_check_berkeley_db_major=1
+ apu_check_berkeley_db_minor=0
+ apu_check_berkeley_db_patch=0
+ apu_try_berkeley_db_header=$bdb_header
+ apu_try_berkeley_db_libname=$bdb_libname
+
+ LIBS="$LIBS -l$apu_try_berkeley_db_libname"
+ if test "$cross_compiling" = yes; then :
+ apu_try_berkeley_db=yes
+
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <$apu_try_berkeley_db_header>
+main ()
+{
+ int major, minor, patch;
+
+ db_version(&major, &minor, &patch);
+
+ /* Sanity check: ensure that db.h constants actually match the db library */
+ if (major != DB_VERSION_MAJOR
+ || minor != DB_VERSION_MINOR
+ || patch != DB_VERSION_PATCH)
+ exit (1);
+
+ /* Run-time check: ensure the library claims to be the correct version. */
+
+ if ($apu_check_berkeley_db_major != -1) {
+ if (major < $apu_check_berkeley_db_major)
+ exit (1);
+ if (major > $apu_check_berkeley_db_major)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_minor != -1) {
+ if (minor < $apu_check_berkeley_db_minor)
+ exit (1);
+ if (minor > $apu_check_berkeley_db_minor)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_patch == -1
+ || patch >= $apu_check_berkeley_db_patch)
+ exit (0);
+ else
+ exit (1);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ apu_try_berkeley_db=yes
+else
+ apu_try_berkeley_db=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+ LIBS="$apu_try_berkeley_db_save_libs"
+
+
+ eval "$cache_id=$apu_try_berkeley_db"
+
+fi
+
+ result="`eval echo '$'$cache_id`"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5
+$as_echo "$result" >&6; }
+ elif test "1" = "1"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_dbopen" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dbopen in -l$bdb_libname" >&5
+$as_echo_n "checking for dbopen in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dbopen ();
+int
+main ()
+{
+return dbopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ elif test "1" = "2"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_db_open" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for db_open in -l$bdb_libname" >&5
+$as_echo_n "checking for db_open in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char db_open ();
+int
+main ()
+{
+return db_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ fi
+
+else
+ result="no"
+fi
+
+
+
+ # If we found it, no need to search any more.
+ if test "$result" = "yes"; then
+ found="$bdb_place"
+ break
+ fi
+ done
+ test "$found" != "not" && break
+ done
+ test "$found" != "not" && break
+ done
+
+ # Restore the original values of the flags we tweak.
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+
+ case "$found" in
+ "not")
+ apu_have_db=0
+ ;;
+ "std")
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *":"*)
+ header="`echo $found | sed -e 's/:.*$//'`"
+ lib="`echo $found | sed -e 's/^.*://'`"
+
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$header\""
+ APRUTIL_INCLUDES="-I$header"
+ else
+ apr_addto_bugger="-I$header"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$lib\""
+ APRUTIL_LDFLAGS="-L$lib"
+ else
+ apr_addto_bugger="-L$lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *)
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$found/include\""
+ APRUTIL_INCLUDES="-I$found/include"
+ else
+ apr_addto_bugger="-I$found/include"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$found/lib\""
+ APRUTIL_LDFLAGS="-L$found/lib"
+ else
+ apr_addto_bugger="-L$found/lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ esac
+
+ if test "$apu_have_db" = "1"; then
+ apu_db_version=1
+ fi
+
+ fi
+ if test "$apu_have_db" = "0"; then
+
+ places="$all_places"
+ if test -z "$places"; then
+ places="std"
+ fi
+
+ bdb_version=1
+ if test "-1" != "-1"; then
+ bdb_version="$bdb_version.-1"
+ if test "-1" != "-1"; then
+ bdb_version="$bdb_version.-1"
+ fi
+ fi
+ bdb_places="$places"
+ bdb_default_search_headers="db_185.h"
+ bdb_default_search_lib_names="db"
+
+
+ apu_have_db=0
+
+ # Save the original values of the flags we tweak.
+ apu_check_lib_save_libs="$LIBS"
+ apu_check_lib_save_ldflags="$LDFLAGS"
+ apu_check_lib_save_cppflags="$CPPFLAGS"
+
+ # The variable `found' is the prefix under which we've found
+ # Berkeley DB, or `not' if we haven't found it anywhere yet.
+ found=not
+ for bdb_place in $bdb_places; do
+
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+ case "$bdb_place" in
+ "std" )
+ description="the standard places"
+ ;;
+ *":"* )
+ header="`echo $bdb_place | sed -e 's/:.*$//'`"
+ lib="`echo $bdb_place | sed -e 's/^.*://'`"
+ CPPFLAGS="$CPPFLAGS -I$header"
+ LDFLAGS="$LDFLAGS -L$lib"
+ description="$header and $lib"
+ ;;
+ * )
+ if test -d $bdb_place; then
+ LDFLAGS="$LDFLAGS -L$bdb_place/lib"
+ CPPFLAGS="$CPPFLAGS -I$bdb_place/include"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $bdb_place" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $bdb_place... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: directory not found" >&5
+$as_echo "directory not found" >&6; }
+ continue
+ fi
+ description="$bdb_place"
+ ;;
+ esac
+
+ # Since there is no AC_MSG_NOTICE in autoconf 2.13, we use this
+ # trick to display a message instead.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $description" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $description... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
+$as_echo "" >&6; }
+
+ for bdb_libname in $bdb_default_search_lib_names; do
+ for bdb_header in $bdb_default_search_headers; do
+ # Clear the header cache variable for each location
+
+ cache_id="`echo ac_cv_header_${bdb_header} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+ unset $cache_id
+ as_ac_Header=`$as_echo "ac_cv_header_$bdb_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$bdb_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+
+ if test "1" = "3" -o "1" = "4" -o "1" = "5" -o "1" = "6"; then
+ # We generate a separate cache variable for each prefix and libname
+ # we search under. That way, we avoid caching information that
+ # changes if the user runs `configure' with a different set of
+ # switches.
+
+ cache_id="`echo apu_cv_check_berkeley_db_1_-1_-1_${bdb_header}_${bdb_libname}_in_${bdb_place} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -l$bdb_libname" >&5
+$as_echo_n "checking for -l$bdb_libname... " >&6; }
+ if eval \${$cache_id+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+
+ apu_try_berkeley_db_save_libs="$LIBS"
+
+ apu_check_berkeley_db_major=1
+ apu_check_berkeley_db_minor=-1
+ apu_check_berkeley_db_patch=-1
+ apu_try_berkeley_db_header=$bdb_header
+ apu_try_berkeley_db_libname=$bdb_libname
+
+ LIBS="$LIBS -l$apu_try_berkeley_db_libname"
+ if test "$cross_compiling" = yes; then :
+ apu_try_berkeley_db=yes
+
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <$apu_try_berkeley_db_header>
+main ()
+{
+ int major, minor, patch;
+
+ db_version(&major, &minor, &patch);
+
+ /* Sanity check: ensure that db.h constants actually match the db library */
+ if (major != DB_VERSION_MAJOR
+ || minor != DB_VERSION_MINOR
+ || patch != DB_VERSION_PATCH)
+ exit (1);
+
+ /* Run-time check: ensure the library claims to be the correct version. */
+
+ if ($apu_check_berkeley_db_major != -1) {
+ if (major < $apu_check_berkeley_db_major)
+ exit (1);
+ if (major > $apu_check_berkeley_db_major)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_minor != -1) {
+ if (minor < $apu_check_berkeley_db_minor)
+ exit (1);
+ if (minor > $apu_check_berkeley_db_minor)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_patch == -1
+ || patch >= $apu_check_berkeley_db_patch)
+ exit (0);
+ else
+ exit (1);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ apu_try_berkeley_db=yes
+else
+ apu_try_berkeley_db=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+ LIBS="$apu_try_berkeley_db_save_libs"
+
+
+ eval "$cache_id=$apu_try_berkeley_db"
+
+fi
+
+ result="`eval echo '$'$cache_id`"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5
+$as_echo "$result" >&6; }
+ elif test "1" = "1"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_dbopen" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dbopen in -l$bdb_libname" >&5
+$as_echo_n "checking for dbopen in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dbopen ();
+int
+main ()
+{
+return dbopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ elif test "1" = "2"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_db_open" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for db_open in -l$bdb_libname" >&5
+$as_echo_n "checking for db_open in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char db_open ();
+int
+main ()
+{
+return db_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ fi
+
+else
+ result="no"
+fi
+
+
+
+ # If we found it, no need to search any more.
+ if test "$result" = "yes"; then
+ found="$bdb_place"
+ break
+ fi
+ done
+ test "$found" != "not" && break
+ done
+ test "$found" != "not" && break
+ done
+
+ # Restore the original values of the flags we tweak.
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+
+ case "$found" in
+ "not")
+ apu_have_db=0
+ ;;
+ "std")
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *":"*)
+ header="`echo $found | sed -e 's/:.*$//'`"
+ lib="`echo $found | sed -e 's/^.*://'`"
+
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$header\""
+ APRUTIL_INCLUDES="-I$header"
+ else
+ apr_addto_bugger="-I$header"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$lib\""
+ APRUTIL_LDFLAGS="-L$lib"
+ else
+ apr_addto_bugger="-L$lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *)
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$found/include\""
+ APRUTIL_INCLUDES="-I$found/include"
+ else
+ apr_addto_bugger="-I$found/include"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$found/lib\""
+ APRUTIL_LDFLAGS="-L$found/lib"
+ else
+ apr_addto_bugger="-L$found/lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ esac
+
+ if test "$apu_have_db" = "1"; then
+ apu_db_version=185
+ fi
+
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB" >&5
+$as_echo_n "checking for Berkeley DB... " >&6; }
+ if test "$apu_have_db" = "1"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: found db$apu_db_version" >&5
+$as_echo "found db$apu_db_version" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+$as_echo "not found" >&6; }
+ fi
+
+ if test "$apu_have_db" = "0"; then
+ as_fn_error but not found "Berkeley db requested" "$LINENO" 5
+ fi
+ ;;
+ db1)
+
+ places="$check_places"
+ if test -z "$places"; then
+ places="std"
+ fi
+
+ bdb_version=1
+ if test "0" != "-1"; then
+ bdb_version="$bdb_version.0"
+ if test "0" != "-1"; then
+ bdb_version="$bdb_version.0"
+ fi
+ fi
+ bdb_places="$places"
+ bdb_default_search_headers="db1/db.h db.h"
+ bdb_default_search_lib_names="db1"
+
+
+ apu_have_db=0
+
+ # Save the original values of the flags we tweak.
+ apu_check_lib_save_libs="$LIBS"
+ apu_check_lib_save_ldflags="$LDFLAGS"
+ apu_check_lib_save_cppflags="$CPPFLAGS"
+
+ # The variable `found' is the prefix under which we've found
+ # Berkeley DB, or `not' if we haven't found it anywhere yet.
+ found=not
+ for bdb_place in $bdb_places; do
+
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+ case "$bdb_place" in
+ "std" )
+ description="the standard places"
+ ;;
+ *":"* )
+ header="`echo $bdb_place | sed -e 's/:.*$//'`"
+ lib="`echo $bdb_place | sed -e 's/^.*://'`"
+ CPPFLAGS="$CPPFLAGS -I$header"
+ LDFLAGS="$LDFLAGS -L$lib"
+ description="$header and $lib"
+ ;;
+ * )
+ if test -d $bdb_place; then
+ LDFLAGS="$LDFLAGS -L$bdb_place/lib"
+ CPPFLAGS="$CPPFLAGS -I$bdb_place/include"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $bdb_place" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $bdb_place... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: directory not found" >&5
+$as_echo "directory not found" >&6; }
+ continue
+ fi
+ description="$bdb_place"
+ ;;
+ esac
+
+ # Since there is no AC_MSG_NOTICE in autoconf 2.13, we use this
+ # trick to display a message instead.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $description" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $description... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
+$as_echo "" >&6; }
+
+ for bdb_libname in $bdb_default_search_lib_names; do
+ for bdb_header in $bdb_default_search_headers; do
+ # Clear the header cache variable for each location
+
+ cache_id="`echo ac_cv_header_${bdb_header} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+ unset $cache_id
+ as_ac_Header=`$as_echo "ac_cv_header_$bdb_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$bdb_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+
+ if test "1" = "3" -o "1" = "4" -o "1" = "5" -o "1" = "6"; then
+ # We generate a separate cache variable for each prefix and libname
+ # we search under. That way, we avoid caching information that
+ # changes if the user runs `configure' with a different set of
+ # switches.
+
+ cache_id="`echo apu_cv_check_berkeley_db_1_0_0_${bdb_header}_${bdb_libname}_in_${bdb_place} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -l$bdb_libname" >&5
+$as_echo_n "checking for -l$bdb_libname... " >&6; }
+ if eval \${$cache_id+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+
+ apu_try_berkeley_db_save_libs="$LIBS"
+
+ apu_check_berkeley_db_major=1
+ apu_check_berkeley_db_minor=0
+ apu_check_berkeley_db_patch=0
+ apu_try_berkeley_db_header=$bdb_header
+ apu_try_berkeley_db_libname=$bdb_libname
+
+ LIBS="$LIBS -l$apu_try_berkeley_db_libname"
+ if test "$cross_compiling" = yes; then :
+ apu_try_berkeley_db=yes
+
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <$apu_try_berkeley_db_header>
+main ()
+{
+ int major, minor, patch;
+
+ db_version(&major, &minor, &patch);
+
+ /* Sanity check: ensure that db.h constants actually match the db library */
+ if (major != DB_VERSION_MAJOR
+ || minor != DB_VERSION_MINOR
+ || patch != DB_VERSION_PATCH)
+ exit (1);
+
+ /* Run-time check: ensure the library claims to be the correct version. */
+
+ if ($apu_check_berkeley_db_major != -1) {
+ if (major < $apu_check_berkeley_db_major)
+ exit (1);
+ if (major > $apu_check_berkeley_db_major)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_minor != -1) {
+ if (minor < $apu_check_berkeley_db_minor)
+ exit (1);
+ if (minor > $apu_check_berkeley_db_minor)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_patch == -1
+ || patch >= $apu_check_berkeley_db_patch)
+ exit (0);
+ else
+ exit (1);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ apu_try_berkeley_db=yes
+else
+ apu_try_berkeley_db=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+ LIBS="$apu_try_berkeley_db_save_libs"
+
+
+ eval "$cache_id=$apu_try_berkeley_db"
+
+fi
+
+ result="`eval echo '$'$cache_id`"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5
+$as_echo "$result" >&6; }
+ elif test "1" = "1"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_dbopen" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dbopen in -l$bdb_libname" >&5
+$as_echo_n "checking for dbopen in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dbopen ();
+int
+main ()
+{
+return dbopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ elif test "1" = "2"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_db_open" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for db_open in -l$bdb_libname" >&5
+$as_echo_n "checking for db_open in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char db_open ();
+int
+main ()
+{
+return db_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ fi
+
+else
+ result="no"
+fi
+
+
+
+ # If we found it, no need to search any more.
+ if test "$result" = "yes"; then
+ found="$bdb_place"
+ break
+ fi
+ done
+ test "$found" != "not" && break
+ done
+ test "$found" != "not" && break
+ done
+
+ # Restore the original values of the flags we tweak.
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+
+ case "$found" in
+ "not")
+ apu_have_db=0
+ ;;
+ "std")
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *":"*)
+ header="`echo $found | sed -e 's/:.*$//'`"
+ lib="`echo $found | sed -e 's/^.*://'`"
+
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$header\""
+ APRUTIL_INCLUDES="-I$header"
+ else
+ apr_addto_bugger="-I$header"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$lib\""
+ APRUTIL_LDFLAGS="-L$lib"
+ else
+ apr_addto_bugger="-L$lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *)
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$found/include\""
+ APRUTIL_INCLUDES="-I$found/include"
+ else
+ apr_addto_bugger="-I$found/include"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$found/lib\""
+ APRUTIL_LDFLAGS="-L$found/lib"
+ else
+ apr_addto_bugger="-L$found/lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ esac
+
+ if test "$apu_have_db" = "1"; then
+ apu_db_version=1
+ fi
+
+ if test "$apu_db_version" != "1"; then
+ as_fn_error $? "Berkeley db1 not found" "$LINENO" 5
+ fi
+ ;;
+ db185)
+
+ places="$check_places"
+ if test -z "$places"; then
+ places="std"
+ fi
+
+ bdb_version=1
+ if test "-1" != "-1"; then
+ bdb_version="$bdb_version.-1"
+ if test "-1" != "-1"; then
+ bdb_version="$bdb_version.-1"
+ fi
+ fi
+ bdb_places="$places"
+ bdb_default_search_headers="db_185.h"
+ bdb_default_search_lib_names="db"
+
+
+ apu_have_db=0
+
+ # Save the original values of the flags we tweak.
+ apu_check_lib_save_libs="$LIBS"
+ apu_check_lib_save_ldflags="$LDFLAGS"
+ apu_check_lib_save_cppflags="$CPPFLAGS"
+
+ # The variable `found' is the prefix under which we've found
+ # Berkeley DB, or `not' if we haven't found it anywhere yet.
+ found=not
+ for bdb_place in $bdb_places; do
+
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+ case "$bdb_place" in
+ "std" )
+ description="the standard places"
+ ;;
+ *":"* )
+ header="`echo $bdb_place | sed -e 's/:.*$//'`"
+ lib="`echo $bdb_place | sed -e 's/^.*://'`"
+ CPPFLAGS="$CPPFLAGS -I$header"
+ LDFLAGS="$LDFLAGS -L$lib"
+ description="$header and $lib"
+ ;;
+ * )
+ if test -d $bdb_place; then
+ LDFLAGS="$LDFLAGS -L$bdb_place/lib"
+ CPPFLAGS="$CPPFLAGS -I$bdb_place/include"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $bdb_place" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $bdb_place... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: directory not found" >&5
+$as_echo "directory not found" >&6; }
+ continue
+ fi
+ description="$bdb_place"
+ ;;
+ esac
+
+ # Since there is no AC_MSG_NOTICE in autoconf 2.13, we use this
+ # trick to display a message instead.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $description" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $description... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
+$as_echo "" >&6; }
+
+ for bdb_libname in $bdb_default_search_lib_names; do
+ for bdb_header in $bdb_default_search_headers; do
+ # Clear the header cache variable for each location
+
+ cache_id="`echo ac_cv_header_${bdb_header} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+ unset $cache_id
+ as_ac_Header=`$as_echo "ac_cv_header_$bdb_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$bdb_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+
+ if test "1" = "3" -o "1" = "4" -o "1" = "5" -o "1" = "6"; then
+ # We generate a separate cache variable for each prefix and libname
+ # we search under. That way, we avoid caching information that
+ # changes if the user runs `configure' with a different set of
+ # switches.
+
+ cache_id="`echo apu_cv_check_berkeley_db_1_-1_-1_${bdb_header}_${bdb_libname}_in_${bdb_place} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -l$bdb_libname" >&5
+$as_echo_n "checking for -l$bdb_libname... " >&6; }
+ if eval \${$cache_id+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+
+ apu_try_berkeley_db_save_libs="$LIBS"
+
+ apu_check_berkeley_db_major=1
+ apu_check_berkeley_db_minor=-1
+ apu_check_berkeley_db_patch=-1
+ apu_try_berkeley_db_header=$bdb_header
+ apu_try_berkeley_db_libname=$bdb_libname
+
+ LIBS="$LIBS -l$apu_try_berkeley_db_libname"
+ if test "$cross_compiling" = yes; then :
+ apu_try_berkeley_db=yes
+
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <$apu_try_berkeley_db_header>
+main ()
+{
+ int major, minor, patch;
+
+ db_version(&major, &minor, &patch);
+
+ /* Sanity check: ensure that db.h constants actually match the db library */
+ if (major != DB_VERSION_MAJOR
+ || minor != DB_VERSION_MINOR
+ || patch != DB_VERSION_PATCH)
+ exit (1);
+
+ /* Run-time check: ensure the library claims to be the correct version. */
+
+ if ($apu_check_berkeley_db_major != -1) {
+ if (major < $apu_check_berkeley_db_major)
+ exit (1);
+ if (major > $apu_check_berkeley_db_major)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_minor != -1) {
+ if (minor < $apu_check_berkeley_db_minor)
+ exit (1);
+ if (minor > $apu_check_berkeley_db_minor)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_patch == -1
+ || patch >= $apu_check_berkeley_db_patch)
+ exit (0);
+ else
+ exit (1);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ apu_try_berkeley_db=yes
+else
+ apu_try_berkeley_db=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+ LIBS="$apu_try_berkeley_db_save_libs"
+
+
+ eval "$cache_id=$apu_try_berkeley_db"
+
+fi
+
+ result="`eval echo '$'$cache_id`"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5
+$as_echo "$result" >&6; }
+ elif test "1" = "1"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_dbopen" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dbopen in -l$bdb_libname" >&5
+$as_echo_n "checking for dbopen in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dbopen ();
+int
+main ()
+{
+return dbopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ elif test "1" = "2"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_db_open" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for db_open in -l$bdb_libname" >&5
+$as_echo_n "checking for db_open in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char db_open ();
+int
+main ()
+{
+return db_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ fi
+
+else
+ result="no"
+fi
+
+
+
+ # If we found it, no need to search any more.
+ if test "$result" = "yes"; then
+ found="$bdb_place"
+ break
+ fi
+ done
+ test "$found" != "not" && break
+ done
+ test "$found" != "not" && break
+ done
+
+ # Restore the original values of the flags we tweak.
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+
+ case "$found" in
+ "not")
+ apu_have_db=0
+ ;;
+ "std")
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *":"*)
+ header="`echo $found | sed -e 's/:.*$//'`"
+ lib="`echo $found | sed -e 's/^.*://'`"
+
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$header\""
+ APRUTIL_INCLUDES="-I$header"
+ else
+ apr_addto_bugger="-I$header"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$lib\""
+ APRUTIL_LDFLAGS="-L$lib"
+ else
+ apr_addto_bugger="-L$lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *)
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$found/include\""
+ APRUTIL_INCLUDES="-I$found/include"
+ else
+ apr_addto_bugger="-I$found/include"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$found/lib\""
+ APRUTIL_LDFLAGS="-L$found/lib"
+ else
+ apr_addto_bugger="-L$found/lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ esac
+
+ if test "$apu_have_db" = "1"; then
+ apu_db_version=185
+ fi
+
+ if test "$apu_db_version" != "185"; then
+ as_fn_error $? "Berkeley db185 not found" "$LINENO" 5
+ fi
+ ;;
+ db2)
+
+ places="$check_places"
+ if test -z "$places"; then
+ places="std"
+ fi
+
+ bdb_version=2
+ if test "-1" != "-1"; then
+ bdb_version="$bdb_version.-1"
+ if test "-1" != "-1"; then
+ bdb_version="$bdb_version.-1"
+ fi
+ fi
+ bdb_places="$places"
+ bdb_default_search_headers="db2/db.h db.h"
+ bdb_default_search_lib_names="db2 db"
+
+
+ apu_have_db=0
+
+ # Save the original values of the flags we tweak.
+ apu_check_lib_save_libs="$LIBS"
+ apu_check_lib_save_ldflags="$LDFLAGS"
+ apu_check_lib_save_cppflags="$CPPFLAGS"
+
+ # The variable `found' is the prefix under which we've found
+ # Berkeley DB, or `not' if we haven't found it anywhere yet.
+ found=not
+ for bdb_place in $bdb_places; do
+
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+ case "$bdb_place" in
+ "std" )
+ description="the standard places"
+ ;;
+ *":"* )
+ header="`echo $bdb_place | sed -e 's/:.*$//'`"
+ lib="`echo $bdb_place | sed -e 's/^.*://'`"
+ CPPFLAGS="$CPPFLAGS -I$header"
+ LDFLAGS="$LDFLAGS -L$lib"
+ description="$header and $lib"
+ ;;
+ * )
+ if test -d $bdb_place; then
+ LDFLAGS="$LDFLAGS -L$bdb_place/lib"
+ CPPFLAGS="$CPPFLAGS -I$bdb_place/include"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $bdb_place" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $bdb_place... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: directory not found" >&5
+$as_echo "directory not found" >&6; }
+ continue
+ fi
+ description="$bdb_place"
+ ;;
+ esac
+
+ # Since there is no AC_MSG_NOTICE in autoconf 2.13, we use this
+ # trick to display a message instead.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $description" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $description... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
+$as_echo "" >&6; }
+
+ for bdb_libname in $bdb_default_search_lib_names; do
+ for bdb_header in $bdb_default_search_headers; do
+ # Clear the header cache variable for each location
+
+ cache_id="`echo ac_cv_header_${bdb_header} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+ unset $cache_id
+ as_ac_Header=`$as_echo "ac_cv_header_$bdb_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$bdb_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+
+ if test "2" = "3" -o "2" = "4" -o "2" = "5" -o "2" = "6"; then
+ # We generate a separate cache variable for each prefix and libname
+ # we search under. That way, we avoid caching information that
+ # changes if the user runs `configure' with a different set of
+ # switches.
+
+ cache_id="`echo apu_cv_check_berkeley_db_2_-1_-1_${bdb_header}_${bdb_libname}_in_${bdb_place} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -l$bdb_libname" >&5
+$as_echo_n "checking for -l$bdb_libname... " >&6; }
+ if eval \${$cache_id+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+
+ apu_try_berkeley_db_save_libs="$LIBS"
+
+ apu_check_berkeley_db_major=2
+ apu_check_berkeley_db_minor=-1
+ apu_check_berkeley_db_patch=-1
+ apu_try_berkeley_db_header=$bdb_header
+ apu_try_berkeley_db_libname=$bdb_libname
+
+ LIBS="$LIBS -l$apu_try_berkeley_db_libname"
+ if test "$cross_compiling" = yes; then :
+ apu_try_berkeley_db=yes
+
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <$apu_try_berkeley_db_header>
+main ()
+{
+ int major, minor, patch;
+
+ db_version(&major, &minor, &patch);
+
+ /* Sanity check: ensure that db.h constants actually match the db library */
+ if (major != DB_VERSION_MAJOR
+ || minor != DB_VERSION_MINOR
+ || patch != DB_VERSION_PATCH)
+ exit (1);
+
+ /* Run-time check: ensure the library claims to be the correct version. */
+
+ if ($apu_check_berkeley_db_major != -1) {
+ if (major < $apu_check_berkeley_db_major)
+ exit (1);
+ if (major > $apu_check_berkeley_db_major)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_minor != -1) {
+ if (minor < $apu_check_berkeley_db_minor)
+ exit (1);
+ if (minor > $apu_check_berkeley_db_minor)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_patch == -1
+ || patch >= $apu_check_berkeley_db_patch)
+ exit (0);
+ else
+ exit (1);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ apu_try_berkeley_db=yes
+else
+ apu_try_berkeley_db=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+ LIBS="$apu_try_berkeley_db_save_libs"
+
+
+ eval "$cache_id=$apu_try_berkeley_db"
+
+fi
+
+ result="`eval echo '$'$cache_id`"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5
+$as_echo "$result" >&6; }
+ elif test "2" = "1"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_dbopen" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dbopen in -l$bdb_libname" >&5
+$as_echo_n "checking for dbopen in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dbopen ();
+int
+main ()
+{
+return dbopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ elif test "2" = "2"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_db_open" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for db_open in -l$bdb_libname" >&5
+$as_echo_n "checking for db_open in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char db_open ();
+int
+main ()
+{
+return db_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ fi
+
+else
+ result="no"
+fi
+
+
+
+ # If we found it, no need to search any more.
+ if test "$result" = "yes"; then
+ found="$bdb_place"
+ break
+ fi
+ done
+ test "$found" != "not" && break
+ done
+ test "$found" != "not" && break
+ done
+
+ # Restore the original values of the flags we tweak.
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+
+ case "$found" in
+ "not")
+ apu_have_db=0
+ ;;
+ "std")
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *":"*)
+ header="`echo $found | sed -e 's/:.*$//'`"
+ lib="`echo $found | sed -e 's/^.*://'`"
+
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$header\""
+ APRUTIL_INCLUDES="-I$header"
+ else
+ apr_addto_bugger="-I$header"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$lib\""
+ APRUTIL_LDFLAGS="-L$lib"
+ else
+ apr_addto_bugger="-L$lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *)
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$found/include\""
+ APRUTIL_INCLUDES="-I$found/include"
+ else
+ apr_addto_bugger="-I$found/include"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$found/lib\""
+ APRUTIL_LDFLAGS="-L$found/lib"
+ else
+ apr_addto_bugger="-L$found/lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ esac
+
+ if test "$apu_have_db" = "1"; then
+ apu_db_version=2
+ fi
+
+ if test "$apu_db_version" != "2"; then
+ as_fn_error $? "Berkeley db2 not found" "$LINENO" 5
+ fi
+ ;;
+ db3)
+
+ places="$check_places"
+ if test -z "$places"; then
+ places="std"
+ fi
+
+ bdb_version=3
+ if test "-1" != "-1"; then
+ bdb_version="$bdb_version.-1"
+ if test "-1" != "-1"; then
+ bdb_version="$bdb_version.-1"
+ fi
+ fi
+ bdb_places="$places"
+ bdb_default_search_headers="db3/db.h db.h"
+ bdb_default_search_lib_names="db3 db"
+
+
+ apu_have_db=0
+
+ # Save the original values of the flags we tweak.
+ apu_check_lib_save_libs="$LIBS"
+ apu_check_lib_save_ldflags="$LDFLAGS"
+ apu_check_lib_save_cppflags="$CPPFLAGS"
+
+ # The variable `found' is the prefix under which we've found
+ # Berkeley DB, or `not' if we haven't found it anywhere yet.
+ found=not
+ for bdb_place in $bdb_places; do
+
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+ case "$bdb_place" in
+ "std" )
+ description="the standard places"
+ ;;
+ *":"* )
+ header="`echo $bdb_place | sed -e 's/:.*$//'`"
+ lib="`echo $bdb_place | sed -e 's/^.*://'`"
+ CPPFLAGS="$CPPFLAGS -I$header"
+ LDFLAGS="$LDFLAGS -L$lib"
+ description="$header and $lib"
+ ;;
+ * )
+ if test -d $bdb_place; then
+ LDFLAGS="$LDFLAGS -L$bdb_place/lib"
+ CPPFLAGS="$CPPFLAGS -I$bdb_place/include"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $bdb_place" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $bdb_place... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: directory not found" >&5
+$as_echo "directory not found" >&6; }
+ continue
+ fi
+ description="$bdb_place"
+ ;;
+ esac
+
+ # Since there is no AC_MSG_NOTICE in autoconf 2.13, we use this
+ # trick to display a message instead.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $description" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $description... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
+$as_echo "" >&6; }
+
+ for bdb_libname in $bdb_default_search_lib_names; do
+ for bdb_header in $bdb_default_search_headers; do
+ # Clear the header cache variable for each location
+
+ cache_id="`echo ac_cv_header_${bdb_header} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+ unset $cache_id
+ as_ac_Header=`$as_echo "ac_cv_header_$bdb_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$bdb_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+
+ if test "3" = "3" -o "3" = "4" -o "3" = "5" -o "3" = "6"; then
+ # We generate a separate cache variable for each prefix and libname
+ # we search under. That way, we avoid caching information that
+ # changes if the user runs `configure' with a different set of
+ # switches.
+
+ cache_id="`echo apu_cv_check_berkeley_db_3_-1_-1_${bdb_header}_${bdb_libname}_in_${bdb_place} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -l$bdb_libname" >&5
+$as_echo_n "checking for -l$bdb_libname... " >&6; }
+ if eval \${$cache_id+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+
+ apu_try_berkeley_db_save_libs="$LIBS"
+
+ apu_check_berkeley_db_major=3
+ apu_check_berkeley_db_minor=-1
+ apu_check_berkeley_db_patch=-1
+ apu_try_berkeley_db_header=$bdb_header
+ apu_try_berkeley_db_libname=$bdb_libname
+
+ LIBS="$LIBS -l$apu_try_berkeley_db_libname"
+ if test "$cross_compiling" = yes; then :
+ apu_try_berkeley_db=yes
+
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <$apu_try_berkeley_db_header>
+main ()
+{
+ int major, minor, patch;
+
+ db_version(&major, &minor, &patch);
+
+ /* Sanity check: ensure that db.h constants actually match the db library */
+ if (major != DB_VERSION_MAJOR
+ || minor != DB_VERSION_MINOR
+ || patch != DB_VERSION_PATCH)
+ exit (1);
+
+ /* Run-time check: ensure the library claims to be the correct version. */
+
+ if ($apu_check_berkeley_db_major != -1) {
+ if (major < $apu_check_berkeley_db_major)
+ exit (1);
+ if (major > $apu_check_berkeley_db_major)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_minor != -1) {
+ if (minor < $apu_check_berkeley_db_minor)
+ exit (1);
+ if (minor > $apu_check_berkeley_db_minor)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_patch == -1
+ || patch >= $apu_check_berkeley_db_patch)
+ exit (0);
+ else
+ exit (1);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ apu_try_berkeley_db=yes
+else
+ apu_try_berkeley_db=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+ LIBS="$apu_try_berkeley_db_save_libs"
+
+
+ eval "$cache_id=$apu_try_berkeley_db"
+
+fi
+
+ result="`eval echo '$'$cache_id`"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5
+$as_echo "$result" >&6; }
+ elif test "3" = "1"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_dbopen" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dbopen in -l$bdb_libname" >&5
+$as_echo_n "checking for dbopen in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dbopen ();
+int
+main ()
+{
+return dbopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ elif test "3" = "2"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_db_open" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for db_open in -l$bdb_libname" >&5
+$as_echo_n "checking for db_open in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char db_open ();
+int
+main ()
+{
+return db_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ fi
+
+else
+ result="no"
+fi
+
+
+
+ # If we found it, no need to search any more.
+ if test "$result" = "yes"; then
+ found="$bdb_place"
+ break
+ fi
+ done
+ test "$found" != "not" && break
+ done
+ test "$found" != "not" && break
+ done
+
+ # Restore the original values of the flags we tweak.
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+
+ case "$found" in
+ "not")
+ apu_have_db=0
+ ;;
+ "std")
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *":"*)
+ header="`echo $found | sed -e 's/:.*$//'`"
+ lib="`echo $found | sed -e 's/^.*://'`"
+
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$header\""
+ APRUTIL_INCLUDES="-I$header"
+ else
+ apr_addto_bugger="-I$header"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$lib\""
+ APRUTIL_LDFLAGS="-L$lib"
+ else
+ apr_addto_bugger="-L$lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *)
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$found/include\""
+ APRUTIL_INCLUDES="-I$found/include"
+ else
+ apr_addto_bugger="-I$found/include"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$found/lib\""
+ APRUTIL_LDFLAGS="-L$found/lib"
+ else
+ apr_addto_bugger="-L$found/lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ esac
+
+ if test "$apu_have_db" = "1"; then
+ apu_db_version=3
+ fi
+
+ if test "$apu_db_version" != "3"; then
+ as_fn_error $? "Berkeley db3 not found" "$LINENO" 5
+ fi
+ ;;
+ db[456][0-9])
+ db_major=`echo "$requested" | sed -e 's/db//' -e 's/.$//'`
+ db_minor=`echo "$requested" | sed -e 's/db//' -e 's/.//'`
+
+ places="$check_places"
+ db_major="$db_major"
+ db_minor="$db_minor"
+ if test -z "$places"; then
+ places="std /usr/local /usr/local/BerkeleyDB.${db_major}.${db_minor} /boot/home/config"
+ fi
+
+ bdb_version="${db_major}"
+ if test ""${db_minor}"" != "-1"; then
+ bdb_version="$bdb_version."${db_minor}""
+ if test ""-1"" != "-1"; then
+ bdb_version="$bdb_version."-1""
+ fi
+ fi
+ bdb_places="$places"
+ bdb_default_search_headers="db${db_major}${db_minor}/db.h db${db_major}/db.h db.h"
+ bdb_default_search_lib_names="db-${db_major}.${db_minor} db${db_major}-${db_major}.${db_minor} db${db_major}${db_minor} db-${db_major} db${db_major} db"
+
+
+ apu_have_db=0
+
+ # Save the original values of the flags we tweak.
+ apu_check_lib_save_libs="$LIBS"
+ apu_check_lib_save_ldflags="$LDFLAGS"
+ apu_check_lib_save_cppflags="$CPPFLAGS"
+
+ # The variable `found' is the prefix under which we've found
+ # Berkeley DB, or `not' if we haven't found it anywhere yet.
+ found=not
+ for bdb_place in $bdb_places; do
+
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+ case "$bdb_place" in
+ "std" )
+ description="the standard places"
+ ;;
+ *":"* )
+ header="`echo $bdb_place | sed -e 's/:.*$//'`"
+ lib="`echo $bdb_place | sed -e 's/^.*://'`"
+ CPPFLAGS="$CPPFLAGS -I$header"
+ LDFLAGS="$LDFLAGS -L$lib"
+ description="$header and $lib"
+ ;;
+ * )
+ if test -d $bdb_place; then
+ LDFLAGS="$LDFLAGS -L$bdb_place/lib"
+ CPPFLAGS="$CPPFLAGS -I$bdb_place/include"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $bdb_place" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $bdb_place... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: directory not found" >&5
+$as_echo "directory not found" >&6; }
+ continue
+ fi
+ description="$bdb_place"
+ ;;
+ esac
+
+ # Since there is no AC_MSG_NOTICE in autoconf 2.13, we use this
+ # trick to display a message instead.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $description" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $description... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
+$as_echo "" >&6; }
+
+ for bdb_libname in $bdb_default_search_lib_names; do
+ for bdb_header in $bdb_default_search_headers; do
+ # Clear the header cache variable for each location
+
+ cache_id="`echo ac_cv_header_${bdb_header} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+ unset $cache_id
+ as_ac_Header=`$as_echo "ac_cv_header_$bdb_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$bdb_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+
+ if test ""${db_major}"" = "3" -o ""${db_major}"" = "4" -o ""${db_major}"" = "5" -o ""${db_major}"" = "6"; then
+ # We generate a separate cache variable for each prefix and libname
+ # we search under. That way, we avoid caching information that
+ # changes if the user runs `configure' with a different set of
+ # switches.
+
+ cache_id="`echo apu_cv_check_berkeley_db_"${db_major}"_"${db_minor}"_"-1"_${bdb_header}_${bdb_libname}_in_${bdb_place} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -l$bdb_libname" >&5
+$as_echo_n "checking for -l$bdb_libname... " >&6; }
+ if eval \${$cache_id+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+
+ apu_try_berkeley_db_save_libs="$LIBS"
+
+ apu_check_berkeley_db_major="${db_major}"
+ apu_check_berkeley_db_minor="${db_minor}"
+ apu_check_berkeley_db_patch="-1"
+ apu_try_berkeley_db_header=$bdb_header
+ apu_try_berkeley_db_libname=$bdb_libname
+
+ LIBS="$LIBS -l$apu_try_berkeley_db_libname"
+ if test "$cross_compiling" = yes; then :
+ apu_try_berkeley_db=yes
+
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <$apu_try_berkeley_db_header>
+main ()
+{
+ int major, minor, patch;
+
+ db_version(&major, &minor, &patch);
+
+ /* Sanity check: ensure that db.h constants actually match the db library */
+ if (major != DB_VERSION_MAJOR
+ || minor != DB_VERSION_MINOR
+ || patch != DB_VERSION_PATCH)
+ exit (1);
+
+ /* Run-time check: ensure the library claims to be the correct version. */
+
+ if ($apu_check_berkeley_db_major != -1) {
+ if (major < $apu_check_berkeley_db_major)
+ exit (1);
+ if (major > $apu_check_berkeley_db_major)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_minor != -1) {
+ if (minor < $apu_check_berkeley_db_minor)
+ exit (1);
+ if (minor > $apu_check_berkeley_db_minor)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_patch == -1
+ || patch >= $apu_check_berkeley_db_patch)
+ exit (0);
+ else
+ exit (1);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ apu_try_berkeley_db=yes
+else
+ apu_try_berkeley_db=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+ LIBS="$apu_try_berkeley_db_save_libs"
+
+
+ eval "$cache_id=$apu_try_berkeley_db"
+
+fi
+
+ result="`eval echo '$'$cache_id`"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5
+$as_echo "$result" >&6; }
+ elif test ""${db_major}"" = "1"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_dbopen" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dbopen in -l$bdb_libname" >&5
+$as_echo_n "checking for dbopen in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dbopen ();
+int
+main ()
+{
+return dbopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ elif test ""${db_major}"" = "2"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_db_open" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for db_open in -l$bdb_libname" >&5
+$as_echo_n "checking for db_open in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char db_open ();
+int
+main ()
+{
+return db_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ fi
+
+else
+ result="no"
+fi
+
+
+
+ # If we found it, no need to search any more.
+ if test "$result" = "yes"; then
+ found="$bdb_place"
+ break
+ fi
+ done
+ test "$found" != "not" && break
+ done
+ test "$found" != "not" && break
+ done
+
+ # Restore the original values of the flags we tweak.
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+
+ case "$found" in
+ "not")
+ apu_have_db=0
+ ;;
+ "std")
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *":"*)
+ header="`echo $found | sed -e 's/:.*$//'`"
+ lib="`echo $found | sed -e 's/^.*://'`"
+
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$header\""
+ APRUTIL_INCLUDES="-I$header"
+ else
+ apr_addto_bugger="-I$header"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$lib\""
+ APRUTIL_LDFLAGS="-L$lib"
+ else
+ apr_addto_bugger="-L$lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *)
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$found/include\""
+ APRUTIL_INCLUDES="-I$found/include"
+ else
+ apr_addto_bugger="-I$found/include"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$found/lib\""
+ APRUTIL_LDFLAGS="-L$found/lib"
+ else
+ apr_addto_bugger="-L$found/lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ esac
+
+ if test "$apu_have_db" = "1"; then
+ apu_db_version=${db_major}
+ fi
+
+ if test "$apu_db_version" != "$db_major"; then
+ as_fn_error $? "Berkeley db$db_major not found" "$LINENO" 5
+ fi
+ ;;
+ db[456])
+ db_major=`echo "$requested" | sed -e 's/db//'`
+ # Start version search at version x.9
+ db_minor=9
+ while [ $db_minor -ge 0 ]
+ do
+
+ places="$check_places"
+ db_major="$db_major"
+ db_minor="$db_minor"
+ if test -z "$places"; then
+ places="std /usr/local /usr/local/BerkeleyDB.${db_major}.${db_minor} /boot/home/config"
+ fi
+
+ bdb_version="${db_major}"
+ if test ""${db_minor}"" != "-1"; then
+ bdb_version="$bdb_version."${db_minor}""
+ if test ""-1"" != "-1"; then
+ bdb_version="$bdb_version."-1""
+ fi
+ fi
+ bdb_places="$places"
+ bdb_default_search_headers="db${db_major}${db_minor}/db.h db${db_major}/db.h db.h"
+ bdb_default_search_lib_names="db-${db_major}.${db_minor} db${db_major}-${db_major}.${db_minor} db${db_major}${db_minor} db-${db_major} db${db_major} db"
+
+
+ apu_have_db=0
+
+ # Save the original values of the flags we tweak.
+ apu_check_lib_save_libs="$LIBS"
+ apu_check_lib_save_ldflags="$LDFLAGS"
+ apu_check_lib_save_cppflags="$CPPFLAGS"
+
+ # The variable `found' is the prefix under which we've found
+ # Berkeley DB, or `not' if we haven't found it anywhere yet.
+ found=not
+ for bdb_place in $bdb_places; do
+
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+ case "$bdb_place" in
+ "std" )
+ description="the standard places"
+ ;;
+ *":"* )
+ header="`echo $bdb_place | sed -e 's/:.*$//'`"
+ lib="`echo $bdb_place | sed -e 's/^.*://'`"
+ CPPFLAGS="$CPPFLAGS -I$header"
+ LDFLAGS="$LDFLAGS -L$lib"
+ description="$header and $lib"
+ ;;
+ * )
+ if test -d $bdb_place; then
+ LDFLAGS="$LDFLAGS -L$bdb_place/lib"
+ CPPFLAGS="$CPPFLAGS -I$bdb_place/include"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $bdb_place" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $bdb_place... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: directory not found" >&5
+$as_echo "directory not found" >&6; }
+ continue
+ fi
+ description="$bdb_place"
+ ;;
+ esac
+
+ # Since there is no AC_MSG_NOTICE in autoconf 2.13, we use this
+ # trick to display a message instead.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $description" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $description... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
+$as_echo "" >&6; }
+
+ for bdb_libname in $bdb_default_search_lib_names; do
+ for bdb_header in $bdb_default_search_headers; do
+ # Clear the header cache variable for each location
+
+ cache_id="`echo ac_cv_header_${bdb_header} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+ unset $cache_id
+ as_ac_Header=`$as_echo "ac_cv_header_$bdb_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$bdb_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+
+ if test ""${db_major}"" = "3" -o ""${db_major}"" = "4" -o ""${db_major}"" = "5" -o ""${db_major}"" = "6"; then
+ # We generate a separate cache variable for each prefix and libname
+ # we search under. That way, we avoid caching information that
+ # changes if the user runs `configure' with a different set of
+ # switches.
+
+ cache_id="`echo apu_cv_check_berkeley_db_"${db_major}"_"${db_minor}"_"-1"_${bdb_header}_${bdb_libname}_in_${bdb_place} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -l$bdb_libname" >&5
+$as_echo_n "checking for -l$bdb_libname... " >&6; }
+ if eval \${$cache_id+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+
+ apu_try_berkeley_db_save_libs="$LIBS"
+
+ apu_check_berkeley_db_major="${db_major}"
+ apu_check_berkeley_db_minor="${db_minor}"
+ apu_check_berkeley_db_patch="-1"
+ apu_try_berkeley_db_header=$bdb_header
+ apu_try_berkeley_db_libname=$bdb_libname
+
+ LIBS="$LIBS -l$apu_try_berkeley_db_libname"
+ if test "$cross_compiling" = yes; then :
+ apu_try_berkeley_db=yes
+
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <$apu_try_berkeley_db_header>
+main ()
+{
+ int major, minor, patch;
+
+ db_version(&major, &minor, &patch);
+
+ /* Sanity check: ensure that db.h constants actually match the db library */
+ if (major != DB_VERSION_MAJOR
+ || minor != DB_VERSION_MINOR
+ || patch != DB_VERSION_PATCH)
+ exit (1);
+
+ /* Run-time check: ensure the library claims to be the correct version. */
+
+ if ($apu_check_berkeley_db_major != -1) {
+ if (major < $apu_check_berkeley_db_major)
+ exit (1);
+ if (major > $apu_check_berkeley_db_major)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_minor != -1) {
+ if (minor < $apu_check_berkeley_db_minor)
+ exit (1);
+ if (minor > $apu_check_berkeley_db_minor)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_patch == -1
+ || patch >= $apu_check_berkeley_db_patch)
+ exit (0);
+ else
+ exit (1);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ apu_try_berkeley_db=yes
+else
+ apu_try_berkeley_db=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+ LIBS="$apu_try_berkeley_db_save_libs"
+
+
+ eval "$cache_id=$apu_try_berkeley_db"
+
+fi
+
+ result="`eval echo '$'$cache_id`"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5
+$as_echo "$result" >&6; }
+ elif test ""${db_major}"" = "1"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_dbopen" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dbopen in -l$bdb_libname" >&5
+$as_echo_n "checking for dbopen in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dbopen ();
+int
+main ()
+{
+return dbopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ elif test ""${db_major}"" = "2"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_db_open" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for db_open in -l$bdb_libname" >&5
+$as_echo_n "checking for db_open in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char db_open ();
+int
+main ()
+{
+return db_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ fi
+
+else
+ result="no"
+fi
+
+
+
+ # If we found it, no need to search any more.
+ if test "$result" = "yes"; then
+ found="$bdb_place"
+ break
+ fi
+ done
+ test "$found" != "not" && break
+ done
+ test "$found" != "not" && break
+ done
+
+ # Restore the original values of the flags we tweak.
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+
+ case "$found" in
+ "not")
+ apu_have_db=0
+ ;;
+ "std")
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *":"*)
+ header="`echo $found | sed -e 's/:.*$//'`"
+ lib="`echo $found | sed -e 's/^.*://'`"
+
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$header\""
+ APRUTIL_INCLUDES="-I$header"
+ else
+ apr_addto_bugger="-I$header"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$lib\""
+ APRUTIL_LDFLAGS="-L$lib"
+ else
+ apr_addto_bugger="-L$lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *)
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$found/include\""
+ APRUTIL_INCLUDES="-I$found/include"
+ else
+ apr_addto_bugger="-I$found/include"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$found/lib\""
+ APRUTIL_LDFLAGS="-L$found/lib"
+ else
+ apr_addto_bugger="-L$found/lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ esac
+
+ if test "$apu_have_db" = "1"; then
+ apu_db_version=${db_major}
+ fi
+
+ if test "$apu_have_db" = "1"; then
+ break
+ fi
+ db_minor=`expr $db_minor - 1`
+ done
+ if test "$apu_db_version" != "$db_major"; then
+ as_fn_error $? "Berkeley db$db_major not found" "$LINENO" 5
+ fi
+ ;;
+ default)
+
+ all_places="$check_places"
+
+ # Start version search at version 6.9
+ db_version=69
+ while [ $db_version -ge 40 ]
+ do
+ db_major=`echo $db_version | sed -e 's/.$//'`
+ db_minor=`echo $db_version | sed -e 's/.//'`
+
+ places="$all_places"
+ db_major="$db_major"
+ db_minor="$db_minor"
+ if test -z "$places"; then
+ places="std /usr/local /usr/local/BerkeleyDB.${db_major}.${db_minor} /boot/home/config"
+ fi
+
+ bdb_version="${db_major}"
+ if test ""${db_minor}"" != "-1"; then
+ bdb_version="$bdb_version."${db_minor}""
+ if test ""-1"" != "-1"; then
+ bdb_version="$bdb_version."-1""
+ fi
+ fi
+ bdb_places="$places"
+ bdb_default_search_headers="db${db_major}${db_minor}/db.h db${db_major}/db.h db.h"
+ bdb_default_search_lib_names="db-${db_major}.${db_minor} db${db_major}-${db_major}.${db_minor} db${db_major}${db_minor} db-${db_major} db${db_major} db"
+
+
+ apu_have_db=0
+
+ # Save the original values of the flags we tweak.
+ apu_check_lib_save_libs="$LIBS"
+ apu_check_lib_save_ldflags="$LDFLAGS"
+ apu_check_lib_save_cppflags="$CPPFLAGS"
+
+ # The variable `found' is the prefix under which we've found
+ # Berkeley DB, or `not' if we haven't found it anywhere yet.
+ found=not
+ for bdb_place in $bdb_places; do
+
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+ case "$bdb_place" in
+ "std" )
+ description="the standard places"
+ ;;
+ *":"* )
+ header="`echo $bdb_place | sed -e 's/:.*$//'`"
+ lib="`echo $bdb_place | sed -e 's/^.*://'`"
+ CPPFLAGS="$CPPFLAGS -I$header"
+ LDFLAGS="$LDFLAGS -L$lib"
+ description="$header and $lib"
+ ;;
+ * )
+ if test -d $bdb_place; then
+ LDFLAGS="$LDFLAGS -L$bdb_place/lib"
+ CPPFLAGS="$CPPFLAGS -I$bdb_place/include"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $bdb_place" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $bdb_place... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: directory not found" >&5
+$as_echo "directory not found" >&6; }
+ continue
+ fi
+ description="$bdb_place"
+ ;;
+ esac
+
+ # Since there is no AC_MSG_NOTICE in autoconf 2.13, we use this
+ # trick to display a message instead.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $description" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $description... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
+$as_echo "" >&6; }
+
+ for bdb_libname in $bdb_default_search_lib_names; do
+ for bdb_header in $bdb_default_search_headers; do
+ # Clear the header cache variable for each location
+
+ cache_id="`echo ac_cv_header_${bdb_header} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+ unset $cache_id
+ as_ac_Header=`$as_echo "ac_cv_header_$bdb_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$bdb_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+
+ if test ""${db_major}"" = "3" -o ""${db_major}"" = "4" -o ""${db_major}"" = "5" -o ""${db_major}"" = "6"; then
+ # We generate a separate cache variable for each prefix and libname
+ # we search under. That way, we avoid caching information that
+ # changes if the user runs `configure' with a different set of
+ # switches.
+
+ cache_id="`echo apu_cv_check_berkeley_db_"${db_major}"_"${db_minor}"_"-1"_${bdb_header}_${bdb_libname}_in_${bdb_place} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -l$bdb_libname" >&5
+$as_echo_n "checking for -l$bdb_libname... " >&6; }
+ if eval \${$cache_id+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+
+ apu_try_berkeley_db_save_libs="$LIBS"
+
+ apu_check_berkeley_db_major="${db_major}"
+ apu_check_berkeley_db_minor="${db_minor}"
+ apu_check_berkeley_db_patch="-1"
+ apu_try_berkeley_db_header=$bdb_header
+ apu_try_berkeley_db_libname=$bdb_libname
+
+ LIBS="$LIBS -l$apu_try_berkeley_db_libname"
+ if test "$cross_compiling" = yes; then :
+ apu_try_berkeley_db=yes
+
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <$apu_try_berkeley_db_header>
+main ()
+{
+ int major, minor, patch;
+
+ db_version(&major, &minor, &patch);
+
+ /* Sanity check: ensure that db.h constants actually match the db library */
+ if (major != DB_VERSION_MAJOR
+ || minor != DB_VERSION_MINOR
+ || patch != DB_VERSION_PATCH)
+ exit (1);
+
+ /* Run-time check: ensure the library claims to be the correct version. */
+
+ if ($apu_check_berkeley_db_major != -1) {
+ if (major < $apu_check_berkeley_db_major)
+ exit (1);
+ if (major > $apu_check_berkeley_db_major)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_minor != -1) {
+ if (minor < $apu_check_berkeley_db_minor)
+ exit (1);
+ if (minor > $apu_check_berkeley_db_minor)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_patch == -1
+ || patch >= $apu_check_berkeley_db_patch)
+ exit (0);
+ else
+ exit (1);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ apu_try_berkeley_db=yes
+else
+ apu_try_berkeley_db=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+ LIBS="$apu_try_berkeley_db_save_libs"
+
+
+ eval "$cache_id=$apu_try_berkeley_db"
+
+fi
+
+ result="`eval echo '$'$cache_id`"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5
+$as_echo "$result" >&6; }
+ elif test ""${db_major}"" = "1"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_dbopen" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dbopen in -l$bdb_libname" >&5
+$as_echo_n "checking for dbopen in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dbopen ();
+int
+main ()
+{
+return dbopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ elif test ""${db_major}"" = "2"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_db_open" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for db_open in -l$bdb_libname" >&5
+$as_echo_n "checking for db_open in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char db_open ();
+int
+main ()
+{
+return db_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ fi
+
+else
+ result="no"
+fi
+
+
+
+ # If we found it, no need to search any more.
+ if test "$result" = "yes"; then
+ found="$bdb_place"
+ break
+ fi
+ done
+ test "$found" != "not" && break
+ done
+ test "$found" != "not" && break
+ done
+
+ # Restore the original values of the flags we tweak.
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+
+ case "$found" in
+ "not")
+ apu_have_db=0
+ ;;
+ "std")
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *":"*)
+ header="`echo $found | sed -e 's/:.*$//'`"
+ lib="`echo $found | sed -e 's/^.*://'`"
+
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$header\""
+ APRUTIL_INCLUDES="-I$header"
+ else
+ apr_addto_bugger="-I$header"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$lib\""
+ APRUTIL_LDFLAGS="-L$lib"
+ else
+ apr_addto_bugger="-L$lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *)
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$found/include\""
+ APRUTIL_INCLUDES="-I$found/include"
+ else
+ apr_addto_bugger="-I$found/include"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$found/lib\""
+ APRUTIL_LDFLAGS="-L$found/lib"
+ else
+ apr_addto_bugger="-L$found/lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ esac
+
+ if test "$apu_have_db" = "1"; then
+ apu_db_version=${db_major}
+ fi
+
+ if test "$apu_have_db" = "1"; then
+ break
+ fi
+ db_version=`expr $db_version - 1`
+ done
+ if test "$apu_have_db" = "0"; then
+
+ places="$all_places"
+ if test -z "$places"; then
+ places="std"
+ fi
+
+ bdb_version=3
+ if test "-1" != "-1"; then
+ bdb_version="$bdb_version.-1"
+ if test "-1" != "-1"; then
+ bdb_version="$bdb_version.-1"
+ fi
+ fi
+ bdb_places="$places"
+ bdb_default_search_headers="db3/db.h db.h"
+ bdb_default_search_lib_names="db3 db"
+
+
+ apu_have_db=0
+
+ # Save the original values of the flags we tweak.
+ apu_check_lib_save_libs="$LIBS"
+ apu_check_lib_save_ldflags="$LDFLAGS"
+ apu_check_lib_save_cppflags="$CPPFLAGS"
+
+ # The variable `found' is the prefix under which we've found
+ # Berkeley DB, or `not' if we haven't found it anywhere yet.
+ found=not
+ for bdb_place in $bdb_places; do
+
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+ case "$bdb_place" in
+ "std" )
+ description="the standard places"
+ ;;
+ *":"* )
+ header="`echo $bdb_place | sed -e 's/:.*$//'`"
+ lib="`echo $bdb_place | sed -e 's/^.*://'`"
+ CPPFLAGS="$CPPFLAGS -I$header"
+ LDFLAGS="$LDFLAGS -L$lib"
+ description="$header and $lib"
+ ;;
+ * )
+ if test -d $bdb_place; then
+ LDFLAGS="$LDFLAGS -L$bdb_place/lib"
+ CPPFLAGS="$CPPFLAGS -I$bdb_place/include"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $bdb_place" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $bdb_place... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: directory not found" >&5
+$as_echo "directory not found" >&6; }
+ continue
+ fi
+ description="$bdb_place"
+ ;;
+ esac
+
+ # Since there is no AC_MSG_NOTICE in autoconf 2.13, we use this
+ # trick to display a message instead.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $description" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $description... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
+$as_echo "" >&6; }
+
+ for bdb_libname in $bdb_default_search_lib_names; do
+ for bdb_header in $bdb_default_search_headers; do
+ # Clear the header cache variable for each location
+
+ cache_id="`echo ac_cv_header_${bdb_header} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+ unset $cache_id
+ as_ac_Header=`$as_echo "ac_cv_header_$bdb_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$bdb_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+
+ if test "3" = "3" -o "3" = "4" -o "3" = "5" -o "3" = "6"; then
+ # We generate a separate cache variable for each prefix and libname
+ # we search under. That way, we avoid caching information that
+ # changes if the user runs `configure' with a different set of
+ # switches.
+
+ cache_id="`echo apu_cv_check_berkeley_db_3_-1_-1_${bdb_header}_${bdb_libname}_in_${bdb_place} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -l$bdb_libname" >&5
+$as_echo_n "checking for -l$bdb_libname... " >&6; }
+ if eval \${$cache_id+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+
+ apu_try_berkeley_db_save_libs="$LIBS"
+
+ apu_check_berkeley_db_major=3
+ apu_check_berkeley_db_minor=-1
+ apu_check_berkeley_db_patch=-1
+ apu_try_berkeley_db_header=$bdb_header
+ apu_try_berkeley_db_libname=$bdb_libname
+
+ LIBS="$LIBS -l$apu_try_berkeley_db_libname"
+ if test "$cross_compiling" = yes; then :
+ apu_try_berkeley_db=yes
+
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <$apu_try_berkeley_db_header>
+main ()
+{
+ int major, minor, patch;
+
+ db_version(&major, &minor, &patch);
+
+ /* Sanity check: ensure that db.h constants actually match the db library */
+ if (major != DB_VERSION_MAJOR
+ || minor != DB_VERSION_MINOR
+ || patch != DB_VERSION_PATCH)
+ exit (1);
+
+ /* Run-time check: ensure the library claims to be the correct version. */
+
+ if ($apu_check_berkeley_db_major != -1) {
+ if (major < $apu_check_berkeley_db_major)
+ exit (1);
+ if (major > $apu_check_berkeley_db_major)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_minor != -1) {
+ if (minor < $apu_check_berkeley_db_minor)
+ exit (1);
+ if (minor > $apu_check_berkeley_db_minor)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_patch == -1
+ || patch >= $apu_check_berkeley_db_patch)
+ exit (0);
+ else
+ exit (1);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ apu_try_berkeley_db=yes
+else
+ apu_try_berkeley_db=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+ LIBS="$apu_try_berkeley_db_save_libs"
+
+
+ eval "$cache_id=$apu_try_berkeley_db"
+
+fi
+
+ result="`eval echo '$'$cache_id`"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5
+$as_echo "$result" >&6; }
+ elif test "3" = "1"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_dbopen" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dbopen in -l$bdb_libname" >&5
+$as_echo_n "checking for dbopen in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dbopen ();
+int
+main ()
+{
+return dbopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ elif test "3" = "2"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_db_open" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for db_open in -l$bdb_libname" >&5
+$as_echo_n "checking for db_open in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char db_open ();
+int
+main ()
+{
+return db_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ fi
+
+else
+ result="no"
+fi
+
+
+
+ # If we found it, no need to search any more.
+ if test "$result" = "yes"; then
+ found="$bdb_place"
+ break
+ fi
+ done
+ test "$found" != "not" && break
+ done
+ test "$found" != "not" && break
+ done
+
+ # Restore the original values of the flags we tweak.
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+
+ case "$found" in
+ "not")
+ apu_have_db=0
+ ;;
+ "std")
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *":"*)
+ header="`echo $found | sed -e 's/:.*$//'`"
+ lib="`echo $found | sed -e 's/^.*://'`"
+
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$header\""
+ APRUTIL_INCLUDES="-I$header"
+ else
+ apr_addto_bugger="-I$header"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$lib\""
+ APRUTIL_LDFLAGS="-L$lib"
+ else
+ apr_addto_bugger="-L$lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *)
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$found/include\""
+ APRUTIL_INCLUDES="-I$found/include"
+ else
+ apr_addto_bugger="-I$found/include"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$found/lib\""
+ APRUTIL_LDFLAGS="-L$found/lib"
+ else
+ apr_addto_bugger="-L$found/lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ esac
+
+ if test "$apu_have_db" = "1"; then
+ apu_db_version=3
+ fi
+
+ fi
+ if test "$apu_have_db" = "0"; then
+
+ places="$all_places"
+ if test -z "$places"; then
+ places="std"
+ fi
+
+ bdb_version=2
+ if test "-1" != "-1"; then
+ bdb_version="$bdb_version.-1"
+ if test "-1" != "-1"; then
+ bdb_version="$bdb_version.-1"
+ fi
+ fi
+ bdb_places="$places"
+ bdb_default_search_headers="db2/db.h db.h"
+ bdb_default_search_lib_names="db2 db"
+
+
+ apu_have_db=0
+
+ # Save the original values of the flags we tweak.
+ apu_check_lib_save_libs="$LIBS"
+ apu_check_lib_save_ldflags="$LDFLAGS"
+ apu_check_lib_save_cppflags="$CPPFLAGS"
+
+ # The variable `found' is the prefix under which we've found
+ # Berkeley DB, or `not' if we haven't found it anywhere yet.
+ found=not
+ for bdb_place in $bdb_places; do
+
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+ case "$bdb_place" in
+ "std" )
+ description="the standard places"
+ ;;
+ *":"* )
+ header="`echo $bdb_place | sed -e 's/:.*$//'`"
+ lib="`echo $bdb_place | sed -e 's/^.*://'`"
+ CPPFLAGS="$CPPFLAGS -I$header"
+ LDFLAGS="$LDFLAGS -L$lib"
+ description="$header and $lib"
+ ;;
+ * )
+ if test -d $bdb_place; then
+ LDFLAGS="$LDFLAGS -L$bdb_place/lib"
+ CPPFLAGS="$CPPFLAGS -I$bdb_place/include"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $bdb_place" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $bdb_place... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: directory not found" >&5
+$as_echo "directory not found" >&6; }
+ continue
+ fi
+ description="$bdb_place"
+ ;;
+ esac
+
+ # Since there is no AC_MSG_NOTICE in autoconf 2.13, we use this
+ # trick to display a message instead.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $description" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $description... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
+$as_echo "" >&6; }
+
+ for bdb_libname in $bdb_default_search_lib_names; do
+ for bdb_header in $bdb_default_search_headers; do
+ # Clear the header cache variable for each location
+
+ cache_id="`echo ac_cv_header_${bdb_header} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+ unset $cache_id
+ as_ac_Header=`$as_echo "ac_cv_header_$bdb_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$bdb_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+
+ if test "2" = "3" -o "2" = "4" -o "2" = "5" -o "2" = "6"; then
+ # We generate a separate cache variable for each prefix and libname
+ # we search under. That way, we avoid caching information that
+ # changes if the user runs `configure' with a different set of
+ # switches.
+
+ cache_id="`echo apu_cv_check_berkeley_db_2_-1_-1_${bdb_header}_${bdb_libname}_in_${bdb_place} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -l$bdb_libname" >&5
+$as_echo_n "checking for -l$bdb_libname... " >&6; }
+ if eval \${$cache_id+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+
+ apu_try_berkeley_db_save_libs="$LIBS"
+
+ apu_check_berkeley_db_major=2
+ apu_check_berkeley_db_minor=-1
+ apu_check_berkeley_db_patch=-1
+ apu_try_berkeley_db_header=$bdb_header
+ apu_try_berkeley_db_libname=$bdb_libname
+
+ LIBS="$LIBS -l$apu_try_berkeley_db_libname"
+ if test "$cross_compiling" = yes; then :
+ apu_try_berkeley_db=yes
+
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <$apu_try_berkeley_db_header>
+main ()
+{
+ int major, minor, patch;
+
+ db_version(&major, &minor, &patch);
+
+ /* Sanity check: ensure that db.h constants actually match the db library */
+ if (major != DB_VERSION_MAJOR
+ || minor != DB_VERSION_MINOR
+ || patch != DB_VERSION_PATCH)
+ exit (1);
+
+ /* Run-time check: ensure the library claims to be the correct version. */
+
+ if ($apu_check_berkeley_db_major != -1) {
+ if (major < $apu_check_berkeley_db_major)
+ exit (1);
+ if (major > $apu_check_berkeley_db_major)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_minor != -1) {
+ if (minor < $apu_check_berkeley_db_minor)
+ exit (1);
+ if (minor > $apu_check_berkeley_db_minor)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_patch == -1
+ || patch >= $apu_check_berkeley_db_patch)
+ exit (0);
+ else
+ exit (1);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ apu_try_berkeley_db=yes
+else
+ apu_try_berkeley_db=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+ LIBS="$apu_try_berkeley_db_save_libs"
+
+
+ eval "$cache_id=$apu_try_berkeley_db"
+
+fi
+
+ result="`eval echo '$'$cache_id`"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5
+$as_echo "$result" >&6; }
+ elif test "2" = "1"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_dbopen" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dbopen in -l$bdb_libname" >&5
+$as_echo_n "checking for dbopen in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dbopen ();
+int
+main ()
+{
+return dbopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ elif test "2" = "2"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_db_open" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for db_open in -l$bdb_libname" >&5
+$as_echo_n "checking for db_open in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char db_open ();
+int
+main ()
+{
+return db_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ fi
+
+else
+ result="no"
+fi
+
+
+
+ # If we found it, no need to search any more.
+ if test "$result" = "yes"; then
+ found="$bdb_place"
+ break
+ fi
+ done
+ test "$found" != "not" && break
+ done
+ test "$found" != "not" && break
+ done
+
+ # Restore the original values of the flags we tweak.
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+
+ case "$found" in
+ "not")
+ apu_have_db=0
+ ;;
+ "std")
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *":"*)
+ header="`echo $found | sed -e 's/:.*$//'`"
+ lib="`echo $found | sed -e 's/^.*://'`"
+
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$header\""
+ APRUTIL_INCLUDES="-I$header"
+ else
+ apr_addto_bugger="-I$header"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$lib\""
+ APRUTIL_LDFLAGS="-L$lib"
+ else
+ apr_addto_bugger="-L$lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *)
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$found/include\""
+ APRUTIL_INCLUDES="-I$found/include"
+ else
+ apr_addto_bugger="-I$found/include"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$found/lib\""
+ APRUTIL_LDFLAGS="-L$found/lib"
+ else
+ apr_addto_bugger="-L$found/lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ esac
+
+ if test "$apu_have_db" = "1"; then
+ apu_db_version=2
+ fi
+
+ fi
+ if test "$apu_have_db" = "0"; then
+
+ places="$all_places"
+ if test -z "$places"; then
+ places="std"
+ fi
+
+ bdb_version=1
+ if test "0" != "-1"; then
+ bdb_version="$bdb_version.0"
+ if test "0" != "-1"; then
+ bdb_version="$bdb_version.0"
+ fi
+ fi
+ bdb_places="$places"
+ bdb_default_search_headers="db1/db.h db.h"
+ bdb_default_search_lib_names="db1"
+
+
+ apu_have_db=0
+
+ # Save the original values of the flags we tweak.
+ apu_check_lib_save_libs="$LIBS"
+ apu_check_lib_save_ldflags="$LDFLAGS"
+ apu_check_lib_save_cppflags="$CPPFLAGS"
+
+ # The variable `found' is the prefix under which we've found
+ # Berkeley DB, or `not' if we haven't found it anywhere yet.
+ found=not
+ for bdb_place in $bdb_places; do
+
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+ case "$bdb_place" in
+ "std" )
+ description="the standard places"
+ ;;
+ *":"* )
+ header="`echo $bdb_place | sed -e 's/:.*$//'`"
+ lib="`echo $bdb_place | sed -e 's/^.*://'`"
+ CPPFLAGS="$CPPFLAGS -I$header"
+ LDFLAGS="$LDFLAGS -L$lib"
+ description="$header and $lib"
+ ;;
+ * )
+ if test -d $bdb_place; then
+ LDFLAGS="$LDFLAGS -L$bdb_place/lib"
+ CPPFLAGS="$CPPFLAGS -I$bdb_place/include"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $bdb_place" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $bdb_place... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: directory not found" >&5
+$as_echo "directory not found" >&6; }
+ continue
+ fi
+ description="$bdb_place"
+ ;;
+ esac
+
+ # Since there is no AC_MSG_NOTICE in autoconf 2.13, we use this
+ # trick to display a message instead.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $description" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $description... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
+$as_echo "" >&6; }
+
+ for bdb_libname in $bdb_default_search_lib_names; do
+ for bdb_header in $bdb_default_search_headers; do
+ # Clear the header cache variable for each location
+
+ cache_id="`echo ac_cv_header_${bdb_header} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+ unset $cache_id
+ as_ac_Header=`$as_echo "ac_cv_header_$bdb_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$bdb_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+
+ if test "1" = "3" -o "1" = "4" -o "1" = "5" -o "1" = "6"; then
+ # We generate a separate cache variable for each prefix and libname
+ # we search under. That way, we avoid caching information that
+ # changes if the user runs `configure' with a different set of
+ # switches.
+
+ cache_id="`echo apu_cv_check_berkeley_db_1_0_0_${bdb_header}_${bdb_libname}_in_${bdb_place} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -l$bdb_libname" >&5
+$as_echo_n "checking for -l$bdb_libname... " >&6; }
+ if eval \${$cache_id+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+
+ apu_try_berkeley_db_save_libs="$LIBS"
+
+ apu_check_berkeley_db_major=1
+ apu_check_berkeley_db_minor=0
+ apu_check_berkeley_db_patch=0
+ apu_try_berkeley_db_header=$bdb_header
+ apu_try_berkeley_db_libname=$bdb_libname
+
+ LIBS="$LIBS -l$apu_try_berkeley_db_libname"
+ if test "$cross_compiling" = yes; then :
+ apu_try_berkeley_db=yes
+
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <$apu_try_berkeley_db_header>
+main ()
+{
+ int major, minor, patch;
+
+ db_version(&major, &minor, &patch);
+
+ /* Sanity check: ensure that db.h constants actually match the db library */
+ if (major != DB_VERSION_MAJOR
+ || minor != DB_VERSION_MINOR
+ || patch != DB_VERSION_PATCH)
+ exit (1);
+
+ /* Run-time check: ensure the library claims to be the correct version. */
+
+ if ($apu_check_berkeley_db_major != -1) {
+ if (major < $apu_check_berkeley_db_major)
+ exit (1);
+ if (major > $apu_check_berkeley_db_major)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_minor != -1) {
+ if (minor < $apu_check_berkeley_db_minor)
+ exit (1);
+ if (minor > $apu_check_berkeley_db_minor)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_patch == -1
+ || patch >= $apu_check_berkeley_db_patch)
+ exit (0);
+ else
+ exit (1);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ apu_try_berkeley_db=yes
+else
+ apu_try_berkeley_db=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+ LIBS="$apu_try_berkeley_db_save_libs"
+
+
+ eval "$cache_id=$apu_try_berkeley_db"
+
+fi
+
+ result="`eval echo '$'$cache_id`"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5
+$as_echo "$result" >&6; }
+ elif test "1" = "1"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_dbopen" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dbopen in -l$bdb_libname" >&5
+$as_echo_n "checking for dbopen in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dbopen ();
+int
+main ()
+{
+return dbopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ elif test "1" = "2"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_db_open" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for db_open in -l$bdb_libname" >&5
+$as_echo_n "checking for db_open in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char db_open ();
+int
+main ()
+{
+return db_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ fi
+
+else
+ result="no"
+fi
+
+
+
+ # If we found it, no need to search any more.
+ if test "$result" = "yes"; then
+ found="$bdb_place"
+ break
+ fi
+ done
+ test "$found" != "not" && break
+ done
+ test "$found" != "not" && break
+ done
+
+ # Restore the original values of the flags we tweak.
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+
+ case "$found" in
+ "not")
+ apu_have_db=0
+ ;;
+ "std")
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *":"*)
+ header="`echo $found | sed -e 's/:.*$//'`"
+ lib="`echo $found | sed -e 's/^.*://'`"
+
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$header\""
+ APRUTIL_INCLUDES="-I$header"
+ else
+ apr_addto_bugger="-I$header"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$lib\""
+ APRUTIL_LDFLAGS="-L$lib"
+ else
+ apr_addto_bugger="-L$lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *)
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$found/include\""
+ APRUTIL_INCLUDES="-I$found/include"
+ else
+ apr_addto_bugger="-I$found/include"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$found/lib\""
+ APRUTIL_LDFLAGS="-L$found/lib"
+ else
+ apr_addto_bugger="-L$found/lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ esac
+
+ if test "$apu_have_db" = "1"; then
+ apu_db_version=1
+ fi
+
+ fi
+ if test "$apu_have_db" = "0"; then
+
+ places="$all_places"
+ if test -z "$places"; then
+ places="std"
+ fi
+
+ bdb_version=1
+ if test "-1" != "-1"; then
+ bdb_version="$bdb_version.-1"
+ if test "-1" != "-1"; then
+ bdb_version="$bdb_version.-1"
+ fi
+ fi
+ bdb_places="$places"
+ bdb_default_search_headers="db_185.h"
+ bdb_default_search_lib_names="db"
+
+
+ apu_have_db=0
+
+ # Save the original values of the flags we tweak.
+ apu_check_lib_save_libs="$LIBS"
+ apu_check_lib_save_ldflags="$LDFLAGS"
+ apu_check_lib_save_cppflags="$CPPFLAGS"
+
+ # The variable `found' is the prefix under which we've found
+ # Berkeley DB, or `not' if we haven't found it anywhere yet.
+ found=not
+ for bdb_place in $bdb_places; do
+
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+ case "$bdb_place" in
+ "std" )
+ description="the standard places"
+ ;;
+ *":"* )
+ header="`echo $bdb_place | sed -e 's/:.*$//'`"
+ lib="`echo $bdb_place | sed -e 's/^.*://'`"
+ CPPFLAGS="$CPPFLAGS -I$header"
+ LDFLAGS="$LDFLAGS -L$lib"
+ description="$header and $lib"
+ ;;
+ * )
+ if test -d $bdb_place; then
+ LDFLAGS="$LDFLAGS -L$bdb_place/lib"
+ CPPFLAGS="$CPPFLAGS -I$bdb_place/include"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $bdb_place" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $bdb_place... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: directory not found" >&5
+$as_echo "directory not found" >&6; }
+ continue
+ fi
+ description="$bdb_place"
+ ;;
+ esac
+
+ # Since there is no AC_MSG_NOTICE in autoconf 2.13, we use this
+ # trick to display a message instead.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB $bdb_version in $description" >&5
+$as_echo_n "checking for Berkeley DB $bdb_version in $description... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
+$as_echo "" >&6; }
+
+ for bdb_libname in $bdb_default_search_lib_names; do
+ for bdb_header in $bdb_default_search_headers; do
+ # Clear the header cache variable for each location
+
+ cache_id="`echo ac_cv_header_${bdb_header} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+ unset $cache_id
+ as_ac_Header=`$as_echo "ac_cv_header_$bdb_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$bdb_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+
+ if test "1" = "3" -o "1" = "4" -o "1" = "5" -o "1" = "6"; then
+ # We generate a separate cache variable for each prefix and libname
+ # we search under. That way, we avoid caching information that
+ # changes if the user runs `configure' with a different set of
+ # switches.
+
+ cache_id="`echo apu_cv_check_berkeley_db_1_-1_-1_${bdb_header}_${bdb_libname}_in_${bdb_place} \
+ | sed -e 's/[^a-zA-Z0-9_]/_/g'`"
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -l$bdb_libname" >&5
+$as_echo_n "checking for -l$bdb_libname... " >&6; }
+ if eval \${$cache_id+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+
+ apu_try_berkeley_db_save_libs="$LIBS"
+
+ apu_check_berkeley_db_major=1
+ apu_check_berkeley_db_minor=-1
+ apu_check_berkeley_db_patch=-1
+ apu_try_berkeley_db_header=$bdb_header
+ apu_try_berkeley_db_libname=$bdb_libname
+
+ LIBS="$LIBS -l$apu_try_berkeley_db_libname"
+ if test "$cross_compiling" = yes; then :
+ apu_try_berkeley_db=yes
+
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <$apu_try_berkeley_db_header>
+main ()
+{
+ int major, minor, patch;
+
+ db_version(&major, &minor, &patch);
+
+ /* Sanity check: ensure that db.h constants actually match the db library */
+ if (major != DB_VERSION_MAJOR
+ || minor != DB_VERSION_MINOR
+ || patch != DB_VERSION_PATCH)
+ exit (1);
+
+ /* Run-time check: ensure the library claims to be the correct version. */
+
+ if ($apu_check_berkeley_db_major != -1) {
+ if (major < $apu_check_berkeley_db_major)
+ exit (1);
+ if (major > $apu_check_berkeley_db_major)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_minor != -1) {
+ if (minor < $apu_check_berkeley_db_minor)
+ exit (1);
+ if (minor > $apu_check_berkeley_db_minor)
+ exit (0);
+ }
+
+ if ($apu_check_berkeley_db_patch == -1
+ || patch >= $apu_check_berkeley_db_patch)
+ exit (0);
+ else
+ exit (1);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ apu_try_berkeley_db=yes
+else
+ apu_try_berkeley_db=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+ LIBS="$apu_try_berkeley_db_save_libs"
+
+
+ eval "$cache_id=$apu_try_berkeley_db"
+
+fi
+
+ result="`eval echo '$'$cache_id`"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5
+$as_echo "$result" >&6; }
+ elif test "1" = "1"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_dbopen" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dbopen in -l$bdb_libname" >&5
+$as_echo_n "checking for dbopen in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dbopen ();
+int
+main ()
+{
+return dbopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ elif test "1" = "2"; then
+ as_ac_Lib=`$as_echo "ac_cv_lib_$bdb_libname''_db_open" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for db_open in -l$bdb_libname" >&5
+$as_echo_n "checking for db_open in -l$bdb_libname... " >&6; }
+if eval \${$as_ac_Lib+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-l$bdb_libname $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char db_open ();
+int
+main ()
+{
+return db_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$as_ac_Lib=yes"
+else
+ eval "$as_ac_Lib=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+eval ac_res=\$$as_ac_Lib
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
+ result=yes
+else
+ result=no
+
+fi
+
+ fi
+
+else
+ result="no"
+fi
+
+
+
+ # If we found it, no need to search any more.
+ if test "$result" = "yes"; then
+ found="$bdb_place"
+ break
+ fi
+ done
+ test "$found" != "not" && break
+ done
+ test "$found" != "not" && break
+ done
+
+ # Restore the original values of the flags we tweak.
+ LDFLAGS="$apu_check_lib_save_ldflags"
+ CPPFLAGS="$apu_check_lib_save_cppflags"
+
+ case "$found" in
+ "not")
+ apu_have_db=0
+ ;;
+ "std")
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *":"*)
+ header="`echo $found | sed -e 's/:.*$//'`"
+ lib="`echo $found | sed -e 's/^.*://'`"
+
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$header\""
+ APRUTIL_INCLUDES="-I$header"
+ else
+ apr_addto_bugger="-I$header"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$lib\""
+ APRUTIL_LDFLAGS="-L$lib"
+ else
+ apr_addto_bugger="-L$lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ *)
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$found/include\""
+ APRUTIL_INCLUDES="-I$found/include"
+ else
+ apr_addto_bugger="-I$found/include"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$found/lib\""
+ APRUTIL_LDFLAGS="-L$found/lib"
+ else
+ apr_addto_bugger="-L$found/lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_db_header=$bdb_header
+ apu_db_lib=$bdb_libname
+ apu_have_db=1
+ ;;
+ esac
+
+ if test "$apu_have_db" = "1"; then
+ apu_db_version=185
+ fi
+
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Berkeley DB" >&5
+$as_echo_n "checking for Berkeley DB... " >&6; }
+ if test "$apu_have_db" = "1"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: found db$apu_db_version" >&5
+$as_echo "found db$apu_db_version" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+$as_echo "not found" >&6; }
+ fi
+
+ ;;
+ esac
+
+ if test "$apu_have_db" = "0"; then
+ as_fn_error $? "Berkeley DB not found." "$LINENO" 5
+ fi
+ fi
+
+fi
+
+
+ if test -n "$apu_db_xtra_libs"; then
+ LIBS="$saveddbxtralibs"
+ fi
+
+ case "$requested" in
+ sdbm | gdbm | ndbm | db)
+ eval "apu_use_$requested=1"
+ apu_default_dbm=$requested
+ ;;
+ db185 | db[123456])
+ apu_use_db=1
+ apu_default_dbm=$requested
+ ;;
+ db[456][0-9])
+ apu_use_db=1
+ apu_default_dbm=`echo $requested | sed -e 's/.$//'`
+ ;;
+ default)
+ apu_default_dbm="sdbm (default)"
+ apu_use_sdbm=1
+ ;;
+ *)
+ as_fn_error $? "--with-dbm=$requested is an unknown DBM type.
+ Use one of: $dbm_list" "$LINENO" 5
+ ;;
+ esac
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for default DBM" >&5
+$as_echo_n "checking for default DBM... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $apu_default_dbm" >&5
+$as_echo "$apu_default_dbm" >&6; }
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test "$apu_have_db" = "1"; then
+
+ if test "x$LDADD_dbm_db" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDADD_dbm_db to \"-l$apu_db_lib\""
+ LDADD_dbm_db="-l$apu_db_lib"
+ else
+ apr_addto_bugger="-l$apu_db_lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDADD_dbm_db; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDADD_dbm_db"
+ LDADD_dbm_db="$LDADD_dbm_db $i"
+ fi
+ done
+ fi
+
+ if test -n "apu_db_xtra_libs"; then
+
+ if test "x$LDADD_dbm_db" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDADD_dbm_db to \"$apu_db_xtra_libs\""
+ LDADD_dbm_db="$apu_db_xtra_libs"
+ else
+ apr_addto_bugger="$apu_db_xtra_libs"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDADD_dbm_db; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDADD_dbm_db"
+ LDADD_dbm_db="$LDADD_dbm_db $i"
+ fi
+ done
+ fi
+
+ fi
+ fi
+
+ if test "$apu_have_gdbm" = "1"; then
+
+ if test "x$LDADD_dbm_gdbm" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDADD_dbm_gdbm to \"-lgdbm\""
+ LDADD_dbm_gdbm="-lgdbm"
+ else
+ apr_addto_bugger="-lgdbm"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDADD_dbm_gdbm; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDADD_dbm_gdbm"
+ LDADD_dbm_gdbm="$LDADD_dbm_gdbm $i"
+ fi
+ done
+ fi
+
+ fi
+
+ if test "$apu_have_ndbm" = "1"; then
+
+ if test "x$LDADD_dbm_ndbm" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDADD_dbm_ndbm to \"-l$apu_ndbm_lib\""
+ LDADD_dbm_ndbm="-l$apu_ndbm_lib"
+ else
+ apr_addto_bugger="-l$apu_ndbm_lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDADD_dbm_ndbm; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDADD_dbm_ndbm"
+ LDADD_dbm_ndbm="$LDADD_dbm_ndbm $i"
+ fi
+ done
+ fi
+
+ fi
+
+
+
+
+
+
+ apu_have_pgsql=0
+
+ old_libs="$LIBS"
+ old_cppflags="$CPPFLAGS"
+ old_ldflags="$LDFLAGS"
+
+
+# Check whether --with-pgsql was given.
+if test "${with_pgsql+set}" = set; then :
+ withval=$with_pgsql;
+ if test "$withval" = "yes"; then
+ # Extract the first word of "pg_config", so it can be a program name with args.
+set dummy pg_config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PGSQL_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $PGSQL_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PGSQL_CONFIG="$PGSQL_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_PGSQL_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+PGSQL_CONFIG=$ac_cv_path_PGSQL_CONFIG
+if test -n "$PGSQL_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PGSQL_CONFIG" >&5
+$as_echo "$PGSQL_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ if test "x$PGSQL_CONFIG" != 'x'; then
+ pgsql_CPPFLAGS="-I`$PGSQL_CONFIG --includedir`"
+ pgsql_LDFLAGS="-L`$PGSQL_CONFIG --libdir`"
+
+
+ if test "x$CPPFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"$pgsql_CPPFLAGS\""
+ CPPFLAGS="$pgsql_CPPFLAGS"
+ else
+ apr_addto_bugger="$pgsql_CPPFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $CPPFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $i"
+ fi
+ done
+ fi
+
+
+ if test "x$LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$pgsql_LDFLAGS\""
+ LDFLAGS="$pgsql_LDFLAGS"
+ else
+ apr_addto_bugger="$pgsql_LDFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS"
+ LDFLAGS="$LDFLAGS $i"
+ fi
+ done
+ fi
+
+ fi
+
+ for ac_header in libpq-fe.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "libpq-fe.h" "ac_cv_header_libpq_fe_h" "$ac_includes_default"
+if test "x$ac_cv_header_libpq_fe_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBPQ_FE_H 1
+_ACEOF
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PQsendQueryPrepared in -lpq" >&5
+$as_echo_n "checking for PQsendQueryPrepared in -lpq... " >&6; }
+if ${ac_cv_lib_pq_PQsendQueryPrepared+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpq $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char PQsendQueryPrepared ();
+int
+main ()
+{
+return PQsendQueryPrepared ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_pq_PQsendQueryPrepared=yes
+else
+ ac_cv_lib_pq_PQsendQueryPrepared=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pq_PQsendQueryPrepared" >&5
+$as_echo "$ac_cv_lib_pq_PQsendQueryPrepared" >&6; }
+if test "x$ac_cv_lib_pq_PQsendQueryPrepared" = xyes; then :
+ apu_have_pgsql=1
+else
+
+ if test "x$PGSQL_CONFIG" != 'x'; then
+ unset ac_cv_lib_pq_PQsendQueryPrepared
+ pgsql_LIBS="`$PGSQL_CONFIG --libs`"
+
+ if test "x$LIBS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LIBS to \"$pgsql_LIBS\""
+ LIBS="$pgsql_LIBS"
+ else
+ apr_addto_bugger="$pgsql_LIBS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LIBS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LIBS"
+ LIBS="$LIBS $i"
+ fi
+ done
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PQsendQueryPrepared in -lpq" >&5
+$as_echo_n "checking for PQsendQueryPrepared in -lpq... " >&6; }
+if ${ac_cv_lib_pq_PQsendQueryPrepared+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpq $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char PQsendQueryPrepared ();
+int
+main ()
+{
+return PQsendQueryPrepared ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_pq_PQsendQueryPrepared=yes
+else
+ ac_cv_lib_pq_PQsendQueryPrepared=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pq_PQsendQueryPrepared" >&5
+$as_echo "$ac_cv_lib_pq_PQsendQueryPrepared" >&6; }
+if test "x$ac_cv_lib_pq_PQsendQueryPrepared" = xyes; then :
+ apu_have_pgsql=1
+fi
+
+ fi
+
+fi
+
+
+fi
+
+done
+
+ if test "$apu_have_pgsql" = "0"; then
+ for ac_header in postgresql/libpq-fe.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "postgresql/libpq-fe.h" "ac_cv_header_postgresql_libpq_fe_h" "$ac_includes_default"
+if test "x$ac_cv_header_postgresql_libpq_fe_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_POSTGRESQL_LIBPQ_FE_H 1
+_ACEOF
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PQsendQueryPrepared in -lpq" >&5
+$as_echo_n "checking for PQsendQueryPrepared in -lpq... " >&6; }
+if ${ac_cv_lib_pq_PQsendQueryPrepared+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpq $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char PQsendQueryPrepared ();
+int
+main ()
+{
+return PQsendQueryPrepared ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_pq_PQsendQueryPrepared=yes
+else
+ ac_cv_lib_pq_PQsendQueryPrepared=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pq_PQsendQueryPrepared" >&5
+$as_echo "$ac_cv_lib_pq_PQsendQueryPrepared" >&6; }
+if test "x$ac_cv_lib_pq_PQsendQueryPrepared" = xyes; then :
+ apu_have_pgsql=1
+else
+
+ if test "x$PGSQL_CONFIG" != 'x'; then
+ unset ac_cv_lib_pq_PQsendQueryPrepared
+ pgsql_LIBS="`$PGSQL_CONFIG --libs`"
+
+ if test "x$LIBS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LIBS to \"$pgsql_LIBS\""
+ LIBS="$pgsql_LIBS"
+ else
+ apr_addto_bugger="$pgsql_LIBS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LIBS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LIBS"
+ LIBS="$LIBS $i"
+ fi
+ done
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PQsendQueryPrepared in -lpq" >&5
+$as_echo_n "checking for PQsendQueryPrepared in -lpq... " >&6; }
+if ${ac_cv_lib_pq_PQsendQueryPrepared+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpq $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char PQsendQueryPrepared ();
+int
+main ()
+{
+return PQsendQueryPrepared ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_pq_PQsendQueryPrepared=yes
+else
+ ac_cv_lib_pq_PQsendQueryPrepared=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pq_PQsendQueryPrepared" >&5
+$as_echo "$ac_cv_lib_pq_PQsendQueryPrepared" >&6; }
+if test "x$ac_cv_lib_pq_PQsendQueryPrepared" = xyes; then :
+ apu_have_pgsql=1
+fi
+
+ fi
+
+fi
+
+
+fi
+
+done
+
+ fi
+ if test "$apu_have_pgsql" != "0" && test "x$PGSQL_CONFIG" != 'x'; then
+
+ if test "x$APRUTIL_PRIV_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_PRIV_INCLUDES to \"$pgsql_CPPFLAGS\""
+ APRUTIL_PRIV_INCLUDES="$pgsql_CPPFLAGS"
+ else
+ apr_addto_bugger="$pgsql_CPPFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_PRIV_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_PRIV_INCLUDES"
+ APRUTIL_PRIV_INCLUDES="$APRUTIL_PRIV_INCLUDES $i"
+ fi
+ done
+ fi
+
+ fi
+ elif test "$withval" = "no"; then
+ :
+ else
+ # Extract the first word of "pg_config", so it can be a program name with args.
+set dummy pg_config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PGSQL_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $PGSQL_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PGSQL_CONFIG="$PGSQL_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $withval/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_PGSQL_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+PGSQL_CONFIG=$ac_cv_path_PGSQL_CONFIG
+if test -n "$PGSQL_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PGSQL_CONFIG" >&5
+$as_echo "$PGSQL_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ if test "x$PGSQL_CONFIG" != 'x'; then
+ pgsql_CPPFLAGS="-I`$PGSQL_CONFIG --includedir`"
+ pgsql_LDFLAGS="-L`$PGSQL_CONFIG --libdir`"
+ else
+ pgsql_CPPFLAGS="-I$withval/include"
+ pgsql_LDFLAGS="-L$withval/lib "
+ fi
+
+
+ if test "x$CPPFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"$pgsql_CPPFLAGS\""
+ CPPFLAGS="$pgsql_CPPFLAGS"
+ else
+ apr_addto_bugger="$pgsql_CPPFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $CPPFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $i"
+ fi
+ done
+ fi
+
+
+ if test "x$LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$pgsql_LDFLAGS\""
+ LDFLAGS="$pgsql_LDFLAGS"
+ else
+ apr_addto_bugger="$pgsql_LDFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS"
+ LDFLAGS="$LDFLAGS $i"
+ fi
+ done
+ fi
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pgsql in $withval" >&5
+$as_echo "$as_me: checking for pgsql in $withval" >&6;}
+ for ac_header in libpq-fe.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "libpq-fe.h" "ac_cv_header_libpq_fe_h" "$ac_includes_default"
+if test "x$ac_cv_header_libpq_fe_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBPQ_FE_H 1
+_ACEOF
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PQsendQueryPrepared in -lpq" >&5
+$as_echo_n "checking for PQsendQueryPrepared in -lpq... " >&6; }
+if ${ac_cv_lib_pq_PQsendQueryPrepared+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpq $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char PQsendQueryPrepared ();
+int
+main ()
+{
+return PQsendQueryPrepared ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_pq_PQsendQueryPrepared=yes
+else
+ ac_cv_lib_pq_PQsendQueryPrepared=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pq_PQsendQueryPrepared" >&5
+$as_echo "$ac_cv_lib_pq_PQsendQueryPrepared" >&6; }
+if test "x$ac_cv_lib_pq_PQsendQueryPrepared" = xyes; then :
+ apu_have_pgsql=1
+else
+
+ if test "x$PGSQL_CONFIG" != 'x'; then
+ unset ac_cv_lib_pq_PQsendQueryPrepared
+ pgsql_LIBS="`$PGSQL_CONFIG --libs`"
+
+ if test "x$LIBS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LIBS to \"$pgsql_LIBS\""
+ LIBS="$pgsql_LIBS"
+ else
+ apr_addto_bugger="$pgsql_LIBS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LIBS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LIBS"
+ LIBS="$LIBS $i"
+ fi
+ done
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PQsendQueryPrepared in -lpq" >&5
+$as_echo_n "checking for PQsendQueryPrepared in -lpq... " >&6; }
+if ${ac_cv_lib_pq_PQsendQueryPrepared+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpq $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char PQsendQueryPrepared ();
+int
+main ()
+{
+return PQsendQueryPrepared ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_pq_PQsendQueryPrepared=yes
+else
+ ac_cv_lib_pq_PQsendQueryPrepared=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pq_PQsendQueryPrepared" >&5
+$as_echo "$ac_cv_lib_pq_PQsendQueryPrepared" >&6; }
+if test "x$ac_cv_lib_pq_PQsendQueryPrepared" = xyes; then :
+ apu_have_pgsql=1
+fi
+
+ fi
+
+fi
+
+
+fi
+
+done
+
+ if test "$apu_have_pgsql" != "1"; then
+ for ac_header in postgresql/libpq-fe.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "postgresql/libpq-fe.h" "ac_cv_header_postgresql_libpq_fe_h" "$ac_includes_default"
+if test "x$ac_cv_header_postgresql_libpq_fe_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_POSTGRESQL_LIBPQ_FE_H 1
+_ACEOF
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PQsendQueryPrepared in -lpq" >&5
+$as_echo_n "checking for PQsendQueryPrepared in -lpq... " >&6; }
+if ${ac_cv_lib_pq_PQsendQueryPrepared+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpq $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char PQsendQueryPrepared ();
+int
+main ()
+{
+return PQsendQueryPrepared ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_pq_PQsendQueryPrepared=yes
+else
+ ac_cv_lib_pq_PQsendQueryPrepared=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pq_PQsendQueryPrepared" >&5
+$as_echo "$ac_cv_lib_pq_PQsendQueryPrepared" >&6; }
+if test "x$ac_cv_lib_pq_PQsendQueryPrepared" = xyes; then :
+ apu_have_pgsql=1
+else
+
+ if test "x$PGSQL_CONFIG" != 'x'; then
+ unset ac_cv_lib_pq_PQsendQueryPrepared
+ pgsql_LIBS="`$PGSQL_CONFIG --libs`"
+
+ if test "x$LIBS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LIBS to \"$pgsql_LIBS\""
+ LIBS="$pgsql_LIBS"
+ else
+ apr_addto_bugger="$pgsql_LIBS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LIBS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LIBS"
+ LIBS="$LIBS $i"
+ fi
+ done
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PQsendQueryPrepared in -lpq" >&5
+$as_echo_n "checking for PQsendQueryPrepared in -lpq... " >&6; }
+if ${ac_cv_lib_pq_PQsendQueryPrepared+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpq $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char PQsendQueryPrepared ();
+int
+main ()
+{
+return PQsendQueryPrepared ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_pq_PQsendQueryPrepared=yes
+else
+ ac_cv_lib_pq_PQsendQueryPrepared=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pq_PQsendQueryPrepared" >&5
+$as_echo "$ac_cv_lib_pq_PQsendQueryPrepared" >&6; }
+if test "x$ac_cv_lib_pq_PQsendQueryPrepared" = xyes; then :
+ apu_have_pgsql=1
+fi
+
+ fi
+
+fi
+
+
+fi
+
+done
+
+ fi
+ if test "$apu_have_pgsql" != "0"; then
+
+ if test "x$APRUTIL_PRIV_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_PRIV_INCLUDES to \"$pgsql_CPPFLAGS\""
+ APRUTIL_PRIV_INCLUDES="$pgsql_CPPFLAGS"
+ else
+ apr_addto_bugger="$pgsql_CPPFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_PRIV_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_PRIV_INCLUDES"
+ APRUTIL_PRIV_INCLUDES="$APRUTIL_PRIV_INCLUDES $i"
+ fi
+ done
+ fi
+
+ fi
+ fi
+
+else
+
+ # Extract the first word of "pg_config", so it can be a program name with args.
+set dummy pg_config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PGSQL_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $PGSQL_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PGSQL_CONFIG="$PGSQL_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_PGSQL_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+PGSQL_CONFIG=$ac_cv_path_PGSQL_CONFIG
+if test -n "$PGSQL_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PGSQL_CONFIG" >&5
+$as_echo "$PGSQL_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ if test "x$PGSQL_CONFIG" != 'x'; then
+ pgsql_CPPFLAGS="-I`$PGSQL_CONFIG --includedir`"
+ pgsql_LDFLAGS="-L`$PGSQL_CONFIG --libdir`"
+
+
+ if test "x$CPPFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"$pgsql_CPPFLAGS\""
+ CPPFLAGS="$pgsql_CPPFLAGS"
+ else
+ apr_addto_bugger="$pgsql_CPPFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $CPPFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $i"
+ fi
+ done
+ fi
+
+
+ if test "x$LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$pgsql_LDFLAGS\""
+ LDFLAGS="$pgsql_LDFLAGS"
+ else
+ apr_addto_bugger="$pgsql_LDFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS"
+ LDFLAGS="$LDFLAGS $i"
+ fi
+ done
+ fi
+
+ fi
+
+ for ac_header in libpq-fe.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "libpq-fe.h" "ac_cv_header_libpq_fe_h" "$ac_includes_default"
+if test "x$ac_cv_header_libpq_fe_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBPQ_FE_H 1
+_ACEOF
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PQsendQueryPrepared in -lpq" >&5
+$as_echo_n "checking for PQsendQueryPrepared in -lpq... " >&6; }
+if ${ac_cv_lib_pq_PQsendQueryPrepared+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpq $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char PQsendQueryPrepared ();
+int
+main ()
+{
+return PQsendQueryPrepared ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_pq_PQsendQueryPrepared=yes
+else
+ ac_cv_lib_pq_PQsendQueryPrepared=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pq_PQsendQueryPrepared" >&5
+$as_echo "$ac_cv_lib_pq_PQsendQueryPrepared" >&6; }
+if test "x$ac_cv_lib_pq_PQsendQueryPrepared" = xyes; then :
+ apu_have_pgsql=1
+else
+
+ if test "x$PGSQL_CONFIG" != 'x'; then
+ unset ac_cv_lib_pq_PQsendQueryPrepared
+ pgsql_LIBS="`$PGSQL_CONFIG --libs`"
+
+ if test "x$LIBS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LIBS to \"$pgsql_LIBS\""
+ LIBS="$pgsql_LIBS"
+ else
+ apr_addto_bugger="$pgsql_LIBS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LIBS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LIBS"
+ LIBS="$LIBS $i"
+ fi
+ done
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PQsendQueryPrepared in -lpq" >&5
+$as_echo_n "checking for PQsendQueryPrepared in -lpq... " >&6; }
+if ${ac_cv_lib_pq_PQsendQueryPrepared+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpq $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char PQsendQueryPrepared ();
+int
+main ()
+{
+return PQsendQueryPrepared ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_pq_PQsendQueryPrepared=yes
+else
+ ac_cv_lib_pq_PQsendQueryPrepared=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pq_PQsendQueryPrepared" >&5
+$as_echo "$ac_cv_lib_pq_PQsendQueryPrepared" >&6; }
+if test "x$ac_cv_lib_pq_PQsendQueryPrepared" = xyes; then :
+ apu_have_pgsql=1
+fi
+
+ fi
+
+fi
+
+
+fi
+
+done
+
+ if test "$apu_have_pgsql" = "0"; then
+ for ac_header in postgresql/libpq-fe.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "postgresql/libpq-fe.h" "ac_cv_header_postgresql_libpq_fe_h" "$ac_includes_default"
+if test "x$ac_cv_header_postgresql_libpq_fe_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_POSTGRESQL_LIBPQ_FE_H 1
+_ACEOF
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PQsendQueryPrepared in -lpq" >&5
+$as_echo_n "checking for PQsendQueryPrepared in -lpq... " >&6; }
+if ${ac_cv_lib_pq_PQsendQueryPrepared+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpq $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char PQsendQueryPrepared ();
+int
+main ()
+{
+return PQsendQueryPrepared ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_pq_PQsendQueryPrepared=yes
+else
+ ac_cv_lib_pq_PQsendQueryPrepared=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pq_PQsendQueryPrepared" >&5
+$as_echo "$ac_cv_lib_pq_PQsendQueryPrepared" >&6; }
+if test "x$ac_cv_lib_pq_PQsendQueryPrepared" = xyes; then :
+ apu_have_pgsql=1
+else
+
+ if test "x$PGSQL_CONFIG" != 'x'; then
+ unset ac_cv_lib_pq_PQsendQueryPrepared
+ pgsql_LIBS="`$PGSQL_CONFIG --libs`"
+
+ if test "x$LIBS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LIBS to \"$pgsql_LIBS\""
+ LIBS="$pgsql_LIBS"
+ else
+ apr_addto_bugger="$pgsql_LIBS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LIBS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LIBS"
+ LIBS="$LIBS $i"
+ fi
+ done
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PQsendQueryPrepared in -lpq" >&5
+$as_echo_n "checking for PQsendQueryPrepared in -lpq... " >&6; }
+if ${ac_cv_lib_pq_PQsendQueryPrepared+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpq $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char PQsendQueryPrepared ();
+int
+main ()
+{
+return PQsendQueryPrepared ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_pq_PQsendQueryPrepared=yes
+else
+ ac_cv_lib_pq_PQsendQueryPrepared=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pq_PQsendQueryPrepared" >&5
+$as_echo "$ac_cv_lib_pq_PQsendQueryPrepared" >&6; }
+if test "x$ac_cv_lib_pq_PQsendQueryPrepared" = xyes; then :
+ apu_have_pgsql=1
+fi
+
+ fi
+
+fi
+
+
+fi
+
+done
+
+ fi
+ if test "$apu_have_pgsql" != "0" && test "x$PGSQL_CONFIG" != 'x'; then
+
+ if test "x$APRUTIL_PRIV_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_PRIV_INCLUDES to \"$pgsql_CPPFLAGS\""
+ APRUTIL_PRIV_INCLUDES="$pgsql_CPPFLAGS"
+ else
+ apr_addto_bugger="$pgsql_CPPFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_PRIV_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_PRIV_INCLUDES"
+ APRUTIL_PRIV_INCLUDES="$APRUTIL_PRIV_INCLUDES $i"
+ fi
+ done
+ fi
+
+ fi
+
+fi
+
+
+ if test "$apu_have_pgsql" = "1"; then
+
+ if test "x$LDADD_dbd_pgsql" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDADD_dbd_pgsql to \"$pgsql_LDFLAGS -lpq $pgsql_LIBS\""
+ LDADD_dbd_pgsql="$pgsql_LDFLAGS -lpq $pgsql_LIBS"
+ else
+ apr_addto_bugger="$pgsql_LDFLAGS -lpq $pgsql_LIBS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDADD_dbd_pgsql; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDADD_dbd_pgsql"
+ LDADD_dbd_pgsql="$LDADD_dbd_pgsql $i"
+ fi
+ done
+ fi
+
+ fi
+
+
+ LIBS="$old_libs"
+ CPPFLAGS="$old_cppflags"
+ LDFLAGS="$old_ldflags"
+
+
+ apu_have_mysql=0
+
+ old_libs="$LIBS"
+ old_cppflags="$CPPFLAGS"
+ old_ldflags="$LDFLAGS"
+
+
+# Check whether --with-mysql was given.
+if test "${with_mysql+set}" = set; then :
+ withval=$with_mysql;
+ if test "$withval" = "yes"; then
+ # Extract the first word of "mysql_config", so it can be a program name with args.
+set dummy mysql_config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_MYSQL_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $MYSQL_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_MYSQL_CONFIG="$MYSQL_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_MYSQL_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+MYSQL_CONFIG=$ac_cv_path_MYSQL_CONFIG
+if test -n "$MYSQL_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MYSQL_CONFIG" >&5
+$as_echo "$MYSQL_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ if test "x$MYSQL_CONFIG" != 'x'; then
+ mysql_CPPFLAGS="`$MYSQL_CONFIG --include`"
+ mysql_LDFLAGS="`$MYSQL_CONFIG --libs_r | sed -e 's/-l[^ ]\+//g'`"
+ mysql_LIBS="`$MYSQL_CONFIG --libs_r`"
+
+
+ if test "x$CPPFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"$mysql_CPPFLAGS\""
+ CPPFLAGS="$mysql_CPPFLAGS"
+ else
+ apr_addto_bugger="$mysql_CPPFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $CPPFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $i"
+ fi
+ done
+ fi
+
+
+ if test "x$LIBS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LIBS to \"$mysql_LIBS\""
+ LIBS="$mysql_LIBS"
+ else
+ apr_addto_bugger="$mysql_LIBS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LIBS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LIBS"
+ LIBS="$LIBS $i"
+ fi
+ done
+ fi
+
+ fi
+
+ for ac_header in mysql.h my_global.h my_sys.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "#include <my_global.h>
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mysql_init in -lmysqlclient_r" >&5
+$as_echo_n "checking for mysql_init in -lmysqlclient_r... " >&6; }
+if ${ac_cv_lib_mysqlclient_r_mysql_init+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lmysqlclient_r $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char mysql_init ();
+int
+main ()
+{
+return mysql_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_mysqlclient_r_mysql_init=yes
+else
+ ac_cv_lib_mysqlclient_r_mysql_init=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mysqlclient_r_mysql_init" >&5
+$as_echo "$ac_cv_lib_mysqlclient_r_mysql_init" >&6; }
+if test "x$ac_cv_lib_mysqlclient_r_mysql_init" = xyes; then :
+ apu_have_mysql=1
+fi
+
+else
+ apu_have_mysql=0; break
+fi
+
+done
+
+ if test "$apu_have_mysql" = "0"; then
+ for ac_header in mysql/mysql.h mysql/my_global.h mysql/my_sys.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "#include <mysql/my_global.h>
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mysql_init in -lmysqlclient_r" >&5
+$as_echo_n "checking for mysql_init in -lmysqlclient_r... " >&6; }
+if ${ac_cv_lib_mysqlclient_r_mysql_init+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lmysqlclient_r $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char mysql_init ();
+int
+main ()
+{
+return mysql_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_mysqlclient_r_mysql_init=yes
+else
+ ac_cv_lib_mysqlclient_r_mysql_init=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mysqlclient_r_mysql_init" >&5
+$as_echo "$ac_cv_lib_mysqlclient_r_mysql_init" >&6; }
+if test "x$ac_cv_lib_mysqlclient_r_mysql_init" = xyes; then :
+ apu_have_mysql=1
+fi
+
+else
+ apu_have_mysql=0; break
+fi
+
+done
+
+ fi
+ if test "$apu_have_mysql" != "0" && test "x$MYSQL_CONFIG" != 'x'; then
+
+ if test "x$APRUTIL_PRIV_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_PRIV_INCLUDES to \"$mysql_CPPFLAGS\""
+ APRUTIL_PRIV_INCLUDES="$mysql_CPPFLAGS"
+ else
+ apr_addto_bugger="$mysql_CPPFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_PRIV_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_PRIV_INCLUDES"
+ APRUTIL_PRIV_INCLUDES="$APRUTIL_PRIV_INCLUDES $i"
+ fi
+ done
+ fi
+
+ fi
+ elif test "$withval" = "no"; then
+ :
+ else
+ # Extract the first word of "mysql_config", so it can be a program name with args.
+set dummy mysql_config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_MYSQL_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $MYSQL_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_MYSQL_CONFIG="$MYSQL_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $withval/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_MYSQL_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+MYSQL_CONFIG=$ac_cv_path_MYSQL_CONFIG
+if test -n "$MYSQL_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MYSQL_CONFIG" >&5
+$as_echo "$MYSQL_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ if test "x$MYSQL_CONFIG" != 'x'; then
+ mysql_CPPFLAGS="`$MYSQL_CONFIG --include`"
+ mysql_LDFLAGS="`$MYSQL_CONFIG --libs_r | sed -e 's/-l[^ ]\+//g'`"
+ mysql_LIBS="`$MYSQL_CONFIG --libs_r`"
+ else
+ mysql_CPPFLAGS="-I$withval/include"
+ mysql_LDFLAGS="-L$withval/lib "
+ fi
+
+
+ if test "x$CPPFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"$mysql_CPPFLAGS\""
+ CPPFLAGS="$mysql_CPPFLAGS"
+ else
+ apr_addto_bugger="$mysql_CPPFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $CPPFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $i"
+ fi
+ done
+ fi
+
+
+ if test "x$LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$mysql_LDFLAGS\""
+ LDFLAGS="$mysql_LDFLAGS"
+ else
+ apr_addto_bugger="$mysql_LDFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS"
+ LDFLAGS="$LDFLAGS $i"
+ fi
+ done
+ fi
+
+
+ if test "x$LIBS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LIBS to \"$mysql_LIBS\""
+ LIBS="$mysql_LIBS"
+ else
+ apr_addto_bugger="$mysql_LIBS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LIBS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LIBS"
+ LIBS="$LIBS $i"
+ fi
+ done
+ fi
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mysql in $withval" >&5
+$as_echo "$as_me: checking for mysql in $withval" >&6;}
+ for ac_header in mysql.h my_global.h my_sys.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "#include <my_global.h>
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mysql_init in -lmysqlclient_r" >&5
+$as_echo_n "checking for mysql_init in -lmysqlclient_r... " >&6; }
+if ${ac_cv_lib_mysqlclient_r_mysql_init+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lmysqlclient_r $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char mysql_init ();
+int
+main ()
+{
+return mysql_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_mysqlclient_r_mysql_init=yes
+else
+ ac_cv_lib_mysqlclient_r_mysql_init=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mysqlclient_r_mysql_init" >&5
+$as_echo "$ac_cv_lib_mysqlclient_r_mysql_init" >&6; }
+if test "x$ac_cv_lib_mysqlclient_r_mysql_init" = xyes; then :
+ apu_have_mysql=1
+fi
+
+else
+ apu_have_mysql=0; break
+fi
+
+done
+
+
+ if test "$apu_have_mysql" != "1"; then
+ for ac_header in mysql/mysql.h mysql/my_global.h mysql/my_sys.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "#include <mysql/my_global.h>
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mysql_init in -lmysqlclient_r" >&5
+$as_echo_n "checking for mysql_init in -lmysqlclient_r... " >&6; }
+if ${ac_cv_lib_mysqlclient_r_mysql_init+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lmysqlclient_r $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char mysql_init ();
+int
+main ()
+{
+return mysql_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_mysqlclient_r_mysql_init=yes
+else
+ ac_cv_lib_mysqlclient_r_mysql_init=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mysqlclient_r_mysql_init" >&5
+$as_echo "$ac_cv_lib_mysqlclient_r_mysql_init" >&6; }
+if test "x$ac_cv_lib_mysqlclient_r_mysql_init" = xyes; then :
+ apu_have_mysql=1
+fi
+
+else
+ apu_have_mysql=0; break
+fi
+
+done
+
+ fi
+ if test "$apu_have_mysql" != "0"; then
+
+ if test "x$APRUTIL_PRIV_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_PRIV_INCLUDES to \"$mysql_CPPFLAGS\""
+ APRUTIL_PRIV_INCLUDES="$mysql_CPPFLAGS"
+ else
+ apr_addto_bugger="$mysql_CPPFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_PRIV_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_PRIV_INCLUDES"
+ APRUTIL_PRIV_INCLUDES="$APRUTIL_PRIV_INCLUDES $i"
+ fi
+ done
+ fi
+
+ fi
+ fi
+
+fi
+
+
+
+
+ if test "$apu_have_mysql" = "1"; then
+
+ if test "x$LDADD_dbd_mysql" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDADD_dbd_mysql to \"$mysql_LDFLAGS -lmysqlclient_r $mysql_LIBS\""
+ LDADD_dbd_mysql="$mysql_LDFLAGS -lmysqlclient_r $mysql_LIBS"
+ else
+ apr_addto_bugger="$mysql_LDFLAGS -lmysqlclient_r $mysql_LIBS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDADD_dbd_mysql; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDADD_dbd_mysql"
+ LDADD_dbd_mysql="$LDADD_dbd_mysql $i"
+ fi
+ done
+ fi
+
+ fi
+
+
+ LIBS="$old_libs"
+ CPPFLAGS="$old_cppflags"
+ LDFLAGS="$old_ldflags"
+
+
+ apu_have_sqlite3=0
+
+ old_libs="$LIBS"
+ old_cppflags="$CPPFLAGS"
+ old_ldflags="$LDFLAGS"
+
+
+# Check whether --with-sqlite3 was given.
+if test "${with_sqlite3+set}" = set; then :
+ withval=$with_sqlite3;
+ if test "$withval" = "yes"; then
+ for ac_header in sqlite3.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "sqlite3.h" "ac_cv_header_sqlite3_h" "$ac_includes_default"
+if test "x$ac_cv_header_sqlite3_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_SQLITE3_H 1
+_ACEOF
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqlite3_open in -lsqlite3" >&5
+$as_echo_n "checking for sqlite3_open in -lsqlite3... " >&6; }
+if ${ac_cv_lib_sqlite3_sqlite3_open+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsqlite3 $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char sqlite3_open ();
+int
+main ()
+{
+return sqlite3_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_sqlite3_sqlite3_open=yes
+else
+ ac_cv_lib_sqlite3_sqlite3_open=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sqlite3_sqlite3_open" >&5
+$as_echo "$ac_cv_lib_sqlite3_sqlite3_open" >&6; }
+if test "x$ac_cv_lib_sqlite3_sqlite3_open" = xyes; then :
+ apu_have_sqlite3=1
+fi
+
+fi
+
+done
+
+ elif test "$withval" = "no"; then
+ :
+ else
+ sqlite3_CPPFLAGS="-I$withval/include"
+ sqlite3_LDFLAGS="-L$withval/lib "
+
+
+ if test "x$CPPFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"$sqlite3_CPPFLAGS\""
+ CPPFLAGS="$sqlite3_CPPFLAGS"
+ else
+ apr_addto_bugger="$sqlite3_CPPFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $CPPFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $i"
+ fi
+ done
+ fi
+
+
+ if test "x$LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$sqlite3_LDFLAGS\""
+ LDFLAGS="$sqlite3_LDFLAGS"
+ else
+ apr_addto_bugger="$sqlite3_LDFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS"
+ LDFLAGS="$LDFLAGS $i"
+ fi
+ done
+ fi
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqlite3 in $withval" >&5
+$as_echo "$as_me: checking for sqlite3 in $withval" >&6;}
+ for ac_header in sqlite3.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "sqlite3.h" "ac_cv_header_sqlite3_h" "$ac_includes_default"
+if test "x$ac_cv_header_sqlite3_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_SQLITE3_H 1
+_ACEOF
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqlite3_open in -lsqlite3" >&5
+$as_echo_n "checking for sqlite3_open in -lsqlite3... " >&6; }
+if ${ac_cv_lib_sqlite3_sqlite3_open+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsqlite3 $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char sqlite3_open ();
+int
+main ()
+{
+return sqlite3_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_sqlite3_sqlite3_open=yes
+else
+ ac_cv_lib_sqlite3_sqlite3_open=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sqlite3_sqlite3_open" >&5
+$as_echo "$ac_cv_lib_sqlite3_sqlite3_open" >&6; }
+if test "x$ac_cv_lib_sqlite3_sqlite3_open" = xyes; then :
+ apu_have_sqlite3=1
+fi
+
+fi
+
+done
+
+ if test "$apu_have_sqlite3" != "0"; then
+
+ if test "x$APRUTIL_PRIV_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_PRIV_INCLUDES to \"-I$withval/include\""
+ APRUTIL_PRIV_INCLUDES="-I$withval/include"
+ else
+ apr_addto_bugger="-I$withval/include"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_PRIV_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_PRIV_INCLUDES"
+ APRUTIL_PRIV_INCLUDES="$APRUTIL_PRIV_INCLUDES $i"
+ fi
+ done
+ fi
+
+ fi
+ fi
+
+else
+
+ for ac_header in sqlite3.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "sqlite3.h" "ac_cv_header_sqlite3_h" "$ac_includes_default"
+if test "x$ac_cv_header_sqlite3_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_SQLITE3_H 1
+_ACEOF
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqlite3_open in -lsqlite3" >&5
+$as_echo_n "checking for sqlite3_open in -lsqlite3... " >&6; }
+if ${ac_cv_lib_sqlite3_sqlite3_open+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsqlite3 $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char sqlite3_open ();
+int
+main ()
+{
+return sqlite3_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_sqlite3_sqlite3_open=yes
+else
+ ac_cv_lib_sqlite3_sqlite3_open=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sqlite3_sqlite3_open" >&5
+$as_echo "$ac_cv_lib_sqlite3_sqlite3_open" >&6; }
+if test "x$ac_cv_lib_sqlite3_sqlite3_open" = xyes; then :
+ apu_have_sqlite3=1
+fi
+
+fi
+
+done
+
+
+fi
+
+
+
+
+ if test "$apu_have_sqlite3" = "1"; then
+
+ if test "x$LDADD_dbd_sqlite3" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDADD_dbd_sqlite3 to \"$sqlite3_LDFLAGS -lsqlite3\""
+ LDADD_dbd_sqlite3="$sqlite3_LDFLAGS -lsqlite3"
+ else
+ apr_addto_bugger="$sqlite3_LDFLAGS -lsqlite3"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDADD_dbd_sqlite3; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDADD_dbd_sqlite3"
+ LDADD_dbd_sqlite3="$LDADD_dbd_sqlite3 $i"
+ fi
+ done
+ fi
+
+ fi
+
+
+ LIBS="$old_libs"
+ CPPFLAGS="$old_cppflags"
+ LDFLAGS="$old_ldflags"
+
+
+ apu_have_sqlite2=0
+
+ old_libs="$LIBS"
+ old_cppflags="$CPPFLAGS"
+ old_ldflags="$LDFLAGS"
+
+
+# Check whether --with-sqlite2 was given.
+if test "${with_sqlite2+set}" = set; then :
+ withval=$with_sqlite2;
+ if test "$withval" = "yes"; then
+ for ac_header in sqlite.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "sqlite.h" "ac_cv_header_sqlite_h" "$ac_includes_default"
+if test "x$ac_cv_header_sqlite_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_SQLITE_H 1
+_ACEOF
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqlite_open in -lsqlite" >&5
+$as_echo_n "checking for sqlite_open in -lsqlite... " >&6; }
+if ${ac_cv_lib_sqlite_sqlite_open+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsqlite $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char sqlite_open ();
+int
+main ()
+{
+return sqlite_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_sqlite_sqlite_open=yes
+else
+ ac_cv_lib_sqlite_sqlite_open=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sqlite_sqlite_open" >&5
+$as_echo "$ac_cv_lib_sqlite_sqlite_open" >&6; }
+if test "x$ac_cv_lib_sqlite_sqlite_open" = xyes; then :
+ apu_have_sqlite2=1
+fi
+
+fi
+
+done
+
+ elif test "$withval" = "no"; then
+ :
+ else
+ sqlite2_CPPFLAGS="-I$withval/include"
+ sqlite2_LDFLAGS="-L$withval/lib "
+
+
+ if test "x$CPPFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"$sqlite2_CPPFLAGS\""
+ CPPFLAGS="$sqlite2_CPPFLAGS"
+ else
+ apr_addto_bugger="$sqlite2_CPPFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $CPPFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $i"
+ fi
+ done
+ fi
+
+
+ if test "x$LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$sqlite2_LDFLAGS\""
+ LDFLAGS="$sqlite2_LDFLAGS"
+ else
+ apr_addto_bugger="$sqlite2_LDFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS"
+ LDFLAGS="$LDFLAGS $i"
+ fi
+ done
+ fi
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqlite2 in $withval" >&5
+$as_echo "$as_me: checking for sqlite2 in $withval" >&6;}
+ for ac_header in sqlite.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "sqlite.h" "ac_cv_header_sqlite_h" "$ac_includes_default"
+if test "x$ac_cv_header_sqlite_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_SQLITE_H 1
+_ACEOF
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqlite_open in -lsqlite" >&5
+$as_echo_n "checking for sqlite_open in -lsqlite... " >&6; }
+if ${ac_cv_lib_sqlite_sqlite_open+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsqlite $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char sqlite_open ();
+int
+main ()
+{
+return sqlite_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_sqlite_sqlite_open=yes
+else
+ ac_cv_lib_sqlite_sqlite_open=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sqlite_sqlite_open" >&5
+$as_echo "$ac_cv_lib_sqlite_sqlite_open" >&6; }
+if test "x$ac_cv_lib_sqlite_sqlite_open" = xyes; then :
+ apu_have_sqlite2=1
+fi
+
+fi
+
+done
+
+ if test "$apu_have_sqlite2" != "0"; then
+
+ if test "x$APRUTIL_PRIV_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_PRIV_INCLUDES to \"-I$withval/include\""
+ APRUTIL_PRIV_INCLUDES="-I$withval/include"
+ else
+ apr_addto_bugger="-I$withval/include"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_PRIV_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_PRIV_INCLUDES"
+ APRUTIL_PRIV_INCLUDES="$APRUTIL_PRIV_INCLUDES $i"
+ fi
+ done
+ fi
+
+ fi
+ fi
+
+else
+
+ for ac_header in sqlite.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "sqlite.h" "ac_cv_header_sqlite_h" "$ac_includes_default"
+if test "x$ac_cv_header_sqlite_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_SQLITE_H 1
+_ACEOF
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqlite_open in -lsqlite" >&5
+$as_echo_n "checking for sqlite_open in -lsqlite... " >&6; }
+if ${ac_cv_lib_sqlite_sqlite_open+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsqlite $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char sqlite_open ();
+int
+main ()
+{
+return sqlite_open ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_sqlite_sqlite_open=yes
+else
+ ac_cv_lib_sqlite_sqlite_open=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sqlite_sqlite_open" >&5
+$as_echo "$ac_cv_lib_sqlite_sqlite_open" >&6; }
+if test "x$ac_cv_lib_sqlite_sqlite_open" = xyes; then :
+ apu_have_sqlite2=1
+fi
+
+fi
+
+done
+
+
+fi
+
+
+
+
+ if test "$apu_have_sqlite2" = "1"; then
+
+ if test "x$LDADD_dbd_sqlite2" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDADD_dbd_sqlite2 to \"$sqlite2_LDFLAGS -lsqlite\""
+ LDADD_dbd_sqlite2="$sqlite2_LDFLAGS -lsqlite"
+ else
+ apr_addto_bugger="$sqlite2_LDFLAGS -lsqlite"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDADD_dbd_sqlite2; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDADD_dbd_sqlite2"
+ LDADD_dbd_sqlite2="$LDADD_dbd_sqlite2 $i"
+ fi
+ done
+ fi
+
+ fi
+
+
+ LIBS="$old_libs"
+ CPPFLAGS="$old_cppflags"
+ LDFLAGS="$old_ldflags"
+
+
+ apu_have_oracle=0
+
+ old_libs="$LIBS"
+ old_cppflags="$CPPFLAGS"
+ old_ldflags="$LDFLAGS"
+
+
+# Check whether --with-oracle-include was given.
+if test "${with_oracle_include+set}" = set; then :
+ withval=$with_oracle_include;
+fi
+
+
+# Check whether --with-oracle was given.
+if test "${with_oracle+set}" = set; then :
+ withval=$with_oracle;
+ if test "$withval" = "yes"; then
+ if test -n "$with_oracle_include"; then
+ oracle_CPPFLAGS="$CPPFLAGS -I$with_oracle_include"
+
+ if test "x$APRUTIL_PRIV_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_PRIV_INCLUDES to \"-I$with_oracle_include\""
+ APRUTIL_PRIV_INCLUDES="-I$with_oracle_include"
+ else
+ apr_addto_bugger="-I$with_oracle_include"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_PRIV_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_PRIV_INCLUDES"
+ APRUTIL_PRIV_INCLUDES="$APRUTIL_PRIV_INCLUDES $i"
+ fi
+ done
+ fi
+
+ fi
+
+
+ if test "x$CPPFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"$oracle_CPPFLAGS\""
+ CPPFLAGS="$oracle_CPPFLAGS"
+ else
+ apr_addto_bugger="$oracle_CPPFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $CPPFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $i"
+ fi
+ done
+ fi
+
+
+ for ac_header in oci.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "oci.h" "ac_cv_header_oci_h" "$ac_includes_default"
+if test "x$ac_cv_header_oci_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_OCI_H 1
+_ACEOF
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OCIEnvCreate in -lclntsh" >&5
+$as_echo_n "checking for OCIEnvCreate in -lclntsh... " >&6; }
+if ${ac_cv_lib_clntsh_OCIEnvCreate+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lclntsh $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char OCIEnvCreate ();
+int
+main ()
+{
+return OCIEnvCreate ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_clntsh_OCIEnvCreate=yes
+else
+ ac_cv_lib_clntsh_OCIEnvCreate=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_clntsh_OCIEnvCreate" >&5
+$as_echo "$ac_cv_lib_clntsh_OCIEnvCreate" >&6; }
+if test "x$ac_cv_lib_clntsh_OCIEnvCreate" = xyes; then :
+ apu_have_oracle=1
+else
+
+ unset ac_cv_lib_clntsh_OCIEnvCreate
+ oracle_LIBS="-lnnz11"
+
+ if test "x$LIBS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LIBS to \"$oracle_LIBS\""
+ LIBS="$oracle_LIBS"
+ else
+ apr_addto_bugger="$oracle_LIBS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LIBS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LIBS"
+ LIBS="$LIBS $i"
+ fi
+ done
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OCIEnvCreate in -lclntsh" >&5
+$as_echo_n "checking for OCIEnvCreate in -lclntsh... " >&6; }
+if ${ac_cv_lib_clntsh_OCIEnvCreate+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lclntsh $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char OCIEnvCreate ();
+int
+main ()
+{
+return OCIEnvCreate ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_clntsh_OCIEnvCreate=yes
+else
+ ac_cv_lib_clntsh_OCIEnvCreate=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_clntsh_OCIEnvCreate" >&5
+$as_echo "$ac_cv_lib_clntsh_OCIEnvCreate" >&6; }
+if test "x$ac_cv_lib_clntsh_OCIEnvCreate" = xyes; then :
+ apu_have_oracle=1
+else
+
+ unset ac_cv_lib_clntsh_OCIEnvCreate
+
+ if test "x$LIBS" = "x$oracle_LIBS"; then
+ test "x$silent" != "xyes" && echo " nulling LIBS"
+ LIBS=""
+ else
+ apr_new_bugger=""
+ apr_removed=0
+ for i in $LIBS; do
+ if test "x$i" != "x$oracle_LIBS"; then
+ apr_new_bugger="$apr_new_bugger $i"
+ else
+ apr_removed=1
+ fi
+ done
+ if test $apr_removed = "1"; then
+ test "x$silent" != "xyes" && echo " removed \"$oracle_LIBS\" from LIBS"
+ LIBS=$apr_new_bugger
+ fi
+ fi
+
+ oracle_LIBS="-lnnz10"
+
+ if test "x$LIBS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LIBS to \"$oracle_LIBS\""
+ LIBS="$oracle_LIBS"
+ else
+ apr_addto_bugger="$oracle_LIBS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LIBS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LIBS"
+ LIBS="$LIBS $i"
+ fi
+ done
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OCIEnvCreate in -lclntsh" >&5
+$as_echo_n "checking for OCIEnvCreate in -lclntsh... " >&6; }
+if ${ac_cv_lib_clntsh_OCIEnvCreate+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lclntsh $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char OCIEnvCreate ();
+int
+main ()
+{
+return OCIEnvCreate ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_clntsh_OCIEnvCreate=yes
+else
+ ac_cv_lib_clntsh_OCIEnvCreate=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_clntsh_OCIEnvCreate" >&5
+$as_echo "$ac_cv_lib_clntsh_OCIEnvCreate" >&6; }
+if test "x$ac_cv_lib_clntsh_OCIEnvCreate" = xyes; then :
+ apu_have_oracle=1
+fi
+
+
+fi
+
+
+fi
+
+fi
+
+done
+
+ elif test "$withval" = "no"; then
+ :
+ else
+ if test -n "$with_oracle_include"; then
+ oracle_CPPFLAGS="$CPPFLAGS -I$with_oracle_include"
+
+ if test "x$APRUTIL_PRIV_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_PRIV_INCLUDES to \"-I$with_oracle_include\""
+ APRUTIL_PRIV_INCLUDES="-I$with_oracle_include"
+ else
+ apr_addto_bugger="-I$with_oracle_include"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_PRIV_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_PRIV_INCLUDES"
+ APRUTIL_PRIV_INCLUDES="$APRUTIL_PRIV_INCLUDES $i"
+ fi
+ done
+ fi
+
+ else
+ oracle_CPPFLAGS="-I$withval/rdbms/demo -I$withval/rdbms/public"
+ fi
+ oracle_LDFLAGS="-L$withval/lib "
+
+
+ if test "x$CPPFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"$oracle_CPPFLAGS\""
+ CPPFLAGS="$oracle_CPPFLAGS"
+ else
+ apr_addto_bugger="$oracle_CPPFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $CPPFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $i"
+ fi
+ done
+ fi
+
+
+ if test "x$LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$oracle_LDFLAGS\""
+ LDFLAGS="$oracle_LDFLAGS"
+ else
+ apr_addto_bugger="$oracle_LDFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS"
+ LDFLAGS="$LDFLAGS $i"
+ fi
+ done
+ fi
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for oracle in $withval" >&5
+$as_echo "$as_me: checking for oracle in $withval" >&6;}
+ for ac_header in oci.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "oci.h" "ac_cv_header_oci_h" "$ac_includes_default"
+if test "x$ac_cv_header_oci_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_OCI_H 1
+_ACEOF
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OCIEnvCreate in -lclntsh" >&5
+$as_echo_n "checking for OCIEnvCreate in -lclntsh... " >&6; }
+if ${ac_cv_lib_clntsh_OCIEnvCreate+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lclntsh $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char OCIEnvCreate ();
+int
+main ()
+{
+return OCIEnvCreate ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_clntsh_OCIEnvCreate=yes
+else
+ ac_cv_lib_clntsh_OCIEnvCreate=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_clntsh_OCIEnvCreate" >&5
+$as_echo "$ac_cv_lib_clntsh_OCIEnvCreate" >&6; }
+if test "x$ac_cv_lib_clntsh_OCIEnvCreate" = xyes; then :
+ apu_have_oracle=1
+else
+
+ unset ac_cv_lib_clntsh_OCIEnvCreate
+ oracle_LIBS="-lnnz11"
+
+ if test "x$LIBS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LIBS to \"$oracle_LIBS\""
+ LIBS="$oracle_LIBS"
+ else
+ apr_addto_bugger="$oracle_LIBS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LIBS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LIBS"
+ LIBS="$LIBS $i"
+ fi
+ done
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OCIEnvCreate in -lclntsh" >&5
+$as_echo_n "checking for OCIEnvCreate in -lclntsh... " >&6; }
+if ${ac_cv_lib_clntsh_OCIEnvCreate+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lclntsh $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char OCIEnvCreate ();
+int
+main ()
+{
+return OCIEnvCreate ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_clntsh_OCIEnvCreate=yes
+else
+ ac_cv_lib_clntsh_OCIEnvCreate=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_clntsh_OCIEnvCreate" >&5
+$as_echo "$ac_cv_lib_clntsh_OCIEnvCreate" >&6; }
+if test "x$ac_cv_lib_clntsh_OCIEnvCreate" = xyes; then :
+ apu_have_oracle=1
+else
+
+ unset ac_cv_lib_clntsh_OCIEnvCreate
+
+ if test "x$LIBS" = "x$oracle_LIBS"; then
+ test "x$silent" != "xyes" && echo " nulling LIBS"
+ LIBS=""
+ else
+ apr_new_bugger=""
+ apr_removed=0
+ for i in $LIBS; do
+ if test "x$i" != "x$oracle_LIBS"; then
+ apr_new_bugger="$apr_new_bugger $i"
+ else
+ apr_removed=1
+ fi
+ done
+ if test $apr_removed = "1"; then
+ test "x$silent" != "xyes" && echo " removed \"$oracle_LIBS\" from LIBS"
+ LIBS=$apr_new_bugger
+ fi
+ fi
+
+ oracle_LIBS="-lnnz10"
+
+ if test "x$LIBS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LIBS to \"$oracle_LIBS\""
+ LIBS="$oracle_LIBS"
+ else
+ apr_addto_bugger="$oracle_LIBS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LIBS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LIBS"
+ LIBS="$LIBS $i"
+ fi
+ done
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OCIEnvCreate in -lclntsh" >&5
+$as_echo_n "checking for OCIEnvCreate in -lclntsh... " >&6; }
+if ${ac_cv_lib_clntsh_OCIEnvCreate+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lclntsh $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char OCIEnvCreate ();
+int
+main ()
+{
+return OCIEnvCreate ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_clntsh_OCIEnvCreate=yes
+else
+ ac_cv_lib_clntsh_OCIEnvCreate=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_clntsh_OCIEnvCreate" >&5
+$as_echo "$ac_cv_lib_clntsh_OCIEnvCreate" >&6; }
+if test "x$ac_cv_lib_clntsh_OCIEnvCreate" = xyes; then :
+ apu_have_oracle=1
+fi
+
+
+fi
+
+
+fi
+
+fi
+
+done
+
+ if test "$apu_have_oracle" != "0"; then
+ oracle_LDFLAGS="$oracle_LDFLAGS -R$withval/lib"
+ if test -z "$with_oracle_include"; then
+
+ if test "x$APRUTIL_PRIV_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_PRIV_INCLUDES to \"-I$withval/rdbms/demo\""
+ APRUTIL_PRIV_INCLUDES="-I$withval/rdbms/demo"
+ else
+ apr_addto_bugger="-I$withval/rdbms/demo"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_PRIV_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_PRIV_INCLUDES"
+ APRUTIL_PRIV_INCLUDES="$APRUTIL_PRIV_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_PRIV_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_PRIV_INCLUDES to \"-I$withval/rdbms/public\""
+ APRUTIL_PRIV_INCLUDES="-I$withval/rdbms/public"
+ else
+ apr_addto_bugger="-I$withval/rdbms/public"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_PRIV_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_PRIV_INCLUDES"
+ APRUTIL_PRIV_INCLUDES="$APRUTIL_PRIV_INCLUDES $i"
+ fi
+ done
+ fi
+
+ fi
+ fi
+ fi
+
+fi
+
+
+
+
+ if test "$apu_have_oracle" = "1"; then
+
+ if test "x$LDADD_dbd_oracle" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDADD_dbd_oracle to \"$oracle_LDFLAGS -lclntsh $oracle_LIBS\""
+ LDADD_dbd_oracle="$oracle_LDFLAGS -lclntsh $oracle_LIBS"
+ else
+ apr_addto_bugger="$oracle_LDFLAGS -lclntsh $oracle_LIBS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDADD_dbd_oracle; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDADD_dbd_oracle"
+ LDADD_dbd_oracle="$LDADD_dbd_oracle $i"
+ fi
+ done
+ fi
+
+ fi
+
+
+ LIBS="$old_libs"
+ CPPFLAGS="$old_cppflags"
+ LDFLAGS="$old_ldflags"
+
+
+ apu_have_freetds=0
+
+ old_libs="$LIBS"
+ old_cppflags="$CPPFLAGS"
+ old_ldflags="$LDFLAGS"
+
+
+# Check whether --with-freetds was given.
+if test "${with_freetds+set}" = set; then :
+ withval=$with_freetds;
+ if test "$withval" = "yes"; then
+ for ac_header in sybdb.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "sybdb.h" "ac_cv_header_sybdb_h" "$ac_includes_default"
+if test "x$ac_cv_header_sybdb_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_SYBDB_H 1
+_ACEOF
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tdsdbopen in -lsybdb" >&5
+$as_echo_n "checking for tdsdbopen in -lsybdb... " >&6; }
+if ${ac_cv_lib_sybdb_tdsdbopen+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsybdb $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char tdsdbopen ();
+int
+main ()
+{
+return tdsdbopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_sybdb_tdsdbopen=yes
+else
+ ac_cv_lib_sybdb_tdsdbopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sybdb_tdsdbopen" >&5
+$as_echo "$ac_cv_lib_sybdb_tdsdbopen" >&6; }
+if test "x$ac_cv_lib_sybdb_tdsdbopen" = xyes; then :
+ apu_have_freetds=1
+fi
+
+fi
+
+done
+
+ if test "$apu_have_freetds" = "0"; then
+ for ac_header in freetds/sybdb.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "freetds/sybdb.h" "ac_cv_header_freetds_sybdb_h" "$ac_includes_default"
+if test "x$ac_cv_header_freetds_sybdb_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_FREETDS_SYBDB_H 1
+_ACEOF
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tdsdbopen in -lsybdb" >&5
+$as_echo_n "checking for tdsdbopen in -lsybdb... " >&6; }
+if ${ac_cv_lib_sybdb_tdsdbopen+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsybdb $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char tdsdbopen ();
+int
+main ()
+{
+return tdsdbopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_sybdb_tdsdbopen=yes
+else
+ ac_cv_lib_sybdb_tdsdbopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sybdb_tdsdbopen" >&5
+$as_echo "$ac_cv_lib_sybdb_tdsdbopen" >&6; }
+if test "x$ac_cv_lib_sybdb_tdsdbopen" = xyes; then :
+ apu_have_freetds=1
+fi
+
+fi
+
+done
+
+ fi
+ elif test "$withval" = "no"; then
+ :
+ else
+ sybdb_CPPFLAGS="-I$withval/include"
+ sybdb_LDFLAGS="-L$withval/lib "
+
+
+ if test "x$CPPFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"$sybdb_CPPFLAGS\""
+ CPPFLAGS="$sybdb_CPPFLAGS"
+ else
+ apr_addto_bugger="$sybdb_CPPFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $CPPFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $i"
+ fi
+ done
+ fi
+
+
+ if test "x$LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$sybdb_LDFLAGS\""
+ LDFLAGS="$sybdb_LDFLAGS"
+ else
+ apr_addto_bugger="$sybdb_LDFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS"
+ LDFLAGS="$LDFLAGS $i"
+ fi
+ done
+ fi
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for freetds in $withval" >&5
+$as_echo "$as_me: checking for freetds in $withval" >&6;}
+ for ac_header in sybdb.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "sybdb.h" "ac_cv_header_sybdb_h" "$ac_includes_default"
+if test "x$ac_cv_header_sybdb_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_SYBDB_H 1
+_ACEOF
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tdsdbopen in -lsybdb" >&5
+$as_echo_n "checking for tdsdbopen in -lsybdb... " >&6; }
+if ${ac_cv_lib_sybdb_tdsdbopen+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsybdb $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char tdsdbopen ();
+int
+main ()
+{
+return tdsdbopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_sybdb_tdsdbopen=yes
+else
+ ac_cv_lib_sybdb_tdsdbopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sybdb_tdsdbopen" >&5
+$as_echo "$ac_cv_lib_sybdb_tdsdbopen" >&6; }
+if test "x$ac_cv_lib_sybdb_tdsdbopen" = xyes; then :
+ apu_have_freetds=1
+fi
+
+fi
+
+done
+
+ if test "$apu_have_freetds" = "0"; then
+ for ac_header in freetds/sybdb.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "freetds/sybdb.h" "ac_cv_header_freetds_sybdb_h" "$ac_includes_default"
+if test "x$ac_cv_header_freetds_sybdb_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_FREETDS_SYBDB_H 1
+_ACEOF
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tdsdbopen in -lsybdb" >&5
+$as_echo_n "checking for tdsdbopen in -lsybdb... " >&6; }
+if ${ac_cv_lib_sybdb_tdsdbopen+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsybdb $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char tdsdbopen ();
+int
+main ()
+{
+return tdsdbopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_sybdb_tdsdbopen=yes
+else
+ ac_cv_lib_sybdb_tdsdbopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sybdb_tdsdbopen" >&5
+$as_echo "$ac_cv_lib_sybdb_tdsdbopen" >&6; }
+if test "x$ac_cv_lib_sybdb_tdsdbopen" = xyes; then :
+ apu_have_freetds=1
+fi
+
+fi
+
+done
+
+ fi
+ if test "$apu_have_freetds" != "0"; then
+
+ if test "x$APRUTIL_PRIV_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_PRIV_INCLUDES to \"-I$withval/include\""
+ APRUTIL_PRIV_INCLUDES="-I$withval/include"
+ else
+ apr_addto_bugger="-I$withval/include"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_PRIV_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_PRIV_INCLUDES"
+ APRUTIL_PRIV_INCLUDES="$APRUTIL_PRIV_INCLUDES $i"
+ fi
+ done
+ fi
+
+ fi
+ fi
+
+else
+
+ for ac_header in sybdb.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "sybdb.h" "ac_cv_header_sybdb_h" "$ac_includes_default"
+if test "x$ac_cv_header_sybdb_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_SYBDB_H 1
+_ACEOF
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tdsdbopen in -lsybdb" >&5
+$as_echo_n "checking for tdsdbopen in -lsybdb... " >&6; }
+if ${ac_cv_lib_sybdb_tdsdbopen+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsybdb $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char tdsdbopen ();
+int
+main ()
+{
+return tdsdbopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_sybdb_tdsdbopen=yes
+else
+ ac_cv_lib_sybdb_tdsdbopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sybdb_tdsdbopen" >&5
+$as_echo "$ac_cv_lib_sybdb_tdsdbopen" >&6; }
+if test "x$ac_cv_lib_sybdb_tdsdbopen" = xyes; then :
+ apu_have_freetds=1
+fi
+
+fi
+
+done
+
+ if test "$apu_have_freetds" = "0"; then
+ for ac_header in freetds/sybdb.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "freetds/sybdb.h" "ac_cv_header_freetds_sybdb_h" "$ac_includes_default"
+if test "x$ac_cv_header_freetds_sybdb_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_FREETDS_SYBDB_H 1
+_ACEOF
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tdsdbopen in -lsybdb" >&5
+$as_echo_n "checking for tdsdbopen in -lsybdb... " >&6; }
+if ${ac_cv_lib_sybdb_tdsdbopen+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsybdb $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char tdsdbopen ();
+int
+main ()
+{
+return tdsdbopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_sybdb_tdsdbopen=yes
+else
+ ac_cv_lib_sybdb_tdsdbopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sybdb_tdsdbopen" >&5
+$as_echo "$ac_cv_lib_sybdb_tdsdbopen" >&6; }
+if test "x$ac_cv_lib_sybdb_tdsdbopen" = xyes; then :
+ apu_have_freetds=1
+fi
+
+fi
+
+done
+
+ fi
+
+fi
+
+
+
+
+ if test "$apu_have_freetds" = "1"; then
+
+ if test "x$LDADD_dbd_freetds" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDADD_dbd_freetds to \"$sybdb_LDFLAGS -lsybdb\""
+ LDADD_dbd_freetds="$sybdb_LDFLAGS -lsybdb"
+ else
+ apr_addto_bugger="$sybdb_LDFLAGS -lsybdb"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDADD_dbd_freetds; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDADD_dbd_freetds"
+ LDADD_dbd_freetds="$LDADD_dbd_freetds $i"
+ fi
+ done
+ fi
+
+ fi
+
+
+ LIBS="$old_libs"
+ CPPFLAGS="$old_cppflags"
+ LDFLAGS="$old_ldflags"
+
+
+ apu_have_odbc=0
+
+ old_libs="$LIBS"
+ old_cppflags="$CPPFLAGS"
+ old_ldflags="$LDFLAGS"
+
+
+# Check whether --with-odbc was given.
+if test "${with_odbc+set}" = set; then :
+ withval=$with_odbc;
+ if test "$withval" = "yes"; then
+ # Extract the first word of "odbc_config", so it can be a program name with args.
+set dummy odbc_config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ODBC_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $ODBC_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_ODBC_CONFIG="$ODBC_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_ODBC_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+ODBC_CONFIG=$ac_cv_path_ODBC_CONFIG
+if test -n "$ODBC_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ODBC_CONFIG" >&5
+$as_echo "$ODBC_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ if test "x$ODBC_CONFIG" != 'x'; then
+ odbc_CPPFLAGS="-I`$ODBC_CONFIG --include-prefix`"
+ odbc_LDFLAGS="-L`$ODBC_CONFIG --lib-prefix`"
+ odbc_LIBS="`$ODBC_CONFIG --libs`"
+
+
+ if test "x$CPPFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"$odbc_CPPFLAGS\""
+ CPPFLAGS="$odbc_CPPFLAGS"
+ else
+ apr_addto_bugger="$odbc_CPPFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $CPPFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $i"
+ fi
+ done
+ fi
+
+
+ if test "x$LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$odbc_LDFLAGS\""
+ LDFLAGS="$odbc_LDFLAGS"
+ else
+ apr_addto_bugger="$odbc_LDFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS"
+ LDFLAGS="$LDFLAGS $i"
+ fi
+ done
+ fi
+
+
+ if test "x$LIBS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LIBS to \"$odbc_LIBS\""
+ LIBS="$odbc_LIBS"
+ else
+ apr_addto_bugger="$odbc_LIBS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LIBS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LIBS"
+ LIBS="$LIBS $i"
+ fi
+ done
+ fi
+
+ fi
+
+ for ac_header in sql.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "sql.h" "ac_cv_header_sql_h" "$ac_includes_default"
+if test "x$ac_cv_header_sql_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_SQL_H 1
+_ACEOF
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SQLAllocHandle in -lodbc" >&5
+$as_echo_n "checking for SQLAllocHandle in -lodbc... " >&6; }
+if ${ac_cv_lib_odbc_SQLAllocHandle+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lodbc $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char SQLAllocHandle ();
+int
+main ()
+{
+return SQLAllocHandle ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_odbc_SQLAllocHandle=yes
+else
+ ac_cv_lib_odbc_SQLAllocHandle=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_odbc_SQLAllocHandle" >&5
+$as_echo "$ac_cv_lib_odbc_SQLAllocHandle" >&6; }
+if test "x$ac_cv_lib_odbc_SQLAllocHandle" = xyes; then :
+ apu_have_odbc=1
+fi
+
+fi
+
+done
+
+ if test "$apu_have_odbc" = "0"; then
+ for ac_header in odbc/sql.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "odbc/sql.h" "ac_cv_header_odbc_sql_h" "$ac_includes_default"
+if test "x$ac_cv_header_odbc_sql_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_ODBC_SQL_H 1
+_ACEOF
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SQLAllocHandle in -lodbc" >&5
+$as_echo_n "checking for SQLAllocHandle in -lodbc... " >&6; }
+if ${ac_cv_lib_odbc_SQLAllocHandle+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lodbc $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char SQLAllocHandle ();
+int
+main ()
+{
+return SQLAllocHandle ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_odbc_SQLAllocHandle=yes
+else
+ ac_cv_lib_odbc_SQLAllocHandle=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_odbc_SQLAllocHandle" >&5
+$as_echo "$ac_cv_lib_odbc_SQLAllocHandle" >&6; }
+if test "x$ac_cv_lib_odbc_SQLAllocHandle" = xyes; then :
+ apu_have_odbc=1
+fi
+
+fi
+
+done
+
+ fi
+ if test "$apu_have_odbc" != "0" && test "x$ODBC_CONFIG" != 'x'; then
+
+ if test "x$APRUTIL_PRIV_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_PRIV_INCLUDES to \"$odbc_CPPFLAGS\""
+ APRUTIL_PRIV_INCLUDES="$odbc_CPPFLAGS"
+ else
+ apr_addto_bugger="$odbc_CPPFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_PRIV_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_PRIV_INCLUDES"
+ APRUTIL_PRIV_INCLUDES="$APRUTIL_PRIV_INCLUDES $i"
+ fi
+ done
+ fi
+
+ fi
+ elif test "$withval" = "no"; then
+ :
+ else
+ # Extract the first word of "odbc_config", so it can be a program name with args.
+set dummy odbc_config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ODBC_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $ODBC_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_ODBC_CONFIG="$ODBC_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $withval/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_ODBC_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+ODBC_CONFIG=$ac_cv_path_ODBC_CONFIG
+if test -n "$ODBC_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ODBC_CONFIG" >&5
+$as_echo "$ODBC_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ if test "x$ODBC_CONFIG" != 'x'; then
+ odbc_CPPFLAGS="-I`$ODBC_CONFIG --include-prefix`"
+ odbc_LDFLAGS="-L`$ODBC_CONFIG --lib-prefix`"
+ odbc_LIBS="`$ODBC_CONFIG --libs`"
+ else
+ if test -f "$withval" && test -x "$withval"; then
+ odbc_CPPFLAGS="-I`$withval --include-prefix`"
+ odbc_LDFLAGS="-L`$withval --lib-prefix`"
+ odbc_LIBS="`$withval --libs`"
+ else
+ odbc_CPPFLAGS="-I$withval/include"
+ odbc_LDFLAGS="-L$withval/lib "
+ fi
+ fi
+
+
+ if test "x$CPPFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"$odbc_CPPFLAGS\""
+ CPPFLAGS="$odbc_CPPFLAGS"
+ else
+ apr_addto_bugger="$odbc_CPPFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $CPPFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $i"
+ fi
+ done
+ fi
+
+
+ if test "x$LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$odbc_LDFLAGS\""
+ LDFLAGS="$odbc_LDFLAGS"
+ else
+ apr_addto_bugger="$odbc_LDFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS"
+ LDFLAGS="$LDFLAGS $i"
+ fi
+ done
+ fi
+
+
+ if test "x$LIBS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LIBS to \"$odbc_LIBS\""
+ LIBS="$odbc_LIBS"
+ else
+ apr_addto_bugger="$odbc_LIBS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LIBS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LIBS"
+ LIBS="$LIBS $i"
+ fi
+ done
+ fi
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for odbc in $withval" >&5
+$as_echo "$as_me: checking for odbc in $withval" >&6;}
+ for ac_header in sql.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "sql.h" "ac_cv_header_sql_h" "$ac_includes_default"
+if test "x$ac_cv_header_sql_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_SQL_H 1
+_ACEOF
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SQLAllocHandle in -lodbc" >&5
+$as_echo_n "checking for SQLAllocHandle in -lodbc... " >&6; }
+if ${ac_cv_lib_odbc_SQLAllocHandle+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lodbc $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char SQLAllocHandle ();
+int
+main ()
+{
+return SQLAllocHandle ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_odbc_SQLAllocHandle=yes
+else
+ ac_cv_lib_odbc_SQLAllocHandle=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_odbc_SQLAllocHandle" >&5
+$as_echo "$ac_cv_lib_odbc_SQLAllocHandle" >&6; }
+if test "x$ac_cv_lib_odbc_SQLAllocHandle" = xyes; then :
+ apu_have_odbc=1
+fi
+
+fi
+
+done
+
+ if test "$apu_have_odbc" = "0"; then
+ for ac_header in odbc/sql.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "odbc/sql.h" "ac_cv_header_odbc_sql_h" "$ac_includes_default"
+if test "x$ac_cv_header_odbc_sql_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_ODBC_SQL_H 1
+_ACEOF
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SQLAllocHandle in -lodbc" >&5
+$as_echo_n "checking for SQLAllocHandle in -lodbc... " >&6; }
+if ${ac_cv_lib_odbc_SQLAllocHandle+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lodbc $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char SQLAllocHandle ();
+int
+main ()
+{
+return SQLAllocHandle ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_odbc_SQLAllocHandle=yes
+else
+ ac_cv_lib_odbc_SQLAllocHandle=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_odbc_SQLAllocHandle" >&5
+$as_echo "$ac_cv_lib_odbc_SQLAllocHandle" >&6; }
+if test "x$ac_cv_lib_odbc_SQLAllocHandle" = xyes; then :
+ apu_have_odbc=1
+fi
+
+fi
+
+done
+
+ fi
+ if test "$apu_have_odbc" != "0" && test "x$ODBC_CONFIG" != 'x'; then
+
+ if test "x$APRUTIL_PRIV_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_PRIV_INCLUDES to \"$odbc_CPPFLAGS\""
+ APRUTIL_PRIV_INCLUDES="$odbc_CPPFLAGS"
+ else
+ apr_addto_bugger="$odbc_CPPFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_PRIV_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_PRIV_INCLUDES"
+ APRUTIL_PRIV_INCLUDES="$APRUTIL_PRIV_INCLUDES $i"
+ fi
+ done
+ fi
+
+ fi
+ fi
+
+else
+
+ # Extract the first word of "odbc_config", so it can be a program name with args.
+set dummy odbc_config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ODBC_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $ODBC_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_ODBC_CONFIG="$ODBC_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_ODBC_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+ODBC_CONFIG=$ac_cv_path_ODBC_CONFIG
+if test -n "$ODBC_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ODBC_CONFIG" >&5
+$as_echo "$ODBC_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ if test "x$ODBC_CONFIG" != 'x'; then
+ odbc_CPPFLAGS="-I`$ODBC_CONFIG --include-prefix`"
+ odbc_LDFLAGS="-L`$ODBC_CONFIG --lib-prefix`"
+ odbc_LIBS="`$ODBC_CONFIG --libs`"
+
+
+ if test "x$CPPFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"$odbc_CPPFLAGS\""
+ CPPFLAGS="$odbc_CPPFLAGS"
+ else
+ apr_addto_bugger="$odbc_CPPFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $CPPFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $i"
+ fi
+ done
+ fi
+
+
+ if test "x$LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDFLAGS to \"$odbc_LDFLAGS\""
+ LDFLAGS="$odbc_LDFLAGS"
+ else
+ apr_addto_bugger="$odbc_LDFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS"
+ LDFLAGS="$LDFLAGS $i"
+ fi
+ done
+ fi
+
+
+ if test "x$LIBS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LIBS to \"$odbc_LIBS\""
+ LIBS="$odbc_LIBS"
+ else
+ apr_addto_bugger="$odbc_LIBS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LIBS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LIBS"
+ LIBS="$LIBS $i"
+ fi
+ done
+ fi
+
+ fi
+
+ for ac_header in sql.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "sql.h" "ac_cv_header_sql_h" "$ac_includes_default"
+if test "x$ac_cv_header_sql_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_SQL_H 1
+_ACEOF
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SQLAllocHandle in -lodbc" >&5
+$as_echo_n "checking for SQLAllocHandle in -lodbc... " >&6; }
+if ${ac_cv_lib_odbc_SQLAllocHandle+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lodbc $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char SQLAllocHandle ();
+int
+main ()
+{
+return SQLAllocHandle ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_odbc_SQLAllocHandle=yes
+else
+ ac_cv_lib_odbc_SQLAllocHandle=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_odbc_SQLAllocHandle" >&5
+$as_echo "$ac_cv_lib_odbc_SQLAllocHandle" >&6; }
+if test "x$ac_cv_lib_odbc_SQLAllocHandle" = xyes; then :
+ apu_have_odbc=1
+fi
+
+fi
+
+done
+
+ if test "$apu_have_odbc" = "0"; then
+ for ac_header in odbc/sql.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "odbc/sql.h" "ac_cv_header_odbc_sql_h" "$ac_includes_default"
+if test "x$ac_cv_header_odbc_sql_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_ODBC_SQL_H 1
+_ACEOF
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SQLAllocHandle in -lodbc" >&5
+$as_echo_n "checking for SQLAllocHandle in -lodbc... " >&6; }
+if ${ac_cv_lib_odbc_SQLAllocHandle+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lodbc $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char SQLAllocHandle ();
+int
+main ()
+{
+return SQLAllocHandle ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_odbc_SQLAllocHandle=yes
+else
+ ac_cv_lib_odbc_SQLAllocHandle=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_odbc_SQLAllocHandle" >&5
+$as_echo "$ac_cv_lib_odbc_SQLAllocHandle" >&6; }
+if test "x$ac_cv_lib_odbc_SQLAllocHandle" = xyes; then :
+ apu_have_odbc=1
+fi
+
+fi
+
+done
+
+ fi
+ if test "$apu_have_odbc" != "0" && test "x$ODBC_CONFIG" != 'x'; then
+
+ if test "x$APRUTIL_PRIV_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_PRIV_INCLUDES to \"$odbc_CPPFLAGS\""
+ APRUTIL_PRIV_INCLUDES="$odbc_CPPFLAGS"
+ else
+ apr_addto_bugger="$odbc_CPPFLAGS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_PRIV_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_PRIV_INCLUDES"
+ APRUTIL_PRIV_INCLUDES="$APRUTIL_PRIV_INCLUDES $i"
+ fi
+ done
+ fi
+
+ fi
+
+fi
+
+
+ if test "$apu_have_odbc" = "1"; then
+
+ if test "x$LDADD_dbd_odbc" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDADD_dbd_odbc to \"$odbc_LDFLAGS -lodbc $odbc_LIBS\""
+ LDADD_dbd_odbc="$odbc_LDFLAGS -lodbc $odbc_LIBS"
+ else
+ apr_addto_bugger="$odbc_LDFLAGS -lodbc $odbc_LIBS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDADD_dbd_odbc; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDADD_dbd_odbc"
+ LDADD_dbd_odbc="$LDADD_dbd_odbc $i"
+ fi
+ done
+ fi
+
+ fi
+
+
+ LIBS="$old_libs"
+ CPPFLAGS="$old_cppflags"
+ LDFLAGS="$old_ldflags"
+
+ apu_dbd_tests=""
+ test $apu_have_oracle = 1 && apu_dbd_tests="$apu_dbd_tests oracle"
+ test $apu_have_pgsql = 1 && apu_dbd_tests="$apu_dbd_tests pgsql"
+ test $apu_have_mysql = 1 && apu_dbd_tests="$apu_dbd_tests mysql"
+ test $apu_have_sqlite2 = 1 && apu_dbd_tests="$apu_dbd_tests sqlite2"
+ test $apu_have_sqlite3 = 1 && apu_dbd_tests="$apu_dbd_tests sqlite3"
+ test $apu_have_freetds = 1 && apu_dbd_tests="$apu_dbd_tests freetds"
+ test $apu_have_odbc = 1 && apu_dbd_tests="$apu_dbd_tests odbc"
+
+
+
+
+save_cppflags="$CPPFLAGS"
+save_ldflags="$LDFLAGS"
+
+apu_has_expat=0
+
+# Default: will use either external or bundled expat.
+apu_try_external_expat=1
+apu_try_builtin_expat=1
+
+
+# Check whether --with-expat was given.
+if test "${with_expat+set}" = set; then :
+ withval=$with_expat;
+ if test "$withval" = "yes"; then
+ as_fn_error $? "a directory must be specified for --with-expat" "$LINENO" 5
+ elif test "$withval" = "no"; then
+ as_fn_error $? "Expat cannot be disabled (at this time)" "$LINENO" 5
+ elif test "$withval" = "builtin"; then
+ apu_try_external_expat=0
+ else
+ # Add given path to standard search paths if appropriate:
+ if test "$withval" != "/usr"; then
+
+ if test "x$LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDFLAGS to \"-L$withval/lib\""
+ LDFLAGS="-L$withval/lib"
+ else
+ apr_addto_bugger="-L$withval/lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS"
+ LDFLAGS="$LDFLAGS $i"
+ fi
+ done
+ fi
+
+
+ if test "x$CPPFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"-I$withval/include\""
+ CPPFLAGS="-I$withval/include"
+ else
+ apr_addto_bugger="-I$withval/include"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $CPPFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$withval/include\""
+ APRUTIL_INCLUDES="-I$withval/include"
+ else
+ apr_addto_bugger="-I$withval/include"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$withval/lib\""
+ APRUTIL_LDFLAGS="-L$withval/lib"
+ else
+ apr_addto_bugger="-L$withval/lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+ fi
+ # ...and refuse to fall back on the builtin expat.
+ apu_try_builtin_expat=0
+ fi
+
+fi
+
+
+if test $apu_try_external_expat = 1; then
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Expat 1.95.x" >&5
+$as_echo_n "checking Expat 1.95.x... " >&6; }
+if ${apu_cv_expat_system+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ apu_expat_LIBS=$LIBS
+ LIBS="$LIBS -lexpat"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <expat.h>
+int
+main ()
+{
+XML_ParserCreate(NULL);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ apu_cv_expat_system=yes
+else
+ apu_cv_expat_system=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS=$apu_expat_LIBS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $apu_cv_expat_system" >&5
+$as_echo "$apu_cv_expat_system" >&6; }
+
+if test $apu_cv_expat_system = yes; then
+
+$as_echo "#define HAVE_EXPAT_H 1" >>confdefs.h
+
+ apu_expat_libs="-lexpat"
+ apu_has_expat=1
+
+else
+ apu_has_expat=0
+
+fi
+
+
+ if test $apu_has_expat = 0; then
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking old Debian-packaged expat" >&5
+$as_echo_n "checking old Debian-packaged expat... " >&6; }
+if ${apu_cv_expat_debian+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ apu_expat_LIBS=$LIBS
+ LIBS="$LIBS -lxmlparse -lxmltok"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <xmltok/xmlparse.h>
+int
+main ()
+{
+XML_ParserCreate(NULL);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ apu_cv_expat_debian=yes
+else
+ apu_cv_expat_debian=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS=$apu_expat_LIBS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $apu_cv_expat_debian" >&5
+$as_echo "$apu_cv_expat_debian" >&6; }
+
+if test $apu_cv_expat_debian = yes; then
+
+$as_echo "#define HAVE_XMLTOK_XMLPARSE_H 1" >>confdefs.h
+
+ apu_expat_libs="-lxmlparse -lxmltok"
+ apu_has_expat=1
+
+else
+ apu_has_expat=0
+
+fi
+
+ fi
+
+ if test $apu_has_expat = 0; then
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking old FreeBSD-packaged expat" >&5
+$as_echo_n "checking old FreeBSD-packaged expat... " >&6; }
+if ${apu_cv_expat_freebsd+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ apu_expat_LIBS=$LIBS
+ LIBS="$LIBS -lexpat"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <xml/xmlparse.h>
+int
+main ()
+{
+XML_ParserCreate(NULL);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ apu_cv_expat_freebsd=yes
+else
+ apu_cv_expat_freebsd=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS=$apu_expat_LIBS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $apu_cv_expat_freebsd" >&5
+$as_echo "$apu_cv_expat_freebsd" >&6; }
+
+if test $apu_cv_expat_freebsd = yes; then
+
+$as_echo "#define HAVE_XML_XMLPARSE_H 1" >>confdefs.h
+
+ apu_expat_libs="-lexpat"
+ apu_has_expat=1
+
+else
+ apu_has_expat=0
+
+fi
+
+ fi
+
+ if test $apu_has_expat = 0; then
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Expat 1.0/1.1" >&5
+$as_echo_n "checking Expat 1.0/1.1... " >&6; }
+if ${apu_cv_expat_1011+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ apu_expat_LIBS=$LIBS
+ LIBS="$LIBS -lexpat"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <xmlparse/xmlparse.h>
+int
+main ()
+{
+XML_ParserCreate(NULL);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ apu_cv_expat_1011=yes
+else
+ apu_cv_expat_1011=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS=$apu_expat_LIBS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $apu_cv_expat_1011" >&5
+$as_echo "$apu_cv_expat_1011" >&6; }
+
+if test $apu_cv_expat_1011 = yes; then
+
+$as_echo "#define HAVE_XMLPARSE_XMLPARSE_H 1" >>confdefs.h
+
+ apu_expat_libs="-lexpat"
+ apu_has_expat=1
+
+else
+ apu_has_expat=0
+
+fi
+
+ fi
+
+ if test $apu_has_expat = 0; then
+
+ if test "x$LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDFLAGS to \"-L/usr/local/lib\""
+ LDFLAGS="-L/usr/local/lib"
+ else
+ apr_addto_bugger="-L/usr/local/lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS"
+ LDFLAGS="$LDFLAGS $i"
+ fi
+ done
+ fi
+
+
+ if test "x$CPPFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"-I/usr/local/include\""
+ CPPFLAGS="-I/usr/local/include"
+ else
+ apr_addto_bugger="-I/usr/local/include"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $CPPFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $i"
+ fi
+ done
+ fi
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Expat 1.95.x in /usr/local" >&5
+$as_echo_n "checking Expat 1.95.x in /usr/local... " >&6; }
+if ${apu_cv_expat_usrlocal+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ apu_expat_LIBS=$LIBS
+ LIBS="$LIBS -lexpat"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <expat.h>
+int
+main ()
+{
+XML_ParserCreate(NULL);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ apu_cv_expat_usrlocal=yes
+else
+ apu_cv_expat_usrlocal=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS=$apu_expat_LIBS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $apu_cv_expat_usrlocal" >&5
+$as_echo "$apu_cv_expat_usrlocal" >&6; }
+
+if test $apu_cv_expat_usrlocal = yes; then
+
+$as_echo "#define HAVE_EXPAT_H 1" >>confdefs.h
+
+ apu_expat_libs="-lexpat"
+ apu_has_expat=1
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I/usr/local/include\""
+ APRUTIL_INCLUDES="-I/usr/local/include"
+ else
+ apr_addto_bugger="-I/usr/local/include"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L/usr/local/lib\""
+ APRUTIL_LDFLAGS="-L/usr/local/lib"
+ else
+ apr_addto_bugger="-L/usr/local/lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+else
+ apu_has_expat=0
+
+
+ if test "x$LDFLAGS" = "x-L/usr/local/lib"; then
+ test "x$silent" != "xyes" && echo " nulling LDFLAGS"
+ LDFLAGS=""
+ else
+ apr_new_bugger=""
+ apr_removed=0
+ for i in $LDFLAGS; do
+ if test "x$i" != "x-L/usr/local/lib"; then
+ apr_new_bugger="$apr_new_bugger $i"
+ else
+ apr_removed=1
+ fi
+ done
+ if test $apr_removed = "1"; then
+ test "x$silent" != "xyes" && echo " removed \"-L/usr/local/lib\" from LDFLAGS"
+ LDFLAGS=$apr_new_bugger
+ fi
+ fi
+
+
+ if test "x$CPPFLAGS" = "x-I/usr/local/include"; then
+ test "x$silent" != "xyes" && echo " nulling CPPFLAGS"
+ CPPFLAGS=""
+ else
+ apr_new_bugger=""
+ apr_removed=0
+ for i in $CPPFLAGS; do
+ if test "x$i" != "x-I/usr/local/include"; then
+ apr_new_bugger="$apr_new_bugger $i"
+ else
+ apr_removed=1
+ fi
+ done
+ if test $apr_removed = "1"; then
+ test "x$silent" != "xyes" && echo " removed \"-I/usr/local/include\" from CPPFLAGS"
+ CPPFLAGS=$apr_new_bugger
+ fi
+ fi
+
+
+fi
+
+ fi
+
+fi
+
+if test "${apu_has_expat}${apu_try_builtin_expat}" = "01"; then
+ bundled_subdir="xml/expat"
+
+ # save our work to this point; this allows the sub-package to use it
+ cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+
+ (set) 2>&1 |
+ case $as_nl`(ac_space=' '; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ # `set' does not quote correctly, so add quotes: double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \.
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;; #(
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+) |
+ sed '
+ /^ac_cv_env_/b end
+ t clear
+ :clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+ if test "x$cache_file" != "x/dev/null"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+ if test ! -f "$cache_file" || test -h "$cache_file"; then
+ cat confcache >"$cache_file"
+ else
+ case $cache_file in #(
+ */* | ?:*)
+ mv -f confcache "$cache_file"$$ &&
+ mv -f "$cache_file"$$ "$cache_file" ;; #(
+ *)
+ mv -f confcache "$cache_file" ;;
+ esac
+ fi
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ fi
+fi
+rm -f confcache
+
+ echo "configuring package in $bundled_subdir now"
+ ac_popdir=`pwd`
+ apr_config_subdirs="$bundled_subdir"
+ test -d $bundled_subdir || $mkdir_p $bundled_subdir
+ ac_abs_srcdir=`(cd $srcdir/$bundled_subdir && pwd)`
+ cd $bundled_subdir
+
+ # A "../" for each directory in /$config_subdirs.
+ ac_dots=`echo $apr_config_subdirs|sed -e 's%^\./%%' -e 's%[^/]$%&/%' -e 's%[^/]*/%../%g'`
+
+ # Make the cache file pathname absolute for the subdirs
+ # required to correctly handle subdirs that might actually
+ # be symlinks
+ case "$cache_file" in
+ /*) # already absolute
+ ac_sub_cache_file=$cache_file ;;
+ *) # Was relative path.
+ ac_sub_cache_file="$ac_popdir/$cache_file" ;;
+ esac
+
+ apr_configure_args=$ac_configure_args
+
+ test "x$silent" = "xyes" && apr_configure_args="$apr_configure_args --silent"
+
+ apr_configure_args="--disable-option-checking $apr_configure_args"
+
+ if eval $SHELL $ac_abs_srcdir/configure $apr_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_abs_srcdir --prefix=$prefix --exec-prefix=$exec_prefix --libdir=$libdir --includedir=$includedir --bindir=$bindir
+ then :
+ echo "$bundled_subdir configured properly"
+ else
+ echo "configure failed for $bundled_subdir"
+ exit 1
+ fi
+
+ cd $ac_popdir
+
+ # grab any updates from the sub-package
+ if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special files
+ # actually), so we avoid doing that. DJGPP emulates it as a regular file.
+ if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$abs_srcdir/$bundled_subdir/lib\""
+ APRUTIL_INCLUDES="-I$abs_srcdir/$bundled_subdir/lib"
+ else
+ apr_addto_bugger="-I$abs_srcdir/$bundled_subdir/lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDFLAGS to \"-L$top_builddir/$bundled_subdir/lib\""
+ LDFLAGS="-L$top_builddir/$bundled_subdir/lib"
+ else
+ apr_addto_bugger="-L$top_builddir/$bundled_subdir/lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS"
+ LDFLAGS="$LDFLAGS $i"
+ fi
+ done
+ fi
+
+ apu_expat_libs="$top_builddir/$bundled_subdir/libexpat.la"
+fi
+
+
+ if test "x$APRUTIL_EXPORT_LIBS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_EXPORT_LIBS to \"$apu_expat_libs\""
+ APRUTIL_EXPORT_LIBS="$apu_expat_libs"
+ else
+ apr_addto_bugger="$apu_expat_libs"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_EXPORT_LIBS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_EXPORT_LIBS"
+ APRUTIL_EXPORT_LIBS="$APRUTIL_EXPORT_LIBS $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LIBS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LIBS to \"$apu_expat_libs\""
+ APRUTIL_LIBS="$apu_expat_libs"
+ else
+ apr_addto_bugger="$apu_expat_libs"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LIBS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LIBS"
+ APRUTIL_LIBS="$APRUTIL_LIBS $i"
+ fi
+ done
+ fi
+
+
+APR_XML_DIR=$bundled_subdir
+
+
+CPPFLAGS=$save_cppflags
+LDFLAGS=$save_ldflags
+
+
+
+apu_iconv_dir="unknown"
+have_apr_iconv="0"
+want_iconv="1"
+
+# Check whether --with-iconv was given.
+if test "${with_iconv+set}" = set; then :
+ withval=$with_iconv; apu_iconv_dir="$withval"
+ if test "$apu_iconv_dir" = "no"; then
+ have_apr_iconv="0"
+ have_iconv="0"
+ want_iconv="0"
+ elif test "$apu_iconv_dir" != "yes"; then
+ if test -f "$apu_iconv_dir/include/apr-1/api_version.h"; then
+ have_apr_iconv="1"
+ have_iconv="0"
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$apu_iconv_dir/include/apr-1\""
+ APRUTIL_INCLUDES="-I$apu_iconv_dir/include/apr-1"
+ else
+ apr_addto_bugger="-I$apu_iconv_dir/include/apr-1"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LIBS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LIBS to \"$apu_iconv_dir/lib/libapriconv-1.la\""
+ APRUTIL_LIBS="$apu_iconv_dir/lib/libapriconv-1.la"
+ else
+ apr_addto_bugger="$apu_iconv_dir/lib/libapriconv-1.la"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LIBS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LIBS"
+ APRUTIL_LIBS="$APRUTIL_LIBS $i"
+ fi
+ done
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: using apr-iconv" >&5
+$as_echo "using apr-iconv" >&6; }
+ elif test -f "$apu_iconv_dir/include/iconv.h"; then
+ have_apr_iconv="0"
+ have_iconv="1"
+
+ if test "x$CPPFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting CPPFLAGS to \"-I$apu_iconv_dir/include\""
+ CPPFLAGS="-I$apu_iconv_dir/include"
+ else
+ apr_addto_bugger="-I$apu_iconv_dir/include"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $CPPFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $i"
+ fi
+ done
+ fi
+
+
+ if test "x$LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LDFLAGS to \"-L$apu_iconv_dir/lib\""
+ LDFLAGS="-L$apu_iconv_dir/lib"
+ else
+ apr_addto_bugger="-L$apu_iconv_dir/lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LDFLAGS"
+ LDFLAGS="$LDFLAGS $i"
+ fi
+ done
+ fi
+
+ fi
+ fi
+
+fi
+
+
+if test "$want_iconv" = "1" -a "$have_apr_iconv" != "1"; then
+ ac_fn_c_check_header_mongrel "$LINENO" "iconv.h" "ac_cv_header_iconv_h" "$ac_includes_default"
+if test "x$ac_cv_header_iconv_h" = xyes; then :
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <iconv.h>
+
+int
+main ()
+{
+
+ iconv_t cd = iconv_open("", "");
+ iconv(cd, NULL, NULL, NULL, NULL);
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ have_iconv="1"
+else
+
+
+
+ if test "x$LIBS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting LIBS to \"-liconv\""
+ LIBS="-liconv"
+ else
+ apr_addto_bugger="-liconv"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $LIBS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to LIBS"
+ LIBS="$LIBS $i"
+ fi
+ done
+ fi
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <iconv.h>
+
+int
+main ()
+{
+
+ iconv_t cd = iconv_open("", "");
+ iconv(cd, NULL, NULL, NULL, NULL);
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+
+ if test "x$APRUTIL_LIBS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LIBS to \"-liconv\""
+ APRUTIL_LIBS="-liconv"
+ else
+ apr_addto_bugger="-liconv"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LIBS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LIBS"
+ APRUTIL_LIBS="$APRUTIL_LIBS $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_EXPORT_LIBS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_EXPORT_LIBS to \"-liconv\""
+ APRUTIL_EXPORT_LIBS="-liconv"
+ else
+ apr_addto_bugger="-liconv"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_EXPORT_LIBS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_EXPORT_LIBS"
+ APRUTIL_EXPORT_LIBS="$APRUTIL_EXPORT_LIBS $i"
+ fi
+ done
+ fi
+
+ have_iconv="1"
+else
+ have_iconv="0"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+
+
+
+ if test "x$LIBS" = "x-liconv"; then
+ test "x$silent" != "xyes" && echo " nulling LIBS"
+ LIBS=""
+ else
+ apr_new_bugger=""
+ apr_removed=0
+ for i in $LIBS; do
+ if test "x$i" != "x-liconv"; then
+ apr_new_bugger="$apr_new_bugger $i"
+ else
+ apr_removed=1
+ fi
+ done
+ if test $apr_removed = "1"; then
+ test "x$silent" != "xyes" && echo " removed \"-liconv\" from LIBS"
+ LIBS=$apr_new_bugger
+ fi
+ fi
+
+
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+
+
+else
+ have_iconv="0"
+fi
+
+
+fi
+
+if test "$want_iconv" = "1" -a "$apu_iconv_dir" != "unknown"; then
+ if test "$have_iconv" != "1"; then
+ if test "$have_apr_iconv" != "1"; then
+ as_fn_error $? "iconv support requested, but not found" "$LINENO" 5
+ fi
+ fi
+
+ if test "x$CPPFLAGS" = "x-I$apu_iconv_dir/include"; then
+ test "x$silent" != "xyes" && echo " nulling CPPFLAGS"
+ CPPFLAGS=""
+ else
+ apr_new_bugger=""
+ apr_removed=0
+ for i in $CPPFLAGS; do
+ if test "x$i" != "x-I$apu_iconv_dir/include"; then
+ apr_new_bugger="$apr_new_bugger $i"
+ else
+ apr_removed=1
+ fi
+ done
+ if test $apr_removed = "1"; then
+ test "x$silent" != "xyes" && echo " removed \"-I$apu_iconv_dir/include\" from CPPFLAGS"
+ CPPFLAGS=$apr_new_bugger
+ fi
+ fi
+
+
+ if test "x$LDFLAGS" = "x-L$apu_iconv_dir/lib"; then
+ test "x$silent" != "xyes" && echo " nulling LDFLAGS"
+ LDFLAGS=""
+ else
+ apr_new_bugger=""
+ apr_removed=0
+ for i in $LDFLAGS; do
+ if test "x$i" != "x-L$apu_iconv_dir/lib"; then
+ apr_new_bugger="$apr_new_bugger $i"
+ else
+ apr_removed=1
+ fi
+ done
+ if test $apr_removed = "1"; then
+ test "x$silent" != "xyes" && echo " removed \"-L$apu_iconv_dir/lib\" from LDFLAGS"
+ LDFLAGS=$apr_new_bugger
+ fi
+ fi
+
+
+ if test "x$APRUTIL_INCLUDES" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_INCLUDES to \"-I$apu_iconv_dir/include\""
+ APRUTIL_INCLUDES="-I$apu_iconv_dir/include"
+ else
+ apr_addto_bugger="-I$apu_iconv_dir/include"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_INCLUDES; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_INCLUDES"
+ APRUTIL_INCLUDES="$APRUTIL_INCLUDES $i"
+ fi
+ done
+ fi
+
+
+ if test "x$APRUTIL_LDFLAGS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LDFLAGS to \"-L$apu_iconv_dir/lib\""
+ APRUTIL_LDFLAGS="-L$apu_iconv_dir/lib"
+ else
+ apr_addto_bugger="-L$apu_iconv_dir/lib"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LDFLAGS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LDFLAGS"
+ APRUTIL_LDFLAGS="$APRUTIL_LDFLAGS $i"
+ fi
+ done
+ fi
+
+fi
+
+if test "$have_iconv" = "1"; then
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for type of inbuf parameter to iconv" >&5
+$as_echo_n "checking for type of inbuf parameter to iconv... " >&6; }
+if test "x$apu_iconv_inbuf_const" = "x"; then
+ apr_save_CFLAGS=$CFLAGS
+ CFLAGS="$CFLAGS $CFLAGS_WARN"
+ if test "$ac_cv_c_compiler_gnu" = "yes"; then
+ CFLAGS="$CFLAGS -Werror"
+ fi
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include "confdefs.h"
+
+
+ #include <stddef.h>
+ #include <iconv.h>
+
+ int main(int argc, const char *const *argv) {
+
+ iconv(0,(char **)0,(size_t *)0,(char **)0,(size_t *)0);
+
+ return 0; }
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ apu_iconv_inbuf_const="0"
+else
+ apu_iconv_inbuf_const="1"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CFLAGS=$apr_save_CFLAGS
+
+fi
+if test "$apu_iconv_inbuf_const" = "1"; then
+
+$as_echo "#define APU_ICONV_INBUF_CONST 1" >>confdefs.h
+
+ msg="const char **"
+else
+ msg="char **"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $msg" >&5
+$as_echo "$msg" >&6; }
+
+fi
+
+
+for ac_header in iconv.h langinfo.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+for aprt_i in iconv.h langinfo.h
+do
+ ac_safe=`echo "$aprt_i" | sed 'y%./+-%__p_%'`
+ aprt_2=`echo "$aprt_i" | sed -e 's%/%_%g' -e 's/\.//g' -e 's/-//g'`
+ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ eval "$aprt_2=1"
+ else
+ eval "$aprt_2=0"
+ fi
+done
+
+
+for ac_func in nl_langinfo
+do :
+ ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo"
+if test "x$ac_cv_func_nl_langinfo" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_NL_LANGINFO 1
+_ACEOF
+
+fi
+done
+
+for aprt_j in nl_langinfo
+do
+ aprt_3="have_$aprt_j"
+ if eval "test \"`echo '$ac_cv_func_'$aprt_j`\" = yes"; then
+ eval "$aprt_3=1"
+ else
+ eval "$aprt_3=0"
+ fi
+done
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CODESET in langinfo.h" >&5
+$as_echo_n "checking for CODESET in langinfo.h... " >&6; }
+if ${ac_cv_define_CODESET+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <langinfo.h>
+#ifdef CODESET
+YES_IS_DEFINED
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "YES_IS_DEFINED" >/dev/null 2>&1; then :
+ ac_cv_define_CODESET=yes
+else
+ ac_cv_define_CODESET=no
+fi
+rm -f conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_define_CODESET" >&5
+$as_echo "$ac_cv_define_CODESET" >&6; }
+ if test "$ac_cv_define_CODESET" = "yes"; then
+
+$as_echo "#define HAVE_CODESET 1" >>confdefs.h
+
+ fi
+
+
+
+
+
+
+
+
+ # Check whether --enable-util-dso was given.
+if test "${enable_util_dso+set}" = set; then :
+ enableval=$enable_util_dso;
+fi
+
+
+ if test "$enable_util_dso" = "no"; then
+ apu_dso_build="0"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether APR has DSO support" >&5
+$as_echo_n "checking whether APR has DSO support... " >&6; }
+if ${apu_cv_aprdso+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ apu_save_CPPFLAGS=$CPPFLAGS
+ CPPFLAGS="$CPPFLAGS $APR_INCLUDES"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include "apr.h"
+#if APR_HAS_DSO
+yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1; then :
+ apu_cv_aprdso=yes
+else
+ apu_cv_aprdso=no
+fi
+rm -f conftest*
+
+ CPPFLAGS=$apu_save_CPPFLAGS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $apu_cv_aprdso" >&5
+$as_echo "$apu_cv_aprdso" >&6; }
+
+ if test $apu_cv_aprdso = yes; then
+ apu_dso_build=1
+ else
+ apu_dso_build=0
+ fi
+ fi
+
+ if test "$apu_dso_build" = "0"; then
+
+ # Statically link the drivers:
+ objs=
+ test $apu_have_openssl = 1 && objs="$objs crypto/apr_crypto_openssl.lo"
+ test $apu_have_nss = 1 && objs="$objs crypto/apr_crypto_nss.lo"
+ test $apu_have_oracle = 1 && objs="$objs dbd/apr_dbd_oracle.lo"
+ test $apu_have_pgsql = 1 && objs="$objs dbd/apr_dbd_pgsql.lo"
+ test $apu_have_mysql = 1 && objs="$objs dbd/apr_dbd_mysql.lo"
+ test $apu_have_sqlite2 = 1 && objs="$objs dbd/apr_dbd_sqlite2.lo"
+ test $apu_have_sqlite3 = 1 && objs="$objs dbd/apr_dbd_sqlite3.lo"
+ test $apu_have_freetds = 1 && objs="$objs dbd/apr_dbd_freetds.lo"
+ test $apu_have_odbc = 1 && objs="$objs dbd/apr_dbd_odbc.lo"
+ 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_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"
+ EXTRA_OBJECTS="$EXTRA_OBJECTS $objs"
+
+ # Use libtool *.la for mysql if available
+ if test $apu_have_mysql = 1; then
+ for flag in $LDADD_dbd_mysql
+ do
+ dir=`echo $flag | grep "^-L" | sed s:-L::`
+ if test "x$dir" != 'x'; then
+ if test -f "$dir/libmysqlclient_r.la"; then
+ LDADD_dbd_mysql=$dir/libmysqlclient_r.la
+ break
+ fi
+ fi
+ done
+ fi
+
+ APRUTIL_LIBS="$APRUTIL_LIBS $LDADD_crypto_openssl $LDADD_crypto_nss"
+ APRUTIL_LIBS="$APRUTIL_LIBS $LDADD_dbd_pgsql $LDADD_dbd_sqlite2 $LDADD_dbd_sqlite3 $LDADD_dbd_oracle $LDADD_dbd_mysql $LDADD_dbd_freetds $LDADD_dbd_odbc"
+ APRUTIL_LIBS="$APRUTIL_LIBS $LDADD_dbm_db $LDADD_dbm_gdbm $LDADD_dbm_ndbm"
+ APRUTIL_LIBS="$APRUTIL_LIBS $LDADD_ldap"
+ APRUTIL_EXPORT_LIBS="$APRUTIL_EXPORT_LIBS $LDADD_crypto_openssl $LDADD_crypto_nss"
+ APRUTIL_EXPORT_LIBS="$APRUTIL_EXPORT_LIBS $LDADD_dbd_pgsql $LDADD_dbd_sqlite2 $LDADD_dbd_sqlite3 $LDADD_dbd_oracle $LDADD_dbd_mysql $LDADD_dbd_freetds $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_ldap"
+
+ else
+
+ # Build the drivers as loadable modules:
+ dsos=
+ test $apu_have_openssl = 1 && dsos="$dsos crypto/apr_crypto_openssl.la"
+ test $apu_have_nss = 1 && dsos="$dsos crypto/apr_crypto_nss.la"
+ test $apu_have_oracle = 1 && dsos="$dsos dbd/apr_dbd_oracle.la"
+ test $apu_have_pgsql = 1 && dsos="$dsos dbd/apr_dbd_pgsql.la"
+ test $apu_have_mysql = 1 && dsos="$dsos dbd/apr_dbd_mysql.la"
+ test $apu_have_sqlite2 = 1 && dsos="$dsos dbd/apr_dbd_sqlite2.la"
+ test $apu_have_sqlite3 = 1 && dsos="$dsos dbd/apr_dbd_sqlite3.la"
+ test $apu_have_freetds = 1 && dsos="$dsos dbd/apr_dbd_freetds.la"
+ test $apu_have_odbc = 1 && dsos="$dsos dbd/apr_dbd_odbc.la"
+ 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_has_ldap = 1 && dsos="$dsos ldap/apr_ldap.la"
+
+ if test -n "$dsos"; then
+ APU_MODULES="$APU_MODULES $dsos"
+ fi
+
+ fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define APU_DSO_BUILD $apu_dso_build
+_ACEOF
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing crypt" >&5
+$as_echo_n "checking for library containing crypt... " >&6; }
+if ${ac_cv_search_crypt+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char crypt ();
+int
+main ()
+{
+return crypt ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' crypt ufc; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_search_crypt=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_crypt+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_crypt+:} false; then :
+
+else
+ ac_cv_search_crypt=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_crypt" >&5
+$as_echo "$ac_cv_search_crypt" >&6; }
+ac_res=$ac_cv_search_crypt
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if system crypt() function is threadsafe" >&5
+$as_echo_n "checking if system crypt() function is threadsafe... " >&6; }
+if test "x$apu_crypt_threadsafe" = "x1"; then
+
+$as_echo "#define APU_CRYPT_THREADSAFE 1" >>confdefs.h
+
+ msg="yes"
+else
+ msg="no"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $msg" >&5
+$as_echo "$msg" >&6; }
+
+for ac_func in crypt_r
+do :
+ ac_fn_c_check_func "$LINENO" "crypt_r" "ac_cv_func_crypt_r"
+if test "x$ac_cv_func_crypt_r" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_CRYPT_R 1
+_ACEOF
+ crypt_r="1"
+else
+ crypt_r="0"
+fi
+done
+
+if test "$crypt_r" = "1"; then
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking style of crypt_r" >&5
+$as_echo_n "checking style of crypt_r... " >&6; }
+if ${apr_cv_crypt_r_style+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <crypt.h>
+int
+main ()
+{
+CRYPTD buffer;
+ crypt_r("passwd", "hash", &buffer);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ apr_cv_crypt_r_style=cryptd
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <crypt.h>
+int
+main ()
+{
+struct crypt_data buffer;
+ crypt_r("passwd", "hash", &buffer);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ apr_cv_crypt_r_style=struct_crypt_data
+else
+ apr_cv_crypt_r_style=none
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $apr_cv_crypt_r_style" >&5
+$as_echo "$apr_cv_crypt_r_style" >&6; }
+
+if test "$apr_cv_crypt_r_style" = "cryptd"; then
+
+$as_echo "#define CRYPT_R_CRYPTD 1" >>confdefs.h
+
+elif test "$apr_cv_crypt_r_style" = "struct_crypt_data"; then
+
+$as_echo "#define CRYPT_R_STRUCT_CRYPT_DATA 1" >>confdefs.h
+
+fi
+
+fi
+
+so_ext=$APR_SO_EXT
+lib_target=$APR_LIB_TARGET
+
+
+
+APRUTIL_LIBNAME="aprutil${libsuffix}"
+
+
+# Set up destination directory for DSOs.
+APU_DSO_LIBDIR="\${libdir}/apr-util-${APRUTIL_MAJOR_VERSION}"
+# Set APU_HAVE_MODULES appropriately for the Makefile
+if test -n "$APU_MODULES"; then
+ APU_HAVE_MODULES=yes
+else
+ APU_HAVE_MODULES=no
+fi
+# Define expanded libdir for apu_config.h
+
+ap_last=
+ap_cur="$APU_DSO_LIBDIR"
+while test "x${ap_cur}" != "x${ap_last}";
+do
+ ap_last="${ap_cur}"
+ ap_cur=`eval "echo ${ap_cur}"`
+done
+abs_dso_libdir="${ap_cur}"
+
+
+cat >>confdefs.h <<_ACEOF
+#define APU_DSO_LIBDIR "$abs_dso_libdir"
+_ACEOF
+
+
+
+
+
+
+
+ if test "x$APRUTIL_LIBS" = "x"; then
+ test "x$silent" != "xyes" && echo " setting APRUTIL_LIBS to \"$APR_LIBS\""
+ APRUTIL_LIBS="$APR_LIBS"
+ else
+ apr_addto_bugger="$APR_LIBS"
+ for i in $apr_addto_bugger; do
+ apr_addto_duplicate="0"
+ for j in $APRUTIL_LIBS; do
+ if test "x$i" = "x$j"; then
+ apr_addto_duplicate="1"
+ break
+ fi
+ done
+ if test $apr_addto_duplicate = "0"; then
+ test "x$silent" != "xyes" && echo " adding \"$i\" to APRUTIL_LIBS"
+ APRUTIL_LIBS="$APRUTIL_LIBS $i"
+ fi
+ done
+ fi
+
+
+
+
+
+
+
+
+
+if test ! -d ./build; then
+ $mkdir_p build
+fi
+case $host in
+ *-mingw*)
+ sed -e 's/-DAPR_DECLARE_EXPORT/-DAPU_DECLARE_EXPORT/' \
+ -e 's/-DAPR_DECLARE_STATIC/-DAPU_DECLARE_STATIC -DAPR_DECLARE_STATIC/' \
+ < $APR_BUILD_DIR/apr_rules.mk > $abs_builddir/build/rules.mk
+ ;;
+ *)
+ cp $APR_BUILD_DIR/apr_rules.mk $abs_builddir/build/rules.mk
+ ;;
+esac
+
+case "$host_alias" in
+*bsdi* | BSD/OS)
+ # Check whether they've installed GNU make
+ if make --version > /dev/null 2>&1; then
+ INCLUDE_RULES="include $abs_builddir/build/rules.mk"
+ INCLUDE_OUTPUTS="include $abs_srcdir/build-outputs.mk"
+ else
+ INCLUDE_RULES=".include \"$abs_builddir/build/rules.mk\""
+ INCLUDE_OUTPUTS=".include \"$abs_srcdir/build-outputs.mk\""
+ fi
+ ;;
+*)
+ INCLUDE_RULES="include $abs_builddir/build/rules.mk"
+ INCLUDE_OUTPUTS="include $abs_srcdir/build-outputs.mk"
+ ;;
+esac
+
+
+
+for d in include include/private; do
+ test -d $top_builddir/$d || mkdir $top_builddir/$d
+done
+
+ac_config_files="$ac_config_files Makefile export_vars.sh build/pkg/pkginfo apr-util.pc apu-$APRUTIL_MAJOR_VERSION-config:apu-config.in include/private/apu_select_dbm.h include/apr_ldap.h include/apu.h include/apu_want.h"
+
+
+ac_config_commands="$ac_config_commands default"
+
+
+if test -d $srcdir/test; then
+ ac_config_files="$ac_config_files test/Makefile"
+
+fi
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+
+ (set) 2>&1 |
+ case $as_nl`(ac_space=' '; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ # `set' does not quote correctly, so add quotes: double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \.
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;; #(
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+) |
+ sed '
+ /^ac_cv_env_/b end
+ t clear
+ :clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+ if test "x$cache_file" != "x/dev/null"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+ if test ! -f "$cache_file" || test -h "$cache_file"; then
+ cat confcache >"$cache_file"
+ else
+ case $cache_file in #(
+ */* | ?:*)
+ mv -f confcache "$cache_file"$$ &&
+ mv -f "$cache_file"$$ "$cache_file" ;; #(
+ *)
+ mv -f confcache "$cache_file" ;;
+ esac
+ fi
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+ ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
+ # will be set to the directory where LIBOBJS objects are built.
+ as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.69. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration. Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number and configuration settings, then exit
+ --config print configuration, then exit
+ -q, --quiet, --silent
+ do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to the package provider."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.69,
+ with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=?*)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ --*=)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=
+ ac_shift=:
+ ;;
+ *)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+ $as_echo "$ac_cs_version"; exit ;;
+ --config | --confi | --conf | --con | --co | --c )
+ $as_echo "$ac_cs_config"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ '') as_fn_error $? "missing file argument" ;;
+ esac
+ as_fn_append CONFIG_FILES " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --he | --h)
+ # Conflict between --help and --header
+ as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+ --help | --hel | -h )
+ $as_echo "$ac_cs_usage"; exit ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+ *) as_fn_append ac_config_targets " $1"
+ ac_need_defaults=false ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+ shift
+ \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+ CONFIG_SHELL='$SHELL'
+ export CONFIG_SHELL
+ exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+ $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+
+APRUTIL_MAJOR_VERSION=$APRUTIL_MAJOR_VERSION
+
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "include/private/apu_config.h") CONFIG_HEADERS="$CONFIG_HEADERS include/private/apu_config.h" ;;
+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "export_vars.sh") CONFIG_FILES="$CONFIG_FILES export_vars.sh" ;;
+ "build/pkg/pkginfo") CONFIG_FILES="$CONFIG_FILES build/pkg/pkginfo" ;;
+ "apr-util.pc") CONFIG_FILES="$CONFIG_FILES apr-util.pc" ;;
+ "apu-$APRUTIL_MAJOR_VERSION-config") CONFIG_FILES="$CONFIG_FILES apu-$APRUTIL_MAJOR_VERSION-config:apu-config.in" ;;
+ "include/private/apu_select_dbm.h") CONFIG_FILES="$CONFIG_FILES include/private/apu_select_dbm.h" ;;
+ "include/apr_ldap.h") CONFIG_FILES="$CONFIG_FILES include/apr_ldap.h" ;;
+ "include/apu.h") CONFIG_FILES="$CONFIG_FILES include/apu.h" ;;
+ "include/apu_want.h") CONFIG_FILES="$CONFIG_FILES include/apu_want.h" ;;
+ "default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;
+ "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;;
+
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+ esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+ test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+ tmp= ac_tmp=
+ trap 'exit_status=$?
+ : "${ac_tmp:=$tmp}"
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+ trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+ eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+ ac_cs_awk_cr='\\r'
+else
+ ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+ echo "cat >conf$$subs.awk <<_ACEOF" &&
+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+ echo "_ACEOF"
+} >conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ . ./conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+ if test $ac_delim_n = $ac_delim_num; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+ N
+ s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+ for (key in S) S_is_set[key] = 1
+ FS = ""
+
+}
+{
+ line = $ 0
+ nfields = split(line, field, "@")
+ substed = 0
+ len = length(field[1])
+ for (i = 2; i < nfields; i++) {
+ key = field[i]
+ keylen = length(key)
+ if (S_is_set[key]) {
+ value = S[key]
+ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+ len += length(value) + length(field[++i])
+ substed = 1
+ } else
+ len += 1 + keylen
+ }
+
+ print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+ cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
+h
+s///
+s/^/:/
+s/[ ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[ ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[ ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+ ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+ if test -z "$ac_tt"; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any. Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[ ]*#[ ]*define[ ][ ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ for (key in D) D_is_set[key] = 1
+ FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+ line = \$ 0
+ split(line, arg, " ")
+ if (arg[1] == "#") {
+ defundef = arg[2]
+ mac1 = arg[3]
+ } else {
+ defundef = substr(arg[1], 2)
+ mac1 = arg[2]
+ }
+ split(mac1, mac2, "(") #)
+ macro = mac2[1]
+ prefix = substr(line, 1, index(line, defundef) - 1)
+ if (D_is_set[macro]) {
+ # Preserve the white space surrounding the "#".
+ print prefix "define", macro P[macro] D[macro]
+ next
+ } else {
+ # Replace #undef with comments. This is necessary, for example,
+ # in the case of _POSIX_SOURCE, which is predefined and required
+ # on some systems where configure will not decide to define it.
+ if (defundef == "undef") {
+ print "/*", prefix defundef, macro, "*/"
+ next
+ }
+ }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+ :[FH]-) ac_tag=-:-;;
+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+ esac
+ ac_save_IFS=$IFS
+ IFS=:
+ set x $ac_tag
+ IFS=$ac_save_IFS
+ shift
+ ac_file=$1
+ shift
+
+ case $ac_mode in
+ :L) ac_source=$1;;
+ :[FH])
+ ac_file_inputs=
+ for ac_f
+ do
+ case $ac_f in
+ -) ac_f="$ac_tmp/stdin";;
+ *) # Look for the file first in the build tree, then in the source tree
+ # (if the path is not absolute). The absolute path cannot be DOS-style,
+ # because $ac_f cannot contain `:'.
+ test -f "$ac_f" ||
+ case $ac_f in
+ [\\/$]*) false;;
+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+ esac ||
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+ esac
+ case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ as_fn_append ac_file_inputs " '$ac_f'"
+ done
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ configure_input='Generated from '`
+ $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ `' by configure.'
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+ fi
+ # Neutralize special characters interpreted by sed in replacement strings.
+ case $configure_input in #(
+ *\&* | *\|* | *\\* )
+ ac_sed_conf_input=`$as_echo "$configure_input" |
+ sed 's/[\\\\&|]/\\\\&/g'`;; #(
+ *) ac_sed_conf_input=$configure_input;;
+ esac
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+ esac
+ ;;
+ esac
+
+ ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ case $ac_mode in
+ :F)
+ #
+ # CONFIG_FILE
+ #
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+ esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_datarootdir_hack='
+ s&@datadir@&$datadir&g
+ s&@docdir@&$docdir&g
+ s&@infodir@&$infodir&g
+ s&@localedir@&$localedir&g
+ s&@mandir@&$mandir&g
+ s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
+ "$ac_tmp/out"`; test -z "$ac_out"; } &&
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&2;}
+
+ rm -f "$ac_tmp/stdin"
+ case $ac_file in
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+ esac \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+ :H)
+ #
+ # CONFIG_HEADER
+ #
+ if test x"$ac_file" != x-; then
+ {
+ $as_echo "/* $configure_input */" \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+ } >"$ac_tmp/config.h" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ rm -f "$ac_file"
+ mv "$ac_tmp/config.h" "$ac_file" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ fi
+ else
+ $as_echo "/* $configure_input */" \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+ || as_fn_error $? "could not create -" "$LINENO" 5
+ fi
+ ;;
+
+ :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+ esac
+
+
+ case $ac_file$ac_mode in
+ "default":C)
+chmod +x apu-$APRUTIL_MAJOR_VERSION-config
+ ;;
+
+ esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
diff --git a/contrib/apr-util/configure.in b/contrib/apr-util/configure.in
new file mode 100644
index 000000000000..30028102e460
--- /dev/null
+++ b/contrib/apr-util/configure.in
@@ -0,0 +1,292 @@
+dnl
+dnl Process this file with autoconf to produce a configure script
+dnl
+
+AC_PREREQ(2.59)
+AC_INIT(export_vars.sh.in)
+
+AC_CONFIG_HEADER(include/private/apu_config.h)
+AC_CONFIG_AUX_DIR(build)
+
+sinclude(build/apu-conf.m4)
+sinclude(build/apu-iconv.m4)
+sinclude(build/apu-hints.m4)
+sinclude(build/apr_common.m4)
+sinclude(build/find_apr.m4)
+sinclude(build/crypto.m4)
+sinclude(build/dbm.m4)
+sinclude(build/dbd.m4)
+sinclude(build/dso.m4)
+
+dnl Generate ./config.nice for reproducing runs of configure
+dnl
+APR_CONFIG_NICE(config.nice)
+
+dnl # Some initial steps for configuration. We setup the default directory
+dnl # and which files are to be configured.
+
+dnl Absolute source/build directory
+abs_srcdir=`(cd $srcdir && pwd)`
+abs_builddir=`pwd`
+
+if test "$abs_builddir" != "$abs_srcdir"; then
+ USE_VPATH=1
+ APU_CONFIG_LOCATION=build
+else
+ APU_CONFIG_LOCATION=source
+fi
+
+AC_SUBST(APU_CONFIG_LOCATION)
+
+AC_CANONICAL_SYSTEM
+
+AC_PROG_INSTALL
+
+# Use -no-install or -no-fast-install to link the test
+# programs on all platforms but Darwin, where it would cause
+# the programs to be linked against installed versions of
+# libapr instead of those just built.
+case $host in
+ *-apple-darwin*)
+ LT_NO_INSTALL=""
+ ;;
+ *-mingw*)
+ LT_NO_INSTALL="-no-fast-install"
+ ;;
+ *)
+ LT_NO_INSTALL="-no-install"
+ ;;
+esac
+AC_SUBST(LT_NO_INSTALL)
+
+dnl
+dnl compute the top directory of the build
+dnl note: this is needed for LIBTOOL and exporting the bundled Expat
+dnl
+top_builddir="$abs_builddir"
+AC_SUBST(top_builddir)
+AC_SUBST(abs_srcdir)
+AC_SUBST(abs_builddir)
+
+dnl Initialize mkdir -p functionality.
+APR_MKDIR_P_CHECK($abs_srcdir/build/mkdir.sh)
+
+dnl get our version information
+get_version="$abs_srcdir/build/get-version.sh"
+version_hdr="$abs_srcdir/include/apu_version.h"
+APRUTIL_MAJOR_VERSION="`$get_version major $version_hdr APU`"
+APRUTIL_DOTTED_VERSION="`$get_version all $version_hdr APU`"
+
+APU_LTVERSION="-version-info `$get_version libtool $version_hdr APU`"
+
+AC_SUBST(APRUTIL_DOTTED_VERSION)
+AC_SUBST(APRUTIL_MAJOR_VERSION)
+AC_SUBST(APU_LTVERSION)
+
+echo "APR-util Version: ${APRUTIL_DOTTED_VERSION}"
+
+dnl Enable the layout handling code, then reparse the prefix-style
+dnl arguments due to autoconf being a PITA.
+APR_ENABLE_LAYOUT(apr-util)
+APR_PARSE_ARGUMENTS
+
+dnl load os-specific hints for apr-util
+APU_PRELOAD
+
+dnl
+dnl set up the compilation flags and stuff
+dnl
+
+APRUTIL_INCLUDES=""
+APRUTIL_PRIV_INCLUDES="-I$top_builddir/include -I$top_builddir/include/private"
+if test -n "$USE_VPATH"; then
+ APRUTIL_PRIV_INCLUDES="$APRUTIL_PRIV_INCLUDES -I$abs_srcdir/include/private -I$abs_srcdir/include"
+fi
+
+dnl
+dnl Find the APR includes directory and (possibly) the source (base) dir.
+dnl
+APU_FIND_APR
+
+dnl
+dnl even though we use apr_rules.mk for building apr-util, we need
+dnl to grab CC and CPP ahead of time so that apr-util config tests
+dnl use the same compiler as APR; we need the same compiler options
+dnl and feature test macros as well
+dnl
+APR_SETIFNULL(CC, `$apr_config --cc`)
+APR_SETIFNULL(CPP, `$apr_config --cpp`)
+APR_ADDTO(CFLAGS, `$apr_config --cflags`)
+APR_ADDTO(CPPFLAGS, `$apr_config --cppflags`)
+apr_shlibpath_var=`$apr_config --shlib-path-var`
+AC_SUBST(apr_shlibpath_var)
+
+dnl
+dnl Find the APR-ICONV directory.
+dnl
+AC_ARG_WITH(apr-iconv,
+ [ --with-apr-iconv=DIR relative path to apr-iconv source],
+ [ apu_apriconv_dir="$withval"
+ if test "$apu_apriconv_dir" != "no"; then
+ if test -d "$apu_apriconv_dir"; then
+ APR_SUBDIR_CONFIG("$apu_apriconv_dir",
+ [$apache_apr_flags \
+ --prefix=$prefix \
+ --exec-prefix=$exec_prefix \
+ --libdir=$libdir \
+ --includedir=$includedir \
+ --bindir=$bindir \
+ --datadir=$datadir \
+ --with-installbuilddir=$installbuilddir],
+ [--enable-layout=*|\'--enable-layout=*])
+ APRUTIL_EXPORT_LIBS="$abs_srcdir/$apu_apriconv_dir/lib/libapriconv.la \
+ $APRUTIL_EXPORT_LIBS"
+ APRUTIL_INCLUDES="-I$abs_srcdir/$apu_apriconv_dir/include \
+ $APRUTIL_INCLUDES"
+ APR_ICONV_DIR="$apu_apriconv_dir"
+ else
+ APR_ICONV_DIR=""
+ fi
+ else
+ APR_ICONV_DIR=""
+ fi
+ ])
+AC_SUBST(APR_ICONV_DIR)
+
+dnl Find LDAP library
+dnl Determine what DBM backend type to use.
+dnl Find Expat
+dnl Find an iconv library
+APU_CHECK_CRYPTO
+APU_FIND_LDAP
+APU_CHECK_DBM
+APU_CHECK_DBD
+APU_CHECK_DBD_MYSQL
+APU_CHECK_DBD_SQLITE3
+APU_CHECK_DBD_SQLITE2
+APU_CHECK_DBD_ORACLE
+APU_CHECK_DBD_FREETDS
+APU_CHECK_DBD_ODBC
+APU_FIND_EXPAT
+APU_FIND_ICONV
+
+dnl Enable DSO build; must be last:
+APU_CHECK_UTIL_DSO
+
+AC_SEARCH_LIBS(crypt, crypt ufc)
+AC_MSG_CHECKING(if system crypt() function is threadsafe)
+if test "x$apu_crypt_threadsafe" = "x1"; then
+ AC_DEFINE(APU_CRYPT_THREADSAFE, 1, [Define if the system crypt() function is threadsafe])
+ msg="yes"
+else
+ msg="no"
+fi
+AC_MSG_RESULT([$msg])
+
+AC_CHECK_FUNCS(crypt_r, [ crypt_r="1" ], [ crypt_r="0" ])
+if test "$crypt_r" = "1"; then
+ APU_CHECK_CRYPT_R_STYLE
+fi
+
+so_ext=$APR_SO_EXT
+lib_target=$APR_LIB_TARGET
+AC_SUBST(so_ext)
+AC_SUBST(lib_target)
+
+APRUTIL_LIBNAME="aprutil${libsuffix}"
+AC_SUBST(APRUTIL_LIBNAME)
+
+# Set up destination directory for DSOs.
+APU_DSO_LIBDIR="\${libdir}/apr-util-${APRUTIL_MAJOR_VERSION}"
+# Set APU_HAVE_MODULES appropriately for the Makefile
+if test -n "$APU_MODULES"; then
+ APU_HAVE_MODULES=yes
+else
+ APU_HAVE_MODULES=no
+fi
+# Define expanded libdir for apu_config.h
+APR_EXPAND_VAR(abs_dso_libdir, $APU_DSO_LIBDIR)
+AC_DEFINE_UNQUOTED([APU_DSO_LIBDIR], ["$abs_dso_libdir"],
+ [Define to be absolute path to DSO directory])
+AC_SUBST(APU_HAVE_MODULES)
+AC_SUBST(APU_DSO_LIBDIR)
+AC_SUBST(APU_MODULES)
+AC_SUBST(EXTRA_OBJECTS)
+
+dnl
+dnl Prep all the flags and stuff for compilation and export to other builds
+dnl
+APR_ADDTO(APRUTIL_LIBS, [$APR_LIBS])
+
+AC_SUBST(APRUTIL_EXPORT_LIBS)
+AC_SUBST(APRUTIL_PRIV_INCLUDES)
+AC_SUBST(APRUTIL_INCLUDES)
+AC_SUBST(APRUTIL_LDFLAGS)
+AC_SUBST(APRUTIL_LIBS)
+AC_SUBST(LDFLAGS)
+
+dnl copy apr's rules.mk into our build directory.
+if test ! -d ./build; then
+ $mkdir_p build
+fi
+dnl
+dnl MinGW: If APR is shared, APR_DECLARE_EXPORT will be defined in the
+dnl internal CPPFLAGS, but APR-Util needs APU_DECLARE_EXPORT instead.
+dnl If APR is static, APR_DECLARE_STATIC will be defined in the
+dnl internal CPPFLAGS, but APR-Util needs APU_DECLARE_STATIC too.
+dnl
+case $host in
+ *-mingw*)
+ sed -e 's/-DAPR_DECLARE_EXPORT/-DAPU_DECLARE_EXPORT/' \
+ -e 's/-DAPR_DECLARE_STATIC/-DAPU_DECLARE_STATIC -DAPR_DECLARE_STATIC/' \
+ < $APR_BUILD_DIR/apr_rules.mk > $abs_builddir/build/rules.mk
+ ;;
+ *)
+ cp $APR_BUILD_DIR/apr_rules.mk $abs_builddir/build/rules.mk
+ ;;
+esac
+
+dnl
+dnl BSD/OS (BSDi) needs to use a different include syntax in the Makefiles
+dnl
+case "$host_alias" in
+*bsdi* | BSD/OS)
+ # Check whether they've installed GNU make
+ if make --version > /dev/null 2>&1; then
+ INCLUDE_RULES="include $abs_builddir/build/rules.mk"
+ INCLUDE_OUTPUTS="include $abs_srcdir/build-outputs.mk"
+ else
+ INCLUDE_RULES=".include \"$abs_builddir/build/rules.mk\""
+ INCLUDE_OUTPUTS=".include \"$abs_srcdir/build-outputs.mk\""
+ fi
+ ;;
+*)
+ INCLUDE_RULES="include $abs_builddir/build/rules.mk"
+ INCLUDE_OUTPUTS="include $abs_srcdir/build-outputs.mk"
+ ;;
+esac
+AC_SUBST(INCLUDE_RULES)
+AC_SUBST(INCLUDE_OUTPUTS)
+
+for d in include include/private; do
+ test -d $top_builddir/$d || mkdir $top_builddir/$d
+done
+
+AC_CONFIG_FILES([Makefile export_vars.sh
+ build/pkg/pkginfo apr-util.pc
+ apu-$APRUTIL_MAJOR_VERSION-config:apu-config.in
+ include/private/apu_select_dbm.h
+ include/apr_ldap.h
+ include/apu.h include/apu_want.h])
+
+AC_CONFIG_COMMANDS([default], [
+chmod +x apu-$APRUTIL_MAJOR_VERSION-config
+],[
+APRUTIL_MAJOR_VERSION=$APRUTIL_MAJOR_VERSION
+])
+
+if test -d $srcdir/test; then
+ AC_CONFIG_FILES([test/Makefile])
+fi
+
+AC_OUTPUT
diff --git a/contrib/apr-util/crypto/apr_crypto.c b/contrib/apr-util/crypto/apr_crypto.c
new file mode 100644
index 000000000000..fe66582d124f
--- /dev/null
+++ b/contrib/apr-util/crypto/apr_crypto.c
@@ -0,0 +1,529 @@
+/* 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 <ctype.h>
+#include <stdio.h>
+
+#include "apu_config.h"
+#include "apu.h"
+#include "apr_pools.h"
+#include "apr_dso.h"
+#include "apr_strings.h"
+#include "apr_hash.h"
+#include "apr_thread_mutex.h"
+#include "apr_lib.h"
+
+#if APU_HAVE_CRYPTO
+
+#include "apu_internal.h"
+#include "apr_crypto_internal.h"
+#include "apr_crypto.h"
+#include "apu_version.h"
+
+static apr_hash_t *drivers = NULL;
+
+#define ERROR_SIZE 1024
+
+#define CLEANUP_CAST (apr_status_t (*)(void*))
+
+#define APR_TYPEDEF_STRUCT(type, incompletion) \
+struct type { \
+ incompletion \
+ void *unk[]; \
+};
+
+APR_TYPEDEF_STRUCT(apr_crypto_t,
+ apr_pool_t *pool;
+ apr_crypto_driver_t *provider;
+)
+
+APR_TYPEDEF_STRUCT(apr_crypto_key_t,
+ apr_pool_t *pool;
+ apr_crypto_driver_t *provider;
+ const apr_crypto_t *f;
+)
+
+APR_TYPEDEF_STRUCT(apr_crypto_block_t,
+ apr_pool_t *pool;
+ apr_crypto_driver_t *provider;
+ const apr_crypto_t *f;
+)
+
+typedef struct apr_crypto_clear_t {
+ void *buffer;
+ apr_size_t size;
+} apr_crypto_clear_t;
+
+#if !APU_DSO_BUILD
+#define DRIVER_LOAD(name,driver_name,pool,params,rv,result) \
+ { \
+ extern const apr_crypto_driver_t driver_name; \
+ apr_hash_set(drivers,name,APR_HASH_KEY_STRING,&driver_name); \
+ if (driver_name.init) { \
+ rv = driver_name.init(pool, params, result); \
+ } \
+ *driver = &driver_name; \
+ }
+#endif
+
+static apr_status_t apr_crypto_term(void *ptr)
+{
+ /* set drivers to NULL so init can work again */
+ drivers = NULL;
+
+ /* Everything else we need is handled by cleanups registered
+ * when we created mutexes and loaded DSOs
+ */
+ return APR_SUCCESS;
+}
+
+APU_DECLARE(apr_status_t) apr_crypto_init(apr_pool_t *pool)
+{
+ apr_status_t ret = APR_SUCCESS;
+ apr_pool_t *parent;
+
+ if (drivers != NULL) {
+ return APR_SUCCESS;
+ }
+
+ /* Top level pool scope, need process-scope lifetime */
+ for (parent = apr_pool_parent_get(pool);
+ parent && parent != pool;
+ parent = apr_pool_parent_get(pool))
+ pool = parent;
+#if APU_DSO_BUILD
+ /* deprecate in 2.0 - permit implicit initialization */
+ apu_dso_init(pool);
+#endif
+ drivers = apr_hash_make(pool);
+
+ apr_pool_cleanup_register(pool, NULL, apr_crypto_term,
+ apr_pool_cleanup_null);
+
+ return ret;
+}
+
+static apr_status_t crypto_clear(void *ptr)
+{
+ apr_crypto_clear_t *clear = (apr_crypto_clear_t *)ptr;
+
+ memset(clear->buffer, 0, clear->size);
+ clear->buffer = NULL;
+ clear->size = 0;
+
+ return APR_SUCCESS;
+}
+
+APU_DECLARE(apr_status_t) apr_crypto_clear(apr_pool_t *pool,
+ void *buffer, apr_size_t size)
+{
+ apr_crypto_clear_t *clear = apr_palloc(pool, sizeof(apr_crypto_clear_t));
+
+ clear->buffer = buffer;
+ clear->size = size;
+
+ apr_pool_cleanup_register(pool, clear, crypto_clear,
+ apr_pool_cleanup_null);
+
+ return APR_SUCCESS;
+}
+
+APU_DECLARE(apr_status_t) apr_crypto_get_driver(
+ const apr_crypto_driver_t **driver, const char *name,
+ const char *params, const apu_err_t **result, apr_pool_t *pool)
+{
+#if APU_DSO_BUILD
+ char modname[32];
+ char symname[34];
+ apr_dso_handle_t *dso;
+ apr_dso_handle_sym_t symbol;
+#endif
+ apr_status_t rv;
+
+ if (result) {
+ *result = NULL; /* until further notice */
+ }
+
+#if APU_DSO_BUILD
+ rv = apu_dso_mutex_lock();
+ if (rv) {
+ return rv;
+ }
+#endif
+ *driver = apr_hash_get(drivers, name, APR_HASH_KEY_STRING);
+ if (*driver) {
+#if APU_DSO_BUILD
+ apu_dso_mutex_unlock();
+#endif
+ return APR_SUCCESS;
+ }
+
+#if APU_DSO_BUILD
+ /* The driver DSO must have exactly the same lifetime as the
+ * drivers hash table; ignore the passed-in pool */
+ pool = apr_hash_pool_get(drivers);
+
+#if defined(NETWARE)
+ apr_snprintf(modname, sizeof(modname), "crypto%s.nlm", name);
+#elif defined(WIN32) || defined(__CYGWIN__)
+ apr_snprintf(modname, sizeof(modname),
+ "apr_crypto_%s-" APU_STRINGIFY(APU_MAJOR_VERSION) ".dll", name);
+#else
+ apr_snprintf(modname, sizeof(modname),
+ "apr_crypto_%s-" APU_STRINGIFY(APU_MAJOR_VERSION) ".so", name);
+#endif
+ apr_snprintf(symname, sizeof(symname), "apr_crypto_%s_driver", name);
+ rv = apu_dso_load(&dso, &symbol, modname, symname, pool);
+ if (rv == APR_SUCCESS || rv == APR_EINIT) { /* previously loaded?!? */
+ *driver = symbol;
+ name = apr_pstrdup(pool, name);
+ apr_hash_set(drivers, name, APR_HASH_KEY_STRING, *driver);
+ rv = APR_SUCCESS;
+ if ((*driver)->init) {
+ rv = (*driver)->init(pool, params, result);
+ }
+ }
+ apu_dso_mutex_unlock();
+
+ if (APR_SUCCESS != rv && result && !*result) {
+ char *buffer = apr_pcalloc(pool, ERROR_SIZE);
+ apu_err_t *err = apr_pcalloc(pool, sizeof(apu_err_t));
+ if (err && buffer) {
+ apr_dso_error(dso, buffer, ERROR_SIZE - 1);
+ err->msg = buffer;
+ err->reason = apr_pstrdup(pool, modname);
+ *result = err;
+ }
+ }
+
+#else /* not builtin and !APR_HAS_DSO => not implemented */
+ rv = APR_ENOTIMPL;
+
+ /* Load statically-linked drivers: */
+#if APU_HAVE_OPENSSL
+ if (name[0] == 'o' && !strcmp(name, "openssl")) {
+ DRIVER_LOAD("openssl", apr_crypto_openssl_driver, pool, params, rv, result);
+ }
+#endif
+#if APU_HAVE_NSS
+ if (name[0] == 'n' && !strcmp(name, "nss")) {
+ DRIVER_LOAD("nss", apr_crypto_nss_driver, pool, params, rv, result);
+ }
+#endif
+#if APU_HAVE_MSCAPI
+ if (name[0] == 'm' && !strcmp(name, "mscapi")) {
+ DRIVER_LOAD("mscapi", apr_crypto_mscapi_driver, pool, params, rv, result);
+ }
+#endif
+#if APU_HAVE_MSCNG
+ if (name[0] == 'm' && !strcmp(name, "mscng")) {
+ DRIVER_LOAD("mscng", apr_crypto_mscng_driver, pool, params, rv, result);
+ }
+#endif
+
+#endif
+
+ return rv;
+}
+
+/**
+ * @brief Return the name of the driver.
+ *
+ * @param driver - The driver in use.
+ * @return The name of the driver.
+ */
+APU_DECLARE(const char *)apr_crypto_driver_name (
+ const apr_crypto_driver_t *driver)
+{
+ return driver->name;
+}
+
+/**
+ * @brief Get the result of the last operation on a context. If the result
+ * is NULL, the operation was successful.
+ * @param result - the result structure
+ * @param f - context pointer
+ * @return APR_SUCCESS for success
+ */
+APU_DECLARE(apr_status_t) apr_crypto_error(const apu_err_t **result,
+ const apr_crypto_t *f)
+{
+ return f->provider->error(result, f);
+}
+
+/**
+ * @brief Create a context for supporting encryption. Keys, certificates,
+ * algorithms and other parameters will be set per context. More than
+ * one context can be created at one time. A cleanup will be automatically
+ * registered with the given pool to guarantee a graceful shutdown.
+ * @param f - context pointer will be written here
+ * @param driver - driver to use
+ * @param params - array of key parameters
+ * @param pool - process pool
+ * @return APR_ENOENGINE when the engine specified does not exist. APR_EINITENGINE
+ * if the engine cannot be initialised.
+ * @remarks NSS: currently no params are supported.
+ * @remarks OpenSSL: the params can have "engine" as a key, followed by an equal
+ * sign and a value.
+ */
+APU_DECLARE(apr_status_t) apr_crypto_make(apr_crypto_t **f,
+ const apr_crypto_driver_t *driver, const char *params, apr_pool_t *pool)
+{
+ return driver->make(f, driver, params, pool);
+}
+
+/**
+ * @brief Get a hash table of key types, keyed by the name of the type against
+ * an integer pointer constant.
+ *
+ * @param types - hashtable of key types keyed to constants.
+ * @param f - encryption context
+ * @return APR_SUCCESS for success
+ */
+APU_DECLARE(apr_status_t) apr_crypto_get_block_key_types(apr_hash_t **types,
+ const apr_crypto_t *f)
+{
+ return f->provider->get_block_key_types(types, f);
+}
+
+/**
+ * @brief Get a hash table of key modes, keyed by the name of the mode against
+ * an integer pointer constant.
+ *
+ * @param modes - hashtable of key modes keyed to constants.
+ * @param f - encryption context
+ * @return APR_SUCCESS for success
+ */
+APU_DECLARE(apr_status_t) apr_crypto_get_block_key_modes(apr_hash_t **modes,
+ const apr_crypto_t *f)
+{
+ return f->provider->get_block_key_modes(modes, f);
+}
+
+/**
+ * @brief Create a key from the given passphrase. By default, the PBKDF2
+ * algorithm is used to generate the key from the passphrase. It is expected
+ * that the same pass phrase will generate the same key, regardless of the
+ * backend crypto platform used. The key is cleaned up when the context
+ * is cleaned, and may be reused with multiple encryption or decryption
+ * operations.
+ * @note If *key is NULL, a apr_crypto_key_t will be created from a pool. If
+ * *key is not NULL, *key must point at a previously created structure.
+ * @param key The key returned, see note.
+ * @param ivSize The size of the initialisation vector will be returned, based
+ * on whether an IV is relevant for this type of crypto.
+ * @param pass The passphrase to use.
+ * @param passLen The passphrase length in bytes
+ * @param salt The salt to use.
+ * @param saltLen The salt length in bytes
+ * @param type 3DES_192, AES_128, AES_192, AES_256.
+ * @param mode Electronic Code Book / Cipher Block Chaining.
+ * @param doPad Pad if necessary.
+ * @param iterations Number of iterations to use in algorithm
+ * @param f The context to use.
+ * @param p The pool to use.
+ * @return Returns APR_ENOKEY if the pass phrase is missing or empty, or if a backend
+ * error occurred while generating the key. APR_ENOCIPHER if the type or mode
+ * is not supported by the particular backend. APR_EKEYTYPE if the key type is
+ * not known. APR_EPADDING if padding was requested but is not supported.
+ * APR_ENOTIMPL if not implemented.
+ */
+APU_DECLARE(apr_status_t) apr_crypto_passphrase(apr_crypto_key_t **key,
+ apr_size_t *ivSize, const char *pass, apr_size_t passLen,
+ const unsigned char * salt, apr_size_t saltLen,
+ const apr_crypto_block_key_type_e type,
+ const apr_crypto_block_key_mode_e mode, const int doPad,
+ const int iterations, const apr_crypto_t *f, apr_pool_t *p)
+{
+ return f->provider->passphrase(key, ivSize, pass, passLen, salt, saltLen,
+ type, mode, doPad, iterations, f, p);
+}
+
+/**
+ * @brief Initialise a context for encrypting arbitrary data using the given key.
+ * @note If *ctx is NULL, a apr_crypto_block_t will be created from a pool. If
+ * *ctx is not NULL, *ctx must point at a previously created structure.
+ * @param ctx The block context returned, see note.
+ * @param iv Optional initialisation vector. If the buffer pointed to is NULL,
+ * an IV will be created at random, in space allocated from the pool.
+ * If the buffer pointed to is not NULL, the IV in the buffer will be
+ * used.
+ * @param key The key structure to use.
+ * @param blockSize The block size of the cipher.
+ * @param p The pool to use.
+ * @return Returns APR_ENOIV if an initialisation vector is required but not specified.
+ * Returns APR_EINIT if the backend failed to initialise the context. Returns
+ * APR_ENOTIMPL if not implemented.
+ */
+APU_DECLARE(apr_status_t) apr_crypto_block_encrypt_init(
+ apr_crypto_block_t **ctx, const unsigned char **iv,
+ const apr_crypto_key_t *key, apr_size_t *blockSize, apr_pool_t *p)
+{
+ return key->provider->block_encrypt_init(ctx, iv, key, blockSize, p);
+}
+
+/**
+ * @brief Encrypt data provided by in, write it to out.
+ * @note The number of bytes written will be written to outlen. If
+ * out is NULL, outlen will contain the maximum size of the
+ * buffer needed to hold the data, including any data
+ * generated by apr_crypto_block_encrypt_finish below. If *out points
+ * to NULL, a buffer sufficiently large will be created from
+ * the pool provided. If *out points to a not-NULL value, this
+ * value will be used as a buffer instead.
+ * @param out Address of a buffer to which data will be written,
+ * see note.
+ * @param outlen Length of the output will be written here.
+ * @param in Address of the buffer to read.
+ * @param inlen Length of the buffer to read.
+ * @param ctx The block context to use.
+ * @return APR_ECRYPT if an error occurred. Returns APR_ENOTIMPL if
+ * not implemented.
+ */
+APU_DECLARE(apr_status_t) apr_crypto_block_encrypt(unsigned char **out,
+ apr_size_t *outlen, const unsigned char *in, apr_size_t inlen,
+ apr_crypto_block_t *ctx)
+{
+ return ctx->provider->block_encrypt(out, outlen, in, inlen, ctx);
+}
+
+/**
+ * @brief Encrypt final data block, write it to out.
+ * @note If necessary the final block will be written out after being
+ * padded. Typically the final block will be written to the
+ * same buffer used by apr_crypto_block_encrypt, offset by the
+ * number of bytes returned as actually written by the
+ * apr_crypto_block_encrypt() call. After this call, the context
+ * is cleaned and can be reused by apr_crypto_block_encrypt_init().
+ * @param out Address of a buffer to which data will be written. This
+ * buffer must already exist, and is usually the same
+ * buffer used by apr_evp_crypt(). See note.
+ * @param outlen Length of the output will be written here.
+ * @param ctx The block context to use.
+ * @return APR_ECRYPT if an error occurred.
+ * @return APR_EPADDING if padding was enabled and the block was incorrectly
+ * formatted.
+ * @return APR_ENOTIMPL if not implemented.
+ */
+APU_DECLARE(apr_status_t) apr_crypto_block_encrypt_finish(unsigned char *out,
+ apr_size_t *outlen, apr_crypto_block_t *ctx)
+{
+ return ctx->provider->block_encrypt_finish(out, outlen, ctx);
+}
+
+/**
+ * @brief Initialise a context for decrypting arbitrary data using the given key.
+ * @note If *ctx is NULL, a apr_crypto_block_t will be created from a pool. If
+ * *ctx is not NULL, *ctx must point at a previously created structure.
+ * @param ctx The block context returned, see note.
+ * @param blockSize The block size of the cipher.
+ * @param iv Optional initialisation vector.
+ * @param key The key structure to use.
+ * @param p The pool to use.
+ * @return Returns APR_ENOIV if an initialisation vector is required but not specified.
+ * Returns APR_EINIT if the backend failed to initialise the context. Returns
+ * APR_ENOTIMPL if not implemented.
+ */
+APU_DECLARE(apr_status_t) apr_crypto_block_decrypt_init(
+ apr_crypto_block_t **ctx, apr_size_t *blockSize,
+ const unsigned char *iv, const apr_crypto_key_t *key, apr_pool_t *p)
+{
+ return key->provider->block_decrypt_init(ctx, blockSize, iv, key, p);
+}
+
+/**
+ * @brief Decrypt data provided by in, write it to out.
+ * @note The number of bytes written will be written to outlen. If
+ * out is NULL, outlen will contain the maximum size of the
+ * buffer needed to hold the data, including any data
+ * generated by apr_crypto_block_decrypt_finish below. If *out points
+ * to NULL, a buffer sufficiently large will be created from
+ * the pool provided. If *out points to a not-NULL value, this
+ * value will be used as a buffer instead.
+ * @param out Address of a buffer to which data will be written,
+ * see note.
+ * @param outlen Length of the output will be written here.
+ * @param in Address of the buffer to read.
+ * @param inlen Length of the buffer to read.
+ * @param ctx The block context to use.
+ * @return APR_ECRYPT if an error occurred. Returns APR_ENOTIMPL if
+ * not implemented.
+ */
+APU_DECLARE(apr_status_t) apr_crypto_block_decrypt(unsigned char **out,
+ apr_size_t *outlen, const unsigned char *in, apr_size_t inlen,
+ apr_crypto_block_t *ctx)
+{
+ return ctx->provider->block_decrypt(out, outlen, in, inlen, ctx);
+}
+
+/**
+ * @brief Decrypt final data block, write it to out.
+ * @note If necessary the final block will be written out after being
+ * padded. Typically the final block will be written to the
+ * same buffer used by apr_crypto_block_decrypt, offset by the
+ * number of bytes returned as actually written by the
+ * apr_crypto_block_decrypt() call. After this call, the context
+ * is cleaned and can be reused by apr_crypto_block_decrypt_init().
+ * @param out Address of a buffer to which data will be written. This
+ * buffer must already exist, and is usually the same
+ * buffer used by apr_evp_crypt(). See note.
+ * @param outlen Length of the output will be written here.
+ * @param ctx The block context to use.
+ * @return APR_ECRYPT if an error occurred.
+ * @return APR_EPADDING if padding was enabled and the block was incorrectly
+ * formatted.
+ * @return APR_ENOTIMPL if not implemented.
+ */
+APU_DECLARE(apr_status_t) apr_crypto_block_decrypt_finish(unsigned char *out,
+ apr_size_t *outlen, apr_crypto_block_t *ctx)
+{
+ return ctx->provider->block_decrypt_finish(out, outlen, ctx);
+}
+
+/**
+ * @brief Clean encryption / decryption context.
+ * @note After cleanup, a context is free to be reused if necessary.
+ * @param ctx The block context to use.
+ * @return Returns APR_ENOTIMPL if not supported.
+ */
+APU_DECLARE(apr_status_t) apr_crypto_block_cleanup(apr_crypto_block_t *ctx)
+{
+ return ctx->provider->block_cleanup(ctx);
+}
+
+/**
+ * @brief Clean encryption / decryption context.
+ * @note After cleanup, a context is free to be reused if necessary.
+ * @param f The context to use.
+ * @return Returns APR_ENOTIMPL if not supported.
+ */
+APU_DECLARE(apr_status_t) apr_crypto_cleanup(apr_crypto_t *f)
+{
+ return f->provider->cleanup(f);
+}
+
+/**
+ * @brief Shutdown the crypto library.
+ * @note After shutdown, it is expected that the init function can be called again.
+ * @param driver - driver to use
+ * @return Returns APR_ENOTIMPL if not supported.
+ */
+APU_DECLARE(apr_status_t) apr_crypto_shutdown(const apr_crypto_driver_t *driver)
+{
+ return driver->shutdown();
+}
+
+#endif /* APU_HAVE_CRYPTO */
diff --git a/contrib/apr-util/crypto/apr_crypto_nss.c b/contrib/apr-util/crypto/apr_crypto_nss.c
new file mode 100644
index 000000000000..b345953de73d
--- /dev/null
+++ b/contrib/apr-util/crypto/apr_crypto_nss.c
@@ -0,0 +1,870 @@
+/* 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_lib.h"
+#include "apu.h"
+#include "apu_config.h"
+#include "apu_errno.h"
+
+#include <ctype.h>
+#include <stdlib.h>
+
+#include "apr_strings.h"
+#include "apr_time.h"
+#include "apr_buckets.h"
+
+#include "apr_crypto_internal.h"
+
+#if APU_HAVE_CRYPTO
+
+#include <prerror.h>
+
+#ifdef HAVE_NSS_NSS_H
+#include <nss/nss.h>
+#endif
+#ifdef HAVE_NSS_H
+#include <nss.h>
+#endif
+
+#ifdef HAVE_NSS_PK11PUB_H
+#include <nss/pk11pub.h>
+#endif
+#ifdef HAVE_PK11PUB_H
+#include <pk11pub.h>
+#endif
+
+struct apr_crypto_t {
+ apr_pool_t *pool;
+ const apr_crypto_driver_t *provider;
+ apu_err_t *result;
+ apr_array_header_t *keys;
+ apr_crypto_config_t *config;
+ apr_hash_t *types;
+ apr_hash_t *modes;
+};
+
+struct apr_crypto_config_t {
+ void *opaque;
+};
+
+struct apr_crypto_key_t {
+ apr_pool_t *pool;
+ const apr_crypto_driver_t *provider;
+ const apr_crypto_t *f;
+ CK_MECHANISM_TYPE cipherMech;
+ SECOidTag cipherOid;
+ PK11SymKey *symKey;
+ int ivSize;
+};
+
+struct apr_crypto_block_t {
+ apr_pool_t *pool;
+ const apr_crypto_driver_t *provider;
+ const apr_crypto_t *f;
+ PK11Context *ctx;
+ apr_crypto_key_t *key;
+ int blockSize;
+};
+
+static int key_3des_192 = APR_KEY_3DES_192;
+static int key_aes_128 = APR_KEY_AES_128;
+static int key_aes_192 = APR_KEY_AES_192;
+static int key_aes_256 = APR_KEY_AES_256;
+
+static int mode_ecb = APR_MODE_ECB;
+static int mode_cbc = APR_MODE_CBC;
+
+/**
+ * Fetch the most recent error from this driver.
+ */
+static apr_status_t crypto_error(const apu_err_t **result,
+ const apr_crypto_t *f)
+{
+ *result = f->result;
+ return APR_SUCCESS;
+}
+
+/**
+ * Shutdown the crypto library and release resources.
+ *
+ * It is safe to shut down twice.
+ */
+static apr_status_t crypto_shutdown(void)
+{
+ if (NSS_IsInitialized()) {
+ SECStatus s = NSS_Shutdown();
+ if (s != SECSuccess) {
+ return APR_EINIT;
+ }
+ }
+ return APR_SUCCESS;
+}
+
+static apr_status_t crypto_shutdown_helper(void *data)
+{
+ return crypto_shutdown();
+}
+
+/**
+ * Initialise the crypto library and perform one time initialisation.
+ */
+static apr_status_t crypto_init(apr_pool_t *pool, const char *params,
+ const apu_err_t **result)
+{
+ SECStatus s;
+ const char *dir = NULL;
+ const char *keyPrefix = NULL;
+ const char *certPrefix = NULL;
+ const char *secmod = NULL;
+ int noinit = 0;
+ PRUint32 flags = 0;
+
+ struct {
+ const char *field;
+ const char *value;
+ int set;
+ } fields[] = {
+ { "dir", NULL, 0 },
+ { "key3", NULL, 0 },
+ { "cert7", NULL, 0 },
+ { "secmod", NULL, 0 },
+ { "noinit", NULL, 0 },
+ { NULL, NULL, 0 }
+ };
+ const char *ptr;
+ size_t klen;
+ char **elts = NULL;
+ char *elt;
+ int i = 0, j;
+ apr_status_t status;
+
+ if (params) {
+ if (APR_SUCCESS != (status = apr_tokenize_to_argv(params, &elts, pool))) {
+ return status;
+ }
+ while ((elt = elts[i])) {
+ ptr = strchr(elt, '=');
+ if (ptr) {
+ for (klen = ptr - elt; klen && apr_isspace(elt[klen - 1]); --klen)
+ ;
+ ptr++;
+ }
+ else {
+ for (klen = strlen(elt); klen && apr_isspace(elt[klen - 1]); --klen)
+ ;
+ }
+ elt[klen] = 0;
+
+ for (j = 0; fields[j].field != NULL; ++j) {
+ if (klen && !strcasecmp(fields[j].field, elt)) {
+ fields[j].set = 1;
+ if (ptr) {
+ fields[j].value = ptr;
+ }
+ break;
+ }
+ }
+
+ i++;
+ }
+ dir = fields[0].value;
+ keyPrefix = fields[1].value;
+ certPrefix = fields[2].value;
+ secmod = fields[3].value;
+ noinit = fields[4].set;
+ }
+
+ /* if we've been asked to bypass, do so here */
+ if (noinit) {
+ return APR_SUCCESS;
+ }
+
+ /* sanity check - we can only initialise NSS once */
+ if (NSS_IsInitialized()) {
+ return APR_EREINIT;
+ }
+
+ apr_pool_cleanup_register(pool, pool, crypto_shutdown_helper,
+ apr_pool_cleanup_null);
+
+ if (keyPrefix || certPrefix || secmod) {
+ s = NSS_Initialize(dir, certPrefix, keyPrefix, secmod, flags);
+ }
+ else if (dir) {
+ s = NSS_InitReadWrite(dir);
+ }
+ else {
+ s = NSS_NoDB_Init(NULL);
+ }
+ if (s != SECSuccess) {
+ if (result) {
+ apu_err_t *err = apr_pcalloc(pool, sizeof(apu_err_t));
+ err->rc = PR_GetError();
+ err->msg = PR_ErrorToName(s);
+ err->reason = "Error during 'nss' initialisation";
+ *result = err;
+ }
+ return APR_ECRYPT;
+ }
+
+ return APR_SUCCESS;
+
+}
+
+/**
+ * @brief Clean encryption / decryption context.
+ * @note After cleanup, a context is free to be reused if necessary.
+ * @param f The context to use.
+ * @return Returns APR_ENOTIMPL if not supported.
+ */
+static apr_status_t crypto_block_cleanup(apr_crypto_block_t *block)
+{
+
+ if (block->ctx) {
+ PK11_DestroyContext(block->ctx, PR_TRUE);
+ block->ctx = NULL;
+ }
+
+ return APR_SUCCESS;
+
+}
+
+static apr_status_t crypto_block_cleanup_helper(void *data)
+{
+ apr_crypto_block_t *block = (apr_crypto_block_t *) data;
+ return crypto_block_cleanup(block);
+}
+
+/**
+ * @brief Clean encryption / decryption context.
+ * @note After cleanup, a context is free to be reused if necessary.
+ * @param f The context to use.
+ * @return Returns APR_ENOTIMPL if not supported.
+ */
+static apr_status_t crypto_cleanup(apr_crypto_t *f)
+{
+ apr_crypto_key_t *key;
+ if (f->keys) {
+ while ((key = apr_array_pop(f->keys))) {
+ if (key->symKey) {
+ PK11_FreeSymKey(key->symKey);
+ key->symKey = NULL;
+ }
+ }
+ }
+ return APR_SUCCESS;
+}
+
+static apr_status_t crypto_cleanup_helper(void *data)
+{
+ apr_crypto_t *f = (apr_crypto_t *) data;
+ return crypto_cleanup(f);
+}
+
+/**
+ * @brief Create a context for supporting encryption. Keys, certificates,
+ * algorithms and other parameters will be set per context. More than
+ * one context can be created at one time. A cleanup will be automatically
+ * registered with the given pool to guarantee a graceful shutdown.
+ * @param f - context pointer will be written here
+ * @param provider - provider to use
+ * @param params - parameter string
+ * @param pool - process pool
+ * @return APR_ENOENGINE when the engine specified does not exist. APR_EINITENGINE
+ * if the engine cannot be initialised.
+ */
+static apr_status_t crypto_make(apr_crypto_t **ff,
+ const apr_crypto_driver_t *provider, const char *params,
+ apr_pool_t *pool)
+{
+ apr_crypto_config_t *config = NULL;
+ apr_crypto_t *f;
+
+ 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));
+ if (!config) {
+ return APR_ENOMEM;
+ }
+ f->result = apr_pcalloc(pool, sizeof(apu_err_t));
+ if (!f->result) {
+ return APR_ENOMEM;
+ }
+ f->keys = apr_array_make(pool, 10, sizeof(apr_crypto_key_t));
+
+ f->types = apr_hash_make(pool);
+ if (!f->types) {
+ return APR_ENOMEM;
+ }
+ apr_hash_set(f->types, "3des192", APR_HASH_KEY_STRING, &(key_3des_192));
+ apr_hash_set(f->types, "aes128", APR_HASH_KEY_STRING, &(key_aes_128));
+ apr_hash_set(f->types, "aes192", APR_HASH_KEY_STRING, &(key_aes_192));
+ apr_hash_set(f->types, "aes256", APR_HASH_KEY_STRING, &(key_aes_256));
+
+ f->modes = apr_hash_make(pool);
+ if (!f->modes) {
+ return APR_ENOMEM;
+ }
+ apr_hash_set(f->modes, "ecb", APR_HASH_KEY_STRING, &(mode_ecb));
+ apr_hash_set(f->modes, "cbc", APR_HASH_KEY_STRING, &(mode_cbc));
+
+ apr_pool_cleanup_register(pool, f, crypto_cleanup_helper,
+ apr_pool_cleanup_null);
+
+ return APR_SUCCESS;
+
+}
+
+/**
+ * @brief Get a hash table of key types, keyed by the name of the type against
+ * an integer pointer constant.
+ *
+ * @param types - hashtable of key types keyed to constants.
+ * @param f - encryption context
+ * @return APR_SUCCESS for success
+ */
+static apr_status_t crypto_get_block_key_types(apr_hash_t **types,
+ const apr_crypto_t *f)
+{
+ *types = f->types;
+ return APR_SUCCESS;
+}
+
+/**
+ * @brief Get a hash table of key modes, keyed by the name of the mode against
+ * an integer pointer constant.
+ *
+ * @param modes - hashtable of key modes keyed to constants.
+ * @param f - encryption context
+ * @return APR_SUCCESS for success
+ */
+static apr_status_t crypto_get_block_key_modes(apr_hash_t **modes,
+ const apr_crypto_t *f)
+{
+ *modes = f->modes;
+ return APR_SUCCESS;
+}
+
+/**
+ * @brief Create a key from the given passphrase. By default, the PBKDF2
+ * algorithm is used to generate the key from the passphrase. It is expected
+ * that the same pass phrase will generate the same key, regardless of the
+ * backend crypto platform used. The key is cleaned up when the context
+ * is cleaned, and may be reused with multiple encryption or decryption
+ * operations.
+ * @note If *key is NULL, a apr_crypto_key_t will be created from a pool. If
+ * *key is not NULL, *key must point at a previously created structure.
+ * @param key The key returned, see note.
+ * @param ivSize The size of the initialisation vector will be returned, based
+ * on whether an IV is relevant for this type of crypto.
+ * @param pass The passphrase to use.
+ * @param passLen The passphrase length in bytes
+ * @param salt The salt to use.
+ * @param saltLen The salt length in bytes
+ * @param type 3DES_192, AES_128, AES_192, AES_256.
+ * @param mode Electronic Code Book / Cipher Block Chaining.
+ * @param doPad Pad if necessary.
+ * @param iterations Iteration count
+ * @param f The context to use.
+ * @param p The pool to use.
+ * @return Returns APR_ENOKEY if the pass phrase is missing or empty, or if a backend
+ * error occurred while generating the key. APR_ENOCIPHER if the type or mode
+ * is not supported by the particular backend. APR_EKEYTYPE if the key type is
+ * not known. APR_EPADDING if padding was requested but is not supported.
+ * APR_ENOTIMPL if not implemented.
+ */
+static apr_status_t crypto_passphrase(apr_crypto_key_t **k, apr_size_t *ivSize,
+ const char *pass, apr_size_t passLen, const unsigned char * salt,
+ apr_size_t saltLen, const apr_crypto_block_key_type_e type,
+ const apr_crypto_block_key_mode_e mode, const int doPad,
+ const int iterations, const apr_crypto_t *f, apr_pool_t *p)
+{
+ apr_status_t rv = APR_SUCCESS;
+ PK11SlotInfo * slot;
+ SECItem passItem;
+ SECItem saltItem;
+ SECAlgorithmID *algid;
+ void *wincx = NULL; /* what is wincx? */
+ apr_crypto_key_t *key = *k;
+
+ if (!key) {
+ *k = key = apr_array_push(f->keys);
+ }
+ if (!key) {
+ return APR_ENOMEM;
+ }
+
+ key->f = f;
+ key->provider = f->provider;
+
+ /* decide on what cipher mechanism we will be using */
+ switch (type) {
+
+ case (APR_KEY_3DES_192):
+ if (APR_MODE_CBC == mode) {
+ key->cipherOid = SEC_OID_DES_EDE3_CBC;
+ }
+ else if (APR_MODE_ECB == mode) {
+ return APR_ENOCIPHER;
+ /* No OID for CKM_DES3_ECB; */
+ }
+ break;
+ case (APR_KEY_AES_128):
+ if (APR_MODE_CBC == mode) {
+ key->cipherOid = SEC_OID_AES_128_CBC;
+ }
+ else {
+ key->cipherOid = SEC_OID_AES_128_ECB;
+ }
+ break;
+ case (APR_KEY_AES_192):
+ if (APR_MODE_CBC == mode) {
+ key->cipherOid = SEC_OID_AES_192_CBC;
+ }
+ else {
+ key->cipherOid = SEC_OID_AES_192_ECB;
+ }
+ break;
+ case (APR_KEY_AES_256):
+ if (APR_MODE_CBC == mode) {
+ key->cipherOid = SEC_OID_AES_256_CBC;
+ }
+ else {
+ key->cipherOid = SEC_OID_AES_256_ECB;
+ }
+ break;
+ default:
+ /* unknown key type, give up */
+ return APR_EKEYTYPE;
+ }
+
+ /* AES_128_CBC --> CKM_AES_CBC --> CKM_AES_CBC_PAD */
+ key->cipherMech = PK11_AlgtagToMechanism(key->cipherOid);
+ if (key->cipherMech == CKM_INVALID_MECHANISM) {
+ return APR_ENOCIPHER;
+ }
+ if (doPad) {
+ CK_MECHANISM_TYPE paddedMech;
+ paddedMech = PK11_GetPadMechanism(key->cipherMech);
+ if (CKM_INVALID_MECHANISM == paddedMech || key->cipherMech
+ == paddedMech) {
+ return APR_EPADDING;
+ }
+ key->cipherMech = paddedMech;
+ }
+
+ /* Turn the raw passphrase and salt into SECItems */
+ passItem.data = (unsigned char*) pass;
+ passItem.len = passLen;
+ saltItem.data = (unsigned char*) salt;
+ saltItem.len = saltLen;
+
+ /* generate the key */
+ /* pbeAlg and cipherAlg are the same. NSS decides the keylength. */
+ algid = PK11_CreatePBEV2AlgorithmID(key->cipherOid, key->cipherOid,
+ SEC_OID_HMAC_SHA1, 0, iterations, &saltItem);
+ if (algid) {
+ slot = PK11_GetBestSlot(key->cipherMech, wincx);
+ if (slot) {
+ key->symKey = PK11_PBEKeyGen(slot, algid, &passItem, PR_FALSE,
+ wincx);
+ PK11_FreeSlot(slot);
+ }
+ SECOID_DestroyAlgorithmID(algid, PR_TRUE);
+ }
+
+ /* sanity check? */
+ if (!key->symKey) {
+ PRErrorCode perr = PORT_GetError();
+ if (perr) {
+ f->result->rc = perr;
+ f->result->msg = PR_ErrorToName(perr);
+ rv = APR_ENOKEY;
+ }
+ }
+
+ key->ivSize = PK11_GetIVLength(key->cipherMech);
+ if (ivSize) {
+ *ivSize = key->ivSize;
+ }
+
+ return rv;
+}
+
+/**
+ * @brief Initialise a context for encrypting arbitrary data using the given key.
+ * @note If *ctx is NULL, a apr_crypto_block_t will be created from a pool. If
+ * *ctx is not NULL, *ctx must point at a previously created structure.
+ * @param ctx The block context returned, see note.
+ * @param iv Optional initialisation vector. If the buffer pointed to is NULL,
+ * an IV will be created at random, in space allocated from the pool.
+ * If the buffer pointed to is not NULL, the IV in the buffer will be
+ * used.
+ * @param key The key structure.
+ * @param blockSize The block size of the cipher.
+ * @param p The pool to use.
+ * @return Returns APR_ENOIV if an initialisation vector is required but not specified.
+ * Returns APR_EINIT if the backend failed to initialise the context. Returns
+ * APR_ENOTIMPL if not implemented.
+ */
+static apr_status_t crypto_block_encrypt_init(apr_crypto_block_t **ctx,
+ const unsigned char **iv, const apr_crypto_key_t *key,
+ apr_size_t *blockSize, apr_pool_t *p)
+{
+ PRErrorCode perr;
+ SECItem * secParam;
+ SECItem ivItem;
+ unsigned char * usedIv;
+ apr_crypto_block_t *block = *ctx;
+ if (!block) {
+ *ctx = block = apr_pcalloc(p, sizeof(apr_crypto_block_t));
+ }
+ if (!block) {
+ return APR_ENOMEM;
+ }
+ block->f = key->f;
+ block->pool = p;
+ block->provider = key->provider;
+
+ apr_pool_cleanup_register(p, block, crypto_block_cleanup_helper,
+ apr_pool_cleanup_null);
+
+ if (key->ivSize) {
+ if (iv == NULL) {
+ return APR_ENOIV;
+ }
+ if (*iv == NULL) {
+ SECStatus s;
+ usedIv = apr_pcalloc(p, key->ivSize);
+ if (!usedIv) {
+ return APR_ENOMEM;
+ }
+ apr_crypto_clear(p, usedIv, key->ivSize);
+ s = PK11_GenerateRandom(usedIv, key->ivSize);
+ if (s != SECSuccess) {
+ return APR_ENOIV;
+ }
+ *iv = usedIv;
+ }
+ else {
+ usedIv = (unsigned char *) *iv;
+ }
+ ivItem.data = usedIv;
+ ivItem.len = key->ivSize;
+ secParam = PK11_ParamFromIV(key->cipherMech, &ivItem);
+ }
+ else {
+ secParam = PK11_GenerateNewParam(key->cipherMech, key->symKey);
+ }
+ block->blockSize = PK11_GetBlockSize(key->cipherMech, secParam);
+ block->ctx = PK11_CreateContextBySymKey(key->cipherMech, CKA_ENCRYPT,
+ key->symKey, secParam);
+
+ /* did an error occur? */
+ perr = PORT_GetError();
+ if (perr || !block->ctx) {
+ key->f->result->rc = perr;
+ key->f->result->msg = PR_ErrorToName(perr);
+ return APR_EINIT;
+ }
+
+ if (blockSize) {
+ *blockSize = PK11_GetBlockSize(key->cipherMech, secParam);
+ }
+
+ return APR_SUCCESS;
+
+}
+
+/**
+ * @brief Encrypt data provided by in, write it to out.
+ * @note The number of bytes written will be written to outlen. If
+ * out is NULL, outlen will contain the maximum size of the
+ * buffer needed to hold the data, including any data
+ * generated by apr_crypto_block_encrypt_finish below. If *out points
+ * to NULL, a buffer sufficiently large will be created from
+ * the pool provided. If *out points to a not-NULL value, this
+ * value will be used as a buffer instead.
+ * @param out Address of a buffer to which data will be written,
+ * see note.
+ * @param outlen Length of the output will be written here.
+ * @param in Address of the buffer to read.
+ * @param inlen Length of the buffer to read.
+ * @param ctx The block context to use.
+ * @return APR_ECRYPT if an error occurred. Returns APR_ENOTIMPL if
+ * not implemented.
+ */
+static apr_status_t crypto_block_encrypt(unsigned char **out,
+ apr_size_t *outlen, const unsigned char *in, apr_size_t inlen,
+ apr_crypto_block_t *block)
+{
+
+ unsigned char *buffer;
+ int outl = (int) *outlen;
+ SECStatus s;
+ if (!out) {
+ *outlen = inlen + block->blockSize;
+ return APR_SUCCESS;
+ }
+ if (!*out) {
+ buffer = apr_palloc(block->pool, inlen + block->blockSize);
+ if (!buffer) {
+ return APR_ENOMEM;
+ }
+ apr_crypto_clear(block->pool, buffer, inlen + block->blockSize);
+ *out = buffer;
+ }
+
+ s = PK11_CipherOp(block->ctx, *out, &outl, inlen, (unsigned char*) in,
+ inlen);
+ if (s != SECSuccess) {
+ PRErrorCode perr = PORT_GetError();
+ if (perr) {
+ block->f->result->rc = perr;
+ block->f->result->msg = PR_ErrorToName(perr);
+ }
+ return APR_ECRYPT;
+ }
+ *outlen = outl;
+
+ return APR_SUCCESS;
+
+}
+
+/**
+ * @brief Encrypt final data block, write it to out.
+ * @note If necessary the final block will be written out after being
+ * padded. Typically the final block will be written to the
+ * same buffer used by apr_crypto_block_encrypt, offset by the
+ * number of bytes returned as actually written by the
+ * apr_crypto_block_encrypt() call. After this call, the context
+ * is cleaned and can be reused by apr_crypto_block_encrypt_init().
+ * @param out Address of a buffer to which data will be written. This
+ * buffer must already exist, and is usually the same
+ * buffer used by apr_evp_crypt(). See note.
+ * @param outlen Length of the output will be written here.
+ * @param ctx The block context to use.
+ * @return APR_ECRYPT if an error occurred.
+ * @return APR_EPADDING if padding was enabled and the block was incorrectly
+ * formatted.
+ * @return APR_ENOTIMPL if not implemented.
+ */
+static apr_status_t crypto_block_encrypt_finish(unsigned char *out,
+ apr_size_t *outlen, apr_crypto_block_t *block)
+{
+
+ apr_status_t rv = APR_SUCCESS;
+ unsigned int outl = *outlen;
+
+ SECStatus s = PK11_DigestFinal(block->ctx, out, &outl, block->blockSize);
+ *outlen = outl;
+
+ if (s != SECSuccess) {
+ PRErrorCode perr = PORT_GetError();
+ if (perr) {
+ block->f->result->rc = perr;
+ block->f->result->msg = PR_ErrorToName(perr);
+ }
+ rv = APR_ECRYPT;
+ }
+ crypto_block_cleanup(block);
+
+ return rv;
+
+}
+
+/**
+ * @brief Initialise a context for decrypting arbitrary data using the given key.
+ * @note If *ctx is NULL, a apr_crypto_block_t will be created from a pool. If
+ * *ctx is not NULL, *ctx must point at a previously created structure.
+ * @param ctx The block context returned, see note.
+ * @param blockSize The block size of the cipher.
+ * @param iv Optional initialisation vector. If the buffer pointed to is NULL,
+ * an IV will be created at random, in space allocated from the pool.
+ * If the buffer is not NULL, the IV in the buffer will be used.
+ * @param key The key structure.
+ * @param p The pool to use.
+ * @return Returns APR_ENOIV if an initialisation vector is required but not specified.
+ * Returns APR_EINIT if the backend failed to initialise the context. Returns
+ * APR_ENOTIMPL if not implemented.
+ */
+static apr_status_t crypto_block_decrypt_init(apr_crypto_block_t **ctx,
+ apr_size_t *blockSize, const unsigned char *iv,
+ const apr_crypto_key_t *key, apr_pool_t *p)
+{
+ PRErrorCode perr;
+ SECItem * secParam;
+ apr_crypto_block_t *block = *ctx;
+ if (!block) {
+ *ctx = block = apr_pcalloc(p, sizeof(apr_crypto_block_t));
+ }
+ if (!block) {
+ return APR_ENOMEM;
+ }
+ block->f = key->f;
+ block->pool = p;
+ block->provider = key->provider;
+
+ apr_pool_cleanup_register(p, block, crypto_block_cleanup_helper,
+ apr_pool_cleanup_null);
+
+ if (key->ivSize) {
+ SECItem ivItem;
+ if (iv == NULL) {
+ return APR_ENOIV; /* Cannot initialise without an IV */
+ }
+ ivItem.data = (unsigned char*) iv;
+ ivItem.len = key->ivSize;
+ secParam = PK11_ParamFromIV(key->cipherMech, &ivItem);
+ }
+ else {
+ secParam = PK11_GenerateNewParam(key->cipherMech, key->symKey);
+ }
+ block->blockSize = PK11_GetBlockSize(key->cipherMech, secParam);
+ block->ctx = PK11_CreateContextBySymKey(key->cipherMech, CKA_DECRYPT,
+ key->symKey, secParam);
+
+ /* did an error occur? */
+ perr = PORT_GetError();
+ if (perr || !block->ctx) {
+ key->f->result->rc = perr;
+ key->f->result->msg = PR_ErrorToName(perr);
+ return APR_EINIT;
+ }
+
+ if (blockSize) {
+ *blockSize = PK11_GetBlockSize(key->cipherMech, secParam);
+ }
+
+ return APR_SUCCESS;
+
+}
+
+/**
+ * @brief Decrypt data provided by in, write it to out.
+ * @note The number of bytes written will be written to outlen. If
+ * out is NULL, outlen will contain the maximum size of the
+ * buffer needed to hold the data, including any data
+ * generated by apr_crypto_block_decrypt_finish below. If *out points
+ * to NULL, a buffer sufficiently large will be created from
+ * the pool provided. If *out points to a not-NULL value, this
+ * value will be used as a buffer instead.
+ * @param out Address of a buffer to which data will be written,
+ * see note.
+ * @param outlen Length of the output will be written here.
+ * @param in Address of the buffer to read.
+ * @param inlen Length of the buffer to read.
+ * @param ctx The block context to use.
+ * @return APR_ECRYPT if an error occurred. Returns APR_ENOTIMPL if
+ * not implemented.
+ */
+static apr_status_t crypto_block_decrypt(unsigned char **out,
+ apr_size_t *outlen, const unsigned char *in, apr_size_t inlen,
+ apr_crypto_block_t *block)
+{
+
+ unsigned char *buffer;
+ int outl = (int) *outlen;
+ SECStatus s;
+ if (!out) {
+ *outlen = inlen + block->blockSize;
+ return APR_SUCCESS;
+ }
+ if (!*out) {
+ buffer = apr_palloc(block->pool, inlen + block->blockSize);
+ if (!buffer) {
+ return APR_ENOMEM;
+ }
+ apr_crypto_clear(block->pool, buffer, inlen + block->blockSize);
+ *out = buffer;
+ }
+
+ s = PK11_CipherOp(block->ctx, *out, &outl, inlen, (unsigned char*) in,
+ inlen);
+ if (s != SECSuccess) {
+ PRErrorCode perr = PORT_GetError();
+ if (perr) {
+ block->f->result->rc = perr;
+ block->f->result->msg = PR_ErrorToName(perr);
+ }
+ return APR_ECRYPT;
+ }
+ *outlen = outl;
+
+ return APR_SUCCESS;
+
+}
+
+/**
+ * @brief Decrypt final data block, write it to out.
+ * @note If necessary the final block will be written out after being
+ * padded. Typically the final block will be written to the
+ * same buffer used by apr_crypto_block_decrypt, offset by the
+ * number of bytes returned as actually written by the
+ * apr_crypto_block_decrypt() call. After this call, the context
+ * is cleaned and can be reused by apr_crypto_block_decrypt_init().
+ * @param out Address of a buffer to which data will be written. This
+ * buffer must already exist, and is usually the same
+ * buffer used by apr_evp_crypt(). See note.
+ * @param outlen Length of the output will be written here.
+ * @param ctx The block context to use.
+ * @return APR_ECRYPT if an error occurred.
+ * @return APR_EPADDING if padding was enabled and the block was incorrectly
+ * formatted.
+ * @return APR_ENOTIMPL if not implemented.
+ */
+static apr_status_t crypto_block_decrypt_finish(unsigned char *out,
+ apr_size_t *outlen, apr_crypto_block_t *block)
+{
+
+ apr_status_t rv = APR_SUCCESS;
+ unsigned int outl = *outlen;
+
+ SECStatus s = PK11_DigestFinal(block->ctx, out, &outl, block->blockSize);
+ *outlen = outl;
+
+ if (s != SECSuccess) {
+ PRErrorCode perr = PORT_GetError();
+ if (perr) {
+ block->f->result->rc = perr;
+ block->f->result->msg = PR_ErrorToName(perr);
+ }
+ rv = APR_ECRYPT;
+ }
+ crypto_block_cleanup(block);
+
+ return rv;
+
+}
+
+/**
+ * NSS module.
+ */
+APU_MODULE_DECLARE_DATA const apr_crypto_driver_t apr_crypto_nss_driver = {
+ "nss", crypto_init, crypto_make, crypto_get_block_key_types,
+ crypto_get_block_key_modes, crypto_passphrase,
+ crypto_block_encrypt_init, crypto_block_encrypt,
+ crypto_block_encrypt_finish, crypto_block_decrypt_init,
+ crypto_block_decrypt, crypto_block_decrypt_finish,
+ crypto_block_cleanup, crypto_cleanup, crypto_shutdown, crypto_error
+};
+
+#endif
diff --git a/contrib/apr-util/crypto/apr_crypto_openssl.c b/contrib/apr-util/crypto/apr_crypto_openssl.c
new file mode 100644
index 000000000000..0740f93f6349
--- /dev/null
+++ b/contrib/apr-util/crypto/apr_crypto_openssl.c
@@ -0,0 +1,798 @@
+/* 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_lib.h"
+#include "apu.h"
+#include "apu_errno.h"
+
+#include <ctype.h>
+#include <assert.h>
+#include <stdlib.h>
+
+#include "apr_strings.h"
+#include "apr_time.h"
+#include "apr_buckets.h"
+
+#include "apr_crypto_internal.h"
+
+#if APU_HAVE_CRYPTO
+
+#include <openssl/evp.h>
+#include <openssl/engine.h>
+
+#define LOG_PREFIX "apr_crypto_openssl: "
+
+struct apr_crypto_t {
+ apr_pool_t *pool;
+ const apr_crypto_driver_t *provider;
+ apu_err_t *result;
+ apr_array_header_t *keys;
+ apr_crypto_config_t *config;
+ apr_hash_t *types;
+ apr_hash_t *modes;
+};
+
+struct apr_crypto_config_t {
+ ENGINE *engine;
+};
+
+struct apr_crypto_key_t {
+ apr_pool_t *pool;
+ const apr_crypto_driver_t *provider;
+ const apr_crypto_t *f;
+ const EVP_CIPHER * cipher;
+ unsigned char *key;
+ int keyLen;
+ int doPad;
+ int ivSize;
+};
+
+struct apr_crypto_block_t {
+ apr_pool_t *pool;
+ const apr_crypto_driver_t *provider;
+ const apr_crypto_t *f;
+ EVP_CIPHER_CTX cipherCtx;
+ int initialised;
+ int ivSize;
+ int blockSize;
+ int doPad;
+};
+
+static int key_3des_192 = APR_KEY_3DES_192;
+static int key_aes_128 = APR_KEY_AES_128;
+static int key_aes_192 = APR_KEY_AES_192;
+static int key_aes_256 = APR_KEY_AES_256;
+
+static int mode_ecb = APR_MODE_ECB;
+static int mode_cbc = APR_MODE_CBC;
+
+/**
+ * Fetch the most recent error from this driver.
+ */
+static apr_status_t crypto_error(const apu_err_t **result,
+ const apr_crypto_t *f)
+{
+ *result = f->result;
+ return APR_SUCCESS;
+}
+
+/**
+ * Shutdown the crypto library and release resources.
+ */
+static apr_status_t crypto_shutdown(void)
+{
+ ERR_free_strings();
+ EVP_cleanup();
+ ENGINE_cleanup();
+ return APR_SUCCESS;
+}
+
+static apr_status_t crypto_shutdown_helper(void *data)
+{
+ return crypto_shutdown();
+}
+
+/**
+ * Initialise the crypto library and perform one time initialisation.
+ */
+static apr_status_t crypto_init(apr_pool_t *pool, const char *params,
+ const apu_err_t **result)
+{
+ CRYPTO_malloc_init();
+ ERR_load_crypto_strings();
+ /* SSL_load_error_strings(); */
+ OpenSSL_add_all_algorithms();
+ ENGINE_load_builtin_engines();
+ ENGINE_register_all_complete();
+
+ apr_pool_cleanup_register(pool, pool, crypto_shutdown_helper,
+ apr_pool_cleanup_null);
+
+ return APR_SUCCESS;
+}
+
+/**
+ * @brief Clean encryption / decryption context.
+ * @note After cleanup, a context is free to be reused if necessary.
+ * @param ctx The block context to use.
+ * @return Returns APR_ENOTIMPL if not supported.
+ */
+static apr_status_t crypto_block_cleanup(apr_crypto_block_t *ctx)
+{
+
+ if (ctx->initialised) {
+ EVP_CIPHER_CTX_cleanup(&ctx->cipherCtx);
+ ctx->initialised = 0;
+ }
+
+ return APR_SUCCESS;
+
+}
+
+static apr_status_t crypto_block_cleanup_helper(void *data)
+{
+ apr_crypto_block_t *block = (apr_crypto_block_t *) data;
+ return crypto_block_cleanup(block);
+}
+
+/**
+ * @brief Clean encryption / decryption context.
+ * @note After cleanup, a context is free to be reused if necessary.
+ * @param f The context to use.
+ * @return Returns APR_ENOTIMPL if not supported.
+ */
+static apr_status_t crypto_cleanup(apr_crypto_t *f)
+{
+
+ if (f->config->engine) {
+ ENGINE_finish(f->config->engine);
+ ENGINE_free(f->config->engine);
+ f->config->engine = NULL;
+ }
+ return APR_SUCCESS;
+
+}
+
+static apr_status_t crypto_cleanup_helper(void *data)
+{
+ apr_crypto_t *f = (apr_crypto_t *) data;
+ return crypto_cleanup(f);
+}
+
+/**
+ * @brief Create a context for supporting encryption. Keys, certificates,
+ * algorithms and other parameters will be set per context. More than
+ * one context can be created at one time. A cleanup will be automatically
+ * registered with the given pool to guarantee a graceful shutdown.
+ * @param f - context pointer will be written here
+ * @param provider - provider to use
+ * @param params - array of key parameters
+ * @param pool - process pool
+ * @return APR_ENOENGINE when the engine specified does not exist. APR_EINITENGINE
+ * if the engine cannot be initialised.
+ */
+static apr_status_t crypto_make(apr_crypto_t **ff,
+ 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));
+
+ const char *engine = NULL;
+
+ struct {
+ const char *field;
+ const char *value;
+ int set;
+ } fields[] = {
+ { "engine", NULL, 0 },
+ { NULL, NULL, 0 }
+ };
+ const char *ptr;
+ size_t klen;
+ char **elts = NULL;
+ char *elt;
+ int i = 0, j;
+ apr_status_t status;
+
+ if (params) {
+ if (APR_SUCCESS != (status = apr_tokenize_to_argv(params, &elts, pool))) {
+ return status;
+ }
+ while ((elt = elts[i])) {
+ ptr = strchr(elt, '=');
+ if (ptr) {
+ for (klen = ptr - elt; klen && apr_isspace(elt[klen - 1]); --klen)
+ ;
+ ptr++;
+ }
+ else {
+ for (klen = strlen(elt); klen && apr_isspace(elt[klen - 1]); --klen)
+ ;
+ }
+ elt[klen] = 0;
+
+ for (j = 0; fields[j].field != NULL; ++j) {
+ if (!strcasecmp(fields[j].field, elt)) {
+ fields[j].set = 1;
+ if (ptr) {
+ fields[j].value = ptr;
+ }
+ break;
+ }
+ }
+
+ i++;
+ }
+ engine = fields[0].value;
+ }
+
+ if (!f) {
+ return APR_ENOMEM;
+ }
+ *ff = f;
+ f->pool = pool;
+ f->provider = provider;
+ config = f->config = apr_pcalloc(pool, sizeof(apr_crypto_config_t));
+ if (!config) {
+ return APR_ENOMEM;
+ }
+
+ f->result = apr_pcalloc(pool, sizeof(apu_err_t));
+ if (!f->result) {
+ return APR_ENOMEM;
+ }
+
+ f->keys = apr_array_make(pool, 10, sizeof(apr_crypto_key_t));
+ if (!f->keys) {
+ return APR_ENOMEM;
+ }
+
+ f->types = apr_hash_make(pool);
+ if (!f->types) {
+ return APR_ENOMEM;
+ }
+ apr_hash_set(f->types, "3des192", APR_HASH_KEY_STRING, &(key_3des_192));
+ apr_hash_set(f->types, "aes128", APR_HASH_KEY_STRING, &(key_aes_128));
+ apr_hash_set(f->types, "aes192", APR_HASH_KEY_STRING, &(key_aes_192));
+ apr_hash_set(f->types, "aes256", APR_HASH_KEY_STRING, &(key_aes_256));
+
+ f->modes = apr_hash_make(pool);
+ if (!f->modes) {
+ return APR_ENOMEM;
+ }
+ apr_hash_set(f->modes, "ecb", APR_HASH_KEY_STRING, &(mode_ecb));
+ apr_hash_set(f->modes, "cbc", APR_HASH_KEY_STRING, &(mode_cbc));
+
+ 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;
+ }
+ }
+
+ return APR_SUCCESS;
+
+}
+
+/**
+ * @brief Get a hash table of key types, keyed by the name of the type against
+ * an integer pointer constant.
+ *
+ * @param types - hashtable of key types keyed to constants.
+ * @param f - encryption context
+ * @return APR_SUCCESS for success
+ */
+static apr_status_t crypto_get_block_key_types(apr_hash_t **types,
+ const apr_crypto_t *f)
+{
+ *types = f->types;
+ return APR_SUCCESS;
+}
+
+/**
+ * @brief Get a hash table of key modes, keyed by the name of the mode against
+ * an integer pointer constant.
+ *
+ * @param modes - hashtable of key modes keyed to constants.
+ * @param f - encryption context
+ * @return APR_SUCCESS for success
+ */
+static apr_status_t crypto_get_block_key_modes(apr_hash_t **modes,
+ const apr_crypto_t *f)
+{
+ *modes = f->modes;
+ return APR_SUCCESS;
+}
+
+/**
+ * @brief Create a key from the given passphrase. By default, the PBKDF2
+ * algorithm is used to generate the key from the passphrase. It is expected
+ * that the same pass phrase will generate the same key, regardless of the
+ * backend crypto platform used. The key is cleaned up when the context
+ * is cleaned, and may be reused with multiple encryption or decryption
+ * operations.
+ * @note If *key is NULL, a apr_crypto_key_t will be created from a pool. If
+ * *key is not NULL, *key must point at a previously created structure.
+ * @param key The key returned, see note.
+ * @param ivSize The size of the initialisation vector will be returned, based
+ * on whether an IV is relevant for this type of crypto.
+ * @param pass The passphrase to use.
+ * @param passLen The passphrase length in bytes
+ * @param salt The salt to use.
+ * @param saltLen The salt length in bytes
+ * @param type 3DES_192, AES_128, AES_192, AES_256.
+ * @param mode Electronic Code Book / Cipher Block Chaining.
+ * @param doPad Pad if necessary.
+ * @param iterations Iteration count
+ * @param f The context to use.
+ * @param p The pool to use.
+ * @return Returns APR_ENOKEY if the pass phrase is missing or empty, or if a backend
+ * error occurred while generating the key. APR_ENOCIPHER if the type or mode
+ * is not supported by the particular backend. APR_EKEYTYPE if the key type is
+ * not known. APR_EPADDING if padding was requested but is not supported.
+ * APR_ENOTIMPL if not implemented.
+ */
+static apr_status_t crypto_passphrase(apr_crypto_key_t **k, apr_size_t *ivSize,
+ const char *pass, apr_size_t passLen, const unsigned char * salt,
+ apr_size_t saltLen, const apr_crypto_block_key_type_e type,
+ const apr_crypto_block_key_mode_e mode, const int doPad,
+ const int iterations, const apr_crypto_t *f, apr_pool_t *p)
+{
+ apr_crypto_key_t *key = *k;
+
+ if (!key) {
+ *k = key = apr_array_push(f->keys);
+ }
+ if (!key) {
+ return APR_ENOMEM;
+ }
+
+ key->f = f;
+ key->provider = f->provider;
+
+ /* determine the cipher to be used */
+ switch (type) {
+
+ case (APR_KEY_3DES_192):
+
+ /* A 3DES key */
+ if (mode == APR_MODE_CBC) {
+ key->cipher = EVP_des_ede3_cbc();
+ }
+ else {
+ key->cipher = EVP_des_ede3_ecb();
+ }
+ break;
+
+ case (APR_KEY_AES_128):
+
+ if (mode == APR_MODE_CBC) {
+ key->cipher = EVP_aes_128_cbc();
+ }
+ else {
+ key->cipher = EVP_aes_128_ecb();
+ }
+ break;
+
+ case (APR_KEY_AES_192):
+
+ if (mode == APR_MODE_CBC) {
+ key->cipher = EVP_aes_192_cbc();
+ }
+ else {
+ key->cipher = EVP_aes_192_ecb();
+ }
+ break;
+
+ case (APR_KEY_AES_256):
+
+ if (mode == APR_MODE_CBC) {
+ key->cipher = EVP_aes_256_cbc();
+ }
+ else {
+ key->cipher = EVP_aes_256_ecb();
+ }
+ break;
+
+ default:
+
+ /* unknown key type, give up */
+ return APR_EKEYTYPE;
+
+ }
+
+ /* find the length of the key we need */
+ key->keyLen = EVP_CIPHER_key_length(key->cipher);
+
+ /* make space for the key */
+ key->key = apr_pcalloc(p, key->keyLen);
+ if (!key->key) {
+ return APR_ENOMEM;
+ }
+ apr_crypto_clear(p, key->key, key->keyLen);
+
+ /* generate the key */
+ if (PKCS5_PBKDF2_HMAC_SHA1(pass, passLen, (unsigned char *) salt, saltLen,
+ iterations, key->keyLen, key->key) == 0) {
+ return APR_ENOKEY;
+ }
+
+ key->doPad = doPad;
+
+ /* note: openssl incorrectly returns non zero IV size values for ECB
+ * algorithms, so work around this by ignoring the IV size.
+ */
+ if (APR_MODE_ECB != mode) {
+ key->ivSize = EVP_CIPHER_iv_length(key->cipher);
+ }
+ if (ivSize) {
+ *ivSize = key->ivSize;
+ }
+
+ return APR_SUCCESS;
+}
+
+/**
+ * @brief Initialise a context for encrypting arbitrary data using the given key.
+ * @note If *ctx is NULL, a apr_crypto_block_t will be created from a pool. If
+ * *ctx is not NULL, *ctx must point at a previously created structure.
+ * @param ctx The block context returned, see note.
+ * @param iv Optional initialisation vector. If the buffer pointed to is NULL,
+ * an IV will be created at random, in space allocated from the pool.
+ * If the buffer pointed to is not NULL, the IV in the buffer will be
+ * used.
+ * @param key The key structure.
+ * @param blockSize The block size of the cipher.
+ * @param p The pool to use.
+ * @return Returns APR_ENOIV if an initialisation vector is required but not specified.
+ * Returns APR_EINIT if the backend failed to initialise the context. Returns
+ * APR_ENOTIMPL if not implemented.
+ */
+static apr_status_t crypto_block_encrypt_init(apr_crypto_block_t **ctx,
+ const unsigned char **iv, const apr_crypto_key_t *key,
+ apr_size_t *blockSize, apr_pool_t *p)
+{
+ unsigned char *usedIv;
+ apr_crypto_config_t *config = key->f->config;
+ apr_crypto_block_t *block = *ctx;
+ if (!block) {
+ *ctx = block = apr_pcalloc(p, sizeof(apr_crypto_block_t));
+ }
+ if (!block) {
+ return APR_ENOMEM;
+ }
+ block->f = key->f;
+ block->pool = p;
+ block->provider = key->provider;
+
+ apr_pool_cleanup_register(p, block, crypto_block_cleanup_helper,
+ apr_pool_cleanup_null);
+
+ /* create a new context for encryption */
+ EVP_CIPHER_CTX_init(&block->cipherCtx);
+ block->initialised = 1;
+
+ /* generate an IV, if necessary */
+ usedIv = NULL;
+ if (key->ivSize) {
+ if (iv == NULL) {
+ return APR_ENOIV;
+ }
+ if (*iv == NULL) {
+ usedIv = apr_pcalloc(p, key->ivSize);
+ if (!usedIv) {
+ return APR_ENOMEM;
+ }
+ apr_crypto_clear(p, usedIv, key->ivSize);
+ if (!((RAND_status() == 1)
+ && (RAND_bytes(usedIv, key->ivSize) == 1))) {
+ return APR_ENOIV;
+ }
+ *iv = usedIv;
+ }
+ else {
+ usedIv = (unsigned char *) *iv;
+ }
+ }
+
+ /* set up our encryption context */
+#if CRYPTO_OPENSSL_CONST_BUFFERS
+ if (!EVP_EncryptInit_ex(&block->cipherCtx, key->cipher, config->engine,
+ key->key, usedIv)) {
+#else
+ if (!EVP_EncryptInit_ex(&block->cipherCtx, key->cipher, config->engine, (unsigned char *) key->key, (unsigned char *) usedIv)) {
+#endif
+ return APR_EINIT;
+ }
+
+ /* Clear up any read padding */
+ if (!EVP_CIPHER_CTX_set_padding(&block->cipherCtx, key->doPad)) {
+ return APR_EPADDING;
+ }
+
+ if (blockSize) {
+ *blockSize = EVP_CIPHER_block_size(key->cipher);
+ }
+
+ return APR_SUCCESS;
+
+}
+
+/**
+ * @brief Encrypt data provided by in, write it to out.
+ * @note The number of bytes written will be written to outlen. If
+ * out is NULL, outlen will contain the maximum size of the
+ * buffer needed to hold the data, including any data
+ * generated by apr_crypto_block_encrypt_finish below. If *out points
+ * to NULL, a buffer sufficiently large will be created from
+ * the pool provided. If *out points to a not-NULL value, this
+ * value will be used as a buffer instead.
+ * @param out Address of a buffer to which data will be written,
+ * see note.
+ * @param outlen Length of the output will be written here.
+ * @param in Address of the buffer to read.
+ * @param inlen Length of the buffer to read.
+ * @param ctx The block context to use.
+ * @return APR_ECRYPT if an error occurred. Returns APR_ENOTIMPL if
+ * not implemented.
+ */
+static apr_status_t crypto_block_encrypt(unsigned char **out,
+ apr_size_t *outlen, const unsigned char *in, apr_size_t inlen,
+ apr_crypto_block_t *ctx)
+{
+ int outl = *outlen;
+ unsigned char *buffer;
+
+ /* are we after the maximum size of the out buffer? */
+ if (!out) {
+ *outlen = inlen + EVP_MAX_BLOCK_LENGTH;
+ return APR_SUCCESS;
+ }
+
+ /* must we allocate the output buffer from a pool? */
+ if (!*out) {
+ buffer = apr_palloc(ctx->pool, inlen + EVP_MAX_BLOCK_LENGTH);
+ if (!buffer) {
+ return APR_ENOMEM;
+ }
+ apr_crypto_clear(ctx->pool, buffer, inlen + EVP_MAX_BLOCK_LENGTH);
+ *out = buffer;
+ }
+
+#if CRYPT_OPENSSL_CONST_BUFFERS
+ if (!EVP_EncryptUpdate(&ctx->cipherCtx, (*out), &outl, in, inlen)) {
+#else
+ if (!EVP_EncryptUpdate(&ctx->cipherCtx, (*out), &outl,
+ (unsigned char *) in, inlen)) {
+#endif
+ return APR_ECRYPT;
+ }
+ *outlen = outl;
+
+ return APR_SUCCESS;
+
+}
+
+/**
+ * @brief Encrypt final data block, write it to out.
+ * @note If necessary the final block will be written out after being
+ * padded. Typically the final block will be written to the
+ * same buffer used by apr_crypto_block_encrypt, offset by the
+ * number of bytes returned as actually written by the
+ * apr_crypto_block_encrypt() call. After this call, the context
+ * is cleaned and can be reused by apr_crypto_block_encrypt_init().
+ * @param out Address of a buffer to which data will be written. This
+ * buffer must already exist, and is usually the same
+ * buffer used by apr_evp_crypt(). See note.
+ * @param outlen Length of the output will be written here.
+ * @param ctx The block context to use.
+ * @return APR_ECRYPT if an error occurred.
+ * @return APR_EPADDING if padding was enabled and the block was incorrectly
+ * formatted.
+ * @return APR_ENOTIMPL if not implemented.
+ */
+static apr_status_t crypto_block_encrypt_finish(unsigned char *out,
+ apr_size_t *outlen, apr_crypto_block_t *ctx)
+{
+ int len = *outlen;
+
+ if (EVP_EncryptFinal_ex(&ctx->cipherCtx, out, &len) == 0) {
+ return APR_EPADDING;
+ }
+ *outlen = len;
+
+ return APR_SUCCESS;
+
+}
+
+/**
+ * @brief Initialise a context for decrypting arbitrary data using the given key.
+ * @note If *ctx is NULL, a apr_crypto_block_t will be created from a pool. If
+ * *ctx is not NULL, *ctx must point at a previously created structure.
+ * @param ctx The block context returned, see note.
+ * @param blockSize The block size of the cipher.
+ * @param iv Optional initialisation vector. If the buffer pointed to is NULL,
+ * an IV will be created at random, in space allocated from the pool.
+ * If the buffer is not NULL, the IV in the buffer will be used.
+ * @param key The key structure.
+ * @param p The pool to use.
+ * @return Returns APR_ENOIV if an initialisation vector is required but not specified.
+ * Returns APR_EINIT if the backend failed to initialise the context. Returns
+ * APR_ENOTIMPL if not implemented.
+ */
+static apr_status_t crypto_block_decrypt_init(apr_crypto_block_t **ctx,
+ apr_size_t *blockSize, const unsigned char *iv,
+ const apr_crypto_key_t *key, apr_pool_t *p)
+{
+ apr_crypto_config_t *config = key->f->config;
+ apr_crypto_block_t *block = *ctx;
+ if (!block) {
+ *ctx = block = apr_pcalloc(p, sizeof(apr_crypto_block_t));
+ }
+ if (!block) {
+ return APR_ENOMEM;
+ }
+ block->f = key->f;
+ block->pool = p;
+ block->provider = key->provider;
+
+ apr_pool_cleanup_register(p, block, crypto_block_cleanup_helper,
+ apr_pool_cleanup_null);
+
+ /* create a new context for encryption */
+ EVP_CIPHER_CTX_init(&block->cipherCtx);
+ block->initialised = 1;
+
+ /* generate an IV, if necessary */
+ if (key->ivSize) {
+ if (iv == NULL) {
+ return APR_ENOIV;
+ }
+ }
+
+ /* set up our encryption context */
+#if CRYPTO_OPENSSL_CONST_BUFFERS
+ if (!EVP_DecryptInit_ex(&block->cipherCtx, key->cipher, config->engine,
+ key->key, iv)) {
+#else
+ if (!EVP_DecryptInit_ex(&block->cipherCtx, key->cipher, config->engine, (unsigned char *) key->key, (unsigned char *) iv)) {
+#endif
+ return APR_EINIT;
+ }
+
+ /* Clear up any read padding */
+ if (!EVP_CIPHER_CTX_set_padding(&block->cipherCtx, key->doPad)) {
+ return APR_EPADDING;
+ }
+
+ if (blockSize) {
+ *blockSize = EVP_CIPHER_block_size(key->cipher);
+ }
+
+ return APR_SUCCESS;
+
+}
+
+/**
+ * @brief Decrypt data provided by in, write it to out.
+ * @note The number of bytes written will be written to outlen. If
+ * out is NULL, outlen will contain the maximum size of the
+ * buffer needed to hold the data, including any data
+ * generated by apr_crypto_block_decrypt_finish below. If *out points
+ * to NULL, a buffer sufficiently large will be created from
+ * the pool provided. If *out points to a not-NULL value, this
+ * value will be used as a buffer instead.
+ * @param out Address of a buffer to which data will be written,
+ * see note.
+ * @param outlen Length of the output will be written here.
+ * @param in Address of the buffer to read.
+ * @param inlen Length of the buffer to read.
+ * @param ctx The block context to use.
+ * @return APR_ECRYPT if an error occurred. Returns APR_ENOTIMPL if
+ * not implemented.
+ */
+static apr_status_t crypto_block_decrypt(unsigned char **out,
+ apr_size_t *outlen, const unsigned char *in, apr_size_t inlen,
+ apr_crypto_block_t *ctx)
+{
+ int outl = *outlen;
+ unsigned char *buffer;
+
+ /* are we after the maximum size of the out buffer? */
+ if (!out) {
+ *outlen = inlen + EVP_MAX_BLOCK_LENGTH;
+ return APR_SUCCESS;
+ }
+
+ /* must we allocate the output buffer from a pool? */
+ if (!(*out)) {
+ buffer = apr_palloc(ctx->pool, inlen + EVP_MAX_BLOCK_LENGTH);
+ if (!buffer) {
+ return APR_ENOMEM;
+ }
+ apr_crypto_clear(ctx->pool, buffer, inlen + EVP_MAX_BLOCK_LENGTH);
+ *out = buffer;
+ }
+
+#if CRYPT_OPENSSL_CONST_BUFFERS
+ if (!EVP_DecryptUpdate(&ctx->cipherCtx, *out, &outl, in, inlen)) {
+#else
+ if (!EVP_DecryptUpdate(&ctx->cipherCtx, *out, &outl, (unsigned char *) in,
+ inlen)) {
+#endif
+ return APR_ECRYPT;
+ }
+ *outlen = outl;
+
+ return APR_SUCCESS;
+
+}
+
+/**
+ * @brief Decrypt final data block, write it to out.
+ * @note If necessary the final block will be written out after being
+ * padded. Typically the final block will be written to the
+ * same buffer used by apr_crypto_block_decrypt, offset by the
+ * number of bytes returned as actually written by the
+ * apr_crypto_block_decrypt() call. After this call, the context
+ * is cleaned and can be reused by apr_crypto_block_decrypt_init().
+ * @param out Address of a buffer to which data will be written. This
+ * buffer must already exist, and is usually the same
+ * buffer used by apr_evp_crypt(). See note.
+ * @param outlen Length of the output will be written here.
+ * @param ctx The block context to use.
+ * @return APR_ECRYPT if an error occurred.
+ * @return APR_EPADDING if padding was enabled and the block was incorrectly
+ * formatted.
+ * @return APR_ENOTIMPL if not implemented.
+ */
+static apr_status_t crypto_block_decrypt_finish(unsigned char *out,
+ apr_size_t *outlen, apr_crypto_block_t *ctx)
+{
+
+ int len = *outlen;
+
+ if (EVP_DecryptFinal_ex(&ctx->cipherCtx, out, &len) == 0) {
+ return APR_EPADDING;
+ }
+ *outlen = len;
+
+ return APR_SUCCESS;
+
+}
+
+/**
+ * OpenSSL module.
+ */
+APU_MODULE_DECLARE_DATA const apr_crypto_driver_t apr_crypto_openssl_driver = {
+ "openssl", crypto_init, crypto_make, crypto_get_block_key_types,
+ crypto_get_block_key_modes, crypto_passphrase,
+ crypto_block_encrypt_init, crypto_block_encrypt,
+ crypto_block_encrypt_finish, crypto_block_decrypt_init,
+ crypto_block_decrypt, crypto_block_decrypt_finish,
+ crypto_block_cleanup, crypto_cleanup, crypto_shutdown, crypto_error
+};
+
+#endif
diff --git a/contrib/apr-util/crypto/apr_md4.c b/contrib/apr-util/crypto/apr_md4.c
new file mode 100644
index 000000000000..ada514003ef4
--- /dev/null
+++ b/contrib/apr-util/crypto/apr_md4.c
@@ -0,0 +1,404 @@
+/* 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.
+ *
+ * This is derived from material copyright RSA Data Security, Inc.
+ * Their notice is reproduced below in its entirety.
+ *
+ * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
+ * rights reserved.
+ *
+ * License to copy and use this software is granted provided that it
+ * is identified as the "RSA Data Security, Inc. MD4 Message-Digest
+ * Algorithm" in all material mentioning or referencing this software
+ * or this function.
+ *
+ * License is also granted to make and use derivative works provided
+ * that such works are identified as "derived from the RSA Data
+ * Security, Inc. MD4 Message-Digest Algorithm" in all material
+ * mentioning or referencing the derived work.
+ *
+ * RSA Data Security, Inc. makes no representations concerning either
+ * the merchantability of this software or the suitability of this
+ * software for any particular purpose. It is provided "as is"
+ * without express or implied warranty of any kind.
+ *
+ * These notices must be retained in any copies of any part of this
+ * documentation and/or software.
+ */
+
+#include "apr_strings.h"
+#include "apr_md4.h"
+#include "apr_lib.h"
+
+#if APR_HAVE_STRING_H
+#include <string.h>
+#endif
+#if APR_HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+/* Constants for MD4Transform routine.
+ */
+
+#define S11 3
+#define S12 7
+#define S13 11
+#define S14 19
+#define S21 3
+#define S22 5
+#define S23 9
+#define S24 13
+#define S31 3
+#define S32 9
+#define S33 11
+#define S34 15
+
+static void MD4Transform(apr_uint32_t state[4], const unsigned char block[64]);
+static void Encode(unsigned char *output, const apr_uint32_t *input,
+ unsigned int len);
+static void Decode(apr_uint32_t *output, const unsigned char *input,
+ unsigned int len);
+
+static unsigned char PADDING[64] =
+{
+ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+#if APR_CHARSET_EBCDIC
+static apr_xlate_t *xlate_ebcdic_to_ascii; /* used in apr_md4_encode() */
+#endif
+
+/* F, G and I are basic MD4 functions.
+ */
+#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
+#define G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z)))
+#define H(x, y, z) ((x) ^ (y) ^ (z))
+
+/* ROTATE_LEFT rotates x left n bits.
+ */
+#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
+
+/* FF, GG and HH are transformations for rounds 1, 2 and 3 */
+/* Rotation is separate from addition to prevent recomputation */
+
+#define FF(a, b, c, d, x, s) { \
+ (a) += F ((b), (c), (d)) + (x); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ }
+#define GG(a, b, c, d, x, s) { \
+ (a) += G ((b), (c), (d)) + (x) + (apr_uint32_t)0x5a827999; \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ }
+#define HH(a, b, c, d, x, s) { \
+ (a) += H ((b), (c), (d)) + (x) + (apr_uint32_t)0x6ed9eba1; \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ }
+
+/* MD4 initialization. Begins an MD4 operation, writing a new context.
+ */
+APU_DECLARE(apr_status_t) apr_md4_init(apr_md4_ctx_t *context)
+{
+ context->count[0] = context->count[1] = 0;
+
+ /* Load magic initialization constants. */
+ context->state[0] = 0x67452301;
+ context->state[1] = 0xefcdab89;
+ context->state[2] = 0x98badcfe;
+ context->state[3] = 0x10325476;
+
+#if APR_HAS_XLATE
+ context->xlate = NULL;
+#endif
+
+ return APR_SUCCESS;
+}
+
+#if APR_HAS_XLATE
+/* MD4 translation setup. Provides the APR translation handle
+ * to be used for translating the content before calculating the
+ * digest.
+ */
+APU_DECLARE(apr_status_t) apr_md4_set_xlate(apr_md4_ctx_t *context,
+ apr_xlate_t *xlate)
+{
+ apr_status_t rv;
+ int is_sb;
+
+ /* TODO: remove the single-byte-only restriction from this code
+ */
+ rv = apr_xlate_sb_get(xlate, &is_sb);
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+ if (!is_sb) {
+ return APR_EINVAL;
+ }
+ context->xlate = xlate;
+ return APR_SUCCESS;
+}
+#endif /* APR_HAS_XLATE */
+
+/* MD4 block update operation. Continues an MD4 message-digest
+ * operation, processing another message block, and updating the
+ * context.
+ */
+APU_DECLARE(apr_status_t) apr_md4_update(apr_md4_ctx_t *context,
+ const unsigned char *input,
+ apr_size_t inputLen)
+{
+ unsigned int i, idx, partLen;
+#if APR_HAS_XLATE
+ apr_size_t inbytes_left, outbytes_left;
+#endif
+
+ /* Compute number of bytes mod 64 */
+ idx = (unsigned int)((context->count[0] >> 3) & 0x3F);
+
+ /* Update number of bits */
+ if ((context->count[0] += ((apr_uint32_t)inputLen << 3))
+ < ((apr_uint32_t)inputLen << 3))
+ context->count[1]++;
+ context->count[1] += (apr_uint32_t)inputLen >> 29;
+
+ partLen = 64 - idx;
+
+ /* Transform as many times as possible. */
+#if !APR_HAS_XLATE
+ if (inputLen >= partLen) {
+ memcpy(&context->buffer[idx], input, partLen);
+ MD4Transform(context->state, context->buffer);
+
+ for (i = partLen; i + 63 < inputLen; i += 64)
+ MD4Transform(context->state, &input[i]);
+
+ idx = 0;
+ }
+ else
+ i = 0;
+
+ /* Buffer remaining input */
+ memcpy(&context->buffer[idx], &input[i], inputLen - i);
+#else /*APR_HAS_XLATE*/
+ if (inputLen >= partLen) {
+ if (context->xlate) {
+ inbytes_left = outbytes_left = partLen;
+ apr_xlate_conv_buffer(context->xlate, (const char *)input,
+ &inbytes_left,
+ (char *)&context->buffer[idx],
+ &outbytes_left);
+ }
+ else {
+ memcpy(&context->buffer[idx], input, partLen);
+ }
+ MD4Transform(context->state, context->buffer);
+
+ for (i = partLen; i + 63 < inputLen; i += 64) {
+ if (context->xlate) {
+ unsigned char inp_tmp[64];
+ inbytes_left = outbytes_left = 64;
+ apr_xlate_conv_buffer(context->xlate, (const char *)&input[i],
+ &inbytes_left,
+ (char *)inp_tmp, &outbytes_left);
+ MD4Transform(context->state, inp_tmp);
+ }
+ else {
+ MD4Transform(context->state, &input[i]);
+ }
+ }
+
+ idx = 0;
+ }
+ else
+ i = 0;
+
+ /* Buffer remaining input */
+ if (context->xlate) {
+ inbytes_left = outbytes_left = inputLen - i;
+ apr_xlate_conv_buffer(context->xlate, (const char *)&input[i],
+ &inbytes_left, (char *)&context->buffer[idx],
+ &outbytes_left);
+ }
+ else {
+ memcpy(&context->buffer[idx], &input[i], inputLen - i);
+ }
+#endif /*APR_HAS_XLATE*/
+ return APR_SUCCESS;
+}
+
+/* MD4 finalization. Ends an MD4 message-digest operation, writing the
+ * the message digest and zeroizing the context.
+ */
+APU_DECLARE(apr_status_t) apr_md4_final(
+ unsigned char digest[APR_MD4_DIGESTSIZE],
+ apr_md4_ctx_t *context)
+{
+ unsigned char bits[8];
+ unsigned int idx, padLen;
+
+ /* Save number of bits */
+ Encode(bits, context->count, 8);
+
+#if APR_HAS_XLATE
+ /* apr_md4_update() should not translate for this final round. */
+ context->xlate = NULL;
+#endif /*APR_HAS_XLATE*/
+
+ /* Pad out to 56 mod 64. */
+ idx = (unsigned int) ((context->count[0] >> 3) & 0x3f);
+ padLen = (idx < 56) ? (56 - idx) : (120 - idx);
+ apr_md4_update(context, PADDING, padLen);
+
+ /* Append length (before padding) */
+ apr_md4_update(context, bits, 8);
+
+ /* Store state in digest */
+ Encode(digest, context->state, APR_MD4_DIGESTSIZE);
+
+ /* Zeroize sensitive information. */
+ memset(context, 0, sizeof(*context));
+
+ return APR_SUCCESS;
+}
+
+/* MD4 computation in one step (init, update, final)
+ */
+APU_DECLARE(apr_status_t) apr_md4(unsigned char digest[APR_MD4_DIGESTSIZE],
+ const unsigned char *input,
+ apr_size_t inputLen)
+{
+ apr_md4_ctx_t ctx;
+ apr_status_t rv;
+
+ apr_md4_init(&ctx);
+
+ if ((rv = apr_md4_update(&ctx, input, inputLen)) != APR_SUCCESS)
+ return rv;
+
+ return apr_md4_final(digest, &ctx);
+}
+
+/* MD4 basic transformation. Transforms state based on block. */
+static void MD4Transform(apr_uint32_t state[4], const unsigned char block[64])
+{
+ apr_uint32_t a = state[0], b = state[1], c = state[2], d = state[3],
+ x[APR_MD4_DIGESTSIZE];
+
+ Decode(x, block, 64);
+
+ /* Round 1 */
+ FF (a, b, c, d, x[ 0], S11); /* 1 */
+ FF (d, a, b, c, x[ 1], S12); /* 2 */
+ FF (c, d, a, b, x[ 2], S13); /* 3 */
+ FF (b, c, d, a, x[ 3], S14); /* 4 */
+ FF (a, b, c, d, x[ 4], S11); /* 5 */
+ FF (d, a, b, c, x[ 5], S12); /* 6 */
+ FF (c, d, a, b, x[ 6], S13); /* 7 */
+ FF (b, c, d, a, x[ 7], S14); /* 8 */
+ FF (a, b, c, d, x[ 8], S11); /* 9 */
+ FF (d, a, b, c, x[ 9], S12); /* 10 */
+ FF (c, d, a, b, x[10], S13); /* 11 */
+ FF (b, c, d, a, x[11], S14); /* 12 */
+ FF (a, b, c, d, x[12], S11); /* 13 */
+ FF (d, a, b, c, x[13], S12); /* 14 */
+ FF (c, d, a, b, x[14], S13); /* 15 */
+ FF (b, c, d, a, x[15], S14); /* 16 */
+
+ /* Round 2 */
+ GG (a, b, c, d, x[ 0], S21); /* 17 */
+ GG (d, a, b, c, x[ 4], S22); /* 18 */
+ GG (c, d, a, b, x[ 8], S23); /* 19 */
+ GG (b, c, d, a, x[12], S24); /* 20 */
+ GG (a, b, c, d, x[ 1], S21); /* 21 */
+ GG (d, a, b, c, x[ 5], S22); /* 22 */
+ GG (c, d, a, b, x[ 9], S23); /* 23 */
+ GG (b, c, d, a, x[13], S24); /* 24 */
+ GG (a, b, c, d, x[ 2], S21); /* 25 */
+ GG (d, a, b, c, x[ 6], S22); /* 26 */
+ GG (c, d, a, b, x[10], S23); /* 27 */
+ GG (b, c, d, a, x[14], S24); /* 28 */
+ GG (a, b, c, d, x[ 3], S21); /* 29 */
+ GG (d, a, b, c, x[ 7], S22); /* 30 */
+ GG (c, d, a, b, x[11], S23); /* 31 */
+ GG (b, c, d, a, x[15], S24); /* 32 */
+
+ /* Round 3 */
+ HH (a, b, c, d, x[ 0], S31); /* 33 */
+ HH (d, a, b, c, x[ 8], S32); /* 34 */
+ HH (c, d, a, b, x[ 4], S33); /* 35 */
+ HH (b, c, d, a, x[12], S34); /* 36 */
+ HH (a, b, c, d, x[ 2], S31); /* 37 */
+ HH (d, a, b, c, x[10], S32); /* 38 */
+ HH (c, d, a, b, x[ 6], S33); /* 39 */
+ HH (b, c, d, a, x[14], S34); /* 40 */
+ HH (a, b, c, d, x[ 1], S31); /* 41 */
+ HH (d, a, b, c, x[ 9], S32); /* 42 */
+ HH (c, d, a, b, x[ 5], S33); /* 43 */
+ HH (b, c, d, a, x[13], S34); /* 44 */
+ HH (a, b, c, d, x[ 3], S31); /* 45 */
+ HH (d, a, b, c, x[11], S32); /* 46 */
+ HH (c, d, a, b, x[ 7], S33); /* 47 */
+ HH (b, c, d, a, x[15], S34); /* 48 */
+
+ state[0] += a;
+ state[1] += b;
+ state[2] += c;
+ state[3] += d;
+
+ /* Zeroize sensitive information. */
+ memset(x, 0, sizeof(x));
+}
+
+/* Encodes input (apr_uint32_t) into output (unsigned char). Assumes len is
+ * a multiple of 4.
+ */
+static void Encode(unsigned char *output, const apr_uint32_t *input,
+ unsigned int len)
+{
+ unsigned int i, j;
+ apr_uint32_t k;
+
+ for (i = 0, j = 0; j < len; i++, j += 4) {
+ k = input[i];
+ output[j] = (unsigned char)(k & 0xff);
+ output[j + 1] = (unsigned char)((k >> 8) & 0xff);
+ output[j + 2] = (unsigned char)((k >> 16) & 0xff);
+ output[j + 3] = (unsigned char)((k >> 24) & 0xff);
+ }
+}
+
+/* Decodes input (unsigned char) into output (apr_uint32_t). Assumes len is
+ * a multiple of 4.
+ */
+static void Decode(apr_uint32_t *output, const unsigned char *input,
+ unsigned int len)
+{
+ unsigned int i, j;
+
+ for (i = 0, j = 0; j < len; i++, j += 4)
+ output[i] = ((apr_uint32_t)input[j]) |
+ (((apr_uint32_t)input[j + 1]) << 8) |
+ (((apr_uint32_t)input[j + 2]) << 16) |
+ (((apr_uint32_t)input[j + 3]) << 24);
+}
+
+#if APR_CHARSET_EBCDIC
+APU_DECLARE(apr_status_t) apr_MD4InitEBCDIC(apr_xlate_t *xlate)
+{
+ xlate_ebcdic_to_ascii = xlate;
+ return APR_SUCCESS;
+}
+#endif
diff --git a/contrib/apr-util/crypto/apr_md5.c b/contrib/apr-util/crypto/apr_md5.c
new file mode 100644
index 000000000000..40fa7b27a4ff
--- /dev/null
+++ b/contrib/apr-util/crypto/apr_md5.c
@@ -0,0 +1,666 @@
+/*
+ * This is work is derived from material Copyright RSA Data Security, Inc.
+ *
+ * The RSA copyright statement and Licence for that original material is
+ * included below. This is followed by the Apache copyright statement and
+ * licence for the modifications made to that material.
+ */
+
+/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
+ */
+
+/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
+ rights reserved.
+
+ License to copy and use this software is granted provided that it
+ is identified as the "RSA Data Security, Inc. MD5 Message-Digest
+ Algorithm" in all material mentioning or referencing this software
+ or this function.
+
+ License is also granted to make and use derivative works provided
+ that such works are identified as "derived from the RSA Data
+ Security, Inc. MD5 Message-Digest Algorithm" in all material
+ mentioning or referencing the derived work.
+
+ RSA Data Security, Inc. makes no representations concerning either
+ the merchantability of this software or the suitability of this
+ software for any particular purpose. It is provided "as is"
+ without express or implied warranty of any kind.
+
+ These notices must be retained in any copies of any part of this
+ documentation and/or software.
+ */
+
+/* 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.
+ */
+
+/*
+ * The apr_md5_encode() routine uses much code obtained from the FreeBSD 3.0
+ * MD5 crypt() function, which is licenced as follows:
+ * ----------------------------------------------------------------------------
+ * "THE BEER-WARE LICENSE" (Revision 42):
+ * <phk@login.dknet.dk> wrote this file. As long as you retain this notice you
+ * can do whatever you want with this stuff. If we meet some day, and you think
+ * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
+ * ----------------------------------------------------------------------------
+ */
+#include "apr_strings.h"
+#include "apr_md5.h"
+#include "apr_lib.h"
+#include "apu_config.h"
+
+#if APR_HAVE_STRING_H
+#include <string.h>
+#endif
+
+/* Constants for MD5Transform routine.
+ */
+
+#define S11 7
+#define S12 12
+#define S13 17
+#define S14 22
+#define S21 5
+#define S22 9
+#define S23 14
+#define S24 20
+#define S31 4
+#define S32 11
+#define S33 16
+#define S34 23
+#define S41 6
+#define S42 10
+#define S43 15
+#define S44 21
+
+static void MD5Transform(apr_uint32_t state[4], const unsigned char block[64]);
+static void Encode(unsigned char *output, const apr_uint32_t *input,
+ unsigned int len);
+static void Decode(apr_uint32_t *output, const unsigned char *input,
+ unsigned int len);
+
+static const unsigned char PADDING[64] =
+{
+ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+#if APR_CHARSET_EBCDIC
+static apr_xlate_t *xlate_ebcdic_to_ascii; /* used in apr_md5_encode() */
+#endif
+#define DO_XLATE 0
+#define SKIP_XLATE 1
+
+/* F, G, H and I are basic MD5 functions.
+ */
+#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
+#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
+#define H(x, y, z) ((x) ^ (y) ^ (z))
+#define I(x, y, z) ((y) ^ ((x) | (~z)))
+
+/* ROTATE_LEFT rotates x left n bits.
+ */
+#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
+
+/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
+ * Rotation is separate from addition to prevent recomputation.
+ */
+#define FF(a, b, c, d, x, s, ac) { \
+ (a) += F ((b), (c), (d)) + (x) + (apr_uint32_t)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ }
+#define GG(a, b, c, d, x, s, ac) { \
+ (a) += G ((b), (c), (d)) + (x) + (apr_uint32_t)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ }
+#define HH(a, b, c, d, x, s, ac) { \
+ (a) += H ((b), (c), (d)) + (x) + (apr_uint32_t)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ }
+#define II(a, b, c, d, x, s, ac) { \
+ (a) += I ((b), (c), (d)) + (x) + (apr_uint32_t)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ }
+
+/* MD5 initialization. Begins an MD5 operation, writing a new context.
+ */
+APU_DECLARE(apr_status_t) apr_md5_init(apr_md5_ctx_t *context)
+{
+ context->count[0] = context->count[1] = 0;
+
+ /* Load magic initialization constants. */
+ context->state[0] = 0x67452301;
+ context->state[1] = 0xefcdab89;
+ context->state[2] = 0x98badcfe;
+ context->state[3] = 0x10325476;
+ context->xlate = NULL;
+
+ return APR_SUCCESS;
+}
+
+/* MD5 translation setup. Provides the APR translation handle
+ * to be used for translating the content before calculating the
+ * digest.
+ */
+APU_DECLARE(apr_status_t) apr_md5_set_xlate(apr_md5_ctx_t *context,
+ apr_xlate_t *xlate)
+{
+#if APR_HAS_XLATE
+ apr_status_t rv;
+ int is_sb;
+
+ /* TODO: remove the single-byte-only restriction from this code
+ */
+ rv = apr_xlate_sb_get(xlate, &is_sb);
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+ if (!is_sb) {
+ return APR_EINVAL;
+ }
+ context->xlate = xlate;
+ return APR_SUCCESS;
+#else
+ return APR_ENOTIMPL;
+#endif /* APR_HAS_XLATE */
+}
+
+/* MD5 block update operation. Continues an MD5 message-digest
+ * operation, processing another message block, and updating the
+ * context.
+ */
+static apr_status_t md5_update_buffer(apr_md5_ctx_t *context,
+ const void *vinput,
+ apr_size_t inputLen,
+ int xlate_buffer)
+{
+ const unsigned char *input = vinput;
+ unsigned int i, idx, partLen;
+#if APR_HAS_XLATE
+ apr_size_t inbytes_left, outbytes_left;
+#endif
+
+ /* Compute number of bytes mod 64 */
+ idx = (unsigned int)((context->count[0] >> 3) & 0x3F);
+
+ /* Update number of bits */
+ if ((context->count[0] += ((apr_uint32_t)inputLen << 3))
+ < ((apr_uint32_t)inputLen << 3))
+ context->count[1]++;
+ context->count[1] += (apr_uint32_t)inputLen >> 29;
+
+ partLen = 64 - idx;
+
+ /* Transform as many times as possible. */
+#if !APR_HAS_XLATE
+ if (inputLen >= partLen) {
+ memcpy(&context->buffer[idx], input, partLen);
+ MD5Transform(context->state, context->buffer);
+
+ for (i = partLen; i + 63 < inputLen; i += 64)
+ MD5Transform(context->state, &input[i]);
+
+ idx = 0;
+ }
+ else
+ i = 0;
+
+ /* Buffer remaining input */
+ memcpy(&context->buffer[idx], &input[i], inputLen - i);
+#else /*APR_HAS_XLATE*/
+ if (inputLen >= partLen) {
+ if (context->xlate && (xlate_buffer == DO_XLATE)) {
+ inbytes_left = outbytes_left = partLen;
+ apr_xlate_conv_buffer(context->xlate, (const char *)input,
+ &inbytes_left,
+ (char *)&context->buffer[idx],
+ &outbytes_left);
+ }
+ else {
+ memcpy(&context->buffer[idx], input, partLen);
+ }
+ MD5Transform(context->state, context->buffer);
+
+ for (i = partLen; i + 63 < inputLen; i += 64) {
+ if (context->xlate && (xlate_buffer == DO_XLATE)) {
+ unsigned char inp_tmp[64];
+ inbytes_left = outbytes_left = 64;
+ apr_xlate_conv_buffer(context->xlate, (const char *)&input[i],
+ &inbytes_left, (char *)inp_tmp,
+ &outbytes_left);
+ MD5Transform(context->state, inp_tmp);
+ }
+ else {
+ MD5Transform(context->state, &input[i]);
+ }
+ }
+
+ idx = 0;
+ }
+ else
+ i = 0;
+
+ /* Buffer remaining input */
+ if (context->xlate && (xlate_buffer == DO_XLATE)) {
+ inbytes_left = outbytes_left = inputLen - i;
+ apr_xlate_conv_buffer(context->xlate, (const char *)&input[i],
+ &inbytes_left, (char *)&context->buffer[idx],
+ &outbytes_left);
+ }
+ else {
+ memcpy(&context->buffer[idx], &input[i], inputLen - i);
+ }
+#endif /*APR_HAS_XLATE*/
+ return APR_SUCCESS;
+}
+
+/* MD5 block update operation. API with the default setting
+ * for EBCDIC translations
+ */
+APU_DECLARE(apr_status_t) apr_md5_update(apr_md5_ctx_t *context,
+ const void *input,
+ apr_size_t inputLen)
+{
+ return md5_update_buffer(context, input, inputLen, DO_XLATE);
+}
+
+/* MD5 finalization. Ends an MD5 message-digest operation, writing the
+ * the message digest and zeroizing the context.
+ */
+APU_DECLARE(apr_status_t) apr_md5_final(unsigned char digest[APR_MD5_DIGESTSIZE],
+ apr_md5_ctx_t *context)
+{
+ unsigned char bits[8];
+ unsigned int idx, padLen;
+
+ /* Save number of bits */
+ Encode(bits, context->count, 8);
+
+#if APR_HAS_XLATE
+ /* apr_md5_update() should not translate for this final round. */
+ context->xlate = NULL;
+#endif /*APR_HAS_XLATE*/
+
+ /* Pad out to 56 mod 64. */
+ idx = (unsigned int)((context->count[0] >> 3) & 0x3f);
+ padLen = (idx < 56) ? (56 - idx) : (120 - idx);
+ apr_md5_update(context, PADDING, padLen);
+
+ /* Append length (before padding) */
+ apr_md5_update(context, bits, 8);
+
+ /* Store state in digest */
+ Encode(digest, context->state, APR_MD5_DIGESTSIZE);
+
+ /* Zeroize sensitive information. */
+ memset(context, 0, sizeof(*context));
+
+ return APR_SUCCESS;
+}
+
+/* MD5 in one step (init, update, final)
+ */
+APU_DECLARE(apr_status_t) apr_md5(unsigned char digest[APR_MD5_DIGESTSIZE],
+ const void *_input,
+ apr_size_t inputLen)
+{
+ const unsigned char *input = _input;
+ apr_md5_ctx_t ctx;
+ apr_status_t rv;
+
+ apr_md5_init(&ctx);
+
+ if ((rv = apr_md5_update(&ctx, input, inputLen)) != APR_SUCCESS)
+ return rv;
+
+ return apr_md5_final(digest, &ctx);
+}
+
+/* MD5 basic transformation. Transforms state based on block. */
+static void MD5Transform(apr_uint32_t state[4], const unsigned char block[64])
+{
+ apr_uint32_t a = state[0], b = state[1], c = state[2], d = state[3],
+ tmpbuf[APR_MD5_DIGESTSIZE];
+ const apr_uint32_t *x;
+
+#if !APR_IS_BIGENDIAN
+ if ((apr_uintptr_t)block % sizeof(apr_uint32_t) == 0) {
+ x = (apr_uint32_t *)block;
+ } else
+#endif
+ {
+ Decode(tmpbuf, block, 64);
+ x = tmpbuf;
+ }
+
+ /* Round 1 */
+ FF(a, b, c, d, x[0], S11, 0xd76aa478); /* 1 */
+ FF(d, a, b, c, x[1], S12, 0xe8c7b756); /* 2 */
+ FF(c, d, a, b, x[2], S13, 0x242070db); /* 3 */
+ FF(b, c, d, a, x[3], S14, 0xc1bdceee); /* 4 */
+ FF(a, b, c, d, x[4], S11, 0xf57c0faf); /* 5 */
+ FF(d, a, b, c, x[5], S12, 0x4787c62a); /* 6 */
+ FF(c, d, a, b, x[6], S13, 0xa8304613); /* 7 */
+ FF(b, c, d, a, x[7], S14, 0xfd469501); /* 8 */
+ FF(a, b, c, d, x[8], S11, 0x698098d8); /* 9 */
+ FF(d, a, b, c, x[9], S12, 0x8b44f7af); /* 10 */
+ FF(c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
+ FF(b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
+ FF(a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
+ FF(d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
+ FF(c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
+ FF(b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
+
+ /* Round 2 */
+ GG(a, b, c, d, x[1], S21, 0xf61e2562); /* 17 */
+ GG(d, a, b, c, x[6], S22, 0xc040b340); /* 18 */
+ GG(c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
+ GG(b, c, d, a, x[0], S24, 0xe9b6c7aa); /* 20 */
+ GG(a, b, c, d, x[5], S21, 0xd62f105d); /* 21 */
+ GG(d, a, b, c, x[10], S22, 0x2441453); /* 22 */
+ GG(c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
+ GG(b, c, d, a, x[4], S24, 0xe7d3fbc8); /* 24 */
+ GG(a, b, c, d, x[9], S21, 0x21e1cde6); /* 25 */
+ GG(d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
+ GG(c, d, a, b, x[3], S23, 0xf4d50d87); /* 27 */
+ GG(b, c, d, a, x[8], S24, 0x455a14ed); /* 28 */
+ GG(a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
+ GG(d, a, b, c, x[2], S22, 0xfcefa3f8); /* 30 */
+ GG(c, d, a, b, x[7], S23, 0x676f02d9); /* 31 */
+ GG(b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
+
+ /* Round 3 */
+ HH(a, b, c, d, x[5], S31, 0xfffa3942); /* 33 */
+ HH(d, a, b, c, x[8], S32, 0x8771f681); /* 34 */
+ HH(c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
+ HH(b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
+ HH(a, b, c, d, x[1], S31, 0xa4beea44); /* 37 */
+ HH(d, a, b, c, x[4], S32, 0x4bdecfa9); /* 38 */
+ HH(c, d, a, b, x[7], S33, 0xf6bb4b60); /* 39 */
+ HH(b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
+ HH(a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
+ HH(d, a, b, c, x[0], S32, 0xeaa127fa); /* 42 */
+ HH(c, d, a, b, x[3], S33, 0xd4ef3085); /* 43 */
+ HH(b, c, d, a, x[6], S34, 0x4881d05); /* 44 */
+ HH(a, b, c, d, x[9], S31, 0xd9d4d039); /* 45 */
+ HH(d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
+ HH(c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
+ HH(b, c, d, a, x[2], S34, 0xc4ac5665); /* 48 */
+
+ /* Round 4 */
+ II(a, b, c, d, x[0], S41, 0xf4292244); /* 49 */
+ II(d, a, b, c, x[7], S42, 0x432aff97); /* 50 */
+ II(c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
+ II(b, c, d, a, x[5], S44, 0xfc93a039); /* 52 */
+ II(a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
+ II(d, a, b, c, x[3], S42, 0x8f0ccc92); /* 54 */
+ II(c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
+ II(b, c, d, a, x[1], S44, 0x85845dd1); /* 56 */
+ II(a, b, c, d, x[8], S41, 0x6fa87e4f); /* 57 */
+ II(d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
+ II(c, d, a, b, x[6], S43, 0xa3014314); /* 59 */
+ II(b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
+ II(a, b, c, d, x[4], S41, 0xf7537e82); /* 61 */
+ II(d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
+ II(c, d, a, b, x[2], S43, 0x2ad7d2bb); /* 63 */
+ II(b, c, d, a, x[9], S44, 0xeb86d391); /* 64 */
+
+ state[0] += a;
+ state[1] += b;
+ state[2] += c;
+ state[3] += d;
+
+#if !APR_IS_BIGENDIAN
+ if (x == tmpbuf)
+#endif
+ {
+ /* Zeroize sensitive information. */
+ memset(tmpbuf, 0, sizeof(tmpbuf));
+ }
+}
+
+/* Encodes input (apr_uint32_t) into output (unsigned char). Assumes len is
+ * a multiple of 4.
+ */
+static void Encode(unsigned char *output, const apr_uint32_t *input,
+ unsigned int len)
+{
+ unsigned int i, j;
+ apr_uint32_t k;
+
+ for (i = 0, j = 0; j < len; i++, j += 4) {
+ k = input[i];
+ output[j] = (unsigned char)(k & 0xff);
+ output[j + 1] = (unsigned char)((k >> 8) & 0xff);
+ output[j + 2] = (unsigned char)((k >> 16) & 0xff);
+ output[j + 3] = (unsigned char)((k >> 24) & 0xff);
+ }
+}
+
+/* Decodes input (unsigned char) into output (apr_uint32_t). Assumes len is
+ * a multiple of 4.
+ */
+static void Decode(apr_uint32_t *output, const unsigned char *input,
+ unsigned int len)
+{
+ unsigned int i, j;
+
+ for (i = 0, j = 0; j < len; i++, j += 4)
+ output[i] = ((apr_uint32_t)input[j]) |
+ (((apr_uint32_t)input[j + 1]) << 8) |
+ (((apr_uint32_t)input[j + 2]) << 16) |
+ (((apr_uint32_t)input[j + 3]) << 24);
+}
+
+#if APR_CHARSET_EBCDIC
+APU_DECLARE(apr_status_t) apr_MD5InitEBCDIC(apr_xlate_t *xlate)
+{
+ xlate_ebcdic_to_ascii = xlate;
+ return APR_SUCCESS;
+}
+#endif
+
+/*
+ * Define the Magic String prefix that identifies a password as being
+ * hashed using our algorithm.
+ */
+static const char * const apr1_id = "$apr1$";
+
+/*
+ * The following MD5 password encryption code was largely borrowed from
+ * the FreeBSD 3.0 /usr/src/lib/libcrypt/crypt.c file, which is
+ * licenced as stated at the top of this file.
+ */
+
+static void to64(char *s, unsigned long v, int n)
+{
+ static unsigned char itoa64[] = /* 0 ... 63 => ASCII - 64 */
+ "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+
+ while (--n >= 0) {
+ *s++ = itoa64[v&0x3f];
+ v >>= 6;
+ }
+}
+
+APU_DECLARE(apr_status_t) apr_md5_encode(const char *pw, const char *salt,
+ char *result, apr_size_t nbytes)
+{
+ /*
+ * Minimum size is 8 bytes for salt, plus 1 for the trailing NUL,
+ * plus 4 for the '$' separators, plus the password hash itself.
+ * Let's leave a goodly amount of leeway.
+ */
+
+ char passwd[120], *p;
+ const char *sp, *ep;
+ unsigned char final[APR_MD5_DIGESTSIZE];
+ apr_ssize_t sl, pl, i;
+ apr_md5_ctx_t ctx, ctx1;
+ unsigned long l;
+
+ /*
+ * Refine the salt first. It's possible we were given an already-hashed
+ * string as the salt argument, so extract the actual salt value from it
+ * if so. Otherwise just use the string up to the first '$' as the salt.
+ */
+ sp = salt;
+
+ /*
+ * If it starts with the magic string, then skip that.
+ */
+ if (!strncmp(sp, apr1_id, strlen(apr1_id))) {
+ sp += strlen(apr1_id);
+ }
+
+ /*
+ * It stops at the first '$' or 8 chars, whichever comes first
+ */
+ for (ep = sp; (*ep != '\0') && (*ep != '$') && (ep < (sp + 8)); ep++) {
+ continue;
+ }
+
+ /*
+ * Get the length of the true salt
+ */
+ sl = ep - sp;
+
+ /*
+ * 'Time to make the doughnuts..'
+ */
+ apr_md5_init(&ctx);
+#if APR_CHARSET_EBCDIC
+ apr_md5_set_xlate(&ctx, xlate_ebcdic_to_ascii);
+#endif
+
+ /*
+ * The password first, since that is what is most unknown
+ */
+ apr_md5_update(&ctx, pw, strlen(pw));
+
+ /*
+ * Then our magic string
+ */
+ apr_md5_update(&ctx, apr1_id, strlen(apr1_id));
+
+ /*
+ * Then the raw salt
+ */
+ apr_md5_update(&ctx, sp, sl);
+
+ /*
+ * Then just as many characters of the MD5(pw, salt, pw)
+ */
+ apr_md5_init(&ctx1);
+#if APR_CHARSET_EBCDIC
+ apr_md5_set_xlate(&ctx1, xlate_ebcdic_to_ascii);
+#endif
+ apr_md5_update(&ctx1, pw, strlen(pw));
+ apr_md5_update(&ctx1, sp, sl);
+ apr_md5_update(&ctx1, pw, strlen(pw));
+ apr_md5_final(final, &ctx1);
+ for (pl = strlen(pw); pl > 0; pl -= APR_MD5_DIGESTSIZE) {
+ md5_update_buffer(&ctx, final,
+ (pl > APR_MD5_DIGESTSIZE) ? APR_MD5_DIGESTSIZE : pl, SKIP_XLATE);
+ }
+
+ /*
+ * Don't leave anything around in vm they could use.
+ */
+ memset(final, 0, sizeof(final));
+
+ /*
+ * Then something really weird...
+ */
+ for (i = strlen(pw); i != 0; i >>= 1) {
+ if (i & 1) {
+ md5_update_buffer(&ctx, final, 1, SKIP_XLATE);
+ }
+ else {
+ apr_md5_update(&ctx, pw, 1);
+ }
+ }
+
+ /*
+ * Now make the output string. We know our limitations, so we
+ * can use the string routines without bounds checking.
+ */
+ strcpy(passwd, apr1_id);
+ strncat(passwd, sp, sl);
+ strcat(passwd, "$");
+
+ apr_md5_final(final, &ctx);
+
+ /*
+ * And now, just to make sure things don't run too fast..
+ * On a 60 Mhz Pentium this takes 34 msec, so you would
+ * need 30 seconds to build a 1000 entry dictionary...
+ */
+ for (i = 0; i < 1000; i++) {
+ apr_md5_init(&ctx1);
+ /*
+ * apr_md5_final clears out ctx1.xlate at the end of each loop,
+ * so need to to set it each time through
+ */
+#if APR_CHARSET_EBCDIC
+ apr_md5_set_xlate(&ctx1, xlate_ebcdic_to_ascii);
+#endif
+ if (i & 1) {
+ apr_md5_update(&ctx1, pw, strlen(pw));
+ }
+ else {
+ md5_update_buffer(&ctx1, final, APR_MD5_DIGESTSIZE, SKIP_XLATE);
+ }
+ if (i % 3) {
+ apr_md5_update(&ctx1, sp, sl);
+ }
+
+ if (i % 7) {
+ apr_md5_update(&ctx1, pw, strlen(pw));
+ }
+
+ if (i & 1) {
+ md5_update_buffer(&ctx1, final, APR_MD5_DIGESTSIZE, SKIP_XLATE);
+ }
+ else {
+ apr_md5_update(&ctx1, pw, strlen(pw));
+ }
+ apr_md5_final(final,&ctx1);
+ }
+
+ p = passwd + strlen(passwd);
+
+ l = (final[ 0]<<16) | (final[ 6]<<8) | final[12]; to64(p, l, 4); p += 4;
+ l = (final[ 1]<<16) | (final[ 7]<<8) | final[13]; to64(p, l, 4); p += 4;
+ l = (final[ 2]<<16) | (final[ 8]<<8) | final[14]; to64(p, l, 4); p += 4;
+ l = (final[ 3]<<16) | (final[ 9]<<8) | final[15]; to64(p, l, 4); p += 4;
+ l = (final[ 4]<<16) | (final[10]<<8) | final[ 5]; to64(p, l, 4); p += 4;
+ l = final[11] ; to64(p, l, 2); p += 2;
+ *p = '\0';
+
+ /*
+ * Don't leave anything around in vm they could use.
+ */
+ memset(final, 0, sizeof(final));
+
+ apr_cpystrn(result, passwd, nbytes - 1);
+ return APR_SUCCESS;
+}
diff --git a/contrib/apr-util/crypto/apr_passwd.c b/contrib/apr-util/crypto/apr_passwd.c
new file mode 100644
index 000000000000..c961de2b9349
--- /dev/null
+++ b/contrib/apr-util/crypto/apr_passwd.c
@@ -0,0 +1,200 @@
+/* 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"
+#include "apr_md5.h"
+#include "apr_lib.h"
+#include "apr_sha1.h"
+#include "apu_config.h"
+#include "crypt_blowfish.h"
+
+#if APR_HAVE_STRING_H
+#include <string.h>
+#endif
+#if APR_HAVE_CRYPT_H
+#include <crypt.h>
+#endif
+#if APR_HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#if APR_HAVE_PTHREAD_H
+#include <pthread.h>
+#endif
+#if APR_HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+static const char * const apr1_id = "$apr1$";
+
+#if !defined(WIN32) && !defined(BEOS) && !defined(NETWARE)
+#if defined(APU_CRYPT_THREADSAFE) || !APR_HAS_THREADS || \
+ defined(CRYPT_R_CRYPTD) || defined(CRYPT_R_STRUCT_CRYPT_DATA)
+
+#define crypt_mutex_lock()
+#define crypt_mutex_unlock()
+
+#elif APR_HAVE_PTHREAD_H && defined(PTHREAD_MUTEX_INITIALIZER)
+
+static pthread_mutex_t crypt_mutex = PTHREAD_MUTEX_INITIALIZER;
+static void crypt_mutex_lock(void)
+{
+ pthread_mutex_lock(&crypt_mutex);
+}
+
+static void crypt_mutex_unlock(void)
+{
+ pthread_mutex_unlock(&crypt_mutex);
+}
+
+#else
+
+#error apr_password_validate() is not threadsafe. rebuild APR without thread support.
+
+#endif
+#endif
+
+#if defined(WIN32) || defined(BEOS) || defined(NETWARE) || defined(__ANDROID__)
+#define CRYPT_MISSING 1
+#else
+#define CRYPT_MISSING 0
+#endif
+
+/*
+ * Validate a plaintext password against a smashed one. Uses either
+ * crypt() (if available) or apr_md5_encode() or apr_sha1_base64(), depending
+ * upon the format of the smashed input password. Returns APR_SUCCESS if
+ * they match, or APR_EMISMATCH if they don't. If the platform doesn't
+ * support crypt, then the default check is against a clear text string.
+ */
+APU_DECLARE(apr_status_t) apr_password_validate(const char *passwd,
+ const char *hash)
+{
+ char sample[200];
+#if !CRYPT_MISSING
+ char *crypt_pw;
+#endif
+ if (hash[0] == '$'
+ && hash[1] == '2'
+ && (hash[2] == 'a' || hash[2] == 'y')
+ && hash[3] == '$') {
+ if (_crypt_blowfish_rn(passwd, hash, sample, sizeof(sample)) == NULL)
+ return APR_FROM_OS_ERROR(errno);
+ }
+ else if (!strncmp(hash, apr1_id, strlen(apr1_id))) {
+ /*
+ * The hash was created using our custom algorithm.
+ */
+ apr_md5_encode(passwd, hash, sample, sizeof(sample));
+ }
+ else if (!strncmp(hash, APR_SHA1PW_ID, APR_SHA1PW_IDLEN)) {
+ apr_sha1_base64(passwd, (int)strlen(passwd), sample);
+ }
+ else {
+ /*
+ * It's not our algorithm, so feed it to crypt() if possible.
+ */
+#if CRYPT_MISSING
+ return (strcmp(passwd, hash) == 0) ? APR_SUCCESS : APR_EMISMATCH;
+#elif defined(CRYPT_R_CRYPTD)
+ apr_status_t rv;
+ CRYPTD *buffer = malloc(sizeof(*buffer));
+
+ if (buffer == NULL)
+ return APR_ENOMEM;
+ crypt_pw = crypt_r(passwd, hash, buffer);
+ if (!crypt_pw)
+ rv = APR_EMISMATCH;
+ else
+ rv = (strcmp(crypt_pw, hash) == 0) ? APR_SUCCESS : APR_EMISMATCH;
+ free(buffer);
+ return rv;
+#elif defined(CRYPT_R_STRUCT_CRYPT_DATA)
+ apr_status_t rv;
+ struct crypt_data *buffer = malloc(sizeof(*buffer));
+
+ if (buffer == NULL)
+ return APR_ENOMEM;
+
+#ifdef __GLIBC_PREREQ
+ /*
+ * For not too old glibc (>= 2.3.2), it's enough to set
+ * buffer.initialized = 0. For < 2.3.2 and for other platforms,
+ * we need to zero the whole struct.
+ */
+#if __GLIBC_PREREQ(2,4)
+#define USE_CRYPT_DATA_INITALIZED
+#endif
+#endif
+
+#ifdef USE_CRYPT_DATA_INITALIZED
+ buffer->initialized = 0;
+#else
+ memset(buffer, 0, sizeof(*buffer));
+#endif
+
+ crypt_pw = crypt_r(passwd, hash, buffer);
+ if (!crypt_pw)
+ rv = APR_EMISMATCH;
+ else
+ rv = (strcmp(crypt_pw, hash) == 0) ? APR_SUCCESS : APR_EMISMATCH;
+ free(buffer);
+ return rv;
+#else
+ /* Do a bit of sanity checking since we know that crypt_r()
+ * should always be used for threaded builds on AIX, and
+ * problems in configure logic can result in the wrong
+ * choice being made.
+ */
+#if defined(_AIX) && APR_HAS_THREADS
+#error Configuration error! crypt_r() should have been selected!
+#endif
+ {
+ apr_status_t rv;
+
+ /* Handle thread safety issues by holding a mutex around the
+ * call to crypt().
+ */
+ crypt_mutex_lock();
+ crypt_pw = crypt(passwd, hash);
+ if (!crypt_pw) {
+ rv = APR_EMISMATCH;
+ }
+ else {
+ rv = (strcmp(crypt_pw, hash) == 0) ? APR_SUCCESS : APR_EMISMATCH;
+ }
+ crypt_mutex_unlock();
+ return rv;
+ }
+#endif
+ }
+ return (strcmp(sample, hash) == 0) ? APR_SUCCESS : APR_EMISMATCH;
+}
+
+static const char * const bcrypt_id = "$2y$";
+APU_DECLARE(apr_status_t) apr_bcrypt_encode(const char *pw,
+ unsigned int count,
+ const unsigned char *salt,
+ apr_size_t salt_len,
+ char *out, apr_size_t out_len)
+{
+ char setting[40];
+ if (_crypt_gensalt_blowfish_rn(bcrypt_id, count, (const char *)salt,
+ salt_len, setting, sizeof(setting)) == NULL)
+ return APR_FROM_OS_ERROR(errno);
+ if (_crypt_blowfish_rn(pw, setting, out, out_len) == NULL)
+ return APR_FROM_OS_ERROR(errno);
+ return APR_SUCCESS;
+}
diff --git a/contrib/apr-util/crypto/apr_sha1.c b/contrib/apr-util/crypto/apr_sha1.c
new file mode 100644
index 000000000000..8959ffc09d4b
--- /dev/null
+++ b/contrib/apr-util/crypto/apr_sha1.c
@@ -0,0 +1,368 @@
+/* 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.
+ */
+
+/*
+ * The exported function:
+ *
+ * apr_sha1_base64(const char *clear, int len, char *out);
+ *
+ * provides a means to SHA1 crypt/encode a plaintext password in
+ * a way which makes password files compatible with those commonly
+ * used in netscape web and ldap installations. It was put together
+ * by Clinton Wong <clintdw@netcom.com>, who also notes that:
+ *
+ * Note: SHA1 support is useful for migration purposes, but is less
+ * secure than Apache's password format, since Apache's (MD5)
+ * password format uses a random eight character salt to generate
+ * one of many possible hashes for the same password. Netscape
+ * uses plain SHA1 without a salt, so the same password
+ * will always generate the same hash, making it easier
+ * to break since the search space is smaller.
+ *
+ * See also the documentation in support/SHA1 as to hints on how to
+ * migrate an existing netscape installation and other supplied utitlites.
+ *
+ * This software also makes use of the following component:
+ *
+ * NIST Secure Hash Algorithm
+ * heavily modified by Uwe Hollerbach uh@alumni.caltech edu
+ * from Peter C. Gutmann's implementation as found in
+ * Applied Cryptography by Bruce Schneier
+ * This code is hereby placed in the public domain
+ */
+
+#include "apr_sha1.h"
+#include "apr_base64.h"
+#include "apr_strings.h"
+#include "apr_lib.h"
+#if APR_CHARSET_EBCDIC
+#include "apr_xlate.h"
+#endif /*APR_CHARSET_EBCDIC*/
+#include <string.h>
+
+/* a bit faster & bigger, if defined */
+#define UNROLL_LOOPS
+
+/* NIST's proposed modification to SHA, 7/11/94 */
+#define USE_MODIFIED_SHA
+
+/* SHA f()-functions */
+#define f1(x,y,z) ((x & y) | (~x & z))
+#define f2(x,y,z) (x ^ y ^ z)
+#define f3(x,y,z) ((x & y) | (x & z) | (y & z))
+#define f4(x,y,z) (x ^ y ^ z)
+
+/* SHA constants */
+#define CONST1 0x5a827999L
+#define CONST2 0x6ed9eba1L
+#define CONST3 0x8f1bbcdcL
+#define CONST4 0xca62c1d6L
+
+/* 32-bit rotate */
+
+#define ROT32(x,n) ((x << n) | (x >> (32 - n)))
+
+#define FUNC(n,i) \
+ temp = ROT32(A,5) + f##n(B,C,D) + E + W[i] + CONST##n; \
+ E = D; D = C; C = ROT32(B,30); B = A; A = temp
+
+#define SHA_BLOCKSIZE 64
+
+#if APR_CHARSET_EBCDIC
+static apr_xlate_t *ebcdic2ascii_xlate;
+
+APU_DECLARE(apr_status_t) apr_SHA1InitEBCDIC(apr_xlate_t *x)
+{
+ apr_status_t rv;
+ int onoff;
+
+ /* Only single-byte conversion is supported.
+ */
+ rv = apr_xlate_sb_get(x, &onoff);
+ if (rv) {
+ return rv;
+ }
+ if (!onoff) { /* If conversion is not single-byte-only */
+ return APR_EINVAL;
+ }
+ ebcdic2ascii_xlate = x;
+ return APR_SUCCESS;
+}
+#endif
+
+/* do SHA transformation */
+static void sha_transform(apr_sha1_ctx_t *sha_info)
+{
+ int i;
+ apr_uint32_t temp, A, B, C, D, E, W[80];
+
+ for (i = 0; i < 16; ++i) {
+ W[i] = sha_info->data[i];
+ }
+ for (i = 16; i < 80; ++i) {
+ W[i] = W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16];
+#ifdef USE_MODIFIED_SHA
+ W[i] = ROT32(W[i], 1);
+#endif /* USE_MODIFIED_SHA */
+ }
+ A = sha_info->digest[0];
+ B = sha_info->digest[1];
+ C = sha_info->digest[2];
+ D = sha_info->digest[3];
+ E = sha_info->digest[4];
+#ifdef UNROLL_LOOPS
+ FUNC(1, 0); FUNC(1, 1); FUNC(1, 2); FUNC(1, 3); FUNC(1, 4);
+ FUNC(1, 5); FUNC(1, 6); FUNC(1, 7); FUNC(1, 8); FUNC(1, 9);
+ FUNC(1,10); FUNC(1,11); FUNC(1,12); FUNC(1,13); FUNC(1,14);
+ FUNC(1,15); FUNC(1,16); FUNC(1,17); FUNC(1,18); FUNC(1,19);
+
+ FUNC(2,20); FUNC(2,21); FUNC(2,22); FUNC(2,23); FUNC(2,24);
+ FUNC(2,25); FUNC(2,26); FUNC(2,27); FUNC(2,28); FUNC(2,29);
+ FUNC(2,30); FUNC(2,31); FUNC(2,32); FUNC(2,33); FUNC(2,34);
+ FUNC(2,35); FUNC(2,36); FUNC(2,37); FUNC(2,38); FUNC(2,39);
+
+ FUNC(3,40); FUNC(3,41); FUNC(3,42); FUNC(3,43); FUNC(3,44);
+ FUNC(3,45); FUNC(3,46); FUNC(3,47); FUNC(3,48); FUNC(3,49);
+ FUNC(3,50); FUNC(3,51); FUNC(3,52); FUNC(3,53); FUNC(3,54);
+ FUNC(3,55); FUNC(3,56); FUNC(3,57); FUNC(3,58); FUNC(3,59);
+
+ FUNC(4,60); FUNC(4,61); FUNC(4,62); FUNC(4,63); FUNC(4,64);
+ FUNC(4,65); FUNC(4,66); FUNC(4,67); FUNC(4,68); FUNC(4,69);
+ FUNC(4,70); FUNC(4,71); FUNC(4,72); FUNC(4,73); FUNC(4,74);
+ FUNC(4,75); FUNC(4,76); FUNC(4,77); FUNC(4,78); FUNC(4,79);
+#else /* !UNROLL_LOOPS */
+ for (i = 0; i < 20; ++i) {
+ FUNC(1,i);
+ }
+ for (i = 20; i < 40; ++i) {
+ FUNC(2,i);
+ }
+ for (i = 40; i < 60; ++i) {
+ FUNC(3,i);
+ }
+ for (i = 60; i < 80; ++i) {
+ FUNC(4,i);
+ }
+#endif /* !UNROLL_LOOPS */
+ sha_info->digest[0] += A;
+ sha_info->digest[1] += B;
+ sha_info->digest[2] += C;
+ sha_info->digest[3] += D;
+ sha_info->digest[4] += E;
+}
+
+union endianTest {
+ long Long;
+ char Char[sizeof(long)];
+};
+
+static char isLittleEndian(void)
+{
+ static union endianTest u;
+ u.Long = 1;
+ return (u.Char[0] == 1);
+}
+
+/* change endianness of data */
+
+/* count is the number of bytes to do an endian flip */
+static void maybe_byte_reverse(apr_uint32_t *buffer, int count)
+{
+ int i;
+ apr_byte_t ct[4], *cp;
+
+ if (isLittleEndian()) { /* do the swap only if it is little endian */
+ count /= sizeof(apr_uint32_t);
+ cp = (apr_byte_t *) buffer;
+ for (i = 0; i < count; ++i) {
+ ct[0] = cp[0];
+ ct[1] = cp[1];
+ ct[2] = cp[2];
+ ct[3] = cp[3];
+ cp[0] = ct[3];
+ cp[1] = ct[2];
+ cp[2] = ct[1];
+ cp[3] = ct[0];
+ cp += sizeof(apr_uint32_t);
+ }
+ }
+}
+
+/* initialize the SHA digest */
+
+APU_DECLARE(void) apr_sha1_init(apr_sha1_ctx_t *sha_info)
+{
+ sha_info->digest[0] = 0x67452301L;
+ sha_info->digest[1] = 0xefcdab89L;
+ sha_info->digest[2] = 0x98badcfeL;
+ sha_info->digest[3] = 0x10325476L;
+ sha_info->digest[4] = 0xc3d2e1f0L;
+ sha_info->count_lo = 0L;
+ sha_info->count_hi = 0L;
+ sha_info->local = 0;
+}
+
+/* update the SHA digest */
+
+APU_DECLARE(void) apr_sha1_update_binary(apr_sha1_ctx_t *sha_info,
+ const unsigned char *buffer,
+ unsigned int count)
+{
+ unsigned int i;
+
+ if ((sha_info->count_lo + ((apr_uint32_t) count << 3)) < sha_info->count_lo) {
+ ++sha_info->count_hi;
+ }
+ sha_info->count_lo += (apr_uint32_t) count << 3;
+ sha_info->count_hi += (apr_uint32_t) count >> 29;
+ if (sha_info->local) {
+ i = SHA_BLOCKSIZE - sha_info->local;
+ if (i > count) {
+ i = count;
+ }
+ memcpy(((apr_byte_t *) sha_info->data) + sha_info->local, buffer, i);
+ count -= i;
+ buffer += i;
+ sha_info->local += i;
+ if (sha_info->local == SHA_BLOCKSIZE) {
+ maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
+ sha_transform(sha_info);
+ }
+ else {
+ return;
+ }
+ }
+ while (count >= SHA_BLOCKSIZE) {
+ memcpy(sha_info->data, buffer, SHA_BLOCKSIZE);
+ buffer += SHA_BLOCKSIZE;
+ count -= SHA_BLOCKSIZE;
+ maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
+ sha_transform(sha_info);
+ }
+ memcpy(sha_info->data, buffer, count);
+ sha_info->local = count;
+}
+
+APU_DECLARE(void) apr_sha1_update(apr_sha1_ctx_t *sha_info, const char *buf,
+ unsigned int count)
+{
+#if APR_CHARSET_EBCDIC
+ int i;
+ const apr_byte_t *buffer = (const apr_byte_t *) buf;
+ apr_size_t inbytes_left, outbytes_left;
+
+ if ((sha_info->count_lo + ((apr_uint32_t) count << 3)) < sha_info->count_lo) {
+ ++sha_info->count_hi;
+ }
+ sha_info->count_lo += (apr_uint32_t) count << 3;
+ sha_info->count_hi += (apr_uint32_t) count >> 29;
+ /* Is there a remainder of the previous Update operation? */
+ if (sha_info->local) {
+ i = SHA_BLOCKSIZE - sha_info->local;
+ if (i > count) {
+ i = count;
+ }
+ inbytes_left = outbytes_left = i;
+ apr_xlate_conv_buffer(ebcdic2ascii_xlate, buffer, &inbytes_left,
+ ((apr_byte_t *) sha_info->data) + sha_info->local,
+ &outbytes_left);
+ count -= i;
+ buffer += i;
+ sha_info->local += i;
+ if (sha_info->local == SHA_BLOCKSIZE) {
+ maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
+ sha_transform(sha_info);
+ }
+ else {
+ return;
+ }
+ }
+ while (count >= SHA_BLOCKSIZE) {
+ inbytes_left = outbytes_left = SHA_BLOCKSIZE;
+ apr_xlate_conv_buffer(ebcdic2ascii_xlate, buffer, &inbytes_left,
+ (apr_byte_t *) sha_info->data, &outbytes_left);
+ buffer += SHA_BLOCKSIZE;
+ count -= SHA_BLOCKSIZE;
+ maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
+ sha_transform(sha_info);
+ }
+ inbytes_left = outbytes_left = count;
+ apr_xlate_conv_buffer(ebcdic2ascii_xlate, buffer, &inbytes_left,
+ (apr_byte_t *) sha_info->data, &outbytes_left);
+ sha_info->local = count;
+#else
+ apr_sha1_update_binary(sha_info, (const unsigned char *) buf, count);
+#endif
+}
+
+/* finish computing the SHA digest */
+
+APU_DECLARE(void) apr_sha1_final(unsigned char digest[APR_SHA1_DIGESTSIZE],
+ apr_sha1_ctx_t *sha_info)
+{
+ int count, i, j;
+ apr_uint32_t lo_bit_count, hi_bit_count, k;
+
+ lo_bit_count = sha_info->count_lo;
+ hi_bit_count = sha_info->count_hi;
+ count = (int) ((lo_bit_count >> 3) & 0x3f);
+ ((apr_byte_t *) sha_info->data)[count++] = 0x80;
+ if (count > SHA_BLOCKSIZE - 8) {
+ memset(((apr_byte_t *) sha_info->data) + count, 0, SHA_BLOCKSIZE - count);
+ maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
+ sha_transform(sha_info);
+ memset((apr_byte_t *) sha_info->data, 0, SHA_BLOCKSIZE - 8);
+ }
+ else {
+ memset(((apr_byte_t *) sha_info->data) + count, 0,
+ SHA_BLOCKSIZE - 8 - count);
+ }
+ maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
+ sha_info->data[14] = hi_bit_count;
+ sha_info->data[15] = lo_bit_count;
+ sha_transform(sha_info);
+
+ for (i = 0, j = 0; j < APR_SHA1_DIGESTSIZE; i++) {
+ k = sha_info->digest[i];
+ digest[j++] = (unsigned char) ((k >> 24) & 0xff);
+ digest[j++] = (unsigned char) ((k >> 16) & 0xff);
+ digest[j++] = (unsigned char) ((k >> 8) & 0xff);
+ digest[j++] = (unsigned char) (k & 0xff);
+ }
+}
+
+
+APU_DECLARE(void) apr_sha1_base64(const char *clear, int len, char *out)
+{
+ int l;
+ apr_sha1_ctx_t context;
+ apr_byte_t digest[APR_SHA1_DIGESTSIZE];
+
+ apr_sha1_init(&context);
+ apr_sha1_update(&context, clear, len);
+ apr_sha1_final(digest, &context);
+
+ /* private marker. */
+ apr_cpystrn(out, APR_SHA1PW_ID, APR_SHA1PW_IDLEN + 1);
+
+ /* SHA1 hash is always 20 chars */
+ l = apr_base64_encode_binary(out + APR_SHA1PW_IDLEN, digest, sizeof(digest));
+ out[l + APR_SHA1PW_IDLEN] = '\0';
+
+ /*
+ * output of base64 encoded SHA1 is always 28 chars + APR_SHA1PW_IDLEN
+ */
+}
diff --git a/contrib/apr-util/crypto/crypt_blowfish.c b/contrib/apr-util/crypto/crypt_blowfish.c
new file mode 100644
index 000000000000..ec9a188b3a28
--- /dev/null
+++ b/contrib/apr-util/crypto/crypt_blowfish.c
@@ -0,0 +1,902 @@
+/*
+ * The crypt_blowfish homepage is:
+ *
+ * http://www.openwall.com/crypt/
+ *
+ * This code comes from John the Ripper password cracker, with reentrant
+ * and crypt(3) interfaces added, but optimizations specific to password
+ * cracking removed.
+ *
+ * Written by Solar Designer <solar at openwall.com> in 1998-2011.
+ * No copyright is claimed, and the software is hereby placed in the public
+ * domain. In case this attempt to disclaim copyright and place the software
+ * in the public domain is deemed null and void, then the software is
+ * Copyright (c) 1998-2011 Solar Designer and it is hereby released to the
+ * general public under the following terms:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted.
+ *
+ * There's ABSOLUTELY NO WARRANTY, express or implied.
+ *
+ * It is my intent that you should be able to use this on your system,
+ * as part of a software package, or anywhere else to improve security,
+ * ensure compatibility, or for any other purpose. I would appreciate
+ * it if you give credit where it is due and keep your modifications in
+ * the public domain as well, but I don't require that in order to let
+ * you place this code and any modifications you make under a license
+ * of your choice.
+ *
+ * This implementation is mostly compatible with OpenBSD's bcrypt.c (prefix
+ * "$2a$") by Niels Provos <provos at citi.umich.edu>, and uses some of his
+ * ideas. The password hashing algorithm was designed by David Mazieres
+ * <dm at lcs.mit.edu>. For more information on the level of compatibility,
+ * prefer refer to the comments in BF_set_key() below and to the included
+ * crypt(3) man page.
+ *
+ * There's a paper on the algorithm that explains its design decisions:
+ *
+ * http://www.usenix.org/events/usenix99/provos.html
+ *
+ * Some of the tricks in BF_ROUND might be inspired by Eric Young's
+ * Blowfish library (I can't be sure if I would think of something if I
+ * hadn't seen his code).
+ */
+
+#include <string.h>
+
+#include <errno.h>
+#ifndef __set_errno
+#define __set_errno(val) errno = (val)
+#endif
+
+/* Just to make sure the prototypes match the actual definitions */
+#include "crypt_blowfish.h"
+
+#ifdef __i386__
+#define BF_ASM 0
+#define BF_SCALE 1
+#elif defined(__x86_64__) || defined(__alpha__) || defined(__hppa__)
+#define BF_ASM 0
+#define BF_SCALE 1
+#else
+#define BF_ASM 0
+#define BF_SCALE 0
+#endif
+
+typedef unsigned int BF_word;
+typedef signed int BF_word_signed;
+
+/* Number of Blowfish rounds, this is also hardcoded into a few places */
+#define BF_N 16
+
+typedef BF_word BF_key[BF_N + 2];
+
+typedef struct {
+ BF_word S[4][0x100];
+ BF_key P;
+} BF_ctx;
+
+/*
+ * Magic IV for 64 Blowfish encryptions that we do at the end.
+ * The string is "OrpheanBeholderScryDoubt" on big-endian.
+ */
+static BF_word BF_magic_w[6] = {
+ 0x4F727068, 0x65616E42, 0x65686F6C,
+ 0x64657253, 0x63727944, 0x6F756274
+};
+
+/*
+ * P-box and S-box tables initialized with digits of Pi.
+ */
+static BF_ctx BF_init_state = {
+ {
+ {
+ 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
+ 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
+ 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
+ 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
+ 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
+ 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
+ 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
+ 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
+ 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
+ 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
+ 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
+ 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
+ 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
+ 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
+ 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
+ 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
+ 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
+ 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
+ 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
+ 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
+ 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
+ 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
+ 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
+ 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
+ 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
+ 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
+ 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
+ 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
+ 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
+ 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
+ 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
+ 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
+ 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
+ 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
+ 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
+ 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
+ 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
+ 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
+ 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
+ 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
+ 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
+ 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
+ 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
+ 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
+ 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
+ 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
+ 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
+ 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
+ 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
+ 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
+ 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
+ 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
+ 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
+ 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
+ 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
+ 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
+ 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
+ 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
+ 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
+ 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
+ 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
+ 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
+ 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
+ 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a
+ }, {
+ 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
+ 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
+ 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
+ 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
+ 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
+ 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
+ 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
+ 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
+ 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
+ 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
+ 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
+ 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
+ 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
+ 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
+ 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
+ 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
+ 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
+ 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
+ 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
+ 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
+ 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
+ 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
+ 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
+ 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
+ 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
+ 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
+ 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
+ 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
+ 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
+ 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
+ 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
+ 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
+ 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
+ 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
+ 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
+ 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
+ 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
+ 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
+ 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
+ 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
+ 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
+ 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
+ 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
+ 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
+ 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
+ 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
+ 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
+ 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
+ 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
+ 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
+ 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
+ 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
+ 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
+ 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
+ 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
+ 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
+ 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
+ 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
+ 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
+ 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
+ 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
+ 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
+ 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
+ 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7
+ }, {
+ 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
+ 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
+ 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
+ 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
+ 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
+ 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
+ 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
+ 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
+ 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
+ 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
+ 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
+ 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
+ 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
+ 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
+ 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
+ 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
+ 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
+ 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
+ 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
+ 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
+ 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
+ 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
+ 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
+ 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
+ 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
+ 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
+ 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
+ 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
+ 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
+ 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
+ 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
+ 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
+ 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
+ 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
+ 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
+ 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
+ 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
+ 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
+ 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
+ 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
+ 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
+ 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
+ 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
+ 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
+ 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
+ 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
+ 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
+ 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
+ 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
+ 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
+ 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
+ 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
+ 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
+ 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
+ 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
+ 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
+ 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
+ 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
+ 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
+ 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
+ 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
+ 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
+ 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
+ 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0
+ }, {
+ 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
+ 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
+ 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
+ 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
+ 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
+ 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
+ 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
+ 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
+ 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
+ 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
+ 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
+ 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
+ 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
+ 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
+ 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
+ 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
+ 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
+ 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
+ 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
+ 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
+ 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
+ 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
+ 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
+ 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
+ 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
+ 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
+ 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
+ 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
+ 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
+ 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
+ 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
+ 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
+ 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
+ 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
+ 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
+ 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
+ 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
+ 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
+ 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
+ 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
+ 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
+ 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
+ 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
+ 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
+ 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
+ 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
+ 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
+ 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
+ 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
+ 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
+ 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
+ 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
+ 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
+ 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
+ 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
+ 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
+ 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
+ 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
+ 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
+ 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
+ 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
+ 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
+ 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
+ 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6
+ }
+ }, {
+ 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
+ 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
+ 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
+ 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
+ 0x9216d5d9, 0x8979fb1b
+ }
+};
+
+static unsigned char BF_itoa64[64 + 1] =
+ "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+
+static unsigned char BF_atoi64[0x60] = {
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 1,
+ 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 64, 64, 64, 64, 64,
+ 64, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+ 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 64, 64, 64, 64, 64,
+ 64, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
+ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 64, 64, 64, 64, 64
+};
+
+#define BF_safe_atoi64(dst, src) \
+{ \
+ tmp = (unsigned char)(src); \
+ if ((unsigned int)(tmp -= 0x20) >= 0x60) return -1; \
+ tmp = BF_atoi64[tmp]; \
+ if (tmp > 63) return -1; \
+ (dst) = tmp; \
+}
+
+static int BF_decode(BF_word *dst, const char *src, int size)
+{
+ unsigned char *dptr = (unsigned char *)dst;
+ unsigned char *end = dptr + size;
+ const unsigned char *sptr = (const unsigned char *)src;
+ unsigned int tmp, c1, c2, c3, c4;
+
+ do {
+ BF_safe_atoi64(c1, *sptr++);
+ BF_safe_atoi64(c2, *sptr++);
+ *dptr++ = (c1 << 2) | ((c2 & 0x30) >> 4);
+ if (dptr >= end) break;
+
+ BF_safe_atoi64(c3, *sptr++);
+ *dptr++ = ((c2 & 0x0F) << 4) | ((c3 & 0x3C) >> 2);
+ if (dptr >= end) break;
+
+ BF_safe_atoi64(c4, *sptr++);
+ *dptr++ = ((c3 & 0x03) << 6) | c4;
+ } while (dptr < end);
+
+ return 0;
+}
+
+static void BF_encode(char *dst, const BF_word *src, int size)
+{
+ const unsigned char *sptr = (const unsigned char *)src;
+ const unsigned char *end = sptr + size;
+ unsigned char *dptr = (unsigned char *)dst;
+ unsigned int c1, c2;
+
+ do {
+ c1 = *sptr++;
+ *dptr++ = BF_itoa64[c1 >> 2];
+ c1 = (c1 & 0x03) << 4;
+ if (sptr >= end) {
+ *dptr++ = BF_itoa64[c1];
+ break;
+ }
+
+ c2 = *sptr++;
+ c1 |= c2 >> 4;
+ *dptr++ = BF_itoa64[c1];
+ c1 = (c2 & 0x0f) << 2;
+ if (sptr >= end) {
+ *dptr++ = BF_itoa64[c1];
+ break;
+ }
+
+ c2 = *sptr++;
+ c1 |= c2 >> 6;
+ *dptr++ = BF_itoa64[c1];
+ *dptr++ = BF_itoa64[c2 & 0x3f];
+ } while (sptr < end);
+}
+
+static void BF_swap(BF_word *x, int count)
+{
+ static int endianness_check = 1;
+ char *is_little_endian = (char *)&endianness_check;
+ BF_word tmp;
+
+ if (*is_little_endian)
+ do {
+ tmp = *x;
+ tmp = (tmp << 16) | (tmp >> 16);
+ *x++ = ((tmp & 0x00FF00FF) << 8) | ((tmp >> 8) & 0x00FF00FF);
+ } while (--count);
+}
+
+#if BF_SCALE
+/* Architectures which can shift addresses left by 2 bits with no extra cost */
+#define BF_ROUND(L, R, N) \
+ tmp1 = L & 0xFF; \
+ tmp2 = L >> 8; \
+ tmp2 &= 0xFF; \
+ tmp3 = L >> 16; \
+ tmp3 &= 0xFF; \
+ tmp4 = L >> 24; \
+ tmp1 = data.ctx.S[3][tmp1]; \
+ tmp2 = data.ctx.S[2][tmp2]; \
+ tmp3 = data.ctx.S[1][tmp3]; \
+ tmp3 += data.ctx.S[0][tmp4]; \
+ tmp3 ^= tmp2; \
+ R ^= data.ctx.P[N + 1]; \
+ tmp3 += tmp1; \
+ R ^= tmp3;
+#else
+/* Architectures with no complicated addressing modes supported */
+#define BF_INDEX(S, i) \
+ (*((BF_word *)(((unsigned char *)S) + (i))))
+#define BF_ROUND(L, R, N) \
+ tmp1 = L & 0xFF; \
+ tmp1 <<= 2; \
+ tmp2 = L >> 6; \
+ tmp2 &= 0x3FC; \
+ tmp3 = L >> 14; \
+ tmp3 &= 0x3FC; \
+ tmp4 = L >> 22; \
+ tmp4 &= 0x3FC; \
+ tmp1 = BF_INDEX(data.ctx.S[3], tmp1); \
+ tmp2 = BF_INDEX(data.ctx.S[2], tmp2); \
+ tmp3 = BF_INDEX(data.ctx.S[1], tmp3); \
+ tmp3 += BF_INDEX(data.ctx.S[0], tmp4); \
+ tmp3 ^= tmp2; \
+ R ^= data.ctx.P[N + 1]; \
+ tmp3 += tmp1; \
+ R ^= tmp3;
+#endif
+
+/*
+ * Encrypt one block, BF_N is hardcoded here.
+ */
+#define BF_ENCRYPT \
+ L ^= data.ctx.P[0]; \
+ BF_ROUND(L, R, 0); \
+ BF_ROUND(R, L, 1); \
+ BF_ROUND(L, R, 2); \
+ BF_ROUND(R, L, 3); \
+ BF_ROUND(L, R, 4); \
+ BF_ROUND(R, L, 5); \
+ BF_ROUND(L, R, 6); \
+ BF_ROUND(R, L, 7); \
+ BF_ROUND(L, R, 8); \
+ BF_ROUND(R, L, 9); \
+ BF_ROUND(L, R, 10); \
+ BF_ROUND(R, L, 11); \
+ BF_ROUND(L, R, 12); \
+ BF_ROUND(R, L, 13); \
+ BF_ROUND(L, R, 14); \
+ BF_ROUND(R, L, 15); \
+ tmp4 = R; \
+ R = L; \
+ L = tmp4 ^ data.ctx.P[BF_N + 1];
+
+#if BF_ASM
+#define BF_body() \
+ _BF_body_r(&data.ctx);
+#else
+#define BF_body() \
+ L = R = 0; \
+ ptr = data.ctx.P; \
+ do { \
+ ptr += 2; \
+ BF_ENCRYPT; \
+ *(ptr - 2) = L; \
+ *(ptr - 1) = R; \
+ } while (ptr < &data.ctx.P[BF_N + 2]); \
+\
+ ptr = data.ctx.S[0]; \
+ do { \
+ ptr += 2; \
+ BF_ENCRYPT; \
+ *(ptr - 2) = L; \
+ *(ptr - 1) = R; \
+ } while (ptr < &data.ctx.S[3][0xFF]);
+#endif
+
+static void BF_set_key(const char *key, BF_key expanded, BF_key initial,
+ unsigned char flags)
+{
+ const char *ptr = key;
+ unsigned int bug, i, j;
+ BF_word safety, sign, diff, tmp[2];
+
+/*
+ * There was a sign extension bug in older revisions of this function. While
+ * we would have liked to simply fix the bug and move on, we have to provide
+ * a backwards compatibility feature (essentially the bug) for some systems and
+ * a safety measure for some others. The latter is needed because for certain
+ * multiple inputs to the buggy algorithm there exist easily found inputs to
+ * the correct algorithm that produce the same hash. Thus, we optionally
+ * deviate from the correct algorithm just enough to avoid such collisions.
+ * While the bug itself affected the majority of passwords containing
+ * characters with the 8th bit set (although only a percentage of those in a
+ * collision-producing way), the anti-collision safety measure affects
+ * only a subset of passwords containing the '\xff' character (not even all of
+ * those passwords, just some of them). This character is not found in valid
+ * UTF-8 sequences and is rarely used in popular 8-bit character encodings.
+ * Thus, the safety measure is unlikely to cause much annoyance, and is a
+ * reasonable tradeoff to use when authenticating against existing hashes that
+ * are not reliably known to have been computed with the correct algorithm.
+ *
+ * We use an approach that tries to minimize side-channel leaks of password
+ * information - that is, we mostly use fixed-cost bitwise operations instead
+ * of branches or table lookups. (One conditional branch based on password
+ * length remains. It is not part of the bug aftermath, though, and is
+ * difficult and possibly unreasonable to avoid given the use of C strings by
+ * the caller, which results in similar timing leaks anyway.)
+ *
+ * For actual implementation, we set an array index in the variable "bug"
+ * (0 means no bug, 1 means sign extension bug emulation) and a flag in the
+ * variable "safety" (bit 16 is set when the safety measure is requested).
+ * Valid combinations of settings are:
+ *
+ * Prefix "$2a$": bug = 0, safety = 0x10000
+ * Prefix "$2x$": bug = 1, safety = 0
+ * Prefix "$2y$": bug = 0, safety = 0
+ */
+ bug = (unsigned int)flags & 1;
+ safety = ((BF_word)flags & 2) << 15;
+
+ sign = diff = 0;
+
+ for (i = 0; i < BF_N + 2; i++) {
+ tmp[0] = tmp[1] = 0;
+ for (j = 0; j < 4; j++) {
+ tmp[0] <<= 8;
+ tmp[0] |= (unsigned char)*ptr; /* correct */
+ tmp[1] <<= 8;
+ tmp[1] |= (BF_word_signed)(signed char)*ptr; /* bug */
+/*
+ * Sign extension in the first char has no effect - nothing to overwrite yet,
+ * and those extra 24 bits will be fully shifted out of the 32-bit word. For
+ * chars 2, 3, 4 in each four-char block, we set bit 7 of "sign" if sign
+ * extension in tmp[1] occurs. Once this flag is set, it remains set.
+ */
+ if (j)
+ sign |= tmp[1] & 0x80;
+ if (!*ptr)
+ ptr = key;
+ else
+ ptr++;
+ }
+ diff |= tmp[0] ^ tmp[1]; /* Non-zero on any differences */
+
+ expanded[i] = tmp[bug];
+ initial[i] = BF_init_state.P[i] ^ tmp[bug];
+ }
+
+/*
+ * At this point, "diff" is zero iff the correct and buggy algorithms produced
+ * exactly the same result. If so and if "sign" is non-zero, which indicates
+ * that there was a non-benign sign extension, this means that we have a
+ * collision between the correctly computed hash for this password and a set of
+ * passwords that could be supplied to the buggy algorithm. Our safety measure
+ * is meant to protect from such many-buggy to one-correct collisions, by
+ * deviating from the correct algorithm in such cases. Let's check for this.
+ */
+ diff |= diff >> 16; /* still zero iff exact match */
+ diff &= 0xffff; /* ditto */
+ diff += 0xffff; /* bit 16 set iff "diff" was non-zero (on non-match) */
+ sign <<= 9; /* move the non-benign sign extension flag to bit 16 */
+ sign &= ~diff & safety; /* action needed? */
+
+/*
+ * If we have determined that we need to deviate from the correct algorithm,
+ * flip bit 16 in initial expanded key. (The choice of 16 is arbitrary, but
+ * let's stick to it now. It came out of the approach we used above, and it's
+ * not any worse than any other choice we could make.)
+ *
+ * It is crucial that we don't do the same to the expanded key used in the main
+ * Eksblowfish loop. By doing it to only one of these two, we deviate from a
+ * state that could be directly specified by a password to the buggy algorithm
+ * (and to the fully correct one as well, but that's a side-effect).
+ */
+ initial[0] ^= sign;
+}
+
+static char *BF_crypt(const char *key, const char *setting,
+ char *output, int size,
+ BF_word min)
+{
+#if BF_ASM
+ extern void _BF_body_r(BF_ctx *ctx);
+#endif
+ static const unsigned char flags_by_subtype[26] =
+ {2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 0};
+ struct {
+ BF_ctx ctx;
+ BF_key expanded_key;
+ union {
+ BF_word salt[4];
+ BF_word output[6];
+ } binary;
+ } data;
+ BF_word L, R;
+ BF_word tmp1, tmp2, tmp3, tmp4;
+ BF_word *ptr;
+ BF_word count;
+ int i;
+
+ if (size < 7 + 22 + 31 + 1) {
+ __set_errno(ERANGE);
+ return NULL;
+ }
+
+ if (setting[0] != '$' ||
+ setting[1] != '2' ||
+ setting[2] < 'a' || setting[2] > 'z' ||
+ !flags_by_subtype[(unsigned int)(unsigned char)setting[2] - 'a'] ||
+ setting[3] != '$' ||
+ setting[4] < '0' || setting[4] > '3' ||
+ setting[5] < '0' || setting[5] > '9' ||
+ (setting[4] == '3' && setting[5] > '1') ||
+ setting[6] != '$') {
+ __set_errno(EINVAL);
+ return NULL;
+ }
+
+ count = (BF_word)1 << ((setting[4] - '0') * 10 + (setting[5] - '0'));
+ if (count < min || BF_decode(data.binary.salt, &setting[7], 16)) {
+ __set_errno(EINVAL);
+ return NULL;
+ }
+ BF_swap(data.binary.salt, 4);
+
+ BF_set_key(key, data.expanded_key, data.ctx.P,
+ flags_by_subtype[(unsigned int)(unsigned char)setting[2] - 'a']);
+
+ memcpy(data.ctx.S, BF_init_state.S, sizeof(data.ctx.S));
+
+ L = R = 0;
+ for (i = 0; i < BF_N + 2; i += 2) {
+ L ^= data.binary.salt[i & 2];
+ R ^= data.binary.salt[(i & 2) + 1];
+ BF_ENCRYPT;
+ data.ctx.P[i] = L;
+ data.ctx.P[i + 1] = R;
+ }
+
+ ptr = data.ctx.S[0];
+ do {
+ ptr += 4;
+ L ^= data.binary.salt[(BF_N + 2) & 3];
+ R ^= data.binary.salt[(BF_N + 3) & 3];
+ BF_ENCRYPT;
+ *(ptr - 4) = L;
+ *(ptr - 3) = R;
+
+ L ^= data.binary.salt[(BF_N + 4) & 3];
+ R ^= data.binary.salt[(BF_N + 5) & 3];
+ BF_ENCRYPT;
+ *(ptr - 2) = L;
+ *(ptr - 1) = R;
+ } while (ptr < &data.ctx.S[3][0xFF]);
+
+ do {
+ int done;
+
+ for (i = 0; i < BF_N + 2; i += 2) {
+ data.ctx.P[i] ^= data.expanded_key[i];
+ data.ctx.P[i + 1] ^= data.expanded_key[i + 1];
+ }
+
+ done = 0;
+ do {
+ BF_body();
+ if (done)
+ break;
+ done = 1;
+
+ tmp1 = data.binary.salt[0];
+ tmp2 = data.binary.salt[1];
+ tmp3 = data.binary.salt[2];
+ tmp4 = data.binary.salt[3];
+ for (i = 0; i < BF_N; i += 4) {
+ data.ctx.P[i] ^= tmp1;
+ data.ctx.P[i + 1] ^= tmp2;
+ data.ctx.P[i + 2] ^= tmp3;
+ data.ctx.P[i + 3] ^= tmp4;
+ }
+ data.ctx.P[16] ^= tmp1;
+ data.ctx.P[17] ^= tmp2;
+ } while (1);
+ } while (--count);
+
+ for (i = 0; i < 6; i += 2) {
+ L = BF_magic_w[i];
+ R = BF_magic_w[i + 1];
+
+ count = 64;
+ do {
+ BF_ENCRYPT;
+ } while (--count);
+
+ data.binary.output[i] = L;
+ data.binary.output[i + 1] = R;
+ }
+
+ memcpy(output, setting, 7 + 22 - 1);
+ output[7 + 22 - 1] = BF_itoa64[(int)
+ BF_atoi64[(int)setting[7 + 22 - 1] - 0x20] & 0x30];
+
+/* This has to be bug-compatible with the original implementation, so
+ * only encode 23 of the 24 bytes. :-) */
+ BF_swap(data.binary.output, 6);
+ BF_encode(&output[7 + 22], data.binary.output, 23);
+ output[7 + 22 + 31] = '\0';
+
+ return output;
+}
+
+int _crypt_output_magic(const char *setting, char *output, int size)
+{
+ if (size < 3)
+ return -1;
+
+ output[0] = '*';
+ output[1] = '0';
+ output[2] = '\0';
+
+ if (setting[0] == '*' && setting[1] == '0')
+ output[1] = '1';
+
+ return 0;
+}
+
+/*
+ * Please preserve the runtime self-test. It serves two purposes at once:
+ *
+ * 1. We really can't afford the risk of producing incompatible hashes e.g.
+ * when there's something like gcc bug 26587 again, whereas an application or
+ * library integrating this code might not also integrate our external tests or
+ * it might not run them after every build. Even if it does, the miscompile
+ * might only occur on the production build, but not on a testing build (such
+ * as because of different optimization settings). It is painful to recover
+ * from incorrectly-computed hashes - merely fixing whatever broke is not
+ * enough. Thus, a proactive measure like this self-test is needed.
+ *
+ * 2. We don't want to leave sensitive data from our actual password hash
+ * computation on the stack or in registers. Previous revisions of the code
+ * would do explicit cleanups, but simply running the self-test after hash
+ * computation is more reliable.
+ *
+ * The performance cost of this quick self-test is around 0.6% at the "$2a$08"
+ * setting.
+ */
+char *_crypt_blowfish_rn(const char *key, const char *setting,
+ char *output, int size)
+{
+ const char *test_key = "8b \xd0\xc1\xd2\xcf\xcc\xd8";
+ const char *test_setting = "$2a$00$abcdefghijklmnopqrstuu";
+ static const char * const test_hash[2] =
+ {"VUrPmXD6q/nVSSp7pNDhCR9071IfIRe\0\x55", /* $2x$ */
+ "i1D709vfamulimlGcq0qq3UvuUasvEa\0\x55"}; /* $2a$, $2y$ */
+ char *retval;
+ const char *p;
+ int save_errno, ok;
+ struct {
+ char s[7 + 22 + 1];
+ char o[7 + 22 + 31 + 1 + 1 + 1];
+ } buf;
+
+/* Hash the supplied password */
+ _crypt_output_magic(setting, output, size);
+ retval = BF_crypt(key, setting, output, size, 16);
+ save_errno = errno;
+
+/*
+ * Do a quick self-test. It is important that we make both calls to BF_crypt()
+ * from the same scope such that they likely use the same stack locations,
+ * which makes the second call overwrite the first call's sensitive data on the
+ * stack and makes it more likely that any alignment related issues would be
+ * detected by the self-test.
+ */
+ memcpy(buf.s, test_setting, sizeof(buf.s));
+ if (retval)
+ buf.s[2] = setting[2];
+ memset(buf.o, 0x55, sizeof(buf.o));
+ buf.o[sizeof(buf.o) - 1] = 0;
+ p = BF_crypt(test_key, buf.s, buf.o, sizeof(buf.o) - (1 + 1), 1);
+
+ ok = (p == buf.o &&
+ !memcmp(p, buf.s, 7 + 22) &&
+ !memcmp(p + (7 + 22),
+ test_hash[(unsigned int)(unsigned char)buf.s[2] & 1],
+ 31 + 1 + 1 + 1));
+
+ {
+ const char *k = "\xff\xa3" "34" "\xff\xff\xff\xa3" "345";
+ BF_key ae, ai, ye, yi;
+ BF_set_key(k, ae, ai, 2); /* $2a$ */
+ BF_set_key(k, ye, yi, 4); /* $2y$ */
+ ai[0] ^= 0x10000; /* undo the safety (for comparison) */
+ ok = ok && ai[0] == 0xdb9c59bc && ye[17] == 0x33343500 &&
+ !memcmp(ae, ye, sizeof(ae)) &&
+ !memcmp(ai, yi, sizeof(ai));
+ }
+
+ __set_errno(save_errno);
+ if (ok)
+ return retval;
+
+/* Should not happen */
+ _crypt_output_magic(setting, output, size);
+ __set_errno(EINVAL); /* pretend we don't support this hash type */
+ return NULL;
+}
+
+char *_crypt_gensalt_blowfish_rn(const char *prefix, unsigned long count,
+ const char *input, int size, char *output, int output_size)
+{
+ if (size < 16 || output_size < 7 + 22 + 1 ||
+ (count && (count < 4 || count > 31)) ||
+ prefix[0] != '$' || prefix[1] != '2' ||
+ (prefix[2] != 'a' && prefix[2] != 'y')) {
+ if (output_size > 0) output[0] = '\0';
+ __set_errno((output_size < 7 + 22 + 1) ? ERANGE : EINVAL);
+ return NULL;
+ }
+
+ if (!count) count = 5;
+
+ output[0] = '$';
+ output[1] = '2';
+ output[2] = prefix[2];
+ output[3] = '$';
+ output[4] = '0' + count / 10;
+ output[5] = '0' + count % 10;
+ output[6] = '$';
+
+ BF_encode(&output[7], (const BF_word *)input, 16);
+ output[7 + 22] = '\0';
+
+ return output;
+}
diff --git a/contrib/apr-util/crypto/crypt_blowfish.h b/contrib/apr-util/crypto/crypt_blowfish.h
new file mode 100644
index 000000000000..2ee0d8c1d805
--- /dev/null
+++ b/contrib/apr-util/crypto/crypt_blowfish.h
@@ -0,0 +1,27 @@
+/*
+ * Written by Solar Designer <solar at openwall.com> in 2000-2011.
+ * No copyright is claimed, and the software is hereby placed in the public
+ * domain. In case this attempt to disclaim copyright and place the software
+ * in the public domain is deemed null and void, then the software is
+ * Copyright (c) 2000-2011 Solar Designer and it is hereby released to the
+ * general public under the following terms:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted.
+ *
+ * There's ABSOLUTELY NO WARRANTY, express or implied.
+ *
+ * See crypt_blowfish.c for more information.
+ */
+
+#ifndef _CRYPT_BLOWFISH_H
+#define _CRYPT_BLOWFISH_H
+
+extern int _crypt_output_magic(const char *setting, char *output, int size);
+extern char *_crypt_blowfish_rn(const char *key, const char *setting,
+ char *output, int size);
+extern char *_crypt_gensalt_blowfish_rn(const char *prefix,
+ unsigned long count,
+ const char *input, int size, char *output, int output_size);
+
+#endif
diff --git a/contrib/apr-util/crypto/getuuid.c b/contrib/apr-util/crypto/getuuid.c
new file mode 100644
index 000000000000..d973c0f96cb5
--- /dev/null
+++ b/contrib/apr-util/crypto/getuuid.c
@@ -0,0 +1,208 @@
+/* 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.
+ */
+
+/*
+ * This attempts to generate V1 UUIDs according to the Internet Draft
+ * located at http://www.webdav.org/specs/draft-leach-uuids-guids-01.txt
+ */
+#include "apr.h"
+#include "apr_uuid.h"
+#include "apr_md5.h"
+#include "apr_general.h"
+#include "apr_portable.h"
+
+
+#if APR_HAVE_UNISTD_H
+#include <unistd.h> /* for getpid, gethostname */
+#endif
+#if APR_HAVE_STDLIB_H
+#include <stdlib.h> /* for rand, srand */
+#endif
+
+
+#if APR_HAVE_STRING_H
+#include <string.h>
+#endif
+#if APR_HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#if APR_HAVE_NETDB_H
+#include <netdb.h>
+#endif
+#if APR_HAVE_SYS_TIME_H
+#include <sys/time.h> /* for gettimeofday */
+#endif
+
+#define NODE_LENGTH 6
+
+static int uuid_state_seqnum;
+static unsigned char uuid_state_node[NODE_LENGTH] = { 0 };
+
+
+static void get_random_info(unsigned char node[NODE_LENGTH])
+{
+#if APR_HAS_RANDOM
+
+ (void) apr_generate_random_bytes(node, NODE_LENGTH);
+
+#else
+
+ unsigned char seed[APR_MD5_DIGESTSIZE];
+ apr_md5_ctx_t c;
+
+ /* ### probably should revise some of this to be a bit more portable */
+
+ /* Leach & Salz use Linux-specific struct sysinfo;
+ * replace with pid/tid for portability (in the spirit of mod_unique_id) */
+ struct {
+ /* Add thread id here, if applicable, when we get to pthread or apr */
+ pid_t pid;
+#ifdef NETWARE
+ apr_uint64_t t;
+#else
+ struct timeval t;
+#endif
+ char hostname[257];
+
+ } r;
+
+ apr_md5_init(&c);
+#ifdef NETWARE
+ r.pid = NXThreadGetId();
+ NXGetTime(NX_SINCE_BOOT, NX_USECONDS, &(r.t));
+#else
+ r.pid = getpid();
+ gettimeofday(&r.t, (struct timezone *)0);
+#endif
+ gethostname(r.hostname, 256);
+ apr_md5_update(&c, (const unsigned char *)&r, sizeof(r));
+ apr_md5_final(seed, &c);
+
+ memcpy(node, seed, NODE_LENGTH); /* use a subset of the seed bytes */
+#endif
+}
+
+/* This implementation generates a random node ID instead of a
+ system-dependent call to get IEEE node ID. This is also more secure:
+ we aren't passing out our MAC address.
+*/
+static void get_pseudo_node_identifier(unsigned char *node)
+{
+ get_random_info(node);
+ node[0] |= 0x01; /* this designates a random multicast node ID */
+}
+
+static void get_system_time(apr_uint64_t *uuid_time)
+{
+ /* ### fix this call to be more portable? */
+ *uuid_time = apr_time_now();
+
+ /* Offset between UUID formatted times and Unix formatted times.
+ UUID UTC base time is October 15, 1582.
+ Unix base time is January 1, 1970. */
+ *uuid_time = (*uuid_time * 10) + APR_TIME_C(0x01B21DD213814000);
+}
+
+/* true_random -- generate a crypto-quality random number. */
+static int true_random(void)
+{
+ apr_uint64_t time_now;
+
+#if APR_HAS_RANDOM
+ unsigned char buf[2];
+
+ if (apr_generate_random_bytes(buf, 2) == APR_SUCCESS) {
+ return (buf[0] << 8) | buf[1];
+ }
+#endif
+
+ /* crap. this isn't crypto quality, but it will be Good Enough */
+
+ time_now = apr_time_now();
+ srand((unsigned int)(((time_now >> 32) ^ time_now) & 0xffffffff));
+
+ return rand() & 0x0FFFF;
+}
+
+static void init_state(void)
+{
+ uuid_state_seqnum = true_random();
+ get_pseudo_node_identifier(uuid_state_node);
+}
+
+static void get_current_time(apr_uint64_t *timestamp)
+{
+ /* ### this needs to be made thread-safe! */
+
+ apr_uint64_t time_now;
+ static apr_uint64_t time_last = 0;
+ static apr_uint64_t fudge = 0;
+
+ get_system_time(&time_now);
+
+ /* if clock reading changed since last UUID generated... */
+ if (time_last != time_now) {
+ /* The clock reading has changed since the last UUID was generated.
+ Reset the fudge factor. if we are generating them too fast, then
+ the fudge may need to be reset to something greater than zero. */
+ if (time_last + fudge > time_now)
+ fudge = time_last + fudge - time_now + 1;
+ else
+ fudge = 0;
+ time_last = time_now;
+ }
+ else {
+ /* We generated two really fast. Bump the fudge factor. */
+ ++fudge;
+ }
+
+ *timestamp = time_now + fudge;
+}
+
+APU_DECLARE(void) apr_uuid_get(apr_uuid_t *uuid)
+{
+ apr_uint64_t timestamp;
+ unsigned char *d = uuid->data;
+
+#if APR_HAS_OS_UUID
+ if (apr_os_uuid_get(d) == APR_SUCCESS) {
+ return;
+ }
+#endif /* !APR_HAS_OS_UUID */
+
+ if (!uuid_state_node[0])
+ init_state();
+
+ get_current_time(&timestamp);
+
+ /* time_low, uint32 */
+ d[3] = (unsigned char)timestamp;
+ d[2] = (unsigned char)(timestamp >> 8);
+ d[1] = (unsigned char)(timestamp >> 16);
+ d[0] = (unsigned char)(timestamp >> 24);
+ /* time_mid, uint16 */
+ d[5] = (unsigned char)(timestamp >> 32);
+ d[4] = (unsigned char)(timestamp >> 40);
+ /* time_hi_and_version, uint16 */
+ d[7] = (unsigned char)(timestamp >> 48);
+ d[6] = (unsigned char)(((timestamp >> 56) & 0x0F) | 0x10);
+ /* clock_seq_hi_and_reserved, uint8 */
+ d[8] = (unsigned char)(((uuid_state_seqnum >> 8) & 0x3F) | 0x80);
+ /* clock_seq_low, uint8 */
+ d[9] = (unsigned char)uuid_state_seqnum;
+ /* node, byte[6] */
+ memcpy(&d[10], uuid_state_node, NODE_LENGTH);
+}
diff --git a/contrib/apr-util/crypto/uuid.c b/contrib/apr-util/crypto/uuid.c
new file mode 100644
index 000000000000..6e45d71875ca
--- /dev/null
+++ b/contrib/apr-util/crypto/uuid.c
@@ -0,0 +1,130 @@
+/* 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 <stdio.h> /* for sprintf */
+
+#include "apr.h"
+#include "apr_uuid.h"
+#include "apr_errno.h"
+#include "apr_lib.h"
+
+
+APU_DECLARE(void) apr_uuid_format(char *buffer, const apr_uuid_t *uuid)
+{
+ const unsigned char *d = uuid->data;
+
+ sprintf(buffer,
+ "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+ d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7],
+ d[8], d[9], d[10], d[11], d[12], d[13], d[14], d[15]);
+}
+
+/* convert a pair of hex digits to an integer value [0,255] */
+#if 'A' == 65
+static unsigned char parse_hexpair(const char *s)
+{
+ int result;
+ int temp;
+
+ result = s[0] - '0';
+ if (result > 48)
+ result = (result - 39) << 4;
+ else if (result > 16)
+ result = (result - 7) << 4;
+ else
+ result = result << 4;
+
+ temp = s[1] - '0';
+ if (temp > 48)
+ result |= temp - 39;
+ else if (temp > 16)
+ result |= temp - 7;
+ else
+ result |= temp;
+
+ return (unsigned char)result;
+}
+#else
+static unsigned char parse_hexpair(const char *s)
+{
+ int result;
+
+ if (isdigit(*s)) {
+ result = (*s - '0') << 4;
+ }
+ else {
+ if (isupper(*s)) {
+ result = (*s - 'A' + 10) << 4;
+ }
+ else {
+ result = (*s - 'a' + 10) << 4;
+ }
+ }
+
+ ++s;
+ if (isdigit(*s)) {
+ result |= (*s - '0');
+ }
+ else {
+ if (isupper(*s)) {
+ result |= (*s - 'A' + 10);
+ }
+ else {
+ result |= (*s - 'a' + 10);
+ }
+ }
+
+ return (unsigned char)result;
+}
+#endif
+
+APU_DECLARE(apr_status_t) apr_uuid_parse(apr_uuid_t *uuid,
+ const char *uuid_str)
+{
+ int i;
+ unsigned char *d = uuid->data;
+
+ for (i = 0; i < 36; ++i) {
+ char c = uuid_str[i];
+ if (!apr_isxdigit(c) &&
+ !(c == '-' && (i == 8 || i == 13 || i == 18 || i == 23)))
+ /* ### need a better value */
+ return APR_BADARG;
+ }
+ if (uuid_str[36] != '\0') {
+ /* ### need a better value */
+ return APR_BADARG;
+ }
+
+ d[0] = parse_hexpair(&uuid_str[0]);
+ d[1] = parse_hexpair(&uuid_str[2]);
+ d[2] = parse_hexpair(&uuid_str[4]);
+ d[3] = parse_hexpair(&uuid_str[6]);
+
+ d[4] = parse_hexpair(&uuid_str[9]);
+ d[5] = parse_hexpair(&uuid_str[11]);
+
+ d[6] = parse_hexpair(&uuid_str[14]);
+ d[7] = parse_hexpair(&uuid_str[16]);
+
+ d[8] = parse_hexpair(&uuid_str[19]);
+ d[9] = parse_hexpair(&uuid_str[21]);
+
+ for (i = 6; i--;)
+ d[10 + i] = parse_hexpair(&uuid_str[i*2+24]);
+
+ return APR_SUCCESS;
+}
diff --git a/contrib/apr-util/dbd/NWGNUdbdfreetds b/contrib/apr-util/dbd/NWGNUdbdfreetds
new file mode 100644
index 000000000000..fcac2271d194
--- /dev/null
+++ b/contrib/apr-util/dbd/NWGNUdbdfreetds
@@ -0,0 +1,296 @@
+#
+# Declare the sub-directories to be built here
+#
+
+SUBDIRS = \
+ $(EOLIST)
+
+#
+# Get the 'head' of the build environment. This includes default targets and
+# paths to tools
+#
+
+ifndef EnvironmentDefined
+include $(APR_WORK)/build/NWGNUhead.inc
+endif
+
+#include $(APR)\build\NWGNUcustom.inc
+
+#
+# build this level's files
+
+#
+# Make sure all needed macro's are defined
+#
+
+# LINK_STATIC = 1
+
+# for now defined here - should finally go into build/NWGNUenvironment.inc
+FREETDS_INC = $(FREETDSSDK)/include
+FREETDS_IMP = $(FREETDSSDK)/lib/libfreetds.imp
+FREETDS_LIB = $(FREETDSSDK)/lib/libfreetds.lib
+FREETDS_NLM = libfreetds
+
+#
+# These directories will be at the beginning of the include list, followed by
+# INCDIRS
+#
+XINCDIRS += \
+ $(APR)/include/arch/netware \
+ $(APR)/include \
+ $(APU)/include \
+ $(APU)/include/private \
+ $(APR) \
+ $(FREETDS_INC) \
+ $(EOLIST)
+
+#
+# These flags will come after CFLAGS
+#
+XCFLAGS += \
+ $(EOLIST)
+
+#
+# These defines will come after DEFINES
+#
+XDEFINES += \
+ -DAPU_HAVE_FREETDS=1 \
+ -DAPU_DSO_MODULE_BUILD \
+ $(EOLIST)
+
+#
+# These flags will be added to the link.opt file
+#
+XLFLAGS += \
+ $(EOLIST)
+
+ifdef LINK_STATIC
+XLFLAGS += \
+ -l $(FREETDSSDK)/lib \
+ $(EOLIST)
+endif
+
+#
+# These values will be appended to the correct variables based on the value of
+# RELEASE
+#
+ifeq "$(RELEASE)" "debug"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "noopt"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "release"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+#
+# These are used by the link target if an NLM is being generated
+# This is used by the link 'name' directive to name the nlm. If left blank
+# TARGET_nlm (see below) will be used.
+#
+NLM_NAME = dbdfreetds
+
+#
+# This is used by the link '-desc ' directive.
+# If left blank, NLM_NAME will be used.
+#
+NLM_DESCRIPTION = Apache Portability Runtime Library $(VERSION_STR) DBD FreeTDS Driver Module
+
+#
+# This is used by the '-threadname' directive. If left blank,
+# NLM_NAME Thread will be used.
+#
+NLM_THREAD_NAME = dbdfreetds
+
+#
+# If this is specified, it will override VERSION value in
+# $(AP_WORK)\build\NWGNUenvironment.inc
+#
+NLM_VERSION =
+
+#
+# If this is specified, it will override the default of 64K
+#
+NLM_STACK_SIZE = 8192
+
+
+#
+# If this is specified it will be used by the link '-entry' directive
+#
+NLM_ENTRY_SYM =
+
+#
+# If this is specified it will be used by the link '-exit' directive
+#
+NLM_EXIT_SYM =
+
+#
+# If this is specified it will be used by the link '-check' directive
+#
+NLM_CHECK_SYM =
+
+#
+# If these are specified it will be used by the link '-flags' directive
+#
+NLM_FLAGS =
+
+#
+# If this is specified it will be linked in with the XDCData option in the def
+# file instead of the default of $(NWOS)/apache.xdc. XDCData can be disabled
+# by setting APACHE_UNIPROC in the environment
+#
+XDCDATA =
+
+#
+# If there is an NLM target, put it here
+#
+TARGET_nlm = \
+ $(OBJDIR)\$(NLM_NAME).nlm \
+ $(EOLIST)
+
+#
+# If there is an LIB target, put it here
+#
+TARGET_lib = \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the NLM target above.
+# Paths must all use the '/' character
+#
+FILES_nlm_objs = \
+ $(OBJDIR)/apr_dbd_freetds.o \
+ $(EOLIST)
+
+#
+# These are the LIB files needed to create the NLM target above.
+# These will be added as a library command in the link.opt file.
+#
+FILES_nlm_libs = \
+ $(PRELUDE) \
+ $(EOLIST)
+
+ifeq ($(LINK_STATIC),1)
+FILES_nlm_libs += \
+ $(FREETDS_LIB) \
+ $(EOLIST)
+endif
+
+#
+# These are the modules that the above NLM target depends on to load.
+# These will be added as a module command in the link.opt file.
+#
+FILES_nlm_modules = \
+ aprlib \
+ libc \
+ $(EOLIST)
+
+ifneq ($(LINK_STATIC),1)
+FILES_nlm_modules += \
+ $(FREETDS_NLM) \
+ $(EOLIST)
+endif
+
+#
+# If the nlm has a msg file, put it's path here
+#
+FILE_nlm_msg =
+
+#
+# If the nlm has a hlp file put it's path here
+#
+FILE_nlm_hlp =
+
+#
+# If this is specified, it will override $(NWOS)\copyright.txt.
+#
+FILE_nlm_copyright =
+
+#
+# Any additional imports go here
+#
+FILES_nlm_Ximports = \
+ @$(APR)/aprlib.imp \
+ @libc.imp \
+ $(EOLIST)
+
+ifneq ($(LINK_STATIC),1)
+FILES_nlm_Ximports += \
+ @$(FREETDS_IMP) \
+ $(EOLIST)
+endif
+
+#
+# Any symbols exported to here
+#
+FILES_nlm_exports = \
+ apr_dbd_freetds_driver \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the LIB target above.
+# Paths must all use the '/' character
+#
+FILES_lib_objs = \
+ $(EOLIST)
+
+#
+# implement targets and dependancies (leave this section alone)
+#
+
+libs :: $(OBJDIR) $(TARGET_lib)
+
+nlms :: libs $(TARGET_nlm)
+
+#
+# Updated this target to create necessary directories and copy files to the
+# correct place. (See $(AP_WORK)\build\NWGNUhead.inc for examples)
+#
+install :: nlms FORCE
+
+#
+# Any specialized rules here
+#
+
+#
+# Include the 'tail' makefile that has targets that depend on variables defined
+# in this makefile
+#
+
+include $(APRBUILD)/NWGNUtail.inc
+
+
+
diff --git a/contrib/apr-util/dbd/NWGNUdbdmysql b/contrib/apr-util/dbd/NWGNUdbdmysql
new file mode 100644
index 000000000000..f52d326140e4
--- /dev/null
+++ b/contrib/apr-util/dbd/NWGNUdbdmysql
@@ -0,0 +1,295 @@
+#
+# Declare the sub-directories to be built here
+#
+
+SUBDIRS = \
+ $(EOLIST)
+
+#
+# Get the 'head' of the build environment. This includes default targets and
+# paths to tools
+#
+
+ifndef EnvironmentDefined
+include $(APR_WORK)/build/NWGNUhead.inc
+endif
+
+#include $(APR)\build\NWGNUcustom.inc
+
+#
+# build this level's files
+
+#
+# Make sure all needed macro's are defined
+#
+
+# LINK_STATIC = 1
+
+# for now defined here - should finally go into build/NWGNUenvironment.inc
+MYSQL_INC = $(MYSQLSDK)/include
+MYSQL_IMP = libmysql.imp
+MYSQL_LIB = libmysqlclient_r.lib libz.lib
+MYSQL_NLM = libmysql
+ifneq "$(wildcard $(MYSQL_INC)/mysql.h)" "$(MYSQL_INC)/mysql.h"
+$(error MYSQLSDK does not point to a valid MySQL SDK)
+endif
+
+#
+# These directories will be at the beginning of the include list, followed by
+# INCDIRS
+#
+XINCDIRS += \
+ $(APR)/include/arch/netware \
+ $(APR)/include \
+ $(APU)/include \
+ $(APU)/include/private \
+ $(APR) \
+ $(MYSQL_INC) \
+ $(EOLIST)
+
+#
+# These flags will come after CFLAGS
+#
+XCFLAGS += \
+ $(EOLIST)
+
+#
+# These defines will come after DEFINES
+#
+XDEFINES += \
+ -DAPU_DSO_MODULE_BUILD \
+ -DAPU_HAVE_MYSQL=1 \
+ -DHAVE_MYSQL_H \
+ $(EOLIST)
+
+#
+# These flags will be added to the link.opt file
+#
+XLFLAGS += \
+ -l $(MYSQLSDK)/lib \
+ $(EOLIST)
+
+#
+# These values will be appended to the correct variables based on the value of
+# RELEASE
+#
+ifeq "$(RELEASE)" "debug"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "noopt"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "release"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+#
+# These are used by the link target if an NLM is being generated
+# This is used by the link 'name' directive to name the nlm. If left blank
+# TARGET_nlm (see below) will be used.
+#
+NLM_NAME = dbdmysql
+
+#
+# This is used by the link '-desc ' directive.
+# If left blank, NLM_NAME will be used.
+#
+NLM_DESCRIPTION = Apache Portability Runtime Library $(VERSION_STR) DBD MySQL Driver Module
+
+#
+# This is used by the '-threadname' directive. If left blank,
+# NLM_NAME Thread will be used.
+#
+NLM_THREAD_NAME = dbdmysql
+
+#
+# If this is specified, it will override VERSION value in
+# $(AP_WORK)\build\NWGNUenvironment.inc
+#
+NLM_VERSION =
+
+#
+# If this is specified, it will override the default of 64K
+#
+NLM_STACK_SIZE = 8192
+
+
+#
+# If this is specified it will be used by the link '-entry' directive
+#
+NLM_ENTRY_SYM =
+
+#
+# If this is specified it will be used by the link '-exit' directive
+#
+NLM_EXIT_SYM =
+
+#
+# If this is specified it will be used by the link '-check' directive
+#
+NLM_CHECK_SYM =
+
+#
+# If these are specified it will be used by the link '-flags' directive
+#
+NLM_FLAGS =
+
+#
+# If this is specified it will be linked in with the XDCData option in the def
+# file instead of the default of $(NWOS)/apache.xdc. XDCData can be disabled
+# by setting APACHE_UNIPROC in the environment
+#
+XDCDATA =
+
+#
+# If there is an NLM target, put it here
+#
+TARGET_nlm = \
+ $(OBJDIR)/$(NLM_NAME).nlm \
+ $(EOLIST)
+
+#
+# If there is an LIB target, put it here
+#
+TARGET_lib = \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the NLM target above.
+# Paths must all use the '/' character
+#
+FILES_nlm_objs = \
+ $(OBJDIR)/apr_dbd_mysql.o \
+ $(EOLIST)
+
+#
+# These are the LIB files needed to create the NLM target above.
+# These will be added as a library command in the link.opt file.
+#
+FILES_nlm_libs = \
+ $(PRELUDE) \
+ $(EOLIST)
+
+ifeq ($(LINK_STATIC),1)
+FILES_nlm_libs += \
+ $(MYSQL_LIB) \
+ $(EOLIST)
+endif
+
+#
+# These are the modules that the above NLM target depends on to load.
+# These will be added as a module command in the link.opt file.
+#
+FILES_nlm_modules = \
+ aprlib \
+ libc \
+ $(EOLIST)
+
+ifneq ($(LINK_STATIC),1)
+FILES_nlm_modules += \
+ $(MYSQL_NLM) \
+ $(EOLIST)
+endif
+
+#
+# If the nlm has a msg file, put it's path here
+#
+FILE_nlm_msg =
+
+#
+# If the nlm has a hlp file put it's path here
+#
+FILE_nlm_hlp =
+
+#
+# If this is specified, it will override $(NWOS)\copyright.txt.
+#
+FILE_nlm_copyright =
+
+#
+# Any additional imports go here
+#
+FILES_nlm_Ximports = \
+ @aprlib.imp \
+ @libc.imp \
+ $(EOLIST)
+
+ifneq ($(LINK_STATIC),1)
+FILES_nlm_Ximports += \
+ @$(MYSQL_IMP) \
+ $(EOLIST)
+endif
+
+#
+# Any symbols exported to here
+#
+FILES_nlm_exports = \
+ apr_dbd_mysql_driver \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the LIB target above.
+# Paths must all use the '/' character
+#
+FILES_lib_objs = \
+ $(EOLIST)
+
+#
+# implement targets and dependancies (leave this section alone)
+#
+
+libs :: $(OBJDIR) $(TARGET_lib)
+
+nlms :: libs $(TARGET_nlm)
+
+#
+# Updated this target to create necessary directories and copy files to the
+# correct place. (See $(AP_WORK)\build\NWGNUhead.inc for examples)
+#
+install :: nlms FORCE
+
+#
+# Any specialized rules here
+#
+
+#
+# Include the 'tail' makefile that has targets that depend on variables defined
+# in this makefile
+#
+
+include $(APRBUILD)/NWGNUtail.inc
+
+
+
diff --git a/contrib/apr-util/dbd/NWGNUdbdpgsql b/contrib/apr-util/dbd/NWGNUdbdpgsql
new file mode 100644
index 000000000000..32ac77579fe3
--- /dev/null
+++ b/contrib/apr-util/dbd/NWGNUdbdpgsql
@@ -0,0 +1,301 @@
+#
+# Declare the sub-directories to be built here
+#
+
+SUBDIRS = \
+ $(EOLIST)
+
+#
+# Get the 'head' of the build environment. This includes default targets and
+# paths to tools
+#
+
+ifndef EnvironmentDefined
+include $(APR_WORK)/build/NWGNUhead.inc
+endif
+
+#include $(APR)\build\NWGNUcustom.inc
+
+#
+# build this level's files
+
+#
+# Make sure all needed macro's are defined
+#
+
+# LINK_STATIC = 1
+
+# for now defined here - should finally go into build/NWGNUenvironment.inc
+PGSQL_INC = $(PGSQLSDK)/inc
+PGSQL_IMP = libpq.imp
+PGSQL_LIB = libpq.lib
+PGSQL_NLM = libpq
+
+#
+# These directories will be at the beginning of the include list, followed by
+# INCDIRS
+#
+XINCDIRS += \
+ $(APR)/include/arch/netware \
+ $(APR)/include \
+ $(APU)/include \
+ $(APU)/include/private \
+ $(APR) \
+ $(PGSQL_INC) \
+ $(EOLIST)
+
+#
+# These flags will come after CFLAGS
+#
+XCFLAGS += \
+ $(EOLIST)
+
+#
+# These defines will come after DEFINES
+#
+XDEFINES += \
+ -DAPU_DSO_MODULE_BUILD \
+ -DAPU_HAVE_PGSQL=1 \
+ -DHAVE_LIBPQ_FE_H \
+ $(EOLIST)
+
+#
+# These flags will be added to the link.opt file
+#
+XLFLAGS += \
+ $(EOLIST)
+
+ifdef LINK_STATIC
+XLFLAGS += \
+ -l $(PGSQLSDK)/lib \
+ $(EOLIST)
+else
+XLFLAGS += \
+ -l $(PGSQLSDK)/imp \
+ $(EOLIST)
+endif
+
+#
+# These values will be appended to the correct variables based on the value of
+# RELEASE
+#
+ifeq "$(RELEASE)" "debug"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "noopt"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "release"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+#
+# These are used by the link target if an NLM is being generated
+# This is used by the link 'name' directive to name the nlm. If left blank
+# TARGET_nlm (see below) will be used.
+#
+NLM_NAME = dbdpgsql
+
+#
+# This is used by the link '-desc ' directive.
+# If left blank, NLM_NAME will be used.
+#
+NLM_DESCRIPTION = Apache Portability Runtime Library $(VERSION_STR) DBD PostgreSQL Driver Module
+
+#
+# This is used by the '-threadname' directive. If left blank,
+# NLM_NAME Thread will be used.
+#
+NLM_THREAD_NAME = dbdpgsql
+
+#
+# If this is specified, it will override VERSION value in
+# $(AP_WORK)\build\NWGNUenvironment.inc
+#
+NLM_VERSION =
+
+#
+# If this is specified, it will override the default of 64K
+#
+NLM_STACK_SIZE = 8192
+
+
+#
+# If this is specified it will be used by the link '-entry' directive
+#
+NLM_ENTRY_SYM =
+
+#
+# If this is specified it will be used by the link '-exit' directive
+#
+NLM_EXIT_SYM =
+
+#
+# If this is specified it will be used by the link '-check' directive
+#
+NLM_CHECK_SYM =
+
+#
+# If these are specified it will be used by the link '-flags' directive
+#
+NLM_FLAGS =
+
+#
+# If this is specified it will be linked in with the XDCData option in the def
+# file instead of the default of $(NWOS)/apache.xdc. XDCData can be disabled
+# by setting APACHE_UNIPROC in the environment
+#
+XDCDATA =
+
+#
+# If there is an NLM target, put it here
+#
+TARGET_nlm = \
+ $(OBJDIR)/$(NLM_NAME).nlm \
+ $(EOLIST)
+
+#
+# If there is an LIB target, put it here
+#
+TARGET_lib = \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the NLM target above.
+# Paths must all use the '/' character
+#
+FILES_nlm_objs = \
+ $(OBJDIR)/apr_dbd_pgsql.o \
+ $(EOLIST)
+
+#
+# These are the LIB files needed to create the NLM target above.
+# These will be added as a library command in the link.opt file.
+#
+FILES_nlm_libs = \
+ $(PRELUDE) \
+ $(EOLIST)
+
+ifeq ($(LINK_STATIC),1)
+FILES_nlm_libs += \
+ $(PGSQL_LIB) \
+ $(EOLIST)
+endif
+
+#
+# These are the modules that the above NLM target depends on to load.
+# These will be added as a module command in the link.opt file.
+#
+FILES_nlm_modules = \
+ aprlib \
+ libc \
+ $(EOLIST)
+
+ifneq ($(LINK_STATIC),1)
+FILES_nlm_modules += \
+ $(PGSQL_NLM) \
+ $(EOLIST)
+endif
+
+#
+# If the nlm has a msg file, put it's path here
+#
+FILE_nlm_msg =
+
+#
+# If the nlm has a hlp file put it's path here
+#
+FILE_nlm_hlp =
+
+#
+# If this is specified, it will override $(NWOS)\copyright.txt.
+#
+FILE_nlm_copyright =
+
+#
+# Any additional imports go here
+#
+FILES_nlm_Ximports = \
+ @aprlib.imp \
+ @libc.imp \
+ $(EOLIST)
+
+ifneq ($(LINK_STATIC),1)
+FILES_nlm_Ximports += \
+ @$(PGSQL_IMP) \
+ $(EOLIST)
+endif
+
+#
+# Any symbols exported to here
+#
+FILES_nlm_exports = \
+ apr_dbd_pgsql_driver \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the LIB target above.
+# Paths must all use the '/' character
+#
+FILES_lib_objs = \
+ $(EOLIST)
+
+#
+# implement targets and dependancies (leave this section alone)
+#
+
+libs :: $(OBJDIR) $(TARGET_lib)
+
+nlms :: libs $(TARGET_nlm)
+
+#
+# Updated this target to create necessary directories and copy files to the
+# correct place. (See $(AP_WORK)\build\NWGNUhead.inc for examples)
+#
+install :: nlms FORCE
+
+#
+# Any specialized rules here
+#
+
+#
+# Include the 'tail' makefile that has targets that depend on variables defined
+# in this makefile
+#
+
+include $(APRBUILD)/NWGNUtail.inc
+
+
+
diff --git a/contrib/apr-util/dbd/NWGNUdbdsqli2 b/contrib/apr-util/dbd/NWGNUdbdsqli2
new file mode 100644
index 000000000000..f7288bec64b1
--- /dev/null
+++ b/contrib/apr-util/dbd/NWGNUdbdsqli2
@@ -0,0 +1,296 @@
+#
+# Declare the sub-directories to be built here
+#
+
+SUBDIRS = \
+ $(EOLIST)
+
+#
+# Get the 'head' of the build environment. This includes default targets and
+# paths to tools
+#
+
+ifndef EnvironmentDefined
+include $(APR_WORK)/build/NWGNUhead.inc
+endif
+
+#include $(APR)\build\NWGNUcustom.inc
+
+#
+# build this level's files
+
+#
+# Make sure all needed macro's are defined
+#
+
+# LINK_STATIC = 1
+
+# for now defined here - should finally go into build/NWGNUenvironment.inc
+SQLITE2_INC = $(SQLITE2SDK)/src
+SQLITE2_IMP = $(SQLITE2SDK)/lsqlite2.imp
+SQLITE2_LIB = $(SQLITE2SDK)/lsqlite2.lib
+SQLITE2_NLM = lsqlite2
+
+#
+# These directories will be at the beginning of the include list, followed by
+# INCDIRS
+#
+XINCDIRS += \
+ $(APR)/include/arch/netware \
+ $(APR)/include \
+ $(APU)/include \
+ $(APU)/include/private \
+ $(APR) \
+ $(SQLITE2_INC) \
+ $(EOLIST)
+
+#
+# These flags will come after CFLAGS
+#
+XCFLAGS += \
+ $(EOLIST)
+
+#
+# These defines will come after DEFINES
+#
+XDEFINES += \
+ -DAPU_DSO_MODULE_BUILD \
+ -DAPU_HAVE_SQLITE2=1 \
+ $(EOLIST)
+
+#
+# These flags will be added to the link.opt file
+#
+XLFLAGS += \
+ $(EOLIST)
+
+ifdef LINK_STATIC
+XLFLAGS += \
+ -l $(SQLITE2SDK) \
+ $(EOLIST)
+endif
+
+#
+# These values will be appended to the correct variables based on the value of
+# RELEASE
+#
+ifeq "$(RELEASE)" "debug"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "noopt"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "release"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+#
+# These are used by the link target if an NLM is being generated
+# This is used by the link 'name' directive to name the nlm. If left blank
+# TARGET_nlm (see below) will be used.
+#
+NLM_NAME = dbdsqli2
+
+#
+# This is used by the link '-desc ' directive.
+# If left blank, NLM_NAME will be used.
+#
+NLM_DESCRIPTION = Apache Portability Runtime Library $(VERSION_STR) DBD SQLite2 Driver Module
+
+#
+# This is used by the '-threadname' directive. If left blank,
+# NLM_NAME Thread will be used.
+#
+NLM_THREAD_NAME = dbdsqli2
+
+#
+# If this is specified, it will override VERSION value in
+# $(AP_WORK)\build\NWGNUenvironment.inc
+#
+NLM_VERSION =
+
+#
+# If this is specified, it will override the default of 64K
+#
+NLM_STACK_SIZE = 8192
+
+
+#
+# If this is specified it will be used by the link '-entry' directive
+#
+NLM_ENTRY_SYM =
+
+#
+# If this is specified it will be used by the link '-exit' directive
+#
+NLM_EXIT_SYM =
+
+#
+# If this is specified it will be used by the link '-check' directive
+#
+NLM_CHECK_SYM =
+
+#
+# If these are specified it will be used by the link '-flags' directive
+#
+NLM_FLAGS =
+
+#
+# If this is specified it will be linked in with the XDCData option in the def
+# file instead of the default of $(NWOS)/apache.xdc. XDCData can be disabled
+# by setting APACHE_UNIPROC in the environment
+#
+XDCDATA =
+
+#
+# If there is an NLM target, put it here
+#
+TARGET_nlm = \
+ $(OBJDIR)\$(NLM_NAME).nlm \
+ $(EOLIST)
+
+#
+# If there is an LIB target, put it here
+#
+TARGET_lib = \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the NLM target above.
+# Paths must all use the '/' character
+#
+FILES_nlm_objs = \
+ $(OBJDIR)/apr_dbd_sqlite2.o \
+ $(EOLIST)
+
+#
+# These are the LIB files needed to create the NLM target above.
+# These will be added as a library command in the link.opt file.
+#
+FILES_nlm_libs = \
+ $(PRELUDE) \
+ $(EOLIST)
+
+ifeq ($(LINK_STATIC),1)
+FILES_nlm_libs += \
+ $(SQLITE2_LIB) \
+ $(EOLIST)
+endif
+
+#
+# These are the modules that the above NLM target depends on to load.
+# These will be added as a module command in the link.opt file.
+#
+FILES_nlm_modules = \
+ aprlib \
+ libc \
+ $(EOLIST)
+
+ifneq ($(LINK_STATIC),1)
+FILES_nlm_modules += \
+ $(SQLITE2_NLM) \
+ $(EOLIST)
+endif
+
+#
+# If the nlm has a msg file, put it's path here
+#
+FILE_nlm_msg =
+
+#
+# If the nlm has a hlp file put it's path here
+#
+FILE_nlm_hlp =
+
+#
+# If this is specified, it will override $(NWOS)\copyright.txt.
+#
+FILE_nlm_copyright =
+
+#
+# Any additional imports go here
+#
+FILES_nlm_Ximports = \
+ @$(APR)/aprlib.imp \
+ @libc.imp \
+ $(EOLIST)
+
+ifneq ($(LINK_STATIC),1)
+FILES_nlm_Ximports += \
+ @$(SQLITE2_IMP) \
+ $(EOLIST)
+endif
+
+#
+# Any symbols exported to here
+#
+FILES_nlm_exports = \
+ apr_dbd_sqlite2_driver \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the LIB target above.
+# Paths must all use the '/' character
+#
+FILES_lib_objs = \
+ $(EOLIST)
+
+#
+# implement targets and dependancies (leave this section alone)
+#
+
+libs :: $(OBJDIR) $(TARGET_lib)
+
+nlms :: libs $(TARGET_nlm)
+
+#
+# Updated this target to create necessary directories and copy files to the
+# correct place. (See $(AP_WORK)\build\NWGNUhead.inc for examples)
+#
+install :: nlms FORCE
+
+#
+# Any specialized rules here
+#
+
+#
+# Include the 'tail' makefile that has targets that depend on variables defined
+# in this makefile
+#
+
+include $(APRBUILD)/NWGNUtail.inc
+
+
+
diff --git a/contrib/apr-util/dbd/NWGNUdbdsqli3 b/contrib/apr-util/dbd/NWGNUdbdsqli3
new file mode 100644
index 000000000000..19a520428527
--- /dev/null
+++ b/contrib/apr-util/dbd/NWGNUdbdsqli3
@@ -0,0 +1,298 @@
+#
+# Declare the sub-directories to be built here
+#
+
+SUBDIRS = \
+ $(EOLIST)
+
+#
+# Get the 'head' of the build environment. This includes default targets and
+# paths to tools
+#
+
+ifndef EnvironmentDefined
+include $(APR_WORK)/build/NWGNUhead.inc
+endif
+
+#include $(APR)\build\NWGNUcustom.inc
+
+#
+# build this level's files
+
+#
+# Make sure all needed macro's are defined
+#
+
+# LINK_STATIC = 1
+
+# for now defined here - should finally go into build/NWGNUenvironment.inc
+SQLITE3_INC = $(SQLITE3SDK)/src
+SQLITE3_IMP = $(SQLITE3SDK)/lsqlite3.imp
+SQLITE3_LIB = $(SQLITE3SDK)/lsqlite3.lib
+SQLITE3_NLM = lsqlite3
+
+#
+# These directories will be at the beginning of the include list, followed by
+# INCDIRS
+#
+XINCDIRS += \
+ $(APR)/include/arch/netware \
+ $(APR)/include \
+ $(APU)/include \
+ $(APU)/include/private \
+ $(APR) \
+ $(SQLITE3_INC) \
+ $(EOLIST)
+
+#
+# These flags will come after CFLAGS
+#
+XCFLAGS += \
+ $(EOLIST)
+
+#
+# These defines will come after DEFINES
+#
+XDEFINES += \
+ -DAPU_DSO_MODULE_BUILD \
+ -DAPU_HAVE_SQLITE3=1 \
+ $(EOLIST)
+
+#
+# These flags will be added to the link.opt file
+#
+XLFLAGS += \
+ $(EOLIST)
+
+ifdef LINK_STATIC
+XLFLAGS += \
+ -l $(SQLITE3SDK) \
+ $(EOLIST)
+endif
+
+#
+# These values will be appended to the correct variables based on the value of
+# RELEASE
+#
+ifeq "$(RELEASE)" "debug"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "noopt"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "release"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+#
+# These are used by the link target if an NLM is being generated
+# This is used by the link 'name' directive to name the nlm. If left blank
+# TARGET_nlm (see below) will be used.
+#
+NLM_NAME = dbdsqli3
+
+#
+# This is used by the link '-desc ' directive.
+# If left blank, NLM_NAME will be used.
+#
+NLM_DESCRIPTION = Apache Portability Runtime Library $(VERSION_STR) DBD SQLite3 Driver Module
+
+#
+# This is used by the '-threadname' directive. If left blank,
+# NLM_NAME Thread will be used.
+#
+NLM_THREAD_NAME = dbdsqli3
+
+#
+# If this is specified, it will override VERSION value in
+# $(AP_WORK)\build\NWGNUenvironment.inc
+#
+NLM_VERSION =
+
+#
+# If this is specified, it will override the default of 64K
+#
+NLM_STACK_SIZE = 8192
+
+
+#
+# If this is specified it will be used by the link '-entry' directive
+#
+NLM_ENTRY_SYM =
+
+#
+# If this is specified it will be used by the link '-exit' directive
+#
+NLM_EXIT_SYM =
+
+#
+# If this is specified it will be used by the link '-check' directive
+#
+NLM_CHECK_SYM =
+
+#
+# If these are specified it will be used by the link '-flags' directive
+#
+NLM_FLAGS =
+
+#
+# If this is specified it will be linked in with the XDCData option in the def
+# file instead of the default of $(NWOS)/apache.xdc. XDCData can be disabled
+# by setting APACHE_UNIPROC in the environment
+#
+XDCDATA =
+
+#
+# If there is an NLM target, put it here
+#
+TARGET_nlm = \
+ $(OBJDIR)\$(NLM_NAME).nlm \
+ $(EOLIST)
+
+#
+# If there is an LIB target, put it here
+#
+TARGET_lib = \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the NLM target above.
+# Paths must all use the '/' character
+#
+FILES_nlm_objs = \
+ $(OBJDIR)/apr_dbd_sqlite3.o \
+ $(EOLIST)
+
+#
+# These are the LIB files needed to create the NLM target above.
+# These will be added as a library command in the link.opt file.
+#
+FILES_nlm_libs = \
+ $(PRELUDE) \
+ $(EOLIST)
+
+ifeq ($(LINK_STATIC),1)
+FILES_nlm_libs += \
+ $(SQLITE3_LIB) \
+ $(EOLIST)
+endif
+
+#
+# These are the modules that the above NLM target depends on to load.
+# These will be added as a module command in the link.opt file.
+#
+FILES_nlm_modules = \
+ aprlib \
+ libc \
+ $(EOLIST)
+
+ifneq ($(LINK_STATIC),1)
+FILES_nlm_modules += \
+ $(SQLITE3_NLM) \
+ $(EOLIST)
+endif
+
+#
+# If the nlm has a msg file, put it's path here
+#
+FILE_nlm_msg =
+
+#
+# If the nlm has a hlp file put it's path here
+#
+FILE_nlm_hlp =
+
+#
+# If this is specified, it will override $(NWOS)\copyright.txt.
+#
+FILE_nlm_copyright =
+
+#
+# Any additional imports go here
+#
+FILES_nlm_Ximports = \
+ @$(APR)/aprlib.imp \
+ @libc.imp \
+ apr_dbd_mutex_lock \
+ apr_dbd_mutex_unlock \
+ $(EOLIST)
+
+ifneq ($(LINK_STATIC),1)
+FILES_nlm_Ximports += \
+ @$(SQLITE3_IMP) \
+ $(EOLIST)
+endif
+
+#
+# Any symbols exported to here
+#
+FILES_nlm_exports = \
+ apr_dbd_sqlite3_driver \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the LIB target above.
+# Paths must all use the '/' character
+#
+FILES_lib_objs = \
+ $(EOLIST)
+
+#
+# implement targets and dependancies (leave this section alone)
+#
+
+libs :: $(OBJDIR) $(TARGET_lib)
+
+nlms :: libs $(TARGET_nlm)
+
+#
+# Updated this target to create necessary directories and copy files to the
+# correct place. (See $(AP_WORK)\build\NWGNUhead.inc for examples)
+#
+install :: nlms FORCE
+
+#
+# Any specialized rules here
+#
+
+#
+# Include the 'tail' makefile that has targets that depend on variables defined
+# in this makefile
+#
+
+include $(APRBUILD)/NWGNUtail.inc
+
+
+
diff --git a/contrib/apr-util/dbd/NWGNUmakefile b/contrib/apr-util/dbd/NWGNUmakefile
new file mode 100644
index 000000000000..b1e3e532678a
--- /dev/null
+++ b/contrib/apr-util/dbd/NWGNUmakefile
@@ -0,0 +1,262 @@
+#
+# Declare the sub-directories to be built here
+#
+
+SUBDIRS = \
+ $(EOLIST)
+
+#
+# Get the 'head' of the build environment. This includes default targets and
+# paths to tools
+#
+
+include $(APR_WORK)/build/NWGNUhead.inc
+
+#
+# build this level's files
+
+#
+# Make sure all needed macro's are defined
+#
+
+#
+# These directories will be at the beginning of the include list, followed by
+# INCDIRS
+#
+XINCDIRS += \
+ $(EOLIST)
+
+#
+# These flags will come after CFLAGS
+#
+XCFLAGS += \
+ $(EOLIST)
+
+#
+# These defines will come after DEFINES
+#
+XDEFINES += \
+ $(EOLIST)
+
+#
+# These flags will be added to the link.opt file
+#
+XLFLAGS += \
+ $(EOLIST)
+
+#
+# These values will be appended to the correct variables based on the value of
+# RELEASE
+#
+ifeq "$(RELEASE)" "debug"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "noopt"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "release"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+#
+# These are used by the link target if an NLM is being generated
+# This is used by the link 'name' directive to name the nlm. If left blank
+# TARGET_nlm (see below) will be used.
+#
+NLM_NAME =
+
+#
+# This is used by the link '-desc ' directive.
+# If left blank, NLM_NAME will be used.
+#
+NLM_DESCRIPTION =
+
+#
+# This is used by the '-threadname' directive. If left blank,
+# NLM_NAME Thread will be used.
+#
+NLM_THREAD_NAME =
+
+#
+# If this is specified, it will override VERSION value in
+# $(AP_WORK)\build\NWGNUenvironment.inc
+#
+NLM_VERSION =
+
+#
+# If this is specified, it will override the default of 64K
+#
+NLM_STACK_SIZE =
+
+
+#
+# If this is specified it will be used by the link '-entry' directive
+#
+NLM_ENTRY_SYM =
+
+#
+# If this is specified it will be used by the link '-exit' directive
+#
+NLM_EXIT_SYM =
+
+#
+# If this is specified it will be used by the link '-check' directive
+#
+NLM_CHECK_SYM =
+
+#
+# If these are specified it will be used by the link '-flags' directive
+#
+NLM_FLAGS =
+
+#
+# If this is specified it will be linked in with the XDCData option in the def
+# file instead of the default of $(NWOS)/apache.xdc. XDCData can be disabled
+# by setting APACHE_UNIPROC in the environment
+#
+XDCDATA =
+
+#
+# If there is an NLM target, put it here
+#
+TARGET_nlm = \
+ $(EOLIST)
+
+ifeq "$(APU_HAVE_MYSQL)" "1"
+ifeq "$(wildcard apr_dbd_mysql.c)" "apr_dbd_mysql.c"
+TARGET_nlm += $(OBJDIR)/dbdmysql.nlm $(OBJDIR)/dbdmysql.nlm $(EOLIST)
+endif
+endif
+ifeq "$(APU_HAVE_PGSQL)" "1"
+TARGET_nlm += $(OBJDIR)/dbdpgsql.nlm $(OBJDIR)/dbdpgsql.nlm $(EOLIST)
+endif
+ifeq "$(APU_HAVE_SQLITE2)" "1"
+TARGET_nlm += $(OBJDIR)/dbdsqli2.nlm $(OBJDIR)/dbdsqli2.nlm $(EOLIST)
+endif
+ifeq "$(APU_HAVE_SQLITE3)" "1"
+TARGET_nlm += $(OBJDIR)/dbdsqli3.nlm $(OBJDIR)/dbdsqli3.nlm $(EOLIST)
+endif
+ifeq "$(APU_HAVE_FREETDS)" "1"
+TARGET_nlm += $(OBJDIR)/dbdfreetds.nlm $(OBJDIR)/dbdfreetds.nlm $(EOLIST)
+endif
+
+#
+# If there is an LIB target, put it here
+#
+TARGET_lib = \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the NLM target above.
+# Paths must all use the '/' character
+#
+FILES_nlm_objs = \
+ $(EOLIST)
+
+#
+# These are the LIB files needed to create the NLM target above.
+# These will be added as a library command in the link.opt file.
+#
+FILES_nlm_libs = \
+ $(EOLIST)
+
+#
+# These are the modules that the above NLM target depends on to load.
+# These will be added as a module command in the link.opt file.
+#
+FILES_nlm_modules = \
+ $(EOLIST)
+
+#
+# If the nlm has a msg file, put it's path here
+#
+FILE_nlm_msg =
+
+#
+# If the nlm has a hlp file put it's path here
+#
+FILE_nlm_hlp =
+
+#
+# If this is specified, it will override $(NWOS)\copyright.txt.
+#
+FILE_nlm_copyright =
+
+#
+# Any additional imports go here
+#
+FILES_nlm_Ximports = \
+ $(EOLIST)
+
+#
+# Any symbols exported to here
+#
+FILES_nlm_exports = \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the LIB target above.
+# Paths must all use the '/' character
+#
+FILES_lib_objs = \
+ $(EOLIST)
+
+#
+# implement targets and dependancies (leave this section alone)
+#
+
+libs :: $(OBJDIR) $(TARGET_lib)
+
+nlms :: libs $(TARGET_nlm)
+
+#
+# Updated this target to create necessary directories and copy files to the
+# correct place. (See $(AP_WORK)\build\NWGNUhead.inc for examples)
+#
+install :: nlms $(INSTDIRS) FORCE
+ $(call COPY,$(OBJDIR)/*.nlm,$(INSTALLBASE))
+
+#
+# Any specialized rules here
+#
+
+#
+# Include the 'tail' makefile that has targets that depend on variables defined
+# in this makefile
+#
+
+include $(APRBUILD)/NWGNUtail.inc
+
+
diff --git a/contrib/apr-util/dbd/apr_dbd.c b/contrib/apr-util/dbd/apr_dbd.c
new file mode 100644
index 000000000000..bfa97d9e380a
--- /dev/null
+++ b/contrib/apr-util/dbd/apr_dbd.c
@@ -0,0 +1,576 @@
+/* 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 <ctype.h>
+#include <stdio.h>
+
+#include "apu_config.h"
+#include "apu.h"
+
+#include "apr_pools.h"
+#include "apr_dso.h"
+#include "apr_strings.h"
+#include "apr_hash.h"
+#include "apr_thread_mutex.h"
+#include "apr_lib.h"
+#include "apr_atomic.h"
+
+#include "apu_internal.h"
+#include "apr_dbd_internal.h"
+#include "apr_dbd.h"
+#include "apu_version.h"
+
+static apr_hash_t *drivers = NULL;
+static apr_uint32_t initialised = 0, in_init = 1;
+
+#define CLEANUP_CAST (apr_status_t (*)(void*))
+
+#if APR_HAS_THREADS
+/* deprecated, but required for existing providers. Existing and new
+ * providers should be refactored to use a provider-specific mutex so
+ * that different providers do not block one another.
+ * In APR 1.3 this is no longer used for dso module loading, and
+ * apu_dso_mutex_[un]lock is used instead.
+ * In APR 2.0 this should become entirely local to libaprutil-2.so and
+ * no longer be exported.
+ */
+static apr_thread_mutex_t* mutex = NULL;
+APU_DECLARE(apr_status_t) apr_dbd_mutex_lock()
+{
+ return apr_thread_mutex_lock(mutex);
+}
+APU_DECLARE(apr_status_t) apr_dbd_mutex_unlock()
+{
+ return apr_thread_mutex_unlock(mutex);
+}
+#else
+APU_DECLARE(apr_status_t) apr_dbd_mutex_lock() {
+ return APR_SUCCESS;
+}
+APU_DECLARE(apr_status_t) apr_dbd_mutex_unlock() {
+ return APR_SUCCESS;
+}
+#endif
+
+#if !APU_DSO_BUILD
+#define DRIVER_LOAD(name,driver,pool) \
+ { \
+ extern const apr_dbd_driver_t driver; \
+ apr_hash_set(drivers,name,APR_HASH_KEY_STRING,&driver); \
+ if (driver.init) { \
+ driver.init(pool); \
+ } \
+ }
+#endif
+
+static apr_status_t apr_dbd_term(void *ptr)
+{
+ /* set drivers to NULL so init can work again */
+ drivers = NULL;
+
+ /* Everything else we need is handled by cleanups registered
+ * when we created mutexes and loaded DSOs
+ */
+ return APR_SUCCESS;
+}
+
+APU_DECLARE(apr_status_t) apr_dbd_init(apr_pool_t *pool)
+{
+ apr_status_t ret = APR_SUCCESS;
+ apr_pool_t *parent;
+
+ if (apr_atomic_inc32(&initialised)) {
+ apr_atomic_set32(&initialised, 1); /* prevent wrap-around */
+
+ while (apr_atomic_read32(&in_init)) /* wait until we get fully inited */
+ ;
+
+ return APR_SUCCESS;
+ }
+
+ /* Top level pool scope, need process-scope lifetime */
+ for (parent = apr_pool_parent_get(pool);
+ parent && parent != pool;
+ parent = apr_pool_parent_get(pool))
+ pool = parent;
+#if APU_DSO_BUILD
+ /* deprecate in 2.0 - permit implicit initialization */
+ apu_dso_init(pool);
+#endif
+
+ drivers = apr_hash_make(pool);
+
+#if APR_HAS_THREADS
+ ret = apr_thread_mutex_create(&mutex, APR_THREAD_MUTEX_DEFAULT, pool);
+ /* This already registers a pool cleanup */
+#endif
+
+#if !APU_DSO_BUILD
+
+ /* Load statically-linked drivers: */
+#if APU_HAVE_MYSQL
+ DRIVER_LOAD("mysql", apr_dbd_mysql_driver, pool);
+#endif
+#if APU_HAVE_PGSQL
+ DRIVER_LOAD("pgsql", apr_dbd_pgsql_driver, pool);
+#endif
+#if APU_HAVE_SQLITE3
+ DRIVER_LOAD("sqlite3", apr_dbd_sqlite3_driver, pool);
+#endif
+#if APU_HAVE_SQLITE2
+ DRIVER_LOAD("sqlite2", apr_dbd_sqlite2_driver, pool);
+#endif
+#if APU_HAVE_ORACLE
+ DRIVER_LOAD("oracle", apr_dbd_oracle_driver, pool);
+#endif
+#if APU_HAVE_FREETDS
+ DRIVER_LOAD("freetds", apr_dbd_freetds_driver, pool);
+#endif
+#if APU_HAVE_ODBC
+ DRIVER_LOAD("odbc", apr_dbd_odbc_driver, pool);
+#endif
+#if APU_HAVE_SOME_OTHER_BACKEND
+ DRIVER_LOAD("firebird", apr_dbd_other_driver, pool);
+#endif
+#endif /* APU_DSO_BUILD */
+
+ apr_pool_cleanup_register(pool, NULL, apr_dbd_term,
+ apr_pool_cleanup_null);
+
+ apr_atomic_dec32(&in_init);
+
+ return ret;
+}
+
+APU_DECLARE(apr_status_t) apr_dbd_get_driver(apr_pool_t *pool, const char *name,
+ const apr_dbd_driver_t **driver)
+{
+#if APU_DSO_BUILD
+ char modname[32];
+ char symname[34];
+ apr_dso_handle_sym_t symbol;
+#endif
+ apr_status_t rv;
+
+#if APU_DSO_BUILD
+ rv = apu_dso_mutex_lock();
+ if (rv) {
+ return rv;
+ }
+#endif
+ *driver = apr_hash_get(drivers, name, APR_HASH_KEY_STRING);
+ if (*driver) {
+#if APU_DSO_BUILD
+ apu_dso_mutex_unlock();
+#endif
+ return APR_SUCCESS;
+ }
+
+#if APU_DSO_BUILD
+ /* The driver DSO must have exactly the same lifetime as the
+ * drivers hash table; ignore the passed-in pool */
+ pool = apr_hash_pool_get(drivers);
+
+#if defined(NETWARE)
+ apr_snprintf(modname, sizeof(modname), "dbd%s.nlm", name);
+#elif defined(WIN32) || defined(__CYGWIN__)
+ apr_snprintf(modname, sizeof(modname),
+ "apr_dbd_%s-" APU_STRINGIFY(APU_MAJOR_VERSION) ".dll", name);
+#else
+ apr_snprintf(modname, sizeof(modname),
+ "apr_dbd_%s-" APU_STRINGIFY(APU_MAJOR_VERSION) ".so", name);
+#endif
+ apr_snprintf(symname, sizeof(symname), "apr_dbd_%s_driver", name);
+ rv = apu_dso_load(NULL, &symbol, modname, symname, pool);
+ if (rv == APR_SUCCESS || rv == APR_EINIT) { /* previously loaded?!? */
+ *driver = symbol;
+ name = apr_pstrdup(pool, name);
+ apr_hash_set(drivers, name, APR_HASH_KEY_STRING, *driver);
+ rv = APR_SUCCESS;
+ if ((*driver)->init) {
+ (*driver)->init(pool);
+ }
+ }
+ apu_dso_mutex_unlock();
+
+#else /* not builtin and !APU_DSO_BUILD => not implemented */
+ rv = APR_ENOTIMPL;
+#endif
+
+ return rv;
+}
+
+APU_DECLARE(apr_status_t) apr_dbd_open_ex(const apr_dbd_driver_t *driver,
+ apr_pool_t *pool, const char *params,
+ apr_dbd_t **handle,
+ const char **error)
+{
+ apr_status_t rv;
+ *handle = (driver->open)(pool, params, error);
+ if (*handle == NULL) {
+ return APR_EGENERAL;
+ }
+ rv = apr_dbd_check_conn(driver, pool, *handle);
+ if ((rv != APR_SUCCESS) && (rv != APR_ENOTIMPL)) {
+ /* XXX: rv is APR error code, but apr_dbd_error() takes int! */
+ if (error) {
+ *error = apr_dbd_error(driver, *handle, rv);
+ }
+ apr_dbd_close(driver, *handle);
+ return APR_EGENERAL;
+ }
+ return APR_SUCCESS;
+}
+
+APU_DECLARE(apr_status_t) apr_dbd_open(const apr_dbd_driver_t *driver,
+ apr_pool_t *pool, const char *params,
+ apr_dbd_t **handle)
+{
+ return apr_dbd_open_ex(driver,pool,params,handle,NULL);
+}
+
+APU_DECLARE(int) apr_dbd_transaction_start(const apr_dbd_driver_t *driver,
+ apr_pool_t *pool, apr_dbd_t *handle,
+ apr_dbd_transaction_t **trans)
+{
+ int ret = driver->start_transaction(pool, handle, trans);
+ if (*trans) {
+ apr_pool_cleanup_register(pool, *trans,
+ CLEANUP_CAST driver->end_transaction,
+ apr_pool_cleanup_null);
+ }
+ return ret;
+}
+
+APU_DECLARE(int) apr_dbd_transaction_end(const apr_dbd_driver_t *driver,
+ apr_pool_t *pool,
+ apr_dbd_transaction_t *trans)
+{
+ apr_pool_cleanup_kill(pool, trans, CLEANUP_CAST driver->end_transaction);
+ return driver->end_transaction(trans);
+}
+
+APU_DECLARE(int) apr_dbd_transaction_mode_get(const apr_dbd_driver_t *driver,
+ apr_dbd_transaction_t *trans)
+{
+ return driver->transaction_mode_get(trans);
+}
+
+APU_DECLARE(int) apr_dbd_transaction_mode_set(const apr_dbd_driver_t *driver,
+ apr_dbd_transaction_t *trans,
+ int mode)
+{
+ return driver->transaction_mode_set(trans, mode);
+}
+
+APU_DECLARE(apr_status_t) apr_dbd_close(const apr_dbd_driver_t *driver,
+ apr_dbd_t *handle)
+{
+ return driver->close(handle);
+}
+
+APU_DECLARE(const char*) apr_dbd_name(const apr_dbd_driver_t *driver)
+{
+ return driver->name;
+}
+
+APU_DECLARE(void*) apr_dbd_native_handle(const apr_dbd_driver_t *driver,
+ apr_dbd_t *handle)
+{
+ return driver->native_handle(handle);
+}
+
+APU_DECLARE(int) apr_dbd_check_conn(const apr_dbd_driver_t *driver,
+ apr_pool_t *pool,
+ apr_dbd_t *handle)
+{
+ return driver->check_conn(pool, handle);
+}
+
+APU_DECLARE(int) apr_dbd_set_dbname(const apr_dbd_driver_t *driver,
+ apr_pool_t *pool,
+ apr_dbd_t *handle, const char *name)
+{
+ return driver->set_dbname(pool,handle,name);
+}
+
+APU_DECLARE(int) apr_dbd_query(const apr_dbd_driver_t *driver,
+ apr_dbd_t *handle,
+ int *nrows, const char *statement)
+{
+ return driver->query(handle,nrows,statement);
+}
+
+APU_DECLARE(int) apr_dbd_select(const apr_dbd_driver_t *driver,
+ apr_pool_t *pool,
+ apr_dbd_t *handle, apr_dbd_results_t **res,
+ const char *statement, int random)
+{
+ return driver->select(pool,handle,res,statement,random);
+}
+
+APU_DECLARE(int) apr_dbd_num_cols(const apr_dbd_driver_t *driver,
+ apr_dbd_results_t *res)
+{
+ return driver->num_cols(res);
+}
+
+APU_DECLARE(int) apr_dbd_num_tuples(const apr_dbd_driver_t *driver,
+ apr_dbd_results_t *res)
+{
+ return driver->num_tuples(res);
+}
+
+APU_DECLARE(int) apr_dbd_get_row(const apr_dbd_driver_t *driver,
+ apr_pool_t *pool,
+ apr_dbd_results_t *res, apr_dbd_row_t **row,
+ int rownum)
+{
+ return driver->get_row(pool,res,row,rownum);
+}
+
+APU_DECLARE(const char*) apr_dbd_get_entry(const apr_dbd_driver_t *driver,
+ apr_dbd_row_t *row, int col)
+{
+ return driver->get_entry(row,col);
+}
+
+APU_DECLARE(const char*) apr_dbd_get_name(const apr_dbd_driver_t *driver,
+ apr_dbd_results_t *res, int col)
+{
+ return driver->get_name(res,col);
+}
+
+APU_DECLARE(const char*) apr_dbd_error(const apr_dbd_driver_t *driver,
+ apr_dbd_t *handle, int errnum)
+{
+ return driver->error(handle,errnum);
+}
+
+APU_DECLARE(const char*) apr_dbd_escape(const apr_dbd_driver_t *driver,
+ apr_pool_t *pool, const char *string,
+ apr_dbd_t *handle)
+{
+ return driver->escape(pool,string,handle);
+}
+
+APU_DECLARE(int) apr_dbd_prepare(const apr_dbd_driver_t *driver,
+ apr_pool_t *pool,
+ apr_dbd_t *handle, const char *query,
+ const char *label,
+ apr_dbd_prepared_t **statement)
+{
+ size_t qlen;
+ int i, nargs = 0, nvals = 0;
+ char *p, *pq;
+ const char *q;
+ apr_dbd_type_e *t;
+
+ if (!driver->pformat) {
+ return APR_ENOTIMPL;
+ }
+
+ /* find the number of parameters in the query */
+ for (q = query; *q; q++) {
+ if (q[0] == '%') {
+ if (apr_isalpha(q[1])) {
+ nargs++;
+ } else if (q[1] == '%') {
+ q++;
+ }
+ }
+ }
+ nvals = nargs;
+
+ qlen = strlen(query) +
+ nargs * (strlen(driver->pformat) + sizeof(nargs) * 3 + 2) + 1;
+ pq = apr_palloc(pool, qlen);
+ t = apr_pcalloc(pool, sizeof(*t) * nargs);
+
+ for (p = pq, q = query, i = 0; *q; q++) {
+ if (q[0] == '%') {
+ if (apr_isalpha(q[1])) {
+ switch (q[1]) {
+ case 'd': t[i] = APR_DBD_TYPE_INT; break;
+ case 'u': t[i] = APR_DBD_TYPE_UINT; break;
+ case 'f': t[i] = APR_DBD_TYPE_FLOAT; break;
+ case 'h':
+ switch (q[2]) {
+ case 'h':
+ switch (q[3]){
+ case 'd': t[i] = APR_DBD_TYPE_TINY; q += 2; break;
+ case 'u': t[i] = APR_DBD_TYPE_UTINY; q += 2; break;
+ }
+ break;
+ case 'd': t[i] = APR_DBD_TYPE_SHORT; q++; break;
+ case 'u': t[i] = APR_DBD_TYPE_USHORT; q++; break;
+ }
+ break;
+ case 'l':
+ switch (q[2]) {
+ case 'l':
+ switch (q[3]){
+ case 'd': t[i] = APR_DBD_TYPE_LONGLONG; q += 2; break;
+ case 'u': t[i] = APR_DBD_TYPE_ULONGLONG; q += 2; break;
+ }
+ break;
+ case 'd': t[i] = APR_DBD_TYPE_LONG; q++; break;
+ case 'u': t[i] = APR_DBD_TYPE_ULONG; q++; break;
+ case 'f': t[i] = APR_DBD_TYPE_DOUBLE; q++; break;
+ }
+ break;
+ case 'p':
+ if (q[2] == 'D') {
+ switch (q[3]) {
+ case 't': t[i] = APR_DBD_TYPE_TEXT; q += 2; break;
+ case 'i': t[i] = APR_DBD_TYPE_TIME; q += 2; break;
+ case 'd': t[i] = APR_DBD_TYPE_DATE; q += 2; break;
+ case 'a': t[i] = APR_DBD_TYPE_DATETIME; q += 2; break;
+ case 's': t[i] = APR_DBD_TYPE_TIMESTAMP; q += 2; break;
+ case 'z': t[i] = APR_DBD_TYPE_ZTIMESTAMP; q += 2; break;
+ case 'b': t[i] = APR_DBD_TYPE_BLOB; q += 2; break;
+ case 'c': t[i] = APR_DBD_TYPE_CLOB; q += 2; break;
+ case 'n': t[i] = APR_DBD_TYPE_NULL; q += 2; break;
+ }
+ }
+ break;
+ }
+ q++;
+
+ switch (t[i]) {
+ case APR_DBD_TYPE_NONE: /* by default, we expect strings */
+ t[i] = APR_DBD_TYPE_STRING;
+ break;
+ case APR_DBD_TYPE_BLOB:
+ case APR_DBD_TYPE_CLOB: /* three (3) more values passed in */
+ nvals += 3;
+ break;
+ default:
+ break;
+ }
+
+ /* insert database specific parameter reference */
+ p += apr_snprintf(p, qlen - (p - pq), driver->pformat, ++i);
+ } else if (q[1] == '%') { /* reduce %% to % */
+ *p++ = *q++;
+ } else {
+ *p++ = *q;
+ }
+ } else {
+ *p++ = *q;
+ }
+ }
+ *p = '\0';
+
+ return driver->prepare(pool,handle,pq,label,nargs,nvals,t,statement);
+}
+
+APU_DECLARE(int) apr_dbd_pquery(const apr_dbd_driver_t *driver,
+ apr_pool_t *pool,
+ apr_dbd_t *handle, int *nrows,
+ apr_dbd_prepared_t *statement,
+ int nargs, const char **args)
+{
+ return driver->pquery(pool,handle,nrows,statement,args);
+}
+
+APU_DECLARE(int) apr_dbd_pselect(const apr_dbd_driver_t *driver,
+ apr_pool_t *pool,
+ apr_dbd_t *handle, apr_dbd_results_t **res,
+ apr_dbd_prepared_t *statement, int random,
+ int nargs, const char **args)
+{
+ return driver->pselect(pool,handle,res,statement,random,args);
+}
+
+APU_DECLARE_NONSTD(int) apr_dbd_pvquery(const apr_dbd_driver_t *driver,
+ apr_pool_t *pool,
+ apr_dbd_t *handle, int *nrows,
+ apr_dbd_prepared_t *statement, ...)
+{
+ int ret;
+ va_list args;
+ va_start(args, statement);
+ ret = driver->pvquery(pool,handle,nrows,statement,args);
+ va_end(args);
+ return ret;
+}
+
+APU_DECLARE_NONSTD(int) apr_dbd_pvselect(const apr_dbd_driver_t *driver,
+ apr_pool_t *pool, apr_dbd_t *handle,
+ apr_dbd_results_t **res,
+ apr_dbd_prepared_t *statement,
+ int random, ...)
+{
+ int ret;
+ va_list args;
+ va_start(args, random);
+ ret = driver->pvselect(pool,handle,res,statement,random,args);
+ va_end(args);
+ return ret;
+}
+
+APU_DECLARE(int) apr_dbd_pbquery(const apr_dbd_driver_t *driver,
+ apr_pool_t *pool,
+ apr_dbd_t *handle, int *nrows,
+ apr_dbd_prepared_t *statement,
+ const void **args)
+{
+ return driver->pbquery(pool,handle,nrows,statement,args);
+}
+
+APU_DECLARE(int) apr_dbd_pbselect(const apr_dbd_driver_t *driver,
+ apr_pool_t *pool,
+ apr_dbd_t *handle, apr_dbd_results_t **res,
+ apr_dbd_prepared_t *statement, int random,
+ const void **args)
+{
+ return driver->pbselect(pool,handle,res,statement,random,args);
+}
+
+APU_DECLARE_NONSTD(int) apr_dbd_pvbquery(const apr_dbd_driver_t *driver,
+ apr_pool_t *pool,
+ apr_dbd_t *handle, int *nrows,
+ apr_dbd_prepared_t *statement, ...)
+{
+ int ret;
+ va_list args;
+ va_start(args, statement);
+ ret = driver->pvbquery(pool,handle,nrows,statement,args);
+ va_end(args);
+ return ret;
+}
+
+APU_DECLARE_NONSTD(int) apr_dbd_pvbselect(const apr_dbd_driver_t *driver,
+ apr_pool_t *pool, apr_dbd_t *handle,
+ apr_dbd_results_t **res,
+ apr_dbd_prepared_t *statement,
+ int random, ...)
+{
+ int ret;
+ va_list args;
+ va_start(args, random);
+ ret = driver->pvbselect(pool,handle,res,statement,random,args);
+ va_end(args);
+ return ret;
+}
+
+APU_DECLARE(apr_status_t) apr_dbd_datum_get(const apr_dbd_driver_t *driver,
+ apr_dbd_row_t *row, int col,
+ apr_dbd_type_e type, void *data)
+{
+ return driver->datum_get(row,col,type,data);
+}
diff --git a/contrib/apr-util/dbd/apr_dbd_freetds.c b/contrib/apr-util/dbd/apr_dbd_freetds.c
new file mode 100644
index 000000000000..d0b4b20025ec
--- /dev/null
+++ b/contrib/apr-util/dbd/apr_dbd_freetds.c
@@ -0,0 +1,805 @@
+/* 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 "apu.h"
+#include "apu_config.h"
+
+/* COMPILE_STUBS: compile stubs for unimplemented functions.
+ *
+ * This is required to compile in /trunk/, but can be
+ * undefined to compile a driver for httpd-2.2 and other
+ * APR-1.2 applications
+ */
+#define COMPILE_STUBS
+
+#if APU_HAVE_FREETDS
+
+#include <ctype.h>
+#include <stdlib.h>
+
+#include "apr_strings.h"
+#include "apr_lib.h"
+
+#include "apr_pools.h"
+#include "apr_dbd_internal.h"
+
+#ifdef HAVE_FREETDS_SYBDB_H
+#include <freetds/sybdb.h>
+#endif
+#ifdef HAVE_SYBDB_H
+#include <sybdb.h>
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <regex.h>
+
+/* This probably needs to change for different applications */
+#define MAX_COL_LEN 256
+
+typedef struct freetds_cell_t {
+ int type;
+ DBINT len;
+ BYTE *data;
+} freetds_cell_t;
+
+struct apr_dbd_transaction_t {
+ int mode;
+ int errnum;
+ apr_dbd_t *handle;
+};
+
+struct apr_dbd_t {
+ DBPROCESS *proc;
+ apr_dbd_transaction_t *trans;
+ apr_pool_t *pool;
+ const char *params;
+ RETCODE err;
+};
+
+struct apr_dbd_results_t {
+ int random;
+ size_t ntuples;
+ size_t sz;
+ apr_pool_t *pool;
+ DBPROCESS *proc;
+};
+
+struct apr_dbd_row_t {
+ apr_dbd_results_t *res;
+ BYTE buf[MAX_COL_LEN];
+};
+
+struct apr_dbd_prepared_t {
+ int nargs;
+ regex_t **taint;
+ int *sz;
+ char *fmt;
+};
+
+#define dbd_freetds_is_success(x) (x == SUCCEED)
+
+static int labelnum = 0; /* FIXME */
+static regex_t dbd_freetds_find_arg;
+
+/* execute a query that doesn't return a result set, mop up,
+ * and return and APR-flavoured status
+ */
+static RETCODE freetds_exec(DBPROCESS *proc, const char *query,
+ int want_results, int *nrows)
+{
+ /* TBD */
+ RETCODE rv = dbcmd(proc, query);
+ if (rv != SUCCEED) {
+ return rv;
+ }
+ rv = dbsqlexec(proc);
+ if (rv != SUCCEED) {
+ return rv;
+ }
+ if (!want_results) {
+ while (dbresults(proc) != NO_MORE_RESULTS) {
+ ++*nrows;
+ }
+ }
+ return SUCCEED;
+}
+static apr_status_t clear_result(void *data)
+{
+ /* clear cursor */
+ return (dbcanquery((DBPROCESS*)data) == SUCCEED)
+ ? APR_SUCCESS
+ : APR_EGENERAL;
+}
+
+static int dbd_freetds_select(apr_pool_t *pool, apr_dbd_t *sql,
+ apr_dbd_results_t **results,
+ const char *query, int seek)
+{
+ apr_dbd_results_t *res;
+ if (sql->trans && (sql->trans->errnum != SUCCEED)) {
+ return 1;
+ }
+ /* the core of this is
+ * dbcmd(proc, query);
+ * dbsqlexec(proc);
+ * while (dbnextrow(dbproc) != NO_MORE_ROWS) {
+ * do things
+ * }
+ *
+ * Ignore seek
+ */
+
+ sql->err = freetds_exec(sql->proc, query, 1, NULL);
+ if (!dbd_freetds_is_success(sql->err)) {
+ if (sql->trans) {
+ sql->trans->errnum = sql->err;
+ }
+ return 1;
+ }
+
+ sql->err = dbresults(sql->proc);
+ if (sql->err != SUCCEED) {
+ if (sql->trans) {
+ sql->trans->errnum = sql->err;
+ }
+ return 1;
+ }
+
+ if (!*results) {
+ *results = apr_pcalloc(pool, sizeof(apr_dbd_results_t));
+ }
+ res = *results;
+ res->proc = sql->proc;
+ res->random = seek;
+ res->pool = pool;
+ res->ntuples = dblastrow(sql->proc);
+ res->sz = dbnumcols(sql->proc);
+ apr_pool_cleanup_register(pool, sql->proc, clear_result,
+ apr_pool_cleanup_null);
+
+#if 0
+ /* Now we have a result set. We need to bind to its vars */
+ res->vars = apr_palloc(pool, res->sz * sizeof(freetds_cell_t*));
+ for (i=1; i <= res->sz; ++i) {
+ freetds_cell_t *cell = &res->vars[i-1];
+ cell->type = dbcoltype(sql->proc, i);
+ cell->len = dbcollen(sql->proc, i);
+ cell->data = apr_palloc(pool, cell->len);
+ sql->err = dbbind(sql->proc, i, /*cell->type */ STRINGBIND, cell->len, cell->data);
+ if (sql->err != SUCCEED) {
+ fprintf(stderr, "dbbind error: %d, %d, %d", i, cell->type, cell->len);
+ }
+ if ((sql->err != SUCCEED) && (sql->trans != NULL)) {
+ sql->trans->errnum = sql->err;
+ }
+ }
+#endif
+ return (sql->err == SUCCEED) ? 0 : 1;
+}
+static const char *dbd_untaint(apr_pool_t *pool, regex_t *rx, const char *val)
+{
+ regmatch_t match[1];
+ if (rx == NULL) {
+ /* no untaint expression */
+ return val;
+ }
+ if (regexec(rx, val, 1, match, 0) == 0) {
+ return apr_pstrndup(pool, val+match[0].rm_so,
+ match[0].rm_eo - match[0].rm_so);
+ }
+ return "";
+}
+static const char *dbd_statement(apr_pool_t *pool,
+ apr_dbd_prepared_t *stmt,
+ int nargs, const char **args)
+{
+ int i;
+ int len;
+ const char *var;
+ char *ret;
+ const char *p_in;
+ char *p_out;
+ char *q;
+
+ /* compute upper bound on length (since untaint shrinks) */
+ len = strlen(stmt->fmt) +1;
+ for (i=0; i<nargs; ++i) {
+ len += strlen(args[i]) - 2;
+ }
+ i = 0;
+ p_in = stmt->fmt;
+ p_out = ret = apr_palloc(pool, len);
+ /* FIXME silly bug - this'll catch %%s */
+ while (q = strstr(p_in, "%s"), q != NULL) {
+ len = q-p_in;
+ strncpy(p_out, p_in, len);
+ p_in += len;
+ p_out += len;
+ var = dbd_untaint(pool, stmt->taint[i], args[i]);
+ len = strlen(var);
+ strncpy(p_out, var, len);
+ p_in += 2;
+ p_out += len;
+ ++i;
+ }
+ strcpy(p_out, p_in);
+ return ret;
+}
+static int dbd_freetds_pselect(apr_pool_t *pool, apr_dbd_t *sql,
+ apr_dbd_results_t **results,
+ apr_dbd_prepared_t *statement,
+ int seek, const char **values)
+{
+ const char *query = dbd_statement(pool, statement,
+ statement->nargs, values);
+ return dbd_freetds_select(pool, sql, results, query, seek);
+}
+static int dbd_freetds_pvselect(apr_pool_t *pool, apr_dbd_t *sql,
+ apr_dbd_results_t **results,
+ apr_dbd_prepared_t *statement,
+ int seek, va_list args)
+{
+ const char **values;
+ int i;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ values = apr_palloc(pool, sizeof(*values) * statement->nargs);
+
+ for (i = 0; i < statement->nargs; i++) {
+ values[i] = va_arg(args, const char*);
+ }
+
+ return dbd_freetds_pselect(pool, sql, results, statement, seek, values);
+}
+static int dbd_freetds_query(apr_dbd_t *sql, int *nrows, const char *query);
+static int dbd_freetds_pquery(apr_pool_t *pool, apr_dbd_t *sql,
+ int *nrows, apr_dbd_prepared_t *statement,
+ const char **values)
+{
+ const char *query = dbd_statement(pool, statement,
+ statement->nargs, values);
+ return dbd_freetds_query(sql, nrows, query);
+}
+static int dbd_freetds_pvquery(apr_pool_t *pool, apr_dbd_t *sql, int *nrows,
+ apr_dbd_prepared_t *statement, va_list args)
+{
+ const char **values;
+ int i;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ values = apr_palloc(pool, sizeof(*values) * statement->nargs);
+
+ for (i = 0; i < statement->nargs; i++) {
+ values[i] = va_arg(args, const char*);
+ }
+ return dbd_freetds_pquery(pool, sql, nrows, statement, values);
+}
+
+static int dbd_freetds_get_row(apr_pool_t *pool, apr_dbd_results_t *res,
+ apr_dbd_row_t **rowp, int rownum)
+{
+ RETCODE rv = 0;
+ apr_dbd_row_t *row = *rowp;
+ int sequential = ((rownum >= 0) && res->random) ? 0 : 1;
+
+ if (row == NULL) {
+ row = apr_palloc(pool, sizeof(apr_dbd_row_t));
+ *rowp = row;
+ row->res = res;
+ }
+ /*
+ else {
+ if ( sequential ) {
+ ++row->n;
+ }
+ else {
+ row->n = rownum;
+ }
+ }
+ */
+ if (sequential) {
+ rv = dbnextrow(res->proc);
+ }
+ else {
+ rv = (rownum >= 0) ? dbgetrow(res->proc, rownum) : NO_MORE_ROWS;
+ }
+ switch (rv) {
+ case SUCCEED: return 0;
+ case REG_ROW: return 0;
+ case NO_MORE_ROWS:
+ apr_pool_cleanup_run(res->pool, res->proc, clear_result);
+ *rowp = NULL;
+ return -1;
+ case FAIL: return 1;
+ case BUF_FULL: return 2; /* FIXME */
+ default: return 3;
+ }
+
+ return 0;
+}
+
+static const char *dbd_freetds_get_entry(const apr_dbd_row_t *row, int n)
+{
+ /* FIXME: support different data types */
+ /* this fails - bind gets some vars but not others
+ return (const char*)row->res->vars[n].data;
+ */
+ DBPROCESS* proc = row->res->proc;
+ BYTE *ptr = dbdata(proc, n+1);
+ int t = dbcoltype(proc, n+1);
+ int l = dbcollen(proc, n+1);
+ if (dbwillconvert(t, SYBCHAR)) {
+ dbconvert(proc, t, ptr, l, SYBCHAR, (BYTE *)row->buf, -1);
+ return (const char*)row->buf;
+ }
+ return (char*)ptr;
+}
+
+static const char *dbd_freetds_error(apr_dbd_t *sql, int n)
+{
+ /* XXX this doesn't seem to exist in the API ??? */
+ return apr_psprintf(sql->pool, "Error %d", sql->err);
+}
+
+static int dbd_freetds_query(apr_dbd_t *sql, int *nrows, const char *query)
+{
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+ *nrows = 0;
+ sql->err = freetds_exec(sql->proc, query, 0, nrows);
+
+ if (sql->err != SUCCEED) {
+ if (sql->trans) {
+ sql->trans->errnum = sql->err;
+ }
+ return 1;
+ }
+ return 0;
+}
+
+static const char *dbd_freetds_escape(apr_pool_t *pool, const char *arg,
+ apr_dbd_t *sql)
+{
+ return arg;
+}
+
+static apr_status_t freetds_regfree(void *rx)
+{
+ regfree((regex_t*)rx);
+ return APR_SUCCESS;
+}
+static int recurse_args(apr_pool_t *pool, int n, const char *query,
+ apr_dbd_prepared_t *stmt, int offs)
+{
+
+ /* we only support %s arguments for now */
+ int ret;
+ char arg[256];
+ regmatch_t matches[3];
+ if (regexec(&dbd_freetds_find_arg, query, 3, matches, 0) != 0) {
+ /* No more args */
+ stmt->nargs = n;
+ stmt->taint = apr_palloc(pool, n*sizeof(regex_t*));
+ stmt->sz = apr_palloc(pool, n*sizeof(int));
+ ret = 0;
+ }
+ else {
+ int i;
+ int sz = 0;
+ int len = matches[1].rm_eo - matches[1].rm_so - 2;
+ if (len > 255) {
+ return 9999;
+ }
+
+ ret = recurse_args(pool, n+1, query+matches[0].rm_eo,
+ stmt, offs+matches[0].rm_eo);
+
+ memmove(stmt->fmt + offs + matches[1].rm_so,
+ stmt->fmt + offs + matches[0].rm_eo-1,
+ strlen(stmt->fmt+offs+matches[0].rm_eo)+2);
+
+ /* compile untaint to a regex if found */
+ if (matches[1].rm_so == -1) {
+ stmt->taint[n] = NULL;
+ }
+ else {
+ strncpy(arg, query+matches[1].rm_so+1,
+ matches[1].rm_eo - matches[1].rm_so - 2);
+ arg[matches[1].rm_eo - matches[1].rm_so - 2] = '\0';
+ stmt->taint[n] = apr_palloc(pool, sizeof(regex_t));
+ if (regcomp(stmt->taint[n], arg, REG_ICASE|REG_EXTENDED) != 0) {
+ ++ret;
+ }
+ else {
+ apr_pool_cleanup_register(pool, stmt->taint[n], freetds_regfree,
+ apr_pool_cleanup_null);
+ }
+ }
+
+ /* record length if specified */
+ for (i=matches[2].rm_so; i<matches[2].rm_eo; ++i) {
+ sz = 10*sz + (query[i]-'\0');
+ }
+ }
+ return ret;
+}
+
+static int dbd_freetds_prepare(apr_pool_t *pool, apr_dbd_t *sql,
+ const char *query, const char *label,
+ int nargs, int nvals, apr_dbd_type_e *types,
+ apr_dbd_prepared_t **statement)
+{
+ apr_dbd_prepared_t *stmt;
+
+ if (label == NULL) {
+ label = apr_psprintf(pool, "%d", labelnum++);
+ }
+
+ if (!*statement) {
+ *statement = apr_palloc(pool, sizeof(apr_dbd_prepared_t));
+ }
+ stmt = *statement;
+
+#if 0
+ /* count args */
+ stmt->fmt = apr_pstrdup(pool, query);
+ stmt->fmt = recurse_args(pool, 0, query, stmt, stmt->fmt);
+
+ /* overestimate by a byte or two to simplify */
+ len = strlen("CREATE PROC apr.")
+ + strlen(label)
+ + stmt->nargs * strlen(" @arg1 varchar(len1),")
+ + strlen(" AS begin ")
+ + strlen(stmt->fmt)
+ + strlen(" end "); /* extra byte for terminator */
+
+ pquery = apr_pcalloc(pool, len);
+ sprintf(pquery, "CREATE PROC apr.%s", label);
+ for (i=0; i<stmt->nargs; ++i) {
+ sprintf(pquery+strlen(pquery), " @arg%d varchar(%d)", i, stmt->sz[i]);
+ if (i < stmt->nargs-1) {
+ pquery[strlen(pquery)] = ',';
+ }
+ }
+ strcat(pquery, " AS BEGIN ");
+ strcat(pquery, stmt->fmt);
+ strcat(pquery, " END");
+
+ return (freetds_exec(sql->proc, pquery, 0, &i) == SUCCEED) ? 0 : 1;
+#else
+ stmt->fmt = apr_pstrdup(pool, query);
+ return recurse_args(pool, 0, query, stmt, 0);
+#endif
+
+}
+
+static int dbd_freetds_start_transaction(apr_pool_t *pool, apr_dbd_t *handle,
+ apr_dbd_transaction_t **trans)
+{
+ int dummy;
+
+ /* XXX handle recursive transactions here */
+
+ handle->err = freetds_exec(handle->proc, "BEGIN TRANSACTION", 0, &dummy);
+
+ if (dbd_freetds_is_success(handle->err)) {
+ if (!*trans) {
+ *trans = apr_pcalloc(pool, sizeof(apr_dbd_transaction_t));
+ }
+ (*trans)->handle = handle;
+ handle->trans = *trans;
+ return 0;
+ }
+
+ return 1;
+}
+
+static int dbd_freetds_end_transaction(apr_dbd_transaction_t *trans)
+{
+ int dummy;
+ if (trans) {
+ /* rollback on error or explicit rollback request */
+ if (trans->errnum) {
+ trans->errnum = 0;
+ trans->handle->err = freetds_exec(trans->handle->proc,
+ "ROLLBACK", 0, &dummy);
+ }
+ else {
+ trans->handle->err = freetds_exec(trans->handle->proc,
+ "COMMIT", 0, &dummy);
+ }
+ trans->handle->trans = NULL;
+ }
+ return (trans->handle->err == SUCCEED) ? 0 : 1;
+}
+
+static DBPROCESS *freetds_open(apr_pool_t *pool, const char *params,
+ const char **error)
+{
+ char *server = NULL;
+ DBPROCESS *process;
+ LOGINREC *login;
+ static const char *delims = " \r\n\t;|,";
+ char *ptr;
+ char *key;
+ char *value;
+ int vlen;
+ int klen;
+ char *buf;
+ char *databaseName = NULL;
+
+ /* FIXME - this uses malloc */
+ /* FIXME - pass error message back to the caller in case of failure */
+ login = dblogin();
+ if (login == NULL) {
+ return NULL;
+ }
+ /* now set login properties */
+ for (ptr = strchr(params, '='); ptr; ptr = strchr(ptr, '=')) {
+ /* don't dereference memory that may not belong to us */
+ if (ptr == params) {
+ ++ptr;
+ continue;
+ }
+ for (key = ptr-1; apr_isspace(*key); --key);
+ klen = 0;
+ while (apr_isalpha(*key)) {
+ --key;
+ ++klen;
+ }
+ ++key;
+ for (value = ptr+1; apr_isspace(*value); ++value);
+
+ vlen = strcspn(value, delims);
+ buf = apr_pstrndup(pool, value, vlen); /* NULL-terminated copy */
+
+ if (!strncasecmp(key, "username", klen)) {
+ DBSETLUSER(login, buf);
+ }
+ else if (!strncasecmp(key, "password", klen)) {
+ DBSETLPWD(login, buf);
+ }
+ else if (!strncasecmp(key, "appname", klen)) {
+ DBSETLAPP(login, buf);
+ }
+ else if (!strncasecmp(key, "dbname", klen)) {
+ databaseName = buf;
+ }
+ else if (!strncasecmp(key, "host", klen)) {
+ DBSETLHOST(login, buf);
+ }
+ else if (!strncasecmp(key, "charset", klen)) {
+ DBSETLCHARSET(login, buf);
+ }
+ else if (!strncasecmp(key, "lang", klen)) {
+ DBSETLNATLANG(login, buf);
+ }
+ else if (!strncasecmp(key, "server", klen)) {
+ server = buf;
+ }
+ else {
+ /* unknown param */
+ }
+ ptr = value+vlen;
+ }
+
+ process = dbopen(login, server);
+
+ if (process != NULL && databaseName != NULL)
+ {
+ dbuse(process, databaseName);
+ }
+
+ dbloginfree(login);
+ if (process == NULL) {
+ return NULL;
+ }
+
+ return process;
+}
+static apr_dbd_t *dbd_freetds_open(apr_pool_t *pool, const char *params,
+ const char **error)
+{
+ apr_dbd_t *sql;
+ /* FIXME - pass error message back to the caller in case of failure */
+ DBPROCESS *process = freetds_open(pool, params, error);
+ if (process == NULL) {
+ return NULL;
+ }
+ sql = apr_pcalloc(pool, sizeof (apr_dbd_t));
+ sql->pool = pool;
+ sql->proc = process;
+ sql->params = params;
+ return sql;
+}
+
+static apr_status_t dbd_freetds_close(apr_dbd_t *handle)
+{
+ dbclose(handle->proc);
+ return APR_SUCCESS;
+}
+
+static apr_status_t dbd_freetds_check_conn(apr_pool_t *pool,
+ apr_dbd_t *handle)
+{
+ if (dbdead(handle->proc)) {
+ /* try again */
+ dbclose(handle->proc);
+ handle->proc = freetds_open(handle->pool, handle->params, NULL);
+ if (!handle->proc || dbdead(handle->proc)) {
+ return APR_EGENERAL;
+ }
+ }
+ /* clear it, in case this is called in error handling */
+ dbcancel(handle->proc);
+ return APR_SUCCESS;
+}
+
+static int dbd_freetds_select_db(apr_pool_t *pool, apr_dbd_t *handle,
+ const char *name)
+{
+ /* ouch, it's declared int. But we can use APR 0/nonzero */
+ return (dbuse(handle->proc, (char*)name) == SUCCEED) ? APR_SUCCESS : APR_EGENERAL;
+}
+
+static void *dbd_freetds_native(apr_dbd_t *handle)
+{
+ return handle->proc;
+}
+
+static int dbd_freetds_num_cols(apr_dbd_results_t* res)
+{
+ return res->sz;
+}
+
+static int dbd_freetds_num_tuples(apr_dbd_results_t* res)
+{
+ if (res->random) {
+ return res->ntuples;
+ }
+ else {
+ return -1;
+ }
+}
+
+static apr_status_t freetds_term(void *dummy)
+{
+ dbexit();
+ regfree(&dbd_freetds_find_arg);
+ return APR_SUCCESS;
+}
+static int freetds_err_handler(DBPROCESS *dbproc, int severity, int dberr,
+ int oserr, char *dberrstr, char *oserrstr)
+{
+ return INT_CANCEL; /* never exit */
+}
+static void dbd_freetds_init(apr_pool_t *pool)
+{
+ int rv = regcomp(&dbd_freetds_find_arg,
+ "%(\\{[^}]*\\})?([0-9]*)[A-Za-z]", REG_EXTENDED);
+ if (rv != 0) {
+ char errmsg[256];
+ regerror(rv, &dbd_freetds_find_arg, errmsg, 256);
+ fprintf(stderr, "regcomp failed: %s\n", errmsg);
+ }
+ dbinit();
+ dberrhandle(freetds_err_handler);
+ apr_pool_cleanup_register(pool, NULL, freetds_term, apr_pool_cleanup_null);
+}
+
+#ifdef COMPILE_STUBS
+/* get_name is the only one of these that is implemented */
+static const char *dbd_freetds_get_name(const apr_dbd_results_t *res, int n)
+{
+ return (const char*) dbcolname(res->proc, n+1); /* numbering starts at 1 */
+}
+
+/* These are stubs: transaction modes not implemented here */
+#define DBD_NOTIMPL APR_ENOTIMPL;
+static int dbd_freetds_transaction_mode_get(apr_dbd_transaction_t *trans)
+{
+ return trans ? trans->mode : APR_DBD_TRANSACTION_COMMIT;
+}
+
+static int dbd_freetds_transaction_mode_set(apr_dbd_transaction_t *trans,
+ int mode)
+{
+ if (trans) {
+ trans->mode = mode & TXN_MODE_BITS;
+ return trans->mode;
+ }
+ return APR_DBD_TRANSACTION_COMMIT;
+}
+static int dbd_freetds_pvbquery(apr_pool_t *pool, apr_dbd_t *sql, int *nrows,
+ apr_dbd_prepared_t *statement, va_list args)
+{
+ return DBD_NOTIMPL;
+}
+static int dbd_freetds_pbquery(apr_pool_t *pool, apr_dbd_t *sql, int *nrows,
+ apr_dbd_prepared_t * statement,
+ const void **values)
+{
+ return DBD_NOTIMPL;
+}
+
+static int dbd_freetds_pvbselect(apr_pool_t *pool, apr_dbd_t *sql,
+ apr_dbd_results_t **results,
+ apr_dbd_prepared_t *statement,
+ int seek, va_list args)
+{
+ return DBD_NOTIMPL;
+}
+static int dbd_freetds_pbselect(apr_pool_t *pool, apr_dbd_t *sql,
+ apr_dbd_results_t **results,
+ apr_dbd_prepared_t *statement,
+ int seek, const void **values)
+{
+ return DBD_NOTIMPL;
+}
+static apr_status_t dbd_freetds_datum_get(const apr_dbd_row_t *row, int n,
+ apr_dbd_type_e type, void *data)
+{
+ return APR_ENOTIMPL;
+}
+#endif
+
+APU_MODULE_DECLARE_DATA const apr_dbd_driver_t apr_dbd_freetds_driver = {
+ "freetds",
+ dbd_freetds_init,
+ dbd_freetds_native,
+ dbd_freetds_open,
+ dbd_freetds_check_conn,
+ dbd_freetds_close,
+ dbd_freetds_select_db,
+ dbd_freetds_start_transaction,
+ dbd_freetds_end_transaction,
+ dbd_freetds_query,
+ dbd_freetds_select,
+ dbd_freetds_num_cols,
+ dbd_freetds_num_tuples,
+ dbd_freetds_get_row,
+ dbd_freetds_get_entry,
+ dbd_freetds_error,
+ dbd_freetds_escape,
+ dbd_freetds_prepare,
+ dbd_freetds_pvquery,
+ dbd_freetds_pvselect,
+ dbd_freetds_pquery,
+ dbd_freetds_pselect,
+ /* this is only implemented to support httpd/2.2 standard usage,
+ * as in the original DBD implementation. Everything else is NOTIMPL.
+ */
+#ifdef COMPILE_STUBS
+ dbd_freetds_get_name,
+ dbd_freetds_transaction_mode_get,
+ dbd_freetds_transaction_mode_set,
+ "",
+ dbd_freetds_pvbquery,
+ dbd_freetds_pvbselect,
+ dbd_freetds_pbquery,
+ dbd_freetds_pbselect,
+ dbd_freetds_datum_get
+#endif
+};
+#endif
diff --git a/contrib/apr-util/dbd/apr_dbd_mysql.c b/contrib/apr-util/dbd/apr_dbd_mysql.c
new file mode 100644
index 000000000000..3b8017d85249
--- /dev/null
+++ b/contrib/apr-util/dbd/apr_dbd_mysql.c
@@ -0,0 +1,1305 @@
+/* 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 "apu.h"
+
+#if APU_HAVE_MYSQL
+
+#include "apu_version.h"
+#include "apu_config.h"
+
+#include <ctype.h>
+#include <stdlib.h>
+
+#if defined(HAVE_MYSQL_MYSQL_H)
+#if defined(HAVE_MYSQL_MY_GLOBAL_H)
+#include <mysql/my_global.h>
+#if defined(HAVE_MYSQL_MY_SYS_H)
+#include <mysql/my_sys.h>
+#endif
+#endif
+#include <mysql/mysql.h>
+#include <mysql/errmsg.h>
+#else /* !defined(HAVE_MYSQL_MYSQL_H) */
+#if defined(HAVE_MY_GLOBAL_H)
+#include <my_global.h>
+#if defined(HAVE_MY_SYS_H)
+#include <my_sys.h>
+#endif
+#endif
+#include <mysql.h>
+#include <errmsg.h>
+#endif
+
+#include "apr_strings.h"
+#include "apr_lib.h"
+#include "apr_buckets.h"
+
+#include "apr_dbd_internal.h"
+
+/* default maximum field size 1 MB */
+#define FIELDSIZE 1048575
+
+struct apr_dbd_prepared_t {
+ MYSQL_STMT* stmt;
+ int nargs;
+ int nvals;
+ apr_dbd_type_e *types;
+};
+
+struct apr_dbd_transaction_t {
+ int mode;
+ int errnum;
+ apr_dbd_t *handle;
+};
+
+struct apr_dbd_t {
+ MYSQL* conn ;
+ apr_dbd_transaction_t* trans ;
+ unsigned long fldsz;
+};
+
+struct apr_dbd_results_t {
+ int random;
+ MYSQL_RES *res;
+ MYSQL_STMT *statement;
+ MYSQL_BIND *bind;
+ apr_pool_t *pool;
+};
+struct apr_dbd_row_t {
+ MYSQL_ROW row;
+ apr_dbd_results_t *res;
+ unsigned long *len;
+};
+
+/* MySQL specific bucket for BLOB types */
+typedef struct apr_bucket_lob apr_bucket_lob;
+/**
+ * A bucket referring to a MySQL BLOB
+ */
+struct apr_bucket_lob {
+ /** Number of buckets using this memory */
+ apr_bucket_refcount refcount;
+ /** The row this bucket refers to */
+ const apr_dbd_row_t *row;
+ /** The column this bucket refers to */
+ int col;
+ /** The pool into which any needed structures should
+ * be created while reading from this bucket */
+ apr_pool_t *readpool;
+};
+
+static void lob_bucket_destroy(void *data);
+static apr_status_t lob_bucket_read(apr_bucket *e, const char **str,
+ apr_size_t *len, apr_read_type_e block);
+static apr_bucket *apr_bucket_lob_make(apr_bucket *b,
+ const apr_dbd_row_t *row, int col,
+ apr_off_t offset, apr_size_t len,
+ apr_pool_t *p);
+static apr_bucket *apr_bucket_lob_create(const apr_dbd_row_t *row, int col,
+ apr_off_t offset,
+ apr_size_t len, apr_pool_t *p,
+ apr_bucket_alloc_t *list);
+static int dbd_mysql_num_cols(apr_dbd_results_t *res);
+
+static const apr_bucket_type_t apr_bucket_type_lob = {
+ "LOB", 5, APR_BUCKET_DATA,
+ lob_bucket_destroy,
+ lob_bucket_read,
+ apr_bucket_setaside_notimpl,
+ apr_bucket_shared_split,
+ apr_bucket_shared_copy
+};
+
+static void lob_bucket_destroy(void *data)
+{
+ apr_bucket_lob *f = data;
+
+ if (apr_bucket_shared_destroy(f)) {
+ /* no need to destroy database objects here; it will get
+ * done automatically when the pool gets cleaned up */
+ apr_bucket_free(f);
+ }
+}
+
+static apr_status_t lob_bucket_read(apr_bucket *e, const char **str,
+ apr_size_t *len, apr_read_type_e block)
+{
+ apr_bucket_lob *a = e->data;
+ const apr_dbd_row_t *row = a->row;
+ apr_dbd_results_t *res = row->res;
+ int col = a->col;
+ apr_bucket *b = NULL;
+ int rv;
+ apr_size_t blength = e->length; /* bytes remaining in file past offset */
+ apr_off_t boffset = e->start;
+ MYSQL_BIND *bind = &res->bind[col];
+
+ *str = NULL; /* in case we die prematurely */
+
+ /* fetch from offset if not at the beginning */
+ if (boffset > 0) {
+ rv = mysql_stmt_fetch_column(res->statement, bind, col,
+ (unsigned long) boffset);
+ if (rv != 0) {
+ return APR_EGENERAL;
+ }
+ }
+ blength -= blength > bind->buffer_length ? bind->buffer_length : blength;
+ *len = e->length - blength;
+ *str = bind->buffer;
+
+ /* allocate new buffer, since we used this one for the bucket */
+ bind->buffer = apr_palloc(res->pool, bind->buffer_length);
+
+ /*
+ * Change the current bucket to refer to what we read,
+ * even if we read nothing because we hit EOF.
+ */
+ apr_bucket_pool_make(e, *str, *len, res->pool);
+
+ /* If we have more to read from the field, then create another bucket */
+ if (blength > 0) {
+ /* for efficiency, we can just build a new apr_bucket struct
+ * to wrap around the existing LOB bucket */
+ b = apr_bucket_alloc(sizeof(*b), e->list);
+ b->start = boffset + *len;
+ b->length = blength;
+ b->data = a;
+ b->type = &apr_bucket_type_lob;
+ b->free = apr_bucket_free;
+ b->list = e->list;
+ APR_BUCKET_INSERT_AFTER(e, b);
+ }
+ else {
+ lob_bucket_destroy(a);
+ }
+
+ return APR_SUCCESS;
+}
+
+static apr_bucket *apr_bucket_lob_make(apr_bucket *b,
+ const apr_dbd_row_t *row, int col,
+ apr_off_t offset, apr_size_t len,
+ apr_pool_t *p)
+{
+ apr_bucket_lob *f;
+
+ f = apr_bucket_alloc(sizeof(*f), b->list);
+ f->row = row;
+ f->col = col;
+ f->readpool = p;
+
+ b = apr_bucket_shared_make(b, f, offset, len);
+ b->type = &apr_bucket_type_lob;
+
+ return b;
+}
+
+static apr_bucket *apr_bucket_lob_create(const apr_dbd_row_t *row, int col,
+ apr_off_t offset,
+ apr_size_t len, apr_pool_t *p,
+ apr_bucket_alloc_t *list)
+{
+ apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
+
+ APR_BUCKET_INIT(b);
+ b->free = apr_bucket_free;
+ b->list = list;
+ return apr_bucket_lob_make(b, row, col, offset, len, p);
+}
+
+static apr_status_t free_result(void *data)
+{
+ mysql_free_result(data);
+ return APR_SUCCESS;
+}
+
+static int dbd_mysql_select(apr_pool_t *pool, apr_dbd_t *sql,
+ apr_dbd_results_t **results,
+ const char *query, int seek)
+{
+ int sz;
+ int ret;
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+ ret = mysql_query(sql->conn, query);
+ if (!ret) {
+ if (sz = mysql_field_count(sql->conn), sz > 0) {
+ if (!*results) {
+ *results = apr_palloc(pool, sizeof(apr_dbd_results_t));
+ }
+ (*results)->random = seek;
+ (*results)->statement = NULL;
+ (*results)->pool = pool;
+ if (seek) {
+ (*results)->res = mysql_store_result(sql->conn);
+ }
+ else {
+ (*results)->res = mysql_use_result(sql->conn);
+ }
+ apr_pool_cleanup_register(pool, (*results)->res,
+ free_result,apr_pool_cleanup_null);
+ }
+ } else {
+ ret = mysql_errno(sql->conn);
+ }
+
+ if (TXN_NOTICE_ERRORS(sql->trans)) {
+ sql->trans->errnum = ret;
+ }
+ return ret;
+}
+
+static const char *dbd_mysql_get_name(const apr_dbd_results_t *res, int n)
+{
+ if ((n < 0) || (n >= (int) mysql_num_fields(res->res))) {
+ return NULL;
+ }
+
+ return mysql_fetch_fields(res->res)[n].name;
+}
+
+static int dbd_mysql_get_row(apr_pool_t *pool, apr_dbd_results_t *res,
+ apr_dbd_row_t **row, int rownum)
+{
+ MYSQL_ROW r = NULL;
+ int ret = 0;
+
+ if (res->statement) {
+ if (res->random) {
+ if (rownum > 0) {
+ mysql_stmt_data_seek(res->statement, (my_ulonglong) --rownum);
+ }
+ else {
+ return -1; /* invalid row */
+ }
+ }
+ ret = mysql_stmt_fetch(res->statement);
+ switch (ret) {
+ case 1:
+ ret = mysql_stmt_errno(res->statement);
+ break;
+ case MYSQL_NO_DATA:
+ ret = -1;
+ break;
+ default:
+ ret = 0; /* bad luck - get_entry will deal with this */
+ break;
+ }
+ }
+ else {
+ if (res->random) {
+ if (rownum > 0) {
+ mysql_data_seek(res->res, (my_ulonglong) --rownum);
+ }
+ else {
+ return -1; /* invalid row */
+ }
+ }
+ r = mysql_fetch_row(res->res);
+ if (r == NULL) {
+ ret = -1;
+ }
+ }
+ if (ret == 0) {
+ if (!*row) {
+ *row = apr_palloc(pool, sizeof(apr_dbd_row_t));
+ }
+ (*row)->row = r;
+ (*row)->res = res;
+ (*row)->len = mysql_fetch_lengths(res->res);
+ }
+ else {
+ apr_pool_cleanup_run(res->pool, res->res, free_result);
+ }
+ return ret;
+}
+#if 0
+/* An improved API that was proposed but not followed up */
+static int dbd_mysql_get_entry(const apr_dbd_row_t *row, int n,
+ apr_dbd_datum_t *val)
+{
+ MYSQL_BIND *bind;
+ if (dbd_mysql_num_cols(row->res) <= n) {
+ return NULL;
+ }
+ if (row->res->statement) {
+ bind = &row->res->bind[n];
+ if (mysql_stmt_fetch_column(row->res->statement, bind, n, 0) != 0) {
+ val->type = APR_DBD_VALUE_NULL;
+ return -1;
+ }
+ if (*bind->is_null) {
+ val->type = APR_DBD_VALUE_NULL;
+ return -1;
+ }
+ else {
+ val->type = APR_DBD_VALUE_STRING;
+ val->value.stringval = bind->buffer;
+ }
+ }
+ else {
+ val->type = APR_DBD_VALUE_STRING;
+ val->value.stringval = row->row[n];
+ }
+ return 0;
+}
+#else
+
+static const char *dbd_mysql_get_entry(const apr_dbd_row_t *row, int n)
+{
+ MYSQL_BIND *bind;
+ if (dbd_mysql_num_cols(row->res) <= n) {
+ return NULL;
+ }
+ if (row->res->statement) {
+ bind = &row->res->bind[n];
+ if (mysql_stmt_fetch_column(row->res->statement, bind, n, 0) != 0) {
+ return NULL;
+ }
+ if (*bind->is_null) {
+ return NULL;
+ }
+ else {
+ return bind->buffer;
+ }
+ }
+ else {
+ return row->row[n];
+ }
+ return NULL;
+}
+#endif
+
+static apr_status_t dbd_mysql_datum_get(const apr_dbd_row_t *row, int n,
+ apr_dbd_type_e type, void *data)
+{
+ if (row->res->statement) {
+ MYSQL_BIND *bind = &row->res->bind[n];
+ unsigned long len = *bind->length;
+
+ if (mysql_stmt_fetch_column(row->res->statement, bind, n, 0) != 0) {
+ return APR_EGENERAL;
+ }
+
+ if (*bind->is_null) {
+ return APR_ENOENT;
+ }
+
+ switch (type) {
+ case APR_DBD_TYPE_TINY:
+ *(char*)data = atoi(bind->buffer);
+ break;
+ case APR_DBD_TYPE_UTINY:
+ *(unsigned char*)data = atoi(bind->buffer);
+ break;
+ case APR_DBD_TYPE_SHORT:
+ *(short*)data = atoi(bind->buffer);
+ break;
+ case APR_DBD_TYPE_USHORT:
+ *(unsigned short*)data = atoi(bind->buffer);
+ break;
+ case APR_DBD_TYPE_INT:
+ *(int*)data = atoi(bind->buffer);
+ break;
+ case APR_DBD_TYPE_UINT:
+ *(unsigned int*)data = atoi(bind->buffer);
+ break;
+ case APR_DBD_TYPE_LONG:
+ *(long*)data = atol(bind->buffer);
+ break;
+ case APR_DBD_TYPE_ULONG:
+ *(unsigned long*)data = atol(bind->buffer);
+ break;
+ case APR_DBD_TYPE_LONGLONG:
+ *(apr_int64_t*)data = apr_atoi64(bind->buffer);
+ break;
+ case APR_DBD_TYPE_ULONGLONG:
+ *(apr_uint64_t*)data = apr_atoi64(bind->buffer);
+ break;
+ case APR_DBD_TYPE_FLOAT:
+ *(float*)data = (float) atof(bind->buffer);
+ break;
+ case APR_DBD_TYPE_DOUBLE:
+ *(double*)data = atof(bind->buffer);
+ break;
+ case APR_DBD_TYPE_STRING:
+ case APR_DBD_TYPE_TEXT:
+ case APR_DBD_TYPE_TIME:
+ case APR_DBD_TYPE_DATE:
+ case APR_DBD_TYPE_DATETIME:
+ case APR_DBD_TYPE_TIMESTAMP:
+ case APR_DBD_TYPE_ZTIMESTAMP:
+ *((char*)bind->buffer+bind->buffer_length-1) = '\0';
+ *(char**)data = bind->buffer;
+ break;
+ case APR_DBD_TYPE_BLOB:
+ case APR_DBD_TYPE_CLOB:
+ {
+ apr_bucket *e;
+ apr_bucket_brigade *b = (apr_bucket_brigade*)data;
+
+ e = apr_bucket_lob_create(row, n, 0, len,
+ row->res->pool, b->bucket_alloc);
+ APR_BRIGADE_INSERT_TAIL(b, e);
+ }
+ break;
+ case APR_DBD_TYPE_NULL:
+ *(void**)data = NULL;
+ break;
+ default:
+ return APR_EGENERAL;
+ }
+ }
+ else {
+ if (row->row[n] == NULL) {
+ return APR_ENOENT;
+ }
+
+ switch (type) {
+ case APR_DBD_TYPE_TINY:
+ *(char*)data = atoi(row->row[n]);
+ break;
+ case APR_DBD_TYPE_UTINY:
+ *(unsigned char*)data = atoi(row->row[n]);
+ break;
+ case APR_DBD_TYPE_SHORT:
+ *(short*)data = atoi(row->row[n]);
+ break;
+ case APR_DBD_TYPE_USHORT:
+ *(unsigned short*)data = atoi(row->row[n]);
+ break;
+ case APR_DBD_TYPE_INT:
+ *(int*)data = atoi(row->row[n]);
+ break;
+ case APR_DBD_TYPE_UINT:
+ *(unsigned int*)data = atoi(row->row[n]);
+ break;
+ case APR_DBD_TYPE_LONG:
+ *(long*)data = atol(row->row[n]);
+ break;
+ case APR_DBD_TYPE_ULONG:
+ *(unsigned long*)data = atol(row->row[n]);
+ break;
+ case APR_DBD_TYPE_LONGLONG:
+ *(apr_int64_t*)data = apr_atoi64(row->row[n]);
+ break;
+ case APR_DBD_TYPE_ULONGLONG:
+ *(apr_uint64_t*)data = apr_atoi64(row->row[n]);
+ break;
+ case APR_DBD_TYPE_FLOAT:
+ *(float*)data = (float) atof(row->row[n]);
+ break;
+ case APR_DBD_TYPE_DOUBLE:
+ *(double*)data = atof(row->row[n]);
+ break;
+ case APR_DBD_TYPE_STRING:
+ case APR_DBD_TYPE_TEXT:
+ case APR_DBD_TYPE_TIME:
+ case APR_DBD_TYPE_DATE:
+ case APR_DBD_TYPE_DATETIME:
+ case APR_DBD_TYPE_TIMESTAMP:
+ case APR_DBD_TYPE_ZTIMESTAMP:
+ *(char**)data = row->row[n];
+ break;
+ case APR_DBD_TYPE_BLOB:
+ case APR_DBD_TYPE_CLOB:
+ {
+ apr_bucket *e;
+ apr_bucket_brigade *b = (apr_bucket_brigade*)data;
+
+ e = apr_bucket_pool_create(row->row[n], row->len[n],
+ row->res->pool, b->bucket_alloc);
+ APR_BRIGADE_INSERT_TAIL(b, e);
+ }
+ break;
+ case APR_DBD_TYPE_NULL:
+ *(void**)data = NULL;
+ break;
+ default:
+ return APR_EGENERAL;
+ }
+ }
+ return 0;
+}
+
+static const char *dbd_mysql_error(apr_dbd_t *sql, int n)
+{
+ return mysql_error(sql->conn);
+}
+
+static int dbd_mysql_query(apr_dbd_t *sql, int *nrows, const char *query)
+{
+ int ret;
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+ ret = mysql_query(sql->conn, query);
+ if (ret != 0) {
+ ret = mysql_errno(sql->conn);
+ }
+ *nrows = (int) mysql_affected_rows(sql->conn);
+ if (TXN_NOTICE_ERRORS(sql->trans)) {
+ sql->trans->errnum = ret;
+ }
+ return ret;
+}
+
+static const char *dbd_mysql_escape(apr_pool_t *pool, const char *arg,
+ apr_dbd_t *sql)
+{
+ unsigned long len = strlen(arg);
+ char *ret = apr_palloc(pool, 2*len + 1);
+ mysql_real_escape_string(sql->conn, ret, arg, len);
+ return ret;
+}
+
+static apr_status_t stmt_close(void *data)
+{
+ mysql_stmt_close(data);
+ return APR_SUCCESS;
+}
+
+static int dbd_mysql_prepare(apr_pool_t *pool, apr_dbd_t *sql,
+ const char *query, const char *label,
+ int nargs, int nvals, apr_dbd_type_e *types,
+ apr_dbd_prepared_t **statement)
+{
+ /* Translate from apr_dbd to native query format */
+ int ret;
+
+ if (!*statement) {
+ *statement = apr_palloc(pool, sizeof(apr_dbd_prepared_t));
+ }
+ (*statement)->stmt = mysql_stmt_init(sql->conn);
+
+ if ((*statement)->stmt) {
+ apr_pool_cleanup_register(pool, (*statement)->stmt,
+ stmt_close, apr_pool_cleanup_null);
+ ret = mysql_stmt_prepare((*statement)->stmt, query, strlen(query));
+
+ if (ret != 0) {
+ ret = mysql_stmt_errno((*statement)->stmt);
+ }
+
+ (*statement)->nargs = nargs;
+ (*statement)->nvals = nvals;
+ (*statement)->types = types;
+
+ return ret;
+ }
+
+ return CR_OUT_OF_MEMORY;
+}
+
+static void dbd_mysql_bind(apr_dbd_prepared_t *statement,
+ const char **values, MYSQL_BIND *bind)
+{
+ int i, j;
+
+ for (i = 0, j = 0; i < statement->nargs; i++, j++) {
+ bind[i].length = &bind[i].buffer_length;
+ bind[i].is_unsigned = 0;
+ bind[i].is_null = NULL;
+
+ if (values[j] == NULL) {
+ bind[i].buffer_type = MYSQL_TYPE_NULL;
+ }
+ else {
+ switch (statement->types[i]) {
+ case APR_DBD_TYPE_BLOB:
+ case APR_DBD_TYPE_CLOB:
+ bind[i].buffer_type = MYSQL_TYPE_LONG_BLOB;
+ bind[i].buffer = (void*)values[j];
+ bind[i].buffer_length = atol(values[++j]);
+
+ /* skip table and column */
+ j += 2;
+ break;
+ default:
+ bind[i].buffer_type = MYSQL_TYPE_VAR_STRING;
+ bind[i].buffer = (void*)values[j];
+ bind[i].buffer_length = strlen(values[j]);
+ break;
+ }
+ }
+ }
+
+ return;
+}
+
+static int dbd_mysql_pquery_internal(apr_pool_t *pool, apr_dbd_t *sql,
+ int *nrows, apr_dbd_prepared_t *statement,
+ MYSQL_BIND *bind)
+{
+ int ret;
+
+ ret = mysql_stmt_bind_param(statement->stmt, bind);
+ if (ret != 0) {
+ *nrows = 0;
+ ret = mysql_stmt_errno(statement->stmt);
+ }
+ else {
+ ret = mysql_stmt_execute(statement->stmt);
+ if (ret != 0) {
+ ret = mysql_stmt_errno(statement->stmt);
+ }
+ *nrows = (int) mysql_stmt_affected_rows(statement->stmt);
+ }
+
+ return ret;
+}
+
+static int dbd_mysql_pquery(apr_pool_t *pool, apr_dbd_t *sql,
+ int *nrows, apr_dbd_prepared_t *statement,
+ const char **values)
+{
+ MYSQL_BIND *bind;
+ int ret;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ bind = apr_palloc(pool, statement->nargs * sizeof(MYSQL_BIND));
+
+ dbd_mysql_bind(statement, values, bind);
+
+ ret = dbd_mysql_pquery_internal(pool, sql, nrows, statement, bind);
+
+ if (TXN_NOTICE_ERRORS(sql->trans)) {
+ sql->trans->errnum = ret;
+ }
+ return ret;
+}
+
+static int dbd_mysql_pvquery(apr_pool_t *pool, apr_dbd_t *sql, int *nrows,
+ apr_dbd_prepared_t *statement, va_list args)
+{
+ const char **values;
+ int i;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ values = apr_palloc(pool, sizeof(*values) * statement->nvals);
+
+ for (i = 0; i < statement->nvals; i++) {
+ values[i] = va_arg(args, const char*);
+ }
+
+ return dbd_mysql_pquery(pool, sql, nrows, statement, values);
+}
+
+static int dbd_mysql_pselect_internal(apr_pool_t *pool, apr_dbd_t *sql,
+ apr_dbd_results_t **res,
+ apr_dbd_prepared_t *statement,
+ int random, MYSQL_BIND *bind)
+{
+ int nfields, i;
+ my_bool *is_nullr;
+#if MYSQL_VERSION_ID >= 50000
+ my_bool *error;
+#endif
+ int ret;
+ unsigned long *length, maxlen;
+
+ ret = mysql_stmt_bind_param(statement->stmt, bind);
+ if (ret == 0) {
+ ret = mysql_stmt_execute(statement->stmt);
+ if (!ret) {
+ if (!*res) {
+ *res = apr_pcalloc(pool, sizeof(apr_dbd_results_t));
+ }
+ (*res)->random = random;
+ (*res)->statement = statement->stmt;
+ (*res)->res = mysql_stmt_result_metadata(statement->stmt);
+ (*res)->pool = pool;
+ apr_pool_cleanup_register(pool, (*res)->res,
+ free_result, apr_pool_cleanup_null);
+ nfields = mysql_num_fields((*res)->res);
+ if (!(*res)->bind) {
+ (*res)->bind = apr_palloc(pool, nfields*sizeof(MYSQL_BIND));
+ length = apr_pcalloc(pool, nfields*sizeof(unsigned long));
+#if MYSQL_VERSION_ID >= 50000
+ error = apr_palloc(pool, nfields*sizeof(my_bool));
+#endif
+ is_nullr = apr_pcalloc(pool, nfields*sizeof(my_bool));
+ for ( i = 0; i < nfields; ++i ) {
+ maxlen = ((*res)->res->fields[i].length < sql->fldsz ?
+ (*res)->res->fields[i].length : sql->fldsz) + 1;
+ if ((*res)->res->fields[i].type == MYSQL_TYPE_BLOB) {
+ (*res)->bind[i].buffer_type = MYSQL_TYPE_LONG_BLOB;
+ }
+ else {
+ (*res)->bind[i].buffer_type = MYSQL_TYPE_VAR_STRING;
+ }
+ (*res)->bind[i].buffer_length = maxlen;
+ (*res)->bind[i].length = &length[i];
+ (*res)->bind[i].buffer = apr_palloc(pool, maxlen);
+ (*res)->bind[i].is_null = is_nullr+i;
+#if MYSQL_VERSION_ID >= 50000
+ (*res)->bind[i].error = error+i;
+#endif
+ }
+ }
+ ret = mysql_stmt_bind_result(statement->stmt, (*res)->bind);
+ if (!ret) {
+ ret = mysql_stmt_store_result(statement->stmt);
+ }
+ }
+ }
+ if (ret != 0) {
+ ret = mysql_stmt_errno(statement->stmt);
+ }
+
+ return ret;
+}
+
+static int dbd_mysql_pselect(apr_pool_t *pool, apr_dbd_t *sql,
+ apr_dbd_results_t **res,
+ apr_dbd_prepared_t *statement, int random,
+ const char **args)
+{
+ int ret;
+ MYSQL_BIND *bind;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ bind = apr_palloc(pool, statement->nargs * sizeof(MYSQL_BIND));
+
+ dbd_mysql_bind(statement, args, bind);
+
+ ret = dbd_mysql_pselect_internal(pool, sql, res, statement, random, bind);
+
+ if (TXN_NOTICE_ERRORS(sql->trans)) {
+ sql->trans->errnum = ret;
+ }
+ return ret;
+}
+
+static int dbd_mysql_pvselect(apr_pool_t *pool, apr_dbd_t *sql,
+ apr_dbd_results_t **res,
+ apr_dbd_prepared_t *statement, int random,
+ va_list args)
+{
+ const char **values;
+ int i;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ values = apr_palloc(pool, sizeof(*values) * statement->nvals);
+
+ for (i = 0; i < statement->nvals; i++) {
+ values[i] = va_arg(args, const char*);
+ }
+
+ return dbd_mysql_pselect(pool, sql, res, statement, random, values);
+}
+
+static void dbd_mysql_bbind(apr_pool_t *pool, apr_dbd_prepared_t *statement,
+ const void **values, MYSQL_BIND *bind)
+{
+ void *arg;
+ int i, j;
+ apr_dbd_type_e type;
+
+ for (i = 0, j = 0; i < statement->nargs; i++, j++) {
+ arg = (void *)values[j];
+
+ bind[i].length = &bind[i].buffer_length;
+ bind[i].is_null = NULL;
+
+ type = (arg == NULL ? APR_DBD_TYPE_NULL : statement->types[i]);
+ switch (type) {
+ case APR_DBD_TYPE_TINY:
+ bind[i].buffer = arg;
+ bind[i].buffer_type = MYSQL_TYPE_TINY;
+ bind[i].is_unsigned = 0;
+ break;
+ case APR_DBD_TYPE_UTINY:
+ bind[i].buffer = arg;
+ bind[i].buffer_type = MYSQL_TYPE_TINY;
+ bind[i].is_unsigned = 1;
+ break;
+ case APR_DBD_TYPE_SHORT:
+ bind[i].buffer = arg;
+ bind[i].buffer_type = MYSQL_TYPE_SHORT;
+ bind[i].is_unsigned = 0;
+ break;
+ case APR_DBD_TYPE_USHORT:
+ bind[i].buffer = arg;
+ bind[i].buffer_type = MYSQL_TYPE_SHORT;
+ bind[i].is_unsigned = 1;
+ break;
+ case APR_DBD_TYPE_INT:
+ bind[i].buffer = arg;
+ bind[i].buffer_type = MYSQL_TYPE_LONG;
+ bind[i].is_unsigned = 0;
+ break;
+ case APR_DBD_TYPE_UINT:
+ bind[i].buffer = arg;
+ bind[i].buffer_type = MYSQL_TYPE_LONG;
+ bind[i].is_unsigned = 1;
+ break;
+ case APR_DBD_TYPE_LONG:
+ if (sizeof(int) == sizeof(long)) {
+ bind[i].buffer = arg;
+ }
+ else {
+ bind[i].buffer = apr_palloc(pool, sizeof(int));
+ *(int*)bind[i].buffer = *(long*)arg;
+ }
+ bind[i].buffer_type = MYSQL_TYPE_LONG;
+ bind[i].is_unsigned = 0;
+ break;
+ case APR_DBD_TYPE_ULONG:
+ if (sizeof(unsigned int) == sizeof(unsigned long)) {
+ bind[i].buffer = arg;
+ }
+ else {
+ bind[i].buffer = apr_palloc(pool, sizeof(unsigned int));
+ *(unsigned int*)bind[i].buffer = *(unsigned long*)arg;
+ }
+ bind[i].buffer_type = MYSQL_TYPE_LONG;
+ bind[i].is_unsigned = 1;
+ break;
+ case APR_DBD_TYPE_LONGLONG:
+ if (sizeof(my_ulonglong) == sizeof(apr_int64_t)) {
+ bind[i].buffer = arg;
+ bind[i].buffer_type = MYSQL_TYPE_LONGLONG;
+ }
+ else { /* have to downsize, long long is not portable */
+ bind[i].buffer = apr_palloc(pool, sizeof(long));
+ *(long*)bind[i].buffer = (long) *(apr_int64_t*)arg;
+ bind[i].buffer_type = MYSQL_TYPE_LONG;
+ }
+ bind[i].is_unsigned = 0;
+ break;
+ case APR_DBD_TYPE_ULONGLONG:
+ if (sizeof(my_ulonglong) == sizeof(apr_uint64_t)) {
+ bind[i].buffer = arg;
+ bind[i].buffer_type = MYSQL_TYPE_LONGLONG;
+ }
+ else { /* have to downsize, long long is not portable */
+ bind[i].buffer = apr_palloc(pool, sizeof(long));
+ *(unsigned long*)bind[i].buffer =
+ (unsigned long) *(apr_uint64_t*)arg;
+ bind[i].buffer_type = MYSQL_TYPE_LONG;
+ }
+ bind[i].is_unsigned = 1;
+ break;
+ case APR_DBD_TYPE_FLOAT:
+ bind[i].buffer = arg;
+ bind[i].buffer_type = MYSQL_TYPE_FLOAT;
+ bind[i].is_unsigned = 0;
+ break;
+ case APR_DBD_TYPE_DOUBLE:
+ bind[i].buffer = arg;
+ bind[i].buffer_type = MYSQL_TYPE_DOUBLE;
+ bind[i].is_unsigned = 0;
+ break;
+ case APR_DBD_TYPE_STRING:
+ case APR_DBD_TYPE_TEXT:
+ case APR_DBD_TYPE_TIME:
+ case APR_DBD_TYPE_DATE:
+ case APR_DBD_TYPE_DATETIME:
+ case APR_DBD_TYPE_TIMESTAMP:
+ case APR_DBD_TYPE_ZTIMESTAMP:
+ bind[i].buffer = arg;
+ bind[i].buffer_type = MYSQL_TYPE_VAR_STRING;
+ bind[i].is_unsigned = 0;
+ bind[i].buffer_length = strlen((const char *)arg);
+ break;
+ case APR_DBD_TYPE_BLOB:
+ case APR_DBD_TYPE_CLOB:
+ bind[i].buffer = (void *)arg;
+ bind[i].buffer_type = MYSQL_TYPE_LONG_BLOB;
+ bind[i].is_unsigned = 0;
+ bind[i].buffer_length = *(apr_size_t*)values[++j];
+
+ /* skip table and column */
+ j += 2;
+ break;
+ case APR_DBD_TYPE_NULL:
+ default:
+ bind[i].buffer_type = MYSQL_TYPE_NULL;
+ break;
+ }
+ }
+
+ return;
+}
+
+static int dbd_mysql_pbquery(apr_pool_t *pool, apr_dbd_t *sql,
+ int *nrows, apr_dbd_prepared_t *statement,
+ const void **values)
+{
+ MYSQL_BIND *bind;
+ int ret;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ bind = apr_palloc(pool, statement->nargs * sizeof(MYSQL_BIND));
+
+ dbd_mysql_bbind(pool, statement, values, bind);
+
+ ret = dbd_mysql_pquery_internal(pool, sql, nrows, statement, bind);
+
+ if (TXN_NOTICE_ERRORS(sql->trans)) {
+ sql->trans->errnum = ret;
+ }
+ return ret;
+}
+
+static int dbd_mysql_pvbquery(apr_pool_t *pool, apr_dbd_t *sql, int *nrows,
+ apr_dbd_prepared_t *statement, va_list args)
+{
+ const void **values;
+ int i;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ values = apr_palloc(pool, sizeof(*values) * statement->nvals);
+
+ for (i = 0; i < statement->nvals; i++) {
+ values[i] = va_arg(args, const void*);
+ }
+
+ return dbd_mysql_pbquery(pool, sql, nrows, statement, values);
+}
+
+static int dbd_mysql_pbselect(apr_pool_t *pool, apr_dbd_t *sql,
+ apr_dbd_results_t **res,
+ apr_dbd_prepared_t *statement, int random,
+ const void **args)
+{
+ int ret;
+ MYSQL_BIND *bind;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ bind = apr_palloc(pool, statement->nargs * sizeof(MYSQL_BIND));
+
+ dbd_mysql_bbind(pool, statement, args, bind);
+
+ ret = dbd_mysql_pselect_internal(pool, sql, res, statement, random, bind);
+
+ if (TXN_NOTICE_ERRORS(sql->trans)) {
+ sql->trans->errnum = ret;
+ }
+ return ret;
+}
+
+static int dbd_mysql_pvbselect(apr_pool_t *pool, apr_dbd_t *sql,
+ apr_dbd_results_t **res,
+ apr_dbd_prepared_t *statement, int random,
+ va_list args)
+{
+ const void **values;
+ int i;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ values = apr_palloc(pool, sizeof(*values) * statement->nvals);
+
+ for (i = 0; i < statement->nvals; i++) {
+ values[i] = va_arg(args, const void*);
+ }
+
+ return dbd_mysql_pbselect(pool, sql, res, statement, random, values);
+}
+
+static int dbd_mysql_end_transaction(apr_dbd_transaction_t *trans)
+{
+ int ret = -1;
+ if (trans) {
+ /* rollback on error or explicit rollback request */
+ if (trans->errnum || TXN_DO_ROLLBACK(trans)) {
+ trans->errnum = 0;
+ ret = mysql_rollback(trans->handle->conn);
+ }
+ else {
+ ret = mysql_commit(trans->handle->conn);
+ }
+ ret |= mysql_autocommit(trans->handle->conn, 1);
+ trans->handle->trans = NULL;
+ }
+ return ret;
+}
+/* Whether or not transactions work depends on whether the
+ * underlying DB supports them within MySQL. Unfortunately
+ * it fails silently with the default InnoDB.
+ */
+
+static int dbd_mysql_transaction(apr_pool_t *pool, apr_dbd_t *handle,
+ apr_dbd_transaction_t **trans)
+{
+ /* Don't try recursive transactions here */
+ if (handle->trans) {
+ dbd_mysql_end_transaction(handle->trans) ;
+ }
+ if (!*trans) {
+ *trans = apr_pcalloc(pool, sizeof(apr_dbd_transaction_t));
+ }
+ (*trans)->errnum = mysql_autocommit(handle->conn, 0);
+ (*trans)->handle = handle;
+ handle->trans = *trans;
+ return (*trans)->errnum;
+}
+
+static int dbd_mysql_transaction_mode_get(apr_dbd_transaction_t *trans)
+{
+ if (!trans)
+ return APR_DBD_TRANSACTION_COMMIT;
+
+ return trans->mode;
+}
+
+static int dbd_mysql_transaction_mode_set(apr_dbd_transaction_t *trans,
+ int mode)
+{
+ if (!trans)
+ return APR_DBD_TRANSACTION_COMMIT;
+
+ return trans->mode = (mode & TXN_MODE_BITS);
+}
+
+static apr_dbd_t *dbd_mysql_open(apr_pool_t *pool, const char *params,
+ const char **error)
+{
+ static const char *const delims = " \r\n\t;|,";
+ const char *ptr;
+ int i;
+ const char *key;
+ size_t klen;
+ const char *value;
+ size_t vlen;
+#if MYSQL_VERSION_ID >= 50013
+ my_bool do_reconnect = 1;
+#endif
+ MYSQL *real_conn;
+ unsigned long flags = 0;
+
+ struct {
+ const char *field;
+ const char *value;
+ } fields[] = {
+ {"host", NULL},
+ {"user", NULL},
+ {"pass", NULL},
+ {"dbname", NULL},
+ {"port", NULL},
+ {"sock", NULL},
+ {"flags", NULL},
+ {"fldsz", NULL},
+ {"group", NULL},
+ {"reconnect", NULL},
+ {NULL, NULL}
+ };
+ unsigned int port = 0;
+ apr_dbd_t *sql = apr_pcalloc(pool, sizeof(apr_dbd_t));
+ sql->fldsz = FIELDSIZE;
+ sql->conn = mysql_init(sql->conn);
+ if ( sql->conn == NULL ) {
+ return NULL;
+ }
+ for (ptr = strchr(params, '='); ptr; ptr = strchr(ptr, '=')) {
+ /* don't dereference memory that may not belong to us */
+ if (ptr == params) {
+ ++ptr;
+ continue;
+ }
+ for (key = ptr-1; apr_isspace(*key); --key);
+ klen = 0;
+ while (apr_isalpha(*key)) {
+ /* don't parse backwards off the start of the string */
+ if (key == params) {
+ --key;
+ ++klen;
+ break;
+ }
+ --key;
+ ++klen;
+ }
+ ++key;
+ for (value = ptr+1; apr_isspace(*value); ++value);
+ vlen = strcspn(value, delims);
+ for (i = 0; fields[i].field != NULL; i++) {
+ if (!strncasecmp(fields[i].field, key, klen)) {
+ fields[i].value = apr_pstrndup(pool, value, vlen);
+ break;
+ }
+ }
+ ptr = value+vlen;
+ }
+ if (fields[4].value != NULL) {
+ port = atoi(fields[4].value);
+ }
+ if (fields[6].value != NULL &&
+ !strcmp(fields[6].value, "CLIENT_FOUND_ROWS")) {
+ flags |= CLIENT_FOUND_ROWS; /* only option we know */
+ }
+ if (fields[7].value != NULL) {
+ sql->fldsz = atol(fields[7].value);
+ }
+ if (fields[8].value != NULL) {
+ mysql_options(sql->conn, MYSQL_READ_DEFAULT_GROUP, fields[8].value);
+ }
+#if MYSQL_VERSION_ID >= 50013
+ if (fields[9].value != NULL) {
+ do_reconnect = atoi(fields[9].value) ? 1 : 0;
+ }
+#endif
+
+#if MYSQL_VERSION_ID >= 50013
+ /* the MySQL manual says this should be BEFORE mysql_real_connect */
+ mysql_options(sql->conn, MYSQL_OPT_RECONNECT, &do_reconnect);
+#endif
+
+ real_conn = mysql_real_connect(sql->conn, fields[0].value,
+ fields[1].value, fields[2].value,
+ fields[3].value, port,
+ fields[5].value, flags);
+
+ if(real_conn == NULL) {
+ if (error) {
+ *error = apr_pstrdup(pool, mysql_error(sql->conn));
+ }
+ mysql_close(sql->conn);
+ return NULL;
+ }
+
+#if MYSQL_VERSION_ID >= 50013
+ /* Some say this should be AFTER mysql_real_connect */
+ mysql_options(sql->conn, MYSQL_OPT_RECONNECT, &do_reconnect);
+#endif
+
+ return sql;
+}
+
+static apr_status_t dbd_mysql_close(apr_dbd_t *handle)
+{
+ mysql_close(handle->conn);
+ return APR_SUCCESS;
+}
+
+static apr_status_t dbd_mysql_check_conn(apr_pool_t *pool,
+ apr_dbd_t *handle)
+{
+ return mysql_ping(handle->conn) ? APR_EGENERAL : APR_SUCCESS;
+}
+
+static int dbd_mysql_select_db(apr_pool_t *pool, apr_dbd_t* handle,
+ const char* name)
+{
+ return mysql_select_db(handle->conn, name);
+}
+
+static void *dbd_mysql_native(apr_dbd_t *handle)
+{
+ return handle->conn;
+}
+
+static int dbd_mysql_num_cols(apr_dbd_results_t *res)
+{
+ if (res->statement) {
+ return mysql_stmt_field_count(res->statement);
+ }
+ else {
+ return mysql_num_fields(res->res);
+ }
+}
+
+static int dbd_mysql_num_tuples(apr_dbd_results_t *res)
+{
+ if (res->random) {
+ if (res->statement) {
+ return (int) mysql_stmt_num_rows(res->statement);
+ }
+ else {
+ return (int) mysql_num_rows(res->res);
+ }
+ }
+ else {
+ return -1;
+ }
+}
+
+static apr_status_t thread_end(void *data)
+{
+ mysql_thread_end();
+ return APR_SUCCESS;
+}
+
+static void dbd_mysql_init(apr_pool_t *pool)
+{
+ my_init();
+ mysql_thread_init();
+
+ /* FIXME: this is a guess; find out what it really does */
+ apr_pool_cleanup_register(pool, NULL, thread_end, apr_pool_cleanup_null);
+}
+APU_MODULE_DECLARE_DATA const apr_dbd_driver_t apr_dbd_mysql_driver = {
+ "mysql",
+ dbd_mysql_init,
+ dbd_mysql_native,
+ dbd_mysql_open,
+ dbd_mysql_check_conn,
+ dbd_mysql_close,
+ dbd_mysql_select_db,
+ dbd_mysql_transaction,
+ dbd_mysql_end_transaction,
+ dbd_mysql_query,
+ dbd_mysql_select,
+ dbd_mysql_num_cols,
+ dbd_mysql_num_tuples,
+ dbd_mysql_get_row,
+ dbd_mysql_get_entry,
+ dbd_mysql_error,
+ dbd_mysql_escape,
+ dbd_mysql_prepare,
+ dbd_mysql_pvquery,
+ dbd_mysql_pvselect,
+ dbd_mysql_pquery,
+ dbd_mysql_pselect,
+ dbd_mysql_get_name,
+ dbd_mysql_transaction_mode_get,
+ dbd_mysql_transaction_mode_set,
+ "?",
+ dbd_mysql_pvbquery,
+ dbd_mysql_pvbselect,
+ dbd_mysql_pbquery,
+ dbd_mysql_pbselect,
+ dbd_mysql_datum_get
+};
+
+#endif
diff --git a/contrib/apr-util/dbd/apr_dbd_odbc.c b/contrib/apr-util/dbd/apr_dbd_odbc.c
new file mode 100644
index 000000000000..8a3c0fdce9b1
--- /dev/null
+++ b/contrib/apr-util/dbd/apr_dbd_odbc.c
@@ -0,0 +1,1750 @@
+/* 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 "apu.h"
+#if APU_HAVE_ODBC
+
+#include "apr.h"
+#include "apr_strings.h"
+#include "apr_buckets.h"
+#include "apr_env.h"
+#include "apr_file_io.h"
+#include "apr_file_info.h"
+#include "apr_dbd_internal.h"
+#include "apr_thread_proc.h"
+#include "apu_version.h"
+#include "apu_config.h"
+
+#include <stdlib.h>
+
+/* If library is ODBC-V2, use macros for limited ODBC-V2 support
+ * No random access in V2.
+ */
+#ifdef ODBCV2
+#define ODBCVER 0x0200
+#include "apr_dbd_odbc_v2.h"
+#endif
+
+/* standard ODBC include files */
+#ifdef HAVE_SQL_H
+#include <sql.h>
+#include <sqlext.h>
+#elif defined(HAVE_ODBC_SQL_H)
+#include <odbc/sql.h>
+#include <odbc/sqlext.h>
+#endif
+
+/*
+* MSVC6 does not support intptr_t (C99)
+* APR does not have a signed inptr type until 2.0 (r1557720)
+*/
+#if defined(_MSC_VER) && _MSC_VER < 1400
+#if APR_SIZEOF_VOIDP == 8
+#define ODBC_INTPTR_T apr_int64_t
+#else
+#define ODBC_INTPTR_T apr_int32_t
+#endif
+#else
+#define ODBC_INTPTR_T intptr_t
+#endif
+
+
+/* Driver name is "odbc" and the entry point is 'apr_dbd_odbc_driver'
+ * unless ODBC_DRIVER_NAME is defined and it is linked with another db library which
+ * is ODBC source-compatible. e.g. DB2, Informix, TimesTen, mysql.
+ */
+#ifndef ODBC_DRIVER_NAME
+#define ODBC_DRIVER_NAME odbc
+#endif
+#define STRINGIFY(x) #x
+#define NAMIFY2(n) apr_dbd_##n##_driver
+#define NAMIFY1(n) NAMIFY2(n)
+#define ODBC_DRIVER_STRING STRINGIFY(ODBC_DRIVER_NAME)
+#define ODBC_DRIVER_ENTRY NAMIFY1(ODBC_DRIVER_NAME)
+
+/* Required APR version for this driver */
+#define DRIVER_APU_VERSION_MAJOR APU_MAJOR_VERSION
+#define DRIVER_APU_VERSION_MINOR APU_MINOR_VERSION
+
+static SQLHANDLE henv = NULL; /* ODBC ENV handle is process-wide */
+
+/* Use a CHECK_ERROR macro so we can grab the source line numbers
+ * for error reports
+ */
+static void check_error(apr_dbd_t *a, const char *step, SQLRETURN rc,
+ SQLSMALLINT type, SQLHANDLE h, int line);
+#define CHECK_ERROR(a,s,r,t,h) check_error(a,s,r,t,h, __LINE__)
+
+#define SOURCE_FILE __FILE__ /* source file for error messages */
+#define MAX_ERROR_STRING 1024 /* max length of message in dbc */
+#define MAX_COLUMN_NAME 256 /* longest column name recognized */
+#define DEFAULT_BUFFER_SIZE 1024 /* value for defaultBufferSize */
+
+#define MAX_PARAMS 20
+#define DEFAULTSEPS " \t\r\n,="
+#define CSINGLEQUOTE '\''
+#define SSINGLEQUOTE "\'"
+
+#define TEXTMODE 1 /* used for text (APR 1.2) mode params */
+#define BINARYMODE 0 /* used for binary (APR 1.3+) mode params */
+
+/* Identify datatypes which are LOBs
+ * - DB2 DRDA driver uses undefined types -98 and -99 for CLOB & BLOB
+ */
+#define IS_LOB(t) (t == SQL_LONGVARCHAR \
+ || t == SQL_LONGVARBINARY || t == SQL_VARBINARY \
+ || t == -98 || t == -99)
+
+/* These types are CLOBs
+ * - DB2 DRDA driver uses undefined type -98 for CLOB
+ */
+#define IS_CLOB(t) \
+ (t == SQL_LONGVARCHAR || t == -98)
+
+/* Convert a SQL result to an APR result */
+#define APR_FROM_SQL_RESULT(rc) \
+ (SQL_SUCCEEDED(rc) ? APR_SUCCESS : APR_EGENERAL)
+
+/* DBD opaque structures */
+struct apr_dbd_t
+{
+ SQLHANDLE dbc; /* SQL connection handle - NULL after close */
+ apr_pool_t *pool; /* connection lifetime pool */
+ char *dbname; /* ODBC datasource */
+ int lasterrorcode;
+ int lineNumber;
+ char lastError[MAX_ERROR_STRING];
+ int defaultBufferSize; /* used for CLOBs in text mode,
+ * and when fld size is indeterminate */
+ ODBC_INTPTR_T transaction_mode;
+ ODBC_INTPTR_T dboptions; /* driver options re SQLGetData */
+ ODBC_INTPTR_T default_transaction_mode;
+ int can_commit; /* controls end_trans behavior */
+};
+
+struct apr_dbd_results_t
+{
+ SQLHANDLE stmt; /* parent sql statement handle */
+ SQLHANDLE dbc; /* parent sql connection handle */
+ apr_pool_t *pool; /* pool from query or select */
+ apr_dbd_t *apr_dbd; /* parent DBD connection handle */
+ int random; /* random access requested */
+ int ncols; /* number of columns */
+ int isclosed; /* cursor has been closed */
+ char **colnames; /* array of column names (NULL until used) */
+ SQLPOINTER *colptrs; /* pointers to column data */
+ SQLINTEGER *colsizes; /* sizes for columns (enough for txt or bin) */
+ SQLINTEGER *coltextsizes; /* max-sizes if converted to text */
+ SQLSMALLINT *coltypes; /* array of SQL data types for columns */
+ SQLLEN *colinds; /* array of SQL data indicator/strlens */
+ int *colstate; /* array of column states
+ * - avail, bound, present, unavail
+ */
+ int *all_data_fetched; /* flags data as all fetched, for LOBs */
+ void *data; /* buffer for all data for one row */
+};
+
+enum /* results column states */
+{
+ COL_AVAIL, /* data may be retrieved with SQLGetData */
+ COL_PRESENT, /* data has been retrieved with SQLGetData */
+ COL_BOUND, /* column is bound to colptr */
+ COL_RETRIEVED, /* all data from column has been returned */
+ COL_UNAVAIL /* column is unavailable because ODBC driver
+ * requires that columns be retrieved
+ * in ascending order and a higher col
+ * was accessed
+ */
+};
+
+struct apr_dbd_row_t {
+ SQLHANDLE stmt; /* parent ODBC statement handle */
+ SQLHANDLE dbc; /* parent ODBC connection handle */
+ apr_pool_t *pool; /* pool from get_row */
+ apr_dbd_results_t *res;
+};
+
+struct apr_dbd_transaction_t {
+ SQLHANDLE dbc; /* parent ODBC connection handle */
+ apr_dbd_t *apr_dbd; /* parent DBD connection handle */
+};
+
+struct apr_dbd_prepared_t {
+ SQLHANDLE stmt; /* ODBC statement handle */
+ SQLHANDLE dbc; /* parent ODBC connection handle */
+ apr_dbd_t *apr_dbd;
+ int nargs;
+ int nvals;
+ int *types; /* array of DBD data types */
+};
+
+static void odbc_lob_bucket_destroy(void *data);
+static apr_status_t odbc_lob_bucket_setaside(apr_bucket *e, apr_pool_t *pool);
+static apr_status_t odbc_lob_bucket_read(apr_bucket *e, const char **str,
+ apr_size_t *len, apr_read_type_e block);
+
+/* the ODBC LOB bucket type */
+static const apr_bucket_type_t odbc_bucket_type = {
+ "ODBC_LOB", 5, APR_BUCKET_DATA,
+ odbc_lob_bucket_destroy,
+ odbc_lob_bucket_read,
+ odbc_lob_bucket_setaside,
+ apr_bucket_shared_split,
+ apr_bucket_shared_copy
+};
+
+/* ODBC LOB bucket data */
+typedef struct {
+ /** Ref count for shared bucket */
+ apr_bucket_refcount refcount;
+ const apr_dbd_row_t *row;
+ int col;
+ SQLSMALLINT type;
+} odbc_bucket;
+
+/* SQL datatype mappings to DBD datatypes
+ * These tables must correspond *exactly* to the apr_dbd_type_e enum
+ * in apr_dbd.h
+ */
+
+/* ODBC "C" types to DBD datatypes */
+static SQLSMALLINT const sqlCtype[] = {
+ SQL_C_DEFAULT, /* APR_DBD_TYPE_NONE */
+ SQL_C_STINYINT, /* APR_DBD_TYPE_TINY, \%hhd */
+ SQL_C_UTINYINT, /* APR_DBD_TYPE_UTINY, \%hhu */
+ SQL_C_SSHORT, /* APR_DBD_TYPE_SHORT, \%hd */
+ SQL_C_USHORT, /* APR_DBD_TYPE_USHORT, \%hu */
+ SQL_C_SLONG, /* APR_DBD_TYPE_INT, \%d */
+ SQL_C_ULONG, /* APR_DBD_TYPE_UINT, \%u */
+ SQL_C_SLONG, /* APR_DBD_TYPE_LONG, \%ld */
+ SQL_C_ULONG, /* APR_DBD_TYPE_ULONG, \%lu */
+ SQL_C_SBIGINT, /* APR_DBD_TYPE_LONGLONG, \%lld */
+ SQL_C_UBIGINT, /* APR_DBD_TYPE_ULONGLONG, \%llu */
+ SQL_C_FLOAT, /* APR_DBD_TYPE_FLOAT, \%f */
+ SQL_C_DOUBLE, /* APR_DBD_TYPE_DOUBLE, \%lf */
+ SQL_C_CHAR, /* APR_DBD_TYPE_STRING, \%s */
+ SQL_C_CHAR, /* APR_DBD_TYPE_TEXT, \%pDt */
+ SQL_C_CHAR, /*SQL_C_TYPE_TIME, APR_DBD_TYPE_TIME, \%pDi */
+ SQL_C_CHAR, /*SQL_C_TYPE_DATE, APR_DBD_TYPE_DATE, \%pDd */
+ SQL_C_CHAR, /*SQL_C_TYPE_TIMESTAMP, APR_DBD_TYPE_DATETIME, \%pDa */
+ SQL_C_CHAR, /*SQL_C_TYPE_TIMESTAMP, APR_DBD_TYPE_TIMESTAMP, \%pDs */
+ SQL_C_CHAR, /*SQL_C_TYPE_TIMESTAMP, APR_DBD_TYPE_ZTIMESTAMP, \%pDz */
+ SQL_LONGVARBINARY, /* APR_DBD_TYPE_BLOB, \%pDb */
+ SQL_LONGVARCHAR, /* APR_DBD_TYPE_CLOB, \%pDc */
+ SQL_TYPE_NULL /* APR_DBD_TYPE_NULL \%pDn */
+};
+#define NUM_APR_DBD_TYPES (sizeof(sqlCtype) / sizeof(sqlCtype[0]))
+
+/* ODBC Base types to DBD datatypes */
+static SQLSMALLINT const sqlBaseType[] = {
+ SQL_C_DEFAULT, /* APR_DBD_TYPE_NONE */
+ SQL_TINYINT, /* APR_DBD_TYPE_TINY, \%hhd */
+ SQL_TINYINT, /* APR_DBD_TYPE_UTINY, \%hhu */
+ SQL_SMALLINT, /* APR_DBD_TYPE_SHORT, \%hd */
+ SQL_SMALLINT, /* APR_DBD_TYPE_USHORT, \%hu */
+ SQL_INTEGER, /* APR_DBD_TYPE_INT, \%d */
+ SQL_INTEGER, /* APR_DBD_TYPE_UINT, \%u */
+ SQL_INTEGER, /* APR_DBD_TYPE_LONG, \%ld */
+ SQL_INTEGER, /* APR_DBD_TYPE_ULONG, \%lu */
+ SQL_BIGINT, /* APR_DBD_TYPE_LONGLONG, \%lld */
+ SQL_BIGINT, /* APR_DBD_TYPE_ULONGLONG, \%llu */
+ SQL_FLOAT, /* APR_DBD_TYPE_FLOAT, \%f */
+ SQL_DOUBLE, /* APR_DBD_TYPE_DOUBLE, \%lf */
+ SQL_CHAR, /* APR_DBD_TYPE_STRING, \%s */
+ SQL_CHAR, /* APR_DBD_TYPE_TEXT, \%pDt */
+ SQL_CHAR, /*SQL_TIME, APR_DBD_TYPE_TIME, \%pDi */
+ SQL_CHAR, /*SQL_DATE, APR_DBD_TYPE_DATE, \%pDd */
+ SQL_CHAR, /*SQL_TIMESTAMP, APR_DBD_TYPE_DATETIME, \%pDa */
+ SQL_CHAR, /*SQL_TIMESTAMP, APR_DBD_TYPE_TIMESTAMP, \%pDs */
+ SQL_CHAR, /*SQL_TIMESTAMP, APR_DBD_TYPE_ZTIMESTAMP, \%pDz */
+ SQL_LONGVARBINARY, /* APR_DBD_TYPE_BLOB, \%pDb */
+ SQL_LONGVARCHAR, /* APR_DBD_TYPE_CLOB, \%pDc */
+ SQL_TYPE_NULL /* APR_DBD_TYPE_NULL \%pDn */
+};
+
+/* result sizes for DBD datatypes (-1 for null-terminated) */
+static int const sqlSizes[] = {
+ 0,
+ sizeof(char), /**< \%hhd out: char* */
+ sizeof(unsigned char), /**< \%hhu out: unsigned char* */
+ sizeof(short), /**< \%hd out: short* */
+ sizeof(unsigned short), /**< \%hu out: unsigned short* */
+ sizeof(int), /**< \%d out: int* */
+ sizeof(unsigned int), /**< \%u out: unsigned int* */
+ sizeof(long), /**< \%ld out: long* */
+ sizeof(unsigned long), /**< \%lu out: unsigned long* */
+ sizeof(apr_int64_t), /**< \%lld out: apr_int64_t* */
+ sizeof(apr_uint64_t), /**< \%llu out: apr_uint64_t* */
+ sizeof(float), /**< \%f out: float* */
+ sizeof(double), /**< \%lf out: double* */
+ -1, /**< \%s out: char** */
+ -1, /**< \%pDt out: char** */
+ -1, /**< \%pDi out: char** */
+ -1, /**< \%pDd out: char** */
+ -1, /**< \%pDa out: char** */
+ -1, /**< \%pDs out: char** */
+ -1, /**< \%pDz out: char** */
+ sizeof(apr_bucket_brigade), /**< \%pDb out: apr_bucket_brigade* */
+ sizeof(apr_bucket_brigade), /**< \%pDc out: apr_bucket_brigade* */
+ 0 /**< \%pDn : in: void*, out: void** */
+};
+
+/*
+ * local functions
+ */
+
+/* close any open results for the connection */
+static apr_status_t odbc_close_results(void *d)
+{
+ apr_dbd_results_t *dbr = (apr_dbd_results_t *)d;
+ SQLRETURN rc = SQL_SUCCESS;
+
+ if (dbr && dbr->apr_dbd && dbr->apr_dbd->dbc) {
+ if (!dbr->isclosed)
+ rc = SQLCloseCursor(dbr->stmt);
+ dbr->isclosed = 1;
+ }
+ return APR_FROM_SQL_RESULT(rc);
+}
+
+/* close the ODBC statement handle from a prepare */
+static apr_status_t odbc_close_pstmt(void *s)
+{
+ SQLRETURN rc = APR_SUCCESS;
+ apr_dbd_prepared_t *statement = s;
+
+ /* stmt is closed if connection has already been closed */
+ if (statement) {
+ SQLHANDLE hstmt = statement->stmt;
+
+ if (hstmt && statement->apr_dbd && statement->apr_dbd->dbc) {
+ rc = SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
+ }
+ statement->stmt = NULL;
+ }
+ return APR_FROM_SQL_RESULT(rc);
+}
+
+/* close: close/release a connection obtained from open() */
+static apr_status_t odbc_close(apr_dbd_t *handle)
+{
+ SQLRETURN rc = SQL_SUCCESS;
+
+ if (handle->dbc) {
+ rc = SQLDisconnect(handle->dbc);
+ CHECK_ERROR(handle, "SQLDisconnect", rc, SQL_HANDLE_DBC, handle->dbc);
+ rc = SQLFreeHandle(SQL_HANDLE_DBC, handle->dbc);
+ CHECK_ERROR(handle, "SQLFreeHandle (DBC)", rc, SQL_HANDLE_ENV, henv);
+ handle->dbc = NULL;
+ }
+ return APR_FROM_SQL_RESULT(rc);
+}
+
+/* odbc_close re-defined for passing to pool cleanup */
+static apr_status_t odbc_close_cleanup(void *handle)
+{
+ return odbc_close((apr_dbd_t *)handle);
+}
+
+/* close the ODBC environment handle at process termination */
+static apr_status_t odbc_close_env(SQLHANDLE henv)
+{
+ SQLRETURN rc;
+
+ rc = SQLFreeHandle(SQL_HANDLE_ENV, henv);
+ henv = NULL;
+ return APR_FROM_SQL_RESULT(rc);
+}
+
+/* setup the arrays in results for all the returned columns */
+static SQLRETURN odbc_set_result_column(int icol, apr_dbd_results_t *res,
+ SQLHANDLE stmt)
+{
+ SQLRETURN rc;
+ ODBC_INTPTR_T maxsize, textsize, realsize, type, isunsigned = 1;
+
+ /* discover the sql type */
+ rc = SQLColAttribute(stmt, icol + 1, SQL_DESC_UNSIGNED, NULL, 0, NULL,
+ (SQLPOINTER)&isunsigned);
+ isunsigned = (isunsigned == SQL_TRUE);
+
+ rc = SQLColAttribute(stmt, icol + 1, SQL_DESC_TYPE, NULL, 0, NULL,
+ (SQLPOINTER)&type);
+ if (!SQL_SUCCEEDED(rc) || type == SQL_UNKNOWN_TYPE) {
+ /* MANY ODBC v2 datasources only supply CONCISE_TYPE */
+ rc = SQLColAttribute(stmt, icol + 1, SQL_DESC_CONCISE_TYPE, NULL,
+ 0, NULL, (SQLPOINTER)&type);
+ }
+
+ if (!SQL_SUCCEEDED(rc)) {
+ /* if still unknown make it CHAR */
+ type = SQL_C_CHAR;
+ }
+
+ switch (type) {
+ case SQL_INTEGER:
+ case SQL_SMALLINT:
+ case SQL_TINYINT:
+ case SQL_BIGINT:
+ /* fix these numeric binary types up as signed/unsigned for C types */
+ type += (isunsigned) ? SQL_UNSIGNED_OFFSET : SQL_SIGNED_OFFSET;
+ break;
+ /* LOB types are not changed to C types */
+ case SQL_LONGVARCHAR:
+ type = SQL_LONGVARCHAR;
+ break;
+ case SQL_LONGVARBINARY:
+ type = SQL_LONGVARBINARY;
+ break;
+ case SQL_FLOAT :
+ type = SQL_C_FLOAT;
+ break;
+ case SQL_DOUBLE :
+ type = SQL_C_DOUBLE;
+ break;
+
+ /* DBD wants times as strings */
+ case SQL_TIMESTAMP:
+ case SQL_DATE:
+ case SQL_TIME:
+ default:
+ type = SQL_C_CHAR;
+ }
+
+ res->coltypes[icol] = (SQLSMALLINT)type;
+
+ /* size if retrieved as text */
+ rc = SQLColAttribute(stmt, icol + 1, SQL_DESC_DISPLAY_SIZE, NULL, 0,
+ NULL, (SQLPOINTER)&textsize);
+ if (!SQL_SUCCEEDED(rc) || textsize < 0) {
+ textsize = res->apr_dbd->defaultBufferSize;
+ }
+ /* for null-term, which sometimes isn't included */
+ textsize++;
+
+ /* real size */
+ rc = SQLColAttribute(stmt, icol + 1, SQL_DESC_OCTET_LENGTH, NULL, 0,
+ NULL, (SQLPOINTER)&realsize);
+ if (!SQL_SUCCEEDED(rc)) {
+ realsize = textsize;
+ }
+
+ maxsize = (textsize > realsize) ? textsize : realsize;
+ if (IS_LOB(type) || maxsize <= 0) {
+ /* LOB types are never bound and have a NULL colptr for binary.
+ * Ingore their real (1-2gb) length & use a default - the larger
+ * of defaultBufferSize or APR_BUCKET_BUFF_SIZE.
+ * If not a LOB, but simply unknown length - always use defaultBufferSize.
+ */
+ maxsize = res->apr_dbd->defaultBufferSize;
+ if (IS_LOB(type) && maxsize < APR_BUCKET_BUFF_SIZE) {
+ maxsize = APR_BUCKET_BUFF_SIZE;
+ }
+
+ res->colptrs[icol] = NULL;
+ res->colstate[icol] = COL_AVAIL;
+ res->colsizes[icol] = (SQLINTEGER)maxsize;
+ rc = SQL_SUCCESS;
+ }
+ else {
+ res->colptrs[icol] = apr_pcalloc(res->pool, maxsize);
+ res->colsizes[icol] = (SQLINTEGER)maxsize;
+ if (res->apr_dbd->dboptions & SQL_GD_BOUND) {
+ /* we are allowed to call SQLGetData if we need to */
+ rc = SQLBindCol(stmt, icol + 1, res->coltypes[icol],
+ res->colptrs[icol], maxsize,
+ &(res->colinds[icol]));
+ CHECK_ERROR(res->apr_dbd, "SQLBindCol", rc, SQL_HANDLE_STMT,
+ stmt);
+ res->colstate[icol] = SQL_SUCCEEDED(rc) ? COL_BOUND : COL_AVAIL;
+ }
+ else {
+ /* this driver won't allow us to call SQLGetData on bound
+ * columns - so don't bind any
+ */
+ res->colstate[icol] = COL_AVAIL;
+ rc = SQL_SUCCESS;
+ }
+ }
+ return rc;
+}
+
+/* create and populate an apr_dbd_results_t for a select */
+static SQLRETURN odbc_create_results(apr_dbd_t *handle, SQLHANDLE hstmt,
+ apr_pool_t *pool, const int random,
+ apr_dbd_results_t **res)
+{
+ SQLRETURN rc;
+ SQLSMALLINT ncols;
+
+ *res = apr_pcalloc(pool, sizeof(apr_dbd_results_t));
+ (*res)->stmt = hstmt;
+ (*res)->dbc = handle->dbc;
+ (*res)->pool = pool;
+ (*res)->random = random;
+ (*res)->apr_dbd = handle;
+ rc = SQLNumResultCols(hstmt, &ncols);
+ CHECK_ERROR(handle, "SQLNumResultCols", rc, SQL_HANDLE_STMT, hstmt);
+ (*res)->ncols = ncols;
+
+ if (SQL_SUCCEEDED(rc)) {
+ int i;
+
+ (*res)->colnames = apr_pcalloc(pool, ncols * sizeof(char *));
+ (*res)->colptrs = apr_pcalloc(pool, ncols * sizeof(void *));
+ (*res)->colsizes = apr_pcalloc(pool, ncols * sizeof(SQLINTEGER));
+ (*res)->coltypes = apr_pcalloc(pool, ncols * sizeof(SQLSMALLINT));
+ (*res)->colinds = apr_pcalloc(pool, ncols * sizeof(SQLLEN));
+ (*res)->colstate = apr_pcalloc(pool, ncols * sizeof(int));
+ (*res)->ncols = ncols;
+
+ for (i = 0; i < ncols; i++) {
+ odbc_set_result_column(i, (*res), hstmt);
+ }
+ }
+ return rc;
+}
+
+
+/* bind a parameter - input params only, does not support output parameters */
+static SQLRETURN odbc_bind_param(apr_pool_t *pool,
+ apr_dbd_prepared_t *statement, const int narg,
+ const SQLSMALLINT type, int *argp,
+ const void **args, const int textmode)
+{
+ SQLRETURN rc;
+ SQLSMALLINT baseType, cType;
+ void *ptr;
+ SQLULEN len;
+ SQLLEN *indicator;
+ static SQLLEN nullValue = SQL_NULL_DATA;
+ static SQLSMALLINT inOut = SQL_PARAM_INPUT; /* only input params */
+
+ /* bind a NULL data value */
+ if (args[*argp] == NULL || type == APR_DBD_TYPE_NULL) {
+ baseType = SQL_CHAR;
+ cType = SQL_C_CHAR;
+ ptr = &nullValue;
+ len = sizeof(SQLINTEGER);
+ indicator = &nullValue;
+ (*argp)++;
+ }
+ /* bind a non-NULL data value */
+ else {
+ if (type < 0 || type >= NUM_APR_DBD_TYPES) {
+ return APR_EGENERAL;
+ }
+
+ baseType = sqlBaseType[type];
+ cType = sqlCtype[type];
+ indicator = NULL;
+ /* LOBs */
+ if (IS_LOB(cType)) {
+ ptr = (void *)args[*argp];
+ len = (SQLULEN) * (apr_size_t *)args[*argp + 1];
+ cType = (IS_CLOB(cType)) ? SQL_C_CHAR : SQL_C_DEFAULT;
+ (*argp) += 4; /* LOBs consume 4 args (last two are unused) */
+ }
+ /* non-LOBs */
+ else {
+ switch (baseType) {
+ case SQL_CHAR:
+ case SQL_DATE:
+ case SQL_TIME:
+ case SQL_TIMESTAMP:
+ ptr = (void *)args[*argp];
+ len = (SQLULEN)strlen(ptr);
+ break;
+ case SQL_TINYINT:
+ ptr = apr_palloc(pool, sizeof(unsigned char));
+ len = sizeof(unsigned char);
+ *(unsigned char *)ptr =
+ (textmode ?
+ atoi(args[*argp]) : *(unsigned char *)args[*argp]);
+ break;
+ case SQL_SMALLINT:
+ ptr = apr_palloc(pool, sizeof(short));
+ len = sizeof(short);
+ *(short *)ptr =
+ (textmode ? atoi(args[*argp]) : *(short *)args[*argp]);
+ break;
+ case SQL_INTEGER:
+ ptr = apr_palloc(pool, sizeof(int));
+ len = sizeof(int);
+ *(long *)ptr =
+ (textmode ? atol(args[*argp]) : *(long *)args[*argp]);
+ break;
+ case SQL_FLOAT:
+ ptr = apr_palloc(pool, sizeof(float));
+ len = sizeof(float);
+ *(float *)ptr =
+ (textmode ?
+ (float)atof(args[*argp]) : *(float *)args[*argp]);
+ break;
+ case SQL_DOUBLE:
+ ptr = apr_palloc(pool, sizeof(double));
+ len = sizeof(double);
+ *(double *)ptr =
+ (textmode ? atof(args[*argp]) : *(double *)
+ args[*argp]);
+ break;
+ case SQL_BIGINT:
+ ptr = apr_palloc(pool, sizeof(apr_int64_t));
+ len = sizeof(apr_int64_t);
+ *(apr_int64_t *)ptr =
+ (textmode ?
+ apr_atoi64(args[*argp]) : *(apr_int64_t *)args[*argp]);
+ break;
+ default:
+ return APR_EGENERAL;
+ }
+ (*argp)++; /* non LOBs consume one argument */
+ }
+ }
+ rc = SQLBindParameter(statement->stmt, narg, inOut, cType,
+ baseType, len, 0, ptr, len, indicator);
+ CHECK_ERROR(statement->apr_dbd, "SQLBindParameter", rc, SQL_HANDLE_STMT,
+ statement->stmt);
+ return rc;
+}
+
+/* LOB / Bucket Brigade functions */
+
+/* bucket type specific destroy */
+static void odbc_lob_bucket_destroy(void *data)
+{
+ odbc_bucket *bd = data;
+
+ if (apr_bucket_shared_destroy(bd))
+ apr_bucket_free(bd);
+}
+
+/* set aside a bucket if possible */
+static apr_status_t odbc_lob_bucket_setaside(apr_bucket *e, apr_pool_t *pool)
+{
+ odbc_bucket *bd = (odbc_bucket *)e->data;
+
+ /* Unlikely - but if the row pool is ancestor of this pool then it is OK */
+ if (apr_pool_is_ancestor(bd->row->pool, pool))
+ return APR_SUCCESS;
+
+ return apr_bucket_setaside_notimpl(e, pool);
+}
+
+/* split a bucket into a heap bucket followed by a LOB bkt w/remaining data */
+static apr_status_t odbc_lob_bucket_read(apr_bucket *e, const char **str,
+ apr_size_t *len, apr_read_type_e block)
+{
+ SQLRETURN rc;
+ SQLLEN len_indicator;
+ SQLSMALLINT type;
+ odbc_bucket *bd = (odbc_bucket *)e->data;
+ apr_bucket *nxt;
+ void *buf;
+ int bufsize = bd->row->res->apr_dbd->defaultBufferSize;
+ int eos;
+
+ /* C type is CHAR for CLOBs, DEFAULT for BLOBs */
+ type = bd->row->res->coltypes[bd->col];
+ type = (type == SQL_LONGVARCHAR) ? SQL_C_CHAR : SQL_C_DEFAULT;
+
+ /* LOB buffers are always at least APR_BUCKET_BUFF_SIZE,
+ * but they may be much bigger per the BUFSIZE parameter.
+ */
+ if (bufsize < APR_BUCKET_BUFF_SIZE)
+ bufsize = APR_BUCKET_BUFF_SIZE;
+
+ buf = apr_bucket_alloc(bufsize, e->list);
+ *str = NULL;
+ *len = 0;
+
+ rc = SQLGetData(bd->row->res->stmt, bd->col + 1,
+ type, buf, bufsize,
+ &len_indicator);
+
+ CHECK_ERROR(bd->row->res->apr_dbd, "SQLGetData", rc,
+ SQL_HANDLE_STMT, bd->row->res->stmt);
+
+ if (rc == SQL_NO_DATA || len_indicator == SQL_NULL_DATA || len_indicator < 0)
+ len_indicator = 0;
+
+ if (SQL_SUCCEEDED(rc) || rc == SQL_NO_DATA) {
+
+ if (rc == SQL_SUCCESS_WITH_INFO
+ && (len_indicator == SQL_NO_TOTAL || len_indicator >= bufsize)) {
+ /* not the last read = a full buffer. CLOBs have a null terminator */
+ *len = bufsize - (IS_CLOB(bd->type) ? 1 : 0 );
+
+ eos = 0;
+ }
+ else {
+ /* the last read - len_indicator is supposed to be the length,
+ * but some driver get this wrong and return the total length.
+ * We try to handle both interpretations.
+ */
+ *len = (len_indicator > bufsize
+ && len_indicator >= (SQLLEN)e->start)
+ ? (len_indicator - (SQLLEN)e->start) : len_indicator;
+
+ eos = 1;
+ }
+
+ if (!eos) {
+ /* Create a new LOB bucket to append and append it */
+ nxt = apr_bucket_alloc(sizeof(apr_bucket *), e->list);
+ APR_BUCKET_INIT(nxt);
+ nxt->length = -1;
+ nxt->data = e->data;
+ nxt->type = &odbc_bucket_type;
+ nxt->free = apr_bucket_free;
+ nxt->list = e->list;
+ nxt->start = e->start + *len;
+ APR_BUCKET_INSERT_AFTER(e, nxt);
+ }
+ else {
+ odbc_lob_bucket_destroy(e->data);
+ }
+ /* make current bucket into a heap bucket */
+ apr_bucket_heap_make(e, buf, *len, apr_bucket_free);
+ *str = buf;
+
+ /* No data is success in this context */
+ rc = SQL_SUCCESS;
+ }
+ return APR_FROM_SQL_RESULT(rc);
+}
+
+/* Create a bucket brigade on the row pool for a LOB column */
+static apr_status_t odbc_create_bucket(const apr_dbd_row_t *row, const int col,
+ SQLSMALLINT type, apr_bucket_brigade *bb)
+{
+ apr_bucket_alloc_t *list = bb->bucket_alloc;
+ apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
+ odbc_bucket *bd = apr_bucket_alloc(sizeof(odbc_bucket), list);
+ apr_bucket *eos = apr_bucket_eos_create(list);
+
+ bd->row = row;
+ bd->col = col;
+ bd->type = type;
+
+ APR_BUCKET_INIT(b);
+ b->type = &odbc_bucket_type;
+ b->free = apr_bucket_free;
+ b->list = list;
+ /* LOB lengths are unknown in ODBC */
+ b = apr_bucket_shared_make(b, bd, 0, -1);
+
+ APR_BRIGADE_INSERT_TAIL(bb, b);
+ APR_BRIGADE_INSERT_TAIL(bb, eos);
+
+ return APR_SUCCESS;
+}
+
+/* returns a data pointer for a column, returns NULL for NULL value,
+ * return -1 if data not available
+ */
+static void *odbc_get(const apr_dbd_row_t *row, const int col,
+ const SQLSMALLINT sqltype)
+{
+ SQLRETURN rc;
+ SQLLEN indicator;
+ int state = row->res->colstate[col];
+ ODBC_INTPTR_T options = row->res->apr_dbd->dboptions;
+
+ switch (state) {
+ case (COL_UNAVAIL):
+ return (void *)-1;
+ case (COL_RETRIEVED):
+ return NULL;
+
+ case (COL_BOUND):
+ case (COL_PRESENT):
+ if (sqltype == row->res->coltypes[col]) {
+ /* same type and we already have the data */
+ row->res->colstate[col] = COL_RETRIEVED;
+ return (row->res->colinds[col] == SQL_NULL_DATA) ?
+ NULL : row->res->colptrs[col];
+ }
+ }
+
+ /* we need to get the data now */
+ if (!(options & SQL_GD_ANY_ORDER)) {
+ /* this ODBC driver requires columns to be retrieved in order,
+ * so we attempt to get every prior un-gotten non-LOB column
+ */
+ int i;
+ for (i = 0; i < col; i++) {
+ if (row->res->colstate[i] == COL_AVAIL) {
+ if (IS_LOB(row->res->coltypes[i]))
+ row->res->colstate[i] = COL_UNAVAIL;
+ else {
+ odbc_get(row, i, row->res->coltypes[i]);
+ row->res->colstate[i] = COL_PRESENT;
+ }
+ }
+ }
+ }
+
+ if ((state == COL_BOUND && !(options & SQL_GD_BOUND)))
+ /* this driver won't let us re-get bound columns */
+ return (void *)-1;
+
+ /* a LOB might not have a buffer allocated yet - so create one */
+ if (!row->res->colptrs[col])
+ row->res->colptrs[col] = apr_pcalloc(row->pool, row->res->colsizes[col]);
+
+ rc = SQLGetData(row->res->stmt, col + 1, sqltype, row->res->colptrs[col],
+ row->res->colsizes[col], &indicator);
+ CHECK_ERROR(row->res->apr_dbd, "SQLGetData", rc, SQL_HANDLE_STMT,
+ row->res->stmt);
+ if (indicator == SQL_NULL_DATA || rc == SQL_NO_DATA)
+ return NULL;
+
+ if (SQL_SUCCEEDED(rc)) {
+ /* whatever it was originally, it is now this sqltype */
+ row->res->coltypes[col] = sqltype;
+ /* this allows getting CLOBs in text mode by calling get_entry
+ * until it returns NULL
+ */
+ row->res->colstate[col] =
+ (rc == SQL_SUCCESS_WITH_INFO) ? COL_AVAIL : COL_RETRIEVED;
+ return row->res->colptrs[col];
+ }
+ else
+ return (void *)-1;
+}
+
+/* Parse the parameter string for open */
+static apr_status_t odbc_parse_params(apr_pool_t *pool, const char *params,
+ int *connect, SQLCHAR **datasource,
+ SQLCHAR **user, SQLCHAR **password,
+ int *defaultBufferSize, int *nattrs,
+ int **attrs, ODBC_INTPTR_T **attrvals)
+{
+ char *seps, *last, *next, *name[MAX_PARAMS], *val[MAX_PARAMS];
+ int nparams = 0, i, j;
+
+ *attrs = apr_pcalloc(pool, MAX_PARAMS * sizeof(char *));
+ *attrvals = apr_pcalloc(pool, MAX_PARAMS * sizeof(ODBC_INTPTR_T));
+ *nattrs = 0;
+ seps = DEFAULTSEPS;
+ name[nparams] = apr_strtok(apr_pstrdup(pool, params), seps, &last);
+
+ /* no params is OK here - let connect return a more useful error msg */
+ if (!name[nparams])
+ return SQL_SUCCESS;
+
+ do {
+ if (last[strspn(last, seps)] == CSINGLEQUOTE) {
+ last += strspn(last, seps);
+ seps=SSINGLEQUOTE;
+ }
+ val[nparams] = apr_strtok(NULL, seps, &last);
+ seps = DEFAULTSEPS;
+
+ ++nparams;
+ next = apr_strtok(NULL, seps, &last);
+ if (!next) {
+ break;
+ }
+ if (nparams >= MAX_PARAMS) {
+ /* too many parameters, no place to store */
+ return APR_EGENERAL;
+ }
+ name[nparams] = next;
+ } while (1);
+
+ for (j = i = 0; i < nparams; i++) {
+ if (!apr_strnatcasecmp(name[i], "CONNECT")) {
+ *datasource = (SQLCHAR *)apr_pstrdup(pool, val[i]);
+ *connect = 1;
+ }
+ else if (!apr_strnatcasecmp(name[i], "DATASOURCE")) {
+ *datasource = (SQLCHAR *)apr_pstrdup(pool, val[i]);
+ *connect = 0;
+ }
+ else if (!apr_strnatcasecmp(name[i], "USER")) {
+ *user = (SQLCHAR *)apr_pstrdup(pool, val[i]);
+ }
+ else if (!apr_strnatcasecmp(name[i], "PASSWORD")) {
+ *password = (SQLCHAR *)apr_pstrdup(pool, val[i]);
+ }
+ else if (!apr_strnatcasecmp(name[i], "BUFSIZE")) {
+ *defaultBufferSize = atoi(val[i]);
+ }
+ else if (!apr_strnatcasecmp(name[i], "ACCESS")) {
+ if (!apr_strnatcasecmp(val[i], "READ_ONLY"))
+ (*attrvals)[j] = SQL_MODE_READ_ONLY;
+ else if (!apr_strnatcasecmp(val[i], "READ_WRITE"))
+ (*attrvals)[j] = SQL_MODE_READ_WRITE;
+ else
+ return SQL_ERROR;
+ (*attrs)[j++] = SQL_ATTR_ACCESS_MODE;
+ }
+ else if (!apr_strnatcasecmp(name[i], "CTIMEOUT")) {
+ (*attrvals)[j] = atoi(val[i]);
+ (*attrs)[j++] = SQL_ATTR_LOGIN_TIMEOUT;
+ }
+ else if (!apr_strnatcasecmp(name[i], "STIMEOUT")) {
+ (*attrvals)[j] = atoi(val[i]);
+ (*attrs)[j++] = SQL_ATTR_CONNECTION_TIMEOUT;
+ }
+ else if (!apr_strnatcasecmp(name[i], "TXMODE")) {
+ if (!apr_strnatcasecmp(val[i], "READ_UNCOMMITTED"))
+ (*attrvals)[j] = SQL_TXN_READ_UNCOMMITTED;
+ else if (!apr_strnatcasecmp(val[i], "READ_COMMITTED"))
+ (*attrvals)[j] = SQL_TXN_READ_COMMITTED;
+ else if (!apr_strnatcasecmp(val[i], "REPEATABLE_READ"))
+ (*attrvals)[j] = SQL_TXN_REPEATABLE_READ;
+ else if (!apr_strnatcasecmp(val[i], "SERIALIZABLE"))
+ (*attrvals)[j] = SQL_TXN_SERIALIZABLE;
+ else if (!apr_strnatcasecmp(val[i], "DEFAULT"))
+ continue;
+ else
+ return SQL_ERROR;
+ (*attrs)[j++] = SQL_ATTR_TXN_ISOLATION;
+ }
+ else
+ return SQL_ERROR;
+ }
+ *nattrs = j;
+ return (*datasource && *defaultBufferSize) ? APR_SUCCESS : SQL_ERROR;
+}
+
+/* common handling after ODBC calls - save error info (code and text) in dbc */
+static void check_error(apr_dbd_t *dbc, const char *step, SQLRETURN rc,
+ SQLSMALLINT type, SQLHANDLE h, int line)
+{
+ SQLCHAR buffer[512];
+ SQLCHAR sqlstate[128];
+ SQLINTEGER native;
+ SQLSMALLINT reslength;
+ char *res, *p, *end, *logval = NULL;
+ int i;
+
+ /* set info about last error in dbc - fast return for SQL_SUCCESS */
+ if (rc == SQL_SUCCESS) {
+ char successMsg[] = "[dbd_odbc] SQL_SUCCESS ";
+ apr_size_t successMsgLen = sizeof successMsg - 1;
+
+ dbc->lasterrorcode = SQL_SUCCESS;
+ apr_cpystrn(dbc->lastError, successMsg, sizeof dbc->lastError);
+ apr_cpystrn(dbc->lastError + successMsgLen, step,
+ sizeof dbc->lastError - successMsgLen);
+ return;
+ }
+ switch (rc) {
+ case SQL_INVALID_HANDLE:
+ res = "SQL_INVALID_HANDLE";
+ break;
+ case SQL_ERROR:
+ res = "SQL_ERROR";
+ break;
+ case SQL_SUCCESS_WITH_INFO:
+ res = "SQL_SUCCESS_WITH_INFO";
+ break;
+ case SQL_STILL_EXECUTING:
+ res = "SQL_STILL_EXECUTING";
+ break;
+ case SQL_NEED_DATA:
+ res = "SQL_NEED_DATA";
+ break;
+ case SQL_NO_DATA:
+ res = "SQL_NO_DATA";
+ break;
+ default:
+ res = "unrecognized SQL return code";
+ }
+ /* these two returns are expected during normal execution */
+ if (rc != SQL_SUCCESS_WITH_INFO && rc != SQL_NO_DATA
+ && dbc->can_commit != APR_DBD_TRANSACTION_IGNORE_ERRORS) {
+ dbc->can_commit = APR_DBD_TRANSACTION_ROLLBACK;
+ }
+ p = dbc->lastError;
+ end = p + sizeof(dbc->lastError);
+ dbc->lasterrorcode = rc;
+ p += sprintf(p, "[dbd_odbc] %.64s returned %.30s (%d) at %.24s:%d ",
+ step, res, rc, SOURCE_FILE, line - 1);
+ for (i = 1, rc = 0; rc == 0; i++) {
+ rc = SQLGetDiagRec(type, h, i, sqlstate, &native, buffer,
+ sizeof(buffer), &reslength);
+ if (SQL_SUCCEEDED(rc) && (p < (end - 280)))
+ p += sprintf(p, "%.256s %.20s ", buffer, sqlstate);
+ }
+ apr_env_get(&logval, "apr_dbd_odbc_log", dbc->pool);
+ /* if env var was set or call was init/open (no dbname) - log to stderr */
+ if (logval || !dbc->dbname ) {
+ char timestamp[APR_CTIME_LEN];
+
+ apr_file_t *se;
+ apr_ctime(timestamp, apr_time_now());
+ apr_file_open_stderr(&se, dbc->pool);
+ apr_file_printf(se, "[%s] %s\n", timestamp, dbc->lastError);
+ }
+}
+
+static APR_INLINE int odbc_check_rollback(apr_dbd_t *handle)
+{
+ if (handle->can_commit == APR_DBD_TRANSACTION_ROLLBACK) {
+ handle->lasterrorcode = SQL_ERROR;
+ apr_cpystrn(handle->lastError, "[dbd_odbc] Rollback pending ",
+ sizeof handle->lastError);
+ return 1;
+ }
+ return 0;
+}
+
+/*
+ * public functions per DBD driver API
+ */
+
+/** init: allow driver to perform once-only initialisation. **/
+static void odbc_init(apr_pool_t *pool)
+{
+ SQLRETURN rc;
+ char *step;
+ apr_version_t apuver;
+
+ apu_version(&apuver);
+ if (apuver.major != DRIVER_APU_VERSION_MAJOR
+ || apuver.minor != DRIVER_APU_VERSION_MINOR) {
+ apr_file_t *se;
+
+ apr_file_open_stderr(&se, pool);
+ apr_file_printf(se, "Incorrect " ODBC_DRIVER_STRING " dbd driver version\n"
+ "Attempt to load APU version %d.%d driver with APU version %d.%d\n",
+ DRIVER_APU_VERSION_MAJOR, DRIVER_APU_VERSION_MINOR,
+ apuver.major, apuver.minor);
+ abort();
+ }
+
+ if (henv)
+ return;
+
+ step = "SQLAllocHandle (SQL_HANDLE_ENV)";
+ rc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
+ apr_pool_cleanup_register(pool, henv, odbc_close_env, apr_pool_cleanup_null);
+ if (SQL_SUCCEEDED(rc)) {
+ step = "SQLSetEnvAttr";
+ rc = SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,
+ (SQLPOINTER)SQL_OV_ODBC3, 0);
+ }
+ else {
+ apr_dbd_t tmp_dbc;
+ SQLHANDLE err_h = henv;
+
+ tmp_dbc.pool = pool;
+ tmp_dbc.dbname = NULL;
+ CHECK_ERROR(&tmp_dbc, step, rc, SQL_HANDLE_ENV, err_h);
+ }
+}
+
+/** native_handle: return the native database handle of the underlying db **/
+static void *odbc_native_handle(apr_dbd_t *handle)
+{
+ return handle->dbc;
+}
+
+/** open: obtain a database connection from the server rec. **/
+
+/* It would be more efficient to allocate a single statement handle
+ * here - but SQL_ATTR_CURSOR_SCROLLABLE must be set before
+ * SQLPrepare, and we don't know whether random-access is
+ * specified until SQLExecute so we cannot.
+ */
+
+static apr_dbd_t *odbc_open(apr_pool_t *pool, const char *params, const char **error)
+{
+ SQLRETURN rc;
+ SQLHANDLE hdbc = NULL;
+ apr_dbd_t *handle;
+ char *err_step;
+ int err_htype, i;
+ int defaultBufferSize = DEFAULT_BUFFER_SIZE;
+ SQLHANDLE err_h = NULL;
+ SQLCHAR *datasource = (SQLCHAR *)"", *user = (SQLCHAR *)"",
+ *password = (SQLCHAR *)"";
+ int nattrs = 0, *attrs = NULL, connect = 0;
+ ODBC_INTPTR_T *attrvals = NULL;
+
+ err_step = "SQLAllocHandle (SQL_HANDLE_DBC)";
+ err_htype = SQL_HANDLE_ENV;
+ err_h = henv;
+ rc = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
+ if (SQL_SUCCEEDED(rc)) {
+ err_step = "Invalid DBD Parameters - open";
+ err_htype = SQL_HANDLE_DBC;
+ err_h = hdbc;
+ rc = odbc_parse_params(pool, params, &connect, &datasource, &user,
+ &password, &defaultBufferSize, &nattrs, &attrs,
+ &attrvals);
+ }
+ if (SQL_SUCCEEDED(rc)) {
+ for (i = 0; i < nattrs && SQL_SUCCEEDED(rc); i++) {
+ err_step = "SQLSetConnectAttr (from DBD Parameters)";
+ err_htype = SQL_HANDLE_DBC;
+ err_h = hdbc;
+ rc = SQLSetConnectAttr(hdbc, attrs[i], (SQLPOINTER)attrvals[i], 0);
+ }
+ }
+ if (SQL_SUCCEEDED(rc)) {
+ if (connect) {
+ SQLCHAR out[1024];
+ SQLSMALLINT outlen;
+
+ err_step = "SQLDriverConnect";
+ err_htype = SQL_HANDLE_DBC;
+ err_h = hdbc;
+ rc = SQLDriverConnect(hdbc, NULL, datasource,
+ (SQLSMALLINT)strlen((char *)datasource),
+ out, sizeof(out), &outlen, SQL_DRIVER_NOPROMPT);
+ }
+ else {
+ err_step = "SQLConnect";
+ err_htype = SQL_HANDLE_DBC;
+ err_h = hdbc;
+ rc = SQLConnect(hdbc, datasource,
+ (SQLSMALLINT)strlen((char *)datasource),
+ user, (SQLSMALLINT)strlen((char *)user),
+ password, (SQLSMALLINT)strlen((char *)password));
+ }
+ }
+ if (SQL_SUCCEEDED(rc)) {
+ handle = apr_pcalloc(pool, sizeof(apr_dbd_t));
+ handle->dbname = apr_pstrdup(pool, (char *)datasource);
+ handle->dbc = hdbc;
+ handle->pool = pool;
+ handle->defaultBufferSize = defaultBufferSize;
+ CHECK_ERROR(handle, "SQLConnect", rc, SQL_HANDLE_DBC, handle->dbc);
+ handle->default_transaction_mode = 0;
+ handle->can_commit = APR_DBD_TRANSACTION_IGNORE_ERRORS;
+ SQLGetInfo(hdbc, SQL_DEFAULT_TXN_ISOLATION,
+ &(handle->default_transaction_mode), sizeof(ODBC_INTPTR_T), NULL);
+ handle->transaction_mode = handle->default_transaction_mode;
+ SQLGetInfo(hdbc, SQL_GETDATA_EXTENSIONS ,&(handle->dboptions),
+ sizeof(ODBC_INTPTR_T), NULL);
+ apr_pool_cleanup_register(pool, handle, odbc_close_cleanup, apr_pool_cleanup_null);
+ return handle;
+ }
+ else {
+ apr_dbd_t tmp_dbc;
+
+ tmp_dbc.pool = pool;
+ tmp_dbc.dbname = NULL;
+ CHECK_ERROR(&tmp_dbc, err_step, rc, err_htype, err_h);
+ if (error)
+ *error = apr_pstrdup(pool, tmp_dbc.lastError);
+ if (hdbc)
+ SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
+ return NULL;
+ }
+}
+
+/** check_conn: check status of a database connection **/
+static apr_status_t odbc_check_conn(apr_pool_t *pool, apr_dbd_t *handle)
+{
+ SQLUINTEGER isDead;
+ SQLRETURN rc;
+
+ rc = SQLGetConnectAttr(handle->dbc, SQL_ATTR_CONNECTION_DEAD, &isDead,
+ sizeof(SQLUINTEGER), NULL);
+ CHECK_ERROR(handle, "SQLGetConnectAttr (SQL_ATTR_CONNECTION_DEAD)", rc,
+ SQL_HANDLE_DBC, handle->dbc);
+ /* if driver cannot check connection, say so */
+ if (rc != SQL_SUCCESS)
+ return APR_ENOTIMPL;
+
+ return (isDead == SQL_CD_FALSE) ? APR_SUCCESS : APR_EGENERAL;
+}
+
+/** set_dbname: select database name. May be a no-op if not supported. **/
+static int odbc_set_dbname(apr_pool_t*pool, apr_dbd_t *handle,
+ const char *name)
+{
+ if (apr_strnatcmp(name, handle->dbname)) {
+ return APR_EGENERAL; /* It's illegal to change dbname in ODBC */
+ }
+ CHECK_ERROR(handle, "set_dbname (no-op)", SQL_SUCCESS, SQL_HANDLE_DBC,
+ handle->dbc);
+ return APR_SUCCESS; /* OK if it's the same name */
+}
+
+/** transaction: start a transaction. May be a no-op. **/
+static int odbc_start_transaction(apr_pool_t *pool, apr_dbd_t *handle,
+ apr_dbd_transaction_t **trans)
+{
+ SQLRETURN rc = SQL_SUCCESS;
+
+ if (handle->transaction_mode) {
+ rc = SQLSetConnectAttr(handle->dbc, SQL_ATTR_TXN_ISOLATION,
+ (SQLPOINTER)handle->transaction_mode, 0);
+ CHECK_ERROR(handle, "SQLSetConnectAttr (SQL_ATTR_TXN_ISOLATION)", rc,
+ SQL_HANDLE_DBC, handle->dbc);
+ }
+ if (SQL_SUCCEEDED(rc)) {
+ /* turn off autocommit for transactions */
+ rc = SQLSetConnectAttr(handle->dbc, SQL_ATTR_AUTOCOMMIT,
+ SQL_AUTOCOMMIT_OFF, 0);
+ CHECK_ERROR(handle, "SQLSetConnectAttr (SQL_ATTR_AUTOCOMMIT)", rc,
+ SQL_HANDLE_DBC, handle->dbc);
+ }
+ if (SQL_SUCCEEDED(rc)) {
+ *trans = apr_palloc(pool, sizeof(apr_dbd_transaction_t));
+ (*trans)->dbc = handle->dbc;
+ (*trans)->apr_dbd = handle;
+ }
+ handle->can_commit = APR_DBD_TRANSACTION_COMMIT;
+ return APR_FROM_SQL_RESULT(rc);
+}
+
+/** end_transaction: end a transaction **/
+static int odbc_end_transaction(apr_dbd_transaction_t *trans)
+{
+ SQLRETURN rc;
+ int action = (trans->apr_dbd->can_commit != APR_DBD_TRANSACTION_ROLLBACK)
+ ? SQL_COMMIT : SQL_ROLLBACK;
+
+ rc = SQLEndTran(SQL_HANDLE_DBC, trans->dbc, action);
+ CHECK_ERROR(trans->apr_dbd, "SQLEndTran", rc, SQL_HANDLE_DBC, trans->dbc);
+ if (SQL_SUCCEEDED(rc)) {
+ rc = SQLSetConnectAttr(trans->dbc, SQL_ATTR_AUTOCOMMIT,
+ (SQLPOINTER)SQL_AUTOCOMMIT_ON, 0);
+ CHECK_ERROR(trans->apr_dbd, "SQLSetConnectAttr (SQL_ATTR_AUTOCOMMIT)",
+ rc, SQL_HANDLE_DBC, trans->dbc);
+ }
+ trans->apr_dbd->can_commit = APR_DBD_TRANSACTION_IGNORE_ERRORS;
+ return APR_FROM_SQL_RESULT(rc);
+}
+
+/** query: execute an SQL statement which doesn't return a result set **/
+static int odbc_query(apr_dbd_t *handle, int *nrows, const char *statement)
+{
+ SQLRETURN rc;
+ SQLHANDLE hstmt = NULL;
+ size_t len = strlen(statement);
+
+ if (odbc_check_rollback(handle))
+ return APR_EGENERAL;
+
+ rc = SQLAllocHandle(SQL_HANDLE_STMT, handle->dbc, &hstmt);
+ CHECK_ERROR(handle, "SQLAllocHandle (STMT)", rc, SQL_HANDLE_DBC,
+ handle->dbc);
+ if (!SQL_SUCCEEDED(rc))
+ return APR_FROM_SQL_RESULT(rc);
+
+ rc = SQLExecDirect(hstmt, (SQLCHAR *)statement, (SQLINTEGER)len);
+ CHECK_ERROR(handle, "SQLExecDirect", rc, SQL_HANDLE_STMT, hstmt);
+
+ if (SQL_SUCCEEDED(rc)) {
+ SQLLEN rowcount;
+
+ rc = SQLRowCount(hstmt, &rowcount);
+ *nrows = (int)rowcount;
+ CHECK_ERROR(handle, "SQLRowCount", rc, SQL_HANDLE_STMT, hstmt);
+ }
+
+ SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
+ return APR_FROM_SQL_RESULT(rc);
+}
+
+/** select: execute an SQL statement which returns a result set **/
+static int odbc_select(apr_pool_t *pool, apr_dbd_t *handle,
+ apr_dbd_results_t **res, const char *statement,
+ int random)
+{
+ SQLRETURN rc;
+ SQLHANDLE hstmt;
+ apr_dbd_prepared_t *stmt;
+ size_t len = strlen(statement);
+
+ if (odbc_check_rollback(handle))
+ return APR_EGENERAL;
+
+ rc = SQLAllocHandle(SQL_HANDLE_STMT, handle->dbc, &hstmt);
+ CHECK_ERROR(handle, "SQLAllocHandle (STMT)", rc, SQL_HANDLE_DBC,
+ handle->dbc);
+ if (!SQL_SUCCEEDED(rc))
+ return APR_FROM_SQL_RESULT(rc);
+ /* Prepare an apr_dbd_prepared_t for pool cleanup, even though this
+ * is not a prepared statement. We want the same cleanup mechanism.
+ */
+ stmt = apr_pcalloc(pool, sizeof(apr_dbd_prepared_t));
+ stmt->apr_dbd = handle;
+ stmt->dbc = handle->dbc;
+ stmt->stmt = hstmt;
+ apr_pool_cleanup_register(pool, stmt, odbc_close_pstmt, apr_pool_cleanup_null);
+ if (random) {
+ rc = SQLSetStmtAttr(hstmt, SQL_ATTR_CURSOR_SCROLLABLE,
+ (SQLPOINTER)SQL_SCROLLABLE, 0);
+ CHECK_ERROR(handle, "SQLSetStmtAttr (SQL_ATTR_CURSOR_SCROLLABLE)", rc,
+ SQL_HANDLE_STMT, hstmt);
+ }
+ if (SQL_SUCCEEDED(rc)) {
+ rc = SQLExecDirect(hstmt, (SQLCHAR *)statement, (SQLINTEGER)len);
+ CHECK_ERROR(handle, "SQLExecDirect", rc, SQL_HANDLE_STMT, hstmt);
+ }
+ if (SQL_SUCCEEDED(rc)) {
+ rc = odbc_create_results(handle, hstmt, pool, random, res);
+ apr_pool_cleanup_register(pool, *res,
+ odbc_close_results, apr_pool_cleanup_null);
+ }
+ return APR_FROM_SQL_RESULT(rc);
+}
+
+/** num_cols: get the number of columns in a results set **/
+static int odbc_num_cols(apr_dbd_results_t *res)
+{
+ return res->ncols;
+}
+
+/** num_tuples: get the number of rows in a results set **/
+static int odbc_num_tuples(apr_dbd_results_t *res)
+{
+ SQLRETURN rc;
+ SQLLEN nrows;
+
+ rc = SQLRowCount(res->stmt, &nrows);
+ CHECK_ERROR(res->apr_dbd, "SQLRowCount", rc, SQL_HANDLE_STMT, res->stmt);
+ return SQL_SUCCEEDED(rc) ? (int)nrows : -1;
+}
+
+/** get_row: get a row from a result set **/
+static int odbc_get_row(apr_pool_t *pool, apr_dbd_results_t *res,
+ apr_dbd_row_t **row, int rownum)
+{
+ SQLRETURN rc;
+ char *fetchtype;
+ int c;
+
+ *row = apr_pcalloc(pool, sizeof(apr_dbd_row_t));
+ (*row)->stmt = res->stmt;
+ (*row)->dbc = res->dbc;
+ (*row)->res = res;
+ (*row)->pool = res->pool;
+
+ /* mark all the columns as needing SQLGetData unless they are bound */
+ for (c = 0; c < res->ncols; c++) {
+ if (res->colstate[c] != COL_BOUND) {
+ res->colstate[c] = COL_AVAIL;
+ }
+ /* some drivers do not null-term zero-len CHAR data */
+ if (res->colptrs[c])
+ *(char *)res->colptrs[c] = 0;
+ }
+
+ if (res->random && (rownum > 0)) {
+ fetchtype = "SQLFetchScroll";
+ rc = SQLFetchScroll(res->stmt, SQL_FETCH_ABSOLUTE, rownum);
+ }
+ else {
+ fetchtype = "SQLFetch";
+ rc = SQLFetch(res->stmt);
+ }
+ CHECK_ERROR(res->apr_dbd, fetchtype, rc, SQL_HANDLE_STMT, res->stmt);
+ (*row)->stmt = res->stmt;
+ if (!SQL_SUCCEEDED(rc) && !res->random) {
+ /* early close on any error (usually SQL_NO_DATA) if fetching
+ * sequentially to release resources ASAP
+ */
+ odbc_close_results(res);
+ return -1;
+ }
+ return SQL_SUCCEEDED(rc) ? 0 : -1;
+}
+
+/** datum_get: get a binary entry from a row **/
+static apr_status_t odbc_datum_get(const apr_dbd_row_t *row, int col,
+ apr_dbd_type_e dbdtype, void *data)
+{
+ SQLSMALLINT sqltype;
+ void *p;
+ int len;
+
+ if (col >= row->res->ncols)
+ return APR_EGENERAL;
+
+ if (dbdtype < 0 || dbdtype >= NUM_APR_DBD_TYPES) {
+ data = NULL; /* invalid type */
+ return APR_EGENERAL;
+ }
+
+ len = sqlSizes[dbdtype];
+ sqltype = sqlCtype[dbdtype];
+
+ /* must not memcpy a brigade, sentinals are relative to orig loc */
+ if (IS_LOB(sqltype))
+ return odbc_create_bucket(row, col, sqltype, data);
+
+ p = odbc_get(row, col, sqltype);
+ if (p == (void *)-1)
+ return APR_EGENERAL;
+
+ if (p == NULL)
+ return APR_ENOENT; /* SQL NULL value */
+
+ if (len < 0)
+ *(char**)data = (char *)p;
+ else
+ memcpy(data, p, len);
+
+ return APR_SUCCESS;
+
+}
+
+/** get_entry: get an entry from a row (string data) **/
+static const char *odbc_get_entry(const apr_dbd_row_t *row, int col)
+{
+ void *p;
+
+ if (col >= row->res->ncols)
+ return NULL;
+
+ p = odbc_get(row, col, SQL_C_CHAR);
+
+ /* NULL or invalid (-1) */
+ if (p == NULL || p == (void *)-1)
+ return p;
+ else
+ return apr_pstrdup(row->pool, p);
+}
+
+/** error: get current error message (if any) **/
+static const char *odbc_error(apr_dbd_t *handle, int errnum)
+{
+ return (handle) ? handle->lastError : "[dbd_odbc]No error message available";
+}
+
+/** escape: escape a string so it is safe for use in query/select **/
+static const char *odbc_escape(apr_pool_t *pool, const char *s,
+ apr_dbd_t *handle)
+{
+ char *newstr, *src, *dst, *sq;
+ int qcount;
+
+ /* return the original if there are no single-quotes */
+ if (!(sq = strchr(s, '\'')))
+ return (char *)s;
+ /* count the single-quotes and allocate a new buffer */
+ for (qcount = 1; (sq = strchr(sq + 1, '\'')); )
+ qcount++;
+ newstr = apr_palloc(pool, strlen(s) + qcount + 1);
+
+ /* move chars, doubling all single-quotes */
+ src = (char *)s;
+ for (dst = newstr; *src; src++) {
+ if ((*dst++ = *src) == '\'')
+ *dst++ = '\'';
+ }
+ *dst = 0;
+ return newstr;
+}
+
+/** prepare: prepare a statement **/
+static int odbc_prepare(apr_pool_t *pool, apr_dbd_t *handle,
+ const char *query, const char *label, int nargs,
+ int nvals, apr_dbd_type_e *types,
+ apr_dbd_prepared_t **statement)
+{
+ SQLRETURN rc;
+ size_t len = strlen(query);
+
+ if (odbc_check_rollback(handle))
+ return APR_EGENERAL;
+
+ *statement = apr_pcalloc(pool, sizeof(apr_dbd_prepared_t));
+ (*statement)->dbc = handle->dbc;
+ (*statement)->apr_dbd = handle;
+ (*statement)->nargs = nargs;
+ (*statement)->nvals = nvals;
+ (*statement)->types =
+ apr_pmemdup(pool, types, nargs * sizeof(apr_dbd_type_e));
+ rc = SQLAllocHandle(SQL_HANDLE_STMT, handle->dbc, &((*statement)->stmt));
+ apr_pool_cleanup_register(pool, *statement,
+ odbc_close_pstmt, apr_pool_cleanup_null);
+ CHECK_ERROR(handle, "SQLAllocHandle (STMT)", rc,
+ SQL_HANDLE_DBC, handle->dbc);
+ rc = SQLPrepare((*statement)->stmt, (SQLCHAR *)query, (SQLINTEGER)len);
+ CHECK_ERROR(handle, "SQLPrepare", rc, SQL_HANDLE_STMT,
+ (*statement)->stmt);
+ return APR_FROM_SQL_RESULT(rc);
+}
+
+/** pquery: query using a prepared statement + args **/
+static int odbc_pquery(apr_pool_t *pool, apr_dbd_t *handle, int *nrows,
+ apr_dbd_prepared_t *statement, const char **args)
+{
+ SQLRETURN rc = SQL_SUCCESS;
+ int i, argp;
+
+ if (odbc_check_rollback(handle))
+ return APR_EGENERAL;
+
+ for (i = argp = 0; i < statement->nargs && SQL_SUCCEEDED(rc); i++) {
+ rc = odbc_bind_param(pool, statement, i + 1, statement->types[i],
+ &argp, (const void **)args, TEXTMODE);
+ }
+ if (SQL_SUCCEEDED(rc)) {
+ rc = SQLExecute(statement->stmt);
+ CHECK_ERROR(handle, "SQLExecute", rc, SQL_HANDLE_STMT,
+ statement->stmt);
+ }
+ if (SQL_SUCCEEDED(rc)) {
+ SQLLEN rowcount;
+
+ rc = SQLRowCount(statement->stmt, &rowcount);
+ *nrows = (int)rowcount;
+ CHECK_ERROR(handle, "SQLRowCount", rc, SQL_HANDLE_STMT,
+ statement->stmt);
+ }
+ return APR_FROM_SQL_RESULT(rc);
+}
+
+/** pvquery: query using a prepared statement + args **/
+static int odbc_pvquery(apr_pool_t *pool, apr_dbd_t *handle, int *nrows,
+ apr_dbd_prepared_t *statement, va_list args)
+{
+ const char **values;
+ int i;
+
+ values = apr_palloc(pool, sizeof(*values) * statement->nvals);
+ for (i = 0; i < statement->nvals; i++)
+ values[i] = va_arg(args, const char *);
+ return odbc_pquery(pool, handle, nrows, statement, values);
+}
+
+/** pselect: select using a prepared statement + args **/
+static int odbc_pselect(apr_pool_t *pool, apr_dbd_t *handle,
+ apr_dbd_results_t **res, apr_dbd_prepared_t *statement,
+ int random, const char **args)
+{
+ SQLRETURN rc = SQL_SUCCESS;
+ int i, argp;
+
+ if (odbc_check_rollback(handle))
+ return APR_EGENERAL;
+
+ if (random) {
+ rc = SQLSetStmtAttr(statement->stmt, SQL_ATTR_CURSOR_SCROLLABLE,
+ (SQLPOINTER)SQL_SCROLLABLE, 0);
+ CHECK_ERROR(handle, "SQLSetStmtAttr (SQL_ATTR_CURSOR_SCROLLABLE)",
+ rc, SQL_HANDLE_STMT, statement->stmt);
+ }
+ if (SQL_SUCCEEDED(rc)) {
+ for (i = argp = 0; i < statement->nargs && SQL_SUCCEEDED(rc); i++) {
+ rc = odbc_bind_param(pool, statement, i + 1, statement->types[i],
+ &argp, (const void **)args, TEXTMODE);
+ }
+ }
+ if (SQL_SUCCEEDED(rc)) {
+ rc = SQLExecute(statement->stmt);
+ CHECK_ERROR(handle, "SQLExecute", rc, SQL_HANDLE_STMT,
+ statement->stmt);
+ }
+ if (SQL_SUCCEEDED(rc)) {
+ rc = odbc_create_results(handle, statement->stmt, pool, random, res);
+ apr_pool_cleanup_register(pool, *res,
+ odbc_close_results, apr_pool_cleanup_null);
+ }
+ return APR_FROM_SQL_RESULT(rc);
+}
+
+/** pvselect: select using a prepared statement + args **/
+static int odbc_pvselect(apr_pool_t *pool, apr_dbd_t *handle,
+ apr_dbd_results_t **res,
+ apr_dbd_prepared_t *statement, int random,
+ va_list args)
+{
+ const char **values;
+ int i;
+
+ values = apr_palloc(pool, sizeof(*values) * statement->nvals);
+ for (i = 0; i < statement->nvals; i++)
+ values[i] = va_arg(args, const char *);
+ return odbc_pselect(pool, handle, res, statement, random, values);
+}
+
+/** get_name: get a column title from a result set **/
+static const char *odbc_get_name(const apr_dbd_results_t *res, int col)
+{
+ SQLRETURN rc;
+ char buffer[MAX_COLUMN_NAME];
+ SQLSMALLINT colnamelength, coltype, coldecimal, colnullable;
+ SQLULEN colsize;
+
+ if (col >= res->ncols)
+ return NULL; /* bogus column number */
+ if (res->colnames[col] != NULL)
+ return res->colnames[col]; /* we already retrieved it */
+ rc = SQLDescribeCol(res->stmt, col + 1,
+ (SQLCHAR *)buffer, sizeof(buffer), &colnamelength,
+ &coltype, &colsize, &coldecimal, &colnullable);
+ CHECK_ERROR(res->apr_dbd, "SQLDescribeCol", rc,
+ SQL_HANDLE_STMT, res->stmt);
+ res->colnames[col] = apr_pstrdup(res->pool, buffer);
+ return res->colnames[col];
+}
+
+/** transaction_mode_get: get the mode of transaction **/
+static int odbc_transaction_mode_get(apr_dbd_transaction_t *trans)
+{
+ return (int)trans->apr_dbd->can_commit;
+}
+
+/** transaction_mode_set: set the mode of transaction **/
+static int odbc_transaction_mode_set(apr_dbd_transaction_t *trans, int mode)
+{
+ int legal = ( APR_DBD_TRANSACTION_IGNORE_ERRORS
+ | APR_DBD_TRANSACTION_COMMIT
+ | APR_DBD_TRANSACTION_ROLLBACK);
+
+ if ((mode & legal) != mode)
+ return APR_EGENERAL;
+
+ trans->apr_dbd->can_commit = mode;
+ return APR_SUCCESS;
+}
+
+/** pbquery: query using a prepared statement + binary args **/
+static int odbc_pbquery(apr_pool_t *pool, apr_dbd_t *handle, int *nrows,
+ apr_dbd_prepared_t *statement, const void **args)
+{
+ SQLRETURN rc = SQL_SUCCESS;
+ int i, argp;
+
+ if (odbc_check_rollback(handle))
+ return APR_EGENERAL;
+
+ for (i = argp = 0; i < statement->nargs && SQL_SUCCEEDED(rc); i++)
+ rc = odbc_bind_param(pool, statement, i + 1, statement->types[i],
+ &argp, args, BINARYMODE);
+
+ if (SQL_SUCCEEDED(rc)) {
+ rc = SQLExecute(statement->stmt);
+ CHECK_ERROR(handle, "SQLExecute", rc, SQL_HANDLE_STMT,
+ statement->stmt);
+ }
+ if (SQL_SUCCEEDED(rc)) {
+ SQLLEN rowcount;
+
+ rc = SQLRowCount(statement->stmt, &rowcount);
+ *nrows = (int)rowcount;
+ CHECK_ERROR(handle, "SQLRowCount", rc, SQL_HANDLE_STMT,
+ statement->stmt);
+ }
+ return APR_FROM_SQL_RESULT(rc);
+}
+
+/** pbselect: select using a prepared statement + binary args **/
+static int odbc_pbselect(apr_pool_t *pool, apr_dbd_t *handle,
+ apr_dbd_results_t **res,
+ apr_dbd_prepared_t *statement,
+ int random, const void **args)
+{
+ SQLRETURN rc = SQL_SUCCESS;
+ int i, argp;
+
+ if (odbc_check_rollback(handle))
+ return APR_EGENERAL;
+
+ if (random) {
+ rc = SQLSetStmtAttr(statement->stmt, SQL_ATTR_CURSOR_SCROLLABLE,
+ (SQLPOINTER)SQL_SCROLLABLE, 0);
+ CHECK_ERROR(handle, "SQLSetStmtAttr (SQL_ATTR_CURSOR_SCROLLABLE)",
+ rc, SQL_HANDLE_STMT, statement->stmt);
+ }
+ if (SQL_SUCCEEDED(rc)) {
+ for (i = argp = 0; i < statement->nargs && SQL_SUCCEEDED(rc); i++) {
+ rc = odbc_bind_param(pool, statement, i + 1, statement->types[i],
+ &argp, args, BINARYMODE);
+ }
+ }
+ if (SQL_SUCCEEDED(rc)) {
+ rc = SQLExecute(statement->stmt);
+ CHECK_ERROR(handle, "SQLExecute", rc, SQL_HANDLE_STMT,
+ statement->stmt);
+ }
+ if (SQL_SUCCEEDED(rc)) {
+ rc = odbc_create_results(handle, statement->stmt, pool, random, res);
+ apr_pool_cleanup_register(pool, *res,
+ odbc_close_results, apr_pool_cleanup_null);
+ }
+
+ return APR_FROM_SQL_RESULT(rc);
+}
+
+/** pvbquery: query using a prepared statement + binary args **/
+static int odbc_pvbquery(apr_pool_t *pool, apr_dbd_t *handle, int *nrows,
+ apr_dbd_prepared_t *statement, va_list args)
+{
+ const char **values;
+ int i;
+
+ values = apr_palloc(pool, sizeof(*values) * statement->nvals);
+ for (i = 0; i < statement->nvals; i++)
+ values[i] = va_arg(args, const char *);
+ return odbc_pbquery(pool, handle, nrows, statement, (const void **)values);
+}
+
+/** pvbselect: select using a prepared statement + binary args **/
+static int odbc_pvbselect(apr_pool_t *pool, apr_dbd_t *handle,
+ apr_dbd_results_t **res,
+ apr_dbd_prepared_t *statement,
+ int random, va_list args)
+{
+ const char **values;
+ int i;
+
+ values = apr_palloc(pool, sizeof(*values) * statement->nvals);
+ for (i = 0; i < statement->nvals; i++)
+ values[i] = va_arg(args, const char *);
+ return odbc_pbselect(pool, handle, res, statement, random, (const void **)values);
+}
+
+APU_MODULE_DECLARE_DATA const apr_dbd_driver_t ODBC_DRIVER_ENTRY = {
+ ODBC_DRIVER_STRING,
+ odbc_init,
+ odbc_native_handle,
+ odbc_open,
+ odbc_check_conn,
+ odbc_close,
+ odbc_set_dbname,
+ odbc_start_transaction,
+ odbc_end_transaction,
+ odbc_query,
+ odbc_select,
+ odbc_num_cols,
+ odbc_num_tuples,
+ odbc_get_row,
+ odbc_get_entry,
+ odbc_error,
+ odbc_escape,
+ odbc_prepare,
+ odbc_pvquery,
+ odbc_pvselect,
+ odbc_pquery,
+ odbc_pselect,
+ odbc_get_name,
+ odbc_transaction_mode_get,
+ odbc_transaction_mode_set,
+ "?",
+ odbc_pvbquery,
+ odbc_pvbselect,
+ odbc_pbquery,
+ odbc_pbselect,
+ odbc_datum_get
+};
+
+#endif
diff --git a/contrib/apr-util/dbd/apr_dbd_oracle.c b/contrib/apr-util/dbd/apr_dbd_oracle.c
new file mode 100644
index 000000000000..e2e2e7eae7fa
--- /dev/null
+++ b/contrib/apr-util/dbd/apr_dbd_oracle.c
@@ -0,0 +1,2220 @@
+/* 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.
+ */
+
+/* Developed initially by Nick Kew and Chris Darroch.
+ * Contributed to the APR project by kind permission of
+ * Pearson Education Core Technology Group (CTG),
+ * formerly Central Media Group (CMG).
+ */
+
+/* apr_dbd_oracle - a painful attempt
+ *
+ * Based first on the documentation at
+ * http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96584/toc.htm
+ *
+ * Those docs have a lot of internal inconsistencies, contradictions, etc
+ * So I've snarfed the demo programs (from Oracle 8, not included in
+ * the current downloadable oracle), and used code from them.
+ *
+ * Why do cdemo81.c and cdemo82.c do the same thing in very different ways?
+ * e.g. cdemo82 releases all its handle on shutdown; cdemo81 doesn't
+ *
+ * All the ORA* functions return a "sword". Some of them are documented;
+ * others aren't. So I've adopted a policy of using switch statements
+ * everywhere, even when we're not doing anything with the return values.
+ *
+ * This makes no attempt at performance tuning, such as setting
+ * prefetch cache size. We need some actual performance data
+ * to make that meaningful. Input from someone with experience
+ * as a sysop using oracle would be a good start.
+ */
+
+/* shut compiler up */
+#ifdef DEBUG
+#define int_errorcode int errorcode
+#else
+#define int_errorcode
+#endif
+
+#include "apu.h"
+
+#if APU_HAVE_ORACLE
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <oci.h>
+
+#include "apr_strings.h"
+#include "apr_lib.h"
+#include "apr_time.h"
+#include "apr_hash.h"
+#include "apr_buckets.h"
+
+#define TRANS_TIMEOUT 30
+#define MAX_ARG_LEN 256 /* in line with other apr_dbd drivers. We alloc this
+ * lots of times, so a large value gets hungry.
+ * Should really make it configurable
+ */
+#define DEFAULT_LONG_SIZE 4096
+#define DBD_ORACLE_MAX_COLUMNS 256
+#define NUMERIC_FIELD_SIZE 32
+
+#define CHECK_CONN_QUERY "SELECT 1 FROM dual"
+
+#define ERR_BUF_SIZE 200
+
+#ifdef DEBUG
+#include <stdio.h>
+#endif
+
+#include "apr_dbd_internal.h"
+
+/* declarations */
+static const char *dbd_oracle_error(apr_dbd_t *sql, int n);
+static int dbd_oracle_prepare(apr_pool_t *pool, apr_dbd_t *sql,
+ const char *query, const char *label,
+ int nargs, int nvals, apr_dbd_type_e *types,
+ apr_dbd_prepared_t **statement);
+static int outputParams(apr_dbd_t*, apr_dbd_prepared_t*);
+static int dbd_oracle_pselect(apr_pool_t *pool, apr_dbd_t *sql,
+ apr_dbd_results_t **results,
+ apr_dbd_prepared_t *statement,
+ int seek, const char **values);
+static int dbd_oracle_pquery(apr_pool_t *pool, apr_dbd_t *sql,
+ int *nrows, apr_dbd_prepared_t *statement,
+ const char **values);
+static int dbd_oracle_start_transaction(apr_pool_t *pool, apr_dbd_t *sql,
+ apr_dbd_transaction_t **trans);
+static int dbd_oracle_end_transaction(apr_dbd_transaction_t *trans);
+
+struct apr_dbd_transaction_t {
+ int mode;
+ enum { TRANS_NONE, TRANS_ERROR, TRANS_1, TRANS_2 } status;
+ apr_dbd_t *handle;
+ OCITrans *trans;
+ OCISnapshot *snapshot1;
+ OCISnapshot *snapshot2;
+};
+
+struct apr_dbd_results_t {
+ apr_pool_t *pool;
+ apr_dbd_t* handle;
+ unsigned int rownum;
+ int seek;
+ int nrows;
+ apr_dbd_prepared_t *statement;
+};
+
+struct apr_dbd_t {
+ sword status;
+ OCIError *err;
+ OCIServer *svr;
+ OCISvcCtx *svc;
+ OCISession *auth;
+ apr_dbd_transaction_t* trans;
+ apr_pool_t *pool;
+ char buf[ERR_BUF_SIZE]; /* for error messages */
+ apr_size_t long_size;
+ apr_dbd_prepared_t *check_conn_stmt;
+};
+
+struct apr_dbd_row_t {
+ int n;
+ apr_dbd_results_t *res;
+ apr_pool_t *pool;
+};
+
+typedef struct {
+ apr_dbd_type_e type;
+ sb2 ind;
+ sb4 len;
+ OCIBind *bind;
+ union {
+ void *raw;
+ char *sval;
+ int ival;
+ unsigned int uval;
+ double fval;
+ OCILobLocator *lobval;
+ } value;
+} bind_arg;
+
+typedef struct {
+ int type;
+ sb2 ind;
+ ub2 len; /* length of actual output */
+ OCIDefine *defn;
+ apr_size_t sz; /* length of buf for output */
+ union {
+ void *raw;
+ char *sval;
+ OCILobLocator *lobval;
+ } buf;
+ const char *name;
+} define_arg;
+
+struct apr_dbd_prepared_t {
+ OCIStmt *stmt;
+ int nargs;
+ int nvals;
+ bind_arg *args;
+ int nout;
+ define_arg *out;
+ apr_dbd_t *handle;
+ apr_pool_t *pool;
+ ub2 type;
+};
+
+/* AFAICT from the docs, the OCIEnv thingey can be used async
+ * across threads, so lets have a global one.
+ *
+ * We'll need shorter-lived envs to deal with requests and connections
+ *
+ * Hmmm, that doesn't work: we don't have a usermem framework.
+ * OK, forget about using APR pools here, until we figure out
+ * the right way to do it (if such a thing exists).
+ */
+static OCIEnv *dbd_oracle_env = NULL;
+
+/* Oracle specific bucket for BLOB/CLOB types */
+typedef struct apr_bucket_lob apr_bucket_lob;
+/**
+ * A bucket referring to a Oracle BLOB/CLOB
+ */
+struct apr_bucket_lob {
+ /** Number of buckets using this memory */
+ apr_bucket_refcount refcount;
+ /** The row this bucket refers to */
+ const apr_dbd_row_t *row;
+ /** The column this bucket refers to */
+ int col;
+ /** The pool into which any needed structures should
+ * be created while reading from this bucket */
+ apr_pool_t *readpool;
+};
+
+static void lob_bucket_destroy(void *data);
+static apr_status_t lob_bucket_read(apr_bucket *e, const char **str,
+ apr_size_t *len, apr_read_type_e block);
+static apr_bucket *apr_bucket_lob_make(apr_bucket *b,
+ const apr_dbd_row_t *row, int col,
+ apr_off_t offset, apr_size_t len,
+ apr_pool_t *p);
+static apr_bucket *apr_bucket_lob_create(const apr_dbd_row_t *row, int col,
+ apr_off_t offset,
+ apr_size_t len, apr_pool_t *p,
+ apr_bucket_alloc_t *list);
+
+static const apr_bucket_type_t apr_bucket_type_lob = {
+ "LOB", 5, APR_BUCKET_DATA,
+ lob_bucket_destroy,
+ lob_bucket_read,
+ apr_bucket_setaside_notimpl,
+ apr_bucket_shared_split,
+ apr_bucket_shared_copy
+};
+
+static void lob_bucket_destroy(void *data)
+{
+ apr_bucket_lob *f = data;
+
+ if (apr_bucket_shared_destroy(f)) {
+ /* no need to destroy database objects here; it will get
+ * done automatically when the pool gets cleaned up */
+ apr_bucket_free(f);
+ }
+}
+
+static apr_status_t lob_bucket_read(apr_bucket *e, const char **str,
+ apr_size_t *len, apr_read_type_e block)
+{
+ apr_bucket_lob *a = e->data;
+ const apr_dbd_row_t *row = a->row;
+ apr_dbd_results_t *res = row->res;
+ int col = a->col;
+ apr_bucket *b = NULL;
+ apr_size_t blength = e->length; /* bytes remaining in file past offset */
+ apr_off_t boffset = e->start;
+ define_arg *val = &res->statement->out[col];
+ apr_dbd_t *sql = res->handle;
+/* Only with 10g, unfortunately
+ oraub8 length = APR_BUCKET_BUFF_SIZE;
+*/
+ ub4 length = APR_BUCKET_BUFF_SIZE;
+ char *buf = NULL;
+
+ *str = NULL; /* in case we die prematurely */
+
+ /* fetch from offset if not at the beginning */
+ buf = apr_palloc(row->pool, APR_BUCKET_BUFF_SIZE);
+ sql->status = OCILobRead(sql->svc, sql->err, val->buf.lobval,
+ &length, 1 + (size_t)boffset,
+ (dvoid*) buf, APR_BUCKET_BUFF_SIZE,
+ NULL, NULL, 0, SQLCS_IMPLICIT);
+/* Only with 10g, unfortunately
+ sql->status = OCILobRead2(sql->svc, sql->err, val->buf.lobval,
+ &length, NULL, 1 + boffset,
+ (dvoid*) buf, APR_BUCKET_BUFF_SIZE,
+ OCI_ONE_PIECE, NULL, NULL, 0, SQLCS_IMPLICIT);
+*/
+ if (sql->status != OCI_SUCCESS) {
+ return APR_EGENERAL;
+ }
+ blength -= length;
+ *len = length;
+ *str = buf;
+
+ /*
+ * Change the current bucket to refer to what we read,
+ * even if we read nothing because we hit EOF.
+ */
+ apr_bucket_pool_make(e, *str, *len, res->pool);
+
+ /* If we have more to read from the field, then create another bucket */
+ if (blength > 0) {
+ /* for efficiency, we can just build a new apr_bucket struct
+ * to wrap around the existing LOB bucket */
+ b = apr_bucket_alloc(sizeof(*b), e->list);
+ b->start = boffset + *len;
+ b->length = blength;
+ b->data = a;
+ b->type = &apr_bucket_type_lob;
+ b->free = apr_bucket_free;
+ b->list = e->list;
+ APR_BUCKET_INSERT_AFTER(e, b);
+ }
+ else {
+ lob_bucket_destroy(a);
+ }
+
+ return APR_SUCCESS;
+}
+
+static apr_bucket *apr_bucket_lob_make(apr_bucket *b,
+ const apr_dbd_row_t *row, int col,
+ apr_off_t offset, apr_size_t len,
+ apr_pool_t *p)
+{
+ apr_bucket_lob *f;
+
+ f = apr_bucket_alloc(sizeof(*f), b->list);
+ f->row = row;
+ f->col = col;
+ f->readpool = p;
+
+ b = apr_bucket_shared_make(b, f, offset, len);
+ b->type = &apr_bucket_type_lob;
+
+ return b;
+}
+
+static apr_bucket *apr_bucket_lob_create(const apr_dbd_row_t *row, int col,
+ apr_off_t offset,
+ apr_size_t len, apr_pool_t *p,
+ apr_bucket_alloc_t *list)
+{
+ apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
+
+ APR_BUCKET_INIT(b);
+ b->free = apr_bucket_free;
+ b->list = list;
+ return apr_bucket_lob_make(b, row, col, offset, len, p);
+}
+
+static apr_status_t dbd_free_lobdesc(void *lob)
+{
+ switch (OCIDescriptorFree(lob, OCI_DTYPE_LOB)) {
+ case OCI_SUCCESS:
+ return APR_SUCCESS;
+ default:
+ return APR_EGENERAL;
+ }
+}
+
+static apr_status_t dbd_free_snapshot(void *snap)
+{
+ switch (OCIDescriptorFree(snap, OCI_DTYPE_SNAP)) {
+ case OCI_SUCCESS:
+ return APR_SUCCESS;
+ default:
+ return APR_EGENERAL;
+ }
+}
+
+static void dbd_oracle_init(apr_pool_t *pool)
+{
+ if (dbd_oracle_env == NULL) {
+ /* Sadly, OCI_SHARED seems to be impossible to use, due to
+ * various Oracle bugs. See, for example, Oracle MetaLink bug 2972890
+ * and PHP bug http://bugs.php.net/bug.php?id=23733
+ */
+#ifdef OCI_NEW_LENGTH_SEMANTICS
+ OCIEnvCreate(&dbd_oracle_env, OCI_THREADED|OCI_NEW_LENGTH_SEMANTICS,
+ NULL, NULL, NULL, NULL, 0, NULL);
+#else
+ OCIEnvCreate(&dbd_oracle_env, OCI_THREADED,
+ NULL, NULL, NULL, NULL, 0, NULL);
+#endif
+ }
+}
+
+static apr_dbd_t *dbd_oracle_open(apr_pool_t *pool, const char *params,
+ const char **error)
+{
+ apr_dbd_t *ret = apr_pcalloc(pool, sizeof(apr_dbd_t));
+ int errorcode;
+
+ char *BLANK = "";
+ struct {
+ const char *field;
+ char *value;
+ } fields[] = {
+ {"user", BLANK},
+ {"pass", BLANK},
+ {"dbname", BLANK},
+ {"server", BLANK},
+ {NULL, NULL}
+ };
+ int i;
+ const char *ptr;
+ const char *key;
+ size_t klen;
+ const char *value;
+ size_t vlen;
+ static const char *const delims = " \r\n\t;|,";
+
+ ret->pool = pool;
+ ret->long_size = DEFAULT_LONG_SIZE;
+
+ /* snitch parsing from the MySQL driver */
+ for (ptr = strchr(params, '='); ptr; ptr = strchr(ptr, '=')) {
+ /* don't dereference memory that may not belong to us */
+ if (ptr == params) {
+ ++ptr;
+ continue;
+ }
+ for (key = ptr-1; apr_isspace(*key); --key);
+ klen = 0;
+ while (apr_isalpha(*key)) {
+ if (key == params) {
+ /* Don't parse off the front of the params */
+ --key;
+ ++klen;
+ break;
+ }
+ --key;
+ ++klen;
+ }
+ ++key;
+ for (value = ptr+1; apr_isspace(*value); ++value);
+ vlen = strcspn(value, delims);
+ for (i=0; fields[i].field != NULL; ++i) {
+ if (!strncasecmp(fields[i].field, key, klen)) {
+ fields[i].value = apr_pstrndup(pool, value, vlen);
+ break;
+ }
+ }
+ ptr = value+vlen;
+ }
+
+ ret->status = OCIHandleAlloc(dbd_oracle_env, (dvoid**)&ret->err,
+ OCI_HTYPE_ERROR, 0, NULL);
+ switch (ret->status) {
+ default:
+#ifdef DEBUG
+ printf("ret->status is %d\n", ret->status);
+ break;
+#else
+ return NULL;
+#endif
+ case OCI_SUCCESS:
+ break;
+ }
+
+ ret->status = OCIHandleAlloc(dbd_oracle_env, (dvoid**)&ret->svr,
+ OCI_HTYPE_SERVER, 0, NULL);
+ switch (ret->status) {
+ default:
+#ifdef DEBUG
+ OCIErrorGet(ret->err, 1, NULL, &errorcode, ret->buf,
+ sizeof(ret->buf), OCI_HTYPE_ERROR);
+ printf("OPEN ERROR %d (alloc svr): %s\n", ret->status, ret->buf);
+ break;
+#else
+ if (error) {
+ *error = apr_pcalloc(pool, ERR_BUF_SIZE);
+ OCIErrorGet(ret->err, 1, NULL, &errorcode, (unsigned char*)(*error),
+ ERR_BUF_SIZE, OCI_HTYPE_ERROR);
+ }
+ return NULL;
+#endif
+ case OCI_SUCCESS:
+ break;
+ }
+
+ ret->status = OCIHandleAlloc(dbd_oracle_env, (dvoid**)&ret->svc,
+ OCI_HTYPE_SVCCTX, 0, NULL);
+ switch (ret->status) {
+ default:
+#ifdef DEBUG
+ OCIErrorGet(ret->err, 1, NULL, &errorcode, ret->buf,
+ sizeof(ret->buf), OCI_HTYPE_ERROR);
+ printf("OPEN ERROR %d (alloc svc): %s\n", ret->status, ret->buf);
+ break;
+#else
+ if (error) {
+ *error = apr_pcalloc(pool, ERR_BUF_SIZE);
+ OCIErrorGet(ret->err, 1, NULL, &errorcode, (unsigned char*)(*error),
+ ERR_BUF_SIZE, OCI_HTYPE_ERROR);
+ }
+ return NULL;
+#endif
+ case OCI_SUCCESS:
+ break;
+ }
+
+/* All the examples use the #else */
+#if CAN_DO_LOGIN
+ ret->status = OCILogon(dbd_oracle_env, ret->err, &ret->svc, fields[0].value,
+ strlen(fields[0].value), fields[1].value,
+ strlen(fields[1].value), fields[2].value,
+ strlen(fields[2].value));
+ switch (ret->status) {
+ default:
+#ifdef DEBUG
+ OCIErrorGet(ret->err, 1, NULL, &errorcode, ret->buf,
+ sizeof(ret->buf), OCI_HTYPE_ERROR);
+ printf("OPEN ERROR: %s\n", ret->buf);
+ break;
+#else
+ if (error) {
+ *error = apr_pcalloc(pool, ERR_BUF_SIZE);
+ OCIErrorGet(ret->err, 1, NULL, &errorcode, (unsigned char*)(*error),
+ ERR_BUF_SIZE, OCI_HTYPE_ERROR);
+ }
+ return NULL;
+#endif
+ case OCI_SUCCESS:
+ break;
+ }
+#else
+ ret->status = OCIServerAttach(ret->svr, ret->err, (text*) fields[3].value,
+ strlen(fields[3].value), OCI_DEFAULT);
+ switch (ret->status) {
+ default:
+#ifdef DEBUG
+ OCIErrorGet(ret->err, 1, NULL, &errorcode, ret->buf,
+ sizeof(ret->buf), OCI_HTYPE_ERROR);
+ printf("OPEN ERROR %d (server attach): %s\n", ret->status, ret->buf);
+ break;
+#else
+ if (error) {
+ *error = apr_pcalloc(pool, ERR_BUF_SIZE);
+ OCIErrorGet(ret->err, 1, NULL, &errorcode, (unsigned char*)(*error),
+ ERR_BUF_SIZE, OCI_HTYPE_ERROR);
+ }
+ return NULL;
+#endif
+ case OCI_SUCCESS:
+ break;
+ }
+ ret->status = OCIAttrSet(ret->svc, OCI_HTYPE_SVCCTX, ret->svr, 0,
+ OCI_ATTR_SERVER, ret->err);
+ switch (ret->status) {
+ default:
+#ifdef DEBUG
+ OCIErrorGet(ret->err, 1, NULL, &errorcode, ret->buf,
+ sizeof(ret->buf), OCI_HTYPE_ERROR);
+ printf("OPEN ERROR %d (attr set): %s\n", ret->status, ret->buf);
+ break;
+#else
+ if (error) {
+ *error = apr_pcalloc(pool, ERR_BUF_SIZE);
+ OCIErrorGet(ret->err, 1, NULL, &errorcode, (unsigned char*)(*error),
+ ERR_BUF_SIZE, OCI_HTYPE_ERROR);
+ }
+ return NULL;
+#endif
+ case OCI_SUCCESS:
+ break;
+ }
+ ret->status = OCIHandleAlloc(dbd_oracle_env, (dvoid**)&ret->auth,
+ OCI_HTYPE_SESSION, 0, NULL);
+ switch (ret->status) {
+ default:
+#ifdef DEBUG
+ OCIErrorGet(ret->err, 1, NULL, &errorcode, ret->buf,
+ sizeof(ret->buf), OCI_HTYPE_ERROR);
+ printf("OPEN ERROR %d (alloc auth): %s\n", ret->status, ret->buf);
+ break;
+#else
+ if (error) {
+ *error = apr_pcalloc(pool, ERR_BUF_SIZE);
+ OCIErrorGet(ret->err, 1, NULL, &errorcode, (unsigned char*)(*error),
+ ERR_BUF_SIZE, OCI_HTYPE_ERROR);
+ }
+ return NULL;
+#endif
+ case OCI_SUCCESS:
+ break;
+ }
+ ret->status = OCIAttrSet(ret->auth, OCI_HTYPE_SESSION, fields[0].value,
+ strlen(fields[0].value), OCI_ATTR_USERNAME, ret->err);
+ switch (ret->status) {
+ default:
+#ifdef DEBUG
+ OCIErrorGet(ret->err, 1, NULL, &errorcode, ret->buf,
+ sizeof(ret->buf), OCI_HTYPE_ERROR);
+ printf("OPEN ERROR %d (attr username): %s\n", ret->status, ret->buf);
+ break;
+#else
+ if (error) {
+ *error = apr_pcalloc(pool, ERR_BUF_SIZE);
+ OCIErrorGet(ret->err, 1, NULL, &errorcode, (unsigned char*)(*error),
+ ERR_BUF_SIZE, OCI_HTYPE_ERROR);
+ }
+ return NULL;
+#endif
+ case OCI_SUCCESS:
+ break;
+ }
+ ret->status = OCIAttrSet(ret->auth, OCI_HTYPE_SESSION, fields[1].value,
+ strlen(fields[1].value), OCI_ATTR_PASSWORD, ret->err);
+ switch (ret->status) {
+ default:
+#ifdef DEBUG
+ OCIErrorGet(ret->err, 1, NULL, &errorcode, ret->buf,
+ sizeof(ret->buf), OCI_HTYPE_ERROR);
+ printf("OPEN ERROR %d (attr password): %s\n", ret->status, ret->buf);
+ break;
+#else
+ if (error) {
+ *error = apr_pcalloc(pool, ERR_BUF_SIZE);
+ OCIErrorGet(ret->err, 1, NULL, &errorcode, (unsigned char*)(*error),
+ ERR_BUF_SIZE, OCI_HTYPE_ERROR);
+ }
+ return NULL;
+#endif
+ case OCI_SUCCESS:
+ break;
+ }
+ ret->status = OCISessionBegin(ret->svc, ret->err, ret->auth,
+ OCI_CRED_RDBMS, OCI_DEFAULT);
+ switch (ret->status) {
+ default:
+#ifdef DEBUG
+ OCIErrorGet(ret->err, 1, NULL, &errorcode, ret->buf,
+ sizeof(ret->buf), OCI_HTYPE_ERROR);
+ printf("OPEN ERROR %d (session begin): %s\n", ret->status, ret->buf);
+ break;
+#else
+ if (error) {
+ *error = apr_pcalloc(pool, ERR_BUF_SIZE);
+ OCIErrorGet(ret->err, 1, NULL, &errorcode, (unsigned char*)(*error),
+ ERR_BUF_SIZE, OCI_HTYPE_ERROR);
+ }
+ return NULL;
+#endif
+ case OCI_SUCCESS:
+ break;
+ }
+ ret->status = OCIAttrSet(ret->svc, OCI_HTYPE_SVCCTX, ret->auth, 0,
+ OCI_ATTR_SESSION, ret->err);
+ switch (ret->status) {
+ default:
+#ifdef DEBUG
+ OCIErrorGet(ret->err, 1, NULL, &errorcode, ret->buf,
+ sizeof(ret->buf), OCI_HTYPE_ERROR);
+ printf("OPEN ERROR %d (attr session): %s\n", ret->status, ret->buf);
+#else
+ if (error) {
+ *error = apr_pcalloc(pool, ERR_BUF_SIZE);
+ OCIErrorGet(ret->err, 1, NULL, &errorcode, (unsigned char*)(*error),
+ ERR_BUF_SIZE, OCI_HTYPE_ERROR);
+ }
+ return NULL;
+#endif
+ break;
+ case OCI_SUCCESS:
+ break;
+ }
+#endif
+
+ if(dbd_oracle_prepare(pool, ret, CHECK_CONN_QUERY, NULL, 0, 0, NULL,
+ &ret->check_conn_stmt) != 0) {
+ return NULL;
+ }
+
+ return ret;
+}
+
+#ifdef EXPORT_NATIVE_FUNCS
+static apr_size_t dbd_oracle_long_size_set(apr_dbd_t *sql,
+ apr_size_t long_size)
+{
+ apr_size_t old_size = sql->long_size;
+ sql->long_size = long_size;
+ return old_size;
+}
+#endif
+
+static const char *dbd_oracle_get_name(const apr_dbd_results_t *res, int n)
+{
+ define_arg *val = &res->statement->out[n];
+
+ if ((n < 0) || (n >= res->statement->nout)) {
+ return NULL;
+ }
+ return val->name;
+}
+
+static int dbd_oracle_get_row(apr_pool_t *pool, apr_dbd_results_t *res,
+ apr_dbd_row_t **rowp, int rownum)
+{
+ apr_dbd_row_t *row = *rowp;
+ apr_dbd_t *sql = res->handle;
+ int_errorcode;
+
+ if (row == NULL) {
+ row = apr_palloc(pool, sizeof(apr_dbd_row_t));
+ *rowp = row;
+ row->res = res;
+ /* Oracle starts counting at 1 according to the docs */
+ row->n = res->seek ? rownum : 1;
+ row->pool = pool;
+ }
+ else {
+ if (res->seek) {
+ row->n = rownum;
+ }
+ else {
+ ++row->n;
+ }
+ }
+
+ if (res->seek) {
+ sql->status = OCIStmtFetch2(res->statement->stmt, res->handle->err, 1,
+ OCI_FETCH_ABSOLUTE, row->n, OCI_DEFAULT);
+ }
+ else {
+ sql->status = OCIStmtFetch2(res->statement->stmt, res->handle->err, 1,
+ OCI_FETCH_NEXT, 0, OCI_DEFAULT);
+ }
+ switch (sql->status) {
+ case OCI_SUCCESS:
+ (*rowp)->res = res;
+ return 0;
+ case OCI_NO_DATA:
+ return -1;
+ case OCI_ERROR:
+#ifdef DEBUG
+ OCIErrorGet(sql->err, 1, NULL, &errorcode,
+ sql->buf, sizeof(sql->buf), OCI_HTYPE_ERROR);
+ printf("Execute error %d: %s\n", sql->status, sql->buf);
+#endif
+ /* fallthrough */
+ default:
+ return 1;
+ }
+ return 0;
+}
+
+static const char *dbd_oracle_error(apr_dbd_t *sql, int n)
+{
+ /* This is ugly. Needs us to pass in a buffer of unknown size.
+ * Either we put it on the handle, or we have to keep allocing/copying
+ */
+ sb4 errorcode;
+
+ switch (sql->status) {
+ case OCI_SUCCESS:
+ return "OCI_SUCCESS";
+ case OCI_SUCCESS_WITH_INFO:
+ return "OCI_SUCCESS_WITH_INFO";
+ case OCI_NEED_DATA:
+ return "OCI_NEED_DATA";
+ case OCI_NO_DATA:
+ return "OCI_NO_DATA";
+ case OCI_INVALID_HANDLE:
+ return "OCI_INVALID_HANDLE";
+ case OCI_STILL_EXECUTING:
+ return "OCI_STILL_EXECUTING";
+ case OCI_CONTINUE:
+ return "OCI_CONTINUE";
+ }
+
+ switch (OCIErrorGet(sql->err, 1, NULL, &errorcode,
+ (text*) sql->buf, sizeof(sql->buf), OCI_HTYPE_ERROR)) {
+ case OCI_SUCCESS:
+ return sql->buf;
+ default:
+ return "internal error: OCIErrorGet failed";
+ }
+}
+
+static apr_status_t freeStatement(void *statement)
+{
+ int rv = APR_SUCCESS;
+ OCIStmt *stmt = ((apr_dbd_prepared_t*)statement)->stmt;
+
+#ifdef PREPARE2
+ OCIError *err;
+
+ if (OCIHandleAlloc(dbd_oracle_env, (dvoid**)&err, OCI_HTYPE_ERROR,
+ 0, NULL) != OCI_SUCCESS) {
+ return APR_EGENERAL;
+ }
+ if (OCIStmtRelease(stmt, err, NULL, 0, OCI_DEFAULT) != OCI_SUCCESS) {
+ rv = APR_EGENERAL;
+ }
+ if (OCIHandleFree(err, OCI_HTYPE_ERROR) != OCI_SUCCESS) {
+ rv = APR_EGENERAL;
+ }
+#else
+ if (OCIHandleFree(stmt, OCI_HTYPE_STMT) != OCI_SUCCESS) {
+ rv = APR_EGENERAL;
+ }
+#endif
+
+ return rv;
+}
+
+static int dbd_oracle_select(apr_pool_t *pool, apr_dbd_t *sql,
+ apr_dbd_results_t **results,
+ const char *query, int seek)
+{
+ int ret = 0;
+ apr_dbd_prepared_t *statement = NULL;
+
+ ret = dbd_oracle_prepare(pool, sql, query, NULL, 0, 0, NULL, &statement);
+ if (ret != 0) {
+ return ret;
+ }
+
+ ret = dbd_oracle_pselect(pool, sql, results, statement, seek, NULL);
+ if (ret != 0) {
+ return ret;
+ }
+
+ return ret;
+}
+
+static int dbd_oracle_query(apr_dbd_t *sql, int *nrows, const char *query)
+{
+ int ret = 0;
+ apr_pool_t *pool;
+ apr_dbd_prepared_t *statement = NULL;
+
+ if (sql->trans && sql->trans->status == TRANS_ERROR) {
+ return 1;
+ }
+
+ /* make our own pool so that APR allocations don't linger and so that
+ * both Stmt and LOB handles are cleaned up (LOB handles may be
+ * allocated when preparing APR_DBD_TYPE_CLOB/BLOBs)
+ */
+ apr_pool_create(&pool, sql->pool);
+
+ ret = dbd_oracle_prepare(pool, sql, query, NULL, 0, 0, NULL, &statement);
+ if (ret == 0) {
+ ret = dbd_oracle_pquery(pool, sql, nrows, statement, NULL);
+ if (ret == 0) {
+ sql->status = OCIAttrGet(statement->stmt, OCI_HTYPE_STMT,
+ nrows, 0, OCI_ATTR_ROW_COUNT,
+ sql->err);
+ }
+ }
+
+ apr_pool_destroy(pool);
+
+ return ret;
+}
+
+static const char *dbd_oracle_escape(apr_pool_t *pool, const char *arg,
+ apr_dbd_t *sql)
+{
+ return arg; /* OCI has no concept of string escape */
+}
+
+static int dbd_oracle_prepare(apr_pool_t *pool, apr_dbd_t *sql,
+ const char *query, const char *label,
+ int nargs, int nvals, apr_dbd_type_e *types,
+ apr_dbd_prepared_t **statement)
+{
+ int ret = 0;
+ int i;
+ apr_dbd_prepared_t *stmt ;
+
+ if (*statement == NULL) {
+ *statement = apr_pcalloc(pool, sizeof(apr_dbd_prepared_t));
+ }
+ stmt = *statement;
+ stmt->handle = sql;
+ stmt->pool = pool;
+ stmt->nargs = nargs;
+ stmt->nvals = nvals;
+
+ /* populate our own args, if any */
+ if (nargs > 0) {
+ stmt->args = apr_pcalloc(pool, nargs*sizeof(bind_arg));
+ for (i = 0; i < nargs; i++) {
+ stmt->args[i].type = types[i];
+ }
+ }
+
+ sql->status = OCIHandleAlloc(dbd_oracle_env, (dvoid**) &stmt->stmt,
+ OCI_HTYPE_STMT, 0, NULL);
+ if (sql->status != OCI_SUCCESS) {
+ return 1;
+ }
+
+ sql->status = OCIStmtPrepare(stmt->stmt, sql->err, (text*) query,
+ strlen(query), OCI_NTV_SYNTAX, OCI_DEFAULT);
+ if (sql->status != OCI_SUCCESS) {
+ OCIHandleFree(stmt->stmt, OCI_HTYPE_STMT);
+ return 1;
+ }
+
+ apr_pool_cleanup_register(pool, stmt, freeStatement,
+ apr_pool_cleanup_null);
+
+ /* Perl gets statement type here */
+ sql->status = OCIAttrGet(stmt->stmt, OCI_HTYPE_STMT, &stmt->type, 0,
+ OCI_ATTR_STMT_TYPE, sql->err);
+ if (sql->status != OCI_SUCCESS) {
+ return 1;
+ }
+
+/* Perl sets PREFETCH_MEMORY here, but the docs say there's a working default */
+#if 0
+ sql->status = OCIAttrSet(stmt->stmt, OCI_HTYPE_STMT, &prefetch_size,
+ sizeof(prefetch_size), OCI_ATTR_PREFETCH_MEMORY,
+ sql->err);
+ if (sql->status != OCI_SUCCESS) {
+ return 1;
+ }
+#endif
+
+ if (stmt->type == OCI_STMT_SELECT) {
+ ret = outputParams(sql, stmt);
+ }
+ return ret;
+}
+
+static void dbd_oracle_bind(apr_dbd_prepared_t *statement, const char **values)
+{
+ OCIStmt *stmt = statement->stmt;
+ apr_dbd_t *sql = statement->handle;
+ int i, j;
+ sb2 null_ind = -1;
+
+ for (i = 0, j = 0; i < statement->nargs; i++, j++) {
+ if (values[j] == NULL) {
+ sql->status = OCIBindByPos(stmt, &statement->args[i].bind,
+ sql->err, i + 1,
+ NULL, 0, SQLT_STR,
+ &null_ind, NULL,
+ (ub2) 0, (ub4) 0,
+ (ub4 *) 0, OCI_DEFAULT);
+ }
+ else {
+ switch (statement->args[i].type) {
+ case APR_DBD_TYPE_BLOB:
+ {
+ char *data = (char *)values[j];
+ int size = atoi((char*)values[++j]);
+
+ /* skip table and column for now */
+ j += 2;
+
+ sql->status = OCIBindByPos(stmt, &statement->args[i].bind,
+ sql->err, i + 1,
+ data, size, SQLT_LBI,
+ &statement->args[i].ind,
+ NULL,
+ (ub2) 0, (ub4) 0,
+ (ub4 *) 0, OCI_DEFAULT);
+ }
+ break;
+ case APR_DBD_TYPE_CLOB:
+ {
+ char *data = (char *)values[j];
+ int size = atoi((char*)values[++j]);
+
+ /* skip table and column for now */
+ j += 2;
+
+ sql->status = OCIBindByPos(stmt, &statement->args[i].bind,
+ sql->err, i + 1,
+ data, size, SQLT_LNG,
+ &statement->args[i].ind,
+ NULL,
+ (ub2) 0, (ub4) 0,
+ (ub4 *) 0, OCI_DEFAULT);
+ }
+ break;
+ default:
+ sql->status = OCIBindByPos(stmt, &statement->args[i].bind,
+ sql->err, i + 1,
+ (dvoid*) values[j],
+ strlen(values[j]) + 1,
+ SQLT_STR,
+ &statement->args[i].ind,
+ NULL,
+ (ub2) 0, (ub4) 0,
+ (ub4 *) 0, OCI_DEFAULT);
+ break;
+ }
+ }
+
+ if (sql->status != OCI_SUCCESS) {
+ return;
+ }
+ }
+
+ return;
+}
+
+static int outputParams(apr_dbd_t *sql, apr_dbd_prepared_t *stmt)
+{
+ OCIParam *parms;
+ int i;
+ ub2 paramtype[DBD_ORACLE_MAX_COLUMNS];
+ ub2 paramsize[DBD_ORACLE_MAX_COLUMNS];
+ char *paramname[DBD_ORACLE_MAX_COLUMNS];
+ ub4 paramnamelen[DBD_ORACLE_MAX_COLUMNS];
+ int_errorcode;
+
+ /* Perl uses 0 where we used 1 */
+ sql->status = OCIStmtExecute(sql->svc, stmt->stmt, sql->err, 0, 0,
+ NULL, NULL, OCI_DESCRIBE_ONLY);
+ switch (sql->status) {
+ case OCI_SUCCESS:
+ case OCI_SUCCESS_WITH_INFO:
+ break;
+ case OCI_ERROR:
+#ifdef DEBUG
+ OCIErrorGet(sql->err, 1, NULL, &errorcode,
+ sql->buf, sizeof(sql->buf), OCI_HTYPE_ERROR);
+ printf("Describing prepared statement: %s\n", sql->buf);
+#endif
+ default:
+ return 1;
+ }
+ while (sql->status == OCI_SUCCESS) {
+ sql->status = OCIParamGet(stmt->stmt, OCI_HTYPE_STMT,
+ sql->err, (dvoid**)&parms, stmt->nout+1);
+ switch (sql->status) {
+ case OCI_SUCCESS:
+ sql->status = OCIAttrGet(parms, OCI_DTYPE_PARAM,
+ &paramtype[stmt->nout],
+ 0, OCI_ATTR_DATA_TYPE, sql->err);
+ sql->status = OCIAttrGet(parms, OCI_DTYPE_PARAM,
+ &paramsize[stmt->nout],
+ 0, OCI_ATTR_DATA_SIZE, sql->err);
+ sql->status = OCIAttrGet(parms, OCI_DTYPE_PARAM,
+ &paramname[stmt->nout],
+ &paramnamelen[stmt->nout],
+ OCI_ATTR_NAME, sql->err);
+ ++stmt->nout;
+ }
+ }
+ switch (sql->status) {
+ case OCI_SUCCESS:
+ break;
+ case OCI_ERROR:
+ break; /* this is what we expect at end-of-loop */
+ default:
+ return 1;
+ }
+
+ /* OK, the above works. We have the params; now OCIDefine them */
+ stmt->out = apr_palloc(stmt->pool, stmt->nout*sizeof(define_arg));
+ for (i=0; i<stmt->nout; ++i) {
+ stmt->out[i].type = paramtype[i];
+ stmt->out[i].len = stmt->out[i].sz = paramsize[i];
+ stmt->out[i].name = apr_pstrmemdup(stmt->pool,
+ paramname[i], paramnamelen[i]);
+ switch (stmt->out[i].type) {
+ default:
+ switch (stmt->out[i].type) {
+ case SQLT_NUM: /* 2: numeric, Perl worst case=130+38+3 */
+ stmt->out[i].sz = 171;
+ break;
+ case SQLT_CHR: /* 1: char */
+ case SQLT_AFC: /* 96: ANSI fixed char */
+ stmt->out[i].sz *= 4; /* ugh, wasteful UCS-4 handling */
+ break;
+ case SQLT_DAT: /* 12: date, depends on NLS date format */
+ stmt->out[i].sz = 75;
+ break;
+ case SQLT_BIN: /* 23: raw binary, perhaps UTF-16? */
+ stmt->out[i].sz *= 2;
+ break;
+ case SQLT_RID: /* 11: rowid */
+ case SQLT_RDD: /* 104: rowid descriptor */
+ stmt->out[i].sz = 20;
+ break;
+ case SQLT_TIMESTAMP: /* 187: timestamp */
+ case SQLT_TIMESTAMP_TZ: /* 188: timestamp with time zone */
+ case SQLT_INTERVAL_YM: /* 189: interval year-to-month */
+ case SQLT_INTERVAL_DS: /* 190: interval day-to-second */
+ case SQLT_TIMESTAMP_LTZ: /* 232: timestamp with local time zone */
+ stmt->out[i].sz = 75;
+ break;
+ default:
+#ifdef DEBUG
+ printf("Unsupported data type: %d\n", stmt->out[i].type);
+#endif
+ break;
+ }
+ ++stmt->out[i].sz;
+ stmt->out[i].buf.raw = apr_palloc(stmt->pool, stmt->out[i].sz);
+ sql->status = OCIDefineByPos(stmt->stmt, &stmt->out[i].defn,
+ sql->err, i+1,
+ stmt->out[i].buf.sval,
+ stmt->out[i].sz, SQLT_STR,
+ &stmt->out[i].ind, &stmt->out[i].len,
+ 0, OCI_DEFAULT);
+ break;
+ case SQLT_LNG: /* 8: long */
+ stmt->out[i].sz = sql->long_size * 4 + 4; /* ugh, UCS-4 handling */
+ stmt->out[i].buf.raw = apr_palloc(stmt->pool, stmt->out[i].sz);
+ sql->status = OCIDefineByPos(stmt->stmt, &stmt->out[i].defn,
+ sql->err, i+1,
+ stmt->out[i].buf.raw,
+ stmt->out[i].sz, SQLT_LVC,
+ &stmt->out[i].ind, NULL,
+ 0, OCI_DEFAULT);
+ break;
+ case SQLT_LBI: /* 24: long binary, perhaps UTF-16? */
+ stmt->out[i].sz = sql->long_size * 2 + 4; /* room for int prefix */
+ stmt->out[i].buf.raw = apr_palloc(stmt->pool, stmt->out[i].sz);
+ sql->status = OCIDefineByPos(stmt->stmt, &stmt->out[i].defn,
+ sql->err, i+1,
+ stmt->out[i].buf.raw,
+ stmt->out[i].sz, SQLT_LVB,
+ &stmt->out[i].ind, NULL,
+ 0, OCI_DEFAULT);
+ break;
+ case SQLT_BLOB: /* 113 */
+ case SQLT_CLOB: /* 112 */
+/*http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96584/oci05bnd.htm#434937*/
+ sql->status = OCIDescriptorAlloc(dbd_oracle_env,
+ (dvoid**)&stmt->out[i].buf.lobval,
+ OCI_DTYPE_LOB, 0, NULL);
+ apr_pool_cleanup_register(stmt->pool, stmt->out[i].buf.lobval,
+ dbd_free_lobdesc,
+ apr_pool_cleanup_null);
+ sql->status = OCIDefineByPos(stmt->stmt, &stmt->out[i].defn,
+ sql->err, i+1,
+ (dvoid*) &stmt->out[i].buf.lobval,
+ -1, stmt->out[i].type,
+ &stmt->out[i].ind, &stmt->out[i].len,
+ 0, OCI_DEFAULT);
+ break;
+ }
+ switch (sql->status) {
+ case OCI_SUCCESS:
+ break;
+ default:
+ return 1;
+ }
+ }
+ return 0;
+}
+
+static int dbd_oracle_pquery(apr_pool_t *pool, apr_dbd_t *sql,
+ int *nrows, apr_dbd_prepared_t *statement,
+ const char **values)
+{
+ OCISnapshot *oldsnapshot = NULL;
+ OCISnapshot *newsnapshot = NULL;
+ apr_dbd_transaction_t* trans = sql->trans;
+ int exec_mode;
+ int_errorcode;
+
+ if (trans) {
+ switch (trans->status) {
+ case TRANS_ERROR:
+ return -1;
+ case TRANS_NONE:
+ trans = NULL;
+ break;
+ case TRANS_1:
+ oldsnapshot = trans->snapshot1;
+ newsnapshot = trans->snapshot2;
+ trans->status = TRANS_2;
+ break;
+ case TRANS_2:
+ oldsnapshot = trans->snapshot2;
+ newsnapshot = trans->snapshot1;
+ trans->status = TRANS_1;
+ break;
+ }
+ exec_mode = OCI_DEFAULT;
+ }
+ else {
+ exec_mode = OCI_COMMIT_ON_SUCCESS;
+ }
+
+ dbd_oracle_bind(statement, values);
+
+ sql->status = OCIStmtExecute(sql->svc, statement->stmt, sql->err, 1, 0,
+ oldsnapshot, newsnapshot, exec_mode);
+ switch (sql->status) {
+ case OCI_SUCCESS:
+ break;
+ case OCI_ERROR:
+#ifdef DEBUG
+ OCIErrorGet(sql->err, 1, NULL, &errorcode,
+ sql->buf, sizeof(sql->buf), OCI_HTYPE_ERROR);
+ printf("Execute error %d: %s\n", sql->status, sql->buf);
+#endif
+ /* fallthrough */
+ default:
+ if (TXN_NOTICE_ERRORS(trans)) {
+ trans->status = TRANS_ERROR;
+ }
+ return 1;
+ }
+
+ sql->status = OCIAttrGet(statement->stmt, OCI_HTYPE_STMT, nrows, 0,
+ OCI_ATTR_ROW_COUNT, sql->err);
+ return 0;
+}
+
+static int dbd_oracle_pvquery(apr_pool_t *pool, apr_dbd_t *sql,
+ int *nrows, apr_dbd_prepared_t *statement,
+ va_list args)
+{
+ const char **values;
+ int i;
+
+ if (sql->trans && sql->trans->status == TRANS_ERROR) {
+ return -1;
+ }
+
+ values = apr_palloc(pool, sizeof(*values) * statement->nvals);
+
+ for (i = 0; i < statement->nvals; i++) {
+ values[i] = va_arg(args, const char*);
+ }
+
+ return dbd_oracle_pquery(pool, sql, nrows, statement, values);
+}
+
+static int dbd_oracle_pselect(apr_pool_t *pool, apr_dbd_t *sql,
+ apr_dbd_results_t **results,
+ apr_dbd_prepared_t *statement,
+ int seek, const char **values)
+{
+ int exec_mode = seek ? OCI_STMT_SCROLLABLE_READONLY : OCI_DEFAULT;
+ OCISnapshot *oldsnapshot = NULL;
+ OCISnapshot *newsnapshot = NULL;
+ apr_dbd_transaction_t* trans = sql->trans;
+ int_errorcode;
+
+ if (trans) {
+ switch (trans->status) {
+ case TRANS_ERROR:
+ return 1;
+ case TRANS_NONE:
+ trans = NULL;
+ break;
+ case TRANS_1:
+ oldsnapshot = trans->snapshot1;
+ newsnapshot = trans->snapshot2;
+ trans->status = TRANS_2;
+ break;
+ case TRANS_2:
+ oldsnapshot = trans->snapshot2;
+ newsnapshot = trans->snapshot1;
+ trans->status = TRANS_1;
+ break;
+ }
+ }
+
+ dbd_oracle_bind(statement, values);
+
+ sql->status = OCIStmtExecute(sql->svc, statement->stmt, sql->err, 0, 0,
+ oldsnapshot, newsnapshot, exec_mode);
+ switch (sql->status) {
+ case OCI_SUCCESS:
+ break;
+ case OCI_ERROR:
+#ifdef DEBUG
+ OCIErrorGet(sql->err, 1, NULL, &errorcode,
+ sql->buf, sizeof(sql->buf), OCI_HTYPE_ERROR);
+ printf("Executing prepared statement: %s\n", sql->buf);
+#endif
+ /* fallthrough */
+ default:
+ if (TXN_NOTICE_ERRORS(trans)) {
+ trans->status = TRANS_ERROR;
+ }
+ return 1;
+ }
+
+ if (!*results) {
+ *results = apr_palloc(pool, sizeof(apr_dbd_results_t));
+ }
+ (*results)->handle = sql;
+ (*results)->statement = statement;
+ (*results)->seek = seek;
+ (*results)->rownum = seek ? 0 : -1;
+ (*results)->pool = pool;
+
+ return 0;
+}
+
+static int dbd_oracle_pvselect(apr_pool_t *pool, apr_dbd_t *sql,
+ apr_dbd_results_t **results,
+ apr_dbd_prepared_t *statement,
+ int seek, va_list args)
+{
+ const char **values;
+ int i;
+
+ if (sql->trans && sql->trans->status == TRANS_ERROR) {
+ return -1;
+ }
+
+ values = apr_palloc(pool, sizeof(*values) * statement->nvals);
+
+ for (i = 0; i < statement->nvals; i++) {
+ values[i] = va_arg(args, const char*);
+ }
+
+ return dbd_oracle_pselect(pool, sql, results, statement, seek, values);
+}
+
+static void dbd_oracle_bbind(apr_dbd_prepared_t * statement,
+ const void **values)
+{
+ OCIStmt *stmt = statement->stmt;
+ apr_dbd_t *sql = statement->handle;
+ int i, j;
+ sb2 null_ind = -1;
+ apr_dbd_type_e type;
+
+ for (i = 0, j = 0; i < statement->nargs; i++, j++) {
+ type = (values[j] == NULL ? APR_DBD_TYPE_NULL
+ : statement->args[i].type);
+
+ switch (type) {
+ case APR_DBD_TYPE_TINY:
+ statement->args[i].value.ival = *(char*)values[j];
+ sql->status = OCIBindByPos(stmt, &statement->args[i].bind,
+ sql->err, i + 1,
+ &statement->args[i].value.ival,
+ sizeof(statement->args[i].value.ival),
+ SQLT_INT,
+ &statement->args[i].ind, NULL,
+ (ub2) 0, (ub4) 0,
+ (ub4 *) 0, OCI_DEFAULT);
+ break;
+ case APR_DBD_TYPE_UTINY:
+ statement->args[i].value.uval = *(unsigned char*)values[j];
+ sql->status = OCIBindByPos(stmt, &statement->args[i].bind,
+ sql->err, i + 1,
+ &statement->args[i].value.uval,
+ sizeof(statement->args[i].value.uval),
+ SQLT_UIN,
+ &statement->args[i].ind, NULL,
+ (ub2) 0, (ub4) 0,
+ (ub4 *) 0, OCI_DEFAULT);
+ break;
+ case APR_DBD_TYPE_SHORT:
+ statement->args[i].value.ival = *(short*)values[j];
+ sql->status = OCIBindByPos(stmt, &statement->args[i].bind,
+ sql->err, i + 1,
+ &statement->args[i].value.ival,
+ sizeof(statement->args[i].value.ival),
+ SQLT_INT,
+ &statement->args[i].ind, NULL,
+ (ub2) 0, (ub4) 0,
+ (ub4 *) 0, OCI_DEFAULT);
+ break;
+ case APR_DBD_TYPE_USHORT:
+ statement->args[i].value.uval = *(unsigned short*)values[j];
+ sql->status = OCIBindByPos(stmt, &statement->args[i].bind,
+ sql->err, i + 1,
+ &statement->args[i].value.uval,
+ sizeof(statement->args[i].value.uval),
+ SQLT_UIN,
+ &statement->args[i].ind, NULL,
+ (ub2) 0, (ub4) 0,
+ (ub4 *) 0, OCI_DEFAULT);
+ break;
+ case APR_DBD_TYPE_INT:
+ statement->args[i].value.ival = *(int*)values[j];
+ sql->status = OCIBindByPos(stmt, &statement->args[i].bind,
+ sql->err, i + 1,
+ &statement->args[i].value.ival,
+ sizeof(statement->args[i].value.ival),
+ SQLT_INT,
+ &statement->args[i].ind, NULL,
+ (ub2) 0, (ub4) 0,
+ (ub4 *) 0, OCI_DEFAULT);
+ break;
+ case APR_DBD_TYPE_UINT:
+ statement->args[i].value.uval = *(unsigned int*)values[j];
+ sql->status = OCIBindByPos(stmt, &statement->args[i].bind,
+ sql->err, i + 1,
+ &statement->args[i].value.uval,
+ sizeof(statement->args[i].value.uval),
+ SQLT_UIN,
+ &statement->args[i].ind, NULL,
+ (ub2) 0, (ub4) 0,
+ (ub4 *) 0, OCI_DEFAULT);
+ break;
+ case APR_DBD_TYPE_LONG:
+ statement->args[i].value.sval =
+ apr_psprintf(statement->pool, "%ld", *(long*)values[j]);
+ sql->status = OCIBindByPos(stmt, &statement->args[i].bind,
+ sql->err, i + 1,
+ statement->args[i].value.sval,
+ strlen(statement->args[i].value.sval)+1,
+ SQLT_STR,
+ &statement->args[i].ind, NULL,
+ (ub2) 0, (ub4) 0,
+ (ub4 *) 0, OCI_DEFAULT);
+ break;
+ case APR_DBD_TYPE_ULONG:
+ statement->args[i].value.sval =
+ apr_psprintf(statement->pool, "%lu",
+ *(unsigned long*)values[j]);
+ sql->status = OCIBindByPos(stmt, &statement->args[i].bind,
+ sql->err, i + 1,
+ statement->args[i].value.sval,
+ strlen(statement->args[i].value.sval)+1,
+ SQLT_STR,
+ &statement->args[i].ind, NULL,
+ (ub2) 0, (ub4) 0,
+ (ub4 *) 0, OCI_DEFAULT);
+ break;
+ case APR_DBD_TYPE_LONGLONG:
+ statement->args[i].value.sval =
+ apr_psprintf(statement->pool, "%" APR_INT64_T_FMT,
+ *(apr_int64_t*)values[j]);
+ sql->status = OCIBindByPos(stmt, &statement->args[i].bind,
+ sql->err, i + 1,
+ statement->args[i].value.sval,
+ strlen(statement->args[i].value.sval)+1,
+ SQLT_STR,
+ &statement->args[i].ind, NULL,
+ (ub2) 0, (ub4) 0,
+ (ub4 *) 0, OCI_DEFAULT);
+ break;
+ case APR_DBD_TYPE_ULONGLONG:
+ statement->args[i].value.sval =
+ apr_psprintf(statement->pool, "%" APR_UINT64_T_FMT,
+ *(apr_uint64_t*)values[j]);
+ sql->status = OCIBindByPos(stmt, &statement->args[i].bind,
+ sql->err, i + 1,
+ statement->args[i].value.sval,
+ strlen(statement->args[i].value.sval)+1,
+ SQLT_UIN,
+ &statement->args[i].ind, NULL,
+ (ub2) 0, (ub4) 0,
+ (ub4 *) 0, OCI_DEFAULT);
+ break;
+ case APR_DBD_TYPE_FLOAT:
+ statement->args[i].value.fval = *(float*)values[j];
+ sql->status = OCIBindByPos(stmt, &statement->args[i].bind,
+ sql->err, i + 1,
+ &statement->args[i].value.fval,
+ sizeof(statement->args[i].value.fval),
+ SQLT_FLT,
+ &statement->args[i].ind, NULL,
+ (ub2) 0, (ub4) 0,
+ (ub4 *) 0, OCI_DEFAULT);
+ break;
+ case APR_DBD_TYPE_DOUBLE:
+ statement->args[i].value.fval = *(double*)values[j];
+ sql->status = OCIBindByPos(stmt, &statement->args[i].bind,
+ sql->err, i + 1,
+ &statement->args[i].value.fval,
+ sizeof(statement->args[i].value.fval),
+ SQLT_FLT,
+ &statement->args[i].ind, NULL,
+ (ub2) 0, (ub4) 0,
+ (ub4 *) 0, OCI_DEFAULT);
+ break;
+ case APR_DBD_TYPE_STRING:
+ case APR_DBD_TYPE_TEXT:
+ case APR_DBD_TYPE_TIME:
+ case APR_DBD_TYPE_DATE:
+ case APR_DBD_TYPE_DATETIME:
+ case APR_DBD_TYPE_TIMESTAMP:
+ case APR_DBD_TYPE_ZTIMESTAMP:
+ sql->status = OCIBindByPos(stmt, &statement->args[i].bind,
+ sql->err, i + 1,
+ (dvoid*) values[j],
+ strlen(values[j]) + 1,
+ SQLT_STR,
+ &statement->args[i].ind, NULL,
+ (ub2) 0, (ub4) 0,
+ (ub4 *) 0, OCI_DEFAULT);
+ break;
+ case APR_DBD_TYPE_BLOB:
+ {
+ char *data = (char *)values[j];
+ apr_size_t size = *(apr_size_t*)values[++j];
+
+ /* skip table and column for now */
+ j += 2;
+
+ sql->status = OCIBindByPos(stmt, &statement->args[i].bind,
+ sql->err, i + 1,
+ data, size, SQLT_LBI,
+ &statement->args[i].ind,
+ NULL,
+ (ub2) 0, (ub4) 0,
+ (ub4 *) 0, OCI_DEFAULT);
+ }
+ break;
+ case APR_DBD_TYPE_CLOB:
+ {
+ char *data = (char *)values[j];
+ apr_size_t size = *(apr_size_t*)values[++j];
+
+ /* skip table and column for now */
+ j += 2;
+
+ sql->status = OCIBindByPos(stmt, &statement->args[i].bind,
+ sql->err, i + 1,
+ data, size, SQLT_LNG,
+ &statement->args[i].ind,
+ NULL,
+ (ub2) 0, (ub4) 0,
+ (ub4 *) 0, OCI_DEFAULT);
+ }
+ break;
+ case APR_DBD_TYPE_NULL:
+ default:
+ sql->status = OCIBindByPos(stmt, &statement->args[i].bind,
+ sql->err, i + 1,
+ NULL, 0, SQLT_STR,
+ &null_ind, NULL,
+ (ub2) 0, (ub4) 0,
+ (ub4 *) 0, OCI_DEFAULT);
+ break;
+ }
+
+ if (sql->status != OCI_SUCCESS) {
+ return;
+ }
+ }
+
+ return;
+}
+
+static int dbd_oracle_pbquery(apr_pool_t * pool, apr_dbd_t * sql,
+ int *nrows, apr_dbd_prepared_t * statement,
+ const void **values)
+{
+ OCISnapshot *oldsnapshot = NULL;
+ OCISnapshot *newsnapshot = NULL;
+ apr_dbd_transaction_t* trans = sql->trans;
+ int exec_mode;
+ int_errorcode;
+
+ if (trans) {
+ switch (trans->status) {
+ case TRANS_ERROR:
+ return -1;
+ case TRANS_NONE:
+ trans = NULL;
+ break;
+ case TRANS_1:
+ oldsnapshot = trans->snapshot1;
+ newsnapshot = trans->snapshot2;
+ trans->status = TRANS_2;
+ break;
+ case TRANS_2:
+ oldsnapshot = trans->snapshot2;
+ newsnapshot = trans->snapshot1;
+ trans->status = TRANS_1;
+ break;
+ }
+ exec_mode = OCI_DEFAULT;
+ }
+ else {
+ exec_mode = OCI_COMMIT_ON_SUCCESS;
+ }
+
+ dbd_oracle_bbind(statement, values);
+
+ sql->status = OCIStmtExecute(sql->svc, statement->stmt, sql->err, 1, 0,
+ oldsnapshot, newsnapshot, exec_mode);
+ switch (sql->status) {
+ case OCI_SUCCESS:
+ break;
+ case OCI_ERROR:
+#ifdef DEBUG
+ OCIErrorGet(sql->err, 1, NULL, &errorcode,
+ sql->buf, sizeof(sql->buf), OCI_HTYPE_ERROR);
+ printf("Execute error %d: %s\n", sql->status, sql->buf);
+#endif
+ /* fallthrough */
+ default:
+ if (TXN_NOTICE_ERRORS(trans)) {
+ trans->status = TRANS_ERROR;
+ }
+ return 1;
+ }
+
+ sql->status = OCIAttrGet(statement->stmt, OCI_HTYPE_STMT, nrows, 0,
+ OCI_ATTR_ROW_COUNT, sql->err);
+ return 0;
+}
+
+static int dbd_oracle_pvbquery(apr_pool_t * pool, apr_dbd_t * sql,
+ int *nrows, apr_dbd_prepared_t * statement,
+ va_list args)
+{
+ const void **values;
+ int i;
+
+ if (sql->trans && sql->trans->status == TRANS_ERROR) {
+ return -1;
+ }
+
+ values = apr_palloc(pool, sizeof(*values) * statement->nvals);
+
+ for (i = 0; i < statement->nvals; i++) {
+ values[i] = va_arg(args, const void*);
+ }
+
+ return dbd_oracle_pbquery(pool, sql, nrows, statement, values);
+}
+
+static int dbd_oracle_pbselect(apr_pool_t * pool, apr_dbd_t * sql,
+ apr_dbd_results_t ** results,
+ apr_dbd_prepared_t * statement,
+ int seek, const void **values)
+{
+ int exec_mode = seek ? OCI_STMT_SCROLLABLE_READONLY : OCI_DEFAULT;
+ OCISnapshot *oldsnapshot = NULL;
+ OCISnapshot *newsnapshot = NULL;
+ apr_dbd_transaction_t* trans = sql->trans;
+ int_errorcode;
+
+ if (trans) {
+ switch (trans->status) {
+ case TRANS_ERROR:
+ return 1;
+ case TRANS_NONE:
+ trans = NULL;
+ break;
+ case TRANS_1:
+ oldsnapshot = trans->snapshot1;
+ newsnapshot = trans->snapshot2;
+ trans->status = TRANS_2;
+ break;
+ case TRANS_2:
+ oldsnapshot = trans->snapshot2;
+ newsnapshot = trans->snapshot1;
+ trans->status = TRANS_1;
+ break;
+ }
+ }
+
+ dbd_oracle_bbind(statement, values);
+
+ sql->status = OCIStmtExecute(sql->svc, statement->stmt, sql->err, 0, 0,
+ oldsnapshot, newsnapshot, exec_mode);
+ switch (sql->status) {
+ case OCI_SUCCESS:
+ break;
+ case OCI_ERROR:
+#ifdef DEBUG
+ OCIErrorGet(sql->err, 1, NULL, &errorcode,
+ sql->buf, sizeof(sql->buf), OCI_HTYPE_ERROR);
+ printf("Executing prepared statement: %s\n", sql->buf);
+#endif
+ /* fallthrough */
+ default:
+ if (TXN_NOTICE_ERRORS(trans)) {
+ trans->status = TRANS_ERROR;
+ }
+ return 1;
+ }
+
+ if (!*results) {
+ *results = apr_palloc(pool, sizeof(apr_dbd_results_t));
+ }
+ (*results)->handle = sql;
+ (*results)->statement = statement;
+ (*results)->seek = seek;
+ (*results)->rownum = seek ? 0 : -1;
+ (*results)->pool = pool;
+
+ return 0;
+}
+
+static int dbd_oracle_pvbselect(apr_pool_t * pool, apr_dbd_t * sql,
+ apr_dbd_results_t ** results,
+ apr_dbd_prepared_t * statement, int seek,
+ va_list args)
+{
+ const void **values;
+ int i;
+
+ if (sql->trans && sql->trans->status == TRANS_ERROR) {
+ return -1;
+ }
+
+ values = apr_palloc(pool, sizeof(*values) * statement->nvals);
+
+ for (i = 0; i < statement->nvals; i++) {
+ values[i] = va_arg(args, const void*);
+ }
+
+ return dbd_oracle_pbselect(pool, sql, results, statement, seek, values);
+}
+
+static int dbd_oracle_start_transaction(apr_pool_t *pool, apr_dbd_t *sql,
+ apr_dbd_transaction_t **trans)
+{
+ int ret = 0;
+ int_errorcode;
+ if (*trans) {
+ dbd_oracle_end_transaction(*trans);
+ }
+ else {
+ *trans = apr_pcalloc(pool, sizeof(apr_dbd_transaction_t));
+ OCIHandleAlloc(dbd_oracle_env, (dvoid**)&(*trans)->trans,
+ OCI_HTYPE_TRANS, 0, 0);
+ OCIAttrSet(sql->svc, OCI_HTYPE_SVCCTX, (*trans)->trans, 0,
+ OCI_ATTR_TRANS, sql->err);
+ }
+
+
+ sql->status = OCITransStart(sql->svc, sql->err, TRANS_TIMEOUT,
+ OCI_TRANS_NEW);
+ switch (sql->status) {
+ case OCI_ERROR:
+#ifdef DEBUG
+ OCIErrorGet(sql->err, 1, NULL, &errorcode, sql->buf,
+ sizeof(sql->buf), OCI_HTYPE_ERROR);
+ printf("Transaction: %s\n", sql->buf);
+#endif
+ ret = 1;
+ break;
+ case OCI_SUCCESS:
+ (*trans)->handle = sql;
+ (*trans)->status = TRANS_1;
+ sql->trans = *trans;
+ switch (OCIDescriptorAlloc(dbd_oracle_env,
+ (dvoid**)&(*trans)->snapshot1,
+ OCI_DTYPE_SNAP, 0, NULL)) {
+ case OCI_SUCCESS:
+ apr_pool_cleanup_register(pool, (*trans)->snapshot1,
+ dbd_free_snapshot, apr_pool_cleanup_null);
+ break;
+ case OCI_INVALID_HANDLE:
+ ret = 1;
+ break;
+ }
+ switch (OCIDescriptorAlloc(dbd_oracle_env,
+ (dvoid**)&(*trans)->snapshot2,
+ OCI_DTYPE_SNAP, 0, NULL)) {
+ case OCI_SUCCESS:
+ apr_pool_cleanup_register(pool, (*trans)->snapshot2,
+ dbd_free_snapshot, apr_pool_cleanup_null);
+ break;
+ case OCI_INVALID_HANDLE:
+ ret = 1;
+ break;
+ }
+ break;
+ default:
+ ret = 1;
+ break;
+ }
+ return ret;
+}
+
+static int dbd_oracle_end_transaction(apr_dbd_transaction_t *trans)
+{
+ int ret = 1; /* no transaction is an error cond */
+ sword status;
+ apr_dbd_t *handle = trans->handle;
+ if (trans) {
+ switch (trans->status) {
+ case TRANS_NONE: /* No trans is an error here */
+ status = OCI_ERROR;
+ break;
+ case TRANS_ERROR:
+ status = OCITransRollback(handle->svc, handle->err, OCI_DEFAULT);
+ break;
+ default:
+ /* rollback on explicit rollback request */
+ if (TXN_DO_ROLLBACK(trans)) {
+ status = OCITransRollback(handle->svc, handle->err, OCI_DEFAULT);
+ } else {
+ status = OCITransCommit(handle->svc, handle->err, OCI_DEFAULT);
+ }
+ break;
+ }
+
+ handle->trans = NULL;
+
+ switch (status) {
+ case OCI_SUCCESS:
+ ret = 0;
+ break;
+ default:
+ ret = 3;
+ break;
+ }
+ }
+ return ret;
+}
+
+static int dbd_oracle_transaction_mode_get(apr_dbd_transaction_t *trans)
+{
+ if (!trans)
+ return APR_DBD_TRANSACTION_COMMIT;
+
+ return trans->mode;
+}
+
+static int dbd_oracle_transaction_mode_set(apr_dbd_transaction_t *trans,
+ int mode)
+{
+ if (!trans)
+ return APR_DBD_TRANSACTION_COMMIT;
+
+ return trans->mode = (mode & TXN_MODE_BITS);
+}
+
+/* This doesn't work for BLOB because of NULLs, but it can fake it
+ * if the BLOB is really a string
+ */
+static const char *dbd_oracle_get_entry(const apr_dbd_row_t *row, int n)
+{
+ ub4 len = 0;
+ ub1 csform = 0;
+ ub2 csid = 0;
+ apr_size_t buflen = 0;
+ char *buf = NULL;
+ define_arg *val = &row->res->statement->out[n];
+ apr_dbd_t *sql = row->res->handle;
+ int_errorcode;
+
+ if ((n < 0) || (n >= row->res->statement->nout) || (val->ind == -1)) {
+ return NULL;
+ }
+
+ switch (val->type) {
+ case SQLT_BLOB:
+ case SQLT_CLOB:
+ sql->status = OCILobGetLength(sql->svc, sql->err, val->buf.lobval,
+ &len);
+ switch (sql->status) {
+ case OCI_SUCCESS:
+ case OCI_SUCCESS_WITH_INFO:
+ if (len == 0) {
+ buf = "";
+ }
+ break;
+ case OCI_ERROR:
+#ifdef DEBUG
+ OCIErrorGet(sql->err, 1, NULL, &errorcode,
+ sql->buf, sizeof(sql->buf), OCI_HTYPE_ERROR);
+ printf("Finding LOB length: %s\n", sql->buf);
+ break;
+#endif
+ default:
+ break;
+ }
+
+ if (len == 0) {
+ break;
+ }
+
+ if (val->type == APR_DBD_TYPE_CLOB) {
+#if 1
+ /* Is this necessary, or can it be defaulted? */
+ sql->status = OCILobCharSetForm(dbd_oracle_env, sql->err,
+ val->buf.lobval, &csform);
+ if (sql->status == OCI_SUCCESS) {
+ sql->status = OCILobCharSetId(dbd_oracle_env, sql->err,
+ val->buf.lobval, &csid);
+ }
+ switch (sql->status) {
+ case OCI_SUCCESS:
+ case OCI_SUCCESS_WITH_INFO:
+ buflen = (len+1) * 4; /* ugh, wasteful UCS-4 handling */
+ /* zeroise all - where the string ends depends on charset */
+ buf = apr_pcalloc(row->pool, buflen);
+ break;
+#ifdef DEBUG
+ case OCI_ERROR:
+ OCIErrorGet(sql->err, 1, NULL, &errorcode,
+ sql->buf, sizeof(sql->buf), OCI_HTYPE_ERROR);
+ printf("Reading LOB character set: %s\n", sql->buf);
+ break; /*** XXX?? ***/
+#endif
+ default:
+ break; /*** XXX?? ***/
+ }
+#else /* ignore charset */
+ buflen = (len+1) * 4; /* ugh, wasteful UCS-4 handling */
+ /* zeroise all - where the string ends depends on charset */
+ buf = apr_pcalloc(row->pool, buflen);
+#endif
+ } else {
+ /* BUG: this'll only work if the BLOB looks like a string */
+ buflen = len;
+ buf = apr_palloc(row->pool, buflen+1);
+ buf[buflen] = 0;
+ }
+
+ if (!buf) {
+ break;
+ }
+
+ sql->status = OCILobRead(sql->svc, sql->err, val->buf.lobval,
+ &len, 1, (dvoid*) buf, buflen,
+ NULL, NULL, csid, csform);
+ switch (sql->status) {
+ case OCI_SUCCESS:
+ case OCI_SUCCESS_WITH_INFO:
+ break;
+#ifdef DEBUG
+ case OCI_ERROR:
+ OCIErrorGet(sql->err, 1, NULL, &errorcode,
+ sql->buf, sizeof(sql->buf), OCI_HTYPE_ERROR);
+ printf("Reading LOB: %s\n", sql->buf);
+ buf = NULL; /*** XXX?? ***/
+ break;
+#endif
+ default:
+ buf = NULL; /*** XXX?? ***/
+ break;
+ }
+
+ break;
+ case SQLT_LNG:
+ case SQLT_LBI:
+ /* raw is struct { ub4 len; char *buf; } */
+ len = *(ub4*) val->buf.raw;
+ buf = apr_pstrndup(row->pool, val->buf.sval + sizeof(ub4), len);
+ break;
+ default:
+ buf = apr_pstrndup(row->pool, val->buf.sval, val->len);
+ break;
+ }
+ return (const char*) buf;
+}
+
+/* XXX Should this use Oracle proper API instead of calling get_entry()? */
+static apr_status_t dbd_oracle_datum_get(const apr_dbd_row_t *row, int n,
+ apr_dbd_type_e type, void *data)
+{
+ define_arg *val = &row->res->statement->out[n];
+ const char *entry;
+
+ if ((n < 0) || (n >= row->res->statement->nout)) {
+ return APR_EGENERAL;
+ }
+
+ if(val->ind == -1) {
+ return APR_ENOENT;
+ }
+
+ switch (type) {
+ case APR_DBD_TYPE_TINY:
+ entry = dbd_oracle_get_entry(row, n);
+ if (entry == NULL) {
+ return APR_ENOENT;
+ }
+ *(char*)data = atoi(entry);
+ break;
+ case APR_DBD_TYPE_UTINY:
+ entry = dbd_oracle_get_entry(row, n);
+ if (entry == NULL) {
+ return APR_ENOENT;
+ }
+ *(unsigned char*)data = atoi(entry);
+ break;
+ case APR_DBD_TYPE_SHORT:
+ entry = dbd_oracle_get_entry(row, n);
+ if (entry == NULL) {
+ return APR_ENOENT;
+ }
+ *(short*)data = atoi(entry);
+ break;
+ case APR_DBD_TYPE_USHORT:
+ entry = dbd_oracle_get_entry(row, n);
+ if (entry == NULL) {
+ return APR_ENOENT;
+ }
+ *(unsigned short*)data = atoi(entry);
+ break;
+ case APR_DBD_TYPE_INT:
+ entry = dbd_oracle_get_entry(row, n);
+ if (entry == NULL) {
+ return APR_ENOENT;
+ }
+ *(int*)data = atoi(entry);
+ break;
+ case APR_DBD_TYPE_UINT:
+ entry = dbd_oracle_get_entry(row, n);
+ if (entry == NULL) {
+ return APR_ENOENT;
+ }
+ *(unsigned int*)data = atoi(entry);
+ break;
+ case APR_DBD_TYPE_LONG:
+ entry = dbd_oracle_get_entry(row, n);
+ if (entry == NULL) {
+ return APR_ENOENT;
+ }
+ *(long*)data = atol(entry);
+ break;
+ case APR_DBD_TYPE_ULONG:
+ entry = dbd_oracle_get_entry(row, n);
+ if (entry == NULL) {
+ return APR_ENOENT;
+ }
+ *(unsigned long*)data = atol(entry);
+ break;
+ case APR_DBD_TYPE_LONGLONG:
+ entry = dbd_oracle_get_entry(row, n);
+ if (entry == NULL) {
+ return APR_ENOENT;
+ }
+ *(apr_int64_t*)data = apr_atoi64(entry);
+ break;
+ case APR_DBD_TYPE_ULONGLONG:
+ entry = dbd_oracle_get_entry(row, n);
+ if (entry == NULL) {
+ return APR_ENOENT;
+ }
+ *(apr_uint64_t*)data = apr_atoi64(entry);
+ break;
+ case APR_DBD_TYPE_FLOAT:
+ entry = dbd_oracle_get_entry(row, n);
+ if (entry == NULL) {
+ return APR_ENOENT;
+ }
+ *(float*)data = (float)atof(entry);
+ break;
+ case APR_DBD_TYPE_DOUBLE:
+ entry = dbd_oracle_get_entry(row, n);
+ if (entry == NULL) {
+ return APR_ENOENT;
+ }
+ *(double*)data = atof(entry);
+ break;
+ case APR_DBD_TYPE_STRING:
+ case APR_DBD_TYPE_TEXT:
+ case APR_DBD_TYPE_TIME:
+ case APR_DBD_TYPE_DATE:
+ case APR_DBD_TYPE_DATETIME:
+ case APR_DBD_TYPE_TIMESTAMP:
+ case APR_DBD_TYPE_ZTIMESTAMP:
+ entry = dbd_oracle_get_entry(row, n);
+ if (entry == NULL) {
+ return APR_ENOENT;
+ }
+ *(char**)data = (char*)entry;
+ break;
+ case APR_DBD_TYPE_BLOB:
+ case APR_DBD_TYPE_CLOB:
+ {
+ apr_bucket *e;
+ apr_bucket_brigade *b = (apr_bucket_brigade*)data;
+ apr_dbd_t *sql = row->res->handle;
+ ub4 len = 0;
+
+ switch (val->type) {
+ case SQLT_BLOB:
+ case SQLT_CLOB:
+ sql->status = OCILobGetLength(sql->svc, sql->err,
+ val->buf.lobval, &len);
+ switch(sql->status) {
+ case OCI_SUCCESS:
+ case OCI_SUCCESS_WITH_INFO:
+ if (len == 0) {
+ e = apr_bucket_eos_create(b->bucket_alloc);
+ }
+ else {
+ e = apr_bucket_lob_create(row, n, 0, len,
+ row->pool, b->bucket_alloc);
+ }
+ break;
+ default:
+ return APR_ENOENT;
+ }
+ break;
+ default:
+ entry = dbd_oracle_get_entry(row, n);
+ if (entry == NULL) {
+ return APR_ENOENT;
+ }
+ e = apr_bucket_pool_create(entry, strlen(entry),
+ row->pool, b->bucket_alloc);
+ break;
+ }
+ APR_BRIGADE_INSERT_TAIL(b, e);
+ }
+ break;
+ case APR_DBD_TYPE_NULL:
+ *(void**)data = NULL;
+ break;
+ default:
+ return APR_EGENERAL;
+ }
+
+ return APR_SUCCESS;
+}
+
+static apr_status_t dbd_oracle_close(apr_dbd_t *handle)
+{
+ /* FIXME: none of the oracle docs/examples say anything about
+ * closing/releasing handles. Which seems unlikely ...
+ */
+
+ /* OK, let's grab from cdemo again.
+ * cdemo81 does nothing; cdemo82 does OCIHandleFree on the handles
+ */
+ switch (OCISessionEnd(handle->svc, handle->err, handle->auth,
+ (ub4)OCI_DEFAULT)) {
+ default:
+ break;
+ }
+ switch (OCIServerDetach(handle->svr, handle->err, (ub4) OCI_DEFAULT )) {
+ default:
+ break;
+ }
+ /* does OCISessionEnd imply this? */
+ switch (OCIHandleFree((dvoid *) handle->auth, (ub4) OCI_HTYPE_SESSION)) {
+ default:
+ break;
+ }
+ switch (OCIHandleFree((dvoid *) handle->svr, (ub4) OCI_HTYPE_SERVER)) {
+ default:
+ break;
+ }
+ switch (OCIHandleFree((dvoid *) handle->svc, (ub4) OCI_HTYPE_SVCCTX)) {
+ default:
+ break;
+ }
+ switch (OCIHandleFree((dvoid *) handle->err, (ub4) OCI_HTYPE_ERROR)) {
+ default:
+ break;
+ }
+ return APR_SUCCESS;
+}
+
+static apr_status_t dbd_oracle_check_conn(apr_pool_t *pool, apr_dbd_t *sql)
+{
+ apr_dbd_results_t *res = NULL;
+ apr_dbd_row_t *row = NULL;
+
+ if(dbd_oracle_pselect(pool, sql, &res, sql->check_conn_stmt,
+ 0, NULL) != 0) {
+ return APR_EGENERAL;
+ }
+
+ if(dbd_oracle_get_row(pool, res, &row, -1) != 0) {
+ return APR_EGENERAL;
+ }
+
+ if(dbd_oracle_get_row(pool, res, &row, -1) != -1) {
+ return APR_EGENERAL;
+ }
+
+ return APR_SUCCESS;
+}
+
+static int dbd_oracle_select_db(apr_pool_t *pool, apr_dbd_t *handle,
+ const char *name)
+{
+ /* FIXME: need to find this in the docs */
+ return APR_ENOTIMPL;
+}
+
+static void *dbd_oracle_native(apr_dbd_t *handle)
+{
+ /* FIXME: can we do anything better? Oracle doesn't seem to have
+ * a concept of a handle in the sense we use it.
+ */
+ return dbd_oracle_env;
+}
+
+static int dbd_oracle_num_cols(apr_dbd_results_t* res)
+{
+ return res->statement->nout;
+}
+
+static int dbd_oracle_num_tuples(apr_dbd_results_t* res)
+{
+ if (!res->seek) {
+ return -1;
+ }
+ if (res->nrows >= 0) {
+ return res->nrows;
+ }
+ res->handle->status = OCIAttrGet(res->statement->stmt, OCI_HTYPE_STMT,
+ &res->nrows, 0, OCI_ATTR_ROW_COUNT,
+ res->handle->err);
+ return res->nrows;
+}
+
+APU_MODULE_DECLARE_DATA const apr_dbd_driver_t apr_dbd_oracle_driver = {
+ "oracle",
+ dbd_oracle_init,
+ dbd_oracle_native,
+ dbd_oracle_open,
+ dbd_oracle_check_conn,
+ dbd_oracle_close,
+ dbd_oracle_select_db,
+ dbd_oracle_start_transaction,
+ dbd_oracle_end_transaction,
+ dbd_oracle_query,
+ dbd_oracle_select,
+ dbd_oracle_num_cols,
+ dbd_oracle_num_tuples,
+ dbd_oracle_get_row,
+ dbd_oracle_get_entry,
+ dbd_oracle_error,
+ dbd_oracle_escape,
+ dbd_oracle_prepare,
+ dbd_oracle_pvquery,
+ dbd_oracle_pvselect,
+ dbd_oracle_pquery,
+ dbd_oracle_pselect,
+ dbd_oracle_get_name,
+ dbd_oracle_transaction_mode_get,
+ dbd_oracle_transaction_mode_set,
+ ":apr%d",
+ dbd_oracle_pvbquery,
+ dbd_oracle_pvbselect,
+ dbd_oracle_pbquery,
+ dbd_oracle_pbselect,
+ dbd_oracle_datum_get
+};
+#endif
diff --git a/contrib/apr-util/dbd/apr_dbd_pgsql.c b/contrib/apr-util/dbd/apr_dbd_pgsql.c
new file mode 100644
index 000000000000..52c83ec99c10
--- /dev/null
+++ b/contrib/apr-util/dbd/apr_dbd_pgsql.c
@@ -0,0 +1,1315 @@
+/* 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 "apu.h"
+
+#if APU_HAVE_PGSQL
+
+#include "apu_config.h"
+
+#include <ctype.h>
+#include <stdlib.h>
+
+#ifdef HAVE_LIBPQ_FE_H
+#include <libpq-fe.h>
+#elif defined(HAVE_POSTGRESQL_LIBPQ_FE_H)
+#include <postgresql/libpq-fe.h>
+#endif
+
+#include "apr_strings.h"
+#include "apr_time.h"
+#include "apr_buckets.h"
+
+#include "apr_dbd_internal.h"
+
+struct apr_dbd_transaction_t {
+ int mode;
+ int errnum;
+ apr_dbd_t *handle;
+};
+
+struct apr_dbd_t {
+ PGconn *conn;
+ apr_dbd_transaction_t *trans;
+};
+
+struct apr_dbd_results_t {
+ int random;
+ PGconn *handle;
+ PGresult *res;
+ size_t ntuples;
+ size_t sz;
+ size_t index;
+ apr_pool_t *pool;
+};
+
+struct apr_dbd_row_t {
+ int n;
+ apr_dbd_results_t *res;
+};
+
+struct apr_dbd_prepared_t {
+ const char *name;
+ int prepared;
+ int nargs;
+ int nvals;
+ apr_dbd_type_e *types;
+};
+
+#define dbd_pgsql_is_success(x) (((x) == PGRES_EMPTY_QUERY) \
+ || ((x) == PGRES_COMMAND_OK) \
+ || ((x) == PGRES_TUPLES_OK))
+
+static apr_status_t clear_result(void *data)
+{
+ PQclear(data);
+ return APR_SUCCESS;
+}
+
+static int dbd_pgsql_select(apr_pool_t *pool, apr_dbd_t *sql,
+ apr_dbd_results_t **results,
+ const char *query, int seek)
+{
+ PGresult *res;
+ int ret;
+ if ( sql->trans && sql->trans->errnum ) {
+ return sql->trans->errnum;
+ }
+ if (seek) { /* synchronous query */
+ if (TXN_IGNORE_ERRORS(sql->trans)) {
+ PGresult *res = PQexec(sql->conn, "SAVEPOINT APR_DBD_TXN_SP");
+ if (res) {
+ int ret = PQresultStatus(res);
+ PQclear(res);
+ if (!dbd_pgsql_is_success(ret)) {
+ sql->trans->errnum = ret;
+ return PGRES_FATAL_ERROR;
+ }
+ } else {
+ return sql->trans->errnum = PGRES_FATAL_ERROR;
+ }
+ }
+ res = PQexec(sql->conn, query);
+ if (res) {
+ ret = PQresultStatus(res);
+ if (dbd_pgsql_is_success(ret)) {
+ ret = 0;
+ } else {
+ PQclear(res);
+ }
+ } else {
+ ret = PGRES_FATAL_ERROR;
+ }
+ if (ret != 0) {
+ if (TXN_IGNORE_ERRORS(sql->trans)) {
+ PGresult *res = PQexec(sql->conn,
+ "ROLLBACK TO SAVEPOINT APR_DBD_TXN_SP");
+ if (res) {
+ int ret = PQresultStatus(res);
+ PQclear(res);
+ if (!dbd_pgsql_is_success(ret)) {
+ sql->trans->errnum = ret;
+ return PGRES_FATAL_ERROR;
+ }
+ } else {
+ return sql->trans->errnum = PGRES_FATAL_ERROR;
+ }
+ } else if (TXN_NOTICE_ERRORS(sql->trans)){
+ sql->trans->errnum = ret;
+ }
+ return ret;
+ } else {
+ if (TXN_IGNORE_ERRORS(sql->trans)) {
+ PGresult *res = PQexec(sql->conn,
+ "RELEASE SAVEPOINT APR_DBD_TXN_SP");
+ if (res) {
+ int ret = PQresultStatus(res);
+ PQclear(res);
+ if (!dbd_pgsql_is_success(ret)) {
+ sql->trans->errnum = ret;
+ return PGRES_FATAL_ERROR;
+ }
+ } else {
+ return sql->trans->errnum = PGRES_FATAL_ERROR;
+ }
+ }
+ }
+ if (!*results) {
+ *results = apr_pcalloc(pool, sizeof(apr_dbd_results_t));
+ }
+ (*results)->res = res;
+ (*results)->ntuples = PQntuples(res);
+ (*results)->sz = PQnfields(res);
+ (*results)->random = seek;
+ (*results)->pool = pool;
+ apr_pool_cleanup_register(pool, res, clear_result,
+ apr_pool_cleanup_null);
+ }
+ else {
+ if (TXN_IGNORE_ERRORS(sql->trans)) {
+ PGresult *res = PQexec(sql->conn, "SAVEPOINT APR_DBD_TXN_SP");
+ if (res) {
+ int ret = PQresultStatus(res);
+ PQclear(res);
+ if (!dbd_pgsql_is_success(ret)) {
+ sql->trans->errnum = ret;
+ return PGRES_FATAL_ERROR;
+ }
+ } else {
+ return sql->trans->errnum = PGRES_FATAL_ERROR;
+ }
+ }
+ if (PQsendQuery(sql->conn, query) == 0) {
+ if (TXN_IGNORE_ERRORS(sql->trans)) {
+ PGresult *res = PQexec(sql->conn,
+ "ROLLBACK TO SAVEPOINT APR_DBD_TXN_SP");
+ if (res) {
+ int ret = PQresultStatus(res);
+ PQclear(res);
+ if (!dbd_pgsql_is_success(ret)) {
+ sql->trans->errnum = ret;
+ return PGRES_FATAL_ERROR;
+ }
+ } else {
+ return sql->trans->errnum = PGRES_FATAL_ERROR;
+ }
+ } else if (TXN_NOTICE_ERRORS(sql->trans)){
+ sql->trans->errnum = 1;
+ }
+ return 1;
+ } else {
+ if (TXN_IGNORE_ERRORS(sql->trans)) {
+ PGresult *res = PQexec(sql->conn,
+ "RELEASE SAVEPOINT APR_DBD_TXN_SP");
+ if (res) {
+ int ret = PQresultStatus(res);
+ PQclear(res);
+ if (!dbd_pgsql_is_success(ret)) {
+ sql->trans->errnum = ret;
+ return PGRES_FATAL_ERROR;
+ }
+ } else {
+ return sql->trans->errnum = PGRES_FATAL_ERROR;
+ }
+ }
+ }
+ if (*results == NULL) {
+ *results = apr_pcalloc(pool, sizeof(apr_dbd_results_t));
+ }
+ (*results)->random = seek;
+ (*results)->handle = sql->conn;
+ (*results)->pool = pool;
+ }
+ return 0;
+}
+
+static const char *dbd_pgsql_get_name(const apr_dbd_results_t *res, int n)
+{
+ if (res->res) {
+ if ((n>=0) && (PQnfields(res->res) > n)) {
+ return PQfname(res->res,n);
+ }
+ }
+ return NULL;
+}
+
+static int dbd_pgsql_get_row(apr_pool_t *pool, apr_dbd_results_t *res,
+ apr_dbd_row_t **rowp, int rownum)
+{
+ apr_dbd_row_t *row = *rowp;
+ int sequential = ((rownum >= 0) && res->random) ? 0 : 1;
+
+ if (row == NULL) {
+ row = apr_palloc(pool, sizeof(apr_dbd_row_t));
+ *rowp = row;
+ row->res = res;
+ if ( sequential ) {
+ row->n = 0;
+ }
+ else {
+ if (rownum > 0) {
+ row->n = --rownum;
+ }
+ else {
+ return -1; /* invalid row */
+ }
+ }
+ }
+ else {
+ if ( sequential ) {
+ ++row->n;
+ }
+ else {
+ if (rownum > 0) {
+ row->n = --rownum;
+ }
+ else {
+ return -1; /* invalid row */
+ }
+ }
+ }
+
+ if (res->random) {
+ if ((row->n >= 0) && (size_t)row->n >= res->ntuples) {
+ *rowp = NULL;
+ apr_pool_cleanup_run(res->pool, res->res, clear_result);
+ res->res = NULL;
+ return -1;
+ }
+ }
+ else {
+ if ((row->n >= 0) && (size_t)row->n >= res->ntuples) {
+ /* no data; we have to fetch some */
+ row->n -= res->ntuples;
+ if (res->res != NULL) {
+ PQclear(res->res);
+ }
+ res->res = PQgetResult(res->handle);
+ if (res->res) {
+ res->ntuples = PQntuples(res->res);
+ while (res->ntuples == 0) {
+ /* if we got an empty result, clear it, wait a mo, try
+ * again */
+ PQclear(res->res);
+ apr_sleep(100000); /* 0.1 secs */
+ res->res = PQgetResult(res->handle);
+ if (res->res) {
+ res->ntuples = PQntuples(res->res);
+ }
+ else {
+ return -1;
+ }
+ }
+ if (res->sz == 0) {
+ res->sz = PQnfields(res->res);
+ }
+ }
+ else {
+ return -1;
+ }
+ }
+ }
+ return 0;
+}
+
+static const char *dbd_pgsql_get_entry(const apr_dbd_row_t *row, int n)
+{
+ return PQgetvalue(row->res->res, row->n, n);
+}
+
+static apr_status_t dbd_pgsql_datum_get(const apr_dbd_row_t *row, int n,
+ apr_dbd_type_e type, void *data)
+{
+ if (PQgetisnull(row->res->res, row->n, n)) {
+ return APR_ENOENT;
+ }
+
+ switch (type) {
+ case APR_DBD_TYPE_TINY:
+ *(char*)data = atoi(PQgetvalue(row->res->res, row->n, n));
+ break;
+ case APR_DBD_TYPE_UTINY:
+ *(unsigned char*)data = atoi(PQgetvalue(row->res->res, row->n, n));
+ break;
+ case APR_DBD_TYPE_SHORT:
+ *(short*)data = atoi(PQgetvalue(row->res->res, row->n, n));
+ break;
+ case APR_DBD_TYPE_USHORT:
+ *(unsigned short*)data = atoi(PQgetvalue(row->res->res, row->n, n));
+ break;
+ case APR_DBD_TYPE_INT:
+ *(int*)data = atoi(PQgetvalue(row->res->res, row->n, n));
+ break;
+ case APR_DBD_TYPE_UINT:
+ *(unsigned int*)data = atoi(PQgetvalue(row->res->res, row->n, n));
+ break;
+ case APR_DBD_TYPE_LONG:
+ *(long*)data = atol(PQgetvalue(row->res->res, row->n, n));
+ break;
+ case APR_DBD_TYPE_ULONG:
+ *(unsigned long*)data = atol(PQgetvalue(row->res->res, row->n, n));
+ break;
+ case APR_DBD_TYPE_LONGLONG:
+ *(apr_int64_t*)data = apr_atoi64(PQgetvalue(row->res->res, row->n, n));
+ break;
+ case APR_DBD_TYPE_ULONGLONG:
+ *(apr_uint64_t*)data = apr_atoi64(PQgetvalue(row->res->res, row->n, n));
+ break;
+ case APR_DBD_TYPE_FLOAT:
+ *(float*)data = (float)atof(PQgetvalue(row->res->res, row->n, n));
+ break;
+ case APR_DBD_TYPE_DOUBLE:
+ *(double*)data = atof(PQgetvalue(row->res->res, row->n, n));
+ break;
+ case APR_DBD_TYPE_STRING:
+ case APR_DBD_TYPE_TEXT:
+ case APR_DBD_TYPE_TIME:
+ case APR_DBD_TYPE_DATE:
+ case APR_DBD_TYPE_DATETIME:
+ case APR_DBD_TYPE_TIMESTAMP:
+ case APR_DBD_TYPE_ZTIMESTAMP:
+ *(char**)data = PQgetvalue(row->res->res, row->n, n);
+ break;
+ case APR_DBD_TYPE_BLOB:
+ case APR_DBD_TYPE_CLOB:
+ {
+ apr_bucket *e;
+ apr_bucket_brigade *b = (apr_bucket_brigade*)data;
+
+ e = apr_bucket_pool_create(PQgetvalue(row->res->res, row->n, n),
+ PQgetlength(row->res->res, row->n, n),
+ row->res->pool, b->bucket_alloc);
+ APR_BRIGADE_INSERT_TAIL(b, e);
+ }
+ break;
+ case APR_DBD_TYPE_NULL:
+ *(void**)data = NULL;
+ break;
+ default:
+ return APR_EGENERAL;
+ }
+
+ return APR_SUCCESS;
+}
+
+static const char *dbd_pgsql_error(apr_dbd_t *sql, int n)
+{
+ return PQerrorMessage(sql->conn);
+}
+
+static int dbd_pgsql_query(apr_dbd_t *sql, int *nrows, const char *query)
+{
+ PGresult *res;
+ int ret;
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ if (TXN_IGNORE_ERRORS(sql->trans)) {
+ PGresult *res = PQexec(sql->conn, "SAVEPOINT APR_DBD_TXN_SP");
+ if (res) {
+ int ret = PQresultStatus(res);
+ PQclear(res);
+ if (!dbd_pgsql_is_success(ret)) {
+ sql->trans->errnum = ret;
+ return PGRES_FATAL_ERROR;
+ }
+ } else {
+ return sql->trans->errnum = PGRES_FATAL_ERROR;
+ }
+ }
+
+ res = PQexec(sql->conn, query);
+ if (res) {
+ ret = PQresultStatus(res);
+ if (dbd_pgsql_is_success(ret)) {
+ /* ugh, making 0 return-success doesn't fit */
+ ret = 0;
+ }
+ *nrows = atoi(PQcmdTuples(res));
+ PQclear(res);
+ }
+ else {
+ ret = PGRES_FATAL_ERROR;
+ }
+
+ if (ret != 0){
+ if (TXN_IGNORE_ERRORS(sql->trans)) {
+ PGresult *res = PQexec(sql->conn,
+ "ROLLBACK TO SAVEPOINT APR_DBD_TXN_SP");
+ if (res) {
+ int ret = PQresultStatus(res);
+ PQclear(res);
+ if (!dbd_pgsql_is_success(ret)) {
+ sql->trans->errnum = ret;
+ return PGRES_FATAL_ERROR;
+ }
+ } else {
+ sql->trans->errnum = ret;
+ return PGRES_FATAL_ERROR;
+ }
+ } else if (TXN_NOTICE_ERRORS(sql->trans)){
+ sql->trans->errnum = ret;
+ }
+ } else {
+ if (TXN_IGNORE_ERRORS(sql->trans)) {
+ PGresult *res = PQexec(sql->conn,
+ "RELEASE SAVEPOINT APR_DBD_TXN_SP");
+ if (res) {
+ int ret = PQresultStatus(res);
+ PQclear(res);
+ if (!dbd_pgsql_is_success(ret)) {
+ sql->trans->errnum = ret;
+ return PGRES_FATAL_ERROR;
+ }
+ } else {
+ sql->trans->errnum = ret;
+ return PGRES_FATAL_ERROR;
+ }
+ }
+ }
+
+ return ret;
+}
+
+static const char *dbd_pgsql_escape(apr_pool_t *pool, const char *arg,
+ apr_dbd_t *sql)
+{
+ size_t len = strlen(arg);
+ char *ret = apr_palloc(pool, 2*len + 2);
+ PQescapeStringConn(sql->conn, ret, arg, len, NULL);
+ return ret;
+}
+
+static int dbd_pgsql_prepare(apr_pool_t *pool, apr_dbd_t *sql,
+ const char *query, const char *label,
+ int nargs, int nvals, apr_dbd_type_e *types,
+ apr_dbd_prepared_t **statement)
+{
+ char *sqlcmd;
+ char *sqlptr;
+ size_t length, qlen;
+ int i = 0;
+ const char **args;
+ size_t alen;
+ int ret;
+ PGresult *res;
+
+ if (!*statement) {
+ *statement = apr_palloc(pool, sizeof(apr_dbd_prepared_t));
+ }
+ (*statement)->nargs = nargs;
+ (*statement)->nvals = nvals;
+ (*statement)->types = types;
+
+ args = apr_palloc(pool, nargs * sizeof(*args));
+
+ qlen = strlen(query);
+ length = qlen + 1;
+
+ for (i = 0; i < nargs; i++) {
+ switch (types[i]) {
+ case APR_DBD_TYPE_TINY:
+ case APR_DBD_TYPE_UTINY:
+ case APR_DBD_TYPE_SHORT:
+ case APR_DBD_TYPE_USHORT:
+ args[i] = "smallint";
+ break;
+ case APR_DBD_TYPE_INT:
+ case APR_DBD_TYPE_UINT:
+ args[i] = "integer";
+ break;
+ case APR_DBD_TYPE_LONG:
+ case APR_DBD_TYPE_ULONG:
+ case APR_DBD_TYPE_LONGLONG:
+ case APR_DBD_TYPE_ULONGLONG:
+ args[i] = "bigint";
+ break;
+ case APR_DBD_TYPE_FLOAT:
+ args[i] = "real";
+ break;
+ case APR_DBD_TYPE_DOUBLE:
+ args[i] = "double precision";
+ break;
+ case APR_DBD_TYPE_TEXT:
+ args[i] = "text";
+ break;
+ case APR_DBD_TYPE_TIME:
+ args[i] = "time";
+ break;
+ case APR_DBD_TYPE_DATE:
+ args[i] = "date";
+ break;
+ case APR_DBD_TYPE_DATETIME:
+ case APR_DBD_TYPE_TIMESTAMP:
+ args[i] = "timestamp";
+ break;
+ case APR_DBD_TYPE_ZTIMESTAMP:
+ args[i] = "timestamp with time zone";
+ break;
+ case APR_DBD_TYPE_BLOB:
+ case APR_DBD_TYPE_CLOB:
+ args[i] = "bytea";
+ break;
+ case APR_DBD_TYPE_NULL:
+ args[i] = "varchar"; /* XXX Eh? */
+ break;
+ default:
+ args[i] = "varchar";
+ break;
+ }
+ length += 1 + strlen(args[i]);
+ }
+
+ if (!label) {
+ /* don't really prepare; use in execParams instead */
+ (*statement)->prepared = 0;
+ (*statement)->name = apr_pstrdup(pool, query);
+ return 0;
+ }
+ (*statement)->name = apr_pstrdup(pool, label);
+
+ /* length of SQL query that prepares this statement */
+ length = 8 + strlen(label) + 2 + 4 + length + 1;
+ sqlcmd = apr_palloc(pool, length);
+ sqlptr = sqlcmd;
+ memcpy(sqlptr, "PREPARE ", 8);
+ sqlptr += 8;
+ length = strlen(label);
+ memcpy(sqlptr, label, length);
+ sqlptr += length;
+ if (nargs > 0) {
+ memcpy(sqlptr, " (",2);
+ sqlptr += 2;
+ for (i=0; i < nargs; ++i) {
+ alen = strlen(args[i]);
+ memcpy(sqlptr, args[i], alen);
+ sqlptr += alen;
+ *sqlptr++ = ',';
+ }
+ sqlptr[-1] = ')';
+ }
+ memcpy(sqlptr, " AS ", 4);
+ sqlptr += 4;
+ memcpy(sqlptr, query, qlen);
+ sqlptr += qlen;
+ *sqlptr = 0;
+
+ res = PQexec(sql->conn, sqlcmd);
+ if ( res ) {
+ ret = PQresultStatus(res);
+ if (dbd_pgsql_is_success(ret)) {
+ ret = 0;
+ }
+ /* Hmmm, do we do this here or register it on the pool? */
+ PQclear(res);
+ }
+ else {
+ ret = PGRES_FATAL_ERROR;
+ }
+ (*statement)->prepared = 1;
+
+ return ret;
+}
+
+static int dbd_pgsql_pquery_internal(apr_pool_t *pool, apr_dbd_t *sql,
+ int *nrows, apr_dbd_prepared_t *statement,
+ const char **values,
+ const int *len, const int *fmt)
+{
+ int ret;
+ PGresult *res;
+
+ if (TXN_IGNORE_ERRORS(sql->trans)) {
+ PGresult *res = PQexec(sql->conn, "SAVEPOINT APR_DBD_TXN_SP");
+ if (res) {
+ int ret = PQresultStatus(res);
+ PQclear(res);
+ if (!dbd_pgsql_is_success(ret)) {
+ sql->trans->errnum = ret;
+ return PGRES_FATAL_ERROR;
+ }
+ } else {
+ return sql->trans->errnum = PGRES_FATAL_ERROR;
+ }
+ }
+
+ if (statement->prepared) {
+ res = PQexecPrepared(sql->conn, statement->name, statement->nargs,
+ values, len, fmt, 0);
+ }
+ else {
+ res = PQexecParams(sql->conn, statement->name, statement->nargs, 0,
+ values, len, fmt, 0);
+ }
+ if (res) {
+ ret = PQresultStatus(res);
+ if (dbd_pgsql_is_success(ret)) {
+ ret = 0;
+ }
+ *nrows = atoi(PQcmdTuples(res));
+ PQclear(res);
+ }
+ else {
+ ret = PGRES_FATAL_ERROR;
+ }
+
+ if (ret != 0){
+ if (TXN_IGNORE_ERRORS(sql->trans)) {
+ PGresult *res = PQexec(sql->conn,
+ "ROLLBACK TO SAVEPOINT APR_DBD_TXN_SP");
+ if (res) {
+ int ret = PQresultStatus(res);
+ PQclear(res);
+ if (!dbd_pgsql_is_success(ret)) {
+ sql->trans->errnum = ret;
+ return PGRES_FATAL_ERROR;
+ }
+ } else {
+ sql->trans->errnum = ret;
+ return PGRES_FATAL_ERROR;
+ }
+ } else if (TXN_NOTICE_ERRORS(sql->trans)){
+ sql->trans->errnum = ret;
+ }
+ } else {
+ if (TXN_IGNORE_ERRORS(sql->trans)) {
+ PGresult *res = PQexec(sql->conn,
+ "RELEASE SAVEPOINT APR_DBD_TXN_SP");
+ if (res) {
+ int ret = PQresultStatus(res);
+ PQclear(res);
+ if (!dbd_pgsql_is_success(ret)) {
+ sql->trans->errnum = ret;
+ return PGRES_FATAL_ERROR;
+ }
+ } else {
+ sql->trans->errnum = ret;
+ return PGRES_FATAL_ERROR;
+ }
+ }
+ }
+
+ return ret;
+}
+
+static void dbd_pgsql_bind(apr_dbd_prepared_t *statement,
+ const char **values,
+ const char **val, int *len, int *fmt)
+{
+ int i, j;
+
+ for (i = 0, j = 0; i < statement->nargs; i++, j++) {
+ if (values[j] == NULL) {
+ val[i] = NULL;
+ }
+ else {
+ switch (statement->types[i]) {
+ case APR_DBD_TYPE_BLOB:
+ case APR_DBD_TYPE_CLOB:
+ val[i] = (char *)values[j];
+ len[i] = atoi(values[++j]);
+ fmt[i] = 1;
+
+ /* skip table and column */
+ j += 2;
+ break;
+ default:
+ val[i] = values[j];
+ break;
+ }
+ }
+ }
+
+ return;
+}
+
+static int dbd_pgsql_pquery(apr_pool_t *pool, apr_dbd_t *sql,
+ int *nrows, apr_dbd_prepared_t *statement,
+ const char **values)
+{
+ int *len, *fmt;
+ const char **val;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ val = apr_palloc(pool, sizeof(*val) * statement->nargs);
+ len = apr_pcalloc(pool, sizeof(*len) * statement->nargs);
+ fmt = apr_pcalloc(pool, sizeof(*fmt) * statement->nargs);
+
+ dbd_pgsql_bind(statement, values, val, len, fmt);
+
+ return dbd_pgsql_pquery_internal(pool, sql, nrows, statement,
+ val, len, fmt);
+}
+
+static int dbd_pgsql_pvquery(apr_pool_t *pool, apr_dbd_t *sql,
+ int *nrows, apr_dbd_prepared_t *statement,
+ va_list args)
+{
+ const char **values;
+ int i;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ values = apr_palloc(pool, sizeof(*values) * statement->nvals);
+
+ for (i = 0; i < statement->nvals; i++) {
+ values[i] = va_arg(args, const char*);
+ }
+
+ return dbd_pgsql_pquery(pool, sql, nrows, statement, values);
+}
+
+static int dbd_pgsql_pselect_internal(apr_pool_t *pool, apr_dbd_t *sql,
+ apr_dbd_results_t **results,
+ apr_dbd_prepared_t *statement,
+ int seek, const char **values,
+ const int *len, const int *fmt)
+{
+ PGresult *res;
+ int rv;
+ int ret = 0;
+
+ if (seek) { /* synchronous query */
+ if (TXN_IGNORE_ERRORS(sql->trans)) {
+ PGresult *res = PQexec(sql->conn, "SAVEPOINT APR_DBD_TXN_SP");
+ if (res) {
+ int ret = PQresultStatus(res);
+ PQclear(res);
+ if (!dbd_pgsql_is_success(ret)) {
+ sql->trans->errnum = ret;
+ return PGRES_FATAL_ERROR;
+ }
+ } else {
+ sql->trans->errnum = ret;
+ return PGRES_FATAL_ERROR;
+ }
+ }
+ if (statement->prepared) {
+ res = PQexecPrepared(sql->conn, statement->name, statement->nargs,
+ values, len, fmt, 0);
+ }
+ else {
+ res = PQexecParams(sql->conn, statement->name, statement->nargs, 0,
+ values, len, fmt, 0);
+ }
+ if (res) {
+ ret = PQresultStatus(res);
+ if (dbd_pgsql_is_success(ret)) {
+ ret = 0;
+ }
+ else {
+ PQclear(res);
+ }
+ }
+ else {
+ ret = PGRES_FATAL_ERROR;
+ }
+ if (ret != 0) {
+ if (TXN_IGNORE_ERRORS(sql->trans)) {
+ PGresult *res = PQexec(sql->conn,
+ "ROLLBACK TO SAVEPOINT APR_DBD_TXN_SP");
+ if (res) {
+ int ret = PQresultStatus(res);
+ PQclear(res);
+ if (!dbd_pgsql_is_success(ret)) {
+ sql->trans->errnum = ret;
+ return PGRES_FATAL_ERROR;
+ }
+ } else {
+ sql->trans->errnum = ret;
+ return PGRES_FATAL_ERROR;
+ }
+ } else if (TXN_NOTICE_ERRORS(sql->trans)){
+ sql->trans->errnum = ret;
+ }
+ return ret;
+ } else {
+ if (TXN_IGNORE_ERRORS(sql->trans)) {
+ PGresult *res = PQexec(sql->conn,
+ "RELEASE SAVEPOINT APR_DBD_TXN_SP");
+ if (res) {
+ int ret = PQresultStatus(res);
+ PQclear(res);
+ if (!dbd_pgsql_is_success(ret)) {
+ sql->trans->errnum = ret;
+ return PGRES_FATAL_ERROR;
+ }
+ } else {
+ sql->trans->errnum = ret;
+ return PGRES_FATAL_ERROR;
+ }
+ }
+ }
+ if (!*results) {
+ *results = apr_pcalloc(pool, sizeof(apr_dbd_results_t));
+ }
+ (*results)->res = res;
+ (*results)->ntuples = PQntuples(res);
+ (*results)->sz = PQnfields(res);
+ (*results)->random = seek;
+ (*results)->pool = pool;
+ apr_pool_cleanup_register(pool, res, clear_result,
+ apr_pool_cleanup_null);
+ }
+ else {
+ if (TXN_IGNORE_ERRORS(sql->trans)) {
+ PGresult *res = PQexec(sql->conn, "SAVEPOINT APR_DBD_TXN_SP");
+ if (res) {
+ int ret = PQresultStatus(res);
+ PQclear(res);
+ if (!dbd_pgsql_is_success(ret)) {
+ sql->trans->errnum = ret;
+ return PGRES_FATAL_ERROR;
+ }
+ } else {
+ sql->trans->errnum = ret;
+ return PGRES_FATAL_ERROR;
+ }
+ }
+ if (statement->prepared) {
+ rv = PQsendQueryPrepared(sql->conn, statement->name,
+ statement->nargs, values, len, fmt, 0);
+ }
+ else {
+ rv = PQsendQueryParams(sql->conn, statement->name,
+ statement->nargs, 0, values, len, fmt, 0);
+ }
+ if (rv == 0) {
+ if (TXN_IGNORE_ERRORS(sql->trans)) {
+ PGresult *res = PQexec(sql->conn,
+ "ROLLBACK TO SAVEPOINT APR_DBD_TXN_SP");
+ if (res) {
+ int ret = PQresultStatus(res);
+ PQclear(res);
+ if (!dbd_pgsql_is_success(ret)) {
+ sql->trans->errnum = ret;
+ return PGRES_FATAL_ERROR;
+ }
+ } else {
+ sql->trans->errnum = ret;
+ return PGRES_FATAL_ERROR;
+ }
+ } else if (TXN_NOTICE_ERRORS(sql->trans)){
+ sql->trans->errnum = 1;
+ }
+ return 1;
+ } else {
+ if (TXN_IGNORE_ERRORS(sql->trans)) {
+ PGresult *res = PQexec(sql->conn,
+ "RELEASE SAVEPOINT APR_DBD_TXN_SP");
+ if (res) {
+ int ret = PQresultStatus(res);
+ PQclear(res);
+ if (!dbd_pgsql_is_success(ret)) {
+ sql->trans->errnum = ret;
+ return PGRES_FATAL_ERROR;
+ }
+ } else {
+ sql->trans->errnum = ret;
+ return PGRES_FATAL_ERROR;
+ }
+ }
+ }
+ if (!*results) {
+ *results = apr_pcalloc(pool, sizeof(apr_dbd_results_t));
+ }
+ (*results)->random = seek;
+ (*results)->handle = sql->conn;
+ (*results)->pool = pool;
+ }
+
+ return ret;
+}
+
+static int dbd_pgsql_pselect(apr_pool_t *pool, apr_dbd_t *sql,
+ apr_dbd_results_t **results,
+ apr_dbd_prepared_t *statement,
+ int seek, const char **values)
+{
+ int *len, *fmt;
+ const char **val;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ val = apr_palloc(pool, sizeof(*val) * statement->nargs);
+ len = apr_pcalloc(pool, sizeof(*len) * statement->nargs);
+ fmt = apr_pcalloc(pool, sizeof(*fmt) * statement->nargs);
+
+ dbd_pgsql_bind(statement, values, val, len, fmt);
+
+ return dbd_pgsql_pselect_internal(pool, sql, results, statement,
+ seek, val, len, fmt);
+}
+
+static int dbd_pgsql_pvselect(apr_pool_t *pool, apr_dbd_t *sql,
+ apr_dbd_results_t **results,
+ apr_dbd_prepared_t *statement,
+ int seek, va_list args)
+{
+ const char **values;
+ int i;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ values = apr_palloc(pool, sizeof(*values) * statement->nvals);
+
+ for (i = 0; i < statement->nvals; i++) {
+ values[i] = va_arg(args, const char*);
+ }
+
+ return dbd_pgsql_pselect(pool, sql, results, statement, seek, values);
+}
+
+static void dbd_pgsql_bbind(apr_pool_t *pool, apr_dbd_prepared_t * statement,
+ const void **values,
+ const char **val, int *len, int *fmt)
+{
+ int i, j;
+ apr_dbd_type_e type;
+
+ for (i = 0, j = 0; i < statement->nargs; i++, j++) {
+ type = (values[j] == NULL ? APR_DBD_TYPE_NULL : statement->types[i]);
+
+ switch (type) {
+ case APR_DBD_TYPE_TINY:
+ val[i] = apr_itoa(pool, *(char*)values[j]);
+ break;
+ case APR_DBD_TYPE_UTINY:
+ val[i] = apr_itoa(pool, *(unsigned char*)values[j]);
+ break;
+ case APR_DBD_TYPE_SHORT:
+ val[i] = apr_itoa(pool, *(short*)values[j]);
+ break;
+ case APR_DBD_TYPE_USHORT:
+ val[i] = apr_itoa(pool, *(unsigned short*)values[j]);
+ break;
+ case APR_DBD_TYPE_INT:
+ val[i] = apr_itoa(pool, *(int*)values[j]);
+ break;
+ case APR_DBD_TYPE_UINT:
+ val[i] = apr_itoa(pool, *(unsigned int*)values[j]);
+ break;
+ case APR_DBD_TYPE_LONG:
+ val[i] = apr_ltoa(pool, *(long*)values[j]);
+ break;
+ case APR_DBD_TYPE_ULONG:
+ val[i] = apr_ltoa(pool, *(unsigned long*)values[j]);
+ break;
+ case APR_DBD_TYPE_LONGLONG:
+ val[i] = apr_psprintf(pool, "%" APR_INT64_T_FMT,
+ *(apr_int64_t*)values[j]);
+ break;
+ case APR_DBD_TYPE_ULONGLONG:
+ val[i] = apr_psprintf(pool, "%" APR_UINT64_T_FMT,
+ *(apr_uint64_t*)values[j]);
+ break;
+ case APR_DBD_TYPE_FLOAT:
+ val[i] = apr_psprintf(pool, "%f", *(float*)values[j]);
+ break;
+ case APR_DBD_TYPE_DOUBLE:
+ val[i] = apr_psprintf(pool, "%lf", *(double*)values[j]);
+ break;
+ case APR_DBD_TYPE_STRING:
+ case APR_DBD_TYPE_TEXT:
+ case APR_DBD_TYPE_TIME:
+ case APR_DBD_TYPE_DATE:
+ case APR_DBD_TYPE_DATETIME:
+ case APR_DBD_TYPE_TIMESTAMP:
+ case APR_DBD_TYPE_ZTIMESTAMP:
+ val[i] = values[j];
+ break;
+ case APR_DBD_TYPE_BLOB:
+ case APR_DBD_TYPE_CLOB:
+ val[i] = (char*)values[j];
+ len[i] = *(apr_size_t*)values[++j];
+ fmt[i] = 1;
+
+ /* skip table and column */
+ j += 2;
+ break;
+ case APR_DBD_TYPE_NULL:
+ default:
+ val[i] = NULL;
+ break;
+ }
+ }
+
+ return;
+}
+
+static int dbd_pgsql_pbquery(apr_pool_t * pool, apr_dbd_t * sql,
+ int *nrows, apr_dbd_prepared_t * statement,
+ const void **values)
+{
+ int *len, *fmt;
+ const char **val;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ val = apr_palloc(pool, sizeof(*val) * statement->nargs);
+ len = apr_pcalloc(pool, sizeof(*len) * statement->nargs);
+ fmt = apr_pcalloc(pool, sizeof(*fmt) * statement->nargs);
+
+ dbd_pgsql_bbind(pool, statement, values, val, len, fmt);
+
+ return dbd_pgsql_pquery_internal(pool, sql, nrows, statement,
+ val, len, fmt);
+}
+
+static int dbd_pgsql_pvbquery(apr_pool_t * pool, apr_dbd_t * sql,
+ int *nrows, apr_dbd_prepared_t * statement,
+ va_list args)
+{
+ const void **values;
+ int i;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ values = apr_palloc(pool, sizeof(*values) * statement->nvals);
+
+ for (i = 0; i < statement->nvals; i++) {
+ values[i] = va_arg(args, const void*);
+ }
+
+ return dbd_pgsql_pbquery(pool, sql, nrows, statement, values);
+}
+
+static int dbd_pgsql_pbselect(apr_pool_t * pool, apr_dbd_t * sql,
+ apr_dbd_results_t ** results,
+ apr_dbd_prepared_t * statement,
+ int seek, const void **values)
+{
+ int *len, *fmt;
+ const char **val;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ val = apr_palloc(pool, sizeof(*val) * statement->nargs);
+ len = apr_pcalloc(pool, sizeof(*len) * statement->nargs);
+ fmt = apr_pcalloc(pool, sizeof(*fmt) * statement->nargs);
+
+ dbd_pgsql_bbind(pool, statement, values, val, len, fmt);
+
+ return dbd_pgsql_pselect_internal(pool, sql, results, statement,
+ seek, val, len, fmt);
+}
+
+static int dbd_pgsql_pvbselect(apr_pool_t * pool, apr_dbd_t * sql,
+ apr_dbd_results_t ** results,
+ apr_dbd_prepared_t * statement, int seek,
+ va_list args)
+{
+ const void **values;
+ int i;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ values = apr_palloc(pool, sizeof(*values) * statement->nvals);
+
+ for (i = 0; i < statement->nvals; i++) {
+ values[i] = va_arg(args, const void*);
+ }
+
+ return dbd_pgsql_pbselect(pool, sql, results, statement, seek, values);
+}
+
+static int dbd_pgsql_start_transaction(apr_pool_t *pool, apr_dbd_t *handle,
+ apr_dbd_transaction_t **trans)
+{
+ int ret = 0;
+ PGresult *res;
+
+ /* XXX handle recursive transactions here */
+
+ res = PQexec(handle->conn, "BEGIN TRANSACTION");
+ if (res) {
+ ret = PQresultStatus(res);
+ if (dbd_pgsql_is_success(ret)) {
+ ret = 0;
+ if (!*trans) {
+ *trans = apr_pcalloc(pool, sizeof(apr_dbd_transaction_t));
+ }
+ }
+ PQclear(res);
+ (*trans)->handle = handle;
+ handle->trans = *trans;
+ }
+ else {
+ ret = PGRES_FATAL_ERROR;
+ }
+ return ret;
+}
+
+static int dbd_pgsql_end_transaction(apr_dbd_transaction_t *trans)
+{
+ PGresult *res;
+ int ret = -1; /* no transaction is an error cond */
+ if (trans) {
+ /* rollback on error or explicit rollback request */
+ if (trans->errnum || TXN_DO_ROLLBACK(trans)) {
+ trans->errnum = 0;
+ res = PQexec(trans->handle->conn, "ROLLBACK");
+ }
+ else {
+ res = PQexec(trans->handle->conn, "COMMIT");
+ }
+ if (res) {
+ ret = PQresultStatus(res);
+ if (dbd_pgsql_is_success(ret)) {
+ ret = 0;
+ }
+ PQclear(res);
+ }
+ else {
+ ret = PGRES_FATAL_ERROR;
+ }
+ trans->handle->trans = NULL;
+ }
+ return ret;
+}
+
+static int dbd_pgsql_transaction_mode_get(apr_dbd_transaction_t *trans)
+{
+ if (!trans)
+ return APR_DBD_TRANSACTION_COMMIT;
+
+ return trans->mode;
+}
+
+static int dbd_pgsql_transaction_mode_set(apr_dbd_transaction_t *trans,
+ int mode)
+{
+ if (!trans)
+ return APR_DBD_TRANSACTION_COMMIT;
+
+ return trans->mode = (mode & TXN_MODE_BITS);
+}
+
+static void null_notice_receiver(void *arg, const PGresult *res)
+{
+ /* nothing */
+}
+
+static void null_notice_processor(void *arg, const char *message)
+{
+ /* nothing */
+}
+
+static apr_dbd_t *dbd_pgsql_open(apr_pool_t *pool, const char *params,
+ const char **error)
+{
+ apr_dbd_t *sql;
+
+ PGconn *conn = PQconnectdb(params);
+
+ /* if there's an error in the connect string or something we get
+ * back a * bogus connection object, and things like PQreset are
+ * liable to segfault, so just close it out now. it would be nice
+ * if we could give an indication of why we failed to connect... */
+ if (PQstatus(conn) != CONNECTION_OK) {
+ if (error) {
+ *error = apr_pstrdup(pool, PQerrorMessage(conn));
+ }
+ PQfinish(conn);
+ return NULL;
+ }
+
+ PQsetNoticeReceiver(conn, null_notice_receiver, NULL);
+ PQsetNoticeProcessor(conn, null_notice_processor, NULL);
+
+ sql = apr_pcalloc (pool, sizeof (*sql));
+
+ sql->conn = conn;
+
+ return sql;
+}
+
+static apr_status_t dbd_pgsql_close(apr_dbd_t *handle)
+{
+ PQfinish(handle->conn);
+ return APR_SUCCESS;
+}
+
+static apr_status_t dbd_pgsql_check_conn(apr_pool_t *pool,
+ apr_dbd_t *handle)
+{
+ if (PQstatus(handle->conn) != CONNECTION_OK) {
+ PQreset(handle->conn);
+ if (PQstatus(handle->conn) != CONNECTION_OK) {
+ return APR_EGENERAL;
+ }
+ }
+ return APR_SUCCESS;
+}
+
+static int dbd_pgsql_select_db(apr_pool_t *pool, apr_dbd_t *handle,
+ const char *name)
+{
+ return APR_ENOTIMPL;
+}
+
+static void *dbd_pgsql_native(apr_dbd_t *handle)
+{
+ return handle->conn;
+}
+
+static int dbd_pgsql_num_cols(apr_dbd_results_t* res)
+{
+ return res->sz;
+}
+
+static int dbd_pgsql_num_tuples(apr_dbd_results_t* res)
+{
+ if (res->random) {
+ return res->ntuples;
+ }
+ else {
+ return -1;
+ }
+}
+
+APU_MODULE_DECLARE_DATA const apr_dbd_driver_t apr_dbd_pgsql_driver = {
+ "pgsql",
+ NULL,
+ dbd_pgsql_native,
+ dbd_pgsql_open,
+ dbd_pgsql_check_conn,
+ dbd_pgsql_close,
+ dbd_pgsql_select_db,
+ dbd_pgsql_start_transaction,
+ dbd_pgsql_end_transaction,
+ dbd_pgsql_query,
+ dbd_pgsql_select,
+ dbd_pgsql_num_cols,
+ dbd_pgsql_num_tuples,
+ dbd_pgsql_get_row,
+ dbd_pgsql_get_entry,
+ dbd_pgsql_error,
+ dbd_pgsql_escape,
+ dbd_pgsql_prepare,
+ dbd_pgsql_pvquery,
+ dbd_pgsql_pvselect,
+ dbd_pgsql_pquery,
+ dbd_pgsql_pselect,
+ dbd_pgsql_get_name,
+ dbd_pgsql_transaction_mode_get,
+ dbd_pgsql_transaction_mode_set,
+ "$%d",
+ dbd_pgsql_pvbquery,
+ dbd_pgsql_pvbselect,
+ dbd_pgsql_pbquery,
+ dbd_pgsql_pbselect,
+ dbd_pgsql_datum_get
+};
+#endif
diff --git a/contrib/apr-util/dbd/apr_dbd_sqlite2.c b/contrib/apr-util/dbd/apr_dbd_sqlite2.c
new file mode 100644
index 000000000000..342068c3e6f1
--- /dev/null
+++ b/contrib/apr-util/dbd/apr_dbd_sqlite2.c
@@ -0,0 +1,566 @@
+/* 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 "apu.h"
+
+#if APU_HAVE_SQLITE2
+
+#include <ctype.h>
+#include <stdlib.h>
+
+#include <sqlite.h>
+
+#include "apr_strings.h"
+#include "apr_time.h"
+#include "apr_buckets.h"
+
+#include "apr_dbd_internal.h"
+
+struct apr_dbd_transaction_t {
+ int mode;
+ int errnum;
+ apr_dbd_t *handle;
+};
+
+struct apr_dbd_t {
+ sqlite *conn;
+ char *errmsg;
+ apr_dbd_transaction_t *trans;
+};
+
+struct apr_dbd_results_t {
+ int random;
+ sqlite *handle;
+ char **res;
+ size_t ntuples;
+ size_t sz;
+ size_t index;
+ apr_pool_t *pool;
+};
+
+struct apr_dbd_row_t {
+ int n;
+ char **data;
+ apr_dbd_results_t *res;
+};
+
+struct apr_dbd_prepared_t {
+ const char *name;
+ int prepared;
+};
+
+#define FREE_ERROR_MSG(dbd) \
+ do { \
+ if(dbd && dbd->errmsg) { \
+ free(dbd->errmsg); \
+ dbd->errmsg = NULL; \
+ } \
+ } while(0);
+
+static apr_status_t free_table(void *data)
+{
+ sqlite_free_table(data);
+ return APR_SUCCESS;
+}
+
+static int dbd_sqlite_select(apr_pool_t * pool, apr_dbd_t * sql,
+ apr_dbd_results_t ** results, const char *query,
+ int seek)
+{
+ char **result;
+ int ret = 0;
+ int tuples = 0;
+ int fields = 0;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ FREE_ERROR_MSG(sql);
+
+ ret = sqlite_get_table(sql->conn, query, &result, &tuples, &fields,
+ &sql->errmsg);
+
+ if (ret == SQLITE_OK) {
+ if (!*results) {
+ *results = apr_pcalloc(pool, sizeof(apr_dbd_results_t));
+ }
+
+ (*results)->res = result;
+ (*results)->ntuples = tuples;
+ (*results)->sz = fields;
+ (*results)->random = seek;
+ (*results)->pool = pool;
+
+ if (tuples > 0)
+ apr_pool_cleanup_register(pool, result, free_table,
+ apr_pool_cleanup_null);
+
+ ret = 0;
+ }
+ else {
+ if (TXN_NOTICE_ERRORS(sql->trans)) {
+ sql->trans->errnum = ret;
+ }
+ }
+
+ return ret;
+}
+
+static const char *dbd_sqlite_get_name(const apr_dbd_results_t *res, int n)
+{
+ if ((n < 0) || (n >= res->sz)) {
+ return NULL;
+ }
+
+ return res->res[n];
+}
+
+static int dbd_sqlite_get_row(apr_pool_t * pool, apr_dbd_results_t * res,
+ apr_dbd_row_t ** rowp, int rownum)
+{
+ apr_dbd_row_t *row = *rowp;
+ int sequential = ((rownum >= 0) && res->random) ? 0 : 1;
+
+ if (row == NULL) {
+ row = apr_palloc(pool, sizeof(apr_dbd_row_t));
+ *rowp = row;
+ row->res = res;
+ row->n = sequential ? 0 : rownum - 1;
+ }
+ else {
+ if (sequential) {
+ ++row->n;
+ }
+ else {
+ row->n = rownum - 1;
+ }
+ }
+
+ if (row->n >= res->ntuples) {
+ *rowp = NULL;
+ apr_pool_cleanup_run(res->pool, res->res, free_table);
+ res->res = NULL;
+ return -1;
+ }
+
+ /* Pointer magic explanation:
+ * The sqlite result is an array such that the first res->sz elements are
+ * the column names and each tuple follows afterwards
+ * ex: (from the sqlite2 documentation)
+ SELECT employee_name, login, host FROM users WHERE login LIKE * 'd%';
+
+ nrow = 2
+ ncolumn = 3
+ result[0] = "employee_name"
+ result[1] = "login"
+ result[2] = "host"
+ result[3] = "dummy"
+ result[4] = "No such user"
+ result[5] = 0
+ result[6] = "D. Richard Hipp"
+ result[7] = "drh"
+ result[8] = "zadok"
+ */
+
+ row->data = res->res + res->sz + (res->sz * row->n);
+
+ return 0;
+}
+
+static const char *dbd_sqlite_get_entry(const apr_dbd_row_t * row, int n)
+{
+ if ((n < 0) || (n >= row->res->sz)) {
+ return NULL;
+ }
+
+ return row->data[n];
+}
+
+static apr_status_t dbd_sqlite_datum_get(const apr_dbd_row_t *row, int n,
+ apr_dbd_type_e type, void *data)
+{
+ if ((n < 0) || (n >= row->res->sz)) {
+ return APR_EGENERAL;
+ }
+
+ if (row->data[n] == NULL) {
+ return APR_ENOENT;
+ }
+
+ switch (type) {
+ case APR_DBD_TYPE_TINY:
+ *(char*)data = atoi(row->data[n]);
+ break;
+ case APR_DBD_TYPE_UTINY:
+ *(unsigned char*)data = atoi(row->data[n]);
+ break;
+ case APR_DBD_TYPE_SHORT:
+ *(short*)data = atoi(row->data[n]);
+ break;
+ case APR_DBD_TYPE_USHORT:
+ *(unsigned short*)data = atoi(row->data[n]);
+ break;
+ case APR_DBD_TYPE_INT:
+ *(int*)data = atoi(row->data[n]);
+ break;
+ case APR_DBD_TYPE_UINT:
+ *(unsigned int*)data = atoi(row->data[n]);
+ break;
+ case APR_DBD_TYPE_LONG:
+ *(long*)data = atol(row->data[n]);
+ break;
+ case APR_DBD_TYPE_ULONG:
+ *(unsigned long*)data = atol(row->data[n]);
+ break;
+ case APR_DBD_TYPE_LONGLONG:
+ *(apr_int64_t*)data = apr_atoi64(row->data[n]);
+ break;
+ case APR_DBD_TYPE_ULONGLONG:
+ *(apr_uint64_t*)data = apr_atoi64(row->data[n]);
+ break;
+ case APR_DBD_TYPE_FLOAT:
+ *(float*)data = atof(row->data[n]);
+ break;
+ case APR_DBD_TYPE_DOUBLE:
+ *(double*)data = atof(row->data[n]);
+ break;
+ case APR_DBD_TYPE_STRING:
+ case APR_DBD_TYPE_TEXT:
+ case APR_DBD_TYPE_TIME:
+ case APR_DBD_TYPE_DATE:
+ case APR_DBD_TYPE_DATETIME:
+ case APR_DBD_TYPE_TIMESTAMP:
+ case APR_DBD_TYPE_ZTIMESTAMP:
+ *(char**)data = row->data[n];
+ break;
+ case APR_DBD_TYPE_BLOB:
+ case APR_DBD_TYPE_CLOB:
+ {
+ apr_bucket *e;
+ apr_bucket_brigade *b = (apr_bucket_brigade*)data;
+
+ e = apr_bucket_pool_create(row->data[n],strlen(row->data[n]),
+ row->res->pool, b->bucket_alloc);
+ APR_BRIGADE_INSERT_TAIL(b, e);
+ }
+ break;
+ case APR_DBD_TYPE_NULL:
+ *(void**)data = NULL;
+ break;
+ default:
+ return APR_EGENERAL;
+ }
+
+ return APR_SUCCESS;
+}
+
+static const char *dbd_sqlite_error(apr_dbd_t * sql, int n)
+{
+ return sql->errmsg;
+}
+
+static int dbd_sqlite_query(apr_dbd_t * sql, int *nrows, const char *query)
+{
+ char **result;
+ int ret;
+ int tuples = 0;
+ int fields = 0;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ FREE_ERROR_MSG(sql);
+
+ ret =
+ sqlite_get_table(sql->conn, query, &result, &tuples, &fields,
+ &sql->errmsg);
+ if (ret == SQLITE_OK) {
+ *nrows = sqlite_changes(sql->conn);
+
+ if (tuples > 0)
+ free(result);
+
+ ret = 0;
+ }
+
+ if (TXN_NOTICE_ERRORS(sql->trans)) {
+ sql->trans->errnum = ret;
+ }
+
+ return ret;
+}
+
+static apr_status_t free_mem(void *data)
+{
+ sqlite_freemem(data);
+ return APR_SUCCESS;
+}
+
+static const char *dbd_sqlite_escape(apr_pool_t * pool, const char *arg,
+ apr_dbd_t * sql)
+{
+ char *ret = sqlite_mprintf("%q", arg);
+ apr_pool_cleanup_register(pool, ret, free_mem, apr_pool_cleanup_null);
+ return ret;
+}
+
+static int dbd_sqlite_prepare(apr_pool_t * pool, apr_dbd_t * sql,
+ const char *query, const char *label,
+ int nargs, int nvals, apr_dbd_type_e *types,
+ apr_dbd_prepared_t ** statement)
+{
+ return APR_ENOTIMPL;
+}
+
+static int dbd_sqlite_pquery(apr_pool_t * pool, apr_dbd_t * sql,
+ int *nrows, apr_dbd_prepared_t * statement,
+ const char **values)
+{
+ return APR_ENOTIMPL;
+}
+
+static int dbd_sqlite_pvquery(apr_pool_t * pool, apr_dbd_t * sql,
+ int *nrows, apr_dbd_prepared_t * statement,
+ va_list args)
+{
+ return APR_ENOTIMPL;
+}
+
+static int dbd_sqlite_pselect(apr_pool_t * pool, apr_dbd_t * sql,
+ apr_dbd_results_t ** results,
+ apr_dbd_prepared_t * statement,
+ int seek, const char **values)
+{
+ return APR_ENOTIMPL;
+}
+
+static int dbd_sqlite_pvselect(apr_pool_t * pool, apr_dbd_t * sql,
+ apr_dbd_results_t ** results,
+ apr_dbd_prepared_t * statement, int seek,
+ va_list args)
+{
+ return APR_ENOTIMPL;
+}
+
+static int dbd_sqlite_pbquery(apr_pool_t * pool, apr_dbd_t * sql,
+ int *nrows, apr_dbd_prepared_t * statement,
+ const void **values)
+{
+ return APR_ENOTIMPL;
+}
+
+static int dbd_sqlite_pvbquery(apr_pool_t * pool, apr_dbd_t * sql,
+ int *nrows, apr_dbd_prepared_t * statement,
+ va_list args)
+{
+ return APR_ENOTIMPL;
+}
+
+static int dbd_sqlite_pbselect(apr_pool_t * pool, apr_dbd_t * sql,
+ apr_dbd_results_t ** results,
+ apr_dbd_prepared_t * statement,
+ int seek, const void **values)
+{
+ return APR_ENOTIMPL;
+}
+
+static int dbd_sqlite_pvbselect(apr_pool_t * pool, apr_dbd_t * sql,
+ apr_dbd_results_t ** results,
+ apr_dbd_prepared_t * statement, int seek,
+ va_list args)
+{
+ return APR_ENOTIMPL;
+}
+
+static int dbd_sqlite_start_transaction(apr_pool_t * pool, apr_dbd_t * handle,
+ apr_dbd_transaction_t ** trans)
+{
+ int ret, rows;
+
+ ret = dbd_sqlite_query(handle, &rows, "BEGIN TRANSACTION");
+ if (ret == 0) {
+ if (!*trans) {
+ *trans = apr_pcalloc(pool, sizeof(apr_dbd_transaction_t));
+ }
+ (*trans)->handle = handle;
+ handle->trans = *trans;
+ }
+ else {
+ ret = -1;
+ }
+ return ret;
+}
+
+static int dbd_sqlite_end_transaction(apr_dbd_transaction_t * trans)
+{
+ int rows;
+ int ret = -1; /* no transaction is an error cond */
+
+ if (trans) {
+ /* rollback on error or explicit rollback request */
+ if (trans->errnum || TXN_DO_ROLLBACK(trans)) {
+ trans->errnum = 0;
+ ret =
+ dbd_sqlite_query(trans->handle, &rows,
+ "ROLLBACK TRANSACTION");
+ }
+ else {
+ ret =
+ dbd_sqlite_query(trans->handle, &rows, "COMMIT TRANSACTION");
+ }
+ trans->handle->trans = NULL;
+ }
+
+ return ret;
+}
+
+static int dbd_sqlite_transaction_mode_get(apr_dbd_transaction_t *trans)
+{
+ if (!trans)
+ return APR_DBD_TRANSACTION_COMMIT;
+
+ return trans->mode;
+}
+
+static int dbd_sqlite_transaction_mode_set(apr_dbd_transaction_t *trans,
+ int mode)
+{
+ if (!trans)
+ return APR_DBD_TRANSACTION_COMMIT;
+
+ return trans->mode = (mode & TXN_MODE_BITS);
+}
+
+static apr_status_t error_free(void *data)
+{
+ free(data);
+ return APR_SUCCESS;
+}
+
+static apr_dbd_t *dbd_sqlite_open(apr_pool_t * pool, const char *params_,
+ const char **error)
+{
+ apr_dbd_t *sql;
+ sqlite *conn = NULL;
+ char *perm;
+ int iperms = 600;
+ char* params = apr_pstrdup(pool, params_);
+ /* params = "[filename]:[permissions]"
+ * example: "shopping.db:600"
+ */
+
+ perm = strstr(params, ":");
+ if (perm) {
+ *(perm++) = '\x00'; /* split the filename and permissions */
+
+ if (strlen(perm) > 0)
+ iperms = atoi(perm);
+ }
+
+ if (error) {
+ *error = NULL;
+
+ conn = sqlite_open(params, iperms, (char **)error);
+
+ if (*error) {
+ apr_pool_cleanup_register(pool, *error, error_free,
+ apr_pool_cleanup_null);
+ }
+ }
+ else {
+ conn = sqlite_open(params, iperms, NULL);
+ }
+
+ sql = apr_pcalloc(pool, sizeof(*sql));
+ sql->conn = conn;
+
+ return sql;
+}
+
+static apr_status_t dbd_sqlite_close(apr_dbd_t * handle)
+{
+ if (handle->conn) {
+ sqlite_close(handle->conn);
+ handle->conn = NULL;
+ }
+ return APR_SUCCESS;
+}
+
+static apr_status_t dbd_sqlite_check_conn(apr_pool_t * pool,
+ apr_dbd_t * handle)
+{
+ if (handle->conn == NULL)
+ return -1;
+ return APR_SUCCESS;
+}
+
+static int dbd_sqlite_select_db(apr_pool_t * pool, apr_dbd_t * handle,
+ const char *name)
+{
+ return APR_ENOTIMPL;
+}
+
+static void *dbd_sqlite_native(apr_dbd_t * handle)
+{
+ return handle->conn;
+}
+
+static int dbd_sqlite_num_cols(apr_dbd_results_t * res)
+{
+ return res->sz;
+}
+
+static int dbd_sqlite_num_tuples(apr_dbd_results_t * res)
+{
+ return res->ntuples;
+}
+
+APU_MODULE_DECLARE_DATA const apr_dbd_driver_t apr_dbd_sqlite2_driver = {
+ "sqlite2",
+ NULL,
+ dbd_sqlite_native,
+ dbd_sqlite_open,
+ dbd_sqlite_check_conn,
+ dbd_sqlite_close,
+ dbd_sqlite_select_db,
+ dbd_sqlite_start_transaction,
+ dbd_sqlite_end_transaction,
+ dbd_sqlite_query,
+ dbd_sqlite_select,
+ dbd_sqlite_num_cols,
+ dbd_sqlite_num_tuples,
+ dbd_sqlite_get_row,
+ dbd_sqlite_get_entry,
+ dbd_sqlite_error,
+ dbd_sqlite_escape,
+ dbd_sqlite_prepare,
+ dbd_sqlite_pvquery,
+ dbd_sqlite_pvselect,
+ dbd_sqlite_pquery,
+ dbd_sqlite_pselect,
+ dbd_sqlite_get_name,
+ dbd_sqlite_transaction_mode_get,
+ dbd_sqlite_transaction_mode_set,
+ NULL,
+ dbd_sqlite_pvbquery,
+ dbd_sqlite_pvbselect,
+ dbd_sqlite_pbquery,
+ dbd_sqlite_pbselect,
+ dbd_sqlite_datum_get
+};
+#endif
diff --git a/contrib/apr-util/dbd/apr_dbd_sqlite3.c b/contrib/apr-util/dbd/apr_dbd_sqlite3.c
new file mode 100644
index 000000000000..d79dbe106c4a
--- /dev/null
+++ b/contrib/apr-util/dbd/apr_dbd_sqlite3.c
@@ -0,0 +1,914 @@
+/* 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 "apu.h"
+
+#if APU_HAVE_SQLITE3
+
+#include <ctype.h>
+#include <stdlib.h>
+
+#include <sqlite3.h>
+
+#include "apr_strings.h"
+#include "apr_time.h"
+#include "apr_buckets.h"
+
+#include "apr_dbd_internal.h"
+
+#define MAX_RETRY_COUNT 15
+#define MAX_RETRY_SLEEP 100000
+
+struct apr_dbd_transaction_t {
+ int mode;
+ int errnum;
+ apr_dbd_t *handle;
+};
+
+struct apr_dbd_t {
+ sqlite3 *conn;
+ apr_dbd_transaction_t *trans;
+ apr_pool_t *pool;
+ apr_dbd_prepared_t *prep;
+};
+
+typedef struct {
+ char *name;
+ char *value;
+ int size;
+ int type;
+} apr_dbd_column_t;
+
+struct apr_dbd_row_t {
+ apr_dbd_results_t *res;
+ apr_dbd_column_t **columns;
+ apr_dbd_row_t *next_row;
+ int columnCount;
+ int rownum;
+};
+
+struct apr_dbd_results_t {
+ int random;
+ sqlite3 *handle;
+ sqlite3_stmt *stmt;
+ apr_dbd_row_t *next_row;
+ size_t sz;
+ int tuples;
+ char **col_names;
+ apr_pool_t *pool;
+};
+
+struct apr_dbd_prepared_t {
+ sqlite3_stmt *stmt;
+ apr_dbd_prepared_t *next;
+ int nargs;
+ int nvals;
+ apr_dbd_type_e *types;
+};
+
+#define dbd_sqlite3_is_success(x) (((x) == SQLITE_DONE) || ((x) == SQLITE_OK))
+
+static int dbd_sqlite3_select_internal(apr_pool_t *pool,
+ apr_dbd_t *sql,
+ apr_dbd_results_t **results,
+ sqlite3_stmt *stmt, int seek)
+{
+ int ret, retry_count = 0, column_count;
+ size_t i, num_tuples = 0;
+ int increment = 0;
+ apr_dbd_row_t *row = NULL;
+ apr_dbd_row_t *lastrow = NULL;
+ apr_dbd_column_t *column;
+ char *hold = NULL;
+
+ column_count = sqlite3_column_count(stmt);
+ if (!*results) {
+ *results = apr_pcalloc(pool, sizeof(apr_dbd_results_t));
+ }
+ (*results)->stmt = stmt;
+ (*results)->sz = column_count;
+ (*results)->random = seek;
+ (*results)->next_row = 0;
+ (*results)->tuples = 0;
+ (*results)->col_names = apr_pcalloc(pool, column_count * sizeof(char *));
+ (*results)->pool = pool;
+ do {
+ ret = sqlite3_step(stmt);
+ if (ret == SQLITE_BUSY) {
+ if (retry_count++ > MAX_RETRY_COUNT) {
+ ret = SQLITE_ERROR;
+ } else {
+ apr_dbd_mutex_unlock();
+ apr_sleep(MAX_RETRY_SLEEP);
+ apr_dbd_mutex_lock();
+ }
+ } else if (ret == SQLITE_ROW) {
+ int length;
+ row = apr_palloc(pool, sizeof(apr_dbd_row_t));
+ row->res = *results;
+ increment = sizeof(apr_dbd_column_t *);
+ length = increment * (*results)->sz;
+ row->columns = apr_palloc(pool, length);
+ row->columnCount = column_count;
+ for (i = 0; i < (*results)->sz; i++) {
+ column = apr_palloc(pool, sizeof(apr_dbd_column_t));
+ row->columns[i] = column;
+ /* copy column name once only */
+ if ((*results)->col_names[i] == NULL) {
+ (*results)->col_names[i] =
+ apr_pstrdup(pool, sqlite3_column_name(stmt, i));
+ }
+ column->name = (*results)->col_names[i];
+ column->size = sqlite3_column_bytes(stmt, i);
+ column->type = sqlite3_column_type(stmt, i);
+ column->value = NULL;
+ switch (column->type) {
+ case SQLITE_FLOAT:
+ case SQLITE_INTEGER:
+ case SQLITE_TEXT:
+ hold = (char *) sqlite3_column_text(stmt, i);
+ if (hold) {
+ column->value = apr_pstrmemdup(pool, hold,
+ column->size);
+ }
+ break;
+ case SQLITE_BLOB:
+ hold = (char *) sqlite3_column_blob(stmt, i);
+ if (hold) {
+ column->value = apr_pstrmemdup(pool, hold,
+ column->size);
+ }
+ break;
+ case SQLITE_NULL:
+ break;
+ }
+ }
+ row->rownum = num_tuples++;
+ row->next_row = 0;
+ (*results)->tuples = num_tuples;
+ if ((*results)->next_row == 0) {
+ (*results)->next_row = row;
+ }
+ if (lastrow != 0) {
+ lastrow->next_row = row;
+ }
+ lastrow = row;
+ }
+ } while (ret == SQLITE_ROW || ret == SQLITE_BUSY);
+
+ if (dbd_sqlite3_is_success(ret)) {
+ ret = 0;
+ }
+ return ret;
+}
+
+static int dbd_sqlite3_select(apr_pool_t *pool, apr_dbd_t *sql,
+ apr_dbd_results_t **results, const char *query,
+ int seek)
+{
+ sqlite3_stmt *stmt = NULL;
+ const char *tail = NULL;
+ int ret;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ apr_dbd_mutex_lock();
+
+ ret = sqlite3_prepare(sql->conn, query, strlen(query), &stmt, &tail);
+ if (dbd_sqlite3_is_success(ret)) {
+ ret = dbd_sqlite3_select_internal(pool, sql, results, stmt, seek);
+ }
+ sqlite3_finalize(stmt);
+
+ apr_dbd_mutex_unlock();
+
+ if (TXN_NOTICE_ERRORS(sql->trans)) {
+ sql->trans->errnum = ret;
+ }
+ return ret;
+}
+
+static const char *dbd_sqlite3_get_name(const apr_dbd_results_t *res, int n)
+{
+ if ((n < 0) || ((size_t)n >= res->sz)) {
+ return NULL;
+ }
+
+ return res->col_names[n];
+}
+
+static int dbd_sqlite3_get_row(apr_pool_t *pool, apr_dbd_results_t *res,
+ apr_dbd_row_t **rowp, int rownum)
+{
+ int i = 0;
+
+ if (rownum == -1) {
+ *rowp = res->next_row;
+ if (*rowp == 0)
+ return -1;
+ res->next_row = (*rowp)->next_row;
+ return 0;
+ }
+ if (rownum > res->tuples) {
+ return -1;
+ }
+ rownum--;
+ *rowp = res->next_row;
+ for (; *rowp != 0; i++, *rowp = (*rowp)->next_row) {
+ if (i == rownum) {
+ return 0;
+ }
+ }
+
+ return -1;
+
+}
+
+static const char *dbd_sqlite3_get_entry(const apr_dbd_row_t *row, int n)
+{
+ apr_dbd_column_t *column;
+ const char *value;
+ if ((n < 0) || (n >= row->columnCount)) {
+ return NULL;
+ }
+ column = row->columns[n];
+ value = column->value;
+ return value;
+}
+
+static apr_status_t dbd_sqlite3_datum_get(const apr_dbd_row_t *row, int n,
+ apr_dbd_type_e type, void *data)
+{
+ if ((n < 0) || ((size_t)n >= row->res->sz)) {
+ return APR_EGENERAL;
+ }
+
+ if (row->columns[n]->type == SQLITE_NULL) {
+ return APR_ENOENT;
+ }
+
+ switch (type) {
+ case APR_DBD_TYPE_TINY:
+ *(char*)data = atoi(row->columns[n]->value);
+ break;
+ case APR_DBD_TYPE_UTINY:
+ *(unsigned char*)data = atoi(row->columns[n]->value);
+ break;
+ case APR_DBD_TYPE_SHORT:
+ *(short*)data = atoi(row->columns[n]->value);
+ break;
+ case APR_DBD_TYPE_USHORT:
+ *(unsigned short*)data = atoi(row->columns[n]->value);
+ break;
+ case APR_DBD_TYPE_INT:
+ *(int*)data = atoi(row->columns[n]->value);
+ break;
+ case APR_DBD_TYPE_UINT:
+ *(unsigned int*)data = atoi(row->columns[n]->value);
+ break;
+ case APR_DBD_TYPE_LONG:
+ *(long*)data = atol(row->columns[n]->value);
+ break;
+ case APR_DBD_TYPE_ULONG:
+ *(unsigned long*)data = atol(row->columns[n]->value);
+ break;
+ case APR_DBD_TYPE_LONGLONG:
+ *(apr_int64_t*)data = apr_atoi64(row->columns[n]->value);
+ break;
+ case APR_DBD_TYPE_ULONGLONG:
+ *(apr_uint64_t*)data = apr_atoi64(row->columns[n]->value);
+ break;
+ case APR_DBD_TYPE_FLOAT:
+ *(float*)data = (float)atof(row->columns[n]->value);
+ break;
+ case APR_DBD_TYPE_DOUBLE:
+ *(double*)data = atof(row->columns[n]->value);
+ break;
+ case APR_DBD_TYPE_STRING:
+ case APR_DBD_TYPE_TEXT:
+ case APR_DBD_TYPE_TIME:
+ case APR_DBD_TYPE_DATE:
+ case APR_DBD_TYPE_DATETIME:
+ case APR_DBD_TYPE_TIMESTAMP:
+ case APR_DBD_TYPE_ZTIMESTAMP:
+ *(char**)data = row->columns[n]->value;
+ break;
+ case APR_DBD_TYPE_BLOB:
+ case APR_DBD_TYPE_CLOB:
+ {
+ apr_bucket *e;
+ apr_bucket_brigade *b = (apr_bucket_brigade*)data;
+
+ e = apr_bucket_pool_create(row->columns[n]->value,
+ row->columns[n]->size,
+ row->res->pool, b->bucket_alloc);
+ APR_BRIGADE_INSERT_TAIL(b, e);
+ }
+ break;
+ case APR_DBD_TYPE_NULL:
+ *(void**)data = NULL;
+ break;
+ default:
+ return APR_EGENERAL;
+ }
+
+ return APR_SUCCESS;
+}
+
+static const char *dbd_sqlite3_error(apr_dbd_t *sql, int n)
+{
+ return sqlite3_errmsg(sql->conn);
+}
+
+static int dbd_sqlite3_query_internal(apr_dbd_t *sql, sqlite3_stmt *stmt,
+ int *nrows)
+{
+ int ret = -1, retry_count = 0;
+
+ while(retry_count++ <= MAX_RETRY_COUNT) {
+ ret = sqlite3_step(stmt);
+ if (ret != SQLITE_BUSY)
+ break;
+
+ apr_dbd_mutex_unlock();
+ apr_sleep(MAX_RETRY_SLEEP);
+ apr_dbd_mutex_lock();
+ }
+
+ *nrows = sqlite3_changes(sql->conn);
+
+ if (dbd_sqlite3_is_success(ret)) {
+ ret = 0;
+ }
+ return ret;
+}
+
+static int dbd_sqlite3_query(apr_dbd_t *sql, int *nrows, const char *query)
+{
+ sqlite3_stmt *stmt = NULL;
+ const char *tail = NULL;
+ int ret = -1, length = 0;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ length = strlen(query);
+ apr_dbd_mutex_lock();
+
+ do {
+ ret = sqlite3_prepare(sql->conn, query, length, &stmt, &tail);
+ if (ret != SQLITE_OK) {
+ sqlite3_finalize(stmt);
+ break;
+ }
+
+ ret = dbd_sqlite3_query_internal(sql, stmt, nrows);
+
+ sqlite3_finalize(stmt);
+ length -= (tail - query);
+ query = tail;
+ } while (length > 0);
+
+ apr_dbd_mutex_unlock();
+
+ if (TXN_NOTICE_ERRORS(sql->trans)) {
+ sql->trans->errnum = ret;
+ }
+ return ret;
+}
+
+static apr_status_t free_mem(void *data)
+{
+ sqlite3_free(data);
+ return APR_SUCCESS;
+}
+
+static const char *dbd_sqlite3_escape(apr_pool_t *pool, const char *arg,
+ apr_dbd_t *sql)
+{
+ char *ret = sqlite3_mprintf("%q", arg);
+ apr_pool_cleanup_register(pool, ret, free_mem,
+ apr_pool_cleanup_null);
+ return ret;
+}
+
+static int dbd_sqlite3_prepare(apr_pool_t *pool, apr_dbd_t *sql,
+ const char *query, const char *label,
+ int nargs, int nvals, apr_dbd_type_e *types,
+ apr_dbd_prepared_t **statement)
+{
+ sqlite3_stmt *stmt;
+ const char *tail = NULL;
+ int ret;
+
+ apr_dbd_mutex_lock();
+
+ ret = sqlite3_prepare(sql->conn, query, strlen(query), &stmt, &tail);
+ if (ret == SQLITE_OK) {
+ apr_dbd_prepared_t *prep;
+
+ prep = apr_pcalloc(sql->pool, sizeof(*prep));
+ prep->stmt = stmt;
+ prep->next = sql->prep;
+ prep->nargs = nargs;
+ prep->nvals = nvals;
+ prep->types = types;
+
+ /* link new statement to the handle */
+ sql->prep = prep;
+
+ *statement = prep;
+ } else {
+ sqlite3_finalize(stmt);
+ }
+
+ apr_dbd_mutex_unlock();
+
+ return ret;
+}
+
+static void dbd_sqlite3_bind(apr_dbd_prepared_t *statement, const char **values)
+{
+ sqlite3_stmt *stmt = statement->stmt;
+ int i, j;
+
+ for (i = 0, j = 0; i < statement->nargs; i++, j++) {
+ if (values[j] == NULL) {
+ sqlite3_bind_null(stmt, i + 1);
+ }
+ else {
+ switch (statement->types[i]) {
+ case APR_DBD_TYPE_BLOB:
+ case APR_DBD_TYPE_CLOB:
+ {
+ char *data = (char *)values[j];
+ int size = atoi((char*)values[++j]);
+
+ /* skip table and column */
+ j += 2;
+
+ sqlite3_bind_blob(stmt, i + 1, data, size, SQLITE_STATIC);
+ }
+ break;
+ default:
+ sqlite3_bind_text(stmt, i + 1, values[j],
+ strlen(values[j]), SQLITE_STATIC);
+ break;
+ }
+ }
+ }
+
+ return;
+}
+
+static int dbd_sqlite3_pquery(apr_pool_t *pool, apr_dbd_t *sql,
+ int *nrows, apr_dbd_prepared_t *statement,
+ const char **values)
+{
+ sqlite3_stmt *stmt = statement->stmt;
+ int ret = -1;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ apr_dbd_mutex_lock();
+
+ ret = sqlite3_reset(stmt);
+ if (ret == SQLITE_OK) {
+ dbd_sqlite3_bind(statement, values);
+
+ ret = dbd_sqlite3_query_internal(sql, stmt, nrows);
+
+ sqlite3_reset(stmt);
+ }
+
+ apr_dbd_mutex_unlock();
+
+ if (TXN_NOTICE_ERRORS(sql->trans)) {
+ sql->trans->errnum = ret;
+ }
+ return ret;
+}
+
+static int dbd_sqlite3_pvquery(apr_pool_t *pool, apr_dbd_t *sql, int *nrows,
+ apr_dbd_prepared_t *statement, va_list args)
+{
+ const char **values;
+ int i;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ values = apr_palloc(pool, sizeof(*values) * statement->nvals);
+
+ for (i = 0; i < statement->nvals; i++) {
+ values[i] = va_arg(args, const char*);
+ }
+
+ return dbd_sqlite3_pquery(pool, sql, nrows, statement, values);
+}
+
+static int dbd_sqlite3_pselect(apr_pool_t *pool, apr_dbd_t *sql,
+ apr_dbd_results_t **results,
+ apr_dbd_prepared_t *statement, int seek,
+ const char **values)
+{
+ sqlite3_stmt *stmt = statement->stmt;
+ int ret;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ apr_dbd_mutex_lock();
+
+ ret = sqlite3_reset(stmt);
+ if (ret == SQLITE_OK) {
+ dbd_sqlite3_bind(statement, values);
+
+ ret = dbd_sqlite3_select_internal(pool, sql, results, stmt, seek);
+
+ sqlite3_reset(stmt);
+ }
+
+ apr_dbd_mutex_unlock();
+
+ if (TXN_NOTICE_ERRORS(sql->trans)) {
+ sql->trans->errnum = ret;
+ }
+ return ret;
+}
+
+static int dbd_sqlite3_pvselect(apr_pool_t *pool, apr_dbd_t *sql,
+ apr_dbd_results_t **results,
+ apr_dbd_prepared_t *statement, int seek,
+ va_list args)
+{
+ const char **values;
+ int i;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ values = apr_palloc(pool, sizeof(*values) * statement->nvals);
+
+ for (i = 0; i < statement->nvals; i++) {
+ values[i] = va_arg(args, const char*);
+ }
+
+ return dbd_sqlite3_pselect(pool, sql, results, statement, seek, values);
+}
+
+static void dbd_sqlite3_bbind(apr_dbd_prepared_t * statement,
+ const void **values)
+{
+ sqlite3_stmt *stmt = statement->stmt;
+ int i, j;
+ apr_dbd_type_e type;
+
+ for (i = 0, j = 0; i < statement->nargs; i++, j++) {
+ type = (values[j] == NULL ? APR_DBD_TYPE_NULL : statement->types[i]);
+
+ switch (type) {
+ case APR_DBD_TYPE_TINY:
+ sqlite3_bind_int(stmt, i + 1, *(char*)values[j]);
+ break;
+ case APR_DBD_TYPE_UTINY:
+ sqlite3_bind_int(stmt, i + 1, *(unsigned char*)values[j]);
+ break;
+ case APR_DBD_TYPE_SHORT:
+ sqlite3_bind_int(stmt, i + 1, *(short*)values[j]);
+ break;
+ case APR_DBD_TYPE_USHORT:
+ sqlite3_bind_int(stmt, i + 1, *(unsigned short*)values[j]);
+ break;
+ case APR_DBD_TYPE_INT:
+ sqlite3_bind_int(stmt, i + 1, *(int*)values[j]);
+ break;
+ case APR_DBD_TYPE_UINT:
+ sqlite3_bind_int(stmt, i + 1, *(unsigned int*)values[j]);
+ break;
+ case APR_DBD_TYPE_LONG:
+ sqlite3_bind_int64(stmt, i + 1, *(long*)values[j]);
+ break;
+ case APR_DBD_TYPE_ULONG:
+ sqlite3_bind_int64(stmt, i + 1, *(unsigned long*)values[j]);
+ break;
+ case APR_DBD_TYPE_LONGLONG:
+ sqlite3_bind_int64(stmt, i + 1, *(apr_int64_t*)values[j]);
+ break;
+ case APR_DBD_TYPE_ULONGLONG:
+ sqlite3_bind_int64(stmt, i + 1, *(apr_uint64_t*)values[j]);
+ break;
+ case APR_DBD_TYPE_FLOAT:
+ sqlite3_bind_double(stmt, i + 1, *(float*)values[j]);
+ break;
+ case APR_DBD_TYPE_DOUBLE:
+ sqlite3_bind_double(stmt, i + 1, *(double*)values[j]);
+ break;
+ case APR_DBD_TYPE_STRING:
+ case APR_DBD_TYPE_TEXT:
+ case APR_DBD_TYPE_TIME:
+ case APR_DBD_TYPE_DATE:
+ case APR_DBD_TYPE_DATETIME:
+ case APR_DBD_TYPE_TIMESTAMP:
+ case APR_DBD_TYPE_ZTIMESTAMP:
+ sqlite3_bind_text(stmt, i + 1, values[j], strlen(values[j]),
+ SQLITE_STATIC);
+ break;
+ case APR_DBD_TYPE_BLOB:
+ case APR_DBD_TYPE_CLOB:
+ {
+ char *data = (char*)values[j];
+ apr_size_t size = *(apr_size_t*)values[++j];
+
+ sqlite3_bind_blob(stmt, i + 1, data, size, SQLITE_STATIC);
+
+ /* skip table and column */
+ j += 2;
+ }
+ break;
+ case APR_DBD_TYPE_NULL:
+ default:
+ sqlite3_bind_null(stmt, i + 1);
+ break;
+ }
+ }
+
+ return;
+}
+
+static int dbd_sqlite3_pbquery(apr_pool_t * pool, apr_dbd_t * sql,
+ int *nrows, apr_dbd_prepared_t * statement,
+ const void **values)
+{
+ sqlite3_stmt *stmt = statement->stmt;
+ int ret = -1;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ apr_dbd_mutex_lock();
+
+ ret = sqlite3_reset(stmt);
+ if (ret == SQLITE_OK) {
+ dbd_sqlite3_bbind(statement, values);
+
+ ret = dbd_sqlite3_query_internal(sql, stmt, nrows);
+
+ sqlite3_reset(stmt);
+ }
+
+ apr_dbd_mutex_unlock();
+
+ if (TXN_NOTICE_ERRORS(sql->trans)) {
+ sql->trans->errnum = ret;
+ }
+ return ret;
+}
+
+static int dbd_sqlite3_pvbquery(apr_pool_t * pool, apr_dbd_t * sql,
+ int *nrows, apr_dbd_prepared_t * statement,
+ va_list args)
+{
+ const void **values;
+ int i;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ values = apr_palloc(pool, sizeof(*values) * statement->nvals);
+
+ for (i = 0; i < statement->nvals; i++) {
+ values[i] = va_arg(args, const void*);
+ }
+
+ return dbd_sqlite3_pbquery(pool, sql, nrows, statement, values);
+}
+
+static int dbd_sqlite3_pbselect(apr_pool_t * pool, apr_dbd_t * sql,
+ apr_dbd_results_t ** results,
+ apr_dbd_prepared_t * statement,
+ int seek, const void **values)
+{
+ sqlite3_stmt *stmt = statement->stmt;
+ int ret;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ apr_dbd_mutex_lock();
+
+ ret = sqlite3_reset(stmt);
+ if (ret == SQLITE_OK) {
+ dbd_sqlite3_bbind(statement, values);
+
+ ret = dbd_sqlite3_select_internal(pool, sql, results, stmt, seek);
+
+ sqlite3_reset(stmt);
+ }
+
+ apr_dbd_mutex_unlock();
+
+ if (TXN_NOTICE_ERRORS(sql->trans)) {
+ sql->trans->errnum = ret;
+ }
+ return ret;
+}
+
+static int dbd_sqlite3_pvbselect(apr_pool_t * pool, apr_dbd_t * sql,
+ apr_dbd_results_t ** results,
+ apr_dbd_prepared_t * statement, int seek,
+ va_list args)
+{
+ const void **values;
+ int i;
+
+ if (sql->trans && sql->trans->errnum) {
+ return sql->trans->errnum;
+ }
+
+ values = apr_palloc(pool, sizeof(*values) * statement->nvals);
+
+ for (i = 0; i < statement->nvals; i++) {
+ values[i] = va_arg(args, const void*);
+ }
+
+ return dbd_sqlite3_pbselect(pool, sql, results, statement, seek, values);
+}
+
+static int dbd_sqlite3_start_transaction(apr_pool_t *pool,
+ apr_dbd_t *handle,
+ apr_dbd_transaction_t **trans)
+{
+ int ret = 0;
+ int nrows = 0;
+
+ ret = dbd_sqlite3_query(handle, &nrows, "BEGIN IMMEDIATE");
+ if (!*trans) {
+ *trans = apr_pcalloc(pool, sizeof(apr_dbd_transaction_t));
+ (*trans)->handle = handle;
+ handle->trans = *trans;
+ }
+
+ return ret;
+}
+
+static int dbd_sqlite3_end_transaction(apr_dbd_transaction_t *trans)
+{
+ int ret = -1; /* ending transaction that was never started is an error */
+ int nrows = 0;
+
+ if (trans) {
+ /* rollback on error or explicit rollback request */
+ if (trans->errnum || TXN_DO_ROLLBACK(trans)) {
+ trans->errnum = 0;
+ ret = dbd_sqlite3_query(trans->handle, &nrows, "ROLLBACK");
+ } else {
+ ret = dbd_sqlite3_query(trans->handle, &nrows, "COMMIT");
+ }
+ trans->handle->trans = NULL;
+ }
+
+ return ret;
+}
+
+static int dbd_sqlite3_transaction_mode_get(apr_dbd_transaction_t *trans)
+{
+ if (!trans)
+ return APR_DBD_TRANSACTION_COMMIT;
+
+ return trans->mode;
+}
+
+static int dbd_sqlite3_transaction_mode_set(apr_dbd_transaction_t *trans,
+ int mode)
+{
+ if (!trans)
+ return APR_DBD_TRANSACTION_COMMIT;
+
+ return trans->mode = (mode & TXN_MODE_BITS);
+}
+
+static apr_dbd_t *dbd_sqlite3_open(apr_pool_t *pool, const char *params,
+ const char **error)
+{
+ apr_dbd_t *sql = NULL;
+ sqlite3 *conn = NULL;
+ int sqlres;
+ if (!params)
+ return NULL;
+ sqlres = sqlite3_open(params, &conn);
+ if (sqlres != SQLITE_OK) {
+ if (error) {
+ *error = apr_pstrdup(pool, sqlite3_errmsg(conn));
+ }
+ sqlite3_close(conn);
+ return NULL;
+ }
+ /* should we register rand or power functions to the sqlite VM? */
+ sql = apr_pcalloc(pool, sizeof(*sql));
+ sql->conn = conn;
+ sql->pool = pool;
+ sql->trans = NULL;
+
+ return sql;
+}
+
+static apr_status_t dbd_sqlite3_close(apr_dbd_t *handle)
+{
+ apr_dbd_prepared_t *prep = handle->prep;
+
+ /* finalize all prepared statements, or we'll get SQLITE_BUSY on close */
+ while (prep) {
+ sqlite3_finalize(prep->stmt);
+ prep = prep->next;
+ }
+
+ sqlite3_close(handle->conn);
+ return APR_SUCCESS;
+}
+
+static apr_status_t dbd_sqlite3_check_conn(apr_pool_t *pool,
+ apr_dbd_t *handle)
+{
+ return (handle->conn != NULL) ? APR_SUCCESS : APR_EGENERAL;
+}
+
+static int dbd_sqlite3_select_db(apr_pool_t *pool, apr_dbd_t *handle,
+ const char *name)
+{
+ return APR_ENOTIMPL;
+}
+
+static void *dbd_sqlite3_native(apr_dbd_t *handle)
+{
+ return handle->conn;
+}
+
+static int dbd_sqlite3_num_cols(apr_dbd_results_t *res)
+{
+ return res->sz;
+}
+
+static int dbd_sqlite3_num_tuples(apr_dbd_results_t *res)
+{
+ return res->tuples;
+}
+
+APU_MODULE_DECLARE_DATA const apr_dbd_driver_t apr_dbd_sqlite3_driver = {
+ "sqlite3",
+ NULL,
+ dbd_sqlite3_native,
+ dbd_sqlite3_open,
+ dbd_sqlite3_check_conn,
+ dbd_sqlite3_close,
+ dbd_sqlite3_select_db,
+ dbd_sqlite3_start_transaction,
+ dbd_sqlite3_end_transaction,
+ dbd_sqlite3_query,
+ dbd_sqlite3_select,
+ dbd_sqlite3_num_cols,
+ dbd_sqlite3_num_tuples,
+ dbd_sqlite3_get_row,
+ dbd_sqlite3_get_entry,
+ dbd_sqlite3_error,
+ dbd_sqlite3_escape,
+ dbd_sqlite3_prepare,
+ dbd_sqlite3_pvquery,
+ dbd_sqlite3_pvselect,
+ dbd_sqlite3_pquery,
+ dbd_sqlite3_pselect,
+ dbd_sqlite3_get_name,
+ dbd_sqlite3_transaction_mode_get,
+ dbd_sqlite3_transaction_mode_set,
+ "?",
+ dbd_sqlite3_pvbquery,
+ dbd_sqlite3_pvbselect,
+ dbd_sqlite3_pbquery,
+ dbd_sqlite3_pbselect,
+ dbd_sqlite3_datum_get
+};
+#endif
diff --git a/contrib/apr-util/dbm/NWGNUdbmdb b/contrib/apr-util/dbm/NWGNUdbmdb
new file mode 100644
index 000000000000..748c32f5f8ed
--- /dev/null
+++ b/contrib/apr-util/dbm/NWGNUdbmdb
@@ -0,0 +1,299 @@
+#
+# Declare the sub-directories to be built here
+#
+
+SUBDIRS = \
+ $(EOLIST)
+
+#
+# Get the 'head' of the build environment. This includes default targets and
+# paths to tools
+#
+
+ifndef EnvironmentDefined
+include $(APR_WORK)/build/NWGNUhead.inc
+endif
+
+#
+# build this level's files
+
+#
+# Make sure all needed macro's are defined
+#
+
+# LINK_STATIC = 1
+
+# for now defined here - should finally go into build/NWGNUenvironment.inc
+DB_INC = $(DBSDK)/inc
+DB_IMP = libdb47.imp
+DB_LIB = libdb47.lib
+DB_NLM = libdb47
+
+#
+# These directories will be at the beginning of the include list, followed by
+# INCDIRS
+#
+XINCDIRS += \
+ $(APR)/include/arch/netware \
+ $(APR)/include \
+ $(APU)/include \
+ $(APU)/include/private \
+ $(APR) \
+ $(DB_INC) \
+ $(EOLIST)
+
+#
+# These flags will come after CFLAGS
+#
+XCFLAGS += \
+ $(EOLIST)
+
+#
+# These defines will come after DEFINES
+#
+XDEFINES += \
+ -DAPU_DSO_MODULE_BUILD \
+ -DAPU_HAVE_DB=1 \
+ -DAPU_HAVE_DB_VERSION=4 \
+ $(EOLIST)
+
+#
+# These flags will be added to the link.opt file
+#
+XLFLAGS += \
+ $(EOLIST)
+
+ifdef LINK_STATIC
+XLFLAGS += \
+ -l $(DBSDK)/lib \
+ $(EOLIST)
+else
+XLFLAGS += \
+ -l $(DBSDK)/imp \
+ $(EOLIST)
+endif
+
+#
+# These values will be appended to the correct variables based on the value of
+# RELEASE
+#
+ifeq "$(RELEASE)" "debug"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "noopt"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "release"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+#
+# These are used by the link target if an NLM is being generated
+# This is used by the link 'name' directive to name the nlm. If left blank
+# TARGET_nlm (see below) will be used.
+#
+NLM_NAME = dbmdb
+
+#
+# This is used by the link '-desc ' directive.
+# If left blank, NLM_NAME will be used.
+#
+NLM_DESCRIPTION = Apache Portability Runtime Library $(VERSION_STR) DBM Berkeley DB Driver Module
+
+#
+# This is used by the '-threadname' directive. If left blank,
+# NLM_NAME Thread will be used.
+#
+NLM_THREAD_NAME = dbmdb
+
+#
+# If this is specified, it will override VERSION value in
+# $(AP_WORK)\build\NWGNUenvironment.inc
+#
+NLM_VERSION =
+
+#
+# If this is specified, it will override the default of 64K
+#
+NLM_STACK_SIZE = 8192
+
+
+#
+# If this is specified it will be used by the link '-entry' directive
+#
+NLM_ENTRY_SYM =
+
+#
+# If this is specified it will be used by the link '-exit' directive
+#
+NLM_EXIT_SYM =
+
+#
+# If this is specified it will be used by the link '-check' directive
+#
+NLM_CHECK_SYM =
+
+#
+# If these are specified it will be used by the link '-flags' directive
+#
+NLM_FLAGS =
+
+#
+# If this is specified it will be linked in with the XDCData option in the def
+# file instead of the default of $(NWOS)/apache.xdc. XDCData can be disabled
+# by setting APACHE_UNIPROC in the environment
+#
+XDCDATA =
+
+#
+# If there is an NLM target, put it here
+#
+TARGET_nlm = \
+ $(OBJDIR)\$(NLM_NAME).nlm \
+ $(EOLIST)
+
+#
+# If there is an LIB target, put it here
+#
+TARGET_lib = \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the NLM target above.
+# Paths must all use the '/' character
+#
+FILES_nlm_objs = \
+ $(OBJDIR)/apr_dbm_berkeleydb.o \
+ $(EOLIST)
+
+#
+# These are the LIB files needed to create the NLM target above.
+# These will be added as a library command in the link.opt file.
+#
+FILES_nlm_libs = \
+ $(PRELUDE) \
+ $(EOLIST)
+
+ifeq ($(LINK_STATIC),1)
+FILES_nlm_libs += \
+ $(DB_LIB) \
+ $(EOLIST)
+endif
+
+#
+# These are the modules that the above NLM target depends on to load.
+# These will be added as a module command in the link.opt file.
+#
+FILES_nlm_modules = \
+ aprlib \
+ libc \
+ $(EOLIST)
+
+ifneq ($(LINK_STATIC),1)
+FILES_nlm_modules += \
+ $(DB_NLM) \
+ $(EOLIST)
+endif
+
+#
+# If the nlm has a msg file, put it's path here
+#
+FILE_nlm_msg =
+
+#
+# If the nlm has a hlp file put it's path here
+#
+FILE_nlm_hlp =
+
+#
+# If this is specified, it will override $(NWOS)\copyright.txt.
+#
+FILE_nlm_copyright =
+
+#
+# Any additional imports go here
+#
+FILES_nlm_Ximports = \
+ @aprlib.imp \
+ @libc.imp \
+ $(EOLIST)
+
+ifneq ($(LINK_STATIC),1)
+FILES_nlm_Ximports += \
+ @$(DB_IMP) \
+ $(EOLIST)
+endif
+
+#
+# Any symbols exported to here
+#
+FILES_nlm_exports = \
+ apr_dbm_type_db \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the LIB target above.
+# Paths must all use the '/' character
+#
+FILES_lib_objs = \
+ $(EOLIST)
+
+#
+# implement targets and dependancies (leave this section alone)
+#
+
+libs :: $(OBJDIR) $(TARGET_lib)
+
+nlms :: libs $(TARGET_nlm)
+
+#
+# Updated this target to create necessary directories and copy files to the
+# correct place. (See $(AP_WORK)\build\NWGNUhead.inc for examples)
+#
+install :: nlms FORCE
+
+#
+# Any specialized rules here
+#
+
+#
+# Include the 'tail' makefile that has targets that depend on variables defined
+# in this makefile
+#
+
+include $(APRBUILD)/NWGNUtail.inc
+
+
+
diff --git a/contrib/apr-util/dbm/NWGNUdbmgdbm b/contrib/apr-util/dbm/NWGNUdbmgdbm
new file mode 100644
index 000000000000..ce61306f4907
--- /dev/null
+++ b/contrib/apr-util/dbm/NWGNUdbmgdbm
@@ -0,0 +1,298 @@
+#
+# Declare the sub-directories to be built here
+#
+
+SUBDIRS = \
+ $(EOLIST)
+
+#
+# Get the 'head' of the build environment. This includes default targets and
+# paths to tools
+#
+
+ifndef EnvironmentDefined
+include $(APR_WORK)/build/NWGNUhead.inc
+endif
+
+#
+# build this level's files
+
+#
+# Make sure all needed macro's are defined
+#
+
+# LINK_STATIC = 1
+
+# for now defined here - should finally go into build/NWGNUenvironment.inc
+GDBM_INC = $(GDBMSDK)/inc
+GDBM_IMP = libgdbm.imp
+GDBM_LIB = libgdbm.lib
+GDBM_NLM = libgdbm
+
+#
+# These directories will be at the beginning of the include list, followed by
+# INCDIRS
+#
+XINCDIRS += \
+ $(APR)/include/arch/netware \
+ $(APR)/include \
+ $(APU)/include \
+ $(APU)/include/private \
+ $(APR) \
+ $(GDBM_INC) \
+ $(EOLIST)
+
+#
+# These flags will come after CFLAGS
+#
+XCFLAGS += \
+ $(EOLIST)
+
+#
+# These defines will come after DEFINES
+#
+XDEFINES += \
+ -DAPU_DSO_MODULE_BUILD \
+ -DAPU_HAVE_GDBM=1 \
+ $(EOLIST)
+
+#
+# These flags will be added to the link.opt file
+#
+XLFLAGS += \
+ $(EOLIST)
+
+ifdef LINK_STATIC
+XLFLAGS += \
+ -l $(GDBMSDK)/lib \
+ $(EOLIST)
+else
+XLFLAGS += \
+ -l $(GDBMSDK)/imp \
+ $(EOLIST)
+endif
+
+#
+# These values will be appended to the correct variables based on the value of
+# RELEASE
+#
+ifeq "$(RELEASE)" "debug"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "noopt"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "release"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+#
+# These are used by the link target if an NLM is being generated
+# This is used by the link 'name' directive to name the nlm. If left blank
+# TARGET_nlm (see below) will be used.
+#
+NLM_NAME = dbmgdbm
+
+#
+# This is used by the link '-desc ' directive.
+# If left blank, NLM_NAME will be used.
+#
+NLM_DESCRIPTION = Apache Portability Runtime Library $(VERSION_STR) GDBM Driver Module
+
+#
+# This is used by the '-threadname' directive. If left blank,
+# NLM_NAME Thread will be used.
+#
+NLM_THREAD_NAME = dbmgdbm
+
+#
+# If this is specified, it will override VERSION value in
+# $(AP_WORK)\build\NWGNUenvironment.inc
+#
+NLM_VERSION =
+
+#
+# If this is specified, it will override the default of 64K
+#
+NLM_STACK_SIZE = 8192
+
+
+#
+# If this is specified it will be used by the link '-entry' directive
+#
+NLM_ENTRY_SYM =
+
+#
+# If this is specified it will be used by the link '-exit' directive
+#
+NLM_EXIT_SYM =
+
+#
+# If this is specified it will be used by the link '-check' directive
+#
+NLM_CHECK_SYM =
+
+#
+# If these are specified it will be used by the link '-flags' directive
+#
+NLM_FLAGS =
+
+#
+# If this is specified it will be linked in with the XDCData option in the def
+# file instead of the default of $(NWOS)/apache.xdc. XDCData can be disabled
+# by setting APACHE_UNIPROC in the environment
+#
+XDCDATA =
+
+#
+# If there is an NLM target, put it here
+#
+TARGET_nlm = \
+ $(OBJDIR)\$(NLM_NAME).nlm \
+ $(EOLIST)
+
+#
+# If there is an LIB target, put it here
+#
+TARGET_lib = \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the NLM target above.
+# Paths must all use the '/' character
+#
+FILES_nlm_objs = \
+ $(OBJDIR)/apr_dbm_gdbm.o \
+ $(EOLIST)
+
+#
+# These are the LIB files needed to create the NLM target above.
+# These will be added as a library command in the link.opt file.
+#
+FILES_nlm_libs = \
+ $(PRELUDE) \
+ $(EOLIST)
+
+ifeq ($(LINK_STATIC),1)
+FILES_nlm_libs += \
+ $(GDBM_LIB) \
+ $(EOLIST)
+endif
+
+#
+# These are the modules that the above NLM target depends on to load.
+# These will be added as a module command in the link.opt file.
+#
+FILES_nlm_modules = \
+ aprlib \
+ libc \
+ $(EOLIST)
+
+ifneq ($(LINK_STATIC),1)
+FILES_nlm_modules += \
+ $(GDBM_NLM) \
+ $(EOLIST)
+endif
+
+#
+# If the nlm has a msg file, put it's path here
+#
+FILE_nlm_msg =
+
+#
+# If the nlm has a hlp file put it's path here
+#
+FILE_nlm_hlp =
+
+#
+# If this is specified, it will override $(NWOS)\copyright.txt.
+#
+FILE_nlm_copyright =
+
+#
+# Any additional imports go here
+#
+FILES_nlm_Ximports = \
+ @aprlib.imp \
+ @libc.imp \
+ $(EOLIST)
+
+ifneq ($(LINK_STATIC),1)
+FILES_nlm_Ximports += \
+ @$(GDBM_IMP) \
+ $(EOLIST)
+endif
+
+#
+# Any symbols exported to here
+#
+FILES_nlm_exports = \
+ apr_dbm_type_gdbm \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the LIB target above.
+# Paths must all use the '/' character
+#
+FILES_lib_objs = \
+ $(EOLIST)
+
+#
+# implement targets and dependancies (leave this section alone)
+#
+
+libs :: $(OBJDIR) $(TARGET_lib)
+
+nlms :: libs $(TARGET_nlm)
+
+#
+# Updated this target to create necessary directories and copy files to the
+# correct place. (See $(AP_WORK)\build\NWGNUhead.inc for examples)
+#
+install :: nlms FORCE
+
+#
+# Any specialized rules here
+#
+
+#
+# Include the 'tail' makefile that has targets that depend on variables defined
+# in this makefile
+#
+
+include $(APRBUILD)/NWGNUtail.inc
+
+
+
diff --git a/contrib/apr-util/dbm/NWGNUmakefile b/contrib/apr-util/dbm/NWGNUmakefile
new file mode 100644
index 000000000000..7e610fec270a
--- /dev/null
+++ b/contrib/apr-util/dbm/NWGNUmakefile
@@ -0,0 +1,251 @@
+#
+# Declare the sub-directories to be built here
+#
+
+SUBDIRS = \
+ $(EOLIST)
+
+#
+# Get the 'head' of the build environment. This includes default targets and
+# paths to tools
+#
+
+include $(APR_WORK)/build/NWGNUhead.inc
+
+#
+# build this level's files
+
+#
+# Make sure all needed macro's are defined
+#
+
+#
+# These directories will be at the beginning of the include list, followed by
+# INCDIRS
+#
+XINCDIRS += \
+ $(EOLIST)
+
+#
+# These flags will come after CFLAGS
+#
+XCFLAGS += \
+ $(EOLIST)
+
+#
+# These defines will come after DEFINES
+#
+XDEFINES += \
+ $(EOLIST)
+
+#
+# These flags will be added to the link.opt file
+#
+XLFLAGS += \
+ $(EOLIST)
+
+#
+# These values will be appended to the correct variables based on the value of
+# RELEASE
+#
+ifeq "$(RELEASE)" "debug"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "noopt"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "release"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+#
+# These are used by the link target if an NLM is being generated
+# This is used by the link 'name' directive to name the nlm. If left blank
+# TARGET_nlm (see below) will be used.
+#
+NLM_NAME =
+
+#
+# This is used by the link '-desc ' directive.
+# If left blank, NLM_NAME will be used.
+#
+NLM_DESCRIPTION =
+
+#
+# This is used by the '-threadname' directive. If left blank,
+# NLM_NAME Thread will be used.
+#
+NLM_THREAD_NAME =
+
+#
+# If this is specified, it will override VERSION value in
+# $(AP_WORK)\build\NWGNUenvironment.inc
+#
+NLM_VERSION =
+
+#
+# If this is specified, it will override the default of 64K
+#
+NLM_STACK_SIZE =
+
+
+#
+# If this is specified it will be used by the link '-entry' directive
+#
+NLM_ENTRY_SYM =
+
+#
+# If this is specified it will be used by the link '-exit' directive
+#
+NLM_EXIT_SYM =
+
+#
+# If this is specified it will be used by the link '-check' directive
+#
+NLM_CHECK_SYM =
+
+#
+# If these are specified it will be used by the link '-flags' directive
+#
+NLM_FLAGS =
+
+#
+# If this is specified it will be linked in with the XDCData option in the def
+# file instead of the default of $(NWOS)/apache.xdc. XDCData can be disabled
+# by setting APACHE_UNIPROC in the environment
+#
+XDCDATA =
+
+#
+# If there is an NLM target, put it here
+#
+TARGET_nlm = \
+ $(EOLIST)
+
+ifeq "$(APU_HAVE_DB)" "1"
+TARGET_nlm += $(OBJDIR)/dbmdb.nlm $(OBJDIR)/dbmdb.nlm $(EOLIST)
+endif
+ifeq "$(APU_HAVE_GDBM)" "1"
+TARGET_nlm += $(OBJDIR)/dbmgdbm.nlm $(OBJDIR)/dbmgdbm.nlm $(EOLIST)
+endif
+
+#
+# If there is an LIB target, put it here
+#
+TARGET_lib = \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the NLM target above.
+# Paths must all use the '/' character
+#
+FILES_nlm_objs = \
+ $(EOLIST)
+
+#
+# These are the LIB files needed to create the NLM target above.
+# These will be added as a library command in the link.opt file.
+#
+FILES_nlm_libs = \
+ $(EOLIST)
+
+#
+# These are the modules that the above NLM target depends on to load.
+# These will be added as a module command in the link.opt file.
+#
+FILES_nlm_modules = \
+ $(EOLIST)
+
+#
+# If the nlm has a msg file, put it's path here
+#
+FILE_nlm_msg =
+
+#
+# If the nlm has a hlp file put it's path here
+#
+FILE_nlm_hlp =
+
+#
+# If this is specified, it will override $(NWOS)\copyright.txt.
+#
+FILE_nlm_copyright =
+
+#
+# Any additional imports go here
+#
+FILES_nlm_Ximports = \
+ $(EOLIST)
+
+#
+# Any symbols exported to here
+#
+FILES_nlm_exports = \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the LIB target above.
+# Paths must all use the '/' character
+#
+FILES_lib_objs = \
+ $(EOLIST)
+
+#
+# implement targets and dependancies (leave this section alone)
+#
+
+libs :: $(OBJDIR) $(TARGET_lib)
+
+nlms :: libs $(TARGET_nlm)
+
+#
+# Updated this target to create necessary directories and copy files to the
+# correct place. (See $(AP_WORK)\build\NWGNUhead.inc for examples)
+#
+install :: nlms $(INSTDIRS) FORCE
+ $(call COPY,$(OBJDIR)/*.nlm,$(INSTALLBASE))
+
+#
+# Any specialized rules here
+#
+
+#
+# Include the 'tail' makefile that has targets that depend on variables defined
+# in this makefile
+#
+
+include $(APRBUILD)/NWGNUtail.inc
+
+
diff --git a/contrib/apr-util/dbm/apr_dbm.c b/contrib/apr-util/dbm/apr_dbm.c
new file mode 100644
index 000000000000..8b58f8331cd2
--- /dev/null
+++ b/contrib/apr-util/dbm/apr_dbm.c
@@ -0,0 +1,307 @@
+/* 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.h"
+#include "apr_dso.h"
+#include "apr_hash.h"
+#include "apr_errno.h"
+#include "apr_pools.h"
+#include "apr_strings.h"
+#define APR_WANT_MEMFUNC
+#define APR_WANT_STRFUNC
+#include "apr_want.h"
+#include "apr_general.h"
+#include "apr_atomic.h"
+
+#include "apu_config.h"
+#include "apu.h"
+#include "apu_internal.h"
+#include "apu_version.h"
+#include "apr_dbm_private.h"
+#include "apu_select_dbm.h"
+#include "apr_dbm.h"
+#include "apr_dbm_private.h"
+
+/* ### note: the setting of DBM_VTABLE will go away once we have multiple
+ ### DBMs in here.
+ ### Well, that day is here. So, do we remove DBM_VTABLE and the old
+ ### API entirely? Oh, what to do. We need an APU_DEFAULT_DBM #define.
+ ### Sounds like a job for autoconf. */
+
+#if APU_USE_DB
+#define DBM_VTABLE apr_dbm_type_db
+#define DBM_NAME "db"
+#elif APU_USE_GDBM
+#define DBM_VTABLE apr_dbm_type_gdbm
+#define DBM_NAME "gdbm"
+#elif APU_USE_NDBM
+#define DBM_VTABLE apr_dbm_type_ndbm
+#define DBM_NAME "ndbm"
+#elif APU_USE_SDBM
+#define DBM_VTABLE apr_dbm_type_sdbm
+#define DBM_NAME "sdbm"
+#else /* Not in the USE_xDBM list above */
+#error a DBM implementation was not specified
+#endif
+
+#if APU_DSO_BUILD
+
+static apr_hash_t *drivers = NULL;
+static apr_uint32_t initialised = 0, in_init = 1;
+
+static apr_status_t dbm_term(void *ptr)
+{
+ /* set drivers to NULL so init can work again */
+ drivers = NULL;
+
+ /* Everything else we need is handled by cleanups registered
+ * when we created mutexes and loaded DSOs
+ */
+ return APR_SUCCESS;
+}
+
+#endif /* APU_DSO_BUILD */
+
+static apr_status_t dbm_open_type(apr_dbm_type_t const* * vtable,
+ const char *type,
+ apr_pool_t *pool)
+{
+#if !APU_DSO_BUILD
+
+ *vtable = NULL;
+ if (!strcasecmp(type, "default")) *vtable = &DBM_VTABLE;
+#if APU_HAVE_DB
+ else if (!strcasecmp(type, "db")) *vtable = &apr_dbm_type_db;
+#endif
+ else if (*type && !strcasecmp(type + 1, "dbm")) {
+#if APU_HAVE_GDBM
+ if (*type == 'G' || *type == 'g') *vtable = &apr_dbm_type_gdbm;
+#endif
+#if APU_HAVE_NDBM
+ if (*type == 'N' || *type == 'n') *vtable = &apr_dbm_type_ndbm;
+#endif
+#if APU_HAVE_SDBM
+ if (*type == 'S' || *type == 's') *vtable = &apr_dbm_type_sdbm;
+#endif
+ /* avoid empty block */ ;
+ }
+ if (*vtable)
+ return APR_SUCCESS;
+ return APR_ENOTIMPL;
+
+#else /* APU_DSO_BUILD */
+
+ char modname[32];
+ char symname[34];
+ apr_dso_handle_sym_t symbol;
+ apr_status_t rv;
+ int usertype = 0;
+
+ if (!strcasecmp(type, "default")) type = DBM_NAME;
+ else if (!strcasecmp(type, "db")) type = "db";
+ else if (*type && !strcasecmp(type + 1, "dbm")) {
+ if (*type == 'G' || *type == 'g') type = "gdbm";
+ else if (*type == 'N' || *type == 'n') type = "ndbm";
+ else if (*type == 'S' || *type == 's') type = "sdbm";
+ }
+ else usertype = 1;
+
+ if (apr_atomic_inc32(&initialised)) {
+ apr_atomic_set32(&initialised, 1); /* prevent wrap-around */
+
+ while (apr_atomic_read32(&in_init)) /* wait until we get fully inited */
+ ;
+ }
+ else {
+ apr_pool_t *parent;
+
+ /* Top level pool scope, need process-scope lifetime */
+ for (parent = apr_pool_parent_get(pool);
+ parent && parent != pool;
+ parent = apr_pool_parent_get(pool))
+ pool = parent;
+
+ /* deprecate in 2.0 - permit implicit initialization */
+ apu_dso_init(pool);
+
+ drivers = apr_hash_make(pool);
+ apr_hash_set(drivers, "sdbm", APR_HASH_KEY_STRING, &apr_dbm_type_sdbm);
+
+ apr_pool_cleanup_register(pool, NULL, dbm_term,
+ apr_pool_cleanup_null);
+
+ apr_atomic_dec32(&in_init);
+ }
+
+ rv = apu_dso_mutex_lock();
+ if (rv) {
+ *vtable = NULL;
+ return rv;
+ }
+
+ *vtable = apr_hash_get(drivers, type, APR_HASH_KEY_STRING);
+ if (*vtable) {
+ apu_dso_mutex_unlock();
+ return APR_SUCCESS;
+ }
+
+ /* The driver DSO must have exactly the same lifetime as the
+ * drivers hash table; ignore the passed-in pool */
+ pool = apr_hash_pool_get(drivers);
+
+#if defined(NETWARE)
+ apr_snprintf(modname, sizeof(modname), "dbm%s.nlm", type);
+#elif defined(WIN32) || defined (__CYGWIN__)
+ apr_snprintf(modname, sizeof(modname),
+ "apr_dbm_%s-" APU_STRINGIFY(APU_MAJOR_VERSION) ".dll", type);
+#else
+ apr_snprintf(modname, sizeof(modname),
+ "apr_dbm_%s-" APU_STRINGIFY(APU_MAJOR_VERSION) ".so", type);
+#endif
+ apr_snprintf(symname, sizeof(symname), "apr_dbm_type_%s", type);
+
+ rv = apu_dso_load(NULL, &symbol, modname, symname, pool);
+ if (rv == APR_SUCCESS || rv == APR_EINIT) { /* previously loaded?!? */
+ *vtable = symbol;
+ if (usertype)
+ type = apr_pstrdup(pool, type);
+ apr_hash_set(drivers, type, APR_HASH_KEY_STRING, *vtable);
+ rv = APR_SUCCESS;
+ }
+ else
+ *vtable = NULL;
+
+ apu_dso_mutex_unlock();
+ return rv;
+
+#endif /* APU_DSO_BUILD */
+}
+
+APU_DECLARE(apr_status_t) apr_dbm_open_ex(apr_dbm_t **pdb, const char *type,
+ const char *pathname,
+ apr_int32_t mode,
+ apr_fileperms_t perm,
+ apr_pool_t *pool)
+{
+ apr_dbm_type_t const* vtable = NULL;
+ apr_status_t rv = dbm_open_type(&vtable, type, pool);
+
+ if (rv == APR_SUCCESS) {
+ rv = (vtable->open)(pdb, pathname, mode, perm, pool);
+ }
+ return rv;
+}
+
+APU_DECLARE(apr_status_t) apr_dbm_open(apr_dbm_t **pdb, const char *pathname,
+ apr_int32_t mode, apr_fileperms_t perm,
+ apr_pool_t *pool)
+{
+ return apr_dbm_open_ex(pdb, DBM_NAME, pathname, mode, perm, pool);
+}
+
+APU_DECLARE(void) apr_dbm_close(apr_dbm_t *dbm)
+{
+ (*dbm->type->close)(dbm);
+}
+
+APU_DECLARE(apr_status_t) apr_dbm_fetch(apr_dbm_t *dbm, apr_datum_t key,
+ apr_datum_t *pvalue)
+{
+ return (*dbm->type->fetch)(dbm, key, pvalue);
+}
+
+APU_DECLARE(apr_status_t) apr_dbm_store(apr_dbm_t *dbm, apr_datum_t key,
+ apr_datum_t value)
+{
+ return (*dbm->type->store)(dbm, key, value);
+}
+
+APU_DECLARE(apr_status_t) apr_dbm_delete(apr_dbm_t *dbm, apr_datum_t key)
+{
+ return (*dbm->type->del)(dbm, key);
+}
+
+APU_DECLARE(int) apr_dbm_exists(apr_dbm_t *dbm, apr_datum_t key)
+{
+ return (*dbm->type->exists)(dbm, key);
+}
+
+APU_DECLARE(apr_status_t) apr_dbm_firstkey(apr_dbm_t *dbm, apr_datum_t *pkey)
+{
+ return (*dbm->type->firstkey)(dbm, pkey);
+}
+
+APU_DECLARE(apr_status_t) apr_dbm_nextkey(apr_dbm_t *dbm, apr_datum_t *pkey)
+{
+ return (*dbm->type->nextkey)(dbm, pkey);
+}
+
+APU_DECLARE(void) apr_dbm_freedatum(apr_dbm_t *dbm, apr_datum_t data)
+{
+ (*dbm->type->freedatum)(dbm, data);
+}
+
+APU_DECLARE(char *) apr_dbm_geterror(apr_dbm_t *dbm, int *errcode,
+ char *errbuf, apr_size_t errbufsize)
+{
+ if (errcode != NULL)
+ *errcode = dbm->errcode;
+
+ /* assert: errbufsize > 0 */
+
+ if (dbm->errmsg == NULL)
+ *errbuf = '\0';
+ else
+ (void) apr_cpystrn(errbuf, dbm->errmsg, errbufsize);
+ return errbuf;
+}
+
+APU_DECLARE(apr_status_t) apr_dbm_get_usednames_ex(apr_pool_t *p,
+ const char *type,
+ const char *pathname,
+ const char **used1,
+ const char **used2)
+{
+ apr_dbm_type_t const* vtable;
+ apr_status_t rv = dbm_open_type(&vtable, type, p);
+
+ if (rv == APR_SUCCESS) {
+ (vtable->getusednames)(p, pathname, used1, used2);
+ return APR_SUCCESS;
+ }
+ return rv;
+}
+
+APU_DECLARE(void) apr_dbm_get_usednames(apr_pool_t *p,
+ const char *pathname,
+ const char **used1,
+ const char **used2)
+{
+ apr_dbm_get_usednames_ex(p, DBM_NAME, pathname, used1, used2);
+}
+
+/* Most DBM libraries take a POSIX mode for creating files. Don't trust
+ * the mode_t type, some platforms may not support it, int is safe.
+ */
+APU_DECLARE(int) apr_posix_perms2mode(apr_fileperms_t perm)
+{
+ int mode = 0;
+
+ mode |= 0700 & (perm >> 2); /* User is off-by-2 bits */
+ mode |= 0070 & (perm >> 1); /* Group is off-by-1 bit */
+ mode |= 0007 & (perm); /* World maps 1 for 1 */
+ return mode;
+}
diff --git a/contrib/apr-util/dbm/apr_dbm_berkeleydb.c b/contrib/apr-util/dbm/apr_dbm_berkeleydb.c
new file mode 100644
index 000000000000..32f2a0637923
--- /dev/null
+++ b/contrib/apr-util/dbm/apr_dbm_berkeleydb.c
@@ -0,0 +1,404 @@
+/* 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"
+
+#define APU_WANT_DB
+#include "apu_want.h"
+
+#if APR_HAVE_STDLIB_H
+#include <stdlib.h> /* for abort() */
+#endif
+
+#include "apu_config.h"
+#include "apu.h"
+
+#if APU_HAVE_DB
+#include "apr_dbm_private.h"
+
+/*
+ * We pick up all varieties of Berkeley DB through db.h (included through
+ * apu_select_dbm.h). This code has been compiled/tested against DB1,
+ * DB_185, DB2, DB3, and DB4.
+ */
+
+#if defined(DB_VERSION_MAJOR) && (DB_VERSION_MAJOR >= 4)
+/* We will treat anything greater than 4.1 as DB4.
+ * We can treat 4.0 as DB3.
+ */
+#if DB_VERSION_MAJOR > 4 || (defined(DB_VERSION_MINOR) && (DB_VERSION_MINOR >= 1))
+#define DB_VER 4
+#elif DB_VERSION_MAJOR == 4
+#define DB_VER 3
+#endif
+#elif defined(DB_VERSION_MAJOR) && (DB_VERSION_MAJOR == 3)
+#define DB_VER 3
+#elif defined(DB_VERSION_MAJOR) && (DB_VERSION_MAJOR == 2)
+#define DB_VER 2
+#else
+#define DB_VER 1
+#endif
+
+typedef struct {
+ DB *bdb;
+#if DB_VER != 1
+ DBC *curs;
+#endif
+} real_file_t;
+
+
+#if DB_VER == 1
+#define TXN_ARG
+#else
+#define TXN_ARG NULL,
+#endif
+
+#define GET_BDB(f) (((real_file_t *)(f))->bdb)
+
+#define do_fetch(bdb, k, v) ((*(bdb)->get)(bdb, TXN_ARG &(k), &(v), 0))
+
+#if DB_VER == 1
+#include <sys/fcntl.h>
+#define APR_DBM_DBMODE_RO O_RDONLY
+#define APR_DBM_DBMODE_RW O_RDWR
+#define APR_DBM_DBMODE_RWCREATE (O_CREAT | O_RDWR)
+#define APR_DBM_DBMODE_RWTRUNC (O_CREAT | O_RDWR | O_TRUNC)
+#else
+#define APR_DBM_DBMODE_RO DB_RDONLY
+#define APR_DBM_DBMODE_RW 0
+#define APR_DBM_DBMODE_RWCREATE DB_CREATE
+#define APR_DBM_DBMODE_RWTRUNC DB_TRUNCATE
+#endif /* DBVER == 1 */
+
+/* --------------------------------------------------------------------------
+**
+** UTILITY FUNCTIONS
+*/
+
+/* map a DB error to an apr_status_t */
+static apr_status_t db2s(int dberr)
+{
+ if (dberr != 0) {
+ /* ### need to fix this */
+ return APR_OS_START_USEERR + dberr;
+ }
+
+ return APR_SUCCESS;
+}
+
+
+static apr_status_t set_error(apr_dbm_t *dbm, apr_status_t dbm_said)
+{
+ apr_status_t rv = APR_SUCCESS;
+
+ /* ### ignore whatever the DBM said (dbm_said); ask it explicitly */
+
+ if (dbm_said == APR_SUCCESS) {
+ dbm->errcode = 0;
+ dbm->errmsg = NULL;
+ }
+ else {
+ /* ### need to fix. dberr was tossed in db2s(). */
+ /* ### use db_strerror() */
+ dbm->errcode = dbm_said;
+#if DB_VER == 1 || DB_VER == 2
+ dbm->errmsg = NULL;
+#else
+ dbm->errmsg = db_strerror(dbm_said - APR_OS_START_USEERR);
+#endif
+ rv = dbm_said;
+ }
+
+ return rv;
+}
+
+/* --------------------------------------------------------------------------
+**
+** DEFINE THE VTABLE FUNCTIONS FOR BERKELEY DB
+**
+** ### we may need three sets of these: db1, db2, db3
+*/
+
+static apr_status_t vt_db_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 dbmode;
+
+ *pdb = NULL;
+
+ switch (mode) {
+ case APR_DBM_READONLY:
+ dbmode = APR_DBM_DBMODE_RO;
+ break;
+ case APR_DBM_READWRITE:
+ dbmode = APR_DBM_DBMODE_RW;
+ break;
+ case APR_DBM_RWCREATE:
+ dbmode = APR_DBM_DBMODE_RWCREATE;
+ break;
+ case APR_DBM_RWTRUNC:
+ dbmode = APR_DBM_DBMODE_RWTRUNC;
+ break;
+ default:
+ return APR_EINVAL;
+ }
+
+ {
+ int dberr;
+
+#if DB_VER >= 3
+ if ((dberr = db_create(&file.bdb, NULL, 0)) == 0) {
+ if ((dberr = (*file.bdb->open)(file.bdb,
+#if DB_VER == 4
+ NULL,
+#endif
+ pathname, NULL,
+ DB_HASH, dbmode,
+ apr_posix_perms2mode(perm))) != 0) {
+ /* close the DB handler */
+ (void) (*file.bdb->close)(file.bdb, 0);
+ }
+ }
+ file.curs = NULL;
+#elif DB_VER == 2
+ dberr = db_open(pathname, DB_HASH, dbmode, apr_posix_perms2mode(perm),
+ NULL, NULL, &file.bdb);
+ file.curs = NULL;
+#else
+ file.bdb = dbopen(pathname, dbmode, apr_posix_perms2mode(perm),
+ DB_HASH, NULL);
+ if (file.bdb == NULL)
+ return APR_EGENERAL; /* ### need a better error */
+ dberr = 0;
+#endif
+ if (dberr != 0)
+ return db2s(dberr);
+ }
+
+ /* we have an open database... return it */
+ *pdb = apr_pcalloc(pool, sizeof(**pdb));
+ (*pdb)->pool = pool;
+ (*pdb)->type = &apr_dbm_type_db;
+ (*pdb)->file = apr_pmemdup(pool, &file, sizeof(file));
+
+ /* ### register a cleanup to close the DBM? */
+
+ return APR_SUCCESS;
+}
+
+static void vt_db_close(apr_dbm_t *dbm)
+{
+ (*GET_BDB(dbm->file)->close)(GET_BDB(dbm->file)
+#if DB_VER != 1
+ , 0
+#endif
+ );
+}
+
+static apr_status_t vt_db_fetch(apr_dbm_t *dbm, apr_datum_t key,
+ apr_datum_t * pvalue)
+{
+ DBT ckey = { 0 };
+ DBT rd = { 0 };
+ int dberr;
+
+ ckey.data = key.dptr;
+ ckey.size = key.dsize;
+
+ dberr = do_fetch(GET_BDB(dbm->file), ckey, rd);
+
+ /* "not found" is not an error. return zero'd value. */
+ if (dberr ==
+#if DB_VER == 1
+ RET_SPECIAL
+#else
+ DB_NOTFOUND
+#endif
+ ) {
+ memset(&rd, 0, sizeof(rd));
+ dberr = 0;
+ }
+
+ pvalue->dptr = rd.data;
+ pvalue->dsize = rd.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, db2s(dberr));
+}
+
+static apr_status_t vt_db_store(apr_dbm_t *dbm, apr_datum_t key,
+ apr_datum_t value)
+{
+ apr_status_t rv;
+ DBT ckey = { 0 };
+ DBT cvalue = { 0 };
+
+ ckey.data = key.dptr;
+ ckey.size = key.dsize;
+
+ cvalue.data = value.dptr;
+ cvalue.size = value.dsize;
+
+ rv = db2s((*GET_BDB(dbm->file)->put)(GET_BDB(dbm->file),
+ TXN_ARG
+ &ckey,
+ &cvalue,
+ 0));
+
+ /* store any error info into DBM, and return a status code. */
+ return set_error(dbm, rv);
+}
+
+static apr_status_t vt_db_del(apr_dbm_t *dbm, apr_datum_t key)
+{
+ apr_status_t rv;
+ DBT ckey = { 0 };
+
+ ckey.data = key.dptr;
+ ckey.size = key.dsize;
+
+ rv = db2s((*GET_BDB(dbm->file)->del)(GET_BDB(dbm->file),
+ TXN_ARG
+ &ckey,
+ 0));
+
+ /* store any error info into DBM, and return a status code. */
+ return set_error(dbm, rv);
+}
+
+static int vt_db_exists(apr_dbm_t *dbm, apr_datum_t key)
+{
+ DBT ckey = { 0 }; /* converted key */
+ DBT data = { 0 };
+ int dberr;
+
+ ckey.data = key.dptr;
+ ckey.size = key.dsize;
+
+ dberr = do_fetch(GET_BDB(dbm->file), 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_db_firstkey(apr_dbm_t *dbm, apr_datum_t * pkey)
+{
+ real_file_t *f = dbm->file;
+ DBT first = { 0 };
+ DBT data = { 0 };
+ int dberr;
+
+#if DB_VER == 1
+ dberr = (*f->bdb->seq)(f->bdb, &first, &data, R_FIRST);
+#else
+ if ((dberr = (*f->bdb->cursor)(f->bdb, NULL, &f->curs
+#if DB_VER >= 3 || ((DB_VERSION_MAJOR == 2) && (DB_VERSION_MINOR > 5))
+ , 0
+#endif
+ )) == 0) {
+ dberr = (*f->curs->c_get)(f->curs, &first, &data, DB_FIRST);
+ if (dberr == DB_NOTFOUND) {
+ memset(&first, 0, sizeof(first));
+ (*f->curs->c_close)(f->curs);
+ f->curs = NULL;
+ dberr = 0;
+ }
+ }
+#endif
+
+ pkey->dptr = first.data;
+ pkey->dsize = first.size;
+
+ /* store any error info into DBM, and return a status code. */
+ return set_error(dbm, db2s(dberr));
+}
+
+static apr_status_t vt_db_nextkey(apr_dbm_t *dbm, apr_datum_t * pkey)
+{
+ real_file_t *f = dbm->file;
+ DBT ckey = { 0 };
+ DBT data = { 0 };
+ int dberr;
+
+ ckey.data = pkey->dptr;
+ ckey.size = pkey->dsize;
+
+#if DB_VER == 1
+ dberr = (*f->bdb->seq)(f->bdb, &ckey, &data, R_NEXT);
+ if (dberr == RET_SPECIAL) {
+ dberr = 0;
+ ckey.data = NULL;
+ ckey.size = 0;
+ }
+#else
+ if (f->curs == NULL)
+ return APR_EINVAL;
+
+ dberr = (*f->curs->c_get)(f->curs, &ckey, &data, DB_NEXT);
+ if (dberr == DB_NOTFOUND) {
+ (*f->curs->c_close)(f->curs);
+ f->curs = NULL;
+ dberr = 0;
+ ckey.data = NULL;
+ ckey.size = 0;
+ }
+#endif
+
+ pkey->dptr = ckey.data;
+ pkey->dsize = ckey.size;
+
+ /* store any error info into DBM, and return a status code. */
+ /* ### or use db2s(dberr) instead of APR_SUCCESS? */
+ return set_error(dbm, APR_SUCCESS);
+}
+
+static void vt_db_freedatum(apr_dbm_t *dbm, apr_datum_t data)
+{
+ /* nothing to do */
+}
+
+static void vt_db_usednames(apr_pool_t *pool, const char *pathname,
+ const char **used1, const char **used2)
+{
+ *used1 = apr_pstrdup(pool, pathname);
+ *used2 = NULL;
+}
+
+
+APU_MODULE_DECLARE_DATA const apr_dbm_type_t apr_dbm_type_db = {
+ "db",
+
+ vt_db_open,
+ vt_db_close,
+ vt_db_fetch,
+ vt_db_store,
+ vt_db_del,
+ vt_db_exists,
+ vt_db_firstkey,
+ vt_db_nextkey,
+ vt_db_freedatum,
+ vt_db_usednames
+};
+
+#endif /* APU_HAVE_DB */
diff --git a/contrib/apr-util/dbm/apr_dbm_gdbm.c b/contrib/apr-util/dbm/apr_dbm_gdbm.c
new file mode 100644
index 000000000000..749447a0a317
--- /dev/null
+++ b/contrib/apr-util/dbm/apr_dbm_gdbm.c
@@ -0,0 +1,255 @@
+/* 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 "apu_config.h"
+#include "apu.h"
+#include "apr_strings.h"
+
+#if APR_HAVE_STDLIB_H
+#include <stdlib.h> /* for free() */
+#endif
+
+#if APU_HAVE_GDBM
+#include "apr_dbm_private.h"
+
+#include <gdbm.h>
+
+#define APR_DBM_DBMODE_RO GDBM_READER
+#define APR_DBM_DBMODE_RW GDBM_WRITER
+#define APR_DBM_DBMODE_RWCREATE GDBM_WRCREAT
+#define APR_DBM_DBMODE_RWTRUNC GDBM_NEWDB
+
+/* map a GDBM error to an apr_status_t */
+static apr_status_t g2s(int gerr)
+{
+ if (gerr == -1) {
+ /* ### need to fix this */
+ return APR_EGENERAL;
+ }
+
+ return APR_SUCCESS;
+}
+
+static apr_status_t datum_cleanup(void *dptr)
+{
+ if (dptr)
+ free(dptr);
+
+ return APR_SUCCESS;
+}
+
+static apr_status_t set_error(apr_dbm_t *dbm, apr_status_t dbm_said)
+{
+ apr_status_t rv = APR_SUCCESS;
+
+ /* ### ignore whatever the DBM said (dbm_said); ask it explicitly */
+
+ if ((dbm->errcode = gdbm_errno) == GDBM_NO_ERROR) {
+ dbm->errmsg = NULL;
+ }
+ else {
+ dbm->errmsg = gdbm_strerror(gdbm_errno);
+ rv = APR_EGENERAL; /* ### need something better */
+ }
+
+ /* captured it. clear it now. */
+ gdbm_errno = GDBM_NO_ERROR;
+
+ return rv;
+}
+
+/* --------------------------------------------------------------------------
+**
+** DEFINE THE VTABLE FUNCTIONS FOR GDBM
+*/
+
+static apr_status_t vt_gdbm_open(apr_dbm_t **pdb, const char *pathname,
+ apr_int32_t mode, apr_fileperms_t perm,
+ apr_pool_t *pool)
+{
+ GDBM_FILE file;
+ int dbmode;
+
+ *pdb = NULL;
+
+ switch (mode) {
+ case APR_DBM_READONLY:
+ dbmode = APR_DBM_DBMODE_RO;
+ break;
+ case APR_DBM_READWRITE:
+ dbmode = APR_DBM_DBMODE_RW;
+ break;
+ case APR_DBM_RWCREATE:
+ dbmode = APR_DBM_DBMODE_RWCREATE;
+ break;
+ case APR_DBM_RWTRUNC:
+ dbmode = APR_DBM_DBMODE_RWTRUNC;
+ break;
+ default:
+ return APR_EINVAL;
+ }
+
+ /* Note: stupid cast to get rid of "const" on the pathname */
+ file = gdbm_open((char *) pathname, 0, dbmode, apr_posix_perms2mode(perm),
+ NULL);
+
+ if (file == NULL)
+ return APR_EGENERAL; /* ### need a better error */
+
+ /* we have an open database... return it */
+ *pdb = apr_pcalloc(pool, sizeof(**pdb));
+ (*pdb)->pool = pool;
+ (*pdb)->type = &apr_dbm_type_gdbm;
+ (*pdb)->file = file;
+
+ /* ### register a cleanup to close the DBM? */
+
+ return APR_SUCCESS;
+}
+
+static void vt_gdbm_close(apr_dbm_t *dbm)
+{
+ gdbm_close(dbm->file);
+}
+
+static apr_status_t vt_gdbm_fetch(apr_dbm_t *dbm, apr_datum_t key,
+ apr_datum_t *pvalue)
+{
+ datum kd, rd;
+
+ kd.dptr = key.dptr;
+ kd.dsize = key.dsize;
+
+ rd = gdbm_fetch(dbm->file, kd);
+
+ pvalue->dptr = rd.dptr;
+ pvalue->dsize = rd.dsize;
+
+ if (pvalue->dptr)
+ apr_pool_cleanup_register(dbm->pool, pvalue->dptr, datum_cleanup,
+ apr_pool_cleanup_null);
+
+ /* 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, APR_SUCCESS);
+}
+
+static apr_status_t vt_gdbm_store(apr_dbm_t *dbm, apr_datum_t key,
+ apr_datum_t value)
+{
+ int rc;
+ datum kd, vd;
+
+ kd.dptr = key.dptr;
+ kd.dsize = key.dsize;
+
+ vd.dptr = value.dptr;
+ vd.dsize = value.dsize;
+
+ rc = gdbm_store(dbm->file, kd, vd, GDBM_REPLACE);
+
+ /* store any error info into DBM, and return a status code. */
+ return set_error(dbm, g2s(rc));
+}
+
+static apr_status_t vt_gdbm_del(apr_dbm_t *dbm, apr_datum_t key)
+{
+ int rc;
+ datum kd;
+
+ kd.dptr = key.dptr;
+ kd.dsize = key.dsize;
+
+ rc = gdbm_delete(dbm->file, kd);
+
+ /* store any error info into DBM, and return a status code. */
+ return set_error(dbm, g2s(rc));
+}
+
+static int vt_gdbm_exists(apr_dbm_t *dbm, apr_datum_t key)
+{
+ datum kd;
+
+ kd.dptr = key.dptr;
+ kd.dsize = key.dsize;
+
+ return gdbm_exists(dbm->file, kd) != 0;
+}
+
+static apr_status_t vt_gdbm_firstkey(apr_dbm_t *dbm, apr_datum_t *pkey)
+{
+ datum rd;
+
+ rd = gdbm_firstkey(dbm->file);
+
+ pkey->dptr = rd.dptr;
+ pkey->dsize = rd.dsize;
+
+ if (pkey->dptr)
+ apr_pool_cleanup_register(dbm->pool, pkey->dptr, datum_cleanup,
+ apr_pool_cleanup_null);
+
+ /* store any error info into DBM, and return a status code. */
+ return set_error(dbm, APR_SUCCESS);
+}
+
+static apr_status_t vt_gdbm_nextkey(apr_dbm_t *dbm, apr_datum_t *pkey)
+{
+ datum kd, rd;
+
+ kd.dptr = pkey->dptr;
+ kd.dsize = pkey->dsize;
+
+ rd = gdbm_nextkey(dbm->file, kd);
+
+ pkey->dptr = rd.dptr;
+ pkey->dsize = rd.dsize;
+
+ if (pkey->dptr)
+ apr_pool_cleanup_register(dbm->pool, pkey->dptr, datum_cleanup,
+ apr_pool_cleanup_null);
+
+ /* store any error info into DBM, and return a status code. */
+ return set_error(dbm, APR_SUCCESS);
+}
+
+static void vt_gdbm_freedatum(apr_dbm_t *dbm, apr_datum_t data)
+{
+ (void) apr_pool_cleanup_run(dbm->pool, data.dptr, datum_cleanup);
+}
+
+static void vt_gdbm_usednames(apr_pool_t *pool, const char *pathname,
+ const char **used1, const char **used2)
+{
+ *used1 = apr_pstrdup(pool, pathname);
+ *used2 = NULL;
+}
+
+APU_MODULE_DECLARE_DATA const apr_dbm_type_t apr_dbm_type_gdbm = {
+ "gdbm",
+ vt_gdbm_open,
+ vt_gdbm_close,
+ vt_gdbm_fetch,
+ vt_gdbm_store,
+ vt_gdbm_del,
+ vt_gdbm_exists,
+ vt_gdbm_firstkey,
+ vt_gdbm_nextkey,
+ vt_gdbm_freedatum,
+ vt_gdbm_usednames
+};
+
+#endif /* APU_HAVE_GDBM */
diff --git a/contrib/apr-util/dbm/apr_dbm_ndbm.c b/contrib/apr-util/dbm/apr_dbm_ndbm.c
new file mode 100644
index 000000000000..7f381862453a
--- /dev/null
+++ b/contrib/apr-util/dbm/apr_dbm_ndbm.c
@@ -0,0 +1,238 @@
+/* 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"
+
+#if APR_HAVE_STDLIB_H
+#include <stdlib.h> /* for free() */
+#endif
+
+#include "apu_config.h"
+#include "apu.h"
+
+#if APU_HAVE_NDBM
+#include "apr_dbm_private.h"
+
+#include <ndbm.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#define APR_DBM_DBMODE_RO O_RDONLY
+#define APR_DBM_DBMODE_RW O_RDWR
+#define APR_DBM_DBMODE_RWCREATE (O_RDWR|O_CREAT)
+#define APR_DBM_DBMODE_RWTRUNC (O_RDWR|O_CREAT|O_TRUNC)
+
+/* map a NDBM error to an apr_status_t */
+static apr_status_t ndbm2s(int ndbmerr)
+{
+ if (ndbmerr == -1) {
+ /* ### need to fix this */
+ return APR_EGENERAL;
+ }
+
+ return APR_SUCCESS;
+}
+
+static apr_status_t set_error(apr_dbm_t *dbm, apr_status_t dbm_said)
+{
+ apr_status_t rv = APR_SUCCESS;
+
+ /* ### ignore whatever the DBM said (dbm_said); ask it explicitly */
+
+ dbm->errmsg = NULL;
+ if (dbm_error((DBM*)dbm->file)) {
+ dbm->errmsg = NULL;
+ rv = APR_EGENERAL; /* ### need something better */
+ }
+
+ /* captured it. clear it now. */
+ dbm_clearerr((DBM*)dbm->file);
+
+ return rv;
+}
+
+/* --------------------------------------------------------------------------
+**
+** DEFINE THE VTABLE FUNCTIONS FOR NDBM
+*/
+
+static apr_status_t vt_ndbm_open(apr_dbm_t **pdb, const char *pathname,
+ apr_int32_t mode, apr_fileperms_t perm,
+ apr_pool_t *pool)
+{
+ DBM *file;
+ int dbmode;
+
+ *pdb = NULL;
+
+ switch (mode) {
+ case APR_DBM_READONLY:
+ dbmode = APR_DBM_DBMODE_RO;
+ break;
+ case APR_DBM_READWRITE:
+ dbmode = APR_DBM_DBMODE_RW;
+ break;
+ case APR_DBM_RWCREATE:
+ dbmode = APR_DBM_DBMODE_RWCREATE;
+ break;
+ case APR_DBM_RWTRUNC:
+ dbmode = APR_DBM_DBMODE_RWTRUNC;
+ break;
+ default:
+ return APR_EINVAL;
+ }
+
+ {
+ file = dbm_open(pathname, dbmode, apr_posix_perms2mode(perm));
+ if (file == NULL)
+ return APR_EGENERAL; /* ### need a better error */
+ }
+
+ /* we have an open database... return it */
+ *pdb = apr_pcalloc(pool, sizeof(**pdb));
+ (*pdb)->pool = pool;
+ (*pdb)->type = &apr_dbm_type_ndbm;
+ (*pdb)->file = file;
+
+ /* ### register a cleanup to close the DBM? */
+
+ return APR_SUCCESS;
+}
+
+static void vt_ndbm_close(apr_dbm_t *dbm)
+{
+ dbm_close(dbm->file);
+}
+
+static apr_status_t vt_ndbm_fetch(apr_dbm_t *dbm, apr_datum_t key,
+ apr_datum_t *pvalue)
+{
+ datum kd, rd;
+
+ kd.dptr = key.dptr;
+ kd.dsize = key.dsize;
+
+ rd = dbm_fetch(dbm->file, kd);
+
+ pvalue->dptr = rd.dptr;
+ pvalue->dsize = rd.dsize;
+
+ /* 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, APR_SUCCESS);
+}
+
+static apr_status_t vt_ndbm_store(apr_dbm_t *dbm, apr_datum_t key,
+ apr_datum_t value)
+{
+ int rc;
+ datum kd, vd;
+
+ kd.dptr = key.dptr;
+ kd.dsize = key.dsize;
+
+ vd.dptr = value.dptr;
+ vd.dsize = value.dsize;
+
+ rc = dbm_store(dbm->file, kd, vd, DBM_REPLACE);
+
+ /* store any error info into DBM, and return a status code. */
+ return set_error(dbm, ndbm2s(rc));
+}
+
+static apr_status_t vt_ndbm_del(apr_dbm_t *dbm, apr_datum_t key)
+{
+ int rc;
+ datum kd;
+
+ kd.dptr = key.dptr;
+ kd.dsize = key.dsize;
+
+ rc = dbm_delete(dbm->file, kd);
+
+ /* store any error info into DBM, and return a status code. */
+ return set_error(dbm, ndbm2s(rc));
+}
+
+static int vt_ndbm_exists(apr_dbm_t *dbm, apr_datum_t key)
+{
+ datum kd, rd;
+
+ kd.dptr = key.dptr;
+ kd.dsize = key.dsize;
+
+ rd = dbm_fetch(dbm->file, kd);
+
+ return rd.dptr != NULL;
+}
+
+static apr_status_t vt_ndbm_firstkey(apr_dbm_t *dbm, apr_datum_t *pkey)
+{
+ datum rd;
+
+ rd = dbm_firstkey(dbm->file);
+
+ pkey->dptr = rd.dptr;
+ pkey->dsize = rd.dsize;
+
+ /* store any error info into DBM, and return a status code. */
+ return set_error(dbm, APR_SUCCESS);
+}
+
+static apr_status_t vt_ndbm_nextkey(apr_dbm_t *dbm, apr_datum_t *pkey)
+{
+ datum kd, rd;
+
+ kd.dptr = pkey->dptr;
+ kd.dsize = pkey->dsize;
+
+ rd = dbm_nextkey(dbm->file);
+
+ pkey->dptr = rd.dptr;
+ pkey->dsize = rd.dsize;
+
+ /* store any error info into DBM, and return a status code. */
+ return set_error(dbm, APR_SUCCESS);
+}
+
+static void vt_ndbm_freedatum(apr_dbm_t *dbm, apr_datum_t data)
+{
+ /* nothing to do */
+}
+
+static void vt_ndbm_usednames(apr_pool_t *pool, const char *pathname,
+ const char **used1, const char **used2)
+{
+ *used1 = apr_pstrdup(pool, pathname);
+ *used2 = NULL;
+}
+
+APU_MODULE_DECLARE_DATA const apr_dbm_type_t apr_dbm_type_ndbm = {
+ "ndbm",
+ vt_ndbm_open,
+ vt_ndbm_close,
+ vt_ndbm_fetch,
+ vt_ndbm_store,
+ vt_ndbm_del,
+ vt_ndbm_exists,
+ vt_ndbm_firstkey,
+ vt_ndbm_nextkey,
+ vt_ndbm_freedatum,
+ vt_ndbm_usednames
+};
+
+#endif /* APU_HAVE_NDBM */
diff --git a/contrib/apr-util/dbm/apr_dbm_sdbm.c b/contrib/apr-util/dbm/apr_dbm_sdbm.c
new file mode 100644
index 000000000000..e6cc4aa5913d
--- /dev/null
+++ b/contrib/apr-util/dbm/apr_dbm_sdbm.c
@@ -0,0 +1,223 @@
+/* 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
+#define APR_WANT_STRFUNC
+#include "apr_want.h"
+
+#include "apu_config.h"
+#include "apu.h"
+
+#if APU_HAVE_SDBM
+
+#include "apr_dbm_private.h"
+#include "apr_sdbm.h"
+
+#define APR_DBM_DBMODE_RO (APR_FOPEN_READ | APR_FOPEN_BUFFERED)
+#define APR_DBM_DBMODE_RW (APR_FOPEN_READ | APR_FOPEN_WRITE)
+#define APR_DBM_DBMODE_RWCREATE (APR_FOPEN_READ | APR_FOPEN_WRITE | APR_FOPEN_CREATE)
+#define APR_DBM_DBMODE_RWTRUNC (APR_FOPEN_READ | APR_FOPEN_WRITE | APR_FOPEN_CREATE | \
+ APR_FOPEN_TRUNCATE)
+
+static apr_status_t set_error(apr_dbm_t *dbm, apr_status_t dbm_said)
+{
+ dbm->errcode = dbm_said;
+
+ if (dbm_said != APR_SUCCESS) {
+ dbm->errmsg = apr_psprintf(dbm->pool, "%pm", &dbm_said);
+ } else {
+ dbm->errmsg = NULL;
+ }
+
+ return dbm_said;
+}
+
+/* --------------------------------------------------------------------------
+**
+** DEFINE THE VTABLE FUNCTIONS FOR SDBM
+*/
+
+static apr_status_t vt_sdbm_open(apr_dbm_t **pdb, const char *pathname,
+ apr_int32_t mode, apr_fileperms_t perm,
+ apr_pool_t *pool)
+{
+ apr_sdbm_t *file;
+ int dbmode;
+
+ *pdb = NULL;
+
+ switch (mode) {
+ case APR_DBM_READONLY:
+ dbmode = APR_DBM_DBMODE_RO;
+ break;
+ case APR_DBM_READWRITE:
+ dbmode = APR_DBM_DBMODE_RW;
+ break;
+ case APR_DBM_RWCREATE:
+ dbmode = APR_DBM_DBMODE_RWCREATE;
+ break;
+ case APR_DBM_RWTRUNC:
+ dbmode = APR_DBM_DBMODE_RWTRUNC;
+ break;
+ default:
+ return APR_EINVAL;
+ }
+
+ {
+ apr_status_t rv;
+
+ rv = apr_sdbm_open(&file, pathname, dbmode, perm, pool);
+ if (rv != APR_SUCCESS)
+ return rv;
+ }
+
+ /* we have an open database... return it */
+ *pdb = apr_pcalloc(pool, sizeof(**pdb));
+ (*pdb)->pool = pool;
+ (*pdb)->type = &apr_dbm_type_sdbm;
+ (*pdb)->file = file;
+
+ /* ### register a cleanup to close the DBM? */
+
+ return APR_SUCCESS;
+}
+
+static void vt_sdbm_close(apr_dbm_t *dbm)
+{
+ apr_sdbm_close(dbm->file);
+}
+
+static apr_status_t vt_sdbm_fetch(apr_dbm_t *dbm, apr_datum_t key,
+ apr_datum_t *pvalue)
+{
+ apr_status_t rv;
+ apr_sdbm_datum_t kd, rd;
+
+ kd.dptr = key.dptr;
+ kd.dsize = (int)key.dsize;
+
+ rv = apr_sdbm_fetch(dbm->file, &rd, kd);
+
+ pvalue->dptr = rd.dptr;
+ pvalue->dsize = rd.dsize;
+
+ /* 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, rv);
+}
+
+static apr_status_t vt_sdbm_store(apr_dbm_t *dbm, apr_datum_t key,
+ apr_datum_t value)
+{
+ apr_status_t rv;
+ apr_sdbm_datum_t kd, vd;
+
+ kd.dptr = key.dptr;
+ kd.dsize = (int)key.dsize;
+
+ vd.dptr = value.dptr;
+ vd.dsize = (int)value.dsize;
+
+ rv = apr_sdbm_store(dbm->file, kd, vd, APR_SDBM_REPLACE);
+
+ /* store any error info into DBM, and return a status code. */
+ return set_error(dbm, rv);
+}
+
+static apr_status_t vt_sdbm_del(apr_dbm_t *dbm, apr_datum_t key)
+{
+ apr_status_t rv;
+ apr_sdbm_datum_t kd;
+
+ kd.dptr = key.dptr;
+ kd.dsize = (int)key.dsize;
+
+ rv = apr_sdbm_delete(dbm->file, kd);
+
+ /* store any error info into DBM, and return a status code. */
+ return set_error(dbm, rv);
+}
+
+static int vt_sdbm_exists(apr_dbm_t *dbm, apr_datum_t key)
+{
+ int exists;
+ apr_sdbm_datum_t vd, kd;
+
+ kd.dptr = key.dptr;
+ kd.dsize = (int)key.dsize;
+
+ if (apr_sdbm_fetch(dbm->file, &vd, kd) != APR_SUCCESS)
+ exists = 0;
+ else
+ exists = vd.dptr != NULL;
+
+ return exists;
+}
+
+static apr_status_t vt_sdbm_firstkey(apr_dbm_t *dbm, apr_datum_t *pkey)
+{
+ apr_status_t rv;
+ apr_sdbm_datum_t rd;
+
+ rv = apr_sdbm_firstkey(dbm->file, &rd);
+
+ pkey->dptr = rd.dptr;
+ pkey->dsize = rd.dsize;
+
+ /* store any error info into DBM, and return a status code. */
+ return set_error(dbm, rv);
+}
+
+static apr_status_t vt_sdbm_nextkey(apr_dbm_t *dbm, apr_datum_t *pkey)
+{
+ apr_sdbm_datum_t rd;
+
+ (void)apr_sdbm_nextkey(dbm->file, &rd);
+
+ pkey->dptr = rd.dptr;
+ pkey->dsize = rd.dsize;
+
+ /* store any error info into DBM, and return a status code. */
+ return set_error(dbm, APR_SUCCESS);
+}
+
+static void vt_sdbm_freedatum(apr_dbm_t *dbm, apr_datum_t data)
+{
+}
+
+static void vt_sdbm_usednames(apr_pool_t *pool, const char *pathname,
+ const char **used1, const char **used2)
+{
+ *used1 = apr_pstrcat(pool, pathname, APR_SDBM_DIRFEXT, NULL);
+ *used2 = apr_pstrcat(pool, pathname, APR_SDBM_PAGFEXT, NULL);
+}
+
+APU_MODULE_DECLARE_DATA const apr_dbm_type_t apr_dbm_type_sdbm = {
+ "sdbm",
+ vt_sdbm_open,
+ vt_sdbm_close,
+ vt_sdbm_fetch,
+ vt_sdbm_store,
+ vt_sdbm_del,
+ vt_sdbm_exists,
+ vt_sdbm_firstkey,
+ vt_sdbm_nextkey,
+ vt_sdbm_freedatum,
+ vt_sdbm_usednames
+};
+
+#endif /* APU_HAVE_SDBM */
diff --git a/contrib/apr-util/dbm/sdbm/sdbm.c b/contrib/apr-util/dbm/sdbm/sdbm.c
new file mode 100644
index 000000000000..a1ce69531315
--- /dev/null
+++ b/contrib/apr-util/dbm/sdbm/sdbm.c
@@ -0,0 +1,584 @@
+/* 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.
+ */
+
+/*
+ * sdbm - ndbm work-alike hashed database library
+ * based on Per-Aake Larson's Dynamic Hashing algorithms. BIT 18 (1978).
+ * author: oz@nexus.yorku.ca
+ * ex-public domain, ported to APR for Apache 2
+ * core routines
+ */
+
+#include "apr.h"
+#include "apr_file_io.h"
+#include "apr_strings.h"
+#include "apr_errno.h"
+#include "apr_sdbm.h"
+
+#include "sdbm_tune.h"
+#include "sdbm_pair.h"
+#include "sdbm_private.h"
+
+#include <string.h> /* for memset() */
+#include <stdlib.h> /* for malloc() and free() */
+
+/*
+ * forward
+ */
+static int getdbit (apr_sdbm_t *, long);
+static apr_status_t setdbit(apr_sdbm_t *, long);
+static apr_status_t getpage(apr_sdbm_t *db, long);
+static apr_status_t getnext(apr_sdbm_datum_t *key, apr_sdbm_t *db);
+static apr_status_t makroom(apr_sdbm_t *, long, int);
+
+/*
+ * useful macros
+ */
+#define bad(x) ((x).dptr == NULL || (x).dsize <= 0)
+#define exhash(item) sdbm_hash((item).dptr, (item).dsize)
+
+#define OFF_PAG(off) (apr_off_t) (off) * PBLKSIZ
+#define OFF_DIR(off) (apr_off_t) (off) * DBLKSIZ
+
+static const long masks[] = {
+ 000000000000, 000000000001, 000000000003, 000000000007,
+ 000000000017, 000000000037, 000000000077, 000000000177,
+ 000000000377, 000000000777, 000000001777, 000000003777,
+ 000000007777, 000000017777, 000000037777, 000000077777,
+ 000000177777, 000000377777, 000000777777, 000001777777,
+ 000003777777, 000007777777, 000017777777, 000037777777,
+ 000077777777, 000177777777, 000377777777, 000777777777,
+ 001777777777, 003777777777, 007777777777, 017777777777
+};
+
+const apr_sdbm_datum_t sdbm_nullitem = { NULL, 0 };
+
+static apr_status_t database_cleanup(void *data)
+{
+ apr_sdbm_t *db = data;
+
+ /*
+ * Can't rely on apr_sdbm_unlock, since it will merely
+ * decrement the refcnt if several locks are held.
+ */
+ if (db->flags & (SDBM_SHARED_LOCK | SDBM_EXCLUSIVE_LOCK))
+ (void) apr_file_unlock(db->dirf);
+ (void) apr_file_close(db->dirf);
+ (void) apr_file_close(db->pagf);
+ free(db);
+
+ return APR_SUCCESS;
+}
+
+static apr_status_t prep(apr_sdbm_t **pdb, const char *dirname, const char *pagname,
+ apr_int32_t flags, apr_fileperms_t perms, apr_pool_t *p)
+{
+ apr_sdbm_t *db;
+ apr_status_t status;
+
+ *pdb = NULL;
+
+ db = malloc(sizeof(*db));
+ memset(db, 0, sizeof(*db));
+
+ db->pool = p;
+
+ /*
+ * adjust user flags so that WRONLY becomes RDWR,
+ * as required by this package. Also set our internal
+ * flag for RDONLY if needed.
+ */
+ if (!(flags & APR_FOPEN_WRITE)) {
+ db->flags |= SDBM_RDONLY;
+ }
+
+ /*
+ * adjust the file open flags so that we handle locking
+ * on our own (don't rely on any locking behavior within
+ * an apr_file_t, in case it's ever introduced, and set
+ * our own flag.
+ */
+ if (flags & APR_FOPEN_SHARELOCK) {
+ db->flags |= SDBM_SHARED;
+ flags &= ~APR_FOPEN_SHARELOCK;
+ }
+
+ flags |= APR_FOPEN_BINARY | APR_FOPEN_READ;
+
+ /*
+ * open the files in sequence, and stat the dirfile.
+ * If we fail anywhere, undo everything, return NULL.
+ */
+
+ if ((status = apr_file_open(&db->dirf, dirname, flags, perms, p))
+ != APR_SUCCESS)
+ goto error;
+
+ if ((status = apr_file_open(&db->pagf, pagname, flags, perms, p))
+ != APR_SUCCESS)
+ goto error;
+
+ if ((status = apr_sdbm_lock(db, (db->flags & SDBM_RDONLY)
+ ? APR_FLOCK_SHARED
+ : APR_FLOCK_EXCLUSIVE))
+ != APR_SUCCESS)
+ goto error;
+
+ /* apr_pcalloc zeroed the buffers
+ * apr_sdbm_lock stated the dirf->size and invalidated the cache
+ */
+
+ /*
+ * if we are opened in SHARED mode, unlock ourself
+ */
+ if (db->flags & SDBM_SHARED)
+ if ((status = apr_sdbm_unlock(db)) != APR_SUCCESS)
+ goto error;
+
+ /* make sure that we close the database at some point */
+ apr_pool_cleanup_register(p, db, database_cleanup, apr_pool_cleanup_null);
+
+ /* Done! */
+ *pdb = db;
+ return APR_SUCCESS;
+
+error:
+ if (db->dirf && db->pagf)
+ (void) apr_sdbm_unlock(db);
+ if (db->dirf != NULL)
+ (void) apr_file_close(db->dirf);
+ if (db->pagf != NULL) {
+ (void) apr_file_close(db->pagf);
+ }
+ free(db);
+ return status;
+}
+
+APU_DECLARE(apr_status_t) apr_sdbm_open(apr_sdbm_t **db, const char *file,
+ apr_int32_t flags,
+ apr_fileperms_t perms, apr_pool_t *p)
+{
+ char *dirname = apr_pstrcat(p, file, APR_SDBM_DIRFEXT, NULL);
+ char *pagname = apr_pstrcat(p, file, APR_SDBM_PAGFEXT, NULL);
+
+ return prep(db, dirname, pagname, flags, perms, p);
+}
+
+APU_DECLARE(apr_status_t) apr_sdbm_close(apr_sdbm_t *db)
+{
+ return apr_pool_cleanup_run(db->pool, db, database_cleanup);
+}
+
+APU_DECLARE(apr_status_t) apr_sdbm_fetch(apr_sdbm_t *db, apr_sdbm_datum_t *val,
+ apr_sdbm_datum_t key)
+{
+ apr_status_t status;
+
+ if (db == NULL || bad(key))
+ return APR_EINVAL;
+
+ if ((status = apr_sdbm_lock(db, APR_FLOCK_SHARED)) != APR_SUCCESS)
+ return status;
+
+ if ((status = getpage(db, exhash(key))) == APR_SUCCESS) {
+ *val = getpair(db->pagbuf, key);
+ /* ### do we want a not-found result? */
+ }
+
+ (void) apr_sdbm_unlock(db);
+
+ return status;
+}
+
+static apr_status_t write_page(apr_sdbm_t *db, const char *buf, long pagno)
+{
+ apr_status_t status;
+ apr_off_t off = OFF_PAG(pagno);
+
+ if ((status = apr_file_seek(db->pagf, APR_SET, &off)) == APR_SUCCESS)
+ status = apr_file_write_full(db->pagf, buf, PBLKSIZ, NULL);
+
+ return status;
+}
+
+APU_DECLARE(apr_status_t) apr_sdbm_delete(apr_sdbm_t *db,
+ const apr_sdbm_datum_t key)
+{
+ apr_status_t status;
+
+ if (db == NULL || bad(key))
+ return APR_EINVAL;
+ if (apr_sdbm_rdonly(db))
+ return APR_EINVAL;
+
+ if ((status = apr_sdbm_lock(db, APR_FLOCK_EXCLUSIVE)) != APR_SUCCESS)
+ return status;
+
+ if ((status = getpage(db, exhash(key))) == APR_SUCCESS) {
+ if (!delpair(db->pagbuf, key))
+ /* ### should we define some APRUTIL codes? */
+ status = APR_EGENERAL;
+ else
+ status = write_page(db, db->pagbuf, db->pagbno);
+ }
+
+ (void) apr_sdbm_unlock(db);
+
+ return status;
+}
+
+APU_DECLARE(apr_status_t) apr_sdbm_store(apr_sdbm_t *db, apr_sdbm_datum_t key,
+ apr_sdbm_datum_t val, int flags)
+{
+ int need;
+ register long hash;
+ apr_status_t status;
+
+ if (db == NULL || bad(key))
+ return APR_EINVAL;
+ if (apr_sdbm_rdonly(db))
+ return APR_EINVAL;
+ need = key.dsize + val.dsize;
+ /*
+ * is the pair too big (or too small) for this database ??
+ */
+ if (need < 0 || need > PAIRMAX)
+ return APR_EINVAL;
+
+ if ((status = apr_sdbm_lock(db, APR_FLOCK_EXCLUSIVE)) != APR_SUCCESS)
+ return status;
+
+ if ((status = getpage(db, (hash = exhash(key)))) == APR_SUCCESS) {
+
+ /*
+ * if we need to replace, delete the key/data pair
+ * first. If it is not there, ignore.
+ */
+ if (flags == APR_SDBM_REPLACE)
+ (void) delpair(db->pagbuf, key);
+ else if (!(flags & APR_SDBM_INSERTDUP) && duppair(db->pagbuf, key)) {
+ status = APR_EEXIST;
+ goto error;
+ }
+ /*
+ * if we do not have enough room, we have to split.
+ */
+ if (!fitpair(db->pagbuf, need))
+ if ((status = makroom(db, hash, need)) != APR_SUCCESS)
+ goto error;
+ /*
+ * we have enough room or split is successful. insert the key,
+ * and update the page file.
+ */
+ (void) putpair(db->pagbuf, key, val);
+
+ status = write_page(db, db->pagbuf, db->pagbno);
+ }
+
+error:
+ (void) apr_sdbm_unlock(db);
+
+ return status;
+}
+
+/*
+ * makroom - make room by splitting the overfull page
+ * this routine will attempt to make room for SPLTMAX times before
+ * giving up.
+ */
+static apr_status_t makroom(apr_sdbm_t *db, long hash, int need)
+{
+ long newp;
+ char twin[PBLKSIZ];
+ char *pag = db->pagbuf;
+ char *new = twin;
+ register int smax = SPLTMAX;
+ apr_status_t status;
+
+ do {
+ /*
+ * split the current page
+ */
+ (void) splpage(pag, new, db->hmask + 1);
+ /*
+ * address of the new page
+ */
+ newp = (hash & db->hmask) | (db->hmask + 1);
+
+ /*
+ * write delay, read avoidence/cache shuffle:
+ * select the page for incoming pair: if key is to go to the new page,
+ * write out the previous one, and copy the new one over, thus making
+ * it the current page. If not, simply write the new page, and we are
+ * still looking at the page of interest. current page is not updated
+ * here, as sdbm_store will do so, after it inserts the incoming pair.
+ */
+ if (hash & (db->hmask + 1)) {
+ if ((status = write_page(db, db->pagbuf, db->pagbno))
+ != APR_SUCCESS)
+ return status;
+
+ db->pagbno = newp;
+ (void) memcpy(pag, new, PBLKSIZ);
+ }
+ else {
+ if ((status = write_page(db, new, newp)) != APR_SUCCESS)
+ return status;
+ }
+
+ if ((status = setdbit(db, db->curbit)) != APR_SUCCESS)
+ return status;
+ /*
+ * see if we have enough room now
+ */
+ if (fitpair(pag, need))
+ return APR_SUCCESS;
+ /*
+ * try again... update curbit and hmask as getpage would have
+ * done. because of our update of the current page, we do not
+ * need to read in anything. BUT we have to write the current
+ * [deferred] page out, as the window of failure is too great.
+ */
+ db->curbit = 2 * db->curbit
+ + ((hash & (db->hmask + 1)) ? 2 : 1);
+ db->hmask |= db->hmask + 1;
+
+ if ((status = write_page(db, db->pagbuf, db->pagbno))
+ != APR_SUCCESS)
+ return status;
+
+ } while (--smax);
+
+ /*
+ * if we are here, this is real bad news. After SPLTMAX splits,
+ * we still cannot fit the key. say goodnight.
+ */
+#if 0
+ (void) write(2, "sdbm: cannot insert after SPLTMAX attempts.\n", 44);
+#endif
+ /* ### ENOSPC not really appropriate but better than nothing */
+ return APR_ENOSPC;
+
+}
+
+/* Reads 'len' bytes from file 'f' at offset 'off' into buf.
+ * 'off' is given relative to the start of the file.
+ * If EOF is returned while reading, this is taken as success.
+ */
+static apr_status_t read_from(apr_file_t *f, void *buf,
+ apr_off_t off, apr_size_t len)
+{
+ apr_status_t status;
+
+ if ((status = apr_file_seek(f, APR_SET, &off)) != APR_SUCCESS ||
+ ((status = apr_file_read_full(f, buf, len, NULL)) != APR_SUCCESS)) {
+ /* if EOF is reached, pretend we read all zero's */
+ if (status == APR_EOF) {
+ memset(buf, 0, len);
+ status = APR_SUCCESS;
+ }
+ }
+
+ return status;
+}
+
+/*
+ * the following two routines will break if
+ * deletions aren't taken into account. (ndbm bug)
+ */
+APU_DECLARE(apr_status_t) apr_sdbm_firstkey(apr_sdbm_t *db,
+ apr_sdbm_datum_t *key)
+{
+ apr_status_t status;
+
+ if ((status = apr_sdbm_lock(db, APR_FLOCK_SHARED)) != APR_SUCCESS)
+ return status;
+
+ /*
+ * start at page 0
+ */
+ if ((status = read_from(db->pagf, db->pagbuf, OFF_PAG(0), PBLKSIZ))
+ == APR_SUCCESS) {
+ db->pagbno = 0;
+ db->blkptr = 0;
+ db->keyptr = 0;
+ status = getnext(key, db);
+ }
+
+ (void) apr_sdbm_unlock(db);
+
+ return status;
+}
+
+APU_DECLARE(apr_status_t) apr_sdbm_nextkey(apr_sdbm_t *db,
+ apr_sdbm_datum_t *key)
+{
+ apr_status_t status;
+
+ if ((status = apr_sdbm_lock(db, APR_FLOCK_SHARED)) != APR_SUCCESS)
+ return status;
+
+ status = getnext(key, db);
+
+ (void) apr_sdbm_unlock(db);
+
+ return status;
+}
+
+/*
+ * all important binary tree traversal
+ */
+static apr_status_t getpage(apr_sdbm_t *db, long hash)
+{
+ register int hbit;
+ register long dbit;
+ register long pagb;
+ apr_status_t status;
+
+ dbit = 0;
+ hbit = 0;
+ while (dbit < db->maxbno && getdbit(db, dbit))
+ dbit = 2 * dbit + ((hash & (1 << hbit++)) ? 2 : 1);
+
+ debug(("dbit: %d...", dbit));
+
+ db->curbit = dbit;
+ db->hmask = masks[hbit];
+
+ pagb = hash & db->hmask;
+ /*
+ * see if the block we need is already in memory.
+ * note: this lookaside cache has about 10% hit rate.
+ */
+ if (pagb != db->pagbno) {
+ /*
+ * note: here, we assume a "hole" is read as 0s.
+ * if not, must zero pagbuf first.
+ * ### joe: this assumption was surely never correct? but
+ * ### we make it so in read_from anyway.
+ */
+ if ((status = read_from(db->pagf, db->pagbuf, OFF_PAG(pagb), PBLKSIZ))
+ != APR_SUCCESS)
+ return status;
+
+ if (!chkpage(db->pagbuf))
+ return APR_ENOSPC; /* ### better error? */
+ db->pagbno = pagb;
+
+ debug(("pag read: %d\n", pagb));
+ }
+ return APR_SUCCESS;
+}
+
+static int getdbit(apr_sdbm_t *db, long dbit)
+{
+ register long c;
+ register long dirb;
+
+ c = dbit / BYTESIZ;
+ dirb = c / DBLKSIZ;
+
+ if (dirb != db->dirbno) {
+ if (read_from(db->dirf, db->dirbuf, OFF_DIR(dirb), DBLKSIZ)
+ != APR_SUCCESS)
+ return 0;
+
+ db->dirbno = dirb;
+
+ debug(("dir read: %d\n", dirb));
+ }
+
+ return db->dirbuf[c % DBLKSIZ] & (1 << dbit % BYTESIZ);
+}
+
+static apr_status_t setdbit(apr_sdbm_t *db, long dbit)
+{
+ register long c;
+ register long dirb;
+ apr_status_t status;
+ apr_off_t off;
+
+ c = dbit / BYTESIZ;
+ dirb = c / DBLKSIZ;
+
+ if (dirb != db->dirbno) {
+ if ((status = read_from(db->dirf, db->dirbuf, OFF_DIR(dirb), DBLKSIZ))
+ != APR_SUCCESS)
+ return status;
+
+ db->dirbno = dirb;
+
+ debug(("dir read: %d\n", dirb));
+ }
+
+ db->dirbuf[c % DBLKSIZ] |= (1 << dbit % BYTESIZ);
+
+ if (dbit >= db->maxbno)
+ db->maxbno += DBLKSIZ * BYTESIZ;
+
+ off = OFF_DIR(dirb);
+ if ((status = apr_file_seek(db->dirf, APR_SET, &off)) == APR_SUCCESS)
+ status = apr_file_write_full(db->dirf, db->dirbuf, DBLKSIZ, NULL);
+
+ return status;
+}
+
+/*
+* getnext - get the next key in the page, and if done with
+* the page, try the next page in sequence
+*/
+static apr_status_t getnext(apr_sdbm_datum_t *key, apr_sdbm_t *db)
+{
+ apr_status_t status;
+ for (;;) {
+ db->keyptr++;
+ *key = getnkey(db->pagbuf, db->keyptr);
+ if (key->dptr != NULL)
+ return APR_SUCCESS;
+ /*
+ * we either run out, or there is nothing on this page..
+ * try the next one... If we lost our position on the
+ * file, we will have to seek.
+ */
+ db->keyptr = 0;
+ if (db->pagbno != db->blkptr++) {
+ apr_off_t off = OFF_PAG(db->blkptr);
+ if ((status = apr_file_seek(db->pagf, APR_SET, &off))
+ != APR_SUCCESS)
+ return status;
+ }
+
+ db->pagbno = db->blkptr;
+ /* ### EOF acceptable here too? */
+ if ((status = apr_file_read_full(db->pagf, db->pagbuf, PBLKSIZ, NULL))
+ != APR_SUCCESS)
+ return status;
+ if (!chkpage(db->pagbuf))
+ return APR_EGENERAL; /* ### need better error */
+ }
+
+ /* NOTREACHED */
+}
+
+
+APU_DECLARE(int) apr_sdbm_rdonly(apr_sdbm_t *db)
+{
+ /* ### Should we return true if the first lock is a share lock,
+ * to reflect that apr_sdbm_store and apr_sdbm_delete will fail?
+ */
+ return (db->flags & SDBM_RDONLY) != 0;
+}
+
diff --git a/contrib/apr-util/dbm/sdbm/sdbm_hash.c b/contrib/apr-util/dbm/sdbm/sdbm_hash.c
new file mode 100644
index 000000000000..e4d751794511
--- /dev/null
+++ b/contrib/apr-util/dbm/sdbm/sdbm_hash.c
@@ -0,0 +1,63 @@
+/* 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.
+ */
+
+/*
+ * sdbm - ndbm work-alike hashed database library
+ * based on Per-Aake Larson's Dynamic Hashing algorithms. BIT 18 (1978).
+ * author: oz@nexus.yorku.ca
+ * status: ex-public domain. keep it that way.
+ *
+ * hashing routine
+ */
+
+#include "apr_sdbm.h"
+#include "sdbm_private.h"
+
+/*
+ * polynomial conversion ignoring overflows
+ * [this seems to work remarkably well, in fact better
+ * then the ndbm hash function. Replace at your own risk]
+ * use: 65599 nice.
+ * 65587 even better.
+ */
+long sdbm_hash(const char *str, int len)
+{
+ register unsigned long n = 0;
+
+#define DUFF /* go ahead and use the loop-unrolled version */
+#ifdef DUFF
+
+#define HASHC n = *str++ + 65599 * n
+
+ if (len > 0) {
+ register int loop = (len + 8 - 1) >> 3;
+
+ switch(len & (8 - 1)) {
+ case 0: do {
+ HASHC; case 7: HASHC;
+ case 6: HASHC; case 5: HASHC;
+ case 4: HASHC; case 3: HASHC;
+ case 2: HASHC; case 1: HASHC;
+ } while (--loop);
+ }
+
+ }
+#else
+ while (len--)
+ n = *str++ + 65599 * n;
+#endif
+ return n;
+}
diff --git a/contrib/apr-util/dbm/sdbm/sdbm_lock.c b/contrib/apr-util/dbm/sdbm/sdbm_lock.c
new file mode 100644
index 000000000000..7d62ffd62e2e
--- /dev/null
+++ b/contrib/apr-util/dbm/sdbm/sdbm_lock.c
@@ -0,0 +1,79 @@
+/* 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_file_info.h"
+#include "apr_file_io.h"
+#include "apr_sdbm.h"
+
+#include "sdbm_private.h"
+#include "sdbm_tune.h"
+
+/* NOTE: this function may block until it acquires the lock */
+APU_DECLARE(apr_status_t) apr_sdbm_lock(apr_sdbm_t *db, int type)
+{
+ apr_status_t status;
+ int lock_type = type & APR_FLOCK_TYPEMASK;
+
+ if (!(lock_type == APR_FLOCK_SHARED || lock_type == APR_FLOCK_EXCLUSIVE))
+ return APR_EINVAL;
+
+ if (db->flags & SDBM_EXCLUSIVE_LOCK) {
+ ++db->lckcnt;
+ return APR_SUCCESS;
+ }
+ else if (db->flags & SDBM_SHARED_LOCK) {
+ /*
+ * Cannot promote a shared lock to an exlusive lock
+ * in a cross-platform compatibile manner.
+ */
+ if (type == APR_FLOCK_EXCLUSIVE)
+ return APR_EINVAL;
+ ++db->lckcnt;
+ return APR_SUCCESS;
+ }
+ /*
+ * zero size: either a fresh database, or one with a single,
+ * unsplit data page: dirpage is all zeros.
+ */
+ if ((status = apr_file_lock(db->dirf, type)) == APR_SUCCESS)
+ {
+ apr_finfo_t finfo;
+ if ((status = apr_file_info_get(&finfo, APR_FINFO_SIZE, db->dirf))
+ != APR_SUCCESS) {
+ (void) apr_file_unlock(db->dirf);
+ return status;
+ }
+
+ SDBM_INVALIDATE_CACHE(db, finfo);
+
+ ++db->lckcnt;
+ if (type == APR_FLOCK_SHARED)
+ db->flags |= SDBM_SHARED_LOCK;
+ else if (type == APR_FLOCK_EXCLUSIVE)
+ db->flags |= SDBM_EXCLUSIVE_LOCK;
+ }
+ return status;
+}
+
+APU_DECLARE(apr_status_t) apr_sdbm_unlock(apr_sdbm_t *db)
+{
+ if (!(db->flags & (SDBM_SHARED_LOCK | SDBM_EXCLUSIVE_LOCK)))
+ return APR_EINVAL;
+ if (--db->lckcnt > 0)
+ return APR_SUCCESS;
+ db->flags &= ~(SDBM_SHARED_LOCK | SDBM_EXCLUSIVE_LOCK);
+ return apr_file_unlock(db->dirf);
+}
diff --git a/contrib/apr-util/dbm/sdbm/sdbm_pair.c b/contrib/apr-util/dbm/sdbm/sdbm_pair.c
new file mode 100644
index 000000000000..2130200734e8
--- /dev/null
+++ b/contrib/apr-util/dbm/sdbm/sdbm_pair.c
@@ -0,0 +1,319 @@
+/* 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.
+ */
+
+/*
+ * sdbm - ndbm work-alike hashed database library
+ * based on Per-Aake Larson's Dynamic Hashing algorithms. BIT 18 (1978).
+ * author: oz@nexus.yorku.ca
+ * status: ex-public domain.
+ *
+ * page-level routines
+ */
+
+#include "apr_sdbm.h"
+
+#include "sdbm_tune.h"
+#include "sdbm_pair.h"
+#include "sdbm_private.h"
+
+#include <string.h> /* for memset() */
+
+
+#define exhash(item) sdbm_hash((item).dptr, (item).dsize)
+
+/*
+ * forward
+ */
+static int seepair(char *, int, char *, int);
+
+/*
+ * page format:
+ * +------------------------------+
+ * ino | n | keyoff | datoff | keyoff |
+ * +------------+--------+--------+
+ * | datoff | - - - ----> |
+ * +--------+---------------------+
+ * | F R E E A R E A |
+ * +--------------+---------------+
+ * | <---- - - - | data |
+ * +--------+-----+----+----------+
+ * | key | data | key |
+ * +--------+----------+----------+
+ *
+ * calculating the offsets for free area: if the number
+ * of entries (ino[0]) is zero, the offset to the END of
+ * the free area is the block size. Otherwise, it is the
+ * nth (ino[ino[0]]) entry's offset.
+ */
+
+int
+fitpair(pag, need)
+char *pag;
+int need;
+{
+ register int n;
+ register int off;
+ register int avail;
+ register short *ino = (short *) pag;
+
+ off = ((n = ino[0]) > 0) ? ino[n] : PBLKSIZ;
+ avail = off - (n + 1) * sizeof(short);
+ need += 2 * sizeof(short);
+
+ debug(("avail %d need %d\n", avail, need));
+
+ return need <= avail;
+}
+
+void
+putpair(pag, key, val)
+char *pag;
+apr_sdbm_datum_t key;
+apr_sdbm_datum_t val;
+{
+ register int n;
+ register int off;
+ register short *ino = (short *) pag;
+
+ off = ((n = ino[0]) > 0) ? ino[n] : PBLKSIZ;
+/*
+ * enter the key first
+ */
+ off -= key.dsize;
+ (void) memcpy(pag + off, key.dptr, key.dsize);
+ ino[n + 1] = off;
+/*
+ * now the data
+ */
+ off -= val.dsize;
+ (void) memcpy(pag + off, val.dptr, val.dsize);
+ ino[n + 2] = off;
+/*
+ * adjust item count
+ */
+ ino[0] += 2;
+}
+
+apr_sdbm_datum_t
+getpair(pag, key)
+char *pag;
+apr_sdbm_datum_t key;
+{
+ register int i;
+ register int n;
+ apr_sdbm_datum_t val;
+ register short *ino = (short *) pag;
+
+ if ((n = ino[0]) == 0)
+ return sdbm_nullitem;
+
+ if ((i = seepair(pag, n, key.dptr, key.dsize)) == 0)
+ return sdbm_nullitem;
+
+ val.dptr = pag + ino[i + 1];
+ val.dsize = ino[i] - ino[i + 1];
+ return val;
+}
+
+int
+duppair(pag, key)
+char *pag;
+apr_sdbm_datum_t key;
+{
+ register short *ino = (short *) pag;
+ return ino[0] > 0 && seepair(pag, ino[0], key.dptr, key.dsize) > 0;
+}
+
+apr_sdbm_datum_t
+getnkey(pag, num)
+char *pag;
+int num;
+{
+ apr_sdbm_datum_t key;
+ register int off;
+ register short *ino = (short *) pag;
+
+ num = num * 2 - 1;
+ if (ino[0] == 0 || num > ino[0])
+ return sdbm_nullitem;
+
+ off = (num > 1) ? ino[num - 1] : PBLKSIZ;
+
+ key.dptr = pag + ino[num];
+ key.dsize = off - ino[num];
+
+ return key;
+}
+
+int
+delpair(pag, key)
+char *pag;
+apr_sdbm_datum_t key;
+{
+ register int n;
+ register int i;
+ register short *ino = (short *) pag;
+
+ if ((n = ino[0]) == 0)
+ return 0;
+
+ if ((i = seepair(pag, n, key.dptr, key.dsize)) == 0)
+ return 0;
+/*
+ * found the key. if it is the last entry
+ * [i.e. i == n - 1] we just adjust the entry count.
+ * hard case: move all data down onto the deleted pair,
+ * shift offsets onto deleted offsets, and adjust them.
+ * [note: 0 < i < n]
+ */
+ if (i < n - 1) {
+ register int m;
+ register char *dst = pag + (i == 1 ? PBLKSIZ : ino[i - 1]);
+ register char *src = pag + ino[i + 1];
+ register short zoo = (short) (dst - src);
+
+ debug(("free-up %d ", zoo));
+/*
+ * shift data/keys down
+ */
+ m = ino[i + 1] - ino[n];
+
+#undef DUFF /* just use memmove. it should be plenty fast. */
+#ifdef DUFF
+#define MOVB *--dst = *--src
+
+ if (m > 0) {
+ register int loop = (m + 8 - 1) >> 3;
+
+ switch (m & (8 - 1)) {
+ case 0: do {
+ MOVB; case 7: MOVB;
+ case 6: MOVB; case 5: MOVB;
+ case 4: MOVB; case 3: MOVB;
+ case 2: MOVB; case 1: MOVB;
+ } while (--loop);
+ }
+ }
+#else
+ dst -= m;
+ src -= m;
+ memmove(dst, src, m);
+#endif
+
+/*
+ * adjust offset index up
+ */
+ while (i < n - 1) {
+ ino[i] = ino[i + 2] + zoo;
+ i++;
+ }
+ }
+ ino[0] -= 2;
+ return 1;
+}
+
+/*
+ * search for the key in the page.
+ * return offset index in the range 0 < i < n.
+ * return 0 if not found.
+ */
+static int
+seepair(pag, n, key, siz)
+char *pag;
+register int n;
+register char *key;
+register int siz;
+{
+ register int i;
+ register int off = PBLKSIZ;
+ register short *ino = (short *) pag;
+
+ for (i = 1; i < n; i += 2) {
+ if (siz == off - ino[i] &&
+ memcmp(key, pag + ino[i], siz) == 0)
+ return i;
+ off = ino[i + 1];
+ }
+ return 0;
+}
+
+void
+splpage(pag, new, sbit)
+char *pag;
+char *new;
+long sbit;
+{
+ apr_sdbm_datum_t key;
+ apr_sdbm_datum_t val;
+
+ register int n;
+ register int off = PBLKSIZ;
+ char cur[PBLKSIZ];
+ register short *ino = (short *) cur;
+
+ (void) memcpy(cur, pag, PBLKSIZ);
+ (void) memset(pag, 0, PBLKSIZ);
+ (void) memset(new, 0, PBLKSIZ);
+
+ n = ino[0];
+ for (ino++; n > 0; ino += 2) {
+ key.dptr = cur + ino[0];
+ key.dsize = off - ino[0];
+ val.dptr = cur + ino[1];
+ val.dsize = ino[0] - ino[1];
+/*
+ * select the page pointer (by looking at sbit) and insert
+ */
+ (void) putpair((exhash(key) & sbit) ? new : pag, key, val);
+
+ off = ino[1];
+ n -= 2;
+ }
+
+ debug(("%d split %d/%d\n", ((short *) cur)[0] / 2,
+ ((short *) new)[0] / 2,
+ ((short *) pag)[0] / 2));
+}
+
+/*
+ * check page sanity:
+ * number of entries should be something
+ * reasonable, and all offsets in the index should be in order.
+ * this could be made more rigorous.
+ */
+int
+chkpage(pag)
+char *pag;
+{
+ register int n;
+ register int off;
+ register short *ino = (short *) pag;
+
+ if ((n = ino[0]) < 0 || n > PBLKSIZ / sizeof(short))
+ return 0;
+
+ if (n > 0) {
+ off = PBLKSIZ;
+ for (ino++; n > 0; ino += 2) {
+ if (ino[0] > off || ino[1] > off ||
+ ino[1] > ino[0])
+ return 0;
+ off = ino[1];
+ n -= 2;
+ }
+ }
+ return 1;
+}
diff --git a/contrib/apr-util/dbm/sdbm/sdbm_pair.h b/contrib/apr-util/dbm/sdbm/sdbm_pair.h
new file mode 100644
index 000000000000..222c5e17f4ba
--- /dev/null
+++ b/contrib/apr-util/dbm/sdbm/sdbm_pair.h
@@ -0,0 +1,40 @@
+/* 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.
+ */
+
+#ifndef SDBM_PAIR_H
+#define SDBM_PAIR_H
+
+/* Mini EMBED (pair.c) */
+#define chkpage apu__sdbm_chkpage
+#define delpair apu__sdbm_delpair
+#define duppair apu__sdbm_duppair
+#define fitpair apu__sdbm_fitpair
+#define getnkey apu__sdbm_getnkey
+#define getpair apu__sdbm_getpair
+#define putpair apu__sdbm_putpair
+#define splpage apu__sdbm_splpage
+
+int fitpair(char *, int);
+void putpair(char *, apr_sdbm_datum_t, apr_sdbm_datum_t);
+apr_sdbm_datum_t getpair(char *, apr_sdbm_datum_t);
+int delpair(char *, apr_sdbm_datum_t);
+int chkpage (char *);
+apr_sdbm_datum_t getnkey(char *, int);
+void splpage(char *, char *, long);
+int duppair(char *, apr_sdbm_datum_t);
+
+#endif /* SDBM_PAIR_H */
+
diff --git a/contrib/apr-util/dbm/sdbm/sdbm_private.h b/contrib/apr-util/dbm/sdbm/sdbm_private.h
new file mode 100644
index 000000000000..f5d1ae06b566
--- /dev/null
+++ b/contrib/apr-util/dbm/sdbm/sdbm_private.h
@@ -0,0 +1,84 @@
+/* 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.
+ */
+
+/*
+ * sdbm - ndbm work-alike hashed database library
+ * based on Per-Ake Larson's Dynamic Hashing algorithms. BIT 18 (1978).
+ * author: oz@nexus.yorku.ca
+ */
+
+#ifndef SDBM_PRIVATE_H
+#define SDBM_PRIVATE_H
+
+#include "apr.h"
+#include "apr_pools.h"
+#include "apr_file_io.h"
+#include "apr_errno.h" /* for apr_status_t */
+
+#if 0
+/* if the block/page size is increased, it breaks perl apr_sdbm_t compatibility */
+#define DBLKSIZ 16384
+#define PBLKSIZ 8192
+#define PAIRMAX 8008 /* arbitrary on PBLKSIZ-N */
+#else
+#define DBLKSIZ 4096
+#define PBLKSIZ 1024
+#define PAIRMAX 1008 /* arbitrary on PBLKSIZ-N */
+#endif
+#define SPLTMAX 10 /* maximum allowed splits */
+
+/* for apr_sdbm_t.flags */
+#define SDBM_RDONLY 0x1 /* data base open read-only */
+#define SDBM_SHARED 0x2 /* data base open for sharing */
+#define SDBM_SHARED_LOCK 0x4 /* data base locked for shared read */
+#define SDBM_EXCLUSIVE_LOCK 0x8 /* data base locked for write */
+
+struct apr_sdbm_t {
+ apr_pool_t *pool;
+ apr_file_t *dirf; /* directory file descriptor */
+ apr_file_t *pagf; /* page file descriptor */
+ apr_int32_t flags; /* status/error flags, see below */
+ long maxbno; /* size of dirfile in bits */
+ long curbit; /* current bit number */
+ long hmask; /* current hash mask */
+ long blkptr; /* current block for nextkey */
+ int keyptr; /* current key for nextkey */
+ long blkno; /* current page to read/write */
+ long pagbno; /* current page in pagbuf */
+ char pagbuf[PBLKSIZ]; /* page file block buffer */
+ long dirbno; /* current block in dirbuf */
+ char dirbuf[DBLKSIZ]; /* directory file block buffer */
+ int lckcnt; /* number of calls to sdbm_lock */
+};
+
+
+#define sdbm_hash apu__sdbm_hash
+#define sdbm_nullitem apu__sdbm_nullitem
+
+extern const apr_sdbm_datum_t sdbm_nullitem;
+
+long sdbm_hash(const char *str, int len);
+
+/*
+ * zero the cache
+ */
+#define SDBM_INVALIDATE_CACHE(db, finfo) \
+ do { db->dirbno = (!finfo.size) ? 0 : -1; \
+ db->pagbno = -1; \
+ db->maxbno = (long)(finfo.size * BYTESIZ); \
+ } while (0);
+
+#endif /* SDBM_PRIVATE_H */
diff --git a/contrib/apr-util/dbm/sdbm/sdbm_tune.h b/contrib/apr-util/dbm/sdbm/sdbm_tune.h
new file mode 100644
index 000000000000..9bf3d09f2885
--- /dev/null
+++ b/contrib/apr-util/dbm/sdbm/sdbm_tune.h
@@ -0,0 +1,40 @@
+/* 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.
+ */
+
+/*
+ * sdbm - ndbm work-alike hashed database library
+ * tuning and portability constructs [not nearly enough]
+ * author: oz@nexus.yorku.ca
+ */
+
+#ifndef SDBM_TUNE_H
+#define SDBM_TUNE_H
+
+#include "apr_errno.h"
+
+/* ### this might be better off as sizeof(char *) */
+#define BYTESIZ 8
+
+/*
+ * misc
+ */
+#ifdef DEBUG
+#define debug(x) printf x
+#else
+#define debug(x)
+#endif
+
+#endif /* SDBM_TUNE_H */
diff --git a/contrib/apr-util/docs/doxygen.conf b/contrib/apr-util/docs/doxygen.conf
new file mode 100644
index 000000000000..e9ba149b33d6
--- /dev/null
+++ b/contrib/apr-util/docs/doxygen.conf
@@ -0,0 +1,32 @@
+PROJECT_NAME="Apache Portable Runtime Utility Library"
+
+INPUT=.
+QUIET=YES
+RECURSIVE=YES
+FILE_PATTERNS=*.h
+
+OUTPUT_DIRECTORY=docs/dox
+
+MACRO_EXPANSION=YES
+EXPAND_ONLY_PREDEF=YES
+#EXPAND_AS_DEFINED=
+# not sure why this doesn't work as EXPAND_AS_DEFINED, it should!
+PREDEFINED="APU_DECLARE(x)=x" \
+ "APU_DECLARE_NONSTD(x)=x" \
+ "APU_DECLARE_DATA" \
+ "APU_MODULE_DECLARE_DATA" \
+ "APU_DECLARE_LDAP(x)=x" \
+ "APR_HAS_MMAP" \
+ "APR_HAS_THREADS" \
+ "APR_HAS_XLATE" \
+ "__attribute__(x)=" \
+ DOXYGEN=
+
+OPTIMIZE_OUTPUT_FOR_C=YES
+
+FULL_PATH_NAMES=YES
+CASE_SENSE_NAMES=NO
+# some autoconf guru needs to make configure set this correctly...
+#STRIP_FROM_PATH=/root/apache/httpd-2.0-8/srclib/apr-util
+
+GENERATE_TAGFILE=docs/dox/apu.tag
diff --git a/contrib/apr-util/encoding/apr_base64.c b/contrib/apr-util/encoding/apr_base64.c
new file mode 100644
index 000000000000..1eed1530dff4
--- /dev/null
+++ b/contrib/apr-util/encoding/apr_base64.c
@@ -0,0 +1,268 @@
+/* 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.
+ */
+
+/* base64 encoder/decoder. Originally part of main/util.c
+ * but moved here so that support/ab and apr_sha1.c could
+ * use it. This meant removing the apr_palloc()s and adding
+ * ugly 'len' functions, which is quite a nasty cost.
+ */
+
+#include "apr_base64.h"
+#if APR_CHARSET_EBCDIC
+#include "apr_xlate.h"
+#endif /* APR_CHARSET_EBCDIC */
+
+/* aaaack but it's fast and const should make it shared text page. */
+static const unsigned char pr2six[256] =
+{
+#if !APR_CHARSET_EBCDIC
+ /* ASCII table */
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63,
+ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64,
+ 64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64,
+ 64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
+#else /*APR_CHARSET_EBCDIC*/
+ /* EBCDIC table */
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 63, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 64, 64, 64, 64, 64, 64,
+ 64, 35, 36, 37, 38, 39, 40, 41, 42, 43, 64, 64, 64, 64, 64, 64,
+ 64, 64, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 64, 64, 64, 64, 64, 64,
+ 64, 9, 10, 11, 12, 13, 14, 15, 16, 17, 64, 64, 64, 64, 64, 64,
+ 64, 64, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64, 64,
+ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64
+#endif /*APR_CHARSET_EBCDIC*/
+};
+
+#if APR_CHARSET_EBCDIC
+static apr_xlate_t *xlate_to_ebcdic;
+static unsigned char os_toascii[256];
+
+APU_DECLARE(apr_status_t) apr_base64init_ebcdic(apr_xlate_t *to_ascii,
+ apr_xlate_t *to_ebcdic)
+{
+ int i;
+ apr_size_t inbytes_left, outbytes_left;
+ apr_status_t rv;
+ int onoff;
+
+ /* Only single-byte conversion is supported.
+ */
+ rv = apr_xlate_sb_get(to_ascii, &onoff);
+ if (rv) {
+ return rv;
+ }
+ if (!onoff) { /* If conversion is not single-byte-only */
+ return APR_EINVAL;
+ }
+ rv = apr_xlate_sb_get(to_ebcdic, &onoff);
+ if (rv) {
+ return rv;
+ }
+ if (!onoff) { /* If conversion is not single-byte-only */
+ return APR_EINVAL;
+ }
+ xlate_to_ebcdic = to_ebcdic;
+ for (i = 0; i < sizeof(os_toascii); i++) {
+ os_toascii[i] = i;
+ }
+ inbytes_left = outbytes_left = sizeof(os_toascii);
+ apr_xlate_conv_buffer(to_ascii, os_toascii, &inbytes_left,
+ os_toascii, &outbytes_left);
+
+ return APR_SUCCESS;
+}
+#endif /*APR_CHARSET_EBCDIC*/
+
+APU_DECLARE(int) apr_base64_decode_len(const char *bufcoded)
+{
+ int nbytesdecoded;
+ register const unsigned char *bufin;
+ register apr_size_t nprbytes;
+
+ bufin = (const unsigned char *) bufcoded;
+ while (pr2six[*(bufin++)] <= 63);
+
+ nprbytes = (bufin - (const unsigned char *) bufcoded) - 1;
+ nbytesdecoded = (((int)nprbytes + 3) / 4) * 3;
+
+ return nbytesdecoded + 1;
+}
+
+APU_DECLARE(int) apr_base64_decode(char *bufplain, const char *bufcoded)
+{
+#if APR_CHARSET_EBCDIC
+ apr_size_t inbytes_left, outbytes_left;
+#endif /* APR_CHARSET_EBCDIC */
+ int len;
+
+ len = apr_base64_decode_binary((unsigned char *) bufplain, bufcoded);
+#if APR_CHARSET_EBCDIC
+ inbytes_left = outbytes_left = len;
+ apr_xlate_conv_buffer(xlate_to_ebcdic, bufplain, &inbytes_left,
+ bufplain, &outbytes_left);
+#endif /* APR_CHARSET_EBCDIC */
+ bufplain[len] = '\0';
+ return len;
+}
+
+/* This is the same as apr_base64_decode() except on EBCDIC machines, where
+ * the conversion of the output to ebcdic is left out.
+ */
+APU_DECLARE(int) apr_base64_decode_binary(unsigned char *bufplain,
+ const char *bufcoded)
+{
+ int nbytesdecoded;
+ register const unsigned char *bufin;
+ register unsigned char *bufout;
+ register apr_size_t nprbytes;
+
+ bufin = (const unsigned char *) bufcoded;
+ while (pr2six[*(bufin++)] <= 63);
+ nprbytes = (bufin - (const unsigned char *) bufcoded) - 1;
+ nbytesdecoded = (((int)nprbytes + 3) / 4) * 3;
+
+ bufout = (unsigned char *) bufplain;
+ bufin = (const unsigned char *) bufcoded;
+
+ while (nprbytes > 4) {
+ *(bufout++) =
+ (unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);
+ *(bufout++) =
+ (unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);
+ *(bufout++) =
+ (unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);
+ bufin += 4;
+ nprbytes -= 4;
+ }
+
+ /* Note: (nprbytes == 1) would be an error, so just ingore that case */
+ if (nprbytes > 1) {
+ *(bufout++) =
+ (unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);
+ }
+ if (nprbytes > 2) {
+ *(bufout++) =
+ (unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);
+ }
+ if (nprbytes > 3) {
+ *(bufout++) =
+ (unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);
+ }
+
+ nbytesdecoded -= (4 - (int)nprbytes) & 3;
+ return nbytesdecoded;
+}
+
+static const char basis_64[] =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+APU_DECLARE(int) apr_base64_encode_len(int len)
+{
+ return ((len + 2) / 3 * 4) + 1;
+}
+
+APU_DECLARE(int) apr_base64_encode(char *encoded, const char *string, int len)
+{
+#if !APR_CHARSET_EBCDIC
+ return apr_base64_encode_binary(encoded, (const unsigned char *) string, len);
+#else /* APR_CHARSET_EBCDIC */
+ int i;
+ char *p;
+
+ p = encoded;
+ for (i = 0; i < len - 2; i += 3) {
+ *p++ = basis_64[(os_toascii[string[i]] >> 2) & 0x3F];
+ *p++ = basis_64[((os_toascii[string[i]] & 0x3) << 4) |
+ ((int) (os_toascii[string[i + 1]] & 0xF0) >> 4)];
+ *p++ = basis_64[((os_toascii[string[i + 1]] & 0xF) << 2) |
+ ((int) (os_toascii[string[i + 2]] & 0xC0) >> 6)];
+ *p++ = basis_64[os_toascii[string[i + 2]] & 0x3F];
+ }
+ if (i < len) {
+ *p++ = basis_64[(os_toascii[string[i]] >> 2) & 0x3F];
+ if (i == (len - 1)) {
+ *p++ = basis_64[((os_toascii[string[i]] & 0x3) << 4)];
+ *p++ = '=';
+ }
+ else {
+ *p++ = basis_64[((os_toascii[string[i]] & 0x3) << 4) |
+ ((int) (os_toascii[string[i + 1]] & 0xF0) >> 4)];
+ *p++ = basis_64[((os_toascii[string[i + 1]] & 0xF) << 2)];
+ }
+ *p++ = '=';
+ }
+
+ *p++ = '\0';
+ return p - encoded;
+#endif /* APR_CHARSET_EBCDIC */
+}
+
+/* This is the same as apr_base64_encode() except on EBCDIC machines, where
+ * the conversion of the input to ascii is left out.
+ */
+APU_DECLARE(int) apr_base64_encode_binary(char *encoded,
+ const unsigned char *string, int len)
+{
+ int i;
+ char *p;
+
+ p = encoded;
+ for (i = 0; i < len - 2; i += 3) {
+ *p++ = basis_64[(string[i] >> 2) & 0x3F];
+ *p++ = basis_64[((string[i] & 0x3) << 4) |
+ ((int) (string[i + 1] & 0xF0) >> 4)];
+ *p++ = basis_64[((string[i + 1] & 0xF) << 2) |
+ ((int) (string[i + 2] & 0xC0) >> 6)];
+ *p++ = basis_64[string[i + 2] & 0x3F];
+ }
+ if (i < len) {
+ *p++ = basis_64[(string[i] >> 2) & 0x3F];
+ if (i == (len - 1)) {
+ *p++ = basis_64[((string[i] & 0x3) << 4)];
+ *p++ = '=';
+ }
+ else {
+ *p++ = basis_64[((string[i] & 0x3) << 4) |
+ ((int) (string[i + 1] & 0xF0) >> 4)];
+ *p++ = basis_64[((string[i + 1] & 0xF) << 2)];
+ }
+ *p++ = '=';
+ }
+
+ *p++ = '\0';
+ return (int)(p - encoded);
+}
diff --git a/contrib/apr-util/export_vars.sh.in b/contrib/apr-util/export_vars.sh.in
new file mode 100644
index 000000000000..96a935263193
--- /dev/null
+++ b/contrib/apr-util/export_vars.sh.in
@@ -0,0 +1,13 @@
+#
+# export_vars.sh
+#
+# This shell script is used to export vars to the application using the
+# APRUTIL library. This script should be "sourced" to ensure the variable
+# values are set within the calling script's context. For example:
+#
+# $ . path/to/apr-util/export_vars.sh
+#
+
+APRUTIL_EXPORT_INCLUDES="@APRUTIL_INCLUDES@"
+APRUTIL_EXPORT_LIBS="@APRUTIL_EXPORT_LIBS@"
+APRUTIL_LDFLAGS="@APRUTIL_LDFLAGS@"
diff --git a/contrib/apr-util/hooks/apr_hooks.c b/contrib/apr-util/hooks/apr_hooks.c
new file mode 100644
index 000000000000..4cedb3a585be
--- /dev/null
+++ b/contrib/apr-util/hooks/apr_hooks.c
@@ -0,0 +1,414 @@
+/* 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 <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "apr_pools.h"
+#include "apr_tables.h"
+#include "apr.h"
+#include "apr_hooks.h"
+#include "apr_hash.h"
+#include "apr_optional_hooks.h"
+#include "apr_optional.h"
+#define APR_WANT_MEMFUNC
+#define APR_WANT_STRFUNC
+#include "apr_want.h"
+
+#if 0
+#define apr_palloc(pool,size) malloc(size)
+#endif
+
+APU_DECLARE_DATA apr_pool_t *apr_hook_global_pool = NULL;
+APU_DECLARE_DATA int apr_hook_debug_enabled = 0;
+APU_DECLARE_DATA const char *apr_hook_debug_current = NULL;
+
+/** @deprecated @see apr_hook_global_pool */
+APU_DECLARE_DATA apr_pool_t *apr_global_hook_pool = NULL;
+
+/** @deprecated @see apr_hook_debug_enabled */
+APU_DECLARE_DATA int apr_debug_module_hooks = 0;
+
+/** @deprecated @see apr_hook_debug_current */
+APU_DECLARE_DATA const char *apr_current_hooking_module = NULL;
+
+/* NB: This must echo the LINK_##name structure */
+typedef struct
+{
+ void (*dummy)(void *);
+ const char *szName;
+ const char * const *aszPredecessors;
+ const char * const *aszSuccessors;
+ int nOrder;
+} TSortData;
+
+typedef struct tsort_
+{
+ void *pData;
+ int nPredecessors;
+ struct tsort_ **ppPredecessors;
+ struct tsort_ *pNext;
+} TSort;
+
+#ifdef NETWARE
+#include "apr_private.h"
+#define get_apd APP_DATA* apd = (APP_DATA*)get_app_data(gLibId);
+#define s_aHooksToSort ((apr_array_header_t *)(apd->gs_aHooksToSort))
+#define s_phOptionalHooks ((apr_hash_t *)(apd->gs_phOptionalHooks))
+#define s_phOptionalFunctions ((apr_hash_t *)(apd->gs_phOptionalFunctions))
+#endif
+
+static int crude_order(const void *a_,const void *b_)
+{
+ const TSortData *a=a_;
+ const TSortData *b=b_;
+
+ return a->nOrder-b->nOrder;
+}
+
+static TSort *prepare(apr_pool_t *p,TSortData *pItems,int nItems)
+{
+ TSort *pData=apr_palloc(p,nItems*sizeof *pData);
+ int n;
+
+ qsort(pItems,nItems,sizeof *pItems,crude_order);
+ for(n=0 ; n < nItems ; ++n) {
+ pData[n].nPredecessors=0;
+ pData[n].ppPredecessors=apr_pcalloc(p,nItems*sizeof *pData[n].ppPredecessors);
+ pData[n].pNext=NULL;
+ pData[n].pData=&pItems[n];
+ }
+
+ for(n=0 ; n < nItems ; ++n) {
+ int i,k;
+
+ for(i=0 ; pItems[n].aszPredecessors && pItems[n].aszPredecessors[i] ; ++i)
+ for(k=0 ; k < nItems ; ++k)
+ if(!strcmp(pItems[k].szName,pItems[n].aszPredecessors[i])) {
+ int l;
+
+ for(l=0 ; l < pData[n].nPredecessors ; ++l)
+ if(pData[n].ppPredecessors[l] == &pData[k])
+ goto got_it;
+ pData[n].ppPredecessors[pData[n].nPredecessors]=&pData[k];
+ ++pData[n].nPredecessors;
+ got_it:
+ break;
+ }
+ for(i=0 ; pItems[n].aszSuccessors && pItems[n].aszSuccessors[i] ; ++i)
+ for(k=0 ; k < nItems ; ++k)
+ if(!strcmp(pItems[k].szName,pItems[n].aszSuccessors[i])) {
+ int l;
+
+ for(l=0 ; l < pData[k].nPredecessors ; ++l)
+ if(pData[k].ppPredecessors[l] == &pData[n])
+ goto got_it2;
+ pData[k].ppPredecessors[pData[k].nPredecessors]=&pData[n];
+ ++pData[k].nPredecessors;
+ got_it2:
+ break;
+ }
+ }
+
+ return pData;
+}
+
+/* Topologically sort, dragging out-of-order items to the front. Note that
+ this tends to preserve things that want to be near the front better, and
+ changing that behaviour might compromise some of Apache's behaviour (in
+ particular, mod_log_forensic might otherwise get pushed to the end, and
+ core.c's log open function used to end up at the end when pushing items
+ to the back was the methedology). Also note that the algorithm could
+ go back to its original simplicity by sorting from the back instead of
+ the front.
+*/
+static TSort *tsort(TSort *pData,int nItems)
+{
+ int nTotal;
+ TSort *pHead=NULL;
+ TSort *pTail=NULL;
+
+ for(nTotal=0 ; nTotal < nItems ; ++nTotal) {
+ int n,i,k;
+
+ for(n=0 ; ; ++n) {
+ if(n == nItems)
+ assert(0); /* we have a loop... */
+ if(!pData[n].pNext) {
+ if(pData[n].nPredecessors) {
+ for(k=0 ; ; ++k) {
+ assert(k < nItems);
+ if(pData[n].ppPredecessors[k])
+ break;
+ }
+ for(i=0 ; ; ++i) {
+ assert(i < nItems);
+ if(&pData[i] == pData[n].ppPredecessors[k]) {
+ n=i-1;
+ break;
+ }
+ }
+ } else
+ break;
+ }
+ }
+ if(pTail)
+ pTail->pNext=&pData[n];
+ else
+ pHead=&pData[n];
+ pTail=&pData[n];
+ pTail->pNext=pTail; /* fudge it so it looks linked */
+ for(i=0 ; i < nItems ; ++i)
+ for(k=0 ; k < nItems ; ++k)
+ if(pData[i].ppPredecessors[k] == &pData[n]) {
+ --pData[i].nPredecessors;
+ pData[i].ppPredecessors[k]=NULL;
+ break;
+ }
+ }
+ pTail->pNext=NULL; /* unfudge the tail */
+ return pHead;
+}
+
+static apr_array_header_t *sort_hook(apr_array_header_t *pHooks,
+ const char *szName)
+{
+ apr_pool_t *p;
+ TSort *pSort;
+ apr_array_header_t *pNew;
+ int n;
+
+ apr_pool_create(&p, apr_hook_global_pool);
+ pSort=prepare(p,(TSortData *)pHooks->elts,pHooks->nelts);
+ pSort=tsort(pSort,pHooks->nelts);
+ pNew=apr_array_make(apr_hook_global_pool,pHooks->nelts,sizeof(TSortData));
+ if(apr_hook_debug_enabled)
+ printf("Sorting %s:",szName);
+ for(n=0 ; pSort ; pSort=pSort->pNext,++n) {
+ TSortData *pHook;
+ assert(n < pHooks->nelts);
+ pHook=apr_array_push(pNew);
+ memcpy(pHook,pSort->pData,sizeof *pHook);
+ if(apr_hook_debug_enabled)
+ printf(" %s",pHook->szName);
+ }
+ if(apr_hook_debug_enabled)
+ fputc('\n',stdout);
+
+ /* destroy the pool - the sorted hooks were already copied */
+ apr_pool_destroy(p);
+
+ return pNew;
+}
+
+#ifndef NETWARE
+static apr_array_header_t *s_aHooksToSort;
+#endif
+
+typedef struct
+{
+ const char *szHookName;
+ apr_array_header_t **paHooks;
+} HookSortEntry;
+
+APU_DECLARE(void) apr_hook_sort_register(const char *szHookName,
+ apr_array_header_t **paHooks)
+{
+#ifdef NETWARE
+ get_apd
+#endif
+ HookSortEntry *pEntry;
+
+ if(!s_aHooksToSort)
+ s_aHooksToSort=apr_array_make(apr_hook_global_pool,1,sizeof(HookSortEntry));
+ pEntry=apr_array_push(s_aHooksToSort);
+ pEntry->szHookName=szHookName;
+ pEntry->paHooks=paHooks;
+}
+
+APU_DECLARE(void) apr_hook_sort_all(void)
+{
+#ifdef NETWARE
+ get_apd
+#endif
+ int n;
+
+ if (!s_aHooksToSort) {
+ s_aHooksToSort = apr_array_make(apr_hook_global_pool, 1, sizeof(HookSortEntry));
+ }
+
+ for(n=0 ; n < s_aHooksToSort->nelts ; ++n) {
+ HookSortEntry *pEntry=&((HookSortEntry *)s_aHooksToSort->elts)[n];
+ *pEntry->paHooks=sort_hook(*pEntry->paHooks,pEntry->szHookName);
+ }
+}
+
+#ifndef NETWARE
+static apr_hash_t *s_phOptionalHooks;
+static apr_hash_t *s_phOptionalFunctions;
+#endif
+
+APU_DECLARE(void) apr_hook_deregister_all(void)
+{
+#ifdef NETWARE
+ get_apd
+#endif
+ int n;
+
+ if (!s_aHooksToSort) {
+ return;
+ }
+
+ for(n=0 ; n < s_aHooksToSort->nelts ; ++n) {
+ HookSortEntry *pEntry=&((HookSortEntry *)s_aHooksToSort->elts)[n];
+ *pEntry->paHooks=NULL;
+ }
+ s_aHooksToSort=NULL;
+ s_phOptionalHooks=NULL;
+ s_phOptionalFunctions=NULL;
+}
+
+APU_DECLARE(void) apr_hook_debug_show(const char *szName,
+ const char * const *aszPre,
+ const char * const *aszSucc)
+{
+ int nFirst;
+
+ printf(" Hooked %s",szName);
+ if(aszPre) {
+ fputs(" pre(",stdout);
+ nFirst=1;
+ while(*aszPre) {
+ if(!nFirst)
+ fputc(',',stdout);
+ nFirst=0;
+ fputs(*aszPre,stdout);
+ ++aszPre;
+ }
+ fputc(')',stdout);
+ }
+ if(aszSucc) {
+ fputs(" succ(",stdout);
+ nFirst=1;
+ while(*aszSucc) {
+ if(!nFirst)
+ fputc(',',stdout);
+ nFirst=0;
+ fputs(*aszSucc,stdout);
+ ++aszSucc;
+ }
+ fputc(')',stdout);
+ }
+ fputc('\n',stdout);
+}
+
+/* Optional hook support */
+
+APR_DECLARE_EXTERNAL_HOOK(apr,APU,void,_optional,(void))
+
+APU_DECLARE(apr_array_header_t *) apr_optional_hook_get(const char *szName)
+{
+#ifdef NETWARE
+ get_apd
+#endif
+ apr_array_header_t **ppArray;
+
+ if(!s_phOptionalHooks)
+ return NULL;
+ ppArray=apr_hash_get(s_phOptionalHooks,szName,strlen(szName));
+ if(!ppArray)
+ return NULL;
+ return *ppArray;
+}
+
+APU_DECLARE(void) apr_optional_hook_add(const char *szName,void (*pfn)(void),
+ const char * const *aszPre,
+ const char * const *aszSucc,int nOrder)
+{
+#ifdef NETWARE
+ get_apd
+#endif
+ apr_array_header_t *pArray=apr_optional_hook_get(szName);
+ apr_LINK__optional_t *pHook;
+
+ if(!pArray) {
+ apr_array_header_t **ppArray;
+
+ pArray=apr_array_make(apr_hook_global_pool,1,
+ sizeof(apr_LINK__optional_t));
+ if(!s_phOptionalHooks)
+ s_phOptionalHooks=apr_hash_make(apr_hook_global_pool);
+ ppArray=apr_palloc(apr_hook_global_pool,sizeof *ppArray);
+ *ppArray=pArray;
+ apr_hash_set(s_phOptionalHooks,szName,strlen(szName),ppArray);
+ apr_hook_sort_register(szName,ppArray);
+ }
+ pHook=apr_array_push(pArray);
+ pHook->pFunc=pfn;
+ pHook->aszPredecessors=aszPre;
+ pHook->aszSuccessors=aszSucc;
+ pHook->nOrder=nOrder;
+ pHook->szName=apr_hook_debug_current;
+ if(apr_hook_debug_enabled)
+ apr_hook_debug_show(szName,aszPre,aszSucc);
+}
+
+/* optional function support */
+
+APU_DECLARE(apr_opt_fn_t *) apr_dynamic_fn_retrieve(const char *szName)
+{
+#ifdef NETWARE
+ get_apd
+#endif
+ if(!s_phOptionalFunctions)
+ return NULL;
+ return (void(*)(void))apr_hash_get(s_phOptionalFunctions,szName,strlen(szName));
+}
+
+/* Deprecated */
+APU_DECLARE_NONSTD(void) apr_dynamic_fn_register(const char *szName,
+ apr_opt_fn_t *pfn)
+{
+#ifdef NETWARE
+ get_apd
+#endif
+ if(!s_phOptionalFunctions)
+ s_phOptionalFunctions=apr_hash_make(apr_hook_global_pool);
+ apr_hash_set(s_phOptionalFunctions,szName,strlen(szName),(void *)pfn);
+}
+
+#if 0
+void main()
+{
+ const char *aszAPre[]={"b","c",NULL};
+ const char *aszBPost[]={"a",NULL};
+ const char *aszCPost[]={"b",NULL};
+ TSortData t1[]=
+ {
+ { "a",aszAPre,NULL },
+ { "b",NULL,aszBPost },
+ { "c",NULL,aszCPost }
+ };
+ TSort *pResult;
+
+ pResult=prepare(t1,3);
+ pResult=tsort(pResult,3);
+
+ for( ; pResult ; pResult=pResult->pNext)
+ printf("%s\n",pResult->pData->szName);
+}
+#endif
diff --git a/contrib/apr-util/include/apr_anylock.h b/contrib/apr-util/include/apr_anylock.h
new file mode 100644
index 000000000000..51e97ff3733b
--- /dev/null
+++ b/contrib/apr-util/include/apr_anylock.h
@@ -0,0 +1,128 @@
+/* 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.
+ */
+
+/**
+ * @file apr_anylock.h
+ * @brief APR-Util transparent any lock flavor wrapper
+ */
+#ifndef APR_ANYLOCK_H
+#define APR_ANYLOCK_H
+
+#include "apr_proc_mutex.h"
+#include "apr_thread_mutex.h"
+#include "apr_thread_rwlock.h"
+
+/** Structure that may contain any APR lock type */
+typedef struct apr_anylock_t {
+ /** Indicates what type of lock is in lock */
+ enum tm_lock {
+ apr_anylock_none, /**< None */
+ apr_anylock_procmutex, /**< Process-based */
+ apr_anylock_threadmutex, /**< Thread-based */
+ apr_anylock_readlock, /**< Read lock */
+ apr_anylock_writelock /**< Write lock */
+ } type;
+ /** Union of all possible APR locks */
+ union apr_anylock_u_t {
+ apr_proc_mutex_t *pm; /**< Process mutex */
+#if APR_HAS_THREADS
+ apr_thread_mutex_t *tm; /**< Thread mutex */
+ apr_thread_rwlock_t *rw; /**< Read-write lock */
+#endif
+ } lock;
+} apr_anylock_t;
+
+#if APR_HAS_THREADS
+
+/** Lock an apr_anylock_t structure */
+#define APR_ANYLOCK_LOCK(lck) \
+ (((lck)->type == apr_anylock_none) \
+ ? APR_SUCCESS \
+ : (((lck)->type == apr_anylock_threadmutex) \
+ ? apr_thread_mutex_lock((lck)->lock.tm) \
+ : (((lck)->type == apr_anylock_procmutex) \
+ ? apr_proc_mutex_lock((lck)->lock.pm) \
+ : (((lck)->type == apr_anylock_readlock) \
+ ? apr_thread_rwlock_rdlock((lck)->lock.rw) \
+ : (((lck)->type == apr_anylock_writelock) \
+ ? apr_thread_rwlock_wrlock((lck)->lock.rw) \
+ : APR_EINVAL)))))
+
+#else /* APR_HAS_THREADS */
+
+#define APR_ANYLOCK_LOCK(lck) \
+ (((lck)->type == apr_anylock_none) \
+ ? APR_SUCCESS \
+ : (((lck)->type == apr_anylock_procmutex) \
+ ? apr_proc_mutex_lock((lck)->lock.pm) \
+ : APR_EINVAL))
+
+#endif /* APR_HAS_THREADS */
+
+#if APR_HAS_THREADS
+
+/** Try to lock an apr_anylock_t structure */
+#define APR_ANYLOCK_TRYLOCK(lck) \
+ (((lck)->type == apr_anylock_none) \
+ ? APR_SUCCESS \
+ : (((lck)->type == apr_anylock_threadmutex) \
+ ? apr_thread_mutex_trylock((lck)->lock.tm) \
+ : (((lck)->type == apr_anylock_procmutex) \
+ ? apr_proc_mutex_trylock((lck)->lock.pm) \
+ : (((lck)->type == apr_anylock_readlock) \
+ ? apr_thread_rwlock_tryrdlock((lck)->lock.rw) \
+ : (((lck)->type == apr_anylock_writelock) \
+ ? apr_thread_rwlock_trywrlock((lck)->lock.rw) \
+ : APR_EINVAL)))))
+
+#else /* APR_HAS_THREADS */
+
+#define APR_ANYLOCK_TRYLOCK(lck) \
+ (((lck)->type == apr_anylock_none) \
+ ? APR_SUCCESS \
+ : (((lck)->type == apr_anylock_procmutex) \
+ ? apr_proc_mutex_trylock((lck)->lock.pm) \
+ : APR_EINVAL))
+
+#endif /* APR_HAS_THREADS */
+
+#if APR_HAS_THREADS
+
+/** Unlock an apr_anylock_t structure */
+#define APR_ANYLOCK_UNLOCK(lck) \
+ (((lck)->type == apr_anylock_none) \
+ ? APR_SUCCESS \
+ : (((lck)->type == apr_anylock_threadmutex) \
+ ? apr_thread_mutex_unlock((lck)->lock.tm) \
+ : (((lck)->type == apr_anylock_procmutex) \
+ ? apr_proc_mutex_unlock((lck)->lock.pm) \
+ : ((((lck)->type == apr_anylock_readlock) || \
+ ((lck)->type == apr_anylock_writelock)) \
+ ? apr_thread_rwlock_unlock((lck)->lock.rw) \
+ : APR_EINVAL))))
+
+#else /* APR_HAS_THREADS */
+
+#define APR_ANYLOCK_UNLOCK(lck) \
+ (((lck)->type == apr_anylock_none) \
+ ? APR_SUCCESS \
+ : (((lck)->type == apr_anylock_procmutex) \
+ ? apr_proc_mutex_unlock((lck)->lock.pm) \
+ : APR_EINVAL))
+
+#endif /* APR_HAS_THREADS */
+
+#endif /* !APR_ANYLOCK_H */
diff --git a/contrib/apr-util/include/apr_base64.h b/contrib/apr-util/include/apr_base64.h
new file mode 100644
index 000000000000..17de1c58db86
--- /dev/null
+++ b/contrib/apr-util/include/apr_base64.h
@@ -0,0 +1,113 @@
+/* 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.
+ * The apr_vsnprintf/apr_snprintf functions are based on, and used with the
+ * permission of, the SIO stdio-replacement strx_* functions by Panos
+ * Tsirigotis <panos@alumni.cs.colorado.edu> for xinetd.
+ */
+
+/**
+ * @file apr_base64.h
+ * @brief APR-UTIL Base64 Encoding
+ */
+#ifndef APR_BASE64_H
+#define APR_BASE64_H
+
+#include "apu.h"
+#include "apr_general.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup APR_Util_Base64 Base64 Encoding
+ * @ingroup APR_Util
+ * @{
+ */
+
+/* Simple BASE64 encode/decode functions.
+ *
+ * As we might encode binary strings, hence we require the length of
+ * the incoming plain source. And return the length of what we decoded.
+ *
+ * The decoding function takes any non valid char (i.e. whitespace, \0
+ * or anything non A-Z,0-9 etc as terminal.
+ *
+ * plain strings/binary sequences are not assumed '\0' terminated. Encoded
+ * strings are neither. But probably should.
+ *
+ */
+
+/**
+ * Given the length of an un-encoded string, get the length of the
+ * encoded string.
+ * @param len the length of an unencoded string.
+ * @return the length of the string after it is encoded, including the
+ * trailing \0
+ */
+APU_DECLARE(int) apr_base64_encode_len(int len);
+
+/**
+ * Encode a text string using base64encoding.
+ * @param coded_dst The destination string for the encoded string.
+ * @param plain_src The original string in plain text
+ * @param len_plain_src The length of the plain text string
+ * @return the length of the encoded string
+ */
+APU_DECLARE(int) apr_base64_encode(char * coded_dst, const char *plain_src,
+ int len_plain_src);
+
+/**
+ * Encode an EBCDIC string using base64encoding.
+ * @param coded_dst The destination string for the encoded string.
+ * @param plain_src The original string in plain text
+ * @param len_plain_src The length of the plain text string
+ * @return the length of the encoded string
+ */
+APU_DECLARE(int) apr_base64_encode_binary(char * coded_dst,
+ const unsigned char *plain_src,
+ int len_plain_src);
+
+/**
+ * Determine the maximum buffer length required to decode the plain text
+ * string given the encoded string.
+ * @param coded_src The encoded string
+ * @return the maximum required buffer length for the plain text string
+ */
+APU_DECLARE(int) apr_base64_decode_len(const char * coded_src);
+
+/**
+ * Decode a string to plain text
+ * @param plain_dst The destination string for the plain text
+ * @param coded_src The encoded string
+ * @return the length of the plain text string
+ */
+APU_DECLARE(int) apr_base64_decode(char * plain_dst, const char *coded_src);
+
+/**
+ * Decode an EBCDIC string to plain text
+ * @param plain_dst The destination string for the plain text
+ * @param coded_src The encoded string
+ * @return the length of the plain text string
+ */
+APU_DECLARE(int) apr_base64_decode_binary(unsigned char * plain_dst,
+ const char *coded_src);
+
+/** @} */
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !APR_BASE64_H */
diff --git a/contrib/apr-util/include/apr_buckets.h b/contrib/apr-util/include/apr_buckets.h
new file mode 100644
index 000000000000..025292b98658
--- /dev/null
+++ b/contrib/apr-util/include/apr_buckets.h
@@ -0,0 +1,1571 @@
+/* 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.
+ */
+/**
+ * @file apr_buckets.h
+ * @brief APR-UTIL Buckets/Bucket Brigades
+ */
+
+#ifndef APR_BUCKETS_H
+#define APR_BUCKETS_H
+
+#if defined(APR_BUCKET_DEBUG) && !defined(APR_RING_DEBUG)
+#define APR_RING_DEBUG
+#endif
+
+#include "apu.h"
+#include "apr_network_io.h"
+#include "apr_file_io.h"
+#include "apr_general.h"
+#include "apr_mmap.h"
+#include "apr_errno.h"
+#include "apr_ring.h"
+#include "apr.h"
+#if APR_HAVE_SYS_UIO_H
+#include <sys/uio.h> /* for struct iovec */
+#endif
+#if APR_HAVE_STDARG_H
+#include <stdarg.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup APR_Util_Bucket_Brigades Bucket Brigades
+ * @ingroup APR_Util
+ * @{
+ */
+
+/** default bucket buffer size - 8KB minus room for memory allocator headers */
+#define APR_BUCKET_BUFF_SIZE 8000
+
+/** Determines how a bucket or brigade should be read */
+typedef enum {
+ APR_BLOCK_READ, /**< block until data becomes available */
+ APR_NONBLOCK_READ /**< return immediately if no data is available */
+} apr_read_type_e;
+
+/**
+ * The one-sentence buzzword-laden overview: Bucket brigades represent
+ * a complex data stream that can be passed through a layered IO
+ * system without unnecessary copying. A longer overview follows...
+ *
+ * A bucket brigade is a doubly linked list (ring) of buckets, so we
+ * aren't limited to inserting at the front and removing at the end.
+ * Buckets are only passed around as members of a brigade, although
+ * singleton buckets can occur for short periods of time.
+ *
+ * Buckets are data stores of various types. They can refer to data in
+ * memory, or part of a file or mmap area, or the output of a process,
+ * etc. Buckets also have some type-dependent accessor functions:
+ * read, split, copy, setaside, and destroy.
+ *
+ * read returns the address and size of the data in the bucket. If the
+ * data isn't in memory then it is read in and the bucket changes type
+ * so that it can refer to the new location of the data. If all the
+ * data doesn't fit in the bucket then a new bucket is inserted into
+ * the brigade to hold the rest of it.
+ *
+ * split divides the data in a bucket into two regions. After a split
+ * the original bucket refers to the first part of the data and a new
+ * bucket inserted into the brigade after the original bucket refers
+ * to the second part of the data. Reference counts are maintained as
+ * necessary.
+ *
+ * setaside ensures that the data in the bucket has a long enough
+ * lifetime. Sometimes it is convenient to create a bucket referring
+ * to data on the stack in the expectation that it will be consumed
+ * (output to the network) before the stack is unwound. If that
+ * expectation turns out not to be valid, the setaside function is
+ * called to move the data somewhere safer.
+ *
+ * copy makes a duplicate of the bucket structure as long as it's
+ * possible to have multiple references to a single copy of the
+ * data itself. Not all bucket types can be copied.
+ *
+ * destroy maintains the reference counts on the resources used by a
+ * bucket and frees them if necessary.
+ *
+ * Note: all of the above functions have wrapper macros (apr_bucket_read(),
+ * apr_bucket_destroy(), etc), and those macros should be used rather
+ * than using the function pointers directly.
+ *
+ * To write a bucket brigade, they are first made into an iovec, so that we
+ * don't write too little data at one time. Currently we ignore compacting the
+ * buckets into as few buckets as possible, but if we really want good
+ * performance, then we need to compact the buckets before we convert to an
+ * iovec, or possibly while we are converting to an iovec.
+ */
+
+/*
+ * Forward declaration of the main types.
+ */
+
+/** @see apr_bucket_brigade */
+typedef struct apr_bucket_brigade apr_bucket_brigade;
+/** @see apr_bucket */
+typedef struct apr_bucket apr_bucket;
+/** @see apr_bucket_alloc_t */
+typedef struct apr_bucket_alloc_t apr_bucket_alloc_t;
+
+/** @see apr_bucket_type_t */
+typedef struct apr_bucket_type_t apr_bucket_type_t;
+
+/**
+ * Basic bucket type
+ */
+struct apr_bucket_type_t {
+ /**
+ * The name of the bucket type
+ */
+ const char *name;
+ /**
+ * The number of functions this bucket understands. Can not be less than
+ * five.
+ */
+ int num_func;
+ /**
+ * Whether the bucket contains metadata (ie, information that
+ * describes the regular contents of the brigade). The metadata
+ * is not returned by apr_bucket_read() and is not indicated by
+ * the ->length of the apr_bucket itself. In other words, an
+ * empty bucket is safe to arbitrarily remove if and only if it
+ * contains no metadata. In this sense, "data" is just raw bytes
+ * that are the "content" of the brigade and "metadata" describes
+ * that data but is not a proper part of it.
+ */
+ enum {
+ /** This bucket type represents actual data to send to the client. */
+ APR_BUCKET_DATA = 0,
+ /** This bucket type represents metadata. */
+ APR_BUCKET_METADATA = 1
+ } is_metadata;
+ /**
+ * Free the private data and any resources used by the bucket (if they
+ * aren't shared with another bucket). This function is required to be
+ * implemented for all bucket types, though it might be a no-op on some
+ * of them (namely ones that never allocate any private data structures).
+ * @param data The private data pointer from the bucket to be destroyed
+ */
+ void (*destroy)(void *data);
+
+ /**
+ * Read the data from the bucket. This is required to be implemented
+ * for all bucket types.
+ * @param b The bucket to read from
+ * @param str A place to store the data read. Allocation should only be
+ * done if absolutely necessary.
+ * @param len The amount of data read.
+ * @param block Should this read function block if there is more data that
+ * cannot be read immediately.
+ */
+ apr_status_t (*read)(apr_bucket *b, const char **str, apr_size_t *len,
+ apr_read_type_e block);
+
+ /**
+ * Make it possible to set aside the data for at least as long as the
+ * given pool. Buckets containing data that could potentially die before
+ * this pool (e.g. the data resides on the stack, in a child pool of
+ * the given pool, or in a disjoint pool) must somehow copy, shift, or
+ * transform the data to have the proper lifetime.
+ * @param e The bucket to convert
+ * @remark Some bucket types contain data that will always outlive the
+ * bucket itself. For example no data (EOS and FLUSH), or the data
+ * resides in global, constant memory (IMMORTAL), or the data is on
+ * the heap (HEAP). For these buckets, apr_bucket_setaside_noop can
+ * be used.
+ */
+ apr_status_t (*setaside)(apr_bucket *e, apr_pool_t *pool);
+
+ /**
+ * Split one bucket in two at the specified position by duplicating
+ * the bucket structure (not the data) and modifying any necessary
+ * start/end/offset information. If it's not possible to do this
+ * for the bucket type (perhaps the length of the data is indeterminate,
+ * as with pipe and socket buckets), then APR_ENOTIMPL is returned.
+ * @param e The bucket to split
+ * @param point The offset of the first byte in the new bucket
+ */
+ apr_status_t (*split)(apr_bucket *e, apr_size_t point);
+
+ /**
+ * Copy the bucket structure (not the data), assuming that this is
+ * possible for the bucket type. If it's not, APR_ENOTIMPL is returned.
+ * @param e The bucket to copy
+ * @param c Returns a pointer to the new bucket
+ */
+ apr_status_t (*copy)(apr_bucket *e, apr_bucket **c);
+
+};
+
+/**
+ * apr_bucket structures are allocated on the malloc() heap and
+ * their lifetime is controlled by the parent apr_bucket_brigade
+ * structure. Buckets can move from one brigade to another e.g. by
+ * calling APR_BRIGADE_CONCAT(). In general the data in a bucket has
+ * the same lifetime as the bucket and is freed when the bucket is
+ * destroyed; if the data is shared by more than one bucket (e.g.
+ * after a split) the data is freed when the last bucket goes away.
+ */
+struct apr_bucket {
+ /** Links to the rest of the brigade */
+ APR_RING_ENTRY(apr_bucket) link;
+ /** The type of bucket. */
+ const apr_bucket_type_t *type;
+ /** The length of the data in the bucket. This could have been implemented
+ * with a function, but this is an optimization, because the most
+ * common thing to do will be to get the length. If the length is unknown,
+ * the value of this field will be (apr_size_t)(-1).
+ */
+ apr_size_t length;
+ /** The start of the data in the bucket relative to the private base
+ * pointer. The vast majority of bucket types allow a fixed block of
+ * data to be referenced by multiple buckets, each bucket pointing to
+ * a different segment of the data. That segment starts at base+start
+ * and ends at base+start+length.
+ * If the length == (apr_size_t)(-1), then start == -1.
+ */
+ apr_off_t start;
+ /** type-dependent data hangs off this pointer */
+ void *data;
+ /**
+ * Pointer to function used to free the bucket. This function should
+ * always be defined and it should be consistent with the memory
+ * function used to allocate the bucket. For example, if malloc() is
+ * used to allocate the bucket, this pointer should point to free().
+ * @param e Pointer to the bucket being freed
+ */
+ void (*free)(void *e);
+ /** The freelist from which this bucket was allocated */
+ apr_bucket_alloc_t *list;
+};
+
+/** A list of buckets */
+struct apr_bucket_brigade {
+ /** The pool to associate the brigade with. The data is not allocated out
+ * of the pool, but a cleanup is registered with this pool. If the
+ * brigade is destroyed by some mechanism other than pool destruction,
+ * the destroying function is responsible for killing the cleanup.
+ */
+ apr_pool_t *p;
+ /** The buckets in the brigade are on this list. */
+ /*
+ * The apr_bucket_list structure doesn't actually need a name tag
+ * because it has no existence independent of struct apr_bucket_brigade;
+ * the ring macros are designed so that you can leave the name tag
+ * argument empty in this situation but apparently the Windows compiler
+ * doesn't like that.
+ */
+ APR_RING_HEAD(apr_bucket_list, apr_bucket) list;
+ /** The freelist from which this bucket was allocated */
+ apr_bucket_alloc_t *bucket_alloc;
+};
+
+
+/**
+ * Function called when a brigade should be flushed
+ */
+typedef apr_status_t (*apr_brigade_flush)(apr_bucket_brigade *bb, void *ctx);
+
+/*
+ * define APR_BUCKET_DEBUG if you want your brigades to be checked for
+ * validity at every possible instant. this will slow your code down
+ * substantially but is a very useful debugging tool.
+ */
+#ifdef APR_BUCKET_DEBUG
+
+#define APR_BRIGADE_CHECK_CONSISTENCY(b) \
+ APR_RING_CHECK_CONSISTENCY(&(b)->list, apr_bucket, link)
+
+#define APR_BUCKET_CHECK_CONSISTENCY(e) \
+ APR_RING_CHECK_ELEM_CONSISTENCY((e), apr_bucket, link)
+
+#else
+/**
+ * checks the ring pointers in a bucket brigade for consistency. an
+ * abort() will be triggered if any inconsistencies are found.
+ * note: this is a no-op unless APR_BUCKET_DEBUG is defined.
+ * @param b The brigade
+ */
+#define APR_BRIGADE_CHECK_CONSISTENCY(b)
+/**
+ * checks the brigade a bucket is in for ring consistency. an
+ * abort() will be triggered if any inconsistencies are found.
+ * note: this is a no-op unless APR_BUCKET_DEBUG is defined.
+ * @param e The bucket
+ */
+#define APR_BUCKET_CHECK_CONSISTENCY(e)
+#endif
+
+
+/**
+ * Wrappers around the RING macros to reduce the verbosity of the code
+ * that handles bucket brigades.
+ */
+/**
+ * The magic pointer value that indicates the head of the brigade
+ * @remark This is used to find the beginning and end of the brigade, eg:
+ * <pre>
+ * while (e != APR_BRIGADE_SENTINEL(b)) {
+ * ...
+ * e = APR_BUCKET_NEXT(e);
+ * }
+ * </pre>
+ * @param b The brigade
+ * @return The magic pointer value
+ */
+#define APR_BRIGADE_SENTINEL(b) APR_RING_SENTINEL(&(b)->list, apr_bucket, link)
+
+/**
+ * Determine if the bucket brigade is empty
+ * @param b The brigade to check
+ * @return true or false
+ */
+#define APR_BRIGADE_EMPTY(b) APR_RING_EMPTY(&(b)->list, apr_bucket, link)
+
+/**
+ * Return the first bucket in a brigade
+ * @param b The brigade to query
+ * @return The first bucket in the brigade
+ */
+#define APR_BRIGADE_FIRST(b) APR_RING_FIRST(&(b)->list)
+/**
+ * Return the last bucket in a brigade
+ * @param b The brigade to query
+ * @return The last bucket in the brigade
+ */
+#define APR_BRIGADE_LAST(b) APR_RING_LAST(&(b)->list)
+
+/**
+ * Insert a single bucket at the front of a brigade
+ * @param b The brigade to add to
+ * @param e The bucket to insert
+ */
+#define APR_BRIGADE_INSERT_HEAD(b, e) do { \
+ apr_bucket *ap__b = (e); \
+ APR_RING_INSERT_HEAD(&(b)->list, ap__b, apr_bucket, link); \
+ APR_BRIGADE_CHECK_CONSISTENCY((b)); \
+ } while (0)
+
+/**
+ * Insert a single bucket at the end of a brigade
+ * @param b The brigade to add to
+ * @param e The bucket to insert
+ */
+#define APR_BRIGADE_INSERT_TAIL(b, e) do { \
+ apr_bucket *ap__b = (e); \
+ APR_RING_INSERT_TAIL(&(b)->list, ap__b, apr_bucket, link); \
+ APR_BRIGADE_CHECK_CONSISTENCY((b)); \
+ } while (0)
+
+/**
+ * Concatenate brigade b onto the end of brigade a, leaving brigade b empty
+ * @param a The first brigade
+ * @param b The second brigade
+ */
+#define APR_BRIGADE_CONCAT(a, b) do { \
+ APR_RING_CONCAT(&(a)->list, &(b)->list, apr_bucket, link); \
+ APR_BRIGADE_CHECK_CONSISTENCY((a)); \
+ } while (0)
+
+/**
+ * Prepend brigade b onto the beginning of brigade a, leaving brigade b empty
+ * @param a The first brigade
+ * @param b The second brigade
+ */
+#define APR_BRIGADE_PREPEND(a, b) do { \
+ APR_RING_PREPEND(&(a)->list, &(b)->list, apr_bucket, link); \
+ APR_BRIGADE_CHECK_CONSISTENCY((a)); \
+ } while (0)
+
+/**
+ * Insert a single bucket before a specified bucket
+ * @param a The bucket to insert before
+ * @param b The bucket to insert
+ */
+#define APR_BUCKET_INSERT_BEFORE(a, b) do { \
+ apr_bucket *ap__a = (a), *ap__b = (b); \
+ APR_RING_INSERT_BEFORE(ap__a, ap__b, link); \
+ APR_BUCKET_CHECK_CONSISTENCY(ap__a); \
+ } while (0)
+
+/**
+ * Insert a single bucket after a specified bucket
+ * @param a The bucket to insert after
+ * @param b The bucket to insert
+ */
+#define APR_BUCKET_INSERT_AFTER(a, b) do { \
+ apr_bucket *ap__a = (a), *ap__b = (b); \
+ APR_RING_INSERT_AFTER(ap__a, ap__b, link); \
+ APR_BUCKET_CHECK_CONSISTENCY(ap__a); \
+ } while (0)
+
+/**
+ * Get the next bucket in the list
+ * @param e The current bucket
+ * @return The next bucket
+ */
+#define APR_BUCKET_NEXT(e) APR_RING_NEXT((e), link)
+/**
+ * Get the previous bucket in the list
+ * @param e The current bucket
+ * @return The previous bucket
+ */
+#define APR_BUCKET_PREV(e) APR_RING_PREV((e), link)
+
+/**
+ * Remove a bucket from its bucket brigade
+ * @param e The bucket to remove
+ */
+#define APR_BUCKET_REMOVE(e) APR_RING_REMOVE((e), link)
+
+/**
+ * Initialize a new bucket's prev/next pointers
+ * @param e The bucket to initialize
+ */
+#define APR_BUCKET_INIT(e) APR_RING_ELEM_INIT((e), link)
+
+/**
+ * Determine if a bucket contains metadata. An empty bucket is
+ * safe to arbitrarily remove if and only if this is false.
+ * @param e The bucket to inspect
+ * @return true or false
+ */
+#define APR_BUCKET_IS_METADATA(e) ((e)->type->is_metadata)
+
+/**
+ * Determine if a bucket is a FLUSH bucket
+ * @param e The bucket to inspect
+ * @return true or false
+ */
+#define APR_BUCKET_IS_FLUSH(e) ((e)->type == &apr_bucket_type_flush)
+/**
+ * Determine if a bucket is an EOS bucket
+ * @param e The bucket to inspect
+ * @return true or false
+ */
+#define APR_BUCKET_IS_EOS(e) ((e)->type == &apr_bucket_type_eos)
+/**
+ * Determine if a bucket is a FILE bucket
+ * @param e The bucket to inspect
+ * @return true or false
+ */
+#define APR_BUCKET_IS_FILE(e) ((e)->type == &apr_bucket_type_file)
+/**
+ * Determine if a bucket is a PIPE bucket
+ * @param e The bucket to inspect
+ * @return true or false
+ */
+#define APR_BUCKET_IS_PIPE(e) ((e)->type == &apr_bucket_type_pipe)
+/**
+ * Determine if a bucket is a SOCKET bucket
+ * @param e The bucket to inspect
+ * @return true or false
+ */
+#define APR_BUCKET_IS_SOCKET(e) ((e)->type == &apr_bucket_type_socket)
+/**
+ * Determine if a bucket is a HEAP bucket
+ * @param e The bucket to inspect
+ * @return true or false
+ */
+#define APR_BUCKET_IS_HEAP(e) ((e)->type == &apr_bucket_type_heap)
+/**
+ * Determine if a bucket is a TRANSIENT bucket
+ * @param e The bucket to inspect
+ * @return true or false
+ */
+#define APR_BUCKET_IS_TRANSIENT(e) ((e)->type == &apr_bucket_type_transient)
+/**
+ * Determine if a bucket is a IMMORTAL bucket
+ * @param e The bucket to inspect
+ * @return true or false
+ */
+#define APR_BUCKET_IS_IMMORTAL(e) ((e)->type == &apr_bucket_type_immortal)
+#if APR_HAS_MMAP
+/**
+ * Determine if a bucket is a MMAP bucket
+ * @param e The bucket to inspect
+ * @return true or false
+ */
+#define APR_BUCKET_IS_MMAP(e) ((e)->type == &apr_bucket_type_mmap)
+#endif
+/**
+ * Determine if a bucket is a POOL bucket
+ * @param e The bucket to inspect
+ * @return true or false
+ */
+#define APR_BUCKET_IS_POOL(e) ((e)->type == &apr_bucket_type_pool)
+
+/*
+ * General-purpose reference counting for the various bucket types.
+ *
+ * Any bucket type that keeps track of the resources it uses (i.e.
+ * most of them except for IMMORTAL, TRANSIENT, and EOS) needs to
+ * attach a reference count to the resource so that it can be freed
+ * when the last bucket that uses it goes away. Resource-sharing may
+ * occur because of bucket splits or buckets that refer to globally
+ * cached data. */
+
+/** @see apr_bucket_refcount */
+typedef struct apr_bucket_refcount apr_bucket_refcount;
+/**
+ * The structure used to manage the shared resource must start with an
+ * apr_bucket_refcount which is updated by the general-purpose refcount
+ * code. A pointer to the bucket-type-dependent private data structure
+ * can be cast to a pointer to an apr_bucket_refcount and vice versa.
+ */
+struct apr_bucket_refcount {
+ /** The number of references to this bucket */
+ int refcount;
+};
+
+/* ***** Reference-counted bucket types ***** */
+
+/** @see apr_bucket_heap */
+typedef struct apr_bucket_heap apr_bucket_heap;
+/**
+ * A bucket referring to data allocated off the heap.
+ */
+struct apr_bucket_heap {
+ /** Number of buckets using this memory */
+ apr_bucket_refcount refcount;
+ /** The start of the data actually allocated. This should never be
+ * modified, it is only used to free the bucket.
+ */
+ char *base;
+ /** how much memory was allocated */
+ apr_size_t alloc_len;
+ /** function to use to delete the data */
+ void (*free_func)(void *data);
+};
+
+/** @see apr_bucket_pool */
+typedef struct apr_bucket_pool apr_bucket_pool;
+/**
+ * A bucket referring to data allocated from a pool
+ */
+struct apr_bucket_pool {
+ /** The pool bucket must be able to be easily morphed to a heap
+ * bucket if the pool gets cleaned up before all references are
+ * destroyed. This apr_bucket_heap structure is populated automatically
+ * when the pool gets cleaned up, and subsequent calls to pool_read()
+ * will result in the apr_bucket in question being morphed into a
+ * regular heap bucket. (To avoid having to do many extra refcount
+ * manipulations and b->data manipulations, the apr_bucket_pool
+ * struct actually *contains* the apr_bucket_heap struct that it
+ * will become as its first element; the two share their
+ * apr_bucket_refcount members.)
+ */
+ apr_bucket_heap heap;
+ /** The block of data actually allocated from the pool.
+ * Segments of this block are referenced by adjusting
+ * the start and length of the apr_bucket accordingly.
+ * This will be NULL after the pool gets cleaned up.
+ */
+ const char *base;
+ /** The pool the data was allocated from. When the pool
+ * is cleaned up, this gets set to NULL as an indicator
+ * to pool_read() that the data is now on the heap and
+ * so it should morph the bucket into a regular heap
+ * bucket before continuing.
+ */
+ apr_pool_t *pool;
+ /** The freelist this structure was allocated from, which is
+ * needed in the cleanup phase in order to allocate space on the heap
+ */
+ apr_bucket_alloc_t *list;
+};
+
+#if APR_HAS_MMAP
+/** @see apr_bucket_mmap */
+typedef struct apr_bucket_mmap apr_bucket_mmap;
+/**
+ * A bucket referring to an mmap()ed file
+ */
+struct apr_bucket_mmap {
+ /** Number of buckets using this memory */
+ apr_bucket_refcount refcount;
+ /** The mmap this sub_bucket refers to */
+ apr_mmap_t *mmap;
+};
+#endif
+
+/** @see apr_bucket_file */
+typedef struct apr_bucket_file apr_bucket_file;
+/**
+ * A bucket referring to an file
+ */
+struct apr_bucket_file {
+ /** Number of buckets using this memory */
+ apr_bucket_refcount refcount;
+ /** The file this bucket refers to */
+ apr_file_t *fd;
+ /** The pool into which any needed structures should
+ * be created while reading from this file bucket */
+ apr_pool_t *readpool;
+#if APR_HAS_MMAP
+ /** Whether this bucket should be memory-mapped if
+ * a caller tries to read from it */
+ int can_mmap;
+#endif /* APR_HAS_MMAP */
+};
+
+/** @see apr_bucket_structs */
+typedef union apr_bucket_structs apr_bucket_structs;
+/**
+ * A union of all bucket structures so we know what
+ * the max size is.
+ */
+union apr_bucket_structs {
+ apr_bucket b; /**< Bucket */
+ apr_bucket_heap heap; /**< Heap */
+ apr_bucket_pool pool; /**< Pool */
+#if APR_HAS_MMAP
+ apr_bucket_mmap mmap; /**< MMap */
+#endif
+ apr_bucket_file file; /**< File */
+};
+
+/**
+ * The amount that apr_bucket_alloc() should allocate in the common case.
+ * Note: this is twice as big as apr_bucket_structs to allow breathing
+ * room for third-party bucket types.
+ */
+#define APR_BUCKET_ALLOC_SIZE APR_ALIGN_DEFAULT(2*sizeof(apr_bucket_structs))
+
+/* ***** Bucket Brigade Functions ***** */
+/**
+ * Create a new bucket brigade. The bucket brigade is originally empty.
+ * @param p The pool to associate with the brigade. Data is not allocated out
+ * of the pool, but a cleanup is registered.
+ * @param list The bucket allocator to use
+ * @return The empty bucket brigade
+ */
+APU_DECLARE(apr_bucket_brigade *) apr_brigade_create(apr_pool_t *p,
+ apr_bucket_alloc_t *list);
+
+/**
+ * destroy an entire bucket brigade. This includes destroying all of the
+ * buckets within the bucket brigade's bucket list.
+ * @param b The bucket brigade to destroy
+ */
+APU_DECLARE(apr_status_t) apr_brigade_destroy(apr_bucket_brigade *b);
+
+/**
+ * empty out an entire bucket brigade. This includes destroying all of the
+ * buckets within the bucket brigade's bucket list. This is similar to
+ * apr_brigade_destroy(), except that it does not deregister the brigade's
+ * pool cleanup function.
+ * @param data The bucket brigade to clean up
+ * @remark Generally, you should use apr_brigade_destroy(). This function
+ * can be useful in situations where you have a single brigade that
+ * you wish to reuse many times by destroying all of the buckets in
+ * the brigade and putting new buckets into it later.
+ */
+APU_DECLARE(apr_status_t) apr_brigade_cleanup(void *data);
+
+/**
+ * Move the buckets from the tail end of the existing brigade @a b into
+ * the brigade @a a. If @a a is NULL a new brigade is created. Buckets
+ * from @a e to the last bucket (inclusively) of brigade @a b are moved
+ * from @a b to the returned brigade @a a.
+ *
+ * @param b The brigade to split
+ * @param e The first bucket to move
+ * @param a The brigade which should be used for the result or NULL if
+ * a new brigade should be created. The brigade @a a will be
+ * cleared if it is not empty.
+ * @return The brigade supplied in @a a or a new one if @a a was NULL.
+ * @warning Note that this function allocates a new brigade if @a a is
+ * NULL so memory consumption should be carefully considered.
+ */
+APU_DECLARE(apr_bucket_brigade *) apr_brigade_split_ex(apr_bucket_brigade *b,
+ apr_bucket *e,
+ apr_bucket_brigade *a);
+
+/**
+ * Create a new bucket brigade and move the buckets from the tail end
+ * of an existing brigade into the new brigade. Buckets from
+ * @a e to the last bucket (inclusively) of brigade @a b
+ * are moved from @a b to the returned brigade.
+ * @param b The brigade to split
+ * @param e The first bucket to move
+ * @return The new brigade
+ * @warning Note that this function always allocates a new brigade
+ * so memory consumption should be carefully considered.
+ */
+APU_DECLARE(apr_bucket_brigade *) apr_brigade_split(apr_bucket_brigade *b,
+ apr_bucket *e);
+
+/**
+ * Partition a bucket brigade at a given offset (in bytes from the start of
+ * the brigade). This is useful whenever a filter wants to use known ranges
+ * of bytes from the brigade; the ranges can even overlap.
+ * @param b The brigade to partition
+ * @param point The offset at which to partition the brigade
+ * @param after_point Returns a pointer to the first bucket after the partition
+ * @return APR_SUCCESS on success, APR_INCOMPLETE if the contents of the
+ * brigade were shorter than @a point, or an error code.
+ * @remark if APR_INCOMPLETE is returned, @a after_point will be set to
+ * the brigade sentinel.
+ */
+APU_DECLARE(apr_status_t) apr_brigade_partition(apr_bucket_brigade *b,
+ apr_off_t point,
+ apr_bucket **after_point);
+
+/**
+ * Return the total length of the brigade.
+ * @param bb The brigade to compute the length of
+ * @param read_all Read unknown-length buckets to force a size
+ * @param length Returns the length of the brigade (up to the end, or up
+ * to a bucket read error), or -1 if the brigade has buckets
+ * of indeterminate length and read_all is 0.
+ */
+APU_DECLARE(apr_status_t) apr_brigade_length(apr_bucket_brigade *bb,
+ int read_all,
+ apr_off_t *length);
+
+/**
+ * Take a bucket brigade and store the data in a flat char*
+ * @param bb The bucket brigade to create the char* from
+ * @param c The char* to write into
+ * @param len The maximum length of the char array. On return, it is the
+ * actual length of the char array.
+ */
+APU_DECLARE(apr_status_t) apr_brigade_flatten(apr_bucket_brigade *bb,
+ char *c,
+ apr_size_t *len);
+
+/**
+ * Creates a pool-allocated string representing a flat bucket brigade
+ * @param bb The bucket brigade to create the char array from
+ * @param c On return, the allocated char array
+ * @param len On return, the length of the char array.
+ * @param pool The pool to allocate the string from.
+ */
+APU_DECLARE(apr_status_t) apr_brigade_pflatten(apr_bucket_brigade *bb,
+ char **c,
+ apr_size_t *len,
+ apr_pool_t *pool);
+
+/**
+ * Split a brigade to represent one LF line.
+ * @param bbOut The bucket brigade that will have the LF line appended to.
+ * @param bbIn The input bucket brigade to search for a LF-line.
+ * @param block The blocking mode to be used to split the line.
+ * @param maxbytes The maximum bytes to read. If this many bytes are seen
+ * without a LF, the brigade will contain a partial line.
+ */
+APU_DECLARE(apr_status_t) apr_brigade_split_line(apr_bucket_brigade *bbOut,
+ apr_bucket_brigade *bbIn,
+ apr_read_type_e block,
+ apr_off_t maxbytes);
+
+/**
+ * Create an iovec of the elements in a bucket_brigade... return number
+ * of elements used. This is useful for writing to a file or to the
+ * network efficiently.
+ * @param b The bucket brigade to create the iovec from
+ * @param vec The iovec to create
+ * @param nvec The number of elements in the iovec. On return, it is the
+ * number of iovec elements actually filled out.
+ */
+APU_DECLARE(apr_status_t) apr_brigade_to_iovec(apr_bucket_brigade *b,
+ struct iovec *vec, int *nvec);
+
+/**
+ * This function writes a list of strings into a bucket brigade.
+ * @param b The bucket brigade to add to
+ * @param flush The flush function to use if the brigade is full
+ * @param ctx The structure to pass to the flush function
+ * @param va A list of strings to add
+ * @return APR_SUCCESS or error code.
+ */
+APU_DECLARE(apr_status_t) apr_brigade_vputstrs(apr_bucket_brigade *b,
+ apr_brigade_flush flush,
+ void *ctx,
+ va_list va);
+
+/**
+ * This function writes a string into a bucket brigade.
+ *
+ * The apr_brigade_write function attempts to be efficient with the
+ * handling of heap buckets. Regardless of the amount of data stored
+ * inside a heap bucket, heap buckets are a fixed size to promote their
+ * reuse.
+ *
+ * If an attempt is made to write a string to a brigade that already
+ * ends with a heap bucket, this function will attempt to pack the
+ * string into the remaining space in the previous heap bucket, before
+ * allocating a new heap bucket.
+ *
+ * This function always returns APR_SUCCESS, unless a flush function is
+ * passed, in which case the return value of the flush function will be
+ * returned if used.
+ * @param b The bucket brigade to add to
+ * @param flush The flush function to use if the brigade is full
+ * @param ctx The structure to pass to the flush function
+ * @param str The string to add
+ * @param nbyte The number of bytes to write
+ * @return APR_SUCCESS or error code
+ */
+APU_DECLARE(apr_status_t) apr_brigade_write(apr_bucket_brigade *b,
+ apr_brigade_flush flush, void *ctx,
+ const char *str, apr_size_t nbyte);
+
+/**
+ * This function writes multiple strings into a bucket brigade.
+ * @param b The bucket brigade to add to
+ * @param flush The flush function to use if the brigade is full
+ * @param ctx The structure to pass to the flush function
+ * @param vec The strings to add (address plus length for each)
+ * @param nvec The number of entries in iovec
+ * @return APR_SUCCESS or error code
+ */
+APU_DECLARE(apr_status_t) apr_brigade_writev(apr_bucket_brigade *b,
+ apr_brigade_flush flush,
+ void *ctx,
+ const struct iovec *vec,
+ apr_size_t nvec);
+
+/**
+ * This function writes a string into a bucket brigade.
+ * @param bb The bucket brigade to add to
+ * @param flush The flush function to use if the brigade is full
+ * @param ctx The structure to pass to the flush function
+ * @param str The string to add
+ * @return APR_SUCCESS or error code
+ */
+APU_DECLARE(apr_status_t) apr_brigade_puts(apr_bucket_brigade *bb,
+ apr_brigade_flush flush, void *ctx,
+ const char *str);
+
+/**
+ * This function writes a character into a bucket brigade.
+ * @param b The bucket brigade to add to
+ * @param flush The flush function to use if the brigade is full
+ * @param ctx The structure to pass to the flush function
+ * @param c The character to add
+ * @return APR_SUCCESS or error code
+ */
+APU_DECLARE(apr_status_t) apr_brigade_putc(apr_bucket_brigade *b,
+ apr_brigade_flush flush, void *ctx,
+ const char c);
+
+/**
+ * This function writes an unspecified number of strings into a bucket brigade.
+ * @param b The bucket brigade to add to
+ * @param flush The flush function to use if the brigade is full
+ * @param ctx The structure to pass to the flush function
+ * @param ... The strings to add
+ * @return APR_SUCCESS or error code
+ */
+APU_DECLARE_NONSTD(apr_status_t) apr_brigade_putstrs(apr_bucket_brigade *b,
+ apr_brigade_flush flush,
+ void *ctx, ...);
+
+/**
+ * Evaluate a printf and put the resulting string at the end
+ * of the bucket brigade.
+ * @param b The brigade to write to
+ * @param flush The flush function to use if the brigade is full
+ * @param ctx The structure to pass to the flush function
+ * @param fmt The format of the string to write
+ * @param ... The arguments to fill out the format
+ * @return APR_SUCCESS or error code
+ */
+APU_DECLARE_NONSTD(apr_status_t) apr_brigade_printf(apr_bucket_brigade *b,
+ apr_brigade_flush flush,
+ void *ctx,
+ const char *fmt, ...)
+ __attribute__((format(printf,4,5)));
+
+/**
+ * Evaluate a printf and put the resulting string at the end
+ * of the bucket brigade.
+ * @param b The brigade to write to
+ * @param flush The flush function to use if the brigade is full
+ * @param ctx The structure to pass to the flush function
+ * @param fmt The format of the string to write
+ * @param va The arguments to fill out the format
+ * @return APR_SUCCESS or error code
+ */
+APU_DECLARE(apr_status_t) apr_brigade_vprintf(apr_bucket_brigade *b,
+ apr_brigade_flush flush,
+ void *ctx,
+ const char *fmt, va_list va);
+
+/**
+ * Utility function to insert a file (or a segment of a file) onto the
+ * end of the brigade. The file is split into multiple buckets if it
+ * is larger than the maximum size which can be represented by a
+ * single bucket.
+ * @param bb the brigade to insert into
+ * @param f the file to insert
+ * @param start the offset of the start of the segment
+ * @param len the length of the segment of the file to insert
+ * @param p pool from which file buckets are allocated
+ * @return the last bucket inserted
+ */
+APU_DECLARE(apr_bucket *) apr_brigade_insert_file(apr_bucket_brigade *bb,
+ apr_file_t *f,
+ apr_off_t start,
+ apr_off_t len,
+ apr_pool_t *p);
+
+
+
+/* ***** Bucket freelist functions ***** */
+/**
+ * Create a bucket allocator.
+ * @param p This pool's underlying apr_allocator_t is used to allocate memory
+ * for the bucket allocator. When the pool is destroyed, the bucket
+ * allocator's cleanup routine will free all memory that has been
+ * allocated from it.
+ * @remark The reason the allocator gets its memory from the pool's
+ * apr_allocator_t rather than from the pool itself is because
+ * the bucket allocator will free large memory blocks back to the
+ * allocator when it's done with them, thereby preventing memory
+ * footprint growth that would occur if we allocated from the pool.
+ * @warning The allocator must never be used by more than one thread at a time.
+ */
+APU_DECLARE_NONSTD(apr_bucket_alloc_t *) apr_bucket_alloc_create(apr_pool_t *p);
+
+/**
+ * Create a bucket allocator.
+ * @param allocator This apr_allocator_t is used to allocate both the bucket
+ * allocator and all memory handed out by the bucket allocator. The
+ * caller is responsible for destroying the bucket allocator and the
+ * apr_allocator_t -- no automatic cleanups will happen.
+ * @warning The allocator must never be used by more than one thread at a time.
+ */
+APU_DECLARE_NONSTD(apr_bucket_alloc_t *) apr_bucket_alloc_create_ex(apr_allocator_t *allocator);
+
+/**
+ * Destroy a bucket allocator.
+ * @param list The allocator to be destroyed
+ */
+APU_DECLARE_NONSTD(void) apr_bucket_alloc_destroy(apr_bucket_alloc_t *list);
+
+/**
+ * Allocate memory for use by the buckets.
+ * @param size The amount to allocate.
+ * @param list The allocator from which to allocate the memory.
+ */
+APU_DECLARE_NONSTD(void *) apr_bucket_alloc(apr_size_t size, apr_bucket_alloc_t *list);
+
+/**
+ * Free memory previously allocated with apr_bucket_alloc().
+ * @param block The block of memory to be freed.
+ */
+APU_DECLARE_NONSTD(void) apr_bucket_free(void *block);
+
+
+/* ***** Bucket Functions ***** */
+/**
+ * Free the resources used by a bucket. If multiple buckets refer to
+ * the same resource it is freed when the last one goes away.
+ * @see apr_bucket_delete()
+ * @param e The bucket to destroy
+ */
+#define apr_bucket_destroy(e) do { \
+ (e)->type->destroy((e)->data); \
+ (e)->free(e); \
+ } while (0)
+
+/**
+ * Delete a bucket by removing it from its brigade (if any) and then
+ * destroying it.
+ * @remark This mainly acts as an aid in avoiding code verbosity. It is
+ * the preferred exact equivalent to:
+ * <pre>
+ * APR_BUCKET_REMOVE(e);
+ * apr_bucket_destroy(e);
+ * </pre>
+ * @param e The bucket to delete
+ */
+#define apr_bucket_delete(e) do { \
+ APR_BUCKET_REMOVE(e); \
+ apr_bucket_destroy(e); \
+ } while (0)
+
+/**
+ * Read some data from the bucket.
+ *
+ * The apr_bucket_read function returns a convenient amount of data
+ * from the bucket provided, writing the address and length of the
+ * data to the pointers provided by the caller. The function tries
+ * as hard as possible to avoid a memory copy.
+ *
+ * Buckets are expected to be a member of a brigade at the time they
+ * are read.
+ *
+ * In typical application code, buckets are read in a loop, and after
+ * each bucket is read and processed, it is moved or deleted from the
+ * brigade and the next bucket read.
+ *
+ * The definition of "convenient" depends on the type of bucket that
+ * is being read, and is decided by APR. In the case of memory based
+ * buckets such as heap and immortal buckets, a pointer will be
+ * returned to the location of the buffer containing the complete
+ * contents of the bucket.
+ *
+ * Some buckets, such as the socket bucket, might have no concept
+ * of length. If an attempt is made to read such a bucket, the
+ * apr_bucket_read function will read a convenient amount of data
+ * from the socket. The socket bucket is magically morphed into a
+ * heap bucket containing the just-read data, and a new socket bucket
+ * is inserted just after this heap bucket.
+ *
+ * To understand why apr_bucket_read might do this, consider the loop
+ * described above to read and process buckets. The current bucket
+ * is magically morphed into a heap bucket and returned to the caller.
+ * The caller processes the data, and deletes the heap bucket, moving
+ * onto the next bucket, the new socket bucket. This process repeats,
+ * giving the illusion of a bucket brigade that contains potentially
+ * infinite amounts of data. It is up to the caller to decide at what
+ * point to stop reading buckets.
+ *
+ * Some buckets, such as the file bucket, might have a fixed size,
+ * but be significantly larger than is practical to store in RAM in
+ * one go. As with the socket bucket, if an attempt is made to read
+ * from a file bucket, the file bucket is magically morphed into a
+ * heap bucket containing a convenient amount of data read from the
+ * current offset in the file. During the read, the offset will be
+ * moved forward on the file, and a new file bucket will be inserted
+ * directly after the current bucket representing the remainder of the
+ * file. If the heap bucket was large enough to store the whole
+ * remainder of the file, no more file buckets are inserted, and the
+ * file bucket will disappear completely.
+ *
+ * The pattern for reading buckets described above does create the
+ * illusion that the code is willing to swallow buckets that might be
+ * too large for the system to handle in one go. This however is just
+ * an illusion: APR will always ensure that large (file) or infinite
+ * (socket) buckets are broken into convenient bite sized heap buckets
+ * before data is returned to the caller.
+ *
+ * There is a potential gotcha to watch for: if buckets are read in a
+ * loop, and aren't deleted after being processed, the potentially large
+ * bucket will slowly be converted into RAM resident heap buckets. If
+ * the file is larger than available RAM, an out of memory condition
+ * could be caused if the application is not careful to manage this.
+ *
+ * @param e The bucket to read from
+ * @param str The location to store a pointer to the data in
+ * @param len The location to store the amount of data read
+ * @param block Whether the read function blocks
+ */
+#define apr_bucket_read(e,str,len,block) (e)->type->read(e, str, len, block)
+
+/**
+ * Setaside data so that stack data is not destroyed on returning from
+ * the function
+ * @param e The bucket to setaside
+ * @param p The pool to setaside into
+ */
+#define apr_bucket_setaside(e,p) (e)->type->setaside(e,p)
+
+/**
+ * Split one bucket in two at the point provided.
+ *
+ * Once split, the original bucket becomes the first of the two new buckets.
+ *
+ * (It is assumed that the bucket is a member of a brigade when this
+ * function is called).
+ * @param e The bucket to split
+ * @param point The offset to split the bucket at
+ */
+#define apr_bucket_split(e,point) (e)->type->split(e, point)
+
+/**
+ * Copy a bucket.
+ * @param e The bucket to copy
+ * @param c Returns a pointer to the new bucket
+ */
+#define apr_bucket_copy(e,c) (e)->type->copy(e, c)
+
+/* Bucket type handling */
+
+/**
+ * This function simply returns APR_SUCCESS to denote that the bucket does
+ * not require anything to happen for its setaside() function. This is
+ * appropriate for buckets that have "immortal" data -- the data will live
+ * at least as long as the bucket.
+ * @param data The bucket to setaside
+ * @param pool The pool defining the desired lifetime of the bucket data
+ * @return APR_SUCCESS
+ */
+APU_DECLARE_NONSTD(apr_status_t) apr_bucket_setaside_noop(apr_bucket *data,
+ apr_pool_t *pool);
+
+/**
+ * A place holder function that signifies that the setaside function was not
+ * implemented for this bucket
+ * @param data The bucket to setaside
+ * @param pool The pool defining the desired lifetime of the bucket data
+ * @return APR_ENOTIMPL
+ */
+APU_DECLARE_NONSTD(apr_status_t) apr_bucket_setaside_notimpl(apr_bucket *data,
+ apr_pool_t *pool);
+
+/**
+ * A place holder function that signifies that the split function was not
+ * implemented for this bucket
+ * @param data The bucket to split
+ * @param point The location to split the bucket
+ * @return APR_ENOTIMPL
+ */
+APU_DECLARE_NONSTD(apr_status_t) apr_bucket_split_notimpl(apr_bucket *data,
+ apr_size_t point);
+
+/**
+ * A place holder function that signifies that the copy function was not
+ * implemented for this bucket
+ * @param e The bucket to copy
+ * @param c Returns a pointer to the new bucket
+ * @return APR_ENOTIMPL
+ */
+APU_DECLARE_NONSTD(apr_status_t) apr_bucket_copy_notimpl(apr_bucket *e,
+ apr_bucket **c);
+
+/**
+ * A place holder function that signifies that this bucket does not need
+ * to do anything special to be destroyed. That's only the case for buckets
+ * that either have no data (metadata buckets) or buckets whose data pointer
+ * points to something that's not a bucket-type-specific structure, as with
+ * simple buckets where data points to a string and pipe buckets where data
+ * points directly to the apr_file_t.
+ * @param data The bucket data to destroy
+ */
+APU_DECLARE_NONSTD(void) apr_bucket_destroy_noop(void *data);
+
+/**
+ * There is no apr_bucket_destroy_notimpl, because destruction is required
+ * to be implemented (it could be a noop, but only if that makes sense for
+ * the bucket type)
+ */
+
+/* There is no apr_bucket_read_notimpl, because it is a required function
+ */
+
+
+/* All of the bucket types implemented by the core */
+/**
+ * The flush bucket type. This signifies that all data should be flushed to
+ * the next filter. The flush bucket should be sent with the other buckets.
+ */
+APU_DECLARE_DATA extern const apr_bucket_type_t apr_bucket_type_flush;
+/**
+ * The EOS bucket type. This signifies that there will be no more data, ever.
+ * All filters MUST send all data to the next filter when they receive a
+ * bucket of this type
+ */
+APU_DECLARE_DATA extern const apr_bucket_type_t apr_bucket_type_eos;
+/**
+ * The FILE bucket type. This bucket represents a file on disk
+ */
+APU_DECLARE_DATA extern const apr_bucket_type_t apr_bucket_type_file;
+/**
+ * The HEAP bucket type. This bucket represents a data allocated from the
+ * heap.
+ */
+APU_DECLARE_DATA extern const apr_bucket_type_t apr_bucket_type_heap;
+#if APR_HAS_MMAP
+/**
+ * The MMAP bucket type. This bucket represents an MMAP'ed file
+ */
+APU_DECLARE_DATA extern const apr_bucket_type_t apr_bucket_type_mmap;
+#endif
+/**
+ * The POOL bucket type. This bucket represents a data that was allocated
+ * from a pool. IF this bucket is still available when the pool is cleared,
+ * the data is copied on to the heap.
+ */
+APU_DECLARE_DATA extern const apr_bucket_type_t apr_bucket_type_pool;
+/**
+ * The PIPE bucket type. This bucket represents a pipe to another program.
+ */
+APU_DECLARE_DATA extern const apr_bucket_type_t apr_bucket_type_pipe;
+/**
+ * The IMMORTAL bucket type. This bucket represents a segment of data that
+ * the creator is willing to take responsibility for. The core will do
+ * nothing with the data in an immortal bucket
+ */
+APU_DECLARE_DATA extern const apr_bucket_type_t apr_bucket_type_immortal;
+/**
+ * The TRANSIENT bucket type. This bucket represents a data allocated off
+ * the stack. When the setaside function is called, this data is copied on
+ * to the heap
+ */
+APU_DECLARE_DATA extern const apr_bucket_type_t apr_bucket_type_transient;
+/**
+ * The SOCKET bucket type. This bucket represents a socket to another machine
+ */
+APU_DECLARE_DATA extern const apr_bucket_type_t apr_bucket_type_socket;
+
+
+/* ***** Simple buckets ***** */
+
+/**
+ * Split a simple bucket into two at the given point. Most non-reference
+ * counting buckets that allow multiple references to the same block of
+ * data (eg transient and immortal) will use this as their split function
+ * without any additional type-specific handling.
+ * @param b The bucket to be split
+ * @param point The offset of the first byte in the new bucket
+ * @return APR_EINVAL if the point is not within the bucket;
+ * APR_ENOMEM if allocation failed;
+ * or APR_SUCCESS
+ */
+APU_DECLARE_NONSTD(apr_status_t) apr_bucket_simple_split(apr_bucket *b,
+ apr_size_t point);
+
+/**
+ * Copy a simple bucket. Most non-reference-counting buckets that allow
+ * multiple references to the same block of data (eg transient and immortal)
+ * will use this as their copy function without any additional type-specific
+ * handling.
+ * @param a The bucket to copy
+ * @param b Returns a pointer to the new bucket
+ * @return APR_ENOMEM if allocation failed;
+ * or APR_SUCCESS
+ */
+APU_DECLARE_NONSTD(apr_status_t) apr_bucket_simple_copy(apr_bucket *a,
+ apr_bucket **b);
+
+
+/* ***** Shared, reference-counted buckets ***** */
+
+/**
+ * Initialize a bucket containing reference-counted data that may be
+ * shared. The caller must allocate the bucket if necessary and
+ * initialize its type-dependent fields, and allocate and initialize
+ * its own private data structure. This function should only be called
+ * by type-specific bucket creation functions.
+ * @param b The bucket to initialize
+ * @param data A pointer to the private data structure
+ * with the reference count at the start
+ * @param start The start of the data in the bucket
+ * relative to the private base pointer
+ * @param length The length of the data in the bucket
+ * @return The new bucket, or NULL if allocation failed
+ */
+APU_DECLARE(apr_bucket *) apr_bucket_shared_make(apr_bucket *b, void *data,
+ apr_off_t start,
+ apr_size_t length);
+
+/**
+ * Decrement the refcount of the data in the bucket. This function
+ * should only be called by type-specific bucket destruction functions.
+ * @param data The private data pointer from the bucket to be destroyed
+ * @return TRUE or FALSE; TRUE if the reference count is now
+ * zero, indicating that the shared resource itself can
+ * be destroyed by the caller.
+ */
+APU_DECLARE(int) apr_bucket_shared_destroy(void *data);
+
+/**
+ * Split a bucket into two at the given point, and adjust the refcount
+ * to the underlying data. Most reference-counting bucket types will
+ * be able to use this function as their split function without any
+ * additional type-specific handling.
+ * @param b The bucket to be split
+ * @param point The offset of the first byte in the new bucket
+ * @return APR_EINVAL if the point is not within the bucket;
+ * APR_ENOMEM if allocation failed;
+ * or APR_SUCCESS
+ */
+APU_DECLARE_NONSTD(apr_status_t) apr_bucket_shared_split(apr_bucket *b,
+ apr_size_t point);
+
+/**
+ * Copy a refcounted bucket, incrementing the reference count. Most
+ * reference-counting bucket types will be able to use this function
+ * as their copy function without any additional type-specific handling.
+ * @param a The bucket to copy
+ * @param b Returns a pointer to the new bucket
+ * @return APR_ENOMEM if allocation failed;
+ or APR_SUCCESS
+ */
+APU_DECLARE_NONSTD(apr_status_t) apr_bucket_shared_copy(apr_bucket *a,
+ apr_bucket **b);
+
+
+/* ***** Functions to Create Buckets of varying types ***** */
+/*
+ * Each bucket type foo has two initialization functions:
+ * apr_bucket_foo_make which sets up some already-allocated memory as a
+ * bucket of type foo; and apr_bucket_foo_create which allocates memory
+ * for the bucket, calls apr_bucket_make_foo, and initializes the
+ * bucket's list pointers. The apr_bucket_foo_make functions are used
+ * inside the bucket code to change the type of buckets in place;
+ * other code should call apr_bucket_foo_create. All the initialization
+ * functions change nothing if they fail.
+ */
+
+/**
+ * Create an End of Stream bucket. This indicates that there is no more data
+ * coming from down the filter stack. All filters should flush at this point.
+ * @param list The freelist from which this bucket should be allocated
+ * @return The new bucket, or NULL if allocation failed
+ */
+APU_DECLARE(apr_bucket *) apr_bucket_eos_create(apr_bucket_alloc_t *list);
+
+/**
+ * Make the bucket passed in an EOS bucket. This indicates that there is no
+ * more data coming from down the filter stack. All filters should flush at
+ * this point.
+ * @param b The bucket to make into an EOS bucket
+ * @return The new bucket, or NULL if allocation failed
+ */
+APU_DECLARE(apr_bucket *) apr_bucket_eos_make(apr_bucket *b);
+
+/**
+ * Create a flush bucket. This indicates that filters should flush their
+ * data. There is no guarantee that they will flush it, but this is the
+ * best we can do.
+ * @param list The freelist from which this bucket should be allocated
+ * @return The new bucket, or NULL if allocation failed
+ */
+APU_DECLARE(apr_bucket *) apr_bucket_flush_create(apr_bucket_alloc_t *list);
+
+/**
+ * Make the bucket passed in a FLUSH bucket. This indicates that filters
+ * should flush their data. There is no guarantee that they will flush it,
+ * but this is the best we can do.
+ * @param b The bucket to make into a FLUSH bucket
+ * @return The new bucket, or NULL if allocation failed
+ */
+APU_DECLARE(apr_bucket *) apr_bucket_flush_make(apr_bucket *b);
+
+/**
+ * Create a bucket referring to long-lived data.
+ * @param buf The data to insert into the bucket
+ * @param nbyte The size of the data to insert.
+ * @param list The freelist from which this bucket should be allocated
+ * @return The new bucket, or NULL if allocation failed
+ */
+APU_DECLARE(apr_bucket *) apr_bucket_immortal_create(const char *buf,
+ apr_size_t nbyte,
+ apr_bucket_alloc_t *list);
+
+/**
+ * Make the bucket passed in a bucket refer to long-lived data
+ * @param b The bucket to make into a IMMORTAL bucket
+ * @param buf The data to insert into the bucket
+ * @param nbyte The size of the data to insert.
+ * @return The new bucket, or NULL if allocation failed
+ */
+APU_DECLARE(apr_bucket *) apr_bucket_immortal_make(apr_bucket *b,
+ const char *buf,
+ apr_size_t nbyte);
+
+/**
+ * Create a bucket referring to data on the stack.
+ * @param buf The data to insert into the bucket
+ * @param nbyte The size of the data to insert.
+ * @param list The freelist from which this bucket should be allocated
+ * @return The new bucket, or NULL if allocation failed
+ */
+APU_DECLARE(apr_bucket *) apr_bucket_transient_create(const char *buf,
+ apr_size_t nbyte,
+ apr_bucket_alloc_t *list);
+
+/**
+ * Make the bucket passed in a bucket refer to stack data
+ * @param b The bucket to make into a TRANSIENT bucket
+ * @param buf The data to insert into the bucket
+ * @param nbyte The size of the data to insert.
+ * @return The new bucket, or NULL if allocation failed
+ */
+APU_DECLARE(apr_bucket *) apr_bucket_transient_make(apr_bucket *b,
+ const char *buf,
+ apr_size_t nbyte);
+
+/**
+ * Create a bucket referring to memory on the heap. If the caller asks
+ * for the data to be copied, this function always allocates 4K of
+ * memory so that more data can be added to the bucket without
+ * requiring another allocation. Therefore not all the data may be put
+ * into the bucket. If copying is not requested then the bucket takes
+ * over responsibility for free()ing the memory.
+ * @param buf The buffer to insert into the bucket
+ * @param nbyte The size of the buffer to insert.
+ * @param free_func Function to use to free the data; NULL indicates that the
+ * bucket should make a copy of the data
+ * @param list The freelist from which this bucket should be allocated
+ * @return The new bucket, or NULL if allocation failed
+ */
+APU_DECLARE(apr_bucket *) apr_bucket_heap_create(const char *buf,
+ apr_size_t nbyte,
+ void (*free_func)(void *data),
+ apr_bucket_alloc_t *list);
+/**
+ * Make the bucket passed in a bucket refer to heap data
+ * @param b The bucket to make into a HEAP bucket
+ * @param buf The buffer to insert into the bucket
+ * @param nbyte The size of the buffer to insert.
+ * @param free_func Function to use to free the data; NULL indicates that the
+ * bucket should make a copy of the data
+ * @return The new bucket, or NULL if allocation failed
+ */
+APU_DECLARE(apr_bucket *) apr_bucket_heap_make(apr_bucket *b, const char *buf,
+ apr_size_t nbyte,
+ void (*free_func)(void *data));
+
+/**
+ * Create a bucket referring to memory allocated from a pool.
+ *
+ * @param buf The buffer to insert into the bucket
+ * @param length The number of bytes referred to by this bucket
+ * @param pool The pool the memory was allocated from
+ * @param list The freelist from which this bucket should be allocated
+ * @return The new bucket, or NULL if allocation failed
+ */
+APU_DECLARE(apr_bucket *) apr_bucket_pool_create(const char *buf,
+ apr_size_t length,
+ apr_pool_t *pool,
+ apr_bucket_alloc_t *list);
+
+/**
+ * Make the bucket passed in a bucket refer to pool data
+ * @param b The bucket to make into a pool bucket
+ * @param buf The buffer to insert into the bucket
+ * @param length The number of bytes referred to by this bucket
+ * @param pool The pool the memory was allocated from
+ * @return The new bucket, or NULL if allocation failed
+ */
+APU_DECLARE(apr_bucket *) apr_bucket_pool_make(apr_bucket *b, const char *buf,
+ apr_size_t length,
+ apr_pool_t *pool);
+
+#if APR_HAS_MMAP
+/**
+ * Create a bucket referring to mmap()ed memory.
+ * @param mm The mmap to insert into the bucket
+ * @param start The offset of the first byte in the mmap
+ * that this bucket refers to
+ * @param length The number of bytes referred to by this bucket
+ * @param list The freelist from which this bucket should be allocated
+ * @return The new bucket, or NULL if allocation failed
+ */
+APU_DECLARE(apr_bucket *) apr_bucket_mmap_create(apr_mmap_t *mm,
+ apr_off_t start,
+ apr_size_t length,
+ apr_bucket_alloc_t *list);
+
+/**
+ * Make the bucket passed in a bucket refer to an MMAP'ed file
+ * @param b The bucket to make into a MMAP bucket
+ * @param mm The mmap to insert into the bucket
+ * @param start The offset of the first byte in the mmap
+ * that this bucket refers to
+ * @param length The number of bytes referred to by this bucket
+ * @return The new bucket, or NULL if allocation failed
+ */
+APU_DECLARE(apr_bucket *) apr_bucket_mmap_make(apr_bucket *b, apr_mmap_t *mm,
+ apr_off_t start,
+ apr_size_t length);
+#endif
+
+/**
+ * Create a bucket referring to a socket.
+ * @param thissock The socket to put in the bucket
+ * @param list The freelist from which this bucket should be allocated
+ * @return The new bucket, or NULL if allocation failed
+ */
+APU_DECLARE(apr_bucket *) apr_bucket_socket_create(apr_socket_t *thissock,
+ apr_bucket_alloc_t *list);
+/**
+ * Make the bucket passed in a bucket refer to a socket
+ * @param b The bucket to make into a SOCKET bucket
+ * @param thissock The socket to put in the bucket
+ * @return The new bucket, or NULL if allocation failed
+ */
+APU_DECLARE(apr_bucket *) apr_bucket_socket_make(apr_bucket *b,
+ apr_socket_t *thissock);
+
+/**
+ * Create a bucket referring to a pipe.
+ * @param thispipe The pipe to put in the bucket
+ * @param list The freelist from which this bucket should be allocated
+ * @return The new bucket, or NULL if allocation failed
+ */
+APU_DECLARE(apr_bucket *) apr_bucket_pipe_create(apr_file_t *thispipe,
+ apr_bucket_alloc_t *list);
+
+/**
+ * Make the bucket passed in a bucket refer to a pipe
+ * @param b The bucket to make into a PIPE bucket
+ * @param thispipe The pipe to put in the bucket
+ * @return The new bucket, or NULL if allocation failed
+ */
+APU_DECLARE(apr_bucket *) apr_bucket_pipe_make(apr_bucket *b,
+ apr_file_t *thispipe);
+
+/**
+ * Create a bucket referring to a file.
+ * @param fd The file to put in the bucket
+ * @param offset The offset where the data of interest begins in the file
+ * @param len The amount of data in the file we are interested in
+ * @param p The pool into which any needed structures should be created
+ * while reading from this file bucket
+ * @param list The freelist from which this bucket should be allocated
+ * @return The new bucket, or NULL if allocation failed
+ * @remark If the file is truncated such that the segment of the file
+ * referenced by the bucket no longer exists, an attempt to read
+ * from the bucket will fail with APR_EOF.
+ * @remark apr_brigade_insert_file() should generally be used to
+ * insert files into brigades, since that function can correctly
+ * handle large file issues.
+ */
+APU_DECLARE(apr_bucket *) apr_bucket_file_create(apr_file_t *fd,
+ apr_off_t offset,
+ apr_size_t len,
+ apr_pool_t *p,
+ apr_bucket_alloc_t *list);
+
+/**
+ * Make the bucket passed in a bucket refer to a file
+ * @param b The bucket to make into a FILE bucket
+ * @param fd The file to put in the bucket
+ * @param offset The offset where the data of interest begins in the file
+ * @param len The amount of data in the file we are interested in
+ * @param p The pool into which any needed structures should be created
+ * while reading from this file bucket
+ * @return The new bucket, or NULL if allocation failed
+ */
+APU_DECLARE(apr_bucket *) apr_bucket_file_make(apr_bucket *b, apr_file_t *fd,
+ apr_off_t offset,
+ apr_size_t len, apr_pool_t *p);
+
+/**
+ * Enable or disable memory-mapping for a FILE bucket (default is enabled)
+ * @param b The bucket
+ * @param enabled Whether memory-mapping should be enabled
+ * @return APR_SUCCESS normally, or an error code if the operation fails
+ */
+APU_DECLARE(apr_status_t) apr_bucket_file_enable_mmap(apr_bucket *b,
+ int enabled);
+
+/** @} */
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !APR_BUCKETS_H */
diff --git a/contrib/apr-util/include/apr_crypto.h b/contrib/apr-util/include/apr_crypto.h
new file mode 100644
index 000000000000..ed0982dbdd91
--- /dev/null
+++ b/contrib/apr-util/include/apr_crypto.h
@@ -0,0 +1,419 @@
+/* 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.
+ */
+
+#ifndef APR_CRYPTO_H
+#define APR_CRYPTO_H
+
+#include "apu.h"
+#include "apr_pools.h"
+#include "apr_tables.h"
+#include "apr_hash.h"
+#include "apu_errno.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @file apr_crypto.h
+ * @brief APR-UTIL Crypto library
+ */
+/**
+ * @defgroup APR_Util_Crypto Crypto routines
+ * @ingroup APR_Util
+ * @{
+ */
+
+#if APU_HAVE_CRYPTO
+
+#ifndef APU_CRYPTO_RECOMMENDED_DRIVER
+#if APU_HAVE_OPENSSL
+#define APU_CRYPTO_RECOMMENDED_DRIVER "openssl"
+#else
+#if APU_HAVE_NSS
+#define APU_CRYPTO_RECOMMENDED_DRIVER "nss"
+#else
+#if APU_HAVE_MSCNG
+#define APU_CRYPTO_RECOMMENDED_DRIVER "mscng"
+#else
+#if APU_HAVE_MSCAPI
+#define APU_CRYPTO_RECOMMENDED_DRIVER "mscapi"
+#else
+#endif
+#endif
+#endif
+#endif
+#endif
+
+/**
+ * Symmetric Key types understood by the library.
+ *
+ * NOTE: It is expected that this list will grow over time.
+ *
+ * Interoperability Matrix:
+ *
+ * The matrix is based on the testcrypto.c unit test, which attempts to
+ * test whether a simple encrypt/decrypt will succeed, as well as testing
+ * whether an encrypted string by one library can be decrypted by the
+ * others.
+ *
+ * Some libraries will successfully encrypt and decrypt their own data,
+ * but won't decrypt data from another library. It is hoped that over
+ * time these anomalies will be found and fixed, but until then it is
+ * recommended that ciphers are chosen that interoperate across platform.
+ *
+ * An X below means the test passes, it does not necessarily mean that
+ * encryption performed is correct or secure. Applications should stick
+ * to ciphers that pass the interoperablity tests on the right hand side
+ * of the table.
+ *
+ * Aligned data is data whose length is a multiple of the block size for
+ * the chosen cipher. Padded data is data that is not aligned by block
+ * size and must be padded by the crypto library.
+ *
+ * OpenSSL NSS Interop
+ * Align Pad Align Pad Align Pad
+ * 3DES_192/CBC X X X X X X
+ * 3DES_192/ECB X X
+ * AES_256/CBC X X X X X X
+ * AES_256/ECB X X X X
+ * AES_192/CBC X X X X
+ * AES_192/ECB X X X
+ * AES_128/CBC X X X X
+ * AES_128/ECB X X X
+ *
+ * Conclusion: for padded data, use 3DES_192/CBC or AES_256/CBC. For
+ * aligned data, use 3DES_192/CBC, AES_256/CBC or AES_256/ECB.
+ */
+
+typedef enum
+{
+ APR_KEY_NONE, APR_KEY_3DES_192, /** 192 bit (3-Key) 3DES */
+ APR_KEY_AES_128, /** 128 bit AES */
+ APR_KEY_AES_192, /** 192 bit AES */
+ APR_KEY_AES_256
+/** 256 bit AES */
+} apr_crypto_block_key_type_e;
+
+typedef enum
+{
+ APR_MODE_NONE, /** An error condition */
+ APR_MODE_ECB, /** Electronic Code Book */
+ APR_MODE_CBC
+/** Cipher Block Chaining */
+} apr_crypto_block_key_mode_e;
+
+/* These are opaque structs. Instantiation is up to each backend */
+typedef struct apr_crypto_driver_t apr_crypto_driver_t;
+typedef struct apr_crypto_t apr_crypto_t;
+typedef struct apr_crypto_config_t apr_crypto_config_t;
+typedef struct apr_crypto_key_t apr_crypto_key_t;
+typedef struct apr_crypto_block_t apr_crypto_block_t;
+
+/**
+ * @brief Perform once-only initialisation. Call once only.
+ *
+ * @param pool - pool to register any shutdown cleanups, etc
+ * @return APR_NOTIMPL in case of no crypto support.
+ */
+APU_DECLARE(apr_status_t) apr_crypto_init(apr_pool_t *pool);
+
+/**
+ * @brief Register a cleanup to zero out the buffer provided
+ * when the pool is cleaned up.
+ *
+ * @param pool - pool to register the cleanup
+ * @param buffer - buffer to zero out
+ * @param size - size of the buffer to zero out
+ */
+APU_DECLARE(apr_status_t) apr_crypto_clear(apr_pool_t *pool, void *buffer,
+ apr_size_t size);
+
+/**
+ * @brief Get the driver struct for a name
+ *
+ * @param driver - pointer to driver struct.
+ * @param name - driver name
+ * @param params - array of initialisation parameters
+ * @param result - result and error message on failure
+ * @param pool - (process) pool to register cleanup
+ * @return APR_SUCCESS for success
+ * @return APR_ENOTIMPL for no driver (when DSO not enabled)
+ * @return APR_EDSOOPEN if DSO driver file can't be opened
+ * @return APR_ESYMNOTFOUND if the driver file doesn't contain a driver
+ * @remarks NSS: the params can have "dir", "key3", "cert7" and "secmod"
+ * keys, each followed by an equal sign and a value. Such key/value pairs can
+ * be delimited by space or tab. If the value contains a space, surround the
+ * whole key value pair in quotes: "dir=My Directory".
+ * @remarks OpenSSL: currently no params are supported.
+ */
+APU_DECLARE(apr_status_t) apr_crypto_get_driver(
+ const apr_crypto_driver_t **driver,
+ const char *name, const char *params, const apu_err_t **result,
+ apr_pool_t *pool);
+
+/**
+ * @brief Return the name of the driver.
+ *
+ * @param driver - The driver in use.
+ * @return The name of the driver.
+ */
+APU_DECLARE(const char *) apr_crypto_driver_name(
+ const apr_crypto_driver_t *driver);
+
+/**
+ * @brief Get the result of the last operation on a context. If the result
+ * is NULL, the operation was successful.
+ * @param result - the result structure
+ * @param f - context pointer
+ * @return APR_SUCCESS for success
+ */
+APU_DECLARE(apr_status_t) apr_crypto_error(const apu_err_t **result,
+ const apr_crypto_t *f);
+
+/**
+ * @brief Create a context for supporting encryption. Keys, certificates,
+ * algorithms and other parameters will be set per context. More than
+ * one context can be created at one time. A cleanup will be automatically
+ * registered with the given pool to guarantee a graceful shutdown.
+ * @param f - context pointer will be written here
+ * @param driver - driver to use
+ * @param params - array of key parameters
+ * @param pool - process pool
+ * @return APR_ENOENGINE when the engine specified does not exist. APR_EINITENGINE
+ * if the engine cannot be initialised.
+ * @remarks NSS: currently no params are supported.
+ * @remarks OpenSSL: the params can have "engine" as a key, followed by an equal
+ * sign and a value.
+ */
+APU_DECLARE(apr_status_t) apr_crypto_make(apr_crypto_t **f,
+ const apr_crypto_driver_t *driver, const char *params,
+ apr_pool_t *pool);
+
+/**
+ * @brief Get a hash table of key types, keyed by the name of the type against
+ * an integer pointer constant.
+ *
+ * @param types - hashtable of key types keyed to constants.
+ * @param f - encryption context
+ * @return APR_SUCCESS for success
+ */
+APU_DECLARE(apr_status_t) apr_crypto_get_block_key_types(apr_hash_t **types,
+ const apr_crypto_t *f);
+
+/**
+ * @brief Get a hash table of key modes, keyed by the name of the mode against
+ * an integer pointer constant.
+ *
+ * @param modes - hashtable of key modes keyed to constants.
+ * @param f - encryption context
+ * @return APR_SUCCESS for success
+ */
+APU_DECLARE(apr_status_t) apr_crypto_get_block_key_modes(apr_hash_t **modes,
+ const apr_crypto_t *f);
+
+/**
+ * @brief Create a key from the given passphrase. By default, the PBKDF2
+ * algorithm is used to generate the key from the passphrase. It is expected
+ * that the same pass phrase will generate the same key, regardless of the
+ * backend crypto platform used. The key is cleaned up when the context
+ * is cleaned, and may be reused with multiple encryption or decryption
+ * operations.
+ * @note If *key is NULL, a apr_crypto_key_t will be created from a pool. If
+ * *key is not NULL, *key must point at a previously created structure.
+ * @param key The key returned, see note.
+ * @param ivSize The size of the initialisation vector will be returned, based
+ * on whether an IV is relevant for this type of crypto.
+ * @param pass The passphrase to use.
+ * @param passLen The passphrase length in bytes
+ * @param salt The salt to use.
+ * @param saltLen The salt length in bytes
+ * @param type 3DES_192, AES_128, AES_192, AES_256.
+ * @param mode Electronic Code Book / Cipher Block Chaining.
+ * @param doPad Pad if necessary.
+ * @param iterations Number of iterations to use in algorithm
+ * @param f The context to use.
+ * @param p The pool to use.
+ * @return Returns APR_ENOKEY if the pass phrase is missing or empty, or if a backend
+ * error occurred while generating the key. APR_ENOCIPHER if the type or mode
+ * is not supported by the particular backend. APR_EKEYTYPE if the key type is
+ * not known. APR_EPADDING if padding was requested but is not supported.
+ * APR_ENOTIMPL if not implemented.
+ */
+APU_DECLARE(apr_status_t) apr_crypto_passphrase(apr_crypto_key_t **key,
+ apr_size_t *ivSize, const char *pass, apr_size_t passLen,
+ const unsigned char * salt, apr_size_t saltLen,
+ const apr_crypto_block_key_type_e type,
+ const apr_crypto_block_key_mode_e mode, const int doPad,
+ const int iterations, const apr_crypto_t *f, apr_pool_t *p);
+
+/**
+ * @brief Initialise a context for encrypting arbitrary data using the given key.
+ * @note If *ctx is NULL, a apr_crypto_block_t will be created from a pool. If
+ * *ctx is not NULL, *ctx must point at a previously created structure.
+ * @param ctx The block context returned, see note.
+ * @param iv Optional initialisation vector. If the buffer pointed to is NULL,
+ * an IV will be created at random, in space allocated from the pool.
+ * If the buffer pointed to is not NULL, the IV in the buffer will be
+ * used.
+ * @param key The key structure to use.
+ * @param blockSize The block size of the cipher.
+ * @param p The pool to use.
+ * @return Returns APR_ENOIV if an initialisation vector is required but not specified.
+ * Returns APR_EINIT if the backend failed to initialise the context. Returns
+ * APR_ENOTIMPL if not implemented.
+ */
+APU_DECLARE(apr_status_t) apr_crypto_block_encrypt_init(
+ apr_crypto_block_t **ctx, const unsigned char **iv,
+ const apr_crypto_key_t *key, apr_size_t *blockSize, apr_pool_t *p);
+
+/**
+ * @brief Encrypt data provided by in, write it to out.
+ * @note The number of bytes written will be written to outlen. If
+ * out is NULL, outlen will contain the maximum size of the
+ * buffer needed to hold the data, including any data
+ * generated by apr_crypto_block_encrypt_finish below. If *out points
+ * to NULL, a buffer sufficiently large will be created from
+ * the pool provided. If *out points to a not-NULL value, this
+ * value will be used as a buffer instead.
+ * @param out Address of a buffer to which data will be written,
+ * see note.
+ * @param outlen Length of the output will be written here.
+ * @param in Address of the buffer to read.
+ * @param inlen Length of the buffer to read.
+ * @param ctx The block context to use.
+ * @return APR_ECRYPT if an error occurred. Returns APR_ENOTIMPL if
+ * not implemented.
+ */
+APU_DECLARE(apr_status_t) apr_crypto_block_encrypt(unsigned char **out,
+ apr_size_t *outlen, const unsigned char *in, apr_size_t inlen,
+ apr_crypto_block_t *ctx);
+
+/**
+ * @brief Encrypt final data block, write it to out.
+ * @note If necessary the final block will be written out after being
+ * padded. Typically the final block will be written to the
+ * same buffer used by apr_crypto_block_encrypt, offset by the
+ * number of bytes returned as actually written by the
+ * apr_crypto_block_encrypt() call. After this call, the context
+ * is cleaned and can be reused by apr_crypto_block_encrypt_init().
+ * @param out Address of a buffer to which data will be written. This
+ * buffer must already exist, and is usually the same
+ * buffer used by apr_evp_crypt(). See note.
+ * @param outlen Length of the output will be written here.
+ * @param ctx The block context to use.
+ * @return APR_ECRYPT if an error occurred.
+ * @return APR_EPADDING if padding was enabled and the block was incorrectly
+ * formatted.
+ * @return APR_ENOTIMPL if not implemented.
+ */
+APU_DECLARE(apr_status_t) apr_crypto_block_encrypt_finish(unsigned char *out,
+ apr_size_t *outlen, apr_crypto_block_t *ctx);
+
+/**
+ * @brief Initialise a context for decrypting arbitrary data using the given key.
+ * @note If *ctx is NULL, a apr_crypto_block_t will be created from a pool. If
+ * *ctx is not NULL, *ctx must point at a previously created structure.
+ * @param ctx The block context returned, see note.
+ * @param blockSize The block size of the cipher.
+ * @param iv Optional initialisation vector.
+ * @param key The key structure to use.
+ * @param p The pool to use.
+ * @return Returns APR_ENOIV if an initialisation vector is required but not specified.
+ * Returns APR_EINIT if the backend failed to initialise the context. Returns
+ * APR_ENOTIMPL if not implemented.
+ */
+APU_DECLARE(apr_status_t) apr_crypto_block_decrypt_init(
+ apr_crypto_block_t **ctx, apr_size_t *blockSize,
+ const unsigned char *iv, const apr_crypto_key_t *key, apr_pool_t *p);
+
+/**
+ * @brief Decrypt data provided by in, write it to out.
+ * @note The number of bytes written will be written to outlen. If
+ * out is NULL, outlen will contain the maximum size of the
+ * buffer needed to hold the data, including any data
+ * generated by apr_crypto_block_decrypt_finish below. If *out points
+ * to NULL, a buffer sufficiently large will be created from
+ * the pool provided. If *out points to a not-NULL value, this
+ * value will be used as a buffer instead.
+ * @param out Address of a buffer to which data will be written,
+ * see note.
+ * @param outlen Length of the output will be written here.
+ * @param in Address of the buffer to read.
+ * @param inlen Length of the buffer to read.
+ * @param ctx The block context to use.
+ * @return APR_ECRYPT if an error occurred. Returns APR_ENOTIMPL if
+ * not implemented.
+ */
+APU_DECLARE(apr_status_t) apr_crypto_block_decrypt(unsigned char **out,
+ apr_size_t *outlen, const unsigned char *in, apr_size_t inlen,
+ apr_crypto_block_t *ctx);
+
+/**
+ * @brief Decrypt final data block, write it to out.
+ * @note If necessary the final block will be written out after being
+ * padded. Typically the final block will be written to the
+ * same buffer used by apr_crypto_block_decrypt, offset by the
+ * number of bytes returned as actually written by the
+ * apr_crypto_block_decrypt() call. After this call, the context
+ * is cleaned and can be reused by apr_crypto_block_decrypt_init().
+ * @param out Address of a buffer to which data will be written. This
+ * buffer must already exist, and is usually the same
+ * buffer used by apr_evp_crypt(). See note.
+ * @param outlen Length of the output will be written here.
+ * @param ctx The block context to use.
+ * @return APR_ECRYPT if an error occurred.
+ * @return APR_EPADDING if padding was enabled and the block was incorrectly
+ * formatted.
+ * @return APR_ENOTIMPL if not implemented.
+ */
+APU_DECLARE(apr_status_t) apr_crypto_block_decrypt_finish(unsigned char *out,
+ apr_size_t *outlen, apr_crypto_block_t *ctx);
+
+/**
+ * @brief Clean encryption / decryption context.
+ * @note After cleanup, a context is free to be reused if necessary.
+ * @param ctx The block context to use.
+ * @return Returns APR_ENOTIMPL if not supported.
+ */
+APU_DECLARE(apr_status_t) apr_crypto_block_cleanup(apr_crypto_block_t *ctx);
+
+/**
+ * @brief Clean encryption / decryption context.
+ * @note After cleanup, a context is free to be reused if necessary.
+ * @param f The context to use.
+ * @return Returns APR_ENOTIMPL if not supported.
+ */
+APU_DECLARE(apr_status_t) apr_crypto_cleanup(apr_crypto_t *f);
+
+/**
+ * @brief Shutdown the crypto library.
+ * @note After shutdown, it is expected that the init function can be called again.
+ * @param driver - driver to use
+ * @return Returns APR_ENOTIMPL if not supported.
+ */
+APU_DECLARE(apr_status_t) apr_crypto_shutdown(
+ const apr_crypto_driver_t *driver);
+
+#endif /* APU_HAVE_CRYPTO */
+
+/** @} */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/contrib/apr-util/include/apr_date.h b/contrib/apr-util/include/apr_date.h
new file mode 100644
index 000000000000..b098b5429586
--- /dev/null
+++ b/contrib/apr-util/include/apr_date.h
@@ -0,0 +1,106 @@
+/* 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.
+ */
+
+#ifndef APR_DATE_H
+#define APR_DATE_H
+
+/**
+ * @file apr_date.h
+ * @brief APR-UTIL date routines
+ */
+
+/**
+ * @defgroup APR_Util_Date Date routines
+ * @ingroup APR_Util
+ * @{
+ */
+
+/*
+ * apr_date.h: prototypes for date parsing utility routines
+ */
+
+#include "apu.h"
+#include "apr_time.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** A bad date. */
+#define APR_DATE_BAD ((apr_time_t)0)
+
+/**
+ * Compare a string to a mask
+ * @param data The string to compare
+ * @param mask Mask characters (arbitrary maximum is 256 characters):
+ * <PRE>
+ * '\@' - uppercase letter
+ * '\$' - lowercase letter
+ * '\&' - hex digit
+ * '#' - digit
+ * '~' - digit or space
+ * '*' - swallow remaining characters
+ * </PRE>
+ * @remark The mask tests for an exact match for any other character
+ * @return 1 if the string matches, 0 otherwise
+ */
+APU_DECLARE(int) apr_date_checkmask(const char *data, const char *mask);
+
+/**
+ * Parses an HTTP date in one of three standard forms:
+ * <PRE>
+ * Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123
+ * Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
+ * Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format
+ * </PRE>
+ * @param date The date in one of the three formats above
+ * @return the apr_time_t number of microseconds since 1 Jan 1970 GMT, or
+ * 0 if this would be out of range or if the date is invalid.
+ */
+APU_DECLARE(apr_time_t) apr_date_parse_http(const char *date);
+
+/**
+ * Parses a string resembling an RFC 822 date. This is meant to be
+ * leinent in its parsing of dates. Hence, this will parse a wider
+ * range of dates than apr_date_parse_http.
+ *
+ * The prominent mailer (or poster, if mailer is unknown) that has
+ * been seen in the wild is included for the unknown formats.
+ * <PRE>
+ * Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123
+ * Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
+ * Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format
+ * Sun, 6 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123
+ * Sun, 06 Nov 94 08:49:37 GMT ; RFC 822
+ * Sun, 6 Nov 94 08:49:37 GMT ; RFC 822
+ * Sun, 06 Nov 94 08:49 GMT ; Unknown [drtr\@ast.cam.ac.uk]
+ * Sun, 6 Nov 94 08:49 GMT ; Unknown [drtr\@ast.cam.ac.uk]
+ * Sun, 06 Nov 94 8:49:37 GMT ; Unknown [Elm 70.85]
+ * Sun, 6 Nov 94 8:49:37 GMT ; Unknown [Elm 70.85]
+ * </PRE>
+ *
+ * @param date The date in one of the formats above
+ * @return the apr_time_t number of microseconds since 1 Jan 1970 GMT, or
+ * 0 if this would be out of range or if the date is invalid.
+ */
+APU_DECLARE(apr_time_t) apr_date_parse_rfc(const char *date);
+
+/** @} */
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !APR_DATE_H */
diff --git a/contrib/apr-util/include/apr_dbd.h b/contrib/apr-util/include/apr_dbd.h
new file mode 100644
index 000000000000..3a334b73e2b3
--- /dev/null
+++ b/contrib/apr-util/include/apr_dbd.h
@@ -0,0 +1,552 @@
+/* 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.
+ */
+
+/* Overview of what this is and does:
+ * http://www.apache.org/~niq/dbd.html
+ */
+
+#ifndef APR_DBD_H
+#define APR_DBD_H
+
+#include "apu.h"
+#include "apr_pools.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @file apr_dbd.h
+ * @brief APR-UTIL DBD library
+ */
+/**
+ * @defgroup APR_Util_DBD DBD routines
+ * @ingroup APR_Util
+ * @{
+ */
+
+/**
+ * Mapping of C to SQL types, used for prepared statements.
+ * @remarks
+ * For apr_dbd_p[v]query/select functions, in and out parameters are always
+ * const char * (i.e. regular nul terminated strings). LOB types are passed
+ * with four (4) arguments: payload, length, table and column, all as const
+ * char *, where table and column are reserved for future use by Oracle.
+ * @remarks
+ * For apr_dbd_p[v]bquery/select functions, in and out parameters are
+ * described next to each enumeration constant and are generally native binary
+ * types or some APR data type. LOB types are passed with four (4) arguments:
+ * payload (char*), length (apr_size_t*), table (char*) and column (char*).
+ * Table and column are reserved for future use by Oracle.
+ */
+typedef enum {
+ APR_DBD_TYPE_NONE,
+ APR_DBD_TYPE_TINY, /**< \%hhd : in, out: char* */
+ APR_DBD_TYPE_UTINY, /**< \%hhu : in, out: unsigned char* */
+ APR_DBD_TYPE_SHORT, /**< \%hd : in, out: short* */
+ APR_DBD_TYPE_USHORT, /**< \%hu : in, out: unsigned short* */
+ APR_DBD_TYPE_INT, /**< \%d : in, out: int* */
+ APR_DBD_TYPE_UINT, /**< \%u : in, out: unsigned int* */
+ APR_DBD_TYPE_LONG, /**< \%ld : in, out: long* */
+ APR_DBD_TYPE_ULONG, /**< \%lu : in, out: unsigned long* */
+ APR_DBD_TYPE_LONGLONG, /**< \%lld : in, out: apr_int64_t* */
+ APR_DBD_TYPE_ULONGLONG, /**< \%llu : in, out: apr_uint64_t* */
+ APR_DBD_TYPE_FLOAT, /**< \%f : in, out: float* */
+ APR_DBD_TYPE_DOUBLE, /**< \%lf : in, out: double* */
+ APR_DBD_TYPE_STRING, /**< \%s : in: char*, out: char** */
+ APR_DBD_TYPE_TEXT, /**< \%pDt : in: char*, out: char** */
+ APR_DBD_TYPE_TIME, /**< \%pDi : in: char*, out: char** */
+ APR_DBD_TYPE_DATE, /**< \%pDd : in: char*, out: char** */
+ APR_DBD_TYPE_DATETIME, /**< \%pDa : in: char*, out: char** */
+ APR_DBD_TYPE_TIMESTAMP, /**< \%pDs : in: char*, out: char** */
+ APR_DBD_TYPE_ZTIMESTAMP, /**< \%pDz : in: char*, out: char** */
+ APR_DBD_TYPE_BLOB, /**< \%pDb : in: char* apr_size_t* char* char*, out: apr_bucket_brigade* */
+ APR_DBD_TYPE_CLOB, /**< \%pDc : in: char* apr_size_t* char* char*, out: apr_bucket_brigade* */
+ APR_DBD_TYPE_NULL /**< \%pDn : in: void*, out: void** */
+} apr_dbd_type_e;
+
+/* These are opaque structs. Instantiation is up to each backend */
+typedef struct apr_dbd_driver_t apr_dbd_driver_t;
+typedef struct apr_dbd_t apr_dbd_t;
+typedef struct apr_dbd_transaction_t apr_dbd_transaction_t;
+typedef struct apr_dbd_results_t apr_dbd_results_t;
+typedef struct apr_dbd_row_t apr_dbd_row_t;
+typedef struct apr_dbd_prepared_t apr_dbd_prepared_t;
+
+/** apr_dbd_init: perform once-only initialisation. Call once only.
+ *
+ * @param pool - pool to register any shutdown cleanups, etc
+ */
+APU_DECLARE(apr_status_t) apr_dbd_init(apr_pool_t *pool);
+
+/** apr_dbd_get_driver: get the driver struct for a name
+ *
+ * @param pool - (process) pool to register cleanup
+ * @param name - driver name
+ * @param driver - pointer to driver struct.
+ * @return APR_SUCCESS for success
+ * @return APR_ENOTIMPL for no driver (when DSO not enabled)
+ * @return APR_EDSOOPEN if DSO driver file can't be opened
+ * @return APR_ESYMNOTFOUND if the driver file doesn't contain a driver
+ */
+APU_DECLARE(apr_status_t) apr_dbd_get_driver(apr_pool_t *pool, const char *name,
+ const apr_dbd_driver_t **driver);
+
+/** apr_dbd_open_ex: open a connection to a backend
+ *
+ * @param driver - driver struct.
+ * @param pool - working pool
+ * @param params - arguments to driver (implementation-dependent)
+ * @param handle - pointer to handle to return
+ * @param error - descriptive error.
+ * @return APR_SUCCESS for success
+ * @return APR_EGENERAL if driver exists but connection failed
+ * @remarks PostgreSQL: the params is passed directly to the PQconnectdb()
+ * function (check PostgreSQL documentation for more details on the syntax).
+ * @remarks SQLite2: the params is split on a colon, with the first part used
+ * as the filename and second part converted to an integer and used as file
+ * mode.
+ * @remarks SQLite3: the params is passed directly to the sqlite3_open()
+ * function as a filename to be opened (check SQLite3 documentation for more
+ * details).
+ * @remarks Oracle: the params can have "user", "pass", "dbname" and "server"
+ * keys, each followed by an equal sign and a value. Such key/value pairs can
+ * be delimited by space, CR, LF, tab, semicolon, vertical bar or comma.
+ * @remarks MySQL: the params can have "host", "port", "user", "pass",
+ * "dbname", "sock", "flags" "fldsz", "group" and "reconnect" keys, each
+ * followed by an equal sign and a value. Such key/value pairs can be
+ * delimited by space, CR, LF, tab, semicolon, vertical bar or comma. For
+ * now, "flags" can only recognise CLIENT_FOUND_ROWS (check MySQL manual for
+ * details). The value associated with "fldsz" determines maximum amount of
+ * memory (in bytes) for each of the fields in the result set of prepared
+ * statements. By default, this value is 1 MB. The value associated with
+ * "group" determines which group from configuration file to use (see
+ * MYSQL_READ_DEFAULT_GROUP option of mysql_options() in MySQL manual).
+ * Reconnect is set to 1 by default (i.e. true).
+ * @remarks FreeTDS: the params can have "username", "password", "appname",
+ * "dbname", "host", "charset", "lang" and "server" keys, each followed by an
+ * equal sign and a value.
+ */
+APU_DECLARE(apr_status_t) apr_dbd_open_ex(const apr_dbd_driver_t *driver,
+ apr_pool_t *pool, const char *params,
+ apr_dbd_t **handle,
+ const char **error);
+
+/** apr_dbd_open: open a connection to a backend
+ *
+ * @param driver - driver struct.
+ * @param pool - working pool
+ * @param params - arguments to driver (implementation-dependent)
+ * @param handle - pointer to handle to return
+ * @return APR_SUCCESS for success
+ * @return APR_EGENERAL if driver exists but connection failed
+ * @see apr_dbd_open_ex
+ */
+APU_DECLARE(apr_status_t) apr_dbd_open(const apr_dbd_driver_t *driver,
+ apr_pool_t *pool, const char *params,
+ apr_dbd_t **handle);
+
+/** apr_dbd_close: close a connection to a backend
+ *
+ * @param driver - driver struct.
+ * @param handle - handle to close
+ * @return APR_SUCCESS for success or error status
+ */
+APU_DECLARE(apr_status_t) apr_dbd_close(const apr_dbd_driver_t *driver,
+ apr_dbd_t *handle);
+
+/* apr-function-shaped versions of things */
+
+/** apr_dbd_name: get the name of the driver
+ *
+ * @param driver - the driver
+ * @return - name
+ */
+APU_DECLARE(const char*) apr_dbd_name(const apr_dbd_driver_t *driver);
+
+/** apr_dbd_native_handle: get native database handle of the underlying db
+ *
+ * @param driver - the driver
+ * @param handle - apr_dbd handle
+ * @return - native handle
+ */
+APU_DECLARE(void*) apr_dbd_native_handle(const apr_dbd_driver_t *driver,
+ apr_dbd_t *handle);
+
+/** check_conn: check status of a database connection
+ *
+ * @param driver - the driver
+ * @param pool - working pool
+ * @param handle - the connection to check
+ * @return APR_SUCCESS or error
+ */
+APU_DECLARE(int) apr_dbd_check_conn(const apr_dbd_driver_t *driver, apr_pool_t *pool,
+ apr_dbd_t *handle);
+
+/** apr_dbd_set_dbname: select database name. May be a no-op if not supported.
+ *
+ * @param driver - the driver
+ * @param pool - working pool
+ * @param handle - the connection
+ * @param name - the database to select
+ * @return 0 for success or error code
+ */
+APU_DECLARE(int) apr_dbd_set_dbname(const apr_dbd_driver_t *driver, apr_pool_t *pool,
+ apr_dbd_t *handle, const char *name);
+
+/** apr_dbd_transaction_start: start a transaction. May be a no-op.
+ *
+ * @param driver - the driver
+ * @param pool - a pool to use for error messages (if any).
+ * @param handle - the db connection
+ * @param trans - ptr to a transaction. May be null on entry
+ * @return 0 for success or error code
+ * @remarks Note that transaction modes, set by calling
+ * apr_dbd_transaction_mode_set(), will affect all query/select calls within
+ * a transaction. By default, any error in query/select during a transaction
+ * will cause the transaction to inherit the error code and any further
+ * query/select calls will fail immediately. Put transaction in "ignore
+ * errors" mode to avoid that. Use "rollback" mode to do explicit rollback.
+ */
+APU_DECLARE(int) apr_dbd_transaction_start(const apr_dbd_driver_t *driver,
+ apr_pool_t *pool,
+ apr_dbd_t *handle,
+ apr_dbd_transaction_t **trans);
+
+/** apr_dbd_transaction_end: end a transaction
+ * (commit on success, rollback on error).
+ * May be a no-op.
+ *
+ * @param driver - the driver
+ * @param handle - the db connection
+ * @param trans - the transaction.
+ * @return 0 for success or error code
+ */
+APU_DECLARE(int) apr_dbd_transaction_end(const apr_dbd_driver_t *driver,
+ apr_pool_t *pool,
+ apr_dbd_transaction_t *trans);
+
+#define APR_DBD_TRANSACTION_COMMIT 0x00 /**< commit the transaction */
+#define APR_DBD_TRANSACTION_ROLLBACK 0x01 /**< rollback the transaction */
+#define APR_DBD_TRANSACTION_IGNORE_ERRORS 0x02 /**< ignore transaction errors */
+
+/** apr_dbd_transaction_mode_get: get the mode of transaction
+ *
+ * @param driver - the driver
+ * @param trans - the transaction
+ * @return mode of transaction
+ */
+APU_DECLARE(int) apr_dbd_transaction_mode_get(const apr_dbd_driver_t *driver,
+ apr_dbd_transaction_t *trans);
+
+/** apr_dbd_transaction_mode_set: set the mode of transaction
+ *
+ * @param driver - the driver
+ * @param trans - the transaction
+ * @param mode - new mode of the transaction
+ * @return the mode of transaction in force after the call
+ */
+APU_DECLARE(int) apr_dbd_transaction_mode_set(const apr_dbd_driver_t *driver,
+ apr_dbd_transaction_t *trans,
+ int mode);
+
+/** apr_dbd_query: execute an SQL query that doesn't return a result set
+ *
+ * @param driver - the driver
+ * @param handle - the connection
+ * @param nrows - number of rows affected.
+ * @param statement - the SQL statement to execute
+ * @return 0 for success or error code
+ */
+APU_DECLARE(int) apr_dbd_query(const apr_dbd_driver_t *driver, apr_dbd_t *handle,
+ int *nrows, const char *statement);
+
+/** apr_dbd_select: execute an SQL query that returns a result set
+ *
+ * @param driver - the driver
+ * @param pool - pool to allocate the result set
+ * @param handle - the connection
+ * @param res - pointer to result set pointer. May point to NULL on entry
+ * @param statement - the SQL statement to execute
+ * @param random - 1 to support random access to results (seek any row);
+ * 0 to support only looping through results in order
+ * (async access - faster)
+ * @return 0 for success or error code
+ */
+APU_DECLARE(int) apr_dbd_select(const apr_dbd_driver_t *driver, apr_pool_t *pool,
+ apr_dbd_t *handle, apr_dbd_results_t **res,
+ const char *statement, int random);
+
+/** apr_dbd_num_cols: get the number of columns in a results set
+ *
+ * @param driver - the driver
+ * @param res - result set.
+ * @return number of columns
+ */
+APU_DECLARE(int) apr_dbd_num_cols(const apr_dbd_driver_t *driver,
+ apr_dbd_results_t *res);
+
+/** apr_dbd_num_tuples: get the number of rows in a results set
+ * of a synchronous select
+ *
+ * @param driver - the driver
+ * @param res - result set.
+ * @return number of rows, or -1 if the results are asynchronous
+ */
+APU_DECLARE(int) apr_dbd_num_tuples(const apr_dbd_driver_t *driver,
+ apr_dbd_results_t *res);
+
+/** apr_dbd_get_row: get a row from a result set
+ *
+ * @param driver - the driver
+ * @param pool - pool to allocate the row
+ * @param res - result set pointer
+ * @param row - pointer to row pointer. May point to NULL on entry
+ * @param rownum - row number (counting from 1), or -1 for "next row".
+ * Ignored if random access is not supported.
+ * @return 0 for success, -1 for rownum out of range or data finished
+ */
+APU_DECLARE(int) apr_dbd_get_row(const apr_dbd_driver_t *driver, apr_pool_t *pool,
+ apr_dbd_results_t *res, apr_dbd_row_t **row,
+ int rownum);
+
+/** apr_dbd_get_entry: get an entry from a row
+ *
+ * @param driver - the driver
+ * @param row - row pointer
+ * @param col - entry number
+ * @return value from the row, or NULL if col is out of bounds.
+ */
+APU_DECLARE(const char*) apr_dbd_get_entry(const apr_dbd_driver_t *driver,
+ apr_dbd_row_t *row, int col);
+
+/** apr_dbd_get_name: get an entry name from a result set
+ *
+ * @param driver - the driver
+ * @param res - result set pointer
+ * @param col - entry number
+ * @return name of the entry, or NULL if col is out of bounds.
+ */
+APU_DECLARE(const char*) apr_dbd_get_name(const apr_dbd_driver_t *driver,
+ apr_dbd_results_t *res, int col);
+
+
+/** apr_dbd_error: get current error message (if any)
+ *
+ * @param driver - the driver
+ * @param handle - the connection
+ * @param errnum - error code from operation that returned an error
+ * @return the database current error message, or message for errnum
+ * (implementation-dependent whether errnum is ignored)
+ */
+APU_DECLARE(const char*) apr_dbd_error(const apr_dbd_driver_t *driver,
+ apr_dbd_t *handle, int errnum);
+
+/** apr_dbd_escape: escape a string so it is safe for use in query/select
+ *
+ * @param driver - the driver
+ * @param pool - pool to alloc the result from
+ * @param string - the string to escape
+ * @param handle - the connection
+ * @return the escaped, safe string
+ */
+APU_DECLARE(const char*) apr_dbd_escape(const apr_dbd_driver_t *driver,
+ apr_pool_t *pool, const char *string,
+ apr_dbd_t *handle);
+
+/** apr_dbd_prepare: prepare a statement
+ *
+ * @param driver - the driver
+ * @param pool - pool to alloc the result from
+ * @param handle - the connection
+ * @param query - the SQL query
+ * @param label - A label for the prepared statement.
+ * use NULL for temporary prepared statements
+ * (eg within a Request in httpd)
+ * @param statement - statement to prepare. May point to null on entry.
+ * @return 0 for success or error code
+ * @remarks To specify parameters of the prepared query, use \%s, \%d etc.
+ * (see below for full list) in place of database specific parameter syntax
+ * (e.g. for PostgreSQL, this would be $1, $2, for SQLite3 this would be ?
+ * etc.). For instance: "SELECT name FROM customers WHERE name=%s" would be
+ * a query that this function understands.
+ * @remarks Here is the full list of format specifiers that this function
+ * understands and what they map to in SQL: \%hhd (TINY INT), \%hhu (UNSIGNED
+ * TINY INT), \%hd (SHORT), \%hu (UNSIGNED SHORT), \%d (INT), \%u (UNSIGNED
+ * INT), \%ld (LONG), \%lu (UNSIGNED LONG), \%lld (LONG LONG), \%llu
+ * (UNSIGNED LONG LONG), \%f (FLOAT, REAL), \%lf (DOUBLE PRECISION), \%s
+ * (VARCHAR), \%pDt (TEXT), \%pDi (TIME), \%pDd (DATE), \%pDa (DATETIME),
+ * \%pDs (TIMESTAMP), \%pDz (TIMESTAMP WITH TIME ZONE), \%pDb (BLOB), \%pDc
+ * (CLOB) and \%pDn (NULL). Not all databases have support for all these
+ * types, so the underlying driver will attempt the "best match" where
+ * possible. A \% followed by any letter not in the above list will be
+ * interpreted as VARCHAR (i.e. \%s).
+ */
+APU_DECLARE(int) apr_dbd_prepare(const apr_dbd_driver_t *driver, apr_pool_t *pool,
+ apr_dbd_t *handle, const char *query,
+ const char *label,
+ apr_dbd_prepared_t **statement);
+
+
+/** apr_dbd_pquery: query using a prepared statement + args
+ *
+ * @param driver - the driver
+ * @param pool - working pool
+ * @param handle - the connection
+ * @param nrows - number of rows affected.
+ * @param statement - the prepared statement to execute
+ * @param nargs - ignored (for backward compatibility only)
+ * @param args - args to prepared statement
+ * @return 0 for success or error code
+ */
+APU_DECLARE(int) apr_dbd_pquery(const apr_dbd_driver_t *driver, apr_pool_t *pool,
+ apr_dbd_t *handle, int *nrows,
+ apr_dbd_prepared_t *statement, int nargs,
+ const char **args);
+
+/** apr_dbd_pselect: select using a prepared statement + args
+ *
+ * @param driver - the driver
+ * @param pool - working pool
+ * @param handle - the connection
+ * @param res - pointer to query results. May point to NULL on entry
+ * @param statement - the prepared statement to execute
+ * @param random - Whether to support random-access to results
+ * @param nargs - ignored (for backward compatibility only)
+ * @param args - args to prepared statement
+ * @return 0 for success or error code
+ */
+APU_DECLARE(int) apr_dbd_pselect(const apr_dbd_driver_t *driver, apr_pool_t *pool,
+ apr_dbd_t *handle, apr_dbd_results_t **res,
+ apr_dbd_prepared_t *statement, int random,
+ int nargs, const char **args);
+
+/** apr_dbd_pvquery: query using a prepared statement + args
+ *
+ * @param driver - the driver
+ * @param pool - working pool
+ * @param handle - the connection
+ * @param nrows - number of rows affected.
+ * @param statement - the prepared statement to execute
+ * @param ... - varargs list
+ * @return 0 for success or error code
+ */
+APU_DECLARE_NONSTD(int) apr_dbd_pvquery(const apr_dbd_driver_t *driver,
+ apr_pool_t *pool,
+ apr_dbd_t *handle, int *nrows,
+ apr_dbd_prepared_t *statement, ...);
+
+/** apr_dbd_pvselect: select using a prepared statement + args
+ *
+ * @param driver - the driver
+ * @param pool - working pool
+ * @param handle - the connection
+ * @param res - pointer to query results. May point to NULL on entry
+ * @param statement - the prepared statement to execute
+ * @param random - Whether to support random-access to results
+ * @param ... - varargs list
+ * @return 0 for success or error code
+ */
+APU_DECLARE_NONSTD(int) apr_dbd_pvselect(const apr_dbd_driver_t *driver,
+ apr_pool_t *pool, apr_dbd_t *handle,
+ apr_dbd_results_t **res,
+ apr_dbd_prepared_t *statement,
+ int random, ...);
+
+/** apr_dbd_pbquery: query using a prepared statement + binary args
+ *
+ * @param driver - the driver
+ * @param pool - working pool
+ * @param handle - the connection
+ * @param nrows - number of rows affected.
+ * @param statement - the prepared statement to execute
+ * @param args - binary args to prepared statement
+ * @return 0 for success or error code
+ */
+APU_DECLARE(int) apr_dbd_pbquery(const apr_dbd_driver_t *driver,
+ apr_pool_t *pool, apr_dbd_t *handle,
+ int *nrows, apr_dbd_prepared_t *statement,
+ const void **args);
+
+/** apr_dbd_pbselect: select using a prepared statement + binary args
+ *
+ * @param driver - the driver
+ * @param pool - working pool
+ * @param handle - the connection
+ * @param res - pointer to query results. May point to NULL on entry
+ * @param statement - the prepared statement to execute
+ * @param random - Whether to support random-access to results
+ * @param args - binary args to prepared statement
+ * @return 0 for success or error code
+ */
+APU_DECLARE(int) apr_dbd_pbselect(const apr_dbd_driver_t *driver,
+ apr_pool_t *pool,
+ apr_dbd_t *handle, apr_dbd_results_t **res,
+ apr_dbd_prepared_t *statement, int random,
+ const void **args);
+
+/** apr_dbd_pvbquery: query using a prepared statement + binary args
+ *
+ * @param driver - the driver
+ * @param pool - working pool
+ * @param handle - the connection
+ * @param nrows - number of rows affected.
+ * @param statement - the prepared statement to execute
+ * @param ... - varargs list of binary args
+ * @return 0 for success or error code
+ */
+APU_DECLARE_NONSTD(int) apr_dbd_pvbquery(const apr_dbd_driver_t *driver,
+ apr_pool_t *pool,
+ apr_dbd_t *handle, int *nrows,
+ apr_dbd_prepared_t *statement, ...);
+
+/** apr_dbd_pvbselect: select using a prepared statement + binary args
+ *
+ * @param driver - the driver
+ * @param pool - working pool
+ * @param handle - the connection
+ * @param res - pointer to query results. May point to NULL on entry
+ * @param statement - the prepared statement to execute
+ * @param random - Whether to support random-access to results
+ * @param ... - varargs list of binary args
+ * @return 0 for success or error code
+ */
+APU_DECLARE_NONSTD(int) apr_dbd_pvbselect(const apr_dbd_driver_t *driver,
+ apr_pool_t *pool, apr_dbd_t *handle,
+ apr_dbd_results_t **res,
+ apr_dbd_prepared_t *statement,
+ int random, ...);
+
+/** apr_dbd_datum_get: get a binary entry from a row
+ *
+ * @param driver - the driver
+ * @param row - row pointer
+ * @param col - entry number
+ * @param type - type of data to get
+ * @param data - pointer to data, allocated by the caller
+ * @return APR_SUCCESS on success, APR_ENOENT if data is NULL or APR_EGENERAL
+ */
+APU_DECLARE(apr_status_t) apr_dbd_datum_get(const apr_dbd_driver_t *driver,
+ apr_dbd_row_t *row, int col,
+ apr_dbd_type_e type, void *data);
+
+/** @} */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/contrib/apr-util/include/apr_dbm.h b/contrib/apr-util/include/apr_dbm.h
new file mode 100644
index 000000000000..ad1b4f391eda
--- /dev/null
+++ b/contrib/apr-util/include/apr_dbm.h
@@ -0,0 +1,227 @@
+/* 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.
+ */
+
+#ifndef APR_DBM_H
+#define APR_DBM_H
+
+#include "apu.h"
+#include "apr.h"
+#include "apr_errno.h"
+#include "apr_pools.h"
+#include "apr_file_info.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @file apr_dbm.h
+ * @brief APR-UTIL DBM library
+ */
+/**
+ * @defgroup APR_Util_DBM DBM routines
+ * @ingroup APR_Util
+ * @{
+ */
+/**
+ * Structure for referencing a dbm
+ */
+typedef struct apr_dbm_t apr_dbm_t;
+
+/**
+ * Structure for referencing the datum record within a dbm
+ */
+typedef struct
+{
+ /** pointer to the 'data' to retrieve/store in the DBM */
+ char *dptr;
+ /** size of the 'data' to retrieve/store in the DBM */
+ apr_size_t dsize;
+} apr_datum_t;
+
+/* modes to open the DB */
+#define APR_DBM_READONLY 1 /**< open for read-only access */
+#define APR_DBM_READWRITE 2 /**< open for read-write access */
+#define APR_DBM_RWCREATE 3 /**< open for r/w, create if needed */
+#define APR_DBM_RWTRUNC 4 /**< open for r/w, truncating an existing
+ DB if present */
+/**
+ * Open a dbm file by file name and type of DBM
+ * @param dbm The newly opened database
+ * @param type The type of the DBM (not all may be available at run time)
+ * <pre>
+ * db for Berkeley DB files
+ * gdbm for GDBM files
+ * ndbm for NDBM files
+ * sdbm for SDBM files (always available)
+ * default for the default DBM type
+ * </pre>
+ * @param name The dbm file name to open
+ * @param mode The flag value
+ * <PRE>
+ * APR_DBM_READONLY open for read-only access
+ * APR_DBM_READWRITE open for read-write access
+ * APR_DBM_RWCREATE open for r/w, create if needed
+ * APR_DBM_RWTRUNC open for r/w, truncate if already there
+ * </PRE>
+ * @param perm Permissions to apply to if created
+ * @param cntxt The pool to use when creating the dbm
+ * @remark The dbm name may not be a true file name, as many dbm packages
+ * append suffixes for seperate data and index files.
+ * @bug In apr-util 0.9 and 1.x, the type arg was case insensitive. This
+ * was highly inefficient, and as of 2.x the dbm name must be provided in
+ * the correct case (lower case for all bundled providers)
+ */
+
+APU_DECLARE(apr_status_t) apr_dbm_open_ex(apr_dbm_t **dbm, const char* type,
+ const char *name,
+ apr_int32_t mode, apr_fileperms_t perm,
+ apr_pool_t *cntxt);
+
+
+/**
+ * Open a dbm file by file name
+ * @param dbm The newly opened database
+ * @param name The dbm file name to open
+ * @param mode The flag value
+ * <PRE>
+ * APR_DBM_READONLY open for read-only access
+ * APR_DBM_READWRITE open for read-write access
+ * APR_DBM_RWCREATE open for r/w, create if needed
+ * APR_DBM_RWTRUNC open for r/w, truncate if already there
+ * </PRE>
+ * @param perm Permissions to apply to if created
+ * @param cntxt The pool to use when creating the dbm
+ * @remark The dbm name may not be a true file name, as many dbm packages
+ * append suffixes for seperate data and index files.
+ */
+APU_DECLARE(apr_status_t) apr_dbm_open(apr_dbm_t **dbm, const char *name,
+ apr_int32_t mode, apr_fileperms_t perm,
+ apr_pool_t *cntxt);
+
+/**
+ * Close a dbm file previously opened by apr_dbm_open
+ * @param dbm The database to close
+ */
+APU_DECLARE(void) apr_dbm_close(apr_dbm_t *dbm);
+
+/**
+ * Fetch a dbm record value by key
+ * @param dbm The database
+ * @param key The key datum to find this record
+ * @param pvalue The value datum retrieved for this record
+ */
+APU_DECLARE(apr_status_t) apr_dbm_fetch(apr_dbm_t *dbm, apr_datum_t key,
+ apr_datum_t *pvalue);
+/**
+ * Store a dbm record value by key
+ * @param dbm The database
+ * @param key The key datum to store this record by
+ * @param value The value datum to store in this record
+ */
+APU_DECLARE(apr_status_t) apr_dbm_store(apr_dbm_t *dbm, apr_datum_t key,
+ apr_datum_t value);
+
+/**
+ * Delete a dbm record value by key
+ * @param dbm The database
+ * @param key The key datum of the record to delete
+ * @remark It is not an error to delete a non-existent record.
+ */
+APU_DECLARE(apr_status_t) apr_dbm_delete(apr_dbm_t *dbm, apr_datum_t key);
+
+/**
+ * Search for a key within the dbm
+ * @param dbm The database
+ * @param key The datum describing a key to test
+ */
+APU_DECLARE(int) apr_dbm_exists(apr_dbm_t *dbm, apr_datum_t key);
+
+/**
+ * Retrieve the first record key from a dbm
+ * @param dbm The database
+ * @param pkey The key datum of the first record
+ */
+APU_DECLARE(apr_status_t) apr_dbm_firstkey(apr_dbm_t *dbm, apr_datum_t *pkey);
+
+/**
+ * Retrieve the next record key from a dbm
+ * @param dbm The database
+ * @param pkey The key datum of the next record
+ */
+APU_DECLARE(apr_status_t) apr_dbm_nextkey(apr_dbm_t *dbm, apr_datum_t *pkey);
+
+/**
+ * Proactively toss any memory associated with the apr_datum_t.
+ * @param dbm The database
+ * @param data The datum to free.
+ */
+APU_DECLARE(void) apr_dbm_freedatum(apr_dbm_t *dbm, apr_datum_t data);
+
+/**
+ * Report more information when an apr_dbm function fails.
+ * @param dbm The database
+ * @param errcode A DBM-specific value for the error (for logging). If this
+ * isn't needed, it may be NULL.
+ * @param errbuf Location to store the error text
+ * @param errbufsize The size of the provided buffer
+ * @return The errbuf parameter, for convenience.
+ */
+APU_DECLARE(char *) apr_dbm_geterror(apr_dbm_t *dbm, int *errcode,
+ char *errbuf, apr_size_t errbufsize);
+/**
+ * If the specified file/path were passed to apr_dbm_open(), return the
+ * actual file/path names which would be (created and) used. At most, two
+ * files may be used; used2 may be NULL if only one file is used.
+ * @param pool The pool for allocating used1 and used2.
+ * @param type The type of DBM you require info on @see apr_dbm_open_ex
+ * @param pathname The path name to generate used-names from.
+ * @param used1 The first pathname used by the apr_dbm implementation.
+ * @param used2 The second pathname used by apr_dbm. If only one file is
+ * used by the specific implementation, this will be set to NULL.
+ * @return An error if the specified type is invalid.
+ * @remark The dbm file(s) don't need to exist. This function only manipulates
+ * the pathnames.
+ */
+APU_DECLARE(apr_status_t) apr_dbm_get_usednames_ex(apr_pool_t *pool,
+ const char *type,
+ const char *pathname,
+ const char **used1,
+ const char **used2);
+
+/**
+ * If the specified file/path were passed to apr_dbm_open(), return the
+ * actual file/path names which would be (created and) used. At most, two
+ * files may be used; used2 may be NULL if only one file is used.
+ * @param pool The pool for allocating used1 and used2.
+ * @param pathname The path name to generate used-names from.
+ * @param used1 The first pathname used by the apr_dbm implementation.
+ * @param used2 The second pathname used by apr_dbm. If only one file is
+ * used by the specific implementation, this will be set to NULL.
+ * @remark The dbm file(s) don't need to exist. This function only manipulates
+ * the pathnames.
+ */
+APU_DECLARE(void) apr_dbm_get_usednames(apr_pool_t *pool,
+ const char *pathname,
+ const char **used1,
+ const char **used2);
+
+/** @} */
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !APR_DBM_H */
diff --git a/contrib/apr-util/include/apr_hooks.h b/contrib/apr-util/include/apr_hooks.h
new file mode 100644
index 000000000000..eee16e3c63e5
--- /dev/null
+++ b/contrib/apr-util/include/apr_hooks.h
@@ -0,0 +1,358 @@
+/* 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.
+ */
+
+#ifndef APR_HOOKS_H
+#define APR_HOOKS_H
+
+#include "apu.h"
+/* For apr_array_header_t */
+#include "apr_tables.h"
+
+/**
+ * @file apr_hooks.h
+ * @brief Apache hook functions
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/**
+ * @defgroup APR_Util_Hook Hook Functions
+ * @ingroup APR_Util
+ * @{
+ */
+
+/**
+ * @defgroup apr_hook_probes Hook probe capability
+ * APR hooks provide a trace probe capability for capturing
+ * the flow of control and return values with hooks.
+ *
+ * In order to use this facility, the application must define
+ * the symbol APR_HOOK_PROBES_ENABLED and the four APR_HOOK_PROBE_
+ * macros described below before including apr_hooks.h in files
+ * that use the APR_IMPLEMENT_EXTERNAL_HOOK_* macros.
+ *
+ * This probe facility is not provided for APR optional hooks.
+ * @{
+ */
+
+#ifdef APR_HOOK_PROBES_ENABLED
+#define APR_HOOK_INT_DCL_UD void *ud = NULL
+#else
+/** internal implementation detail to avoid the ud declaration when
+ * hook probes are not used
+ */
+#define APR_HOOK_INT_DCL_UD
+/**
+ * User-defined hook probe macro that is invoked when the hook
+ * is run, before calling any hook functions.
+ * @param ud A void * user data field that should be filled in by
+ * this macro, and will be provided to the other hook probe macros.
+ * @param ns The namespace prefix of the hook functions
+ * @param name The name of the hook
+ * @param args The argument list to the hook functions, with enclosing
+ * parens.
+ */
+#define APR_HOOK_PROBE_ENTRY(ud,ns,name,args)
+/**
+ * User-defined hook probe macro that is invoked after the hook
+ * has run.
+ * @param ud A void * user data field that was filled in by the user-
+ * provided APR_HOOK_PROBE_ENTRY().
+ * @param ns The namespace prefix of the hook functions
+ * @param name The name of the hook
+ * @param rv The return value of the hook, or 0 if the hook is void.
+ * @param args The argument list to the hook functions, with enclosing
+ * parens.
+ */
+#define APR_HOOK_PROBE_RETURN(ud,ns,name,rv,args)
+/**
+ * User-defined hook probe macro that is invoked before calling a
+ * hook function.
+ * @param ud A void * user data field that was filled in by the user-
+ * provided APR_HOOK_PROBE_ENTRY().
+ * @param ns The namespace prefix of the hook functions
+ * @param name The name of the hook
+ * @param src The value of apr_hook_debug_current at the time the function
+ * was hooked (usually the source file implementing the hook function).
+ * @param args The argument list to the hook functions, with enclosing
+ * parens.
+ */
+#define APR_HOOK_PROBE_INVOKE(ud,ns,name,src,args)
+/**
+ * User-defined hook probe macro that is invoked after calling a
+ * hook function.
+ * @param ud A void * user data field that was filled in by the user-
+ * provided APR_HOOK_PROBE_ENTRY().
+ * @param ns The namespace prefix of the hook functions
+ * @param name The name of the hook
+ * @param src The value of apr_hook_debug_current at the time the function
+ * was hooked (usually the source file implementing the hook function).
+ * @param rv The return value of the hook function, or 0 if the hook is void.
+ * @param args The argument list to the hook functions, with enclosing
+ * parens.
+ */
+#define APR_HOOK_PROBE_COMPLETE(ud,ns,name,src,rv,args)
+#endif
+
+/** @} */
+
+/** macro to return the prototype of the hook function */
+#define APR_IMPLEMENT_HOOK_GET_PROTO(ns,link,name) \
+link##_DECLARE(apr_array_header_t *) ns##_hook_get_##name(void)
+
+/** macro to declare the hook correctly */
+#define APR_DECLARE_EXTERNAL_HOOK(ns,link,ret,name,args) \
+typedef ret ns##_HOOK_##name##_t args; \
+link##_DECLARE(void) ns##_hook_##name(ns##_HOOK_##name##_t *pf, \
+ const char * const *aszPre, \
+ const char * const *aszSucc, int nOrder); \
+link##_DECLARE(ret) ns##_run_##name args; \
+APR_IMPLEMENT_HOOK_GET_PROTO(ns,link,name); \
+typedef struct ns##_LINK_##name##_t \
+ { \
+ ns##_HOOK_##name##_t *pFunc; \
+ const char *szName; \
+ const char * const *aszPredecessors; \
+ const char * const *aszSuccessors; \
+ int nOrder; \
+ } ns##_LINK_##name##_t;
+
+/** macro to declare the hook structure */
+#define APR_HOOK_STRUCT(members) \
+static struct { members } _hooks;
+
+/** macro to link the hook structure */
+#define APR_HOOK_LINK(name) \
+ apr_array_header_t *link_##name;
+
+/** macro to implement the hook */
+#define APR_IMPLEMENT_EXTERNAL_HOOK_BASE(ns,link,name) \
+link##_DECLARE(void) ns##_hook_##name(ns##_HOOK_##name##_t *pf,const char * const *aszPre, \
+ const char * const *aszSucc,int nOrder) \
+ { \
+ ns##_LINK_##name##_t *pHook; \
+ if(!_hooks.link_##name) \
+ { \
+ _hooks.link_##name=apr_array_make(apr_hook_global_pool,1,sizeof(ns##_LINK_##name##_t)); \
+ apr_hook_sort_register(#name,&_hooks.link_##name); \
+ } \
+ pHook=apr_array_push(_hooks.link_##name); \
+ pHook->pFunc=pf; \
+ pHook->aszPredecessors=aszPre; \
+ pHook->aszSuccessors=aszSucc; \
+ pHook->nOrder=nOrder; \
+ pHook->szName=apr_hook_debug_current; \
+ if(apr_hook_debug_enabled) \
+ apr_hook_debug_show(#name,aszPre,aszSucc); \
+ } \
+ APR_IMPLEMENT_HOOK_GET_PROTO(ns,link,name) \
+ { \
+ return _hooks.link_##name; \
+ }
+
+/**
+ * Implement a hook that has no return code, and therefore runs all of the
+ * registered functions
+ * @param ns The namespace prefix of the hook functions
+ * @param link The linkage declaration prefix of the hook
+ * @param name The name of the hook
+ * @param args_decl The declaration of the arguments for the hook
+ * @param args_use The names for the arguments for the hook
+ * @note The link prefix FOO corresponds to FOO_DECLARE() macros, which
+ * provide export linkage from the module that IMPLEMENTs the hook, and
+ * import linkage from external modules that link to the hook's module.
+ */
+#define APR_IMPLEMENT_EXTERNAL_HOOK_VOID(ns,link,name,args_decl,args_use) \
+APR_IMPLEMENT_EXTERNAL_HOOK_BASE(ns,link,name) \
+link##_DECLARE(void) ns##_run_##name args_decl \
+ { \
+ ns##_LINK_##name##_t *pHook; \
+ int n; \
+ APR_HOOK_INT_DCL_UD; \
+\
+ APR_HOOK_PROBE_ENTRY(ud, ns, name, args_use); \
+\
+ if(_hooks.link_##name) \
+ { \
+ pHook=(ns##_LINK_##name##_t *)_hooks.link_##name->elts; \
+ for(n=0 ; n < _hooks.link_##name->nelts ; ++n) \
+ { \
+ APR_HOOK_PROBE_INVOKE(ud, ns, name, (char *)pHook[n].szName, args_use); \
+ pHook[n].pFunc args_use; \
+ APR_HOOK_PROBE_COMPLETE(ud, ns, name, (char *)pHook[n].szName, 0, args_use); \
+ } \
+ } \
+\
+ APR_HOOK_PROBE_RETURN(ud, ns, name, 0, args_use); \
+\
+ }
+
+/* FIXME: note that this returns ok when nothing is run. I suspect it should
+ really return decline, but that breaks Apache currently - Ben
+*/
+/**
+ * Implement a hook that runs until one of the functions returns something
+ * other than OK or DECLINE
+ * @param ns The namespace prefix of the hook functions
+ * @param link The linkage declaration prefix of the hook
+ * @param ret Type to return
+ * @param name The name of the hook
+ * @param args_decl The declaration of the arguments for the hook
+ * @param args_use The names for the arguments for the hook
+ * @param ok Success value
+ * @param decline Decline value
+ * @note The link prefix FOO corresponds to FOO_DECLARE() macros, which
+ * provide export linkage from the module that IMPLEMENTs the hook, and
+ * import linkage from external modules that link to the hook's module.
+ */
+#define APR_IMPLEMENT_EXTERNAL_HOOK_RUN_ALL(ns,link,ret,name,args_decl,args_use,ok,decline) \
+APR_IMPLEMENT_EXTERNAL_HOOK_BASE(ns,link,name) \
+link##_DECLARE(ret) ns##_run_##name args_decl \
+ { \
+ ns##_LINK_##name##_t *pHook; \
+ int n; \
+ ret rv = ok; \
+ APR_HOOK_INT_DCL_UD; \
+\
+ APR_HOOK_PROBE_ENTRY(ud, ns, name, args_use); \
+\
+ if(_hooks.link_##name) \
+ { \
+ pHook=(ns##_LINK_##name##_t *)_hooks.link_##name->elts; \
+ for(n=0 ; n < _hooks.link_##name->nelts ; ++n) \
+ { \
+ APR_HOOK_PROBE_INVOKE(ud, ns, name, (char *)pHook[n].szName, args_use); \
+ rv=pHook[n].pFunc args_use; \
+ APR_HOOK_PROBE_COMPLETE(ud, ns, name, (char *)pHook[n].szName, rv, args_use); \
+ if(rv != ok && rv != decline) \
+ break; \
+ rv = ok; \
+ } \
+ } \
+\
+ APR_HOOK_PROBE_RETURN(ud, ns, name, rv, args_use); \
+\
+ return rv; \
+ }
+
+
+/**
+ * Implement a hook that runs until the first function returns something
+ * other than the value of decline
+ * @param ns The namespace prefix of the hook functions
+ * @param link The linkage declaration prefix of the hook
+ * @param name The name of the hook
+ * @param ret Type to return
+ * @param args_decl The declaration of the arguments for the hook
+ * @param args_use The names for the arguments for the hook
+ * @param decline Decline value
+ * @note The link prefix FOO corresponds to FOO_DECLARE() macros, which
+ * provide export linkage from the module that IMPLEMENTs the hook, and
+ * import linkage from external modules that link to the hook's module.
+ */
+#define APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(ns,link,ret,name,args_decl,args_use,decline) \
+APR_IMPLEMENT_EXTERNAL_HOOK_BASE(ns,link,name) \
+link##_DECLARE(ret) ns##_run_##name args_decl \
+ { \
+ ns##_LINK_##name##_t *pHook; \
+ int n; \
+ ret rv = decline; \
+ APR_HOOK_INT_DCL_UD; \
+\
+ APR_HOOK_PROBE_ENTRY(ud, ns, name, args_use); \
+\
+ if(_hooks.link_##name) \
+ { \
+ pHook=(ns##_LINK_##name##_t *)_hooks.link_##name->elts; \
+ for(n=0 ; n < _hooks.link_##name->nelts ; ++n) \
+ { \
+ APR_HOOK_PROBE_INVOKE(ud, ns, name, (char *)pHook[n].szName, args_use); \
+ rv=pHook[n].pFunc args_use; \
+ APR_HOOK_PROBE_COMPLETE(ud, ns, name, (char *)pHook[n].szName, rv, args_use); \
+\
+ if(rv != decline) \
+ break; \
+ } \
+ } \
+\
+ APR_HOOK_PROBE_RETURN(ud, ns, name, rv, args_use); \
+\
+ return rv; \
+ }
+
+ /* Hook orderings */
+/** run this hook first, before ANYTHING */
+#define APR_HOOK_REALLY_FIRST (-10)
+/** run this hook first */
+#define APR_HOOK_FIRST 0
+/** run this hook somewhere */
+#define APR_HOOK_MIDDLE 10
+/** run this hook after every other hook which is defined*/
+#define APR_HOOK_LAST 20
+/** run this hook last, after EVERYTHING */
+#define APR_HOOK_REALLY_LAST 30
+
+/**
+ * The global pool used to allocate any memory needed by the hooks.
+ */
+APU_DECLARE_DATA extern apr_pool_t *apr_hook_global_pool;
+
+/**
+ * A global variable to determine if debugging information about the
+ * hooks functions should be printed.
+ */
+APU_DECLARE_DATA extern int apr_hook_debug_enabled;
+
+/**
+ * The name of the module that is currently registering a function.
+ */
+APU_DECLARE_DATA extern const char *apr_hook_debug_current;
+
+/**
+ * Register a hook function to be sorted.
+ * @param szHookName The name of the Hook the function is registered for
+ * @param aHooks The array which stores all of the functions for this hook
+ */
+APU_DECLARE(void) apr_hook_sort_register(const char *szHookName,
+ apr_array_header_t **aHooks);
+/**
+ * Sort all of the registered functions for a given hook.
+ */
+APU_DECLARE(void) apr_hook_sort_all(void);
+
+/**
+ * Print all of the information about the current hook. This is used for
+ * debugging purposes.
+ * @param szName The name of the hook
+ * @param aszPre All of the functions in the predecessor array
+ * @param aszSucc All of the functions in the successor array
+ */
+APU_DECLARE(void) apr_hook_debug_show(const char *szName,
+ const char * const *aszPre,
+ const char * const *aszSucc);
+
+/**
+ * Remove all currently registered functions.
+ */
+APU_DECLARE(void) apr_hook_deregister_all(void);
+
+/** @} */
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* APR_HOOKS_H */
diff --git a/contrib/apr-util/include/apr_ldap.h.in b/contrib/apr-util/include/apr_ldap.h.in
new file mode 100644
index 000000000000..e30d34480662
--- /dev/null
+++ b/contrib/apr-util/include/apr_ldap.h.in
@@ -0,0 +1,197 @@
+/* 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.
+ */
+
+/*
+ * apr_ldap.h is generated from apr_ldap.h.in by configure -- do not edit apr_ldap.h
+ */
+/**
+ * @file apr_ldap.h
+ * @brief APR-UTIL LDAP
+ */
+#ifndef APU_LDAP_H
+#define APU_LDAP_H
+
+/**
+ * @defgroup APR_Util_LDAP LDAP
+ * @ingroup APR_Util
+ * @{
+ */
+
+/* this will be defined if LDAP support was compiled into apr-util */
+#define APR_HAS_LDAP @apu_has_ldap@
+
+/* identify the LDAP toolkit used */
+#define APR_HAS_NETSCAPE_LDAPSDK @apu_has_ldap_netscape@
+#define APR_HAS_SOLARIS_LDAPSDK @apu_has_ldap_solaris@
+#define APR_HAS_NOVELL_LDAPSDK @apu_has_ldap_novell@
+#define APR_HAS_MOZILLA_LDAPSDK @apu_has_ldap_mozilla@
+#define APR_HAS_OPENLDAP_LDAPSDK @apu_has_ldap_openldap@
+#define APR_HAS_MICROSOFT_LDAPSDK @apu_has_ldap_microsoft@
+#define APR_HAS_TIVOLI_LDAPSDK @apu_has_ldap_tivoli@
+#define APR_HAS_ZOS_LDAPSDK @apu_has_ldap_zos@
+#define APR_HAS_OTHER_LDAPSDK @apu_has_ldap_other@
+
+
+/*
+ * Handle the case when LDAP is enabled
+ */
+#if APR_HAS_LDAP
+
+/*
+ * The following #defines are DEPRECATED and should not be used for
+ * anything. They remain to maintain binary compatibility.
+ * The original code defined the OPENLDAP SDK as present regardless
+ * of what really was there, which was way bogus. In addition, the
+ * apr_ldap_url_parse*() functions have been rewritten specifically for
+ * APR, so the APR_HAS_LDAP_URL_PARSE macro is forced to zero.
+ */
+#if APR_HAS_TIVOLI_LDAPSDK
+#define APR_HAS_LDAP_SSL 0
+#else
+#define APR_HAS_LDAP_SSL 1
+#endif
+#define APR_HAS_LDAP_URL_PARSE 0
+
+#if APR_HAS_OPENLDAP_LDAPSDK && !defined(LDAP_DEPRECATED)
+/* Ensure that the "deprecated" interfaces are still exposed
+ * with OpenLDAP >= 2.3; these were exposed by default in earlier
+ * releases. */
+#define LDAP_DEPRECATED 1
+#endif
+
+/*
+ * Include the standard LDAP header files.
+ */
+
+@lber_h@
+@ldap_h@
+@ldap_ssl_h@
+
+
+/*
+ * Detected standard functions
+ */
+#define APR_HAS_LDAPSSL_CLIENT_INIT @apu_has_ldapssl_client_init@
+#define APR_HAS_LDAPSSL_CLIENT_DEINIT @apu_has_ldapssl_client_deinit@
+#define APR_HAS_LDAPSSL_ADD_TRUSTED_CERT @apu_has_ldapssl_add_trusted_cert@
+#define APR_HAS_LDAP_START_TLS_S @apu_has_ldap_start_tls_s@
+#define APR_HAS_LDAP_SSLINIT @apu_has_ldap_sslinit@
+#define APR_HAS_LDAPSSL_INIT @apu_has_ldapssl_init@
+#define APR_HAS_LDAPSSL_INSTALL_ROUTINES @apu_has_ldapssl_install_routines@
+
+/*
+ * Make sure the secure LDAP port is defined
+ */
+#ifndef LDAPS_PORT
+#define LDAPS_PORT 636 /* ldaps:/// default LDAP over TLS port */
+#endif
+
+/*
+ * For ldap function calls that input a size limit on the number of returned elements
+ * Some SDKs do not have the define for LDAP_DEFAULT_LIMIT (-1) or LDAP_NO_LIMIT (0)
+ * LDAP_DEFAULT_LIMIT is preferred as it allows inheritance from whatever the SDK
+ * or process is configured for.
+ */
+#ifdef LDAP_DEFAULT_LIMIT
+#define APR_LDAP_SIZELIMIT LDAP_DEFAULT_LIMIT
+#else
+#ifdef LDAP_NO_LIMIT
+#define APR_LDAP_SIZELIMIT LDAP_NO_LIMIT
+#endif
+#endif
+
+#ifndef APR_LDAP_SIZELIMIT
+#define APR_LDAP_SIZELIMIT 0 /* equivalent to LDAP_NO_LIMIT, and what goes on the wire */
+#endif
+
+/*
+ * z/OS is missing some defines
+ */
+#ifndef LDAP_VERSION_MAX
+#define LDAP_VERSION_MAX LDAP_VERSION
+#endif
+#if APR_HAS_ZOS_LDAPSDK
+#define LDAP_VENDOR_NAME "IBM z/OS"
+#endif
+
+/* Note: Macros defining const casting has been removed in APR v1.0,
+ * pending real support for LDAP v2.0 toolkits.
+ *
+ * In the mean time, please use an LDAP v3.0 toolkit.
+ */
+#if LDAP_VERSION_MAX <= 2
+#error Support for LDAP v2.0 toolkits has been removed from apr-util. Please use an LDAP v3.0 toolkit.
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * This structure allows the C LDAP API error codes to be returned
+ * along with plain text error messages that explain to us mere mortals
+ * what really happened.
+ */
+typedef struct apr_ldap_err_t {
+ const char *reason;
+ const char *msg;
+ int rc;
+} apr_ldap_err_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+/* The MS SDK returns LDAP_UNAVAILABLE when the backend has closed the connection
+ * between LDAP calls. Protect with APR_HAS_MICROSOFT_LDAPSDK in case someone
+ * manually chooses another SDK on Windows
+ */
+#if APR_HAS_MICROSOFT_LDAPSDK
+#define APR_LDAP_IS_SERVER_DOWN(s) ((s) == LDAP_SERVER_DOWN \
+ || (s) == LDAP_UNAVAILABLE)
+#else
+#define APR_LDAP_IS_SERVER_DOWN(s) ((s) == LDAP_SERVER_DOWN)
+#endif
+
+/* These symbols are not actually exported in a DSO build, but mapped into
+ * a private exported function array for apr_ldap_stub to bind dynamically.
+ * Rename them appropriately to protect the global namespace.
+ */
+#ifdef APU_DSO_LDAP_BUILD
+
+#define apr_ldap_info apr__ldap_info
+#define apr_ldap_init apr__ldap_init
+#define apr_ldap_ssl_init apr__ldap_ssl_init
+#define apr_ldap_ssl_deinit apr__ldap_ssl_deinit
+#define apr_ldap_get_option apr__ldap_get_option
+#define apr_ldap_set_option apr__ldap_set_option
+#define apr_ldap_rebind_init apr__ldap_rebind_init
+#define apr_ldap_rebind_add apr__ldap_rebind_add
+#define apr_ldap_rebind_remove apr__ldap_rebind_remove
+
+#define APU_DECLARE_LDAP(type) type
+#else
+#define APU_DECLARE_LDAP(type) APU_DECLARE(type)
+#endif
+
+#include "apr_ldap_url.h"
+#include "apr_ldap_init.h"
+#include "apr_ldap_option.h"
+#include "apr_ldap_rebind.h"
+
+#endif /* APR_HAS_LDAP */
+/** @} */
+#endif /* APU_LDAP_H */
diff --git a/contrib/apr-util/include/apr_ldap.hnw b/contrib/apr-util/include/apr_ldap.hnw
new file mode 100644
index 000000000000..c93014ae6d47
--- /dev/null
+++ b/contrib/apr-util/include/apr_ldap.hnw
@@ -0,0 +1,158 @@
+/* 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.
+ */
+
+/*
+ * apr_ldap.h is generated from apr_ldap.h.in by configure -- do not edit apr_ldap.h
+ */
+/**
+ * @file apr_ldap.h
+ * @brief APR-UTIL LDAP
+ */
+#ifndef APU_LDAP_H
+#define APU_LDAP_H
+
+/**
+ * @defgroup APR_Util_LDAP LDAP
+ * @ingroup APR_Util
+ * @{
+ */
+
+/* this will be defined if LDAP support was compiled into apr-util */
+#define APR_HAS_LDAP 1
+
+/* identify the LDAP toolkit used */
+#define APR_HAS_NETSCAPE_LDAPSDK 0
+#define APR_HAS_SOLARIS_LDAPSDK 0
+#define APR_HAS_NOVELL_LDAPSDK 1
+#define APR_HAS_MOZILLA_LDAPSDK 0
+#define APR_HAS_OPENLDAP_LDAPSDK 0
+#define APR_HAS_MICROSOFT_LDAPSDK 0
+#define APR_HAS_OTHER_LDAPSDK 0
+
+
+/*
+ * Handle the case when LDAP is enabled
+ */
+#if APR_HAS_LDAP
+
+/*
+ * The following #defines are DEPRECATED and should not be used for
+ * anything. They remain to maintain binary compatibility.
+ * The original code defined the OPENLDAP SDK as present regardless
+ * of what really was there, which was way bogus. In addition, the
+ * apr_ldap_url_parse*() functions have been rewritten specifically for
+ * APR, so the APR_HAS_LDAP_URL_PARSE macro is forced to zero.
+ */
+#define APR_HAS_LDAP_SSL 1
+#define APR_HAS_LDAP_URL_PARSE 0
+
+
+/*
+ * Include the standard LDAP header files.
+ */
+
+#ifdef GENEXPORTS
+#define LDAP_VERSION_MAX 3
+#define LDAP_INSUFFICIENT_ACCESS
+#else
+#include <lber.h>
+#include <ldap.h>
+#if APR_HAS_LDAP_SSL
+#include <ldap_ssl.h>
+#endif
+#endif
+
+
+/*
+ * Detected standard functions
+ */
+#define APR_HAS_LDAPSSL_CLIENT_INIT 1
+#define APR_HAS_LDAPSSL_CLIENT_DEINIT 1
+#define APR_HAS_LDAPSSL_ADD_TRUSTED_CERT 1
+#define APR_HAS_LDAP_START_TLS_S 0
+#define APR_HAS_LDAP_SSLINIT 0
+#define APR_HAS_LDAPSSL_INIT 1
+#define APR_HAS_LDAPSSL_INSTALL_ROUTINES 0
+
+
+/*
+ * Make sure the secure LDAP port is defined
+ */
+#ifndef LDAPS_PORT
+#define LDAPS_PORT 636 /* ldaps:/// default LDAP over TLS port */
+#endif
+
+
+/* Note: Macros defining const casting has been removed in APR v1.0,
+ * pending real support for LDAP v2.0 toolkits.
+ *
+ * In the mean time, please use an LDAP v3.0 toolkit.
+ */
+#if LDAP_VERSION_MAX <= 2
+#error Support for LDAP v2.0 toolkits has been removed from apr-util. Please use an LDAP v3.0 toolkit.
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * This structure allows the C LDAP API error codes to be returned
+ * along with plain text error messages that explain to us mere mortals
+ * what really happened.
+ */
+typedef struct apr_ldap_err_t {
+ const char *reason;
+ const char *msg;
+ int rc;
+} apr_ldap_err_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+#define APR_LDAP_IS_SERVER_DOWN(s) ((s) == LDAP_SERVER_DOWN)
+
+/* These symbols are not actually exported in a DSO build, but mapped into
+ * a private exported function array for apr_ldap_stub to bind dynamically.
+ * Rename them appropriately to protect the global namespace.
+ */
+#ifdef APU_DSO_LDAP_BUILD
+
+#define apr_ldap_info apr__ldap_info
+#define apr_ldap_init apr__ldap_init
+#define apr_ldap_ssl_init apr__ldap_ssl_init
+#define apr_ldap_ssl_deinit apr__ldap_ssl_deinit
+#define apr_ldap_get_option apr__ldap_get_option
+#define apr_ldap_set_option apr__ldap_set_option
+#define apr_ldap_rebind_init apr__ldap_rebind_init
+#define apr_ldap_rebind_add apr__ldap_rebind_add
+#define apr_ldap_rebind_remove apr__ldap_rebind_remove
+
+#define APU_DECLARE_LDAP(type) type
+#else
+#define APU_DECLARE_LDAP(type) APU_DECLARE(type)
+#endif
+
+#include "apr_ldap_url.h"
+#include "apr_ldap_init.h"
+#include "apr_ldap_option.h"
+#include "apr_ldap_rebind.h"
+
+/** @} */
+#endif /* APR_HAS_LDAP */
+#endif /* APU_LDAP_H */
+
diff --git a/contrib/apr-util/include/apr_ldap.hw b/contrib/apr-util/include/apr_ldap.hw
new file mode 100644
index 000000000000..c1bd0d4b6767
--- /dev/null
+++ b/contrib/apr-util/include/apr_ldap.hw
@@ -0,0 +1,197 @@
+/* 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.
+ */
+
+/*
+ * apr_ldap.h is generated from apr_ldap.h.in by configure -- do not edit apr_ldap.h
+ */
+/**
+ * @file apr_ldap.h
+ * @brief APR-UTIL LDAP
+ */
+#ifndef APU_LDAP_H
+#define APU_LDAP_H
+
+/**
+ * @defgroup APR_Util_LDAP LDAP
+ * @ingroup APR_Util
+ * @{
+ */
+
+/* this will be defined if LDAP support was compiled into apr-util */
+#define APR_HAS_LDAP 1
+
+/* identify the LDAP toolkit used */
+#define APR_HAS_NETSCAPE_LDAPSDK 0
+#define APR_HAS_SOLARIS_LDAPSDK 0
+#define APR_HAS_NOVELL_LDAPSDK 0
+#define APR_HAS_MOZILLA_LDAPSDK 0
+#define APR_HAS_OPENLDAP_LDAPSDK 0
+#define APR_HAS_MICROSOFT_LDAPSDK 1
+#define APR_HAS_TIVOLI_LDAPSDK 0
+#define APR_HAS_ZOS_LDAPSDK 0
+#define APR_HAS_OTHER_LDAPSDK 0
+
+
+/*
+ * Handle the case when LDAP is enabled
+ */
+#if APR_HAS_LDAP
+
+/*
+ * The following #defines are DEPRECATED and should not be used for
+ * anything. They remain to maintain binary compatibility.
+ * The original code defined the OPENLDAP SDK as present regardless
+ * of what really was there, which was way bogus. In addition, the
+ * apr_ldap_url_parse*() functions have been rewritten specifically for
+ * APR, so the APR_HAS_LDAP_URL_PARSE macro is forced to zero.
+ */
+#if APR_HAS_TIVOLI_LDAPSDK
+#define APR_HAS_LDAP_SSL 0
+#else
+#define APR_HAS_LDAP_SSL 1
+#endif
+#define APR_HAS_LDAP_URL_PARSE 0
+
+#if APR_HAS_OPENLDAP_LDAPSDK && !defined(LDAP_DEPRECATED)
+/* Ensure that the "deprecated" interfaces are still exposed
+ * with OpenLDAP >= 2.3; these were exposed by default in earlier
+ * releases. */
+#define LDAP_DEPRECATED 1
+#endif
+
+/*
+ * Include the standard LDAP header files.
+ */
+
+#include <winldap.h>
+
+
+/*
+ * Detected standard functions
+ */
+#define APR_HAS_LDAPSSL_CLIENT_INIT 0
+#define APR_HAS_LDAPSSL_CLIENT_DEINIT 0
+#define APR_HAS_LDAPSSL_ADD_TRUSTED_CERT 0
+#define APR_HAS_LDAP_START_TLS_S 0
+#define APR_HAS_LDAP_SSLINIT 1
+#define APR_HAS_LDAPSSL_INIT 0
+#define APR_HAS_LDAPSSL_INSTALL_ROUTINES 0
+
+
+/*
+ * Make sure the secure LDAP port is defined
+ */
+#ifndef LDAPS_PORT
+#define LDAPS_PORT 636 /* ldaps:/// default LDAP over TLS port */
+#endif
+
+
+/*
+ * For ldap function calls that input a size limit on the number of returned elements
+ * Some SDKs do not have the define for LDAP_DEFAULT_LIMIT (-1) or LDAP_NO_LIMIT (0)
+ * LDAP_DEFAULT_LIMIT is preferred as it allows inheritance from whatever the SDK
+ * or process is configured for.
+ */
+#ifdef LDAP_DEFAULT_LIMIT
+#define APR_LDAP_SIZELIMIT LDAP_DEFAULT_LIMIT
+#else
+#ifdef LDAP_NO_LIMIT
+#define APR_LDAP_SIZELIMIT LDAP_NO_LIMIT
+#endif
+#endif
+
+#ifndef APR_LDAP_SIZELIMIT
+#define APR_LDAP_SIZELIMIT 0 /* equivalent to LDAP_NO_LIMIT, and what goes on the wire */
+#endif
+
+/*
+ * z/OS is missing some defines
+ */
+#ifndef LDAP_VERSION_MAX
+#define LDAP_VERSION_MAX LDAP_VERSION
+#endif
+#if APR_HAS_ZOS_LDAPSDK
+#define LDAP_VENDOR_NAME "IBM z/OS"
+#endif
+
+/* Note: Macros defining const casting has been removed in APR v1.0,
+ * pending real support for LDAP v2.0 toolkits.
+ *
+ * In the mean time, please use an LDAP v3.0 toolkit.
+ */
+#if LDAP_VERSION_MAX <= 2
+#error Support for LDAP v2.0 toolkits has been removed from apr-util. Please use an LDAP v3.0 toolkit.
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * This structure allows the C LDAP API error codes to be returned
+ * along with plain text error messages that explain to us mere mortals
+ * what really happened.
+ */
+typedef struct apr_ldap_err_t {
+ const char *reason;
+ const char *msg;
+ int rc;
+} apr_ldap_err_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+/* The MS SDK returns LDAP_UNAVAILABLE when the backend has closed the connection
+ * between LDAP calls. Protect with APR_HAS_MICROSOFT_LDAPSDK in case someone
+ * manually chooses another SDK on Windows
+ */
+#if APR_HAS_MICROSOFT_LDAPSDK
+#define APR_LDAP_IS_SERVER_DOWN(s) ((s) == LDAP_SERVER_DOWN \
+ || (s) == LDAP_UNAVAILABLE)
+#else
+#define APR_LDAP_IS_SERVER_DOWN(s) ((s) == LDAP_SERVER_DOWN)
+#endif
+
+/* These symbols are not actually exported in a DSO build, but mapped into
+ * a private exported function array for apr_ldap_stub to bind dynamically.
+ * Rename them appropriately to protect the global namespace.
+ */
+#ifdef APU_DSO_LDAP_BUILD
+
+#define apr_ldap_info apr__ldap_info
+#define apr_ldap_init apr__ldap_init
+#define apr_ldap_ssl_init apr__ldap_ssl_init
+#define apr_ldap_ssl_deinit apr__ldap_ssl_deinit
+#define apr_ldap_get_option apr__ldap_get_option
+#define apr_ldap_set_option apr__ldap_set_option
+#define apr_ldap_rebind_init apr__ldap_rebind_init
+#define apr_ldap_rebind_add apr__ldap_rebind_add
+#define apr_ldap_rebind_remove apr__ldap_rebind_remove
+
+#define APU_DECLARE_LDAP(type) type
+#else
+#define APU_DECLARE_LDAP(type) APU_DECLARE(type)
+#endif
+
+#include "apr_ldap_url.h"
+#include "apr_ldap_init.h"
+#include "apr_ldap_option.h"
+#include "apr_ldap_rebind.h"
+
+/** @} */
+#endif /* APR_HAS_LDAP */
+#endif /* APU_LDAP_H */
diff --git a/contrib/apr-util/include/apr_ldap_init.h b/contrib/apr-util/include/apr_ldap_init.h
new file mode 100644
index 000000000000..aeb6d9bb1f57
--- /dev/null
+++ b/contrib/apr-util/include/apr_ldap_init.h
@@ -0,0 +1,165 @@
+/* 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.
+ */
+
+/**
+ * @file apr_ldap_init.h
+ * @brief APR-UTIL LDAP ldap_init() functions
+ */
+#ifndef APR_LDAP_INIT_H
+#define APR_LDAP_INIT_H
+
+/**
+ * @addtogroup APR_Util_LDAP
+ * @{
+ */
+
+#include "apr_ldap.h"
+
+#if APR_HAS_LDAP
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+/**
+ * Macro to detect security related return values.
+ */
+#if defined(LDAP_INSUFFICIENT_ACCESS)
+#define APU_LDAP_INSUFFICIENT_ACCESS LDAP_INSUFFICIENT_ACCESS
+#elif defined(LDAP_INSUFFICIENT_RIGHTS)
+#define APU_LDAP_INSUFFICIENT_ACCESS LDAP_INSUFFICIENT_RIGHTS
+#elif defined(APR_HAS_MICROSOFT_LDAPSDK)
+/* The macros above fail to contemplate that LDAP_RETCODE values
+ * may be represented by an enum. autoconf tests would be much
+ * more robust.
+ */
+#define APU_LDAP_INSUFFICIENT_ACCESS LDAP_INSUFFICIENT_RIGHTS
+#else
+#error The security return codes must be added to support this LDAP toolkit.
+#endif
+
+#if defined(LDAP_SECURITY_ERROR)
+#define APU_LDAP_SECURITY_ERROR LDAP_SECURITY_ERROR
+#else
+#define APU_LDAP_SECURITY_ERROR(n) \
+ (LDAP_INAPPROPRIATE_AUTH == n) ? 1 \
+ : (LDAP_INVALID_CREDENTIALS == n) ? 1 \
+ : (APU_LDAP_INSUFFICIENT_ACCESS == n) ? 1 \
+ : 0
+#endif
+
+
+/**
+ * APR LDAP SSL Initialise function
+ *
+ * This function initialises SSL on the underlying LDAP toolkit
+ * if this is necessary.
+ *
+ * If a CA certificate is provided, this is set, however the setting
+ * of certificates via this method has been deprecated and will be removed in
+ * APR v2.0.
+ *
+ * The apr_ldap_set_option() function with the APR_LDAP_OPT_TLS_CERT option
+ * should be used instead to set certificates.
+ *
+ * If SSL support is not available on this platform, or a problem
+ * was encountered while trying to set the certificate, the function
+ * will return APR_EGENERAL. Further LDAP specific error information
+ * can be found in result_err.
+ * @param pool The pool to use
+ * @param cert_auth_file The name of the certificate to use, can be NULL
+ * @param cert_file_type The type of certificate specified. See the
+ * apr_ldap_set_option() APR_LDAP_OPT_TLS_CERT option for details.
+ * @param result_err The returned result
+ */
+APU_DECLARE_LDAP(int) apr_ldap_ssl_init(apr_pool_t *pool,
+ const char *cert_auth_file,
+ int cert_file_type,
+ apr_ldap_err_t **result_err);
+
+/**
+ * APR LDAP SSL De-Initialise function
+ *
+ * This function tears down any SSL certificate setup previously
+ * set using apr_ldap_ssl_init(). It should be called to clean
+ * up if a graceful restart of a service is attempted.
+ * @todo currently we do not check whether apr_ldap_ssl_init()
+ * has been called first - we probably should.
+ */
+APU_DECLARE_LDAP(int) apr_ldap_ssl_deinit(void);
+
+/**
+ * APR LDAP initialise function
+ *
+ * This function is responsible for initialising an LDAP
+ * connection in a toolkit independant way. It does the
+ * job of ldap_init() from the C api.
+ *
+ * It handles both the SSL and non-SSL case, and attempts
+ * to hide the complexity setup from the user. This function
+ * assumes that any certificate setup necessary has already
+ * been done.
+ *
+ * If SSL or STARTTLS needs to be enabled, and the underlying
+ * toolkit supports it, the following values are accepted for
+ * secure:
+ *
+ * APR_LDAP_NONE: No encryption
+ * APR_LDAP_SSL: SSL encryption (ldaps://)
+ * APR_LDAP_STARTTLS: Force STARTTLS on ldap://
+ * @remark The Novell toolkit is only able to set the SSL mode via this
+ * function. To work around this limitation, set the SSL mode here if no
+ * per connection client certificates are present, otherwise set secure
+ * APR_LDAP_NONE here, then set the per connection client certificates,
+ * followed by setting the SSL mode via apr_ldap_set_option(). As Novell
+ * does not support per connection client certificates, this problem is
+ * worked around while still being compatible with other LDAP toolkits.
+ * @param pool The pool to use
+ * @param ldap The LDAP handle
+ * @param hostname The name of the host to connect to. This can be either a
+ * DNS name, or an IP address.
+ * @param portno The port to connect to
+ * @param secure The security mode to set
+ * @param result_err The returned result
+ */
+APU_DECLARE_LDAP(int) apr_ldap_init(apr_pool_t *pool,
+ LDAP **ldap,
+ const char *hostname,
+ int portno,
+ int secure,
+ apr_ldap_err_t **result_err);
+
+/**
+ * APR LDAP info function
+ *
+ * This function returns a string describing the LDAP toolkit
+ * currently in use. The string is placed inside result_err->reason.
+ * @param pool The pool to use
+ * @param result_err The returned result
+ */
+APU_DECLARE_LDAP(int) apr_ldap_info(apr_pool_t *pool,
+ apr_ldap_err_t **result_err);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* APR_HAS_LDAP */
+
+/** @} */
+
+#endif /* APR_LDAP_URL_H */
diff --git a/contrib/apr-util/include/apr_ldap_option.h b/contrib/apr-util/include/apr_ldap_option.h
new file mode 100644
index 000000000000..0ff8a8622261
--- /dev/null
+++ b/contrib/apr-util/include/apr_ldap_option.h
@@ -0,0 +1,254 @@
+/* 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.
+ */
+
+/**
+ * @file apr_ldap_option.h
+ * @brief APR-UTIL LDAP ldap_*_option() functions
+ */
+#ifndef APR_LDAP_OPTION_H
+#define APR_LDAP_OPTION_H
+
+/**
+ * @addtogroup APR_Util_LDAP
+ * @{
+ */
+
+#include "apr_ldap.h"
+
+#if APR_HAS_LDAP
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/*
+ * The following defines handle the different TLS certificate
+ * options available. If these options are missing, APR will try and
+ * emulate support for this using the deprecated ldap_start_tls_s()
+ * function.
+ */
+/**
+ * Set SSL mode to one of APR_LDAP_NONE, APR_LDAP_SSL, APR_LDAP_STARTTLS
+ * or APR_LDAP_STOPTLS.
+ */
+#define APR_LDAP_OPT_TLS 0x6fff
+/**
+ * Set zero or more CA certificates, client certificates or private
+ * keys globally, or per connection (where supported).
+ */
+#define APR_LDAP_OPT_TLS_CERT 0x6ffe
+/**
+ * Set the LDAP library to no verify the server certificate. This means
+ * all servers are considered trusted.
+ */
+#define APR_LDAP_OPT_VERIFY_CERT 0x6ffd
+/**
+ * Set the LDAP library to indicate if referrals should be chased during
+ * LDAP searches.
+ */
+#define APR_LDAP_OPT_REFERRALS 0x6ffc
+/**
+ * Set the LDAP library to indicate a maximum number of referral hops to
+ * chase before giving up on the search.
+ */
+#define APR_LDAP_OPT_REFHOPLIMIT 0x6ffb
+
+/**
+ * Structures for the apr_set_option() cases
+ */
+
+/**
+ * APR_LDAP_OPT_TLS_CERT
+ *
+ * This structure includes possible options to set certificates on
+ * system initialisation. Different SDKs have different certificate
+ * requirements, and to achieve this multiple certificates must be
+ * specified at once passed as an (apr_array_header_t *).
+ *
+ * Netscape:
+ * Needs the CA cert database (cert7.db), the client cert database (key3.db)
+ * and the security module file (secmod.db) set at the system initialisation
+ * time. Three types are supported: APR_LDAP_CERT7_DB, APR_LDAP_KEY3_DB and
+ * APR_LDAP_SECMOD.
+ *
+ * To specify a client cert connection, a certificate nickname needs to be
+ * provided with a type of APR_LDAP_CERT.
+ * int ldapssl_enable_clientauth( LDAP *ld, char *keynickname,
+ * char *keypasswd, char *certnickname );
+ * keynickname is currently not used, and should be set to ""
+ *
+ * Novell:
+ * Needs CA certificates and client certificates set at system initialisation
+ * time. Three types are supported: APR_LDAP_CA*, APR_LDAP_CERT* and
+ * APR_LDAP_KEY*.
+ *
+ * Certificates cannot be specified per connection.
+ *
+ * The functions used are:
+ * ldapssl_add_trusted_cert(serverTrustedRoot, serverTrustedRootEncoding);
+ * Clients certs and keys are set at system initialisation time with
+ * int ldapssl_set_client_cert (
+ * void *cert,
+ * int type
+ * void *password);
+ * type can be LDAPSSL_CERT_FILETYPE_B64 or LDAPSSL_CERT_FILETYPE_DER
+ * ldapssl_set_client_private_key(clientPrivateKey,
+ * clientPrivateKeyEncoding,
+ * clientPrivateKeyPassword);
+ *
+ * OpenSSL:
+ * Needs one or more CA certificates to be set at system initialisation time
+ * with a type of APR_LDAP_CA*.
+ *
+ * May have one or more client certificates set per connection with a type of
+ * APR_LDAP_CERT*, and keys with APR_LDAP_KEY*.
+ */
+/** CA certificate type unknown */
+#define APR_LDAP_CA_TYPE_UNKNOWN 0
+/** binary DER encoded CA certificate */
+#define APR_LDAP_CA_TYPE_DER 1
+/** PEM encoded CA certificate */
+#define APR_LDAP_CA_TYPE_BASE64 2
+/** Netscape/Mozilla cert7.db CA certificate database */
+#define APR_LDAP_CA_TYPE_CERT7_DB 3
+/** Netscape/Mozilla secmod file */
+#define APR_LDAP_CA_TYPE_SECMOD 4
+/** Client certificate type unknown */
+#define APR_LDAP_CERT_TYPE_UNKNOWN 5
+/** binary DER encoded client certificate */
+#define APR_LDAP_CERT_TYPE_DER 6
+/** PEM encoded client certificate */
+#define APR_LDAP_CERT_TYPE_BASE64 7
+/** Netscape/Mozilla key3.db client certificate database */
+#define APR_LDAP_CERT_TYPE_KEY3_DB 8
+/** Netscape/Mozilla client certificate nickname */
+#define APR_LDAP_CERT_TYPE_NICKNAME 9
+/** Private key type unknown */
+#define APR_LDAP_KEY_TYPE_UNKNOWN 10
+/** binary DER encoded private key */
+#define APR_LDAP_KEY_TYPE_DER 11
+/** PEM encoded private key */
+#define APR_LDAP_KEY_TYPE_BASE64 12
+/** PKCS#12 encoded client certificate */
+#define APR_LDAP_CERT_TYPE_PFX 13
+/** PKCS#12 encoded private key */
+#define APR_LDAP_KEY_TYPE_PFX 14
+/** Openldap directory full of base64-encoded cert
+ * authorities with hashes in corresponding .0 directory
+ */
+#define APR_LDAP_CA_TYPE_CACERTDIR_BASE64 15
+
+
+/**
+ * Certificate structure.
+ *
+ * This structure is used to store certificate details. An array of
+ * these structures is passed to apr_ldap_set_option() to set CA
+ * and client certificates.
+ * @param type Type of certificate APR_LDAP_*_TYPE_*
+ * @param path Path, file or nickname of the certificate
+ * @param password Optional password, can be NULL
+ */
+typedef struct apr_ldap_opt_tls_cert_t apr_ldap_opt_tls_cert_t;
+struct apr_ldap_opt_tls_cert_t {
+ int type;
+ const char *path;
+ const char *password;
+};
+
+/**
+ * APR_LDAP_OPT_TLS
+ *
+ * This sets the SSL level on the LDAP handle.
+ *
+ * Netscape/Mozilla:
+ * Supports SSL, but not STARTTLS
+ * SSL is enabled by calling ldapssl_install_routines().
+ *
+ * Novell:
+ * Supports SSL and STARTTLS.
+ * SSL is enabled by calling ldapssl_install_routines(). Note that calling
+ * other ldap functions before ldapssl_install_routines() may cause this
+ * function to fail.
+ * STARTTLS is enabled by calling ldapssl_start_tls_s() after calling
+ * ldapssl_install_routines() (check this).
+ *
+ * OpenLDAP:
+ * Supports SSL and supports STARTTLS, but none of this is documented:
+ * http://www.openldap.org/lists/openldap-software/200409/msg00618.html
+ * Documentation for both SSL support and STARTTLS has been deleted from
+ * the OpenLDAP documentation and website.
+ */
+
+/** No encryption */
+#define APR_LDAP_NONE 0
+/** SSL encryption (ldaps://) */
+#define APR_LDAP_SSL 1
+/** TLS encryption (STARTTLS) */
+#define APR_LDAP_STARTTLS 2
+/** end TLS encryption (STOPTLS) */
+#define APR_LDAP_STOPTLS 3
+
+/**
+ * APR LDAP get option function
+ *
+ * This function gets option values from a given LDAP session if
+ * one was specified. It maps to the native ldap_get_option() function.
+ * @param pool The pool to use
+ * @param ldap The LDAP handle
+ * @param option The LDAP_OPT_* option to return
+ * @param outvalue The value returned (if any)
+ * @param result_err The apr_ldap_err_t structure contained detailed results
+ * of the operation.
+ */
+APU_DECLARE_LDAP(int) apr_ldap_get_option(apr_pool_t *pool,
+ LDAP *ldap,
+ int option,
+ void *outvalue,
+ apr_ldap_err_t **result_err);
+
+/**
+ * APR LDAP set option function
+ *
+ * This function sets option values to a given LDAP session if
+ * one was specified. It maps to the native ldap_set_option() function.
+ *
+ * Where an option is not supported by an LDAP toolkit, this function
+ * will try and apply legacy functions to achieve the same effect,
+ * depending on the platform.
+ * @param pool The pool to use
+ * @param ldap The LDAP handle
+ * @param option The LDAP_OPT_* option to set
+ * @param invalue The value to set
+ * @param result_err The apr_ldap_err_t structure contained detailed results
+ * of the operation.
+ */
+APU_DECLARE_LDAP(int) apr_ldap_set_option(apr_pool_t *pool,
+ LDAP *ldap,
+ int option,
+ const void *invalue,
+ apr_ldap_err_t **result_err);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* APR_HAS_LDAP */
+
+/** @} */
+
+#endif /* APR_LDAP_OPTION_H */
+
diff --git a/contrib/apr-util/include/apr_ldap_rebind.h b/contrib/apr-util/include/apr_ldap_rebind.h
new file mode 100644
index 000000000000..342a17c3893a
--- /dev/null
+++ b/contrib/apr-util/include/apr_ldap_rebind.h
@@ -0,0 +1,98 @@
+/* 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.
+ */
+
+/**
+ * The APR LDAP rebind functions provide an implementation of
+ * a rebind procedure that can be used to allow clients to chase referrals,
+ * using the same credentials used to log in originally.
+ *
+ * Use of this implementation is optional.
+ *
+ * @file apr_ldap_rebind.h
+ * @brief Apache LDAP library
+ */
+
+#ifndef APU_LDAP_REBIND_H
+#define APU_LDAP_REBIND_H
+
+/**
+ * @addtogroup APR_Util_LDAP
+ * @{
+ **/
+
+#if defined(DOXYGEN)
+#include "apr_ldap.h"
+#endif
+
+/*
+ * Handle the case when LDAP is enabled
+ */
+#if APR_HAS_LDAP
+
+/**
+ * APR LDAP initialize rebind lock
+ *
+ * This function creates the lock for controlling access to the xref list..
+ * @param pool Pool to use when creating the xref_lock.
+ */
+APU_DECLARE_LDAP(apr_status_t) apr_ldap_rebind_init(apr_pool_t *pool);
+
+
+/**
+ * APR LDAP rebind_add function
+ *
+ * This function creates a cross reference entry for the specified ldap
+ * connection. The rebind callback function will look up this ldap
+ * connection so it can retrieve the bindDN and bindPW for use in any
+ * binds while referrals are being chased.
+ *
+ * This function will add the callback to the LDAP handle passed in.
+ *
+ * A cleanup is registered within the pool provided to remove this
+ * entry when the pool is removed. Alternatively apr_ldap_rebind_remove()
+ * can be called to explicitly remove the entry at will.
+ *
+ * @param pool The pool to use
+ * @param ld The LDAP connectionhandle
+ * @param bindDN The bind DN to be used for any binds while chasing
+ * referrals on this ldap connection.
+ * @param bindPW The bind Password to be used for any binds while
+ * chasing referrals on this ldap connection.
+ */
+APU_DECLARE_LDAP(apr_status_t) apr_ldap_rebind_add(apr_pool_t *pool,
+ LDAP *ld,
+ const char *bindDN,
+ const char *bindPW);
+
+/**
+ * APR LDAP rebind_remove function
+ *
+ * This function removes the rebind cross reference entry for the
+ * specified ldap connection.
+ *
+ * If not explicitly removed, this function will be called automatically
+ * when the pool is cleaned up.
+ *
+ * @param ld The LDAP connectionhandle
+ */
+APU_DECLARE_LDAP(apr_status_t) apr_ldap_rebind_remove(LDAP *ld);
+
+#endif /* APR_HAS_LDAP */
+
+/** @} */
+
+#endif /* APU_LDAP_REBIND_H */
+
diff --git a/contrib/apr-util/include/apr_ldap_url.h b/contrib/apr-util/include/apr_ldap_url.h
new file mode 100644
index 000000000000..a71f5b3cb33e
--- /dev/null
+++ b/contrib/apr-util/include/apr_ldap_url.h
@@ -0,0 +1,120 @@
+/* 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.
+ */
+
+/**
+ * @file apr_ldap_url.h
+ * @brief APR-UTIL LDAP ldap_init() functions
+ */
+#ifndef APR_LDAP_URL_H
+#define APR_LDAP_URL_H
+
+/**
+ * @addtogroup APR_Util_LDAP
+ * @{
+ */
+
+#if defined(DOXYGEN)
+#include "apr_ldap.h"
+#endif
+
+#if APR_HAS_LDAP
+
+#include "apu.h"
+#include "apr_pools.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/** Structure to access an exploded LDAP URL */
+typedef struct apr_ldap_url_desc_t {
+ struct apr_ldap_url_desc_t *lud_next;
+ char *lud_scheme;
+ char *lud_host;
+ int lud_port;
+ char *lud_dn;
+ char **lud_attrs;
+ int lud_scope;
+ char *lud_filter;
+ char **lud_exts;
+ int lud_crit_exts;
+} apr_ldap_url_desc_t;
+
+#ifndef APR_LDAP_URL_SUCCESS
+#define APR_LDAP_URL_SUCCESS 0x00 /* Success */
+#define APR_LDAP_URL_ERR_MEM 0x01 /* can't allocate memory space */
+#define APR_LDAP_URL_ERR_PARAM 0x02 /* parameter is bad */
+#define APR_LDAP_URL_ERR_BADSCHEME 0x03 /* URL doesn't begin with "ldap[si]://" */
+#define APR_LDAP_URL_ERR_BADENCLOSURE 0x04 /* URL is missing trailing ">" */
+#define APR_LDAP_URL_ERR_BADURL 0x05 /* URL is bad */
+#define APR_LDAP_URL_ERR_BADHOST 0x06 /* host port is bad */
+#define APR_LDAP_URL_ERR_BADATTRS 0x07 /* bad (or missing) attributes */
+#define APR_LDAP_URL_ERR_BADSCOPE 0x08 /* scope string is invalid (or missing) */
+#define APR_LDAP_URL_ERR_BADFILTER 0x09 /* bad or missing filter */
+#define APR_LDAP_URL_ERR_BADEXTS 0x0a /* bad or missing extensions */
+#endif
+
+/**
+ * Is this URL an ldap url? ldap://
+ * @param url The url to test
+ */
+APU_DECLARE(int) apr_ldap_is_ldap_url(const char *url);
+
+/**
+ * Is this URL an SSL ldap url? ldaps://
+ * @param url The url to test
+ */
+APU_DECLARE(int) apr_ldap_is_ldaps_url(const char *url);
+
+/**
+ * Is this URL an ldap socket url? ldapi://
+ * @param url The url to test
+ */
+APU_DECLARE(int) apr_ldap_is_ldapi_url(const char *url);
+
+/**
+ * Parse an LDAP URL.
+ * @param pool The pool to use
+ * @param url_in The URL to parse
+ * @param ludpp The structure to return the exploded URL
+ * @param result_err The result structure of the operation
+ */
+APU_DECLARE(int) apr_ldap_url_parse_ext(apr_pool_t *pool,
+ const char *url_in,
+ apr_ldap_url_desc_t **ludpp,
+ apr_ldap_err_t **result_err);
+
+/**
+ * Parse an LDAP URL.
+ * @param pool The pool to use
+ * @param url_in The URL to parse
+ * @param ludpp The structure to return the exploded URL
+ * @param result_err The result structure of the operation
+ */
+APU_DECLARE(int) apr_ldap_url_parse(apr_pool_t *pool,
+ const char *url_in,
+ apr_ldap_url_desc_t **ludpp,
+ apr_ldap_err_t **result_err);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* APR_HAS_LDAP */
+
+/** @} */
+
+#endif /* APR_LDAP_URL_H */
diff --git a/contrib/apr-util/include/apr_md4.h b/contrib/apr-util/include/apr_md4.h
new file mode 100644
index 000000000000..43fb33e30454
--- /dev/null
+++ b/contrib/apr-util/include/apr_md4.h
@@ -0,0 +1,135 @@
+/* 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.
+ */
+/* This is derived from material copyright RSA Data Security, Inc.
+ * Their notice is reproduced below in its entirety.
+ *
+ * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
+ * rights reserved.
+ *
+ * License to copy and use this software is granted provided that it
+ * is identified as the "RSA Data Security, Inc. MD4 Message-Digest
+ * Algorithm" in all material mentioning or referencing this software
+ * or this function.
+ *
+ * License is also granted to make and use derivative works provided
+ * that such works are identified as "derived from the RSA Data
+ * Security, Inc. MD4 Message-Digest Algorithm" in all material
+ * mentioning or referencing the derived work.
+ *
+ * RSA Data Security, Inc. makes no representations concerning either
+ * the merchantability of this software or the suitability of this
+ * software for any particular purpose. It is provided "as is"
+ * without express or implied warranty of any kind.
+ *
+ * These notices must be retained in any copies of any part of this
+ * documentation and/or software.
+ */
+
+#ifndef APR_MD4_H
+#define APR_MD4_H
+
+#include "apu.h"
+#include "apr_xlate.h"
+/**
+ * @file apr_md4.h
+ * @brief APR-UTIL MD4 Library
+ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup APR_Util_MD4 MD4 Library
+ * @ingroup APR_Util
+ * @{
+ */
+
+/** The digestsize for MD4 */
+#define APR_MD4_DIGESTSIZE 16
+
+/** @see apr_md4_ctx_t */
+typedef struct apr_md4_ctx_t apr_md4_ctx_t;
+
+/** MD4 context. */
+struct apr_md4_ctx_t {
+ /** state (ABCD) */
+ apr_uint32_t state[4];
+ /** number of bits, modulo 2^64 (lsb first) */
+ apr_uint32_t count[2];
+ /** input buffer */
+ unsigned char buffer[64];
+#if APR_HAS_XLATE
+ /** translation handle */
+ apr_xlate_t *xlate;
+#endif
+};
+
+/**
+ * MD4 Initialize. Begins an MD4 operation, writing a new context.
+ * @param context The MD4 context to initialize.
+ */
+APU_DECLARE(apr_status_t) apr_md4_init(apr_md4_ctx_t *context);
+
+#if APR_HAS_XLATE
+/**
+ * MDr4 translation setup. Provides the APR translation handle to be used
+ * for translating the content before calculating the digest.
+ * @param context The MD4 content to set the translation for.
+ * @param xlate The translation handle to use for this MD4 context
+ */
+APU_DECLARE(apr_status_t) apr_md4_set_xlate(apr_md4_ctx_t *context,
+ apr_xlate_t *xlate);
+#else
+#define apr_md4_set_xlate(context, xlate) APR_ENOTIMPL
+#endif
+
+/**
+ * MD4 block update operation. Continue an MD4 message-digest operation,
+ * processing another message block, and updating the context.
+ * @param context The MD4 content to update.
+ * @param input next message block to update
+ * @param inputLen The length of the next message block
+ */
+APU_DECLARE(apr_status_t) apr_md4_update(apr_md4_ctx_t *context,
+ const unsigned char *input,
+ apr_size_t inputLen);
+
+/**
+ * MD4 finalization. Ends an MD4 message-digest operation, writing the
+ * message digest and zeroing the context
+ * @param digest The final MD4 digest
+ * @param context The MD4 content we are finalizing.
+ */
+APU_DECLARE(apr_status_t) apr_md4_final(
+ unsigned char digest[APR_MD4_DIGESTSIZE],
+ apr_md4_ctx_t *context);
+
+/**
+ * MD4 digest computation
+ * @param digest The MD4 digest
+ * @param input message block to use
+ * @param inputLen The length of the message block
+ */
+APU_DECLARE(apr_status_t) apr_md4(unsigned char digest[APR_MD4_DIGESTSIZE],
+ const unsigned char *input,
+ apr_size_t inputLen);
+
+/** @} */
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !APR_MD4_H */
diff --git a/contrib/apr-util/include/apr_md5.h b/contrib/apr-util/include/apr_md5.h
new file mode 100644
index 000000000000..e0202dfdf9ff
--- /dev/null
+++ b/contrib/apr-util/include/apr_md5.h
@@ -0,0 +1,176 @@
+/*
+ * This is work is derived from material Copyright RSA Data Security, Inc.
+ *
+ * The RSA copyright statement and Licence for that original material is
+ * included below. This is followed by the Apache copyright statement and
+ * licence for the modifications made to that material.
+ */
+
+/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
+ rights reserved.
+
+ License to copy and use this software is granted provided that it
+ is identified as the "RSA Data Security, Inc. MD5 Message-Digest
+ Algorithm" in all material mentioning or referencing this software
+ or this function.
+
+ License is also granted to make and use derivative works provided
+ that such works are identified as "derived from the RSA Data
+ Security, Inc. MD5 Message-Digest Algorithm" in all material
+ mentioning or referencing the derived work.
+
+ RSA Data Security, Inc. makes no representations concerning either
+ the merchantability of this software or the suitability of this
+ software for any particular purpose. It is provided "as is"
+ without express or implied warranty of any kind.
+
+ These notices must be retained in any copies of any part of this
+ documentation and/or software.
+ */
+
+/* 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.
+ */
+
+#ifndef APR_MD5_H
+#define APR_MD5_H
+
+#include "apu.h"
+#include "apr_xlate.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/**
+ * @file apr_md5.h
+ * @brief APR MD5 Routines
+ */
+
+/**
+ * @defgroup APR_MD5 MD5 Routines
+ * @ingroup APR
+ * @{
+ */
+
+/** The MD5 digest size */
+#define APR_MD5_DIGESTSIZE 16
+
+/** @see apr_md5_ctx_t */
+typedef struct apr_md5_ctx_t apr_md5_ctx_t;
+
+/** MD5 context. */
+struct apr_md5_ctx_t {
+ /** state (ABCD) */
+ apr_uint32_t state[4];
+ /** number of bits, modulo 2^64 (lsb first) */
+ apr_uint32_t count[2];
+ /** input buffer */
+ unsigned char buffer[64];
+ /** translation handle
+ * ignored if xlate is unsupported
+ */
+ apr_xlate_t *xlate;
+};
+
+/**
+ * MD5 Initialize. Begins an MD5 operation, writing a new context.
+ * @param context The MD5 context to initialize.
+ */
+APU_DECLARE(apr_status_t) apr_md5_init(apr_md5_ctx_t *context);
+
+/**
+ * MD5 translation setup. Provides the APR translation handle to be used
+ * for translating the content before calculating the digest.
+ * @param context The MD5 content to set the translation for.
+ * @param xlate The translation handle to use for this MD5 context
+ */
+APU_DECLARE(apr_status_t) apr_md5_set_xlate(apr_md5_ctx_t *context,
+ apr_xlate_t *xlate);
+
+/**
+ * MD5 block update operation. Continue an MD5 message-digest operation,
+ * processing another message block, and updating the context.
+ * @param context The MD5 content to update.
+ * @param input next message block to update
+ * @param inputLen The length of the next message block
+ */
+APU_DECLARE(apr_status_t) apr_md5_update(apr_md5_ctx_t *context,
+ const void *input,
+ apr_size_t inputLen);
+
+/**
+ * MD5 finalization. Ends an MD5 message-digest operation, writing the
+ * message digest and zeroing the context
+ * @param digest The final MD5 digest
+ * @param context The MD5 content we are finalizing.
+ */
+APU_DECLARE(apr_status_t) apr_md5_final(unsigned char digest[APR_MD5_DIGESTSIZE],
+ apr_md5_ctx_t *context);
+
+/**
+ * MD5 in one step
+ * @param digest The final MD5 digest
+ * @param input The message block to use
+ * @param inputLen The length of the message block
+ */
+APU_DECLARE(apr_status_t) apr_md5(unsigned char digest[APR_MD5_DIGESTSIZE],
+ const void *input,
+ apr_size_t inputLen);
+
+/**
+ * Encode a password using an MD5 algorithm
+ * @param password The password to encode
+ * @param salt The salt string to use for the encoding
+ * @param result The string to store the encoded password in
+ * @param nbytes The size of the result buffer
+ */
+APU_DECLARE(apr_status_t) apr_md5_encode(const char *password, const char *salt,
+ char *result, apr_size_t nbytes);
+
+/**
+ * Encode a password using the bcrypt algorithm
+ * @param password The password to encode
+ * @param count The cost of the encoding, possible values are 4 to 31
+ * @param salt Pointer to binary data to be used as salt for the encoding
+ * @param salt_len The size of the salt data (must be >= 16)
+ * @param out The string to store the encoded password in
+ * @param out_len The size of the result buffer (must be >= 61)
+ */
+APU_DECLARE(apr_status_t) apr_bcrypt_encode(const char *pw,
+ unsigned int count,
+ const unsigned char *salt,
+ apr_size_t salt_len,
+ char *out, apr_size_t out_len);
+
+/**
+ * Validate hashes created by APR-supported algorithms: md5, bcrypt, and sha1.
+ * hashes created by crypt are supported only on platforms that provide
+ * crypt(3), so don't rely on that function unless you know that your
+ * application will be run only on platforms that support it. On platforms
+ * that don't support crypt(3), this falls back to a clear text string
+ * comparison.
+ * @param passwd The password to validate
+ * @param hash The password to validate against
+ */
+APU_DECLARE(apr_status_t) apr_password_validate(const char *passwd,
+ const char *hash);
+
+
+/** @} */
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !APR_MD5_H */
diff --git a/contrib/apr-util/include/apr_memcache.h b/contrib/apr-util/include/apr_memcache.h
new file mode 100644
index 000000000000..828788254117
--- /dev/null
+++ b/contrib/apr-util/include/apr_memcache.h
@@ -0,0 +1,444 @@
+/* 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.
+ */
+
+#ifndef APR_MEMCACHE_H
+#define APR_MEMCACHE_H
+
+/**
+ * @file apr_memcache.h
+ * @brief Client interface for memcached
+ * @remark To use this interface you must have a separate memcached
+ * server running. See the memcached website at http://www.danga.com/memcached/
+ * for more information.
+ */
+
+#include "apr.h"
+#include "apr_pools.h"
+#include "apr_time.h"
+#include "apr_strings.h"
+#include "apr_network_io.h"
+#include "apr_ring.h"
+#include "apr_buckets.h"
+#include "apr_reslist.h"
+#include "apr_hash.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @defgroup APR_Util_MC Memcached Client Routines
+ * @ingroup APR_Util
+ * @{
+ */
+
+/** Specifies the status of a memcached server */
+typedef enum
+{
+ APR_MC_SERVER_LIVE, /**< Server is alive and responding to requests */
+ APR_MC_SERVER_DEAD /**< Server is not responding to requests */
+} apr_memcache_server_status_t;
+
+/** Opaque memcache client connection object */
+typedef struct apr_memcache_conn_t apr_memcache_conn_t;
+
+/** Memcache Server Info Object */
+typedef struct apr_memcache_server_t apr_memcache_server_t;
+struct apr_memcache_server_t
+{
+ const char *host; /**< Hostname of this Server */
+ apr_port_t port; /**< Port of this Server */
+ apr_memcache_server_status_t status; /**< @see apr_memcache_server_status_t */
+#if APR_HAS_THREADS || defined(DOXYGEN)
+ apr_reslist_t *conns; /**< Resource list of actual client connections */
+#else
+ apr_memcache_conn_t *conn;
+#endif
+ apr_pool_t *p; /** Pool to use for private allocations */
+#if APR_HAS_THREADS
+ apr_thread_mutex_t *lock;
+#endif
+ apr_time_t btime;
+};
+
+/* Custom hash callback function prototype, user for server selection.
+* @param baton user selected baton
+* @param data data to hash
+* @param data_len length of data
+*/
+typedef apr_uint32_t (*apr_memcache_hash_func)(void *baton,
+ const char *data,
+ const apr_size_t data_len);
+
+typedef struct apr_memcache_t apr_memcache_t;
+
+/* Custom Server Select callback function prototype.
+* @param baton user selected baton
+* @param mc memcache instance, use mc->live_servers to select a node
+* @param hash hash of the selected key.
+*/
+typedef apr_memcache_server_t* (*apr_memcache_server_func)(void *baton,
+ apr_memcache_t *mc,
+ const apr_uint32_t hash);
+
+/** Container for a set of memcached servers */
+struct apr_memcache_t
+{
+ apr_uint32_t flags; /**< Flags, Not currently used */
+ apr_uint16_t nalloc; /**< Number of Servers Allocated */
+ apr_uint16_t ntotal; /**< Number of Servers Added */
+ apr_memcache_server_t **live_servers; /**< Array of Servers */
+ apr_pool_t *p; /** Pool to use for allocations */
+ void *hash_baton;
+ apr_memcache_hash_func hash_func;
+ void *server_baton;
+ apr_memcache_server_func server_func;
+};
+
+/** Returned Data from a multiple get */
+typedef struct
+{
+ apr_status_t status;
+ const char* key;
+ apr_size_t len;
+ char *data;
+ apr_uint16_t flags;
+} apr_memcache_value_t;
+
+/**
+ * Creates a crc32 hash used to split keys between servers
+ * @param mc The memcache client object to use
+ * @param data Data to be hashed
+ * @param data_len Length of the data to use
+ * @return crc32 hash of data
+ * @remark The crc32 hash is not compatible with old memcached clients.
+ */
+APU_DECLARE(apr_uint32_t) apr_memcache_hash(apr_memcache_t *mc,
+ const char *data,
+ const apr_size_t data_len);
+
+/**
+ * Pure CRC32 Hash. Used by some clients.
+ */
+APU_DECLARE(apr_uint32_t) apr_memcache_hash_crc32(void *baton,
+ const char *data,
+ const apr_size_t data_len);
+
+/**
+ * hash compatible with the standard Perl Client.
+ */
+APU_DECLARE(apr_uint32_t) apr_memcache_hash_default(void *baton,
+ const char *data,
+ const apr_size_t data_len);
+
+/**
+ * Picks a server based on a hash
+ * @param mc The memcache client object to use
+ * @param hash Hashed value of a Key
+ * @return server that controls specified hash
+ * @see apr_memcache_hash
+ */
+APU_DECLARE(apr_memcache_server_t *) apr_memcache_find_server_hash(apr_memcache_t *mc,
+ const apr_uint32_t hash);
+
+/**
+ * server selection compatible with the standard Perl Client.
+ */
+APU_DECLARE(apr_memcache_server_t *) apr_memcache_find_server_hash_default(void *baton,
+ apr_memcache_t *mc,
+ const apr_uint32_t hash);
+
+/**
+ * Adds a server to a client object
+ * @param mc The memcache client object to use
+ * @param server Server to add
+ * @remark Adding servers is not thread safe, and should be done once at startup.
+ * @warning Changing servers after startup may cause keys to go to
+ * different servers.
+ */
+APU_DECLARE(apr_status_t) apr_memcache_add_server(apr_memcache_t *mc,
+ apr_memcache_server_t *server);
+
+
+/**
+ * Finds a Server object based on a hostname/port pair
+ * @param mc The memcache client object to use
+ * @param host Hostname of the server
+ * @param port Port of the server
+ * @return Server with matching Hostname and Port, or NULL if none was found.
+ */
+APU_DECLARE(apr_memcache_server_t *) apr_memcache_find_server(apr_memcache_t *mc,
+ const char *host,
+ apr_port_t port);
+
+/**
+ * Enables a Server for use again
+ * @param mc The memcache client object to use
+ * @param ms Server to Activate
+ */
+APU_DECLARE(apr_status_t) apr_memcache_enable_server(apr_memcache_t *mc,
+ apr_memcache_server_t *ms);
+
+
+/**
+ * Disable a Server
+ * @param mc The memcache client object to use
+ * @param ms Server to Disable
+ */
+APU_DECLARE(apr_status_t) apr_memcache_disable_server(apr_memcache_t *mc,
+ apr_memcache_server_t *ms);
+
+/**
+ * Creates a new Server Object
+ * @param p Pool to use
+ * @param host hostname of the server
+ * @param port port of the server
+ * @param min minimum number of client sockets to open
+ * @param smax soft maximum number of client connections to open
+ * @param max hard maximum number of client connections
+ * @param ttl time to live in microseconds of a client connection
+ * @param ns location of the new server object
+ * @see apr_reslist_create
+ * @remark min, smax, and max are only used when APR_HAS_THREADS
+ */
+APU_DECLARE(apr_status_t) apr_memcache_server_create(apr_pool_t *p,
+ const char *host,
+ apr_port_t port,
+ apr_uint32_t min,
+ apr_uint32_t smax,
+ apr_uint32_t max,
+ apr_uint32_t ttl,
+ apr_memcache_server_t **ns);
+/**
+ * Creates a new memcached client object
+ * @param p Pool to use
+ * @param max_servers maximum number of servers
+ * @param flags Not currently used
+ * @param mc location of the new memcache client object
+ */
+APU_DECLARE(apr_status_t) apr_memcache_create(apr_pool_t *p,
+ apr_uint16_t max_servers,
+ apr_uint32_t flags,
+ apr_memcache_t **mc);
+
+/**
+ * Gets a value from the server, allocating the value out of p
+ * @param mc client to use
+ * @param p Pool to use
+ * @param key null terminated string containing the key
+ * @param baton location of the allocated value
+ * @param len length of data at baton
+ * @param flags any flags set by the client for this key
+ * @return
+ */
+APU_DECLARE(apr_status_t) apr_memcache_getp(apr_memcache_t *mc,
+ apr_pool_t *p,
+ const char* key,
+ char **baton,
+ apr_size_t *len,
+ apr_uint16_t *flags);
+
+
+/**
+ * Add a key to a hash for a multiget query
+ * if the hash (*value) is NULL it will be created
+ * @param data_pool pool from where the hash and their items are created from
+ * @param key null terminated string containing the key
+ * @param values hash of keys and values that this key will be added to
+ * @return
+ */
+APU_DECLARE(void) apr_memcache_add_multget_key(apr_pool_t *data_pool,
+ const char* key,
+ apr_hash_t **values);
+
+/**
+ * Gets multiple values from the server, allocating the values out of p
+ * @param mc client to use
+ * @param temp_pool Pool used for temporary allocations. May be cleared inside this
+ * call.
+ * @param data_pool Pool used to allocate data for the returned values.
+ * @param values hash of apr_memcache_value_t keyed by strings, contains the
+ * result of the multiget call.
+ * @return
+ */
+APU_DECLARE(apr_status_t) apr_memcache_multgetp(apr_memcache_t *mc,
+ apr_pool_t *temp_pool,
+ apr_pool_t *data_pool,
+ apr_hash_t *values);
+
+/**
+ * Sets a value by key on the server
+ * @param mc client to use
+ * @param key null terminated string containing the key
+ * @param baton data to store on the server
+ * @param data_size length of data at baton
+ * @param timeout time in seconds for the data to live on the server
+ * @param flags any flags set by the client for this key
+ */
+APU_DECLARE(apr_status_t) apr_memcache_set(apr_memcache_t *mc,
+ const char *key,
+ char *baton,
+ const apr_size_t data_size,
+ apr_uint32_t timeout,
+ apr_uint16_t flags);
+
+/**
+ * Adds value by key on the server
+ * @param mc client to use
+ * @param key null terminated string containing the key
+ * @param baton data to store on the server
+ * @param data_size length of data at baton
+ * @param timeout time for the data to live on the server
+ * @param flags any flags set by the client for this key
+ * @return APR_SUCCESS if the key was added, APR_EEXIST if the key
+ * already exists on the server.
+ */
+APU_DECLARE(apr_status_t) apr_memcache_add(apr_memcache_t *mc,
+ const char *key,
+ char *baton,
+ const apr_size_t data_size,
+ apr_uint32_t timeout,
+ apr_uint16_t flags);
+
+/**
+ * Replaces value by key on the server
+ * @param mc client to use
+ * @param key null terminated string containing the key
+ * @param baton data to store on the server
+ * @param data_size length of data at baton
+ * @param timeout time for the data to live on the server
+ * @param flags any flags set by the client for this key
+ * @return APR_SUCCESS if the key was added, APR_EEXIST if the key
+ * did not exist on the server.
+ */
+APU_DECLARE(apr_status_t) apr_memcache_replace(apr_memcache_t *mc,
+ const char *key,
+ char *baton,
+ const apr_size_t data_size,
+ apr_uint32_t timeout,
+ apr_uint16_t flags);
+/**
+ * Deletes a key from a server
+ * @param mc client to use
+ * @param key null terminated string containing the key
+ * @param timeout time for the delete to stop other clients from adding
+ */
+APU_DECLARE(apr_status_t) apr_memcache_delete(apr_memcache_t *mc,
+ const char *key,
+ apr_uint32_t timeout);
+
+/**
+ * Increments a value
+ * @param mc client to use
+ * @param key null terminated string containing the key
+ * @param n number to increment by
+ * @param nv new value after incrementing
+ */
+APU_DECLARE(apr_status_t) apr_memcache_incr(apr_memcache_t *mc,
+ const char *key,
+ apr_int32_t n,
+ apr_uint32_t *nv);
+
+/**
+ * Decrements a value
+ * @param mc client to use
+ * @param key null terminated string containing the key
+ * @param n number to decrement by
+ * @param new_value new value after decrementing
+ */
+APU_DECLARE(apr_status_t) apr_memcache_decr(apr_memcache_t *mc,
+ const char *key,
+ apr_int32_t n,
+ apr_uint32_t *new_value);
+
+/**
+ * Query a server's version
+ * @param ms server to query
+ * @param p Pool to allocate answer from
+ * @param baton location to store server version string
+ * @param len length of the server version string
+ */
+APU_DECLARE(apr_status_t) apr_memcache_version(apr_memcache_server_t *ms,
+ apr_pool_t *p,
+ char **baton);
+
+typedef struct
+{
+ /** Version string of this server */
+ const char *version;
+ /** Process id of this server process */
+ apr_uint32_t pid;
+ /** Number of seconds this server has been running */
+ apr_uint32_t uptime;
+ /** current UNIX time according to the server */
+ apr_time_t time;
+ /** The size of a pointer on the current machine */
+ apr_uint32_t pointer_size;
+ /** Accumulated user time for this process */
+ apr_time_t rusage_user;
+ /** Accumulated system time for this process */
+ apr_time_t rusage_system;
+ /** Current number of items stored by the server */
+ apr_uint32_t curr_items;
+ /** Total number of items stored by this server */
+ apr_uint32_t total_items;
+ /** Current number of bytes used by this server to store items */
+ apr_uint64_t bytes;
+ /** Number of open connections */
+ apr_uint32_t curr_connections;
+ /** Total number of connections opened since the server started running */
+ apr_uint32_t total_connections;
+ /** Number of connection structures allocated by the server */
+ apr_uint32_t connection_structures;
+ /** Cumulative number of retrieval requests */
+ apr_uint32_t cmd_get;
+ /** Cumulative number of storage requests */
+ apr_uint32_t cmd_set;
+ /** Number of keys that have been requested and found present */
+ apr_uint32_t get_hits;
+ /** Number of items that have been requested and not found */
+ apr_uint32_t get_misses;
+ /** Number of items removed from cache because they passed their
+ expiration time */
+ apr_uint64_t evictions;
+ /** Total number of bytes read by this server */
+ apr_uint64_t bytes_read;
+ /** Total number of bytes sent by this server */
+ apr_uint64_t bytes_written;
+ /** Number of bytes this server is allowed to use for storage. */
+ apr_uint32_t limit_maxbytes;
+ /** Number of threads the server is running (if built with threading) */
+ apr_uint32_t threads;
+} apr_memcache_stats_t;
+
+/**
+ * Query a server for statistics
+ * @param ms server to query
+ * @param p Pool to allocate answer from
+ * @param stats location of the new statistics structure
+ */
+APU_DECLARE(apr_status_t) apr_memcache_stats(apr_memcache_server_t *ms,
+ apr_pool_t *p,
+ apr_memcache_stats_t **stats);
+
+
+/** @} */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* APR_MEMCACHE_H */
diff --git a/contrib/apr-util/include/apr_optional.h b/contrib/apr-util/include/apr_optional.h
new file mode 100644
index 000000000000..3301d66e6d9b
--- /dev/null
+++ b/contrib/apr-util/include/apr_optional.h
@@ -0,0 +1,92 @@
+/* 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.
+ */
+
+#ifndef APR_OPTIONAL_H
+#define APR_OPTIONAL_H
+
+#include "apu.h"
+/**
+ * @file apr_optional.h
+ * @brief APR-UTIL registration of functions exported by modules
+ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup APR_Util_Opt Optional Functions
+ * @ingroup APR_Util
+ *
+ * Typesafe registration and retrieval of functions that may not be present
+ * (i.e. functions exported by optional modules)
+ * @{
+ */
+
+/**
+ * The type of an optional function.
+ * @param name The name of the function
+ */
+#define APR_OPTIONAL_FN_TYPE(name) apr_OFN_##name##_t
+
+/**
+ * Declare an optional function.
+ * @param ret The return type of the function
+ * @param name The name of the function
+ * @param args The function arguments (including brackets)
+ */
+#define APR_DECLARE_OPTIONAL_FN(ret,name,args) \
+typedef ret (APR_OPTIONAL_FN_TYPE(name)) args
+
+/**
+ * XXX: This doesn't belong here, then!
+ * Private function! DO NOT USE!
+ * @internal
+ */
+
+typedef void (apr_opt_fn_t)(void);
+/** @internal */
+APU_DECLARE_NONSTD(void) apr_dynamic_fn_register(const char *szName,
+ apr_opt_fn_t *pfn);
+
+/**
+ * Register an optional function. This can be later retrieved, type-safely, by
+ * name. Like all global functions, the name must be unique. Note that,
+ * confusingly but correctly, the function itself can be static!
+ * @param name The name of the function
+ */
+#define APR_REGISTER_OPTIONAL_FN(name) do { \
+ APR_OPTIONAL_FN_TYPE(name) *apu__opt = name; \
+ apr_dynamic_fn_register(#name,(apr_opt_fn_t *)apu__opt); \
+} while (0)
+
+/** @internal
+ * Private function! DO NOT USE!
+ */
+APU_DECLARE(apr_opt_fn_t *) apr_dynamic_fn_retrieve(const char *szName);
+
+/**
+ * Retrieve an optional function. Returns NULL if the function is not present.
+ * @param name The name of the function
+ */
+#define APR_RETRIEVE_OPTIONAL_FN(name) \
+ (APR_OPTIONAL_FN_TYPE(name) *)apr_dynamic_fn_retrieve(#name)
+
+/** @} */
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* APR_OPTIONAL_H */
diff --git a/contrib/apr-util/include/apr_optional_hooks.h b/contrib/apr-util/include/apr_optional_hooks.h
new file mode 100644
index 000000000000..8265f03f38da
--- /dev/null
+++ b/contrib/apr-util/include/apr_optional_hooks.h
@@ -0,0 +1,117 @@
+/* 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.
+ */
+/**
+ * @file apr_optional_hooks.h
+ * @brief Apache optional hook functions
+ */
+
+
+#ifndef APR_OPTIONAL_HOOK_H
+#define APR_OPTIONAL_HOOK_H
+
+#include "apr_tables.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/**
+ * @defgroup APR_Util_OPT_HOOK Optional Hook Functions
+ * @ingroup APR_Util_Hook
+ * @{
+ */
+/**
+ * Function to implement the APR_OPTIONAL_HOOK Macro
+ * @internal
+ * @see APR_OPTIONAL_HOOK
+ *
+ * @param szName The name of the hook
+ * @param pfn A pointer to a function that will be called
+ * @param aszPre a NULL-terminated array of strings that name modules whose hooks should precede this one
+ * @param aszSucc a NULL-terminated array of strings that name modules whose hooks should succeed this one
+ * @param nOrder an integer determining order before honouring aszPre and aszSucc (for example HOOK_MIDDLE)
+ */
+
+
+APU_DECLARE(void) apr_optional_hook_add(const char *szName,void (*pfn)(void),
+ const char * const *aszPre,
+ const char * const *aszSucc,
+ int nOrder);
+
+/**
+ * Hook to an optional hook.
+ *
+ * @param ns The namespace prefix of the hook functions
+ * @param name The name of the hook
+ * @param pfn A pointer to a function that will be called
+ * @param aszPre a NULL-terminated array of strings that name modules whose hooks should precede this one
+ * @param aszSucc a NULL-terminated array of strings that name modules whose hooks should succeed this one
+ * @param nOrder an integer determining order before honouring aszPre and aszSucc (for example HOOK_MIDDLE)
+ */
+
+#define APR_OPTIONAL_HOOK(ns,name,pfn,aszPre,aszSucc,nOrder) do { \
+ ns##_HOOK_##name##_t *apu__hook = pfn; \
+ apr_optional_hook_add(#name,(void (*)(void))apu__hook,aszPre, aszSucc, nOrder); \
+} while (0)
+
+/**
+ * @internal
+ * @param szName - the name of the function
+ * @return the hook structure for a given hook
+ */
+APU_DECLARE(apr_array_header_t *) apr_optional_hook_get(const char *szName);
+
+/**
+ * Implement an optional hook that runs until one of the functions
+ * returns something other than OK or DECLINE.
+ *
+ * @param ns The namespace prefix of the hook functions
+ * @param link The linkage declaration prefix of the hook
+ * @param ret The type of the return value of the hook
+ * @param ret The type of the return value of the hook
+ * @param name The name of the hook
+ * @param args_decl The declaration of the arguments for the hook
+ * @param args_use The names for the arguments for the hook
+ * @param ok Success value
+ * @param decline Decline value
+ */
+#define APR_IMPLEMENT_OPTIONAL_HOOK_RUN_ALL(ns,link,ret,name,args_decl,args_use,ok,decline) \
+link##_DECLARE(ret) ns##_run_##name args_decl \
+ { \
+ ns##_LINK_##name##_t *pHook; \
+ int n; \
+ ret rv; \
+ apr_array_header_t *pHookArray=apr_optional_hook_get(#name); \
+\
+ if(!pHookArray) \
+ return ok; \
+\
+ pHook=(ns##_LINK_##name##_t *)pHookArray->elts; \
+ for(n=0 ; n < pHookArray->nelts ; ++n) \
+ { \
+ rv=(pHook[n].pFunc)args_use; \
+\
+ if(rv != ok && rv != decline) \
+ return rv; \
+ } \
+ return ok; \
+ }
+
+/** @} */
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* APR_OPTIONAL_HOOK_H */
diff --git a/contrib/apr-util/include/apr_queue.h b/contrib/apr-util/include/apr_queue.h
new file mode 100644
index 000000000000..a3a41704862a
--- /dev/null
+++ b/contrib/apr-util/include/apr_queue.h
@@ -0,0 +1,138 @@
+/* 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.
+ */
+
+#ifndef APR_QUEUE_H
+#define APR_QUEUE_H
+
+/**
+ * @file apr_queue.h
+ * @brief Thread Safe FIFO bounded queue
+ * @note Since most implementations of the queue are backed by a condition
+ * variable implementation, it isn't available on systems without threads.
+ * Although condition variables are sometimes available without threads.
+ */
+
+#include "apu.h"
+#include "apr_errno.h"
+#include "apr_pools.h"
+
+#if APR_HAS_THREADS
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @defgroup APR_Util_FIFO Thread Safe FIFO bounded queue
+ * @ingroup APR_Util
+ * @{
+ */
+
+/**
+ * opaque structure
+ */
+typedef struct apr_queue_t apr_queue_t;
+
+/**
+ * create a FIFO queue
+ * @param queue The new queue
+ * @param queue_capacity maximum size of the queue
+ * @param a pool to allocate queue from
+ */
+APU_DECLARE(apr_status_t) apr_queue_create(apr_queue_t **queue,
+ unsigned int queue_capacity,
+ apr_pool_t *a);
+
+/**
+ * push/add an object to the queue, blocking if the queue is already full
+ *
+ * @param queue the queue
+ * @param data the data
+ * @returns APR_EINTR the blocking was interrupted (try again)
+ * @returns APR_EOF the queue has been terminated
+ * @returns APR_SUCCESS on a successful push
+ */
+APU_DECLARE(apr_status_t) apr_queue_push(apr_queue_t *queue, void *data);
+
+/**
+ * pop/get an object from the queue, blocking if the queue is already empty
+ *
+ * @param queue the queue
+ * @param data the data
+ * @returns APR_EINTR the blocking was interrupted (try again)
+ * @returns APR_EOF if the queue has been terminated
+ * @returns APR_SUCCESS on a successful pop
+ */
+APU_DECLARE(apr_status_t) apr_queue_pop(apr_queue_t *queue, void **data);
+
+/**
+ * push/add an object to the queue, returning immediately if the queue is full
+ *
+ * @param queue the queue
+ * @param data the data
+ * @returns APR_EINTR the blocking operation was interrupted (try again)
+ * @returns APR_EAGAIN the queue is full
+ * @returns APR_EOF the queue has been terminated
+ * @returns APR_SUCCESS on a successful push
+ */
+APU_DECLARE(apr_status_t) apr_queue_trypush(apr_queue_t *queue, void *data);
+
+/**
+ * pop/get an object to the queue, returning immediately if the queue is empty
+ *
+ * @param queue the queue
+ * @param data the data
+ * @returns APR_EINTR the blocking operation was interrupted (try again)
+ * @returns APR_EAGAIN the queue is empty
+ * @returns APR_EOF the queue has been terminated
+ * @returns APR_SUCCESS on a successful pop
+ */
+APU_DECLARE(apr_status_t) apr_queue_trypop(apr_queue_t *queue, void **data);
+
+/**
+ * returns the size of the queue.
+ *
+ * @warning this is not threadsafe, and is intended for reporting/monitoring
+ * of the queue.
+ * @param queue the queue
+ * @returns the size of the queue
+ */
+APU_DECLARE(unsigned int) apr_queue_size(apr_queue_t *queue);
+
+/**
+ * interrupt all the threads blocking on this queue.
+ *
+ * @param queue the queue
+ */
+APU_DECLARE(apr_status_t) apr_queue_interrupt_all(apr_queue_t *queue);
+
+/**
+ * terminate the queue, sending an interrupt to all the
+ * blocking threads
+ *
+ * @param queue the queue
+ */
+APU_DECLARE(apr_status_t) apr_queue_term(apr_queue_t *queue);
+
+#ifdef __cplusplus
+}
+#endif
+
+/** @} */
+
+#endif /* APR_HAS_THREADS */
+
+#endif /* APRQUEUE_H */
diff --git a/contrib/apr-util/include/apr_reslist.h b/contrib/apr-util/include/apr_reslist.h
new file mode 100644
index 000000000000..02a8192b99e9
--- /dev/null
+++ b/contrib/apr-util/include/apr_reslist.h
@@ -0,0 +1,183 @@
+/* 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.
+ */
+
+#ifndef APR_RESLIST_H
+#define APR_RESLIST_H
+
+/**
+ * @file apr_reslist.h
+ * @brief APR-UTIL Resource List Routines
+ */
+
+#include "apr.h"
+#include "apu.h"
+#include "apr_pools.h"
+#include "apr_errno.h"
+#include "apr_time.h"
+
+/**
+ * @defgroup APR_Util_RL Resource List Routines
+ * @ingroup APR_Util
+ * @{
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/** Opaque resource list object */
+typedef struct apr_reslist_t apr_reslist_t;
+
+/* Generic constructor called by resource list when it needs to create a
+ * resource.
+ * @param resource opaque resource
+ * @param params flags
+ * @param pool Pool
+ */
+typedef apr_status_t (*apr_reslist_constructor)(void **resource, void *params,
+ apr_pool_t *pool);
+
+/* Generic destructor called by resource list when it needs to destroy a
+ * resource.
+ * @param resource opaque resource
+ * @param params flags
+ * @param pool Pool
+ */
+typedef apr_status_t (*apr_reslist_destructor)(void *resource, void *params,
+ apr_pool_t *pool);
+
+/* Cleanup order modes */
+#define APR_RESLIST_CLEANUP_DEFAULT 0 /**< default pool cleanup */
+#define APR_RESLIST_CLEANUP_FIRST 1 /**< use pool pre cleanup */
+
+/**
+ * Create a new resource list with the following parameters:
+ * @param reslist An address where the pointer to the new resource
+ * list will be stored.
+ * @param min Allowed minimum number of available resources. Zero
+ * creates new resources only when needed.
+ * @param smax Resources will be destroyed during reslist maintenance to
+ * meet this maximum restriction as they expire (reach their ttl).
+ * @param hmax Absolute maximum limit on the number of total resources.
+ * @param ttl If non-zero, sets the maximum amount of time in microseconds an
+ * unused resource is valid. Any resource which has exceeded this
+ * time will be destroyed, either when encountered by
+ * apr_reslist_acquire() or during reslist maintenance.
+ * @param con Constructor routine that is called to create a new resource.
+ * @param de Destructor routine that is called to destroy an expired resource.
+ * @param params Passed to constructor and deconstructor
+ * @param pool The pool from which to create this resource list. Also the
+ * same pool that is passed to the constructor and destructor
+ * routines.
+ * @remark If APR has been compiled without thread support, hmax will be
+ * automatically set to 1 and values of min and smax will be forced to
+ * 1 for any non-zero value.
+ */
+APU_DECLARE(apr_status_t) apr_reslist_create(apr_reslist_t **reslist,
+ int min, int smax, int hmax,
+ apr_interval_time_t ttl,
+ apr_reslist_constructor con,
+ apr_reslist_destructor de,
+ void *params,
+ apr_pool_t *pool);
+
+/**
+ * Destroy the given resource list and all resources controlled by
+ * this list.
+ * FIXME: Should this block until all resources become available,
+ * or maybe just destroy all the free ones, or maybe destroy
+ * them even though they might be in use by something else?
+ * Currently it will abort if there are resources that haven't
+ * been released, so there is an assumption that all resources
+ * have been released to the list before calling this function.
+ * @param reslist The reslist to destroy
+ */
+APU_DECLARE(apr_status_t) apr_reslist_destroy(apr_reslist_t *reslist);
+
+/**
+ * Retrieve a resource from the list, creating a new one if necessary.
+ * If we have met our maximum number of resources, we will block
+ * until one becomes available.
+ * @param reslist The resource list.
+ * @param resource An address where the pointer to the resource
+ * will be stored.
+ */
+APU_DECLARE(apr_status_t) apr_reslist_acquire(apr_reslist_t *reslist,
+ void **resource);
+
+/**
+ * Return a resource back to the list of available resources.
+ * @param reslist The resource list.
+ * @param resource The resource to return to the list.
+ */
+APU_DECLARE(apr_status_t) apr_reslist_release(apr_reslist_t *reslist,
+ void *resource);
+
+/**
+ * Set the timeout the acquire will wait for a free resource
+ * when the maximum number of resources is exceeded.
+ * @param reslist The resource list.
+ * @param timeout Timeout to wait. The zero waits forever.
+ */
+APU_DECLARE(void) apr_reslist_timeout_set(apr_reslist_t *reslist,
+ apr_interval_time_t timeout);
+
+/**
+ * Return the number of outstanding resources.
+ * @param reslist The resource list.
+ */
+APU_DECLARE(apr_uint32_t) apr_reslist_acquired_count(apr_reslist_t *reslist);
+
+/**
+ * Invalidate a resource in the pool - e.g. a database connection
+ * that returns a "lost connection" error and can't be restored.
+ * Use this instead of apr_reslist_release if the resource is bad.
+ * @param reslist The resource list.
+ * @param resource The resource to invalidate.
+ */
+APU_DECLARE(apr_status_t) apr_reslist_invalidate(apr_reslist_t *reslist,
+ void *resource);
+
+/**
+ * Perform routine maintenance on the resource list. This call
+ * may instantiate new resources or expire old resources.
+ * @param reslist The resource list.
+ */
+APU_DECLARE(apr_status_t) apr_reslist_maintain(apr_reslist_t *reslist);
+
+/**
+ * Set reslist cleanup order.
+ * @param reslist The resource list.
+ * @param mode Cleanup order mode
+ * <PRE>
+ * APR_RESLIST_CLEANUP_DEFAULT default pool cleanup order
+ * APR_RESLIST_CLEANUP_FIRST use pool pre cleanup
+ * </PRE>
+ * @remark If APR_RESLIST_CLEANUP_FIRST is used the destructors will
+ * be called before child pools of the pool used to create the reslist
+ * are destroyed. This allows to explicitly destroy the child pools
+ * inside reslist destructors.
+ */
+APU_DECLARE(void) apr_reslist_cleanup_order_set(apr_reslist_t *reslist,
+ apr_uint32_t mode);
+
+#ifdef __cplusplus
+}
+#endif
+
+/** @} */
+
+#endif /* ! APR_RESLIST_H */
diff --git a/contrib/apr-util/include/apr_rmm.h b/contrib/apr-util/include/apr_rmm.h
new file mode 100644
index 000000000000..976fe9c59eb5
--- /dev/null
+++ b/contrib/apr-util/include/apr_rmm.h
@@ -0,0 +1,137 @@
+/* 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.
+ */
+
+#ifndef APR_RMM_H
+#define APR_RMM_H
+/**
+ * @file apr_rmm.h
+ * @brief APR-UTIL Relocatable Memory Management Routines
+ */
+/**
+ * @defgroup APR_Util_RMM Relocatable Memory Management Routines
+ * @ingroup APR_Util
+ * @{
+ */
+
+#include "apr.h"
+#include "apr_pools.h"
+#include "apr_errno.h"
+#include "apu.h"
+#include "apr_anylock.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/** Structure to access Relocatable, Managed Memory */
+typedef struct apr_rmm_t apr_rmm_t;
+
+/** Fundamental allocation unit, within a specific apr_rmm_t */
+typedef apr_size_t apr_rmm_off_t;
+
+/**
+ * Initialize a relocatable memory block to be managed by the apr_rmm API.
+ * @param rmm The relocatable memory block
+ * @param lock An apr_anylock_t of the appropriate type of lock, or NULL
+ * if no locking is required.
+ * @param membuf The block of relocatable memory to be managed
+ * @param memsize The size of relocatable memory block to be managed
+ * @param cont The pool to use for local storage and management
+ * @remark Both @param membuf and @param memsize must be aligned
+ * (for instance using APR_ALIGN_DEFAULT).
+ */
+APU_DECLARE(apr_status_t) apr_rmm_init(apr_rmm_t **rmm, apr_anylock_t *lock,
+ void *membuf, apr_size_t memsize,
+ apr_pool_t *cont);
+
+/**
+ * Destroy a managed memory block.
+ * @param rmm The relocatable memory block to destroy
+ */
+APU_DECLARE(apr_status_t) apr_rmm_destroy(apr_rmm_t *rmm);
+
+/**
+ * Attach to a relocatable memory block already managed by the apr_rmm API.
+ * @param rmm The relocatable memory block
+ * @param lock An apr_anylock_t of the appropriate type of lock
+ * @param membuf The block of relocatable memory already under management
+ * @param cont The pool to use for local storage and management
+ */
+APU_DECLARE(apr_status_t) apr_rmm_attach(apr_rmm_t **rmm, apr_anylock_t *lock,
+ void *membuf, apr_pool_t *cont);
+
+/**
+ * Detach from the managed block of memory.
+ * @param rmm The relocatable memory block to detach from
+ */
+APU_DECLARE(apr_status_t) apr_rmm_detach(apr_rmm_t *rmm);
+
+/**
+ * Allocate memory from the block of relocatable memory.
+ * @param rmm The relocatable memory block
+ * @param reqsize How much memory to allocate
+ */
+APU_DECLARE(apr_rmm_off_t) apr_rmm_malloc(apr_rmm_t *rmm, apr_size_t reqsize);
+
+/**
+ * Realloc memory from the block of relocatable memory.
+ * @param rmm The relocatable memory block
+ * @param entity The memory allocation to realloc
+ * @param reqsize The new size
+ */
+APU_DECLARE(apr_rmm_off_t) apr_rmm_realloc(apr_rmm_t *rmm, void *entity, apr_size_t reqsize);
+
+/**
+ * Allocate memory from the block of relocatable memory and initialize it to zero.
+ * @param rmm The relocatable memory block
+ * @param reqsize How much memory to allocate
+ */
+APU_DECLARE(apr_rmm_off_t) apr_rmm_calloc(apr_rmm_t *rmm, apr_size_t reqsize);
+
+/**
+ * Free allocation returned by apr_rmm_malloc or apr_rmm_calloc.
+ * @param rmm The relocatable memory block
+ * @param entity The memory allocation to free
+ */
+APU_DECLARE(apr_status_t) apr_rmm_free(apr_rmm_t *rmm, apr_rmm_off_t entity);
+
+/**
+ * Retrieve the physical address of a relocatable allocation of memory
+ * @param rmm The relocatable memory block
+ * @param entity The memory allocation to free
+ * @return address The address, aligned with APR_ALIGN_DEFAULT.
+ */
+APU_DECLARE(void *) apr_rmm_addr_get(apr_rmm_t *rmm, apr_rmm_off_t entity);
+
+/**
+ * Compute the offset of a relocatable allocation of memory
+ * @param rmm The relocatable memory block
+ * @param entity The physical address to convert to an offset
+ */
+APU_DECLARE(apr_rmm_off_t) apr_rmm_offset_get(apr_rmm_t *rmm, void *entity);
+
+/**
+ * Compute the required overallocation of memory needed to fit n allocs
+ * @param n The number of alloc/calloc regions desired
+ */
+APU_DECLARE(apr_size_t) apr_rmm_overhead_get(int n);
+
+#ifdef __cplusplus
+}
+#endif
+/** @} */
+#endif /* ! APR_RMM_H */
+
diff --git a/contrib/apr-util/include/apr_sdbm.h b/contrib/apr-util/include/apr_sdbm.h
new file mode 100644
index 000000000000..5759508b143c
--- /dev/null
+++ b/contrib/apr-util/include/apr_sdbm.h
@@ -0,0 +1,176 @@
+/* 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.
+ */
+
+/*
+ * sdbm - ndbm work-alike hashed database library
+ * based on Per-Ake Larson's Dynamic Hashing algorithms. BIT 18 (1978).
+ * author: oz@nexus.yorku.ca
+ * status: ex-public domain
+ */
+
+#ifndef APR_SDBM_H
+#define APR_SDBM_H
+
+#include "apu.h"
+#include "apr_errno.h"
+#include "apr_file_io.h" /* for apr_fileperms_t */
+
+/**
+ * @file apr_sdbm.h
+ * @brief apr-util SDBM library
+ */
+/**
+ * @defgroup APR_Util_DBM_SDBM SDBM library
+ * @ingroup APR_Util_DBM
+ * @{
+ */
+
+/**
+ * Structure for referencing an sdbm
+ */
+typedef struct apr_sdbm_t apr_sdbm_t;
+
+/**
+ * Structure for referencing the datum record within an sdbm
+ */
+typedef struct {
+ /** pointer to the data stored/retrieved */
+ char *dptr;
+ /** size of data */
+ /* apr_ssize_t for release 2.0??? */
+ int dsize;
+} apr_sdbm_datum_t;
+
+/* The extensions used for the database files */
+/** SDBM Directory file extension */
+#define APR_SDBM_DIRFEXT ".dir"
+/** SDBM page file extension */
+#define APR_SDBM_PAGFEXT ".pag"
+
+/* flags to sdbm_store */
+#define APR_SDBM_INSERT 0 /**< Insert */
+#define APR_SDBM_REPLACE 1 /**< Replace */
+#define APR_SDBM_INSERTDUP 2 /**< Insert with duplicates */
+
+/**
+ * Open an sdbm database by file name
+ * @param db The newly opened database
+ * @param name The sdbm file to open
+ * @param mode The flag values (APR_READ and APR_BINARY flags are implicit)
+ * <PRE>
+ * APR_WRITE open for read-write access
+ * APR_CREATE create the sdbm if it does not exist
+ * APR_TRUNCATE empty the contents of the sdbm
+ * APR_EXCL fail for APR_CREATE if the file exists
+ * APR_DELONCLOSE delete the sdbm when closed
+ * APR_SHARELOCK support locking across process/machines
+ * </PRE>
+ * @param perms Permissions to apply to if created
+ * @param p The pool to use when creating the sdbm
+ * @remark The sdbm name is not a true file name, as sdbm appends suffixes
+ * for seperate data and index files.
+ */
+APU_DECLARE(apr_status_t) apr_sdbm_open(apr_sdbm_t **db, const char *name,
+ apr_int32_t mode,
+ apr_fileperms_t perms, apr_pool_t *p);
+
+/**
+ * Close an sdbm file previously opened by apr_sdbm_open
+ * @param db The database to close
+ */
+APU_DECLARE(apr_status_t) apr_sdbm_close(apr_sdbm_t *db);
+
+/**
+ * Lock an sdbm database for concurency of multiple operations
+ * @param db The database to lock
+ * @param type The lock type
+ * <PRE>
+ * APR_FLOCK_SHARED
+ * APR_FLOCK_EXCLUSIVE
+ * </PRE>
+ * @remark Calls to apr_sdbm_lock may be nested. All apr_sdbm functions
+ * perform implicit locking. Since an APR_FLOCK_SHARED lock cannot be
+ * portably promoted to an APR_FLOCK_EXCLUSIVE lock, apr_sdbm_store and
+ * apr_sdbm_delete calls will fail if an APR_FLOCK_SHARED lock is held.
+ * The apr_sdbm_lock call requires the database to be opened with the
+ * APR_SHARELOCK mode value.
+ */
+APU_DECLARE(apr_status_t) apr_sdbm_lock(apr_sdbm_t *db, int type);
+
+/**
+ * Release an sdbm lock previously aquired by apr_sdbm_lock
+ * @param db The database to unlock
+ */
+APU_DECLARE(apr_status_t) apr_sdbm_unlock(apr_sdbm_t *db);
+
+/**
+ * Fetch an sdbm record value by key
+ * @param db The database
+ * @param value The value datum retrieved for this record
+ * @param key The key datum to find this record
+ */
+APU_DECLARE(apr_status_t) apr_sdbm_fetch(apr_sdbm_t *db,
+ apr_sdbm_datum_t *value,
+ apr_sdbm_datum_t key);
+
+/**
+ * Store an sdbm record value by key
+ * @param db The database
+ * @param key The key datum to store this record by
+ * @param value The value datum to store in this record
+ * @param opt The method used to store the record
+ * <PRE>
+ * APR_SDBM_INSERT return an error if the record exists
+ * APR_SDBM_REPLACE overwrite any existing record for key
+ * </PRE>
+ */
+APU_DECLARE(apr_status_t) apr_sdbm_store(apr_sdbm_t *db, apr_sdbm_datum_t key,
+ apr_sdbm_datum_t value, int opt);
+
+/**
+ * Delete an sdbm record value by key
+ * @param db The database
+ * @param key The key datum of the record to delete
+ * @remark It is not an error to delete a non-existent record.
+ */
+APU_DECLARE(apr_status_t) apr_sdbm_delete(apr_sdbm_t *db,
+ const apr_sdbm_datum_t key);
+
+/**
+ * Retrieve the first record key from a dbm
+ * @param db The database
+ * @param key The key datum of the first record
+ * @remark The keys returned are not ordered. To traverse the list of keys
+ * for an sdbm opened with APR_SHARELOCK, the caller must use apr_sdbm_lock
+ * prior to retrieving the first record, and hold the lock until after the
+ * last call to apr_sdbm_nextkey.
+ */
+APU_DECLARE(apr_status_t) apr_sdbm_firstkey(apr_sdbm_t *db, apr_sdbm_datum_t *key);
+
+/**
+ * Retrieve the next record key from an sdbm
+ * @param db The database
+ * @param key The key datum of the next record
+ */
+APU_DECLARE(apr_status_t) apr_sdbm_nextkey(apr_sdbm_t *db, apr_sdbm_datum_t *key);
+
+/**
+ * Returns true if the sdbm database opened for read-only access
+ * @param db The database to test
+ */
+APU_DECLARE(int) apr_sdbm_rdonly(apr_sdbm_t *db);
+/** @} */
+#endif /* APR_SDBM_H */
diff --git a/contrib/apr-util/include/apr_sha1.h b/contrib/apr-util/include/apr_sha1.h
new file mode 100644
index 000000000000..2a4edf368084
--- /dev/null
+++ b/contrib/apr-util/include/apr_sha1.h
@@ -0,0 +1,121 @@
+/* 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.
+ */
+/* NIST Secure Hash Algorithm
+ * heavily modified by Uwe Hollerbach uh@alumni.caltech edu
+ * from Peter C. Gutmann's implementation as found in
+ * Applied Cryptography by Bruce Schneier
+ * This code is hereby placed in the public domain
+ */
+
+#ifndef APR_SHA1_H
+#define APR_SHA1_H
+
+#include "apu.h"
+#include "apr_general.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @file apr_sha1.h
+ * @brief APR-UTIL SHA1 library
+ */
+
+/** size of the SHA1 DIGEST */
+#define APR_SHA1_DIGESTSIZE 20
+
+/**
+ * Define the Magic String prefix that identifies a password as being
+ * hashed using our algorithm.
+ */
+#define APR_SHA1PW_ID "{SHA}"
+
+/** length of the SHA Password */
+#define APR_SHA1PW_IDLEN 5
+
+/** @see apr_sha1_ctx_t */
+typedef struct apr_sha1_ctx_t apr_sha1_ctx_t;
+
+/**
+ * SHA1 context structure
+ */
+struct apr_sha1_ctx_t {
+ /** message digest */
+ apr_uint32_t digest[5];
+ /** 64-bit bit counts */
+ apr_uint32_t count_lo, count_hi;
+ /** SHA data buffer */
+ apr_uint32_t data[16];
+ /** unprocessed amount in data */
+ int local;
+};
+
+/**
+ * Provide a means to SHA1 crypt/encode a plaintext password in a way which
+ * makes password file compatible with those commonly use in netscape web
+ * and ldap installations.
+ * @param clear The plaintext password
+ * @param len The length of the plaintext password
+ * @param out The encrypted/encoded password
+ * @note SHA1 support is useful for migration purposes, but is less
+ * secure than Apache's password format, since Apache's (MD5)
+ * password format uses a random eight character salt to generate
+ * one of many possible hashes for the same password. Netscape
+ * uses plain SHA1 without a salt, so the same password
+ * will always generate the same hash, making it easier
+ * to break since the search space is smaller.
+ */
+APU_DECLARE(void) apr_sha1_base64(const char *clear, int len, char *out);
+
+/**
+ * Initialize the SHA digest
+ * @param context The SHA context to initialize
+ */
+APU_DECLARE(void) apr_sha1_init(apr_sha1_ctx_t *context);
+
+/**
+ * Update the SHA digest
+ * @param context The SHA1 context to update
+ * @param input The buffer to add to the SHA digest
+ * @param inputLen The length of the input buffer
+ */
+APU_DECLARE(void) apr_sha1_update(apr_sha1_ctx_t *context, const char *input,
+ unsigned int inputLen);
+
+/**
+ * Update the SHA digest with binary data
+ * @param context The SHA1 context to update
+ * @param input The buffer to add to the SHA digest
+ * @param inputLen The length of the input buffer
+ */
+APU_DECLARE(void) apr_sha1_update_binary(apr_sha1_ctx_t *context,
+ const unsigned char *input,
+ unsigned int inputLen);
+
+/**
+ * Finish computing the SHA digest
+ * @param digest the output buffer in which to store the digest
+ * @param context The context to finalize
+ */
+APU_DECLARE(void) apr_sha1_final(unsigned char digest[APR_SHA1_DIGESTSIZE],
+ apr_sha1_ctx_t *context);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* APR_SHA1_H */
diff --git a/contrib/apr-util/include/apr_strmatch.h b/contrib/apr-util/include/apr_strmatch.h
new file mode 100644
index 000000000000..53fadad5696d
--- /dev/null
+++ b/contrib/apr-util/include/apr_strmatch.h
@@ -0,0 +1,81 @@
+/* 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.
+ */
+
+#ifndef APR_STRMATCH_H
+#define APR_STRMATCH_H
+/**
+ * @file apr_strmatch.h
+ * @brief APR-UTIL string matching routines
+ */
+
+#include "apu.h"
+#include "apr_pools.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup APR_Util_StrMatch String matching routines
+ * @ingroup APR_Util
+ * @{
+ */
+
+/** @see apr_strmatch_pattern */
+typedef struct apr_strmatch_pattern apr_strmatch_pattern;
+
+/**
+ * Precompiled search pattern
+ */
+struct apr_strmatch_pattern {
+ /** Function called to compare */
+ const char *(*compare)(const apr_strmatch_pattern *this_pattern,
+ const char *s, apr_size_t slen);
+ const char *pattern; /**< Current pattern */
+ apr_size_t length; /**< Current length */
+ void *context; /**< hook to add precomputed metadata */
+};
+
+#if defined(DOXYGEN)
+/**
+ * Search for a precompiled pattern within a string
+ * @param pattern The pattern
+ * @param s The string in which to search for the pattern
+ * @param slen The length of s (excluding null terminator)
+ * @return A pointer to the first instance of the pattern in s, or
+ * NULL if not found
+ */
+APU_DECLARE(const char *) apr_strmatch(const apr_strmatch_pattern *pattern,
+ const char *s, apr_size_t slen);
+#else
+#define apr_strmatch(pattern, s, slen) (*((pattern)->compare))((pattern), (s), (slen))
+#endif
+
+/**
+ * Precompile a pattern for matching using the Boyer-Moore-Horspool algorithm
+ * @param p The pool from which to allocate the pattern
+ * @param s The pattern string
+ * @param case_sensitive Whether the matching should be case-sensitive
+ * @return a pointer to the compiled pattern, or NULL if compilation fails
+ */
+APU_DECLARE(const apr_strmatch_pattern *) apr_strmatch_precompile(apr_pool_t *p, const char *s, int case_sensitive);
+
+/** @} */
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !APR_STRMATCH_H */
diff --git a/contrib/apr-util/include/apr_thread_pool.h b/contrib/apr-util/include/apr_thread_pool.h
new file mode 100644
index 000000000000..cbf382b3da2a
--- /dev/null
+++ b/contrib/apr-util/include/apr_thread_pool.h
@@ -0,0 +1,299 @@
+/*
+ * 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.
+ */
+
+#ifndef APU_THREAD_POOL_H
+#define APU_THREAD_POOL_H
+
+#include "apu.h"
+#include "apr_thread_proc.h"
+
+/**
+ * @file apr_thread_pool.h
+ * @brief APR Thread Pool Library
+
+ * @remarks This library implements a thread pool using apr_thread_t. A thread
+ * pool is a set of threads that can be created in advance or on demand until a
+ * maximum number. When a task is scheduled, the thread pool will find an idle
+ * thread to handle the task. In case all existing threads are busy and the
+ * number of tasks in the queue is higher than the adjustable threshold, the
+ * pool will try to create a new thread to serve the task if the maximum number
+ * has not been reached. Otherwise, the task will be put into a queue based on
+ * priority, which can be valued from 0 to 255, with higher values being served
+ * first. If there are tasks with the same priority, the new task might be put at
+ * the top or at the bottom - it depends on which function is used to put the task.
+ *
+ * @remarks There may be the case where the thread pool can use up to the maximum
+ * number of threads at peak load, but having those threads idle afterwards. A
+ * maximum number of idle threads can be set so that the extra idling threads will
+ * be terminated to save system resources.
+ */
+#if APR_HAS_THREADS
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @defgroup APR_Util_TP Thread Pool routines
+ * @ingroup APR_Util
+ * @{
+ */
+
+/** Opaque Thread Pool structure. */
+typedef struct apr_thread_pool apr_thread_pool_t;
+
+#define APR_THREAD_TASK_PRIORITY_LOWEST 0
+#define APR_THREAD_TASK_PRIORITY_LOW 63
+#define APR_THREAD_TASK_PRIORITY_NORMAL 127
+#define APR_THREAD_TASK_PRIORITY_HIGH 191
+#define APR_THREAD_TASK_PRIORITY_HIGHEST 255
+
+/**
+ * Create a thread pool
+ * @param me The pointer in which to return the newly created apr_thread_pool
+ * object, or NULL if thread pool creation fails.
+ * @param init_threads The number of threads to be created initially, this number
+ * will also be used as the initial value for the maximum number of idle threads.
+ * @param max_threads The maximum number of threads that can be created
+ * @param pool The pool to use
+ * @return APR_SUCCESS if the thread pool was created successfully. Otherwise,
+ * the error code.
+ */
+APU_DECLARE(apr_status_t) apr_thread_pool_create(apr_thread_pool_t **me,
+ apr_size_t init_threads,
+ apr_size_t max_threads,
+ apr_pool_t *pool);
+
+/**
+ * Destroy the thread pool and stop all the threads
+ * @return APR_SUCCESS if all threads are stopped.
+ */
+APU_DECLARE(apr_status_t) apr_thread_pool_destroy(apr_thread_pool_t *me);
+
+/**
+ * Schedule a task to the bottom of the tasks of same priority.
+ * @param me The thread pool
+ * @param func The task function
+ * @param param The parameter for the task function
+ * @param priority The priority of the task.
+ * @param owner Owner of this task.
+ * @return APR_SUCCESS if the task had been scheduled successfully
+ */
+APU_DECLARE(apr_status_t) apr_thread_pool_push(apr_thread_pool_t *me,
+ apr_thread_start_t func,
+ void *param,
+ apr_byte_t priority,
+ void *owner);
+/**
+ * Schedule a task to be run after a delay
+ * @param me The thread pool
+ * @param func The task function
+ * @param param The parameter for the task function
+ * @param time Time in microseconds
+ * @param owner Owner of this task.
+ * @return APR_SUCCESS if the task had been scheduled successfully
+ */
+APU_DECLARE(apr_status_t) apr_thread_pool_schedule(apr_thread_pool_t *me,
+ apr_thread_start_t func,
+ void *param,
+ apr_interval_time_t time,
+ void *owner);
+
+/**
+ * Schedule a task to the top of the tasks of same priority.
+ * @param me The thread pool
+ * @param func The task function
+ * @param param The parameter for the task function
+ * @param priority The priority of the task.
+ * @param owner Owner of this task.
+ * @return APR_SUCCESS if the task had been scheduled successfully
+ */
+APU_DECLARE(apr_status_t) apr_thread_pool_top(apr_thread_pool_t *me,
+ apr_thread_start_t func,
+ void *param,
+ apr_byte_t priority,
+ void *owner);
+
+/**
+ * Cancel tasks submitted by the owner. If there is any task from the owner that
+ * is currently running, the function will spin until the task finished.
+ * @param me The thread pool
+ * @param owner Owner of the task
+ * @return APR_SUCCESS if the task has been cancelled successfully
+ * @note The task function should not be calling cancel, otherwise the function
+ * may get stuck forever. The function assert if it detect such a case.
+ */
+APU_DECLARE(apr_status_t) apr_thread_pool_tasks_cancel(apr_thread_pool_t *me,
+ void *owner);
+
+/**
+ * Get the current number of tasks waiting in the queue
+ * @param me The thread pool
+ * @return Number of tasks in the queue
+ */
+APU_DECLARE(apr_size_t) apr_thread_pool_tasks_count(apr_thread_pool_t *me);
+
+/**
+ * Get the current number of scheduled tasks waiting in the queue
+ * @param me The thread pool
+ * @return Number of scheduled tasks in the queue
+ */
+APU_DECLARE(apr_size_t) apr_thread_pool_scheduled_tasks_count(apr_thread_pool_t *me);
+
+/**
+ * Get the current number of threads
+ * @param me The thread pool
+ * @return Total number of threads
+ */
+APU_DECLARE(apr_size_t) apr_thread_pool_threads_count(apr_thread_pool_t *me);
+
+/**
+ * Get the current number of busy threads
+ * @param me The thread pool
+ * @return Number of busy threads
+ */
+APU_DECLARE(apr_size_t) apr_thread_pool_busy_count(apr_thread_pool_t *me);
+
+/**
+ * Get the current number of idle threads
+ * @param me The thread pool
+ * @return Number of idle threads
+ */
+APU_DECLARE(apr_size_t) apr_thread_pool_idle_count(apr_thread_pool_t *me);
+
+/**
+ * Access function for the maximum number of idle threads. Number of current
+ * idle threads will be reduced to the new limit.
+ * @param me The thread pool
+ * @param cnt The number
+ * @return The number of threads that were stopped.
+ */
+APU_DECLARE(apr_size_t) apr_thread_pool_idle_max_set(apr_thread_pool_t *me,
+ apr_size_t cnt);
+
+/**
+ * Get number of tasks that have run
+ * @param me The thread pool
+ * @return Number of tasks that have run
+ */
+APU_DECLARE(apr_size_t)
+ apr_thread_pool_tasks_run_count(apr_thread_pool_t * me);
+
+/**
+ * Get high water mark of the number of tasks waiting to run
+ * @param me The thread pool
+ * @return High water mark of tasks waiting to run
+ */
+APU_DECLARE(apr_size_t)
+ apr_thread_pool_tasks_high_count(apr_thread_pool_t * me);
+
+/**
+ * Get high water mark of the number of threads
+ * @param me The thread pool
+ * @return High water mark of threads in thread pool
+ */
+APU_DECLARE(apr_size_t)
+ apr_thread_pool_threads_high_count(apr_thread_pool_t * me);
+
+/**
+ * Get the number of idle threads that were destroyed after timing out
+ * @param me The thread pool
+ * @return Number of idle threads that timed out
+ */
+APU_DECLARE(apr_size_t)
+ apr_thread_pool_threads_idle_timeout_count(apr_thread_pool_t * me);
+
+/**
+ * Access function for the maximum number of idle threads
+ * @param me The thread pool
+ * @return The current maximum number
+ */
+APU_DECLARE(apr_size_t) apr_thread_pool_idle_max_get(apr_thread_pool_t *me);
+
+/**
+ * Access function for the maximum number of threads.
+ * @param me The thread pool
+ * @param cnt Number of threads
+ * @return The original maximum number of threads
+ */
+APU_DECLARE(apr_size_t) apr_thread_pool_thread_max_set(apr_thread_pool_t *me,
+ apr_size_t cnt);
+
+/**
+ * Access function for the maximum wait time (in microseconds) of an
+ * idling thread that exceeds the maximum number of idling threads.
+ * A non-zero value allows for the reaping of idling threads to shrink
+ * over time. Which helps reduce thrashing.
+ * @param me The thread pool
+ * @param timeout The number of microseconds an idle thread should wait
+ * till it reaps itself
+ * @return The original maximum wait time
+ */
+APU_DECLARE(apr_interval_time_t)
+ apr_thread_pool_idle_wait_set(apr_thread_pool_t * me,
+ apr_interval_time_t timeout);
+
+/**
+ * Access function for the maximum wait time (in microseconds) of an
+ * idling thread that exceeds the maximum number of idling threads
+ * @param me The thread pool
+ * @return The current maximum wait time
+ */
+APU_DECLARE(apr_interval_time_t)
+ apr_thread_pool_idle_wait_get(apr_thread_pool_t * me);
+
+/**
+ * Access function for the maximum number of threads
+ * @param me The thread pool
+ * @return The current maximum number
+ */
+APU_DECLARE(apr_size_t) apr_thread_pool_thread_max_get(apr_thread_pool_t *me);
+
+/**
+ * Access function for the threshold of tasks in queue to trigger a new thread.
+ * @param me The thread pool
+ * @param cnt The new threshold
+ * @return The original threshold
+ */
+APU_DECLARE(apr_size_t) apr_thread_pool_threshold_set(apr_thread_pool_t *me,
+ apr_size_t val);
+
+/**
+ * Access function for the threshold of tasks in queue to trigger a new thread.
+ * @param me The thread pool
+ * @return The current threshold
+ */
+APU_DECLARE(apr_size_t) apr_thread_pool_threshold_get(apr_thread_pool_t * me);
+
+/**
+ * Get owner of the task currently been executed by the thread.
+ * @param thd The thread is executing a task
+ * @param owner Pointer to receive owner of the task.
+ * @return APR_SUCCESS if the owner is retrieved successfully
+ */
+APU_DECLARE(apr_status_t) apr_thread_pool_task_owner_get(apr_thread_t *thd,
+ void **owner);
+
+/** @} */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* APR_HAS_THREADS */
+#endif /* !APR_THREAD_POOL_H */
diff --git a/contrib/apr-util/include/apr_uri.h b/contrib/apr-util/include/apr_uri.h
new file mode 100644
index 000000000000..02908a9d3bea
--- /dev/null
+++ b/contrib/apr-util/include/apr_uri.h
@@ -0,0 +1,178 @@
+/* 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.
+ */
+
+/*
+ * apr_uri.h: External Interface of apr_uri.c
+ */
+
+/**
+ * @file apr_uri.h
+ * @brief APR-UTIL URI Routines
+ */
+
+#ifndef APR_URI_H
+#define APR_URI_H
+
+#include "apu.h"
+
+#include "apr_network_io.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup APR_Util_URI URI
+ * @ingroup APR_Util
+ * @{
+ */
+
+#define APR_URI_FTP_DEFAULT_PORT 21 /**< default FTP port */
+#define APR_URI_SSH_DEFAULT_PORT 22 /**< default SSH port */
+#define APR_URI_TELNET_DEFAULT_PORT 23 /**< default telnet port */
+#define APR_URI_GOPHER_DEFAULT_PORT 70 /**< default Gopher port */
+#define APR_URI_HTTP_DEFAULT_PORT 80 /**< default HTTP port */
+#define APR_URI_POP_DEFAULT_PORT 110 /**< default POP port */
+#define APR_URI_NNTP_DEFAULT_PORT 119 /**< default NNTP port */
+#define APR_URI_IMAP_DEFAULT_PORT 143 /**< default IMAP port */
+#define APR_URI_PROSPERO_DEFAULT_PORT 191 /**< default Prospero port */
+#define APR_URI_WAIS_DEFAULT_PORT 210 /**< default WAIS port */
+#define APR_URI_LDAP_DEFAULT_PORT 389 /**< default LDAP port */
+#define APR_URI_HTTPS_DEFAULT_PORT 443 /**< default HTTPS port */
+#define APR_URI_RTSP_DEFAULT_PORT 554 /**< default RTSP port */
+#define APR_URI_SNEWS_DEFAULT_PORT 563 /**< default SNEWS port */
+#define APR_URI_ACAP_DEFAULT_PORT 674 /**< default ACAP port */
+#define APR_URI_NFS_DEFAULT_PORT 2049 /**< default NFS port */
+#define APR_URI_TIP_DEFAULT_PORT 3372 /**< default TIP port */
+#define APR_URI_SIP_DEFAULT_PORT 5060 /**< default SIP port */
+
+/** Flags passed to unparse_uri_components(): */
+/** suppress "scheme://user\@site:port" */
+#define APR_URI_UNP_OMITSITEPART (1U<<0)
+/** Just omit user */
+#define APR_URI_UNP_OMITUSER (1U<<1)
+/** Just omit password */
+#define APR_URI_UNP_OMITPASSWORD (1U<<2)
+/** omit "user:password\@" part */
+#define APR_URI_UNP_OMITUSERINFO (APR_URI_UNP_OMITUSER | \
+ APR_URI_UNP_OMITPASSWORD)
+/** Show plain text password (default: show XXXXXXXX) */
+#define APR_URI_UNP_REVEALPASSWORD (1U<<3)
+/** Show "scheme://user\@site:port" only */
+#define APR_URI_UNP_OMITPATHINFO (1U<<4)
+/** Omit the "?queryarg" from the path */
+#define APR_URI_UNP_OMITQUERY (1U<<5)
+
+/** @see apr_uri_t */
+typedef struct apr_uri_t apr_uri_t;
+
+/**
+ * A structure to encompass all of the fields in a uri
+ */
+struct apr_uri_t {
+ /** scheme ("http"/"ftp"/...) */
+ char *scheme;
+ /** combined [user[:password]\@]host[:port] */
+ char *hostinfo;
+ /** user name, as in http://user:passwd\@host:port/ */
+ char *user;
+ /** password, as in http://user:passwd\@host:port/ */
+ char *password;
+ /** hostname from URI (or from Host: header) */
+ char *hostname;
+ /** port string (integer representation is in "port") */
+ char *port_str;
+ /** the request path (or NULL if only scheme://host was given) */
+ char *path;
+ /** Everything after a '?' in the path, if present */
+ char *query;
+ /** Trailing "#fragment" string, if present */
+ char *fragment;
+
+ /** structure returned from gethostbyname() */
+ struct hostent *hostent;
+
+ /** The port number, numeric, valid only if port_str != NULL */
+ apr_port_t port;
+
+ /** has the structure been initialized */
+ unsigned is_initialized:1;
+
+ /** has the DNS been looked up yet */
+ unsigned dns_looked_up:1;
+ /** has the dns been resolved yet */
+ unsigned dns_resolved:1;
+};
+
+/* apr_uri.c */
+/**
+ * Return the default port for a given scheme. The schemes recognized are
+ * http, ftp, https, gopher, wais, nntp, snews, and prospero
+ * @param scheme_str The string that contains the current scheme
+ * @return The default port for this scheme
+ */
+APU_DECLARE(apr_port_t) apr_uri_port_of_scheme(const char *scheme_str);
+
+/**
+ * Unparse a apr_uri_t structure to an URI string. Optionally
+ * suppress the password for security reasons.
+ * @param p The pool to allocate out of
+ * @param uptr All of the parts of the uri
+ * @param flags How to unparse the uri. One of:
+ * <PRE>
+ * APR_URI_UNP_OMITSITEPART Suppress "scheme://user\@site:port"
+ * APR_URI_UNP_OMITUSER Just omit user
+ * APR_URI_UNP_OMITPASSWORD Just omit password
+ * APR_URI_UNP_OMITUSERINFO Omit "user:password\@" part
+ * APR_URI_UNP_REVEALPASSWORD Show plain text password (default: show XXXXXXXX)
+ * APR_URI_UNP_OMITPATHINFO Show "scheme://user\@site:port" only
+ * APR_URI_UNP_OMITQUERY Omit "?queryarg" or "#fragment"
+ * </PRE>
+ * @return The uri as a string
+ */
+APU_DECLARE(char *) apr_uri_unparse(apr_pool_t *p,
+ const apr_uri_t *uptr,
+ unsigned flags);
+
+/**
+ * Parse a given URI, fill in all supplied fields of a apr_uri_t
+ * structure. This eliminates the necessity of extracting host, port,
+ * path, query info repeatedly in the modules.
+ * @param p The pool to allocate out of
+ * @param uri The uri to parse
+ * @param uptr The apr_uri_t to fill out
+ * @return APR_SUCCESS for success or error code
+ */
+APU_DECLARE(apr_status_t) apr_uri_parse(apr_pool_t *p, const char *uri,
+ apr_uri_t *uptr);
+
+/**
+ * Special case for CONNECT parsing: it comes with the hostinfo part only
+ * @param p The pool to allocate out of
+ * @param hostinfo The hostinfo string to parse
+ * @param uptr The apr_uri_t to fill out
+ * @return APR_SUCCESS for success or error code
+ */
+APU_DECLARE(apr_status_t) apr_uri_parse_hostinfo(apr_pool_t *p,
+ const char *hostinfo,
+ apr_uri_t *uptr);
+
+/** @} */
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* APR_URI_H */
diff --git a/contrib/apr-util/include/apr_uuid.h b/contrib/apr-util/include/apr_uuid.h
new file mode 100644
index 000000000000..5312a9f62acd
--- /dev/null
+++ b/contrib/apr-util/include/apr_uuid.h
@@ -0,0 +1,76 @@
+/* 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.
+ */
+
+/**
+ * @file apr_uuid.h
+ * @brief APR UUID library
+ */
+#ifndef APR_UUID_H
+#define APR_UUID_H
+
+#include "apu.h"
+#include "apr_errno.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @defgroup APR_UUID UUID Handling
+ * @ingroup APR
+ * @{
+ */
+
+/**
+ * we represent a UUID as a block of 16 bytes.
+ */
+
+typedef struct {
+ unsigned char data[16]; /**< the actual UUID */
+} apr_uuid_t;
+
+/** UUIDs are formatted as: 00112233-4455-6677-8899-AABBCCDDEEFF */
+#define APR_UUID_FORMATTED_LENGTH 36
+
+
+/**
+ * Generate and return a (new) UUID
+ * @param uuid The resulting UUID
+ */
+APU_DECLARE(void) apr_uuid_get(apr_uuid_t *uuid);
+
+/**
+ * Format a UUID into a string, following the standard format
+ * @param buffer The buffer to place the formatted UUID string into. It must
+ * be at least APR_UUID_FORMATTED_LENGTH + 1 bytes long to hold
+ * the formatted UUID and a null terminator
+ * @param uuid The UUID to format
+ */
+APU_DECLARE(void) apr_uuid_format(char *buffer, const apr_uuid_t *uuid);
+
+/**
+ * Parse a standard-format string into a UUID
+ * @param uuid The resulting UUID
+ * @param uuid_str The formatted UUID
+ */
+APU_DECLARE(apr_status_t) apr_uuid_parse(apr_uuid_t *uuid, const char *uuid_str);
+
+/** @} */
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* APR_UUID_H */
diff --git a/contrib/apr-util/include/apr_xlate.h b/contrib/apr-util/include/apr_xlate.h
new file mode 100644
index 000000000000..326366853a4f
--- /dev/null
+++ b/contrib/apr-util/include/apr_xlate.h
@@ -0,0 +1,163 @@
+/* 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.
+ */
+
+#ifndef APR_XLATE_H
+#define APR_XLATE_H
+
+#include "apu.h"
+#include "apr_pools.h"
+#include "apr_errno.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @file apr_xlate.h
+ * @brief APR I18N translation library
+ */
+
+/**
+ * @defgroup APR_XLATE I18N translation library
+ * @ingroup APR
+ * @{
+ */
+/** Opaque translation buffer */
+typedef struct apr_xlate_t apr_xlate_t;
+
+/**
+ * Set up for converting text from one charset to another.
+ * @param convset The handle to be filled in by this function
+ * @param topage The name of the target charset
+ * @param frompage The name of the source charset
+ * @param pool The pool to use
+ * @remark
+ * Specify APR_DEFAULT_CHARSET for one of the charset
+ * names to indicate the charset of the source code at
+ * compile time. This is useful if there are literal
+ * strings in the source code which must be translated
+ * according to the charset of the source code.
+ * APR_DEFAULT_CHARSET is not useful if the source code
+ * of the caller was not encoded in the same charset as
+ * APR at compile time.
+ *
+ * @remark
+ * Specify APR_LOCALE_CHARSET for one of the charset
+ * names to indicate the charset of the current locale.
+ *
+ * @remark
+ * Return APR_EINVAL if unable to procure a convset, or APR_ENOTIMPL
+ * if charset transcoding is not available in this instance of
+ * apr-util at all (i.e., APR_HAS_XLATE is undefined).
+ */
+APU_DECLARE(apr_status_t) apr_xlate_open(apr_xlate_t **convset,
+ const char *topage,
+ const char *frompage,
+ apr_pool_t *pool);
+
+/**
+ * This is to indicate the charset of the sourcecode at compile time
+ * names to indicate the charset of the source code at
+ * compile time. This is useful if there are literal
+ * strings in the source code which must be translated
+ * according to the charset of the source code.
+ */
+#define APR_DEFAULT_CHARSET (const char *)0
+/**
+ * To indicate charset names of the current locale
+ */
+#define APR_LOCALE_CHARSET (const char *)1
+
+/**
+ * Find out whether or not the specified conversion is single-byte-only.
+ * @param convset The handle allocated by apr_xlate_open, specifying the
+ * parameters of conversion
+ * @param onoff Output: whether or not the conversion is single-byte-only
+ * @remark
+ * Return APR_ENOTIMPL if charset transcoding is not available
+ * in this instance of apr-util (i.e., APR_HAS_XLATE is undefined).
+ */
+APU_DECLARE(apr_status_t) apr_xlate_sb_get(apr_xlate_t *convset, int *onoff);
+
+/**
+ * Convert a buffer of text from one codepage to another.
+ * @param convset The handle allocated by apr_xlate_open, specifying
+ * the parameters of conversion
+ * @param inbuf The address of the source buffer
+ * @param inbytes_left Input: the amount of input data to be translated
+ * Output: the amount of input data not yet translated
+ * @param outbuf The address of the destination buffer
+ * @param outbytes_left Input: the size of the output buffer
+ * Output: the amount of the output buffer not yet used
+ * @remark
+ * Returns APR_ENOTIMPL if charset transcoding is not available
+ * in this instance of apr-util (i.e., APR_HAS_XLATE is undefined).
+ * Returns APR_INCOMPLETE if the input buffer ends in an incomplete
+ * multi-byte character.
+ *
+ * To correctly terminate the output buffer for some multi-byte
+ * character set encodings, a final call must be made to this function
+ * after the complete input string has been converted, passing
+ * the inbuf and inbytes_left parameters as NULL. (Note that this
+ * mode only works from version 1.1.0 onwards)
+ */
+APU_DECLARE(apr_status_t) apr_xlate_conv_buffer(apr_xlate_t *convset,
+ const char *inbuf,
+ apr_size_t *inbytes_left,
+ char *outbuf,
+ apr_size_t *outbytes_left);
+
+/* @see apr_file_io.h the comment in apr_file_io.h about this hack */
+#ifdef APR_NOT_DONE_YET
+/**
+ * The purpose of apr_xlate_conv_char is to translate one character
+ * at a time. This needs to be written carefully so that it works
+ * with double-byte character sets.
+ * @param convset The handle allocated by apr_xlate_open, specifying the
+ * parameters of conversion
+ * @param inchar The character to convert
+ * @param outchar The converted character
+ */
+APU_DECLARE(apr_status_t) apr_xlate_conv_char(apr_xlate_t *convset,
+ char inchar, char outchar);
+#endif
+
+/**
+ * Convert a single-byte character from one charset to another.
+ * @param convset The handle allocated by apr_xlate_open, specifying the
+ * parameters of conversion
+ * @param inchar The single-byte character to convert.
+ * @warning This only works when converting between single-byte character sets.
+ * -1 will be returned if the conversion can't be performed.
+ */
+APU_DECLARE(apr_int32_t) apr_xlate_conv_byte(apr_xlate_t *convset,
+ unsigned char inchar);
+
+/**
+ * Close a codepage translation handle.
+ * @param convset The codepage translation handle to close
+ * @remark
+ * Return APR_ENOTIMPL if charset transcoding is not available
+ * in this instance of apr-util (i.e., APR_HAS_XLATE is undefined).
+ */
+APU_DECLARE(apr_status_t) apr_xlate_close(apr_xlate_t *convset);
+
+/** @} */
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ! APR_XLATE_H */
diff --git a/contrib/apr-util/include/apr_xml.h b/contrib/apr-util/include/apr_xml.h
new file mode 100644
index 000000000000..ac7f003b42df
--- /dev/null
+++ b/contrib/apr-util/include/apr_xml.h
@@ -0,0 +1,356 @@
+/* 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.
+ */
+/**
+ * @file apr_xml.h
+ * @brief APR-UTIL XML Library
+ */
+#ifndef APR_XML_H
+#define APR_XML_H
+
+/**
+ * @defgroup APR_Util_XML XML
+ * @ingroup APR_Util
+ * @{
+ */
+#include "apr_pools.h"
+#include "apr_tables.h"
+#include "apr_file_io.h"
+
+#include "apu.h"
+#if APR_CHARSET_EBCDIC
+#include "apr_xlate.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @package Apache XML library
+ */
+
+/* -------------------------------------------------------------------- */
+
+/* ### these will need to move at some point to a more logical spot */
+
+/** @see apr_text */
+typedef struct apr_text apr_text;
+
+/** Structure to keep a linked list of pieces of text */
+struct apr_text {
+ /** The current piece of text */
+ const char *text;
+ /** a pointer to the next piece of text */
+ struct apr_text *next;
+};
+
+/** @see apr_text_header */
+typedef struct apr_text_header apr_text_header;
+
+/** A list of pieces of text */
+struct apr_text_header {
+ /** The first piece of text in the list */
+ apr_text *first;
+ /** The last piece of text in the list */
+ apr_text *last;
+};
+
+/**
+ * Append a piece of text to the end of a list
+ * @param p The pool to allocate out of
+ * @param hdr The text header to append to
+ * @param text The new text to append
+ */
+APU_DECLARE(void) apr_text_append(apr_pool_t *p, apr_text_header *hdr,
+ const char *text);
+
+
+/* --------------------------------------------------------------------
+**
+** XML PARSING
+*/
+
+/*
+** Qualified namespace values
+**
+** APR_XML_NS_DAV_ID
+** We always insert the "DAV:" namespace URI at the head of the
+** namespace array. This means that it will always be at ID==0,
+** making it much easier to test for.
+**
+** APR_XML_NS_NONE
+** This special ID is used for two situations:
+**
+** 1) The namespace prefix begins with "xml" (and we do not know
+** what it means). Namespace prefixes with "xml" (any case) as
+** their first three characters are reserved by the XML Namespaces
+** specification for future use. mod_dav will pass these through
+** unchanged. When this identifier is used, the prefix is LEFT in
+** the element/attribute name. Downstream processing should not
+** prepend another prefix.
+**
+** 2) The element/attribute does not have a namespace.
+**
+** a) No prefix was used, and a default namespace has not been
+** defined.
+** b) No prefix was used, and the default namespace was specified
+** to mean "no namespace". This is done with a namespace
+** declaration of: xmlns=""
+** (this declaration is typically used to override a previous
+** specification for the default namespace)
+**
+** In these cases, we need to record that the elem/attr has no
+** namespace so that we will not attempt to prepend a prefix.
+** All namespaces that are used will have a prefix assigned to
+** them -- mod_dav will never set or use the default namespace
+** when generating XML. This means that "no prefix" will always
+** mean "no namespace".
+**
+** In both cases, the XML generation will avoid prepending a prefix.
+** For the first case, this means the original prefix/name will be
+** inserted into the output stream. For the latter case, it means
+** the name will have no prefix, and since we never define a default
+** namespace, this means it will have no namespace.
+**
+** Note: currently, mod_dav understands the "xmlns" prefix and the
+** "xml:lang" attribute. These are handled specially (they aren't
+** left within the XML tree), so the APR_XML_NS_NONE value won't ever
+** really apply to these values.
+*/
+#define APR_XML_NS_DAV_ID 0 /**< namespace ID for "DAV:" */
+#define APR_XML_NS_NONE -10 /**< no namespace for this elem/attr */
+
+#define APR_XML_NS_ERROR_BASE -100 /**< used only during processing */
+/** Is this namespace an error? */
+#define APR_XML_NS_IS_ERROR(e) ((e) <= APR_XML_NS_ERROR_BASE)
+
+/** @see apr_xml_attr */
+typedef struct apr_xml_attr apr_xml_attr;
+/** @see apr_xml_elem */
+typedef struct apr_xml_elem apr_xml_elem;
+/** @see apr_xml_doc */
+typedef struct apr_xml_doc apr_xml_doc;
+
+/** apr_xml_attr: holds a parsed XML attribute */
+struct apr_xml_attr {
+ /** attribute name */
+ const char *name;
+ /** index into namespace array */
+ int ns;
+
+ /** attribute value */
+ const char *value;
+
+ /** next attribute */
+ struct apr_xml_attr *next;
+};
+
+/** apr_xml_elem: holds a parsed XML element */
+struct apr_xml_elem {
+ /** element name */
+ const char *name;
+ /** index into namespace array */
+ int ns;
+ /** xml:lang for attrs/contents */
+ const char *lang;
+
+ /** cdata right after start tag */
+ apr_text_header first_cdata;
+ /** cdata after MY end tag */
+ apr_text_header following_cdata;
+
+ /** parent element */
+ struct apr_xml_elem *parent;
+ /** next (sibling) element */
+ struct apr_xml_elem *next;
+ /** first child element */
+ struct apr_xml_elem *first_child;
+ /** first attribute */
+ struct apr_xml_attr *attr;
+
+ /* used only during parsing */
+ /** last child element */
+ struct apr_xml_elem *last_child;
+ /** namespaces scoped by this elem */
+ struct apr_xml_ns_scope *ns_scope;
+
+ /* used by modules during request processing */
+ /** Place for modules to store private data */
+ void *priv;
+};
+
+/** Is this XML element empty? */
+#define APR_XML_ELEM_IS_EMPTY(e) ((e)->first_child == NULL && \
+ (e)->first_cdata.first == NULL)
+
+/** apr_xml_doc: holds a parsed XML document */
+struct apr_xml_doc {
+ /** root element */
+ apr_xml_elem *root;
+ /** array of namespaces used */
+ apr_array_header_t *namespaces;
+};
+
+/** Opaque XML parser structure */
+typedef struct apr_xml_parser apr_xml_parser;
+
+/**
+ * Create an XML parser
+ * @param pool The pool for allocating the parser and the parse results.
+ * @return The new parser.
+ */
+APU_DECLARE(apr_xml_parser *) apr_xml_parser_create(apr_pool_t *pool);
+
+/**
+ * Parse a File, producing a xml_doc
+ * @param p The pool for allocating the parse results.
+ * @param parser A pointer to *parser (needed so calling function can get
+ * errors), will be set to NULL on successful completion.
+ * @param ppdoc A pointer to *apr_xml_doc (which has the parsed results in it)
+ * @param xmlfd A file to read from.
+ * @param buffer_length Buffer length which would be suitable
+ * @return Any errors found during parsing.
+ */
+APU_DECLARE(apr_status_t) apr_xml_parse_file(apr_pool_t *p,
+ apr_xml_parser **parser,
+ apr_xml_doc **ppdoc,
+ apr_file_t *xmlfd,
+ apr_size_t buffer_length);
+
+
+/**
+ * Feed input into the parser
+ * @param parser The XML parser for parsing this data.
+ * @param data The data to parse.
+ * @param len The length of the data.
+ * @return Any errors found during parsing.
+ * @remark Use apr_xml_parser_geterror() to get more error information.
+ */
+APU_DECLARE(apr_status_t) apr_xml_parser_feed(apr_xml_parser *parser,
+ const char *data,
+ apr_size_t len);
+
+/**
+ * Terminate the parsing and return the result
+ * @param parser The XML parser for parsing this data.
+ * @param pdoc The resulting parse information. May be NULL to simply
+ * terminate the parsing without fetching the info.
+ * @return Any errors found during the final stage of parsing.
+ * @remark Use apr_xml_parser_geterror() to get more error information.
+ */
+APU_DECLARE(apr_status_t) apr_xml_parser_done(apr_xml_parser *parser,
+ apr_xml_doc **pdoc);
+
+/**
+ * Fetch additional error information from the parser.
+ * @param parser The XML parser to query for errors.
+ * @param errbuf A buffer for storing error text.
+ * @param errbufsize The length of the error text buffer.
+ * @return The error buffer
+ */
+APU_DECLARE(char *) apr_xml_parser_geterror(apr_xml_parser *parser,
+ char *errbuf,
+ apr_size_t errbufsize);
+
+
+/**
+ * Converts an XML element tree to flat text
+ * @param p The pool to allocate out of
+ * @param elem The XML element to convert
+ * @param style How to covert the XML. One of:
+ * <PRE>
+ * APR_XML_X2T_FULL start tag, contents, end tag
+ * APR_XML_X2T_INNER contents only
+ * APR_XML_X2T_LANG_INNER xml:lang + inner contents
+ * APR_XML_X2T_FULL_NS_LANG FULL + ns defns + xml:lang
+ * </PRE>
+ * @param namespaces The namespace of the current XML element
+ * @param ns_map Namespace mapping
+ * @param pbuf Buffer to put the converted text into
+ * @param psize Size of the converted text
+ */
+APU_DECLARE(void) apr_xml_to_text(apr_pool_t *p, const apr_xml_elem *elem,
+ int style, apr_array_header_t *namespaces,
+ int *ns_map, const char **pbuf,
+ apr_size_t *psize);
+
+/* style argument values: */
+#define APR_XML_X2T_FULL 0 /**< start tag, contents, end tag */
+#define APR_XML_X2T_INNER 1 /**< contents only */
+#define APR_XML_X2T_LANG_INNER 2 /**< xml:lang + inner contents */
+#define APR_XML_X2T_FULL_NS_LANG 3 /**< FULL + ns defns + xml:lang */
+
+/**
+ * empty XML element
+ * @param p The pool to allocate out of
+ * @param elem The XML element to empty
+ * @return the string that was stored in the XML element
+ */
+APU_DECLARE(const char *) apr_xml_empty_elem(apr_pool_t *p,
+ const apr_xml_elem *elem);
+
+/**
+ * quote an XML string
+ * Replace '\<', '\>', and '\&' with '\&lt;', '\&gt;', and '\&amp;'.
+ * @param p The pool to allocate out of
+ * @param s The string to quote
+ * @param quotes If quotes is true, then replace '&quot;' with '\&quot;'.
+ * @return The quoted string
+ * @note If the string does not contain special characters, it is not
+ * duplicated into the pool and the original string is returned.
+ */
+APU_DECLARE(const char *) apr_xml_quote_string(apr_pool_t *p, const char *s,
+ int quotes);
+
+/**
+ * Quote an XML element
+ * @param p The pool to allocate out of
+ * @param elem The element to quote
+ */
+APU_DECLARE(void) apr_xml_quote_elem(apr_pool_t *p, apr_xml_elem *elem);
+
+/* manage an array of unique URIs: apr_xml_insert_uri() and APR_XML_URI_ITEM() */
+
+/**
+ * return the URI's (existing) index, or insert it and return a new index
+ * @param uri_array array to insert into
+ * @param uri The uri to insert
+ * @return int The uri's index
+ */
+APU_DECLARE(int) apr_xml_insert_uri(apr_array_header_t *uri_array,
+ const char *uri);
+
+/** Get the URI item for this XML element */
+#define APR_XML_GET_URI_ITEM(ary, i) (((const char * const *)(ary)->elts)[i])
+
+#if APR_CHARSET_EBCDIC
+/**
+ * Convert parsed tree in EBCDIC
+ * @param p The pool to allocate out of
+ * @param pdoc The apr_xml_doc to convert.
+ * @param xlate The translation handle to use.
+ * @return Any errors found during conversion.
+ */
+APU_DECLARE(apr_status_t) apr_xml_parser_convert_doc(apr_pool_t *p,
+ apr_xml_doc *pdoc,
+ apr_xlate_t *convset);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+/** @} */
+#endif /* APR_XML_H */
diff --git a/contrib/apr-util/include/apu.h.in b/contrib/apr-util/include/apu.h.in
new file mode 100644
index 000000000000..82380cc21bd5
--- /dev/null
+++ b/contrib/apr-util/include/apu.h.in
@@ -0,0 +1,128 @@
+/* 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.
+ */
+
+/*
+ * apu.h is generated from apu.h.in by configure -- do not edit apu.h
+ */
+/* @file apu.h
+ * @brief APR-Utility main file
+ */
+/**
+ * @defgroup APR_Util APR Utility Functions
+ * @{
+ */
+
+
+#ifndef APU_H
+#define APU_H
+
+/**
+ * APU_DECLARE_EXPORT is defined when building the APR-UTIL dynamic library,
+ * so that all public symbols are exported.
+ *
+ * APU_DECLARE_STATIC is defined when including the APR-UTIL public headers,
+ * to provide static linkage when the dynamic library may be unavailable.
+ *
+ * APU_DECLARE_STATIC and APU_DECLARE_EXPORT are left undefined when
+ * including the APR-UTIL public headers, to import and link the symbols from
+ * the dynamic APR-UTIL library and assure appropriate indirection and calling
+ * conventions at compile time.
+ */
+
+#if defined(DOXYGEN) || !defined(WIN32)
+/**
+ * The public APR-UTIL functions are declared with APU_DECLARE(), so they may
+ * use the most appropriate calling convention. Public APR functions with
+ * variable arguments must use APU_DECLARE_NONSTD().
+ *
+ * @fn APU_DECLARE(rettype) apr_func(args);
+ */
+#define APU_DECLARE(type) type
+/**
+ * The public APR-UTIL functions using variable arguments are declared with
+ * APU_DECLARE_NONSTD(), as they must use the C language calling convention.
+ *
+ * @fn APU_DECLARE_NONSTD(rettype) apr_func(args, ...);
+ */
+#define APU_DECLARE_NONSTD(type) type
+/**
+ * The public APR-UTIL variables are declared with APU_DECLARE_DATA.
+ * This assures the appropriate indirection is invoked at compile time.
+ *
+ * @fn APU_DECLARE_DATA type apr_variable;
+ * @note APU_DECLARE_DATA extern type apr_variable; syntax is required for
+ * declarations within headers to properly import the variable.
+ */
+#define APU_DECLARE_DATA
+#elif defined(APU_DECLARE_STATIC)
+#define APU_DECLARE(type) type __stdcall
+#define APU_DECLARE_NONSTD(type) type __cdecl
+#define APU_DECLARE_DATA
+#elif defined(APU_DECLARE_EXPORT)
+#define APU_DECLARE(type) __declspec(dllexport) type __stdcall
+#define APU_DECLARE_NONSTD(type) __declspec(dllexport) type __cdecl
+#define APU_DECLARE_DATA __declspec(dllexport)
+#else
+#define APU_DECLARE(type) __declspec(dllimport) type __stdcall
+#define APU_DECLARE_NONSTD(type) __declspec(dllimport) type __cdecl
+#define APU_DECLARE_DATA __declspec(dllimport)
+#endif
+
+#if !defined(WIN32) || defined(APU_MODULE_DECLARE_STATIC)
+/**
+ * Declare a dso module's exported module structure as APU_MODULE_DECLARE_DATA.
+ *
+ * Unless APU_MODULE_DECLARE_STATIC is defined at compile time, symbols
+ * declared with APU_MODULE_DECLARE_DATA are always exported.
+ * @code
+ * module APU_MODULE_DECLARE_DATA mod_tag
+ * @endcode
+ */
+#define APU_MODULE_DECLARE_DATA
+#else
+#define APU_MODULE_DECLARE_DATA __declspec(dllexport)
+#endif
+
+/*
+ * we always have SDBM (it's in our codebase)
+ */
+#define APU_HAVE_SDBM @apu_have_sdbm@
+#define APU_HAVE_GDBM @apu_have_gdbm@
+#define APU_HAVE_NDBM @apu_have_ndbm@
+#define APU_HAVE_DB @apu_have_db@
+
+#if APU_HAVE_DB
+#define APU_HAVE_DB_VERSION @apu_db_version@
+#endif
+
+#define APU_HAVE_PGSQL @apu_have_pgsql@
+#define APU_HAVE_MYSQL @apu_have_mysql@
+#define APU_HAVE_SQLITE3 @apu_have_sqlite3@
+#define APU_HAVE_SQLITE2 @apu_have_sqlite2@
+#define APU_HAVE_ORACLE @apu_have_oracle@
+#define APU_HAVE_FREETDS @apu_have_freetds@
+#define APU_HAVE_ODBC @apu_have_odbc@
+
+#define APU_HAVE_CRYPTO @apu_have_crypto@
+#define APU_HAVE_OPENSSL @apu_have_openssl@
+#define APU_HAVE_NSS @apu_have_nss@
+
+#define APU_HAVE_APR_ICONV @have_apr_iconv@
+#define APU_HAVE_ICONV @have_iconv@
+#define APR_HAS_XLATE (APU_HAVE_APR_ICONV || APU_HAVE_ICONV)
+
+#endif /* APU_H */
+/** @} */
diff --git a/contrib/apr-util/include/apu.hnw b/contrib/apr-util/include/apu.hnw
new file mode 100644
index 000000000000..31c0dfb41553
--- /dev/null
+++ b/contrib/apr-util/include/apu.hnw
@@ -0,0 +1,124 @@
+/* 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.
+ */
+
+/*
+ * Note: This is a NetWare specific version of apu.h. It is renamed to
+ * apu.h at the start of a NetWare build.
+ */
+/* @file apu.h
+ * @brief APR-Utility main file
+ */
+
+#ifdef NETWARE
+#ifndef APU_H
+#define APU_H
+/**
+ * @defgroup APR_Util APR Utility Functions
+ * @{
+ */
+
+
+/**
+ * APU_DECLARE_EXPORT is defined when building the APR-UTIL dynamic library,
+ * so that all public symbols are exported.
+ *
+ * APU_DECLARE_STATIC is defined when including the APR-UTIL public headers,
+ * to provide static linkage when the dynamic library may be unavailable.
+ *
+ * APU_DECLARE_STATIC and APU_DECLARE_EXPORT are left undefined when
+ * including the APR-UTIL public headers, to import and link the symbols from
+ * the dynamic APR-UTIL library and assure appropriate indirection and calling
+ * conventions at compile time.
+ */
+
+/**
+ * The public APR-UTIL functions are declared with APU_DECLARE(), so they may
+ * use the most appropriate calling convention. Public APR functions with
+ * variable arguments must use APU_DECLARE_NONSTD().
+ *
+ * @fn APU_DECLARE(rettype) apr_func(args);
+ */
+#define APU_DECLARE(type) type
+/**
+ * The public APR-UTIL functions using variable arguments are declared with
+ * APU_DECLARE_NONSTD(), as they must use the C language calling convention.
+ *
+ * @fn APU_DECLARE_NONSTD(rettype) apr_func(args, ...);
+ */
+#define APU_DECLARE_NONSTD(type) type
+/**
+ * The public APR-UTIL variables are declared with APU_DECLARE_DATA.
+ * This assures the appropriate indirection is invoked at compile time.
+ *
+ * @fn APU_DECLARE_DATA type apr_variable;
+ * @note APU_DECLARE_DATA extern type apr_variable; syntax is required for
+ * declarations within headers to properly import the variable.
+ */
+#define APU_DECLARE_DATA
+
+/**
+ * Declare a dso module's exported module structure as APU_MODULE_DECLARE_DATA.
+ *
+ * Unless APU_MODULE_DECLARE_STATIC is defined at compile time, symbols
+ * declared with APU_MODULE_DECLARE_DATA are always exported.
+ * @code
+ * module APU_MODULE_DECLARE_DATA mod_tag
+ * @endcode
+ */
+#define APU_MODULE_DECLARE_DATA
+
+/*
+ * we always have SDBM (it's in our codebase)
+ */
+#define APU_HAVE_SDBM 1
+
+#ifndef APU_DSO_MODULE_BUILD
+#define APU_HAVE_GDBM 0
+#define APU_HAVE_NDBM 0
+#define APU_HAVE_DB 0
+
+#if APU_HAVE_DB
+#define APU_HAVE_DB_VERSION 0
+#endif
+#endif
+
+/*
+ * we always enable dynamic driver loads within apr_dbd
+ */
+#ifndef APU_DSO_MODULE_BUILD
+#define APU_HAVE_PGSQL 0
+#define APU_HAVE_MYSQL 0
+#define APU_HAVE_SQLITE3 0
+#define APU_HAVE_SQLITE2 0
+#define APU_HAVE_ORACLE 0
+#define APU_HAVE_FREETDS 0
+#define APU_HAVE_ODBC 0
+#endif
+
+#define APU_HAVE_CRYPTO 0
+
+#ifndef APU_DSO_MODULE_BUILD
+#define APU_HAVE_OPENSSL 0
+#define APU_HAVE_NSS 0
+#endif
+
+#define APU_HAVE_APR_ICONV 0
+#define APU_HAVE_ICONV 1
+#define APR_HAS_XLATE (APU_HAVE_APR_ICONV || APU_HAVE_ICONV)
+
+#endif /* APU_H */
+#endif /* NETWARE */
+
diff --git a/contrib/apr-util/include/apu.hw b/contrib/apr-util/include/apu.hw
new file mode 100644
index 000000000000..a6cde01a3a84
--- /dev/null
+++ b/contrib/apr-util/include/apu.hw
@@ -0,0 +1,146 @@
+/* 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.
+ */
+
+/*
+ * apu.h is duplicated from apu.hw at build time -- do not edit apu.h
+ */
+/* @file apu.h
+ * @brief APR-Utility main file
+ */
+/**
+ * @defgroup APR_Util APR Utility Functions
+ * @{
+ */
+
+
+#ifndef APU_H
+#define APU_H
+
+/**
+ * APU_DECLARE_EXPORT is defined when building the APR-UTIL dynamic library,
+ * so that all public symbols are exported.
+ *
+ * APU_DECLARE_STATIC is defined when including the APR-UTIL public headers,
+ * to provide static linkage when the dynamic library may be unavailable.
+ *
+ * APU_DECLARE_STATIC and APU_DECLARE_EXPORT are left undefined when
+ * including the APR-UTIL public headers, to import and link the symbols from
+ * the dynamic APR-UTIL library and assure appropriate indirection and calling
+ * conventions at compile time.
+ */
+
+/* Make sure we have our platform identifier macro defined we ask for later.
+ */
+#if defined(_WIN32) && !defined(WIN32)
+#define WIN32 1
+#endif
+
+#if defined(DOXYGEN) || !defined(WIN32)
+/**
+ * The public APR-UTIL functions are declared with APU_DECLARE(), so they may
+ * use the most appropriate calling convention. Public APR functions with
+ * variable arguments must use APU_DECLARE_NONSTD().
+ *
+ * @fn APU_DECLARE(rettype) apr_func(args);
+ */
+#define APU_DECLARE(type) type
+/**
+ * The public APR-UTIL functions using variable arguments are declared with
+ * APU_DECLARE_NONSTD(), as they must use the C language calling convention.
+ *
+ * @fn APU_DECLARE_NONSTD(rettype) apr_func(args, ...);
+ */
+#define APU_DECLARE_NONSTD(type) type
+/**
+ * The public APR-UTIL variables are declared with APU_DECLARE_DATA.
+ * This assures the appropriate indirection is invoked at compile time.
+ *
+ * @fn APU_DECLARE_DATA type apr_variable;
+ * @note extern APU_DECLARE_DATA type apr_variable; syntax is required for
+ * declarations within headers to properly import the variable.
+ */
+#define APU_DECLARE_DATA
+#elif defined(APU_DECLARE_STATIC)
+#define APU_DECLARE(type) type __stdcall
+#define APU_DECLARE_NONSTD(type) type __cdecl
+#define APU_DECLARE_DATA
+#elif defined(APU_DECLARE_EXPORT)
+#define APU_DECLARE(type) __declspec(dllexport) type __stdcall
+#define APU_DECLARE_NONSTD(type) __declspec(dllexport) type __cdecl
+#define APU_DECLARE_DATA __declspec(dllexport)
+#else
+#define APU_DECLARE(type) __declspec(dllimport) type __stdcall
+#define APU_DECLARE_NONSTD(type) __declspec(dllimport) type __cdecl
+#define APU_DECLARE_DATA __declspec(dllimport)
+#endif
+
+#if !defined(WIN32) || defined(APU_MODULE_DECLARE_STATIC)
+/**
+ * Declare a dso module's exported module structure as APU_MODULE_DECLARE_DATA.
+ *
+ * Unless APU_MODULE_DECLARE_STATIC is defined at compile time, symbols
+ * declared with APU_MODULE_DECLARE_DATA are always exported.
+ * @code
+ * module APU_MODULE_DECLARE_DATA mod_tag
+ * @endcode
+ */
+#define APU_MODULE_DECLARE_DATA
+#else
+#define APU_MODULE_DECLARE_DATA __declspec(dllexport)
+#endif
+
+/*
+ * we always have SDBM (it's in our codebase)
+ */
+#define APU_HAVE_SDBM 1
+
+#ifndef APU_DSO_MODULE_BUILD
+#define APU_HAVE_GDBM 0
+#define APU_HAVE_NDBM 0
+#define APU_HAVE_DB 0
+
+#if APU_HAVE_DB
+#define APU_HAVE_DB_VERSION 0
+#endif
+#endif
+
+/*
+ * we always enable dynamic driver loads within apr_dbd
+ * Win32 always has odbc (it's always installed)
+ */
+#ifndef APU_DSO_MODULE_BUILD
+#define APU_HAVE_PGSQL 0
+#define APU_HAVE_MYSQL 0
+#define APU_HAVE_SQLITE3 0
+#define APU_HAVE_SQLITE2 0
+#define APU_HAVE_ORACLE 0
+#define APU_HAVE_FREETDS 0
+#define APU_HAVE_ODBC 1
+#endif
+
+#define APU_HAVE_CRYPTO 0
+
+#ifndef APU_DSO_MODULE_BUILD
+#define APU_HAVE_OPENSSL 0
+#define APU_HAVE_NSS 0
+#endif
+
+#define APU_HAVE_APR_ICONV 1
+#define APU_HAVE_ICONV 0
+#define APR_HAS_XLATE (APU_HAVE_APR_ICONV || APU_HAVE_ICONV)
+
+#endif /* APU_H */
+/** @} */
diff --git a/contrib/apr-util/include/apu_errno.h b/contrib/apr-util/include/apu_errno.h
new file mode 100644
index 000000000000..c0a8ec7d41de
--- /dev/null
+++ b/contrib/apr-util/include/apu_errno.h
@@ -0,0 +1,173 @@
+/* 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.
+ */
+
+#ifndef APU_ERRNO_H
+#define APU_ERRNO_H
+
+/**
+ * @file apu_errno.h
+ * @brief APR-Util Error Codes
+ */
+
+#include "apr.h"
+#include "apr_errno.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @defgroup apu_errno Error Codes
+ * @ingroup APR_Util
+ * @{
+ */
+
+/**
+ * @defgroup APR_Util_Error APR_Util Error Values
+ * <PRE>
+ * <b>APU ERROR VALUES</b>
+ * APR_ENOKEY The key provided was empty or NULL
+ * APR_ENOIV The initialisation vector provided was NULL
+ * APR_EKEYTYPE The key type was not recognised
+ * APR_ENOSPACE The buffer supplied was not big enough
+ * APR_ECRYPT An error occurred while encrypting or decrypting
+ * APR_EPADDING Padding was not supported
+ * APR_EKEYLENGTH The key length was incorrect
+ * APR_ENOCIPHER The cipher provided was not recognised
+ * APR_ENODIGEST The digest provided was not recognised
+ * APR_ENOENGINE The engine provided was not recognised
+ * APR_EINITENGINE The engine could not be initialised
+ * APR_EREINIT Underlying crypto has already been initialised
+ * </PRE>
+ *
+ * <PRE>
+ * <b>APR STATUS VALUES</b>
+ * APR_INCHILD Program is currently executing in the child
+ * </PRE>
+ * @{
+ */
+/** @see APR_STATUS_IS_ENOKEY */
+#define APR_ENOKEY (APR_UTIL_START_STATUS + 1)
+/** @see APR_STATUS_IS_ENOIV */
+#define APR_ENOIV (APR_UTIL_START_STATUS + 2)
+/** @see APR_STATUS_IS_EKEYTYPE */
+#define APR_EKEYTYPE (APR_UTIL_START_STATUS + 3)
+/** @see APR_STATUS_IS_ENOSPACE */
+#define APR_ENOSPACE (APR_UTIL_START_STATUS + 4)
+/** @see APR_STATUS_IS_ECRYPT */
+#define APR_ECRYPT (APR_UTIL_START_STATUS + 5)
+/** @see APR_STATUS_IS_EPADDING */
+#define APR_EPADDING (APR_UTIL_START_STATUS + 6)
+/** @see APR_STATUS_IS_EKEYLENGTH */
+#define APR_EKEYLENGTH (APR_UTIL_START_STATUS + 7)
+/** @see APR_STATUS_IS_ENOCIPHER */
+#define APR_ENOCIPHER (APR_UTIL_START_STATUS + 8)
+/** @see APR_STATUS_IS_ENODIGEST */
+#define APR_ENODIGEST (APR_UTIL_START_STATUS + 9)
+/** @see APR_STATUS_IS_ENOENGINE */
+#define APR_ENOENGINE (APR_UTIL_START_STATUS + 10)
+/** @see APR_STATUS_IS_EINITENGINE */
+#define APR_EINITENGINE (APR_UTIL_START_STATUS + 11)
+/** @see APR_STATUS_IS_EREINIT */
+#define APR_EREINIT (APR_UTIL_START_STATUS + 12)
+/** @} */
+
+/**
+ * @defgroup APU_STATUS_IS Status Value Tests
+ * @warning For any particular error condition, more than one of these tests
+ * may match. This is because platform-specific error codes may not
+ * always match the semantics of the POSIX codes these tests (and the
+ * corresponding APR error codes) are named after. A notable example
+ * are the APR_STATUS_IS_ENOENT and APR_STATUS_IS_ENOTDIR tests on
+ * Win32 platforms. The programmer should always be aware of this and
+ * adjust the order of the tests accordingly.
+ * @{
+ */
+
+/** @} */
+
+/**
+ * @addtogroup APR_Util_Error
+ * @{
+ */
+/**
+ * The key was empty or not provided
+ */
+#define APR_STATUS_IS_ENOKEY(s) ((s) == APR_ENOKEY)
+/**
+ * The initialisation vector was not provided
+ */
+#define APR_STATUS_IS_ENOIV(s) ((s) == APR_ENOIV)
+/**
+ * The key type was not recognised
+ */
+#define APR_STATUS_IS_EKEYTYPE(s) ((s) == APR_EKEYTYPE)
+/**
+ * The buffer provided was not big enough
+ */
+#define APR_STATUS_IS_ENOSPACE(s) ((s) == APR_ENOSPACE)
+/**
+ * An error occurred while encrypting or decrypting
+ */
+#define APR_STATUS_IS_ECRYPT(s) ((s) == APR_ECRYPT)
+/**
+ * An error occurred while padding
+ */
+#define APR_STATUS_IS_EPADDING(s) ((s) == APR_EPADDING)
+/**
+ * An error occurred with the key length
+ */
+#define APR_STATUS_IS_EKEYLENGTH(s) ((s) == APR_EKEYLENGTH)
+/**
+ * The cipher provided was not recognised
+ */
+#define APR_STATUS_IS_ENOCIPHER(s) ((s) == APR_ENOCIPHER)
+/**
+ * The digest provided was not recognised
+ */
+#define APR_STATUS_IS_ENODIGEST(s) ((s) == APR_ENODIGEST)
+/**
+ * The engine provided was not recognised
+ */
+#define APR_STATUS_IS_ENOENGINE(s) ((s) == APR_ENOENGINE)
+/**
+ * The engine could not be initialised
+ */
+#define APR_STATUS_IS_EINITENGINE(s) ((s) == APR_EINITENGINE)
+/**
+ * Crypto has already been initialised
+ */
+#define APR_STATUS_IS_EREINIT(s) ((s) == APR_EREINIT)
+/** @} */
+
+/**
+ * This structure allows the underlying API error codes to be returned
+ * along with plain text error messages that explain to us mere mortals
+ * what really happened.
+ */
+typedef struct apu_err_t {
+ const char *reason;
+ const char *msg;
+ int rc;
+} apu_err_t;
+
+/** @} */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ! APU_ERRNO_H */
diff --git a/contrib/apr-util/include/apu_version.h b/contrib/apr-util/include/apu_version.h
new file mode 100644
index 000000000000..8d976291ff6d
--- /dev/null
+++ b/contrib/apr-util/include/apu_version.h
@@ -0,0 +1,139 @@
+/* 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.
+ */
+
+#ifndef APU_VERSION_H
+#define APU_VERSION_H
+
+/**
+ * @file apu_version.h
+ * @brief APR-util Versioning Interface
+ *
+ * APR-util's Version
+ *
+ * There are several different mechanisms for accessing the version. There
+ * is a string form, and a set of numbers; in addition, there are constants
+ * which can be compiled into your application, and you can query the library
+ * being used for its actual version.
+ *
+ * Note that it is possible for an application to detect that it has been
+ * compiled against a different version of APU by use of the compile-time
+ * constants and the use of the run-time query function.
+ *
+ * APU version numbering follows the guidelines specified in:
+ *
+ * http://apr.apache.org/versioning.html
+ */
+
+
+#define APU_COPYRIGHT "Copyright (c) 2000-2014 The Apache Software " \
+ "Foundation or its licensors, as applicable."
+
+/* The numeric compile-time version constants. These constants are the
+ * authoritative version numbers for APU.
+ */
+
+/** major version
+ * Major API changes that could cause compatibility problems for older
+ * programs such as structure size changes. No binary compatibility is
+ * possible across a change in the major version.
+ */
+#define APU_MAJOR_VERSION 1
+
+/** minor version
+ * Minor API changes that do not cause binary compatibility problems.
+ * Reset to 0 when upgrading APU_MAJOR_VERSION
+ */
+#define APU_MINOR_VERSION 5
+
+/** patch level
+ * The Patch Level never includes API changes, simply bug fixes.
+ * Reset to 0 when upgrading APR_MINOR_VERSION
+ */
+#define APU_PATCH_VERSION 4
+
+/**
+ * The symbol APU_IS_DEV_VERSION is only defined for internal,
+ * "development" copies of APU. It is undefined for released versions
+ * of APU.
+ */
+/* #define APU_IS_DEV_VERSION */
+
+
+#if defined(APU_IS_DEV_VERSION) || defined(DOXYGEN)
+/** Internal: string form of the "is dev" flag */
+#ifndef APU_IS_DEV_STRING
+#define APU_IS_DEV_STRING "-dev"
+#endif
+#else
+#define APU_IS_DEV_STRING ""
+#endif
+
+
+#ifndef APU_STRINGIFY
+/** Properly quote a value as a string in the C preprocessor */
+#define APU_STRINGIFY(n) APU_STRINGIFY_HELPER(n)
+/** Helper macro for APU_STRINGIFY */
+#define APU_STRINGIFY_HELPER(n) #n
+#endif
+
+/** The formatted string of APU's version */
+#define APU_VERSION_STRING \
+ APU_STRINGIFY(APU_MAJOR_VERSION) "." \
+ APU_STRINGIFY(APU_MINOR_VERSION) "." \
+ APU_STRINGIFY(APU_PATCH_VERSION) \
+ APU_IS_DEV_STRING
+
+/** An alternative formatted string of APR's version */
+/* macro for Win32 .rc files using numeric csv representation */
+#define APU_VERSION_STRING_CSV APU_MAJOR_VERSION ##, \
+ ##APU_MINOR_VERSION ##, \
+ ##APU_PATCH_VERSION
+
+
+#ifndef APU_VERSION_ONLY
+
+/* The C language API to access the version at run time,
+ * as opposed to compile time. APU_VERSION_ONLY may be defined
+ * externally when preprocessing apr_version.h to obtain strictly
+ * the C Preprocessor macro declarations.
+ */
+
+#include "apr_version.h"
+
+#include "apu.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Return APR-util's version information information in a numeric form.
+ *
+ * @param pvsn Pointer to a version structure for returning the version
+ * information.
+ */
+APU_DECLARE(void) apu_version(apr_version_t *pvsn);
+
+/** Return APU's version information as a string. */
+APU_DECLARE(const char *) apu_version_string(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ndef APU_VERSION_ONLY */
+
+#endif /* ndef APU_VERSION_H */
diff --git a/contrib/apr-util/include/apu_want.h.in b/contrib/apr-util/include/apu_want.h.in
new file mode 100644
index 000000000000..a296e5c5c690
--- /dev/null
+++ b/contrib/apr-util/include/apu_want.h.in
@@ -0,0 +1,51 @@
+/* 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 "apu.h" /* configuration data */
+
+/**
+ * @file apu_want.h
+ * @brief APR Standard Headers Support
+ *
+ * <PRE>
+ * Features:
+ *
+ * APU_WANT_DB: <@apu_db_header@>
+ *
+ * Typical usage:
+ *
+ * #define APU_WANT_DB
+ * #include "apu_want.h"
+ *
+ * The appropriate headers will be included.
+ *
+ * Note: it is safe to use this in a header (it won't interfere with other
+ * headers' or source files' use of apu_want.h)
+ * </PRE>
+ */
+
+/* --------------------------------------------------------------------- */
+
+#ifdef APU_WANT_DB
+
+#if APU_HAVE_DB
+#include <@apu_db_header@>
+#endif
+
+#undef APU_WANT_DB
+#endif
+
+/* --------------------------------------------------------------------- */
diff --git a/contrib/apr-util/include/apu_want.hnw b/contrib/apr-util/include/apu_want.hnw
new file mode 100644
index 000000000000..afdc9f74ca65
--- /dev/null
+++ b/contrib/apr-util/include/apu_want.hnw
@@ -0,0 +1,52 @@
+/* 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 "apu.h" /* configuration data */
+
+/**
+ * @file apu_want.h
+ * @brief APR Standard Headers Support
+ *
+ * <PRE>
+ * Features:
+ *
+ * APU_WANT_DB: <@apu_db_header>
+ *
+ * Typical usage:
+ *
+ * #define APU_WANT_DB
+ * #include "apu_want.h"
+ *
+ * The appropriate headers will be included.
+ *
+ * Note: it is safe to use this in a header (it won't interfere with other
+ * headers' or source files' use of apu_want.h)
+ * </PRE>
+ */
+
+/* --------------------------------------------------------------------- */
+
+#ifdef APU_WANT_DB
+
+#if APU_HAVE_DB
+/* win32 note.. you will need to change this for db1 */
+#include <db.h>
+#endif
+
+#undef APU_WANT_DB
+#endif
+
+/* --------------------------------------------------------------------- */
diff --git a/contrib/apr-util/include/apu_want.hw b/contrib/apr-util/include/apu_want.hw
new file mode 100644
index 000000000000..8bb56ce79f00
--- /dev/null
+++ b/contrib/apr-util/include/apu_want.hw
@@ -0,0 +1,52 @@
+/* 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 "apu.h" /* configuration data */
+
+/**
+ * @file apu_want.h
+ * @brief APR Standard Headers Support
+ *
+ * <PRE>
+ * Features:
+ *
+ * APU_WANT_DB: <db.h>
+ *
+ * Typical usage:
+ *
+ * #define APU_WANT_DB
+ * #include "apu_want.h"
+ *
+ * The appropriate headers will be included.
+ *
+ * Note: it is safe to use this in a header (it won't interfere with other
+ * headers' or source files' use of apu_want.h)
+ * </PRE>
+ */
+
+/* --------------------------------------------------------------------- */
+
+#ifdef APU_WANT_DB
+
+#if APU_HAVE_DB
+/* win32 note.. you will need to change this for db1 */
+#include <db.h>
+#endif
+
+#undef APU_WANT_DB
+#endif
+
+/* --------------------------------------------------------------------- */
diff --git a/contrib/apr-util/include/private/apr_crypto_internal.h b/contrib/apr-util/include/private/apr_crypto_internal.h
new file mode 100644
index 000000000000..5da92e558879
--- /dev/null
+++ b/contrib/apr-util/include/private/apr_crypto_internal.h
@@ -0,0 +1,278 @@
+/* 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.
+ */
+
+#ifndef APR_CRYPTO_INTERNAL_H
+#define APR_CRYPTO_INTERNAL_H
+
+#include <stdarg.h>
+
+#include "apr_crypto.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if APU_HAVE_CRYPTO
+
+struct apr_crypto_driver_t {
+
+ /** name */
+ const char *name;
+
+ /**
+ * @brief: allow driver to perform once-only initialisation.
+ * Called once only.
+ * @param pool The pool to register the cleanup in.
+ * @param params Optional init parameter string.
+ * @param rc Driver-specific additional error code
+ */
+ apr_status_t (*init)(apr_pool_t *pool, const char *params,
+ const apu_err_t **result);
+
+ /**
+ * @brief Create a context for supporting encryption. Keys, certificates,
+ * algorithms and other parameters will be set per context. More than
+ * one context can be created at one time. A cleanup will be automatically
+ * registered with the given pool to guarantee a graceful shutdown.
+ * @param f - context pointer will be written here
+ * @param provider - provider to use
+ * @param params - array of key parameters
+ * @param pool - process pool
+ * @return APR_ENOENGINE when the engine specified does not exist. APR_EINITENGINE
+ * if the engine cannot be initialised.
+ */
+ apr_status_t (*make)(apr_crypto_t **f, const apr_crypto_driver_t *provider,
+ const char *params, apr_pool_t *pool);
+
+ /**
+ * @brief Get a hash table of key types, keyed by the name of the type against
+ * an integer pointer constant.
+ *
+ * @param types - hashtable of key types keyed to constants.
+ * @param f - encryption context
+ * @return APR_SUCCESS for success
+ */
+ apr_status_t (*get_block_key_types)(apr_hash_t **types,
+ const apr_crypto_t *f);
+
+ /**
+ * @brief Get a hash table of key modes, keyed by the name of the mode against
+ * an integer pointer constant.
+ *
+ * @param modes - hashtable of key modes keyed to constants.
+ * @param f - encryption context
+ * @return APR_SUCCESS for success
+ */
+ apr_status_t (*get_block_key_modes)(apr_hash_t **modes,
+ const apr_crypto_t *f);
+
+ /**
+ * @brief Create a key from the given passphrase. By default, the PBKDF2
+ * algorithm is used to generate the key from the passphrase. It is expected
+ * that the same pass phrase will generate the same key, regardless of the
+ * backend crypto platform used. The key is cleaned up when the context
+ * is cleaned, and may be reused with multiple encryption or decryption
+ * operations.
+ * @note If *key is NULL, a apr_crypto_key_t will be created from a pool. If
+ * *key is not NULL, *key must point at a previously created structure.
+ * @param key The key returned, see note.
+ * @param ivSize The size of the initialisation vector will be returned, based
+ * on whether an IV is relevant for this type of crypto.
+ * @param pass The passphrase to use.
+ * @param passLen The passphrase length in bytes
+ * @param salt The salt to use.
+ * @param saltLen The salt length in bytes
+ * @param type 3DES_192, AES_128, AES_192, AES_256.
+ * @param mode Electronic Code Book / Cipher Block Chaining.
+ * @param doPad Pad if necessary.
+ * @param iterations Iteration count
+ * @param f The context to use.
+ * @param p The pool to use.
+ * @return Returns APR_ENOKEY if the pass phrase is missing or empty, or if a backend
+ * error occurred while generating the key. APR_ENOCIPHER if the type or mode
+ * is not supported by the particular backend. APR_EKEYTYPE if the key type is
+ * not known. APR_EPADDING if padding was requested but is not supported.
+ * APR_ENOTIMPL if not implemented.
+ */
+ apr_status_t (*passphrase)(apr_crypto_key_t **key, apr_size_t *ivSize,
+ const char *pass, apr_size_t passLen, const unsigned char * salt,
+ apr_size_t saltLen, const apr_crypto_block_key_type_e type,
+ const apr_crypto_block_key_mode_e mode, const int doPad,
+ const int iterations, const apr_crypto_t *f, apr_pool_t *p);
+
+ /**
+ * @brief Initialise a context for encrypting arbitrary data using the given key.
+ * @note If *ctx is NULL, a apr_crypto_block_t will be created from a pool. If
+ * *ctx is not NULL, *ctx must point at a previously created structure.
+ * @param ctx The block context returned, see note.
+ * @param iv Optional initialisation vector. If the buffer pointed to is NULL,
+ * an IV will be created at random, in space allocated from the pool.
+ * If the buffer pointed to is not NULL, the IV in the buffer will be
+ * used.
+ * @param key The key structure.
+ * @param blockSize The block size of the cipher.
+ * @param p The pool to use.
+ * @return Returns APR_ENOIV if an initialisation vector is required but not specified.
+ * Returns APR_EINIT if the backend failed to initialise the context. Returns
+ * APR_ENOTIMPL if not implemented.
+ */
+ apr_status_t (*block_encrypt_init)(apr_crypto_block_t **ctx,
+ const unsigned char **iv, const apr_crypto_key_t *key,
+ apr_size_t *blockSize, apr_pool_t *p);
+
+ /**
+ * @brief Encrypt data provided by in, write it to out.
+ * @note The number of bytes written will be written to outlen. If
+ * out is NULL, outlen will contain the maximum size of the
+ * buffer needed to hold the data, including any data
+ * generated by apr_crypto_block_encrypt_finish below. If *out points
+ * to NULL, a buffer sufficiently large will be created from
+ * the pool provided. If *out points to a not-NULL value, this
+ * value will be used as a buffer instead.
+ * @param out Address of a buffer to which data will be written,
+ * see note.
+ * @param outlen Length of the output will be written here.
+ * @param in Address of the buffer to read.
+ * @param inlen Length of the buffer to read.
+ * @param ctx The block context to use.
+ * @return APR_ECRYPT if an error occurred. Returns APR_ENOTIMPL if
+ * not implemented.
+ */
+ apr_status_t (*block_encrypt)(unsigned char **out, apr_size_t *outlen,
+ const unsigned char *in, apr_size_t inlen, apr_crypto_block_t *ctx);
+
+ /**
+ * @brief Encrypt final data block, write it to out.
+ * @note If necessary the final block will be written out after being
+ * padded. Typically the final block will be written to the
+ * same buffer used by apr_crypto_block_encrypt, offset by the
+ * number of bytes returned as actually written by the
+ * apr_crypto_block_encrypt() call. After this call, the context
+ * is cleaned and can be reused by apr_crypto_block_encrypt_init().
+ * @param out Address of a buffer to which data will be written. This
+ * buffer must already exist, and is usually the same
+ * buffer used by apr_evp_crypt(). See note.
+ * @param outlen Length of the output will be written here.
+ * @param ctx The block context to use.
+ * @return APR_ECRYPT if an error occurred.
+ * @return APR_EPADDING if padding was enabled and the block was incorrectly
+ * formatted.
+ * @return APR_ENOTIMPL if not implemented.
+ */
+ apr_status_t (*block_encrypt_finish)(unsigned char *out,
+ apr_size_t *outlen, apr_crypto_block_t *ctx);
+
+ /**
+ * @brief Initialise a context for decrypting arbitrary data using the given key.
+ * @note If *ctx is NULL, a apr_crypto_block_t will be created from a pool. If
+ * *ctx is not NULL, *ctx must point at a previously created structure.
+ * @param ctx The block context returned, see note.
+ * @param blockSize The block size of the cipher.
+ * @param iv Optional initialisation vector. If the buffer pointed to is NULL,
+ * an IV will be created at random, in space allocated from the pool.
+ * If the buffer is not NULL, the IV in the buffer will be used.
+ * @param key The key structure.
+ * @param p The pool to use.
+ * @return Returns APR_ENOIV if an initialisation vector is required but not specified.
+ * Returns APR_EINIT if the backend failed to initialise the context. Returns
+ * APR_ENOTIMPL if not implemented.
+ */
+ apr_status_t (*block_decrypt_init)(apr_crypto_block_t **ctx,
+ apr_size_t *blockSize, const unsigned char *iv,
+ const apr_crypto_key_t *key, apr_pool_t *p);
+
+ /**
+ * @brief Decrypt data provided by in, write it to out.
+ * @note The number of bytes written will be written to outlen. If
+ * out is NULL, outlen will contain the maximum size of the
+ * buffer needed to hold the data, including any data
+ * generated by apr_crypto_block_decrypt_finish below. If *out points
+ * to NULL, a buffer sufficiently large will be created from
+ * the pool provided. If *out points to a not-NULL value, this
+ * value will be used as a buffer instead.
+ * @param out Address of a buffer to which data will be written,
+ * see note.
+ * @param outlen Length of the output will be written here.
+ * @param in Address of the buffer to read.
+ * @param inlen Length of the buffer to read.
+ * @param ctx The block context to use.
+ * @return APR_ECRYPT if an error occurred. Returns APR_ENOTIMPL if
+ * not implemented.
+ */
+ apr_status_t (*block_decrypt)(unsigned char **out, apr_size_t *outlen,
+ const unsigned char *in, apr_size_t inlen, apr_crypto_block_t *ctx);
+
+ /**
+ * @brief Decrypt final data block, write it to out.
+ * @note If necessary the final block will be written out after being
+ * padded. Typically the final block will be written to the
+ * same buffer used by apr_crypto_block_decrypt, offset by the
+ * number of bytes returned as actually written by the
+ * apr_crypto_block_decrypt() call. After this call, the context
+ * is cleaned and can be reused by apr_crypto_block_decrypt_init().
+ * @param out Address of a buffer to which data will be written. This
+ * buffer must already exist, and is usually the same
+ * buffer used by apr_evp_crypt(). See note.
+ * @param outlen Length of the output will be written here.
+ * @param ctx The block context to use.
+ * @return APR_ECRYPT if an error occurred.
+ * @return APR_EPADDING if padding was enabled and the block was incorrectly
+ * formatted.
+ * @return APR_ENOTIMPL if not implemented.
+ */
+ apr_status_t (*block_decrypt_finish)(unsigned char *out,
+ apr_size_t *outlen, apr_crypto_block_t *ctx);
+
+ /**
+ * @brief Clean encryption / decryption context.
+ * @note After cleanup, a context is free to be reused if necessary.
+ * @param ctx The block context to use.
+ * @return Returns APR_ENOTIMPL if not supported.
+ */
+ apr_status_t (*block_cleanup)(apr_crypto_block_t *ctx);
+
+ /**
+ * @brief Clean encryption / decryption context.
+ * @note After cleanup, a context is free to be reused if necessary.
+ * @param f The context to use.
+ * @return Returns APR_ENOTIMPL if not supported.
+ */
+ apr_status_t (*cleanup)(apr_crypto_t *f);
+
+ /**
+ * @brief Clean encryption / decryption context.
+ * @note After cleanup, a context is free to be reused if necessary.
+ * @return Returns APR_ENOTIMPL if not supported.
+ */
+ apr_status_t (*shutdown)(void);
+
+ /**
+ * @brief: fetch the most recent error from this driver.
+ * @param result - the result structure
+ * @param f - context pointer
+ * @return APR_SUCCESS for success.
+ */
+ apr_status_t (*error)(const apu_err_t **result, const apr_crypto_t *f);
+
+};
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/contrib/apr-util/include/private/apr_dbd_internal.h b/contrib/apr-util/include/private/apr_dbd_internal.h
new file mode 100644
index 000000000000..671ffb21881c
--- /dev/null
+++ b/contrib/apr-util/include/private/apr_dbd_internal.h
@@ -0,0 +1,365 @@
+/* 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.
+ */
+
+/* Overview of what this is and does:
+ * http://www.apache.org/~niq/dbd.html
+ */
+
+#ifndef APR_DBD_INTERNAL_H
+#define APR_DBD_INTERNAL_H
+
+#include <stdarg.h>
+
+#include "apr_dbd.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define TXN_IGNORE_ERRORS(t) \
+ ((t) && ((t)->mode & APR_DBD_TRANSACTION_IGNORE_ERRORS))
+#define TXN_NOTICE_ERRORS(t) \
+ ((t) && !((t)->mode & APR_DBD_TRANSACTION_IGNORE_ERRORS))
+
+#define TXN_DO_COMMIT(t) (!((t)->mode & APR_DBD_TRANSACTION_ROLLBACK))
+#define TXN_DO_ROLLBACK(t) ((t)->mode & APR_DBD_TRANSACTION_ROLLBACK)
+
+#define TXN_MODE_BITS \
+ (APR_DBD_TRANSACTION_ROLLBACK|APR_DBD_TRANSACTION_IGNORE_ERRORS)
+
+struct apr_dbd_driver_t {
+ /** name */
+ const char *name;
+
+ /** init: allow driver to perform once-only initialisation.
+ * Called once only. May be NULL
+ */
+ void (*init)(apr_pool_t *pool);
+
+ /** native_handle: return the native database handle of the underlying db
+ *
+ * @param handle - apr_dbd handle
+ * @return - native handle
+ */
+ void *(*native_handle)(apr_dbd_t *handle);
+
+ /** open: obtain a database connection from the server rec.
+ * Must be explicitly closed when you're finished with it.
+ * WARNING: only use this when you need a connection with
+ * a lifetime other than a request
+ *
+ * @param pool - a pool to use for error messages (if any).
+ * @param params - connection parameters.
+ * @param error - descriptive error.
+ * @return database handle, or NULL on error.
+ */
+ apr_dbd_t *(*open)(apr_pool_t *pool, const char *params,
+ const char **error);
+
+ /** check_conn: check status of a database connection
+ *
+ * @param pool - a pool to use for error messages (if any).
+ * @param handle - the connection to check
+ * @return APR_SUCCESS or error
+ */
+ apr_status_t (*check_conn)(apr_pool_t *pool, apr_dbd_t *handle);
+
+ /** close: close/release a connection obtained from open()
+ *
+ * @param handle - the connection to release
+ * @return APR_SUCCESS or error
+ */
+ apr_status_t (*close)(apr_dbd_t *handle);
+
+ /** set_dbname: select database name. May be a no-op if not supported.
+ *
+ * @param pool - working pool
+ * @param handle - the connection
+ * @param name - the database to select
+ * @return 0 for success or error code
+ */
+ int (*set_dbname)(apr_pool_t* pool, apr_dbd_t *handle, const char *name);
+
+ /** transaction: start a transaction. May be a no-op.
+ *
+ * @param pool - a pool to use for error messages (if any).
+ * @param handle - the connection
+ * @param trans - ptr to a transaction. May be null on entry
+ * @return 0 for success or error code
+ */
+ int (*start_transaction)(apr_pool_t *pool, apr_dbd_t *handle,
+ apr_dbd_transaction_t **trans);
+
+ /** end_transaction: end a transaction
+ * (commit on success, rollback on error).
+ * May be a no-op.
+ *
+ * @param trans - the transaction.
+ * @return 0 for success or error code
+ */
+ int (*end_transaction)(apr_dbd_transaction_t *trans);
+
+ /** query: execute an SQL query that doesn't return a result set
+ *
+ * @param handle - the connection
+ * @param nrows - number of rows affected.
+ * @param statement - the SQL statement to execute
+ * @return 0 for success or error code
+ */
+ int (*query)(apr_dbd_t *handle, int *nrows, const char *statement);
+
+ /** select: execute an SQL query that returns a result set
+ *
+ * @param pool - pool to allocate the result set
+ * @param handle - the connection
+ * @param res - pointer to result set pointer. May point to NULL on entry
+ * @param statement - the SQL statement to execute
+ * @param random - 1 to support random access to results (seek any row);
+ * 0 to support only looping through results in order
+ * (async access - faster)
+ * @return 0 for success or error code
+ */
+ int (*select)(apr_pool_t *pool, apr_dbd_t *handle, apr_dbd_results_t **res,
+ const char *statement, int random);
+
+ /** num_cols: get the number of columns in a results set
+ *
+ * @param res - result set.
+ * @return number of columns
+ */
+ int (*num_cols)(apr_dbd_results_t *res);
+
+ /** num_tuples: get the number of rows in a results set
+ * of a synchronous select
+ *
+ * @param res - result set.
+ * @return number of rows, or -1 if the results are asynchronous
+ */
+ int (*num_tuples)(apr_dbd_results_t *res);
+
+ /** get_row: get a row from a result set
+ *
+ * @param pool - pool to allocate the row
+ * @param res - result set pointer
+ * @param row - pointer to row pointer. May point to NULL on entry
+ * @param rownum - row number, or -1 for "next row". Ignored if random
+ * access is not supported.
+ * @return 0 for success, -1 for rownum out of range or data finished
+ */
+ int (*get_row)(apr_pool_t *pool, apr_dbd_results_t *res,
+ apr_dbd_row_t **row, int rownum);
+
+ /** get_entry: get an entry from a row
+ *
+ * @param row - row pointer
+ * @param col - entry number
+ * @param val - entry to fill
+ * @return 0 for success, -1 for no data, +1 for general error
+ */
+ const char* (*get_entry)(const apr_dbd_row_t *row, int col);
+
+ /** error: get current error message (if any)
+ *
+ * @param handle - the connection
+ * @param errnum - error code from operation that returned an error
+ * @return the database current error message, or message for errnum
+ * (implementation-dependent whether errnum is ignored)
+ */
+ const char *(*error)(apr_dbd_t *handle, int errnum);
+
+ /** escape: escape a string so it is safe for use in query/select
+ *
+ * @param pool - pool to alloc the result from
+ * @param string - the string to escape
+ * @param handle - the connection
+ * @return the escaped, safe string
+ */
+ const char *(*escape)(apr_pool_t *pool, const char *string,
+ apr_dbd_t *handle);
+
+ /** prepare: prepare a statement
+ *
+ * @param pool - pool to alloc the result from
+ * @param handle - the connection
+ * @param query - the SQL query
+ * @param label - A label for the prepared statement.
+ * use NULL for temporary prepared statements
+ * (eg within a Request in httpd)
+ * @param nargs - number of parameters in the query
+ * @param nvals - number of values passed in p[b]query/select
+ * @param types - pointer to an array with types of parameters
+ * @param statement - statement to prepare. May point to null on entry.
+ * @return 0 for success or error code
+ */
+ int (*prepare)(apr_pool_t *pool, apr_dbd_t *handle, const char *query,
+ const char *label, int nargs, int nvals,
+ apr_dbd_type_e *types, apr_dbd_prepared_t **statement);
+
+ /** pvquery: query using a prepared statement + args
+ *
+ * @param pool - working pool
+ * @param handle - the connection
+ * @param nrows - number of rows affected.
+ * @param statement - the prepared statement to execute
+ * @param args - args to prepared statement
+ * @return 0 for success or error code
+ */
+ int (*pvquery)(apr_pool_t *pool, apr_dbd_t *handle, int *nrows,
+ apr_dbd_prepared_t *statement, va_list args);
+
+ /** pvselect: select using a prepared statement + args
+ *
+ * @param pool - working pool
+ * @param handle - the connection
+ * @param res - pointer to query results. May point to NULL on entry
+ * @param statement - the prepared statement to execute
+ * @param random - Whether to support random-access to results
+ * @param args - args to prepared statement
+ * @return 0 for success or error code
+ */
+ int (*pvselect)(apr_pool_t *pool, apr_dbd_t *handle,
+ apr_dbd_results_t **res,
+ apr_dbd_prepared_t *statement, int random, va_list args);
+
+ /** pquery: query using a prepared statement + args
+ *
+ * @param pool - working pool
+ * @param handle - the connection
+ * @param nrows - number of rows affected.
+ * @param statement - the prepared statement to execute
+ * @param args - args to prepared statement
+ * @return 0 for success or error code
+ */
+ int (*pquery)(apr_pool_t *pool, apr_dbd_t *handle, int *nrows,
+ apr_dbd_prepared_t *statement, const char **args);
+
+ /** pselect: select using a prepared statement + args
+ *
+ * @param pool - working pool
+ * @param handle - the connection
+ * @param res - pointer to query results. May point to NULL on entry
+ * @param statement - the prepared statement to execute
+ * @param random - Whether to support random-access to results
+ * @param args - args to prepared statement
+ * @return 0 for success or error code
+ */
+ int (*pselect)(apr_pool_t *pool, apr_dbd_t *handle,
+ apr_dbd_results_t **res, apr_dbd_prepared_t *statement,
+ int random, const char **args);
+
+
+ /** get_name: get a column title from a result set
+ *
+ * @param res - result set pointer
+ * @param col - entry number
+ * @return param name, or NULL if col is out of bounds.
+ */
+ const char* (*get_name)(const apr_dbd_results_t *res, int col);
+
+ /** transaction_mode_get: get the mode of transaction
+ *
+ * @param trans - the transaction.
+ * @return mode of transaction
+ */
+ int (*transaction_mode_get)(apr_dbd_transaction_t *trans);
+
+ /** transaction_mode_set: get the mode of transaction
+ *
+ * @param trans - the transaction.
+ * @param mode - new mode of the transaction
+ * @return the mode of transaction in force after the call
+ */
+ int (*transaction_mode_set)(apr_dbd_transaction_t *trans, int mode);
+
+ /** format of prepared statement parameters */
+ const char *pformat;
+
+ /** pvbquery: query using a prepared statement + binary args
+ *
+ * @param pool - working pool
+ * @param handle - the connection
+ * @param nrows - number of rows affected.
+ * @param statement - the prepared statement to execute
+ * @param args - binary args to prepared statement
+ * @return 0 for success or error code
+ */
+ int (*pvbquery)(apr_pool_t *pool, apr_dbd_t *handle, int *nrows,
+ apr_dbd_prepared_t *statement, va_list args);
+
+ /** pvbselect: select using a prepared statement + binary args
+ *
+ * @param pool - working pool
+ * @param handle - the connection
+ * @param res - pointer to query results. May point to NULL on entry
+ * @param statement - the prepared statement to execute
+ * @param random - Whether to support random-access to results
+ * @param args - binary args to prepared statement
+ * @return 0 for success or error code
+ */
+ int (*pvbselect)(apr_pool_t *pool, apr_dbd_t *handle,
+ apr_dbd_results_t **res,
+ apr_dbd_prepared_t *statement, int random, va_list args);
+
+ /** pbquery: query using a prepared statement + binary args
+ *
+ * @param pool - working pool
+ * @param handle - the connection
+ * @param nrows - number of rows affected.
+ * @param statement - the prepared statement to execute
+ * @param args - binary args to prepared statement
+ * @return 0 for success or error code
+ */
+ int (*pbquery)(apr_pool_t *pool, apr_dbd_t *handle, int *nrows,
+ apr_dbd_prepared_t *statement,const void **args);
+
+ /** pbselect: select using a prepared statement + binary args
+ *
+ * @param pool - working pool
+ * @param handle - the connection
+ * @param res - pointer to query results. May point to NULL on entry
+ * @param statement - the prepared statement to execute
+ * @param random - Whether to support random-access to results
+ * @param args - binary args to prepared statement
+ * @return 0 for success or error code
+ */
+ int (*pbselect)(apr_pool_t *pool, apr_dbd_t *handle,
+ apr_dbd_results_t **res, apr_dbd_prepared_t *statement,
+ int random, const void **args);
+
+ /** datum_get: get a binary entry from a row
+ *
+ * @param row - row pointer
+ * @param col - entry number
+ * @param type - type of data to get
+ * @param data - pointer to data, allocated by the caller
+ * @return APR_SUCCESS, an error code on error or if col is out of bounds
+ */
+ apr_status_t (*datum_get)(const apr_dbd_row_t *row, int col,
+ apr_dbd_type_e type, void *data);
+};
+
+/* Export mutex lock/unlock for drivers that need it
+ * deprecated; create a per-dbd mutex within the (*init) function
+ * to avoid blocking other providers running on other threads
+ */
+APU_DECLARE(apr_status_t) apr_dbd_mutex_lock(void);
+APU_DECLARE(apr_status_t) apr_dbd_mutex_unlock(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/contrib/apr-util/include/private/apr_dbd_odbc_v2.h b/contrib/apr-util/include/private/apr_dbd_odbc_v2.h
new file mode 100644
index 000000000000..b8da7b181f95
--- /dev/null
+++ b/contrib/apr-util/include/private/apr_dbd_odbc_v2.h
@@ -0,0 +1,119 @@
+/* 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.
+ */
+
+
+/* ONLY USED FOR ODBC Version 2 -DODBCV2
+*
+* Re-define everything to work (more-or-less) in an ODBC V2 environment
+* Random access to retrieved rows is not supported - i.e. calls to apr_dbd_select() cannot
+* have a 'random' argument of 1. apr_dbd_get_row() must always pass rownum as 0 (get next row)
+*
+*/
+
+#define SQLHANDLE SQLHENV /* Presumes that ENV, DBC, and STMT handles are all the same datatype */
+#define SQL_NULL_HANDLE 0
+#define SQL_HANDLE_STMT 1
+#define SQL_HANDLE_DBC 2
+#define SQL_HANDLE_ENV 3
+#define SQL_NO_DATA SQL_NO_DATA_FOUND
+
+#ifndef SQL_SUCCEEDED
+#define SQL_SUCCEEDED(rc) (((rc)&(~1))==0)
+#endif
+
+#undef SQLSetEnvAttr
+#define SQLSetEnvAttr(henv, Attribute, Value, StringLength) (0)
+
+#undef SQLAllocHandle
+#define SQLAllocHandle(type, parent, hndl) \
+( (type == SQL_HANDLE_STMT) ? SQLAllocStmt(parent, hndl) \
+ : (type == SQL_HANDLE_ENV) ? SQLAllocEnv(hndl) \
+ : SQLAllocConnect(parent, hndl) \
+)
+
+#undef SQLFreeHandle
+#define SQLFreeHandle(type, hndl) \
+( (type == SQL_HANDLE_STMT) ? SQLFreeStmt(hndl, SQL_DROP) \
+ : (type == SQL_HANDLE_ENV) ? SQLFreeEnv(hndl) \
+ : SQLFreeConnect(hndl) \
+)
+
+#undef SQLGetDiagRec
+#define SQLGetDiagRec(type, h, i, state, native, buffer, bufsize, reslen) \
+ SQLError( (type == SQL_HANDLE_ENV) ? h : NULL, \
+ (type == SQL_HANDLE_DBC) ? h : NULL, \
+ (type == SQL_HANDLE_STMT) ? h : NULL, \
+ state, native, buffer, bufsize, reslen)
+
+#undef SQLCloseCursor
+#define SQLCloseCursor(stmt) SQLFreeStmt(stmt, SQL_CLOSE)
+
+#undef SQLGetConnectAttr
+#define SQLGetConnectAttr(hdbc, fOption, ValuePtr, BufferLength, NULL) \
+ SQLGetConnectOption(hdbc, fOption, ValuePtr)
+
+#undef SQLSetConnectAttr
+#define SQLSetConnectAttr(hdbc, fOption, ValuePtr, BufferLength) \
+ SQLSetConnectOption(hdbc, fOption, (SQLUINTEGER) ValuePtr)
+
+#undef SQLSetStmtAttr
+#define SQLSetStmtAttr(hstmt, fOption, ValuePtr, BufferLength) (0); return APR_ENOTIMPL;
+
+#undef SQLEndTran
+#define SQLEndTran(hType, hdbc,type) SQLTransact(henv, hdbc, type)
+
+#undef SQLFetchScroll
+#define SQLFetchScroll(stmt, orient, rownum) (0); return APR_ENOTIMPL;
+
+#define SQL_DESC_TYPE SQL_COLUMN_TYPE
+#define SQL_DESC_CONCISE_TYPE SQL_COLUMN_TYPE
+#define SQL_DESC_DISPLAY_SIZE SQL_COLUMN_DISPLAY_SIZE
+#define SQL_DESC_OCTET_LENGTH SQL_COLUMN_LENGTH
+#define SQL_DESC_UNSIGNED SQL_COLUMN_UNSIGNED
+
+#undef SQLColAttribute
+#define SQLColAttribute(s, c, f, a, l, m, n) SQLColAttributes(s, c, f, a, l, m, n)
+
+#define SQL_ATTR_ACCESS_MODE SQL_ACCESS_MODE
+#define SQL_ATTR_AUTOCOMMIT SQL_AUTOCOMMIT
+#define SQL_ATTR_CONNECTION_TIMEOUT 113
+#define SQL_ATTR_CURRENT_CATALOG SQL_CURRENT_QUALIFIER
+#define SQL_ATTR_DISCONNECT_BEHAVIOR 114
+#define SQL_ATTR_ENLIST_IN_DTC 1207
+#define SQL_ATTR_ENLIST_IN_XA 1208
+
+#define SQL_ATTR_CONNECTION_DEAD 1209
+#define SQL_CD_TRUE 1L /* Connection is closed/dead */
+#define SQL_CD_FALSE 0L /* Connection is open/available */
+
+#define SQL_ATTR_LOGIN_TIMEOUT SQL_LOGIN_TIMEOUT
+#define SQL_ATTR_ODBC_CURSORS SQL_ODBC_CURSORS
+#define SQL_ATTR_PACKET_SIZE SQL_PACKET_SIZE
+#define SQL_ATTR_QUIET_MODE SQL_QUIET_MODE
+#define SQL_ATTR_TRACE SQL_OPT_TRACE
+#define SQL_ATTR_TRACEFILE SQL_OPT_TRACEFILE
+#define SQL_ATTR_TRANSLATE_LIB SQL_TRANSLATE_DLL
+#define SQL_ATTR_TRANSLATE_OPTION SQL_TRANSLATE_OPTION
+#define SQL_ATTR_TXN_ISOLATION SQL_TXN_ISOLATION
+
+#define SQL_ATTR_CURSOR_SCROLLABLE -1
+
+#define SQL_C_SBIGINT (SQL_BIGINT+SQL_SIGNED_OFFSET) /* SIGNED BIGINT */
+#define SQL_C_UBIGINT (SQL_BIGINT+SQL_UNSIGNED_OFFSET) /* UNSIGNED BIGINT */
+
+#define SQL_FALSE 0
+#define SQL_TRUE 1
+
diff --git a/contrib/apr-util/include/private/apr_dbm_private.h b/contrib/apr-util/include/private/apr_dbm_private.h
new file mode 100644
index 000000000000..020d3a6b8c73
--- /dev/null
+++ b/contrib/apr-util/include/private/apr_dbm_private.h
@@ -0,0 +1,121 @@
+/* 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.
+ */
+
+#ifndef APR_DBM_PRIVATE_H
+#define APR_DBM_PRIVATE_H
+
+#include "apr.h"
+#include "apr_errno.h"
+#include "apr_pools.h"
+#include "apr_dbm.h"
+#include "apr_file_io.h"
+
+#include "apu.h"
+
+/* ### for now, include the DBM selection; this will go away once we start
+ ### building and linking all of the DBMs at once. */
+#include "apu_select_dbm.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @internal */
+
+/**
+ * Most DBM libraries take a POSIX mode for creating files. Don't trust
+ * the mode_t type, some platforms may not support it, int is safe.
+ */
+APU_DECLARE(int) apr_posix_perms2mode(apr_fileperms_t perm);
+
+/**
+ * Structure to describe the operations of the DBM
+ */
+typedef struct {
+ /** The name of the DBM Type */
+ const char *name;
+
+ /** Open the DBM */
+ apr_status_t (*open)(apr_dbm_t **pdb, const char *pathname,
+ apr_int32_t mode, apr_fileperms_t perm,
+ apr_pool_t *pool);
+
+ /** Close the DBM */
+ void (*close)(apr_dbm_t *dbm);
+
+ /** Fetch a dbm record value by key */
+ apr_status_t (*fetch)(apr_dbm_t *dbm, apr_datum_t key,
+ apr_datum_t * pvalue);
+
+ /** Store a dbm record value by key */
+ apr_status_t (*store)(apr_dbm_t *dbm, apr_datum_t key, apr_datum_t value);
+
+ /** Delete a dbm record value by key */
+ apr_status_t (*del)(apr_dbm_t *dbm, apr_datum_t key);
+
+ /** Search for a key within the dbm */
+ int (*exists)(apr_dbm_t *dbm, apr_datum_t key);
+
+ /** Retrieve the first record key from a dbm */
+ apr_status_t (*firstkey)(apr_dbm_t *dbm, apr_datum_t * pkey);
+
+ /** Retrieve the next record key from a dbm */
+ apr_status_t (*nextkey)(apr_dbm_t *dbm, apr_datum_t * pkey);
+
+ /** Proactively toss any memory associated with the apr_datum_t. */
+ void (*freedatum)(apr_dbm_t *dbm, apr_datum_t data);
+
+ /** Get the names that the DBM will use for a given pathname. */
+ void (*getusednames)(apr_pool_t *pool,
+ const char *pathname,
+ const char **used1,
+ const char **used2);
+
+} apr_dbm_type_t;
+
+
+/**
+ * The actual DBM
+ */
+struct apr_dbm_t
+{
+ /** Associated pool */
+ apr_pool_t *pool;
+
+ /** pointer to DB Implementation Specific data */
+ void *file;
+
+ /** Current integer error code */
+ int errcode;
+ /** Current string error code */
+ const char *errmsg;
+
+ /** the type of DBM */
+ const apr_dbm_type_t *type;
+};
+
+
+/* Declare all of the DBM provider tables */
+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_db;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* APR_DBM_PRIVATE_H */
diff --git a/contrib/apr-util/include/private/apu_config.h.in b/contrib/apr-util/include/private/apu_config.h.in
new file mode 100644
index 000000000000..4d39f8a09475
--- /dev/null
+++ b/contrib/apr-util/include/private/apu_config.h.in
@@ -0,0 +1,176 @@
+/* include/private/apu_config.h.in. Generated from configure.in by autoheader. */
+
+/* Define if the system crypt() function is threadsafe */
+#undef APU_CRYPT_THREADSAFE
+
+/* Define to 1 if modular components are built as DSOs */
+#undef APU_DSO_BUILD
+
+/* Define to be absolute path to DSO directory */
+#undef APU_DSO_LIBDIR
+
+/* Define if the inbuf parm to iconv() is const char ** */
+#undef APU_ICONV_INBUF_CONST
+
+/* Define that OpenSSL uses const buffers */
+#undef CRYPTO_OPENSSL_CONST_BUFFERS
+
+/* Define if crypt_r has uses CRYPTD */
+#undef CRYPT_R_CRYPTD
+
+/* Define if crypt_r uses struct crypt_data */
+#undef CRYPT_R_STRUCT_CRYPT_DATA
+
+/* Define if CODESET is defined in langinfo.h */
+#undef HAVE_CODESET
+
+/* Define to 1 if you have the `crypt_r' function. */
+#undef HAVE_CRYPT_R
+
+/* Define to 1 if you have the declaration of `EVP_PKEY_CTX_new', and to 0 if
+ you don't. */
+#undef HAVE_DECL_EVP_PKEY_CTX_NEW
+
+/* Define if expat.h is available */
+#undef HAVE_EXPAT_H
+
+/* Define to 1 if you have the <freetds/sybdb.h> header file. */
+#undef HAVE_FREETDS_SYBDB_H
+
+/* Define to 1 if you have the <iconv.h> header file. */
+#undef HAVE_ICONV_H
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the <langinfo.h> header file. */
+#undef HAVE_LANGINFO_H
+
+/* Define to 1 if you have the <lber.h> header file. */
+#undef HAVE_LBER_H
+
+/* Defined if ldap.h is present */
+#undef HAVE_LDAP_H
+
+/* Define to 1 if you have the <ldap_ssl.h> header file. */
+#undef HAVE_LDAP_SSL_H
+
+/* Define to 1 if you have the <libpq-fe.h> header file. */
+#undef HAVE_LIBPQ_FE_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the <mysql.h> header file. */
+#undef HAVE_MYSQL_H
+
+/* Define to 1 if you have the <mysql/mysql.h> header file. */
+#undef HAVE_MYSQL_MYSQL_H
+
+/* Define to 1 if you have the <mysql/my_global.h> header file. */
+#undef HAVE_MYSQL_MY_GLOBAL_H
+
+/* Define to 1 if you have the <mysql/my_sys.h> header file. */
+#undef HAVE_MYSQL_MY_SYS_H
+
+/* Define to 1 if you have the <my_global.h> header file. */
+#undef HAVE_MY_GLOBAL_H
+
+/* Define to 1 if you have the <my_sys.h> header file. */
+#undef HAVE_MY_SYS_H
+
+/* Define to 1 if you have the `nl_langinfo' function. */
+#undef HAVE_NL_LANGINFO
+
+/* Define to 1 if you have the <nss.h> header file. */
+#undef HAVE_NSS_H
+
+/* Define to 1 if you have the <nss/nss.h> header file. */
+#undef HAVE_NSS_NSS_H
+
+/* Define to 1 if you have the <nss/pk11pub.h> header file. */
+#undef HAVE_NSS_PK11PUB_H
+
+/* Define to 1 if you have the <oci.h> header file. */
+#undef HAVE_OCI_H
+
+/* Define to 1 if you have the <odbc/sql.h> header file. */
+#undef HAVE_ODBC_SQL_H
+
+/* Define to 1 if you have the <openssl/x509.h> header file. */
+#undef HAVE_OPENSSL_X509_H
+
+/* Define to 1 if you have the <pk11pub.h> header file. */
+#undef HAVE_PK11PUB_H
+
+/* Define to 1 if you have the <postgresql/libpq-fe.h> header file. */
+#undef HAVE_POSTGRESQL_LIBPQ_FE_H
+
+/* Define to 1 if you have the <prerror.h> header file. */
+#undef HAVE_PRERROR_H
+
+/* Define to 1 if you have the <sqlite3.h> header file. */
+#undef HAVE_SQLITE3_H
+
+/* Define to 1 if you have the <sqlite.h> header file. */
+#undef HAVE_SQLITE_H
+
+/* Define to 1 if you have the <sql.h> header file. */
+#undef HAVE_SQL_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sybdb.h> header file. */
+#undef HAVE_SYBDB_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define if xmlparse/xmlparse.h is available */
+#undef HAVE_XMLPARSE_XMLPARSE_H
+
+/* Define if xmltok/xmlparse.h is available */
+#undef HAVE_XMLTOK_XMLPARSE_H
+
+/* Define if xml/xmlparse.h is available */
+#undef HAVE_XML_XMLPARSE_H
+
+/* Define if ldap_set_rebind_proc takes three arguments */
+#undef LDAP_SET_REBIND_PROC_THREE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
diff --git a/contrib/apr-util/include/private/apu_config.hnw b/contrib/apr-util/include/private/apu_config.hnw
new file mode 100644
index 000000000000..9c6c73e46270
--- /dev/null
+++ b/contrib/apr-util/include/private/apu_config.hnw
@@ -0,0 +1,53 @@
+/* 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.
+ */
+
+/*
+ * Note: This is a NetWare specific version of apu_config.hnw. It is copied
+ * as apu_config.h at the start of a NetWare build.
+ */
+
+#ifdef NETWARE
+
+#ifndef APU_CONFIG_H
+#define APU_CONFIG_H
+
+/* Always compile Netware with DSO support for .nlm builds */
+#define APU_DSO_BUILD 0
+
+/*
+ * NetWare does not have GDBM, and we always use the bundled (new) Expat
+ */
+
+/* Define if you have the gdbm library (-lgdbm). */
+/* #undef HAVE_LIBGDBM */
+
+/* define if Expat 1.0 or 1.1 was found */
+/* #undef APR_HAVE_OLD_EXPAT */
+
+/* NetWare uses its own ICONV implementation. */
+#define HAVE_ICONV_H 1
+
+/*
+ * check for newer NDKs which use now correctly 'const char*' with iconv.
+ */
+#include <ndkvers.h>
+#if (CURRENT_NDK_THRESHOLD >= 705110000)
+#define APU_ICONV_INBUF_CONST
+#endif
+
+#endif /* APU_CONFIG_H */
+#endif /* NETWARE */
+
diff --git a/contrib/apr-util/include/private/apu_config.hw b/contrib/apr-util/include/private/apu_config.hw
new file mode 100644
index 000000000000..b0e2039322c7
--- /dev/null
+++ b/contrib/apr-util/include/private/apu_config.hw
@@ -0,0 +1,52 @@
+/* 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.
+ */
+
+/*
+ * Note: This is a Windows specific version of apu_config.hw. It is copied
+ * as apu_config.h at the start of a Windows build.
+ */
+
+#ifdef WIN32
+
+#ifndef APU_CONFIG_H
+#define APU_CONFIG_H
+
+/* Compile win32 with DSO support for .dll builds */
+#ifdef APU_DECLARE_STATIC
+#define APU_DSO_BUILD 0
+#else
+#define APU_DSO_BUILD 1
+#endif
+
+/* Presume a standard, modern (5.x) mysql sdk/
+#define HAVE_MY_GLOBAL_H 1
+
+/* my_sys.h is broken on VC/Win32, and apparently not required */
+/* #undef HAVE_MY_SYS_H 0 */
+
+/*
+ * Windows does not have GDBM, and we always use the bundled (new) Expat
+ */
+
+/* Define if you have the gdbm library (-lgdbm). */
+/* #undef HAVE_LIBGDBM */
+
+/* define if Expat 1.0 or 1.1 was found */
+/* #undef APR_HAVE_OLD_EXPAT */
+
+
+#endif /* APU_CONFIG_H */
+#endif /* WIN32 */
diff --git a/contrib/apr-util/include/private/apu_internal.h b/contrib/apr-util/include/private/apu_internal.h
new file mode 100644
index 000000000000..c95c9d502c4a
--- /dev/null
+++ b/contrib/apr-util/include/private/apu_internal.h
@@ -0,0 +1,73 @@
+/* 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.h"
+#include "apr_dso.h"
+#include "apu.h"
+
+#ifndef APU_INTERNAL_H
+#define APU_INTERNAL_H
+
+#if APU_DSO_BUILD
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* For modular dso loading, an internal interlock to allow us to
+ * continue to initialize modules by multiple threads, the caller
+ * of apu_dso_load must lock first, and not unlock until any init
+ * finalization is complete.
+ */
+apr_status_t apu_dso_init(apr_pool_t *pool);
+
+apr_status_t apu_dso_mutex_lock(void);
+apr_status_t apu_dso_mutex_unlock(void);
+
+apr_status_t apu_dso_load(apr_dso_handle_t **dso, apr_dso_handle_sym_t *dsoptr, const char *module,
+ const char *modsym, apr_pool_t *pool);
+
+#if APR_HAS_LDAP
+
+/* For LDAP internal builds, wrap our LDAP namespace */
+
+struct apr__ldap_dso_fntable {
+ int (*info)(apr_pool_t *pool, apr_ldap_err_t **result_err);
+ int (*init)(apr_pool_t *pool, LDAP **ldap, const char *hostname,
+ int portno, int secure, apr_ldap_err_t **result_err);
+ int (*ssl_init)(apr_pool_t *pool, const char *cert_auth_file,
+ int cert_file_type, apr_ldap_err_t **result_err);
+ int (*ssl_deinit)(void);
+ int (*get_option)(apr_pool_t *pool, LDAP *ldap, int option,
+ void *outvalue, apr_ldap_err_t **result_err);
+ int (*set_option)(apr_pool_t *pool, LDAP *ldap, int option,
+ const void *invalue, apr_ldap_err_t **result_err);
+ apr_status_t (*rebind_init)(apr_pool_t *pool);
+ apr_status_t (*rebind_add)(apr_pool_t *pool, LDAP *ld,
+ const char *bindDN, const char *bindPW);
+ apr_status_t (*rebind_remove)(LDAP *ld);
+};
+
+#endif /* APR_HAS_LDAP */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* APU_DSO_BUILD */
+
+#endif /* APU_INTERNAL_H */
+
diff --git a/contrib/apr-util/include/private/apu_select_dbm.h.in b/contrib/apr-util/include/private/apu_select_dbm.h.in
new file mode 100644
index 000000000000..b69aec032cd1
--- /dev/null
+++ b/contrib/apr-util/include/private/apu_select_dbm.h.in
@@ -0,0 +1,28 @@
+/* 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.
+ */
+
+#ifndef APU_SELECT_DBM_H
+#define APU_SELECT_DBM_H
+
+/*
+** The following macros control what features APRUTIL will use
+*/
+#define APU_USE_SDBM @apu_use_sdbm@
+#define APU_USE_NDBM @apu_use_ndbm@
+#define APU_USE_GDBM @apu_use_gdbm@
+#define APU_USE_DB @apu_use_db@
+
+#endif /* !APU_SELECT_DBM_H */
diff --git a/contrib/apr-util/include/private/apu_select_dbm.hw b/contrib/apr-util/include/private/apu_select_dbm.hw
new file mode 100644
index 000000000000..97c7b6c22ba8
--- /dev/null
+++ b/contrib/apr-util/include/private/apu_select_dbm.hw
@@ -0,0 +1,28 @@
+/* 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.
+ */
+
+#ifndef APU_SELECT_DBM_H
+#define APU_SELECT_DBM_H
+
+/*
+** The following macros control what features APRUTIL will use
+*/
+#define APU_USE_SDBM 1
+#define APU_USE_GDBM 0
+#define APU_USE_NDBM 0
+#define APU_USE_DB 0
+
+#endif /* !APU_SELECT_DBM_H */
diff --git a/contrib/apr-util/ldap/NWGNUmakefile b/contrib/apr-util/ldap/NWGNUmakefile
new file mode 100644
index 000000000000..06260d1f4b76
--- /dev/null
+++ b/contrib/apr-util/ldap/NWGNUmakefile
@@ -0,0 +1,263 @@
+#
+# Declare the sub-directories to be built here
+#
+
+SUBDIRS = \
+ $(EOLIST)
+
+#
+# Get the 'head' of the build environment. This includes default targets and
+# paths to tools
+#
+
+include $(APR_WORK)/build/NWGNUhead.inc
+
+#
+# build this level's files
+
+#
+# Make sure all needed macro's are defined
+#
+
+#
+# These directories will be at the beginning of the include list, followed by
+# INCDIRS
+#
+XINCDIRS += \
+ $(APR)/include \
+ $(APR)/include/arch/NetWare \
+ $(APU)/include \
+ $(APU)/include/private \
+ $(LDAPSDK)/inc \
+ $(EOLIST)
+
+#
+# These flags will come after CFLAGS
+#
+XCFLAGS += \
+ $(EOLIST)
+
+#
+# These defines will come after DEFINES
+#
+XDEFINES += \
+ $(EOLIST)
+
+#
+#LDAP client requires the use of Winsock
+#
+ifdef USE_STDSOCKETS
+XDEFINES += -DUSE_WINSOCK \
+ $(EOLIST)
+endif
+
+#
+# These flags will be added to the link.opt file
+#
+XLFLAGS += \
+ $(EOLIST)
+
+#
+# These values will be appended to the correct variables based on the value of
+# RELEASE
+#
+ifeq "$(RELEASE)" "debug"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "noopt"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "release"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+#
+# These are used by the link target if an NLM is being generated
+# This is used by the link 'name' directive to name the nlm. If left blank
+# TARGET_nlm (see below) will be used.
+#
+NLM_NAME =
+
+#
+# This is used by the link '-desc ' directive.
+# If left blank, NLM_NAME will be used.
+#
+NLM_DESCRIPTION =
+
+#
+# This is used by the '-threadname' directive. If left blank,
+# NLM_NAME Thread will be used.
+#
+NLM_THREAD_NAME =
+#
+# If this is specified, it will override VERSION value in
+# $(APR_WORK)/build/NWGNUenvironment.inc
+#
+NLM_VERSION =
+
+#
+# If this is specified, it will override the default of 64K
+#
+NLM_STACK_SIZE =
+
+#
+# If this is specified it will be used by the link '-entry' directive
+#
+NLM_ENTRY_SYM =
+
+#
+# If this is specified it will be used by the link '-exit' directive
+#
+NLM_EXIT_SYM =
+
+#
+# If this is specified it will be used by the link '-check' directive
+#
+NLM_CHECK_SYM =
+
+#
+# If this is specified it will be used by the link '-flags' directive
+#
+NLM_FLAGS =
+
+#
+# If this is specified it will be linked in with the XDCData option in the def
+# file instead of the default of $(APR)/misc/netware/apache.xdc. XDCData can
+# be disabled by setting APACHE_UNIPROC in the environment
+#
+XDCDATA =
+
+#
+# Declare all target files (you must add your files here)
+#
+
+#
+# If there is an NLM target, put it here
+#
+TARGET_nlm = \
+ $(EOLIST)
+
+#
+# If there is an LIB target, put it here
+#
+TARGET_lib = \
+ $(OBJDIR)/apuldap.lib \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the NLM target above.
+# Paths must all use the '/' character
+#
+FILES_nlm_objs = \
+ $(EOLIST)
+
+#
+# These are the LIB files needed to create the NLM target above.
+# These will be added as a library command in the link.opt file.
+#
+FILES_nlm_libs = \
+ $(EOLIST)
+
+#
+# These are the modules that the above NLM target depends on to load.
+# These will be added as a module command in the link.opt file.
+#
+FILES_nlm_modules = \
+ $(EOLIST)
+
+#
+# If the nlm has a msg file, put it's path here
+#
+FILE_nlm_msg =
+
+#
+# If the nlm has a hlp file put it's path here
+#
+FILE_nlm_hlp =
+
+#
+# If this is specified, it will override the default copyright.
+#
+FILE_nlm_copyright =
+
+#
+# Any additional imports go here
+#
+FILES_nlm_Ximports = \
+ $(EOLIST)
+
+#
+# Any symbols exported to here
+#
+FILES_nlm_exports = \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the LIB target above.
+# Paths must all use the '/' character
+#
+FILES_lib_objs = \
+ $(OBJDIR)/apr_ldap_init.o \
+ $(OBJDIR)/apr_ldap_option.o \
+ $(OBJDIR)/apr_ldap_url.o \
+ $(OBJDIR)/apr_ldap_rebind.o \
+ $(OBJDIR)/apr_ldap_stub.o \
+ $(EOLIST)
+
+#
+# implement targets and dependancies (leave this section alone)
+#
+
+libs :: $(OBJDIR) $(TARGET_lib)
+
+nlms :: libs $(TARGET_nlm)
+
+#
+# Updated this target to create necessary directories and copy files to the
+# correct place. (See $(APR_WORK)/build/NWGNUhead.inc for examples)
+#
+install :: nlms FORCE
+
+#
+# Any specialized rules here
+#
+
+#
+# Include the 'tail' makefile that has targets that depend on variables defined
+# in this makefile
+#
+
+include $(APRBUILD)/NWGNUtail.inc
+
diff --git a/contrib/apr-util/ldap/apr_ldap_init.c b/contrib/apr-util/ldap/apr_ldap_init.c
new file mode 100644
index 000000000000..8aacb2a52a86
--- /dev/null
+++ b/contrib/apr-util/ldap/apr_ldap_init.c
@@ -0,0 +1,235 @@
+/* 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.
+ */
+
+/*
+ * apr_ldap_init.c: LDAP v2/v3 common initialise
+ *
+ * Original code from auth_ldap module for Apache v1.3:
+ * Copyright 1998, 1999 Enbridge Pipelines Inc.
+ * Copyright 1999-2001 Dave Carrigan
+ */
+
+#include "apr.h"
+#include "apu.h"
+#include "apu_config.h"
+
+#if APU_DSO_BUILD
+#define APU_DSO_LDAP_BUILD
+#endif
+
+#include "apr_ldap.h"
+#include "apu_internal.h"
+#include "apr_errno.h"
+#include "apr_pools.h"
+#include "apr_strings.h"
+
+#if APR_HAS_LDAP
+
+/**
+ * APR LDAP SSL Initialise function
+ *
+ * This function initialises SSL on the underlying LDAP toolkit
+ * if this is necessary.
+ *
+ * If a CA certificate is provided, this is set, however the setting
+ * of certificates via this method has been deprecated and will be removed in
+ * APR v2.0.
+ *
+ * The apr_ldap_set_option() function with the APR_LDAP_OPT_TLS_CERT option
+ * should be used instead to set certificates.
+ *
+ * If SSL support is not available on this platform, or a problem
+ * was encountered while trying to set the certificate, the function
+ * will return APR_EGENERAL. Further LDAP specific error information
+ * can be found in result_err.
+ */
+APU_DECLARE_LDAP(int) apr_ldap_ssl_init(apr_pool_t *pool,
+ const char *cert_auth_file,
+ int cert_file_type,
+ apr_ldap_err_t **result_err)
+{
+
+ apr_ldap_err_t *result = (apr_ldap_err_t *)apr_pcalloc(pool, sizeof(apr_ldap_err_t));
+ *result_err = result;
+
+#if APR_HAS_LDAP_SSL /* compiled with ssl support */
+
+ /* Novell */
+#if APR_HAS_NOVELL_LDAPSDK
+ ldapssl_client_init(NULL, NULL);
+#endif
+
+ /* if a certificate was specified, set it */
+ if (cert_auth_file) {
+ apr_ldap_opt_tls_cert_t *cert = (apr_ldap_opt_tls_cert_t *)apr_pcalloc(pool, sizeof(apr_ldap_opt_tls_cert_t));
+ cert->type = cert_file_type;
+ cert->path = cert_auth_file;
+ return apr_ldap_set_option(pool, NULL, APR_LDAP_OPT_TLS_CERT, (void *)cert, result_err);
+ }
+
+#else /* not compiled with SSL Support */
+ if (cert_auth_file) {
+ result->reason = "LDAP: Attempt to set certificate store failed. "
+ "Not built with SSL support";
+ result->rc = -1;
+ }
+#endif /* APR_HAS_LDAP_SSL */
+
+ if (result->rc != -1) {
+ result->msg = ldap_err2string(result->rc);
+ }
+
+ if (LDAP_SUCCESS != result->rc) {
+ return APR_EGENERAL;
+ }
+
+ return APR_SUCCESS;
+
+}
+
+
+/**
+ * APR LDAP SSL De-Initialise function
+ *
+ * This function tears down any SSL certificate setup previously
+ * set using apr_ldap_ssl_init(). It should be called to clean
+ * up if a graceful restart of a service is attempted.
+ *
+ * This function only does anything on Netware.
+ *
+ * @todo currently we do not check whether apr_ldap_ssl_init()
+ * has been called first - should we?
+ */
+APU_DECLARE_LDAP(int) apr_ldap_ssl_deinit(void)
+{
+
+#if APR_HAS_LDAP_SSL && APR_HAS_LDAPSSL_CLIENT_DEINIT
+ ldapssl_client_deinit();
+#endif
+ return APR_SUCCESS;
+
+}
+
+
+/**
+ * APR LDAP initialise function
+ *
+ * This function is responsible for initialising an LDAP
+ * connection in a toolkit independant way. It does the
+ * job of ldap_init() from the C api.
+ *
+ * It handles both the SSL and non-SSL case, and attempts
+ * to hide the complexity setup from the user. This function
+ * assumes that any certificate setup necessary has already
+ * been done.
+ *
+ * If SSL or STARTTLS needs to be enabled, and the underlying
+ * toolkit supports it, the following values are accepted for
+ * secure:
+ *
+ * APR_LDAP_NONE: No encryption
+ * APR_LDAP_SSL: SSL encryption (ldaps://)
+ * APR_LDAP_STARTTLS: Force STARTTLS on ldap://
+ */
+APU_DECLARE_LDAP(int) apr_ldap_init(apr_pool_t *pool,
+ LDAP **ldap,
+ const char *hostname,
+ int portno,
+ int secure,
+ apr_ldap_err_t **result_err)
+{
+
+ apr_ldap_err_t *result = (apr_ldap_err_t *)apr_pcalloc(pool, sizeof(apr_ldap_err_t));
+ *result_err = result;
+
+#if APR_HAS_LDAPSSL_INIT
+#if APR_HAS_SOLARIS_LDAPSDK
+ /*
+ * Using the secure argument should aways be possible. But as LDAP SDKs
+ * tend to have different quirks and bugs, this needs to be tested for
+ * for each of them, first. For Solaris LDAP it works, and the method
+ * with ldap_set_option doesn't.
+ */
+ *ldap = ldapssl_init(hostname, portno, secure == APR_LDAP_SSL);
+#else
+ *ldap = ldapssl_init(hostname, portno, 0);
+#endif
+#elif APR_HAS_LDAP_SSLINIT
+ *ldap = ldap_sslinit((char *)hostname, portno, 0);
+#else
+ *ldap = ldap_init((char *)hostname, portno);
+#endif
+
+ if (*ldap != NULL) {
+#if APR_HAS_SOLARIS_LDAPSDK
+ if (secure == APR_LDAP_SSL)
+ return APR_SUCCESS;
+ else
+#endif
+ return apr_ldap_set_option(pool, *ldap, APR_LDAP_OPT_TLS, &secure, result_err);
+ }
+ else {
+ /* handle the error case */
+ apr_ldap_err_t *result = (apr_ldap_err_t *)apr_pcalloc(pool, sizeof(apr_ldap_err_t));
+ *result_err = result;
+
+ result->reason = "APR LDAP: Unable to initialize the LDAP connection";
+ result->rc = -1;
+ return APR_EGENERAL;
+ }
+
+}
+
+
+/**
+ * APR LDAP info function
+ *
+ * This function returns a string describing the LDAP toolkit
+ * currently in use. The string is placed inside result_err->reason.
+ */
+APU_DECLARE_LDAP(int) apr_ldap_info(apr_pool_t *pool,
+ apr_ldap_err_t **result_err)
+{
+ apr_ldap_err_t *result = (apr_ldap_err_t *)apr_pcalloc(pool, sizeof(apr_ldap_err_t));
+ *result_err = result;
+
+ result->reason = "APR LDAP: Built with "
+ LDAP_VENDOR_NAME
+ " LDAP SDK";
+ return APR_SUCCESS;
+
+}
+
+#if APU_DSO_BUILD
+
+/* For DSO builds, export the table of entry points into the apr_ldap DSO
+ * See include/private/apu_internal.h for the corresponding declarations
+ */
+APU_MODULE_DECLARE_DATA struct apr__ldap_dso_fntable apr__ldap_fns = {
+ apr_ldap_info,
+ apr_ldap_init,
+ apr_ldap_ssl_init,
+ apr_ldap_ssl_deinit,
+ apr_ldap_get_option,
+ apr_ldap_set_option,
+ apr_ldap_rebind_init,
+ apr_ldap_rebind_add,
+ apr_ldap_rebind_remove
+};
+
+#endif /* APU_DSO_BUILD */
+
+#endif /* APR_HAS_LDAP */
diff --git a/contrib/apr-util/ldap/apr_ldap_option.c b/contrib/apr-util/ldap/apr_ldap_option.c
new file mode 100644
index 000000000000..0c055b4e0016
--- /dev/null
+++ b/contrib/apr-util/ldap/apr_ldap_option.c
@@ -0,0 +1,652 @@
+/* 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.
+ */
+
+/* apr_ldap_option.c -- LDAP options
+ *
+ * The LDAP SDK allows the getting and setting of options on an LDAP
+ * connection.
+ *
+ */
+
+#include "apr.h"
+#include "apu.h"
+#include "apu_config.h"
+
+#if APU_DSO_BUILD
+#define APU_DSO_LDAP_BUILD
+#endif
+
+#include "apr_ldap.h"
+#include "apr_errno.h"
+#include "apr_pools.h"
+#include "apr_strings.h"
+#include "apr_tables.h"
+
+#if APR_HAS_LDAP
+
+static void option_set_cert(apr_pool_t *pool, LDAP *ldap, const void *invalue,
+ apr_ldap_err_t *result);
+static void option_set_tls(apr_pool_t *pool, LDAP *ldap, const void *invalue,
+ apr_ldap_err_t *result);
+
+/**
+ * APR LDAP get option function
+ *
+ * This function gets option values from a given LDAP session if
+ * one was specified.
+ */
+APU_DECLARE_LDAP(int) apr_ldap_get_option(apr_pool_t *pool,
+ LDAP *ldap,
+ int option,
+ void *outvalue,
+ apr_ldap_err_t **result_err)
+{
+ apr_ldap_err_t *result;
+
+ result = apr_pcalloc(pool, sizeof(apr_ldap_err_t));
+ *result_err = result;
+ if (!result) {
+ return APR_ENOMEM;
+ }
+
+ /* get the option specified using the native LDAP function */
+ result->rc = ldap_get_option(ldap, option, outvalue);
+
+ /* handle the error case */
+ if (result->rc != LDAP_SUCCESS) {
+ result->msg = ldap_err2string(result-> rc);
+ result->reason = apr_pstrdup(pool, "LDAP: Could not get an option");
+ return APR_EGENERAL;
+ }
+
+ return APR_SUCCESS;
+
+}
+
+/**
+ * APR LDAP set option function
+ *
+ * This function sets option values to a given LDAP session if
+ * one was specified.
+ *
+ * Where an option is not supported by an LDAP toolkit, this function
+ * will try and apply legacy functions to achieve the same effect,
+ * depending on the platform.
+ */
+APU_DECLARE_LDAP(int) apr_ldap_set_option(apr_pool_t *pool,
+ LDAP *ldap,
+ int option,
+ const void *invalue,
+ apr_ldap_err_t **result_err)
+{
+ apr_ldap_err_t *result;
+
+ result = apr_pcalloc(pool, sizeof(apr_ldap_err_t));
+ *result_err = result;
+ if (!result) {
+ return APR_ENOMEM;
+ }
+
+ switch (option) {
+ case APR_LDAP_OPT_TLS_CERT:
+ option_set_cert(pool, ldap, invalue, result);
+ break;
+
+ case APR_LDAP_OPT_TLS:
+ option_set_tls(pool, ldap, invalue, result);
+ break;
+
+ case APR_LDAP_OPT_VERIFY_CERT:
+#if APR_HAS_NETSCAPE_LDAPSDK || APR_HAS_SOLARIS_LDAPSDK || APR_HAS_MOZILLA_LDAPSK
+ result->reason = "LDAP: Verify certificate not yet supported by APR on the "
+ "Netscape, Solaris or Mozilla LDAP SDKs";
+ result->rc = -1;
+ return APR_EGENERAL;
+#endif
+#if APR_HAS_NOVELL_LDAPSDK
+ if (*((int*)invalue)) {
+ result->rc = ldapssl_set_verify_mode(LDAPSSL_VERIFY_SERVER);
+ }
+ else {
+ result->rc = ldapssl_set_verify_mode(LDAPSSL_VERIFY_NONE);
+ }
+#endif
+#if APR_HAS_OPENLDAP_LDAPSDK
+#ifdef LDAP_OPT_X_TLS
+ /* This is not a per-connection setting so just pass NULL for the
+ Ldap connection handle */
+ if (*((int*)invalue)) {
+ int i = LDAP_OPT_X_TLS_DEMAND;
+ result->rc = ldap_set_option(NULL, LDAP_OPT_X_TLS_REQUIRE_CERT, &i);
+ }
+ else {
+ int i = LDAP_OPT_X_TLS_NEVER;
+ result->rc = ldap_set_option(NULL, LDAP_OPT_X_TLS_REQUIRE_CERT, &i);
+ }
+#else
+ result->reason = "LDAP: SSL/TLS not yet supported by APR on this "
+ "version of the OpenLDAP toolkit";
+ result->rc = -1;
+ return APR_EGENERAL;
+#endif
+#endif
+
+ /* handle the error case */
+ if (result->rc != LDAP_SUCCESS) {
+ result->msg = ldap_err2string(result->rc);
+ result->reason = "LDAP: Could not set verify mode";
+ }
+ break;
+
+ case APR_LDAP_OPT_REFERRALS:
+ /* Setting this option is supported on at least TIVOLI_SDK and OpenLDAP. Folks
+ * who know the NOVELL, NETSCAPE, MOZILLA, and SOLARIS SDKs should note here if
+ * the SDK at least tolerates this option being set, or add an elif to handle
+ * special cases (i.e. different LDAP_OPT_X value).
+ */
+ result->rc = ldap_set_option(ldap, LDAP_OPT_REFERRALS, (void *)invalue);
+
+ if (result->rc != LDAP_SUCCESS) {
+ result->reason = "Unable to set LDAP_OPT_REFERRALS.";
+ return(result->rc);
+ }
+ break;
+
+ case APR_LDAP_OPT_REFHOPLIMIT:
+#if !defined(LDAP_OPT_REFHOPLIMIT) || APR_HAS_NOVELL_LDAPSDK
+ /* If the LDAP_OPT_REFHOPLIMIT symbol is missing, assume that the
+ * particular LDAP library has a reasonable default. So far certain
+ * versions of the OpenLDAP SDK miss this symbol (but default to 5),
+ * and the Microsoft SDK misses the symbol (the default is not known).
+ */
+ result->rc = LDAP_SUCCESS;
+#else
+ /* Setting this option is supported on at least TIVOLI_SDK. Folks who know
+ * the NOVELL, NETSCAPE, MOZILLA, and SOLARIS SDKs should note here if
+ * the SDK at least tolerates this option being set, or add an elif to handle
+ * special cases so an error isn't returned if there is a perfectly good
+ * default value that just can't be changed (like openLDAP).
+ */
+ result->rc = ldap_set_option(ldap, LDAP_OPT_REFHOPLIMIT, (void *)invalue);
+#endif
+
+ if (result->rc != LDAP_SUCCESS) {
+ result->reason = "Unable to set LDAP_OPT_REFHOPLIMIT.";
+ return(result->rc);
+ }
+ break;
+
+ default:
+ /* set the option specified using the native LDAP function */
+ result->rc = ldap_set_option(ldap, option, (void *)invalue);
+
+ /* handle the error case */
+ if (result->rc != LDAP_SUCCESS) {
+ result->msg = ldap_err2string(result->rc);
+ result->reason = "LDAP: Could not set an option";
+ }
+ break;
+ }
+
+ /* handle the error case */
+ if (result->rc != LDAP_SUCCESS) {
+ return APR_EGENERAL;
+ }
+
+ return APR_SUCCESS;
+
+}
+
+/**
+ * Handle APR_LDAP_OPT_TLS
+ *
+ * This function sets the type of TLS to be applied to this connection.
+ * The options are:
+ * APR_LDAP_NONE: no encryption
+ * APR_LDAP_SSL: SSL encryption (ldaps://)
+ * APR_LDAP_STARTTLS: STARTTLS encryption
+ * APR_LDAP_STOPTLS: Stop existing TLS connecttion
+ */
+static void option_set_tls(apr_pool_t *pool, LDAP *ldap, const void *invalue,
+ apr_ldap_err_t *result)
+{
+#if APR_HAS_LDAP_SSL /* compiled with ssl support */
+
+ int tls = * (const int *)invalue;
+
+ /* Netscape/Mozilla/Solaris SDK */
+#if APR_HAS_NETSCAPE_LDAPSDK || APR_HAS_SOLARIS_LDAPSDK || APR_HAS_MOZILLA_LDAPSK
+#if APR_HAS_LDAPSSL_INSTALL_ROUTINES
+ if (tls == APR_LDAP_SSL) {
+ result->rc = ldapssl_install_routines(ldap);
+#ifdef LDAP_OPT_SSL
+ /* apparently Netscape and Mozilla need this too, Solaris doesn't */
+ if (result->rc == LDAP_SUCCESS) {
+ result->rc = ldap_set_option(ldap, LDAP_OPT_SSL, LDAP_OPT_ON);
+ }
+#endif
+ if (result->rc != LDAP_SUCCESS) {
+ result->msg = ldap_err2string(result->rc);
+ result->reason = "LDAP: Could not switch SSL on for this "
+ "connection.";
+ }
+ }
+ else if (tls == APR_LDAP_STARTTLS) {
+ result->reason = "LDAP: STARTTLS is not supported by the "
+ "Netscape/Mozilla/Solaris SDK";
+ result->rc = -1;
+ }
+ else if (tls == APR_LDAP_STOPTLS) {
+ result->reason = "LDAP: STOPTLS is not supported by the "
+ "Netscape/Mozilla/Solaris SDK";
+ result->rc = -1;
+ }
+#else
+ if (tls != APR_LDAP_NONE) {
+ result->reason = "LDAP: SSL/TLS is not supported by this version "
+ "of the Netscape/Mozilla/Solaris SDK";
+ result->rc = -1;
+ }
+#endif
+#endif
+
+ /* Novell SDK */
+#if APR_HAS_NOVELL_LDAPSDK
+ /* ldapssl_install_routines(ldap)
+ * Behavior is unpredictable when other LDAP functions are called
+ * between the ldap_init function and the ldapssl_install_routines
+ * function.
+ *
+ * STARTTLS is supported by the ldap_start_tls_s() method
+ */
+ if (tls == APR_LDAP_SSL) {
+ result->rc = ldapssl_install_routines(ldap);
+ if (result->rc != LDAP_SUCCESS) {
+ result->msg = ldap_err2string(result->rc);
+ result->reason = "LDAP: Could not switch SSL on for this "
+ "connection.";
+ }
+ }
+ if (tls == APR_LDAP_STARTTLS) {
+ result->rc = ldapssl_start_tls(ldap);
+ if (result->rc != LDAP_SUCCESS) {
+ result->msg = ldap_err2string(result->rc);
+ result->reason = "LDAP: Could not start TLS on this connection";
+ }
+ }
+ else if (tls == APR_LDAP_STOPTLS) {
+ result->rc = ldapssl_stop_tls(ldap);
+ if (result->rc != LDAP_SUCCESS) {
+ result->msg = ldap_err2string(result->rc);
+ result->reason = "LDAP: Could not stop TLS on this connection";
+ }
+ }
+#endif
+
+ /* OpenLDAP SDK */
+#if APR_HAS_OPENLDAP_LDAPSDK
+#ifdef LDAP_OPT_X_TLS
+ if (tls == APR_LDAP_SSL) {
+ int SSLmode = LDAP_OPT_X_TLS_HARD;
+ result->rc = ldap_set_option(ldap, LDAP_OPT_X_TLS, &SSLmode);
+ if (result->rc != LDAP_SUCCESS) {
+ result->reason = "LDAP: ldap_set_option failed. "
+ "Could not set LDAP_OPT_X_TLS to "
+ "LDAP_OPT_X_TLS_HARD";
+ result->msg = ldap_err2string(result->rc);
+ }
+ }
+ else if (tls == APR_LDAP_STARTTLS) {
+ result->rc = ldap_start_tls_s(ldap, NULL, NULL);
+ if (result->rc != LDAP_SUCCESS) {
+ result->reason = "LDAP: ldap_start_tls_s() failed";
+ result->msg = ldap_err2string(result->rc);
+ }
+ }
+ else if (tls == APR_LDAP_STOPTLS) {
+ result->reason = "LDAP: STOPTLS is not supported by the "
+ "OpenLDAP SDK";
+ result->rc = -1;
+ }
+#else
+ if (tls != APR_LDAP_NONE) {
+ result->reason = "LDAP: SSL/TLS not yet supported by APR on this "
+ "version of the OpenLDAP toolkit";
+ result->rc = -1;
+ }
+#endif
+#endif
+
+ /* Microsoft SDK */
+#if APR_HAS_MICROSOFT_LDAPSDK
+ if (tls == APR_LDAP_NONE) {
+ ULONG ul = (ULONG) LDAP_OPT_OFF;
+ result->rc = ldap_set_option(ldap, LDAP_OPT_SSL, &ul);
+ if (result->rc != LDAP_SUCCESS) {
+ result->reason = "LDAP: an attempt to set LDAP_OPT_SSL off "
+ "failed.";
+ result->msg = ldap_err2string(result->rc);
+ }
+ }
+ else if (tls == APR_LDAP_SSL) {
+ ULONG ul = (ULONG) LDAP_OPT_ON;
+ result->rc = ldap_set_option(ldap, LDAP_OPT_SSL, &ul);
+ if (result->rc != LDAP_SUCCESS) {
+ result->reason = "LDAP: an attempt to set LDAP_OPT_SSL on "
+ "failed.";
+ result->msg = ldap_err2string(result->rc);
+ }
+ }
+#if APR_HAS_LDAP_START_TLS_S
+ else if (tls == APR_LDAP_STARTTLS) {
+ result->rc = ldap_start_tls_s(ldap, NULL, NULL, NULL, NULL);
+ if (result->rc != LDAP_SUCCESS) {
+ result->reason = "LDAP: ldap_start_tls_s() failed";
+ result->msg = ldap_err2string(result->rc);
+ }
+ }
+ else if (tls == APR_LDAP_STOPTLS) {
+ result->rc = ldap_stop_tls_s(ldap);
+ if (result->rc != LDAP_SUCCESS) {
+ result->reason = "LDAP: ldap_stop_tls_s() failed";
+ result->msg = ldap_err2string(result->rc);
+ }
+ }
+#endif
+#endif
+
+#if APR_HAS_OTHER_LDAPSDK
+ if (tls != APR_LDAP_NONE) {
+ result->reason = "LDAP: SSL/TLS is currently not supported by "
+ "APR on this LDAP SDK";
+ result->rc = -1;
+ }
+#endif
+
+#endif /* APR_HAS_LDAP_SSL */
+
+}
+
+/**
+ * Handle APR_LDAP_OPT_TLS_CACERTFILE
+ *
+ * This function sets the CA certificate for further SSL/TLS connections.
+ *
+ * The file provided are in different formats depending on the toolkit used:
+ *
+ * Netscape: cert7.db file
+ * Novell: PEM or DER
+ * OpenLDAP: PEM (others supported?)
+ * Microsoft: unknown
+ * Solaris: unknown
+ */
+static void option_set_cert(apr_pool_t *pool, LDAP *ldap,
+ const void *invalue, apr_ldap_err_t *result)
+{
+#if APR_HAS_LDAP_SSL
+#if APR_HAS_LDAPSSL_CLIENT_INIT || APR_HAS_OPENLDAP_LDAPSDK
+ apr_array_header_t *certs = (apr_array_header_t *)invalue;
+ struct apr_ldap_opt_tls_cert_t *ents = (struct apr_ldap_opt_tls_cert_t *)certs->elts;
+ int i = 0;
+#endif
+
+ /* Netscape/Mozilla/Solaris SDK */
+#if APR_HAS_NETSCAPE_LDAPSDK || APR_HAS_SOLARIS_LDAPSDK || APR_HAS_MOZILLA_LDAPSDK
+#if APR_HAS_LDAPSSL_CLIENT_INIT
+ const char *nickname = NULL;
+ const char *secmod = NULL;
+ const char *key3db = NULL;
+ const char *cert7db = NULL;
+ const char *password = NULL;
+
+ /* set up cert7.db, key3.db and secmod parameters */
+ for (i = 0; i < certs->nelts; i++) {
+ switch (ents[i].type) {
+ case APR_LDAP_CA_TYPE_CERT7_DB:
+ cert7db = ents[i].path;
+ break;
+ case APR_LDAP_CA_TYPE_SECMOD:
+ secmod = ents[i].path;
+ break;
+ case APR_LDAP_CERT_TYPE_KEY3_DB:
+ key3db = ents[i].path;
+ break;
+ case APR_LDAP_CERT_TYPE_NICKNAME:
+ nickname = ents[i].path;
+ password = ents[i].password;
+ break;
+ default:
+ result->rc = -1;
+ result->reason = "LDAP: The Netscape/Mozilla LDAP SDK only "
+ "understands the CERT7, KEY3 and SECMOD "
+ "file types.";
+ break;
+ }
+ if (result->rc != LDAP_SUCCESS) {
+ break;
+ }
+ }
+
+ /* actually set the certificate parameters */
+ if (result->rc == LDAP_SUCCESS) {
+ if (nickname) {
+ result->rc = ldapssl_enable_clientauth(ldap, "",
+ (char *)password,
+ (char *)nickname);
+ if (result->rc != LDAP_SUCCESS) {
+ result->reason = "LDAP: could not set client certificate: "
+ "ldapssl_enable_clientauth() failed.";
+ result->msg = ldap_err2string(result->rc);
+ }
+ }
+ else if (secmod) {
+ result->rc = ldapssl_advclientauth_init(cert7db, NULL,
+ key3db ? 1 : 0, key3db, NULL,
+ 1, secmod, LDAPSSL_AUTH_CNCHECK);
+ if (result->rc != LDAP_SUCCESS) {
+ result->reason = "LDAP: ldapssl_advclientauth_init() failed.";
+ result->msg = ldap_err2string(result->rc);
+ }
+ }
+ else if (key3db) {
+ result->rc = ldapssl_clientauth_init(cert7db, NULL,
+ 1, key3db, NULL);
+ if (result->rc != LDAP_SUCCESS) {
+ result->reason = "LDAP: ldapssl_clientauth_init() failed.";
+ result->msg = ldap_err2string(result->rc);
+ }
+ }
+ else {
+ result->rc = ldapssl_client_init(cert7db, NULL);
+ if (result->rc != LDAP_SUCCESS) {
+ result->reason = "LDAP: ldapssl_client_init() failed.";
+ result->msg = ldap_err2string(result->rc);
+ }
+ }
+ }
+#else
+ result->reason = "LDAP: SSL/TLS ldapssl_client_init() function not "
+ "supported by this Netscape/Mozilla/Solaris SDK. "
+ "Certificate authority file not set";
+ result->rc = -1;
+#endif
+#endif
+
+ /* Novell SDK */
+#if APR_HAS_NOVELL_LDAPSDK
+#if APR_HAS_LDAPSSL_CLIENT_INIT && APR_HAS_LDAPSSL_ADD_TRUSTED_CERT && APR_HAS_LDAPSSL_CLIENT_DEINIT
+ /* The Novell library cannot support per connection certificates. Error
+ * out if the ldap handle is provided.
+ */
+ if (ldap) {
+ result->rc = -1;
+ result->reason = "LDAP: The Novell LDAP SDK cannot support the setting "
+ "of certificates or keys on a per connection basis.";
+ }
+ /* Novell's library needs to be initialised first */
+ else {
+ result->rc = ldapssl_client_init(NULL, NULL);
+ if (result->rc != LDAP_SUCCESS) {
+ result->msg = ldap_err2string(result-> rc);
+ result->reason = apr_pstrdup(pool, "LDAP: Could not "
+ "initialize SSL");
+ }
+ }
+ /* set one or more certificates */
+ for (i = 0; LDAP_SUCCESS == result->rc && i < certs->nelts; i++) {
+ /* Novell SDK supports DER or BASE64 files. */
+ switch (ents[i].type) {
+ case APR_LDAP_CA_TYPE_DER:
+ result->rc = ldapssl_add_trusted_cert((void *)ents[i].path,
+ LDAPSSL_CERT_FILETYPE_DER);
+ result->msg = ldap_err2string(result->rc);
+ break;
+ case APR_LDAP_CA_TYPE_BASE64:
+ result->rc = ldapssl_add_trusted_cert((void *)ents[i].path,
+ LDAPSSL_CERT_FILETYPE_B64);
+ result->msg = ldap_err2string(result->rc);
+ break;
+ case APR_LDAP_CERT_TYPE_DER:
+ result->rc = ldapssl_set_client_cert((void *)ents[i].path,
+ LDAPSSL_CERT_FILETYPE_DER,
+ (void*)ents[i].password);
+ result->msg = ldap_err2string(result->rc);
+ break;
+ case APR_LDAP_CERT_TYPE_BASE64:
+ result->rc = ldapssl_set_client_cert((void *)ents[i].path,
+ LDAPSSL_CERT_FILETYPE_B64,
+ (void*)ents[i].password);
+ result->msg = ldap_err2string(result->rc);
+ break;
+ case APR_LDAP_CERT_TYPE_PFX:
+ result->rc = ldapssl_set_client_cert((void *)ents[i].path,
+ LDAPSSL_FILETYPE_P12,
+ (void*)ents[i].password);
+ result->msg = ldap_err2string(result->rc);
+ break;
+ case APR_LDAP_KEY_TYPE_DER:
+ result->rc = ldapssl_set_client_private_key((void *)ents[i].path,
+ LDAPSSL_CERT_FILETYPE_DER,
+ (void*)ents[i].password);
+ result->msg = ldap_err2string(result->rc);
+ break;
+ case APR_LDAP_KEY_TYPE_BASE64:
+ result->rc = ldapssl_set_client_private_key((void *)ents[i].path,
+ LDAPSSL_CERT_FILETYPE_B64,
+ (void*)ents[i].password);
+ result->msg = ldap_err2string(result->rc);
+ break;
+ case APR_LDAP_KEY_TYPE_PFX:
+ result->rc = ldapssl_set_client_private_key((void *)ents[i].path,
+ LDAPSSL_FILETYPE_P12,
+ (void*)ents[i].password);
+ result->msg = ldap_err2string(result->rc);
+ break;
+ default:
+ result->rc = -1;
+ result->reason = "LDAP: The Novell LDAP SDK only understands the "
+ "DER and PEM (BASE64) file types.";
+ break;
+ }
+ if (result->rc != LDAP_SUCCESS) {
+ break;
+ }
+ }
+#else
+ result->reason = "LDAP: ldapssl_client_init(), "
+ "ldapssl_add_trusted_cert() or "
+ "ldapssl_client_deinit() functions not supported "
+ "by this Novell SDK. Certificate authority file "
+ "not set";
+ result->rc = -1;
+#endif
+#endif
+
+ /* OpenLDAP SDK */
+#if APR_HAS_OPENLDAP_LDAPSDK
+#ifdef LDAP_OPT_X_TLS_CACERTFILE
+ /* set one or more certificates */
+ /* FIXME: make it support setting directories as well as files */
+ for (i = 0; i < certs->nelts; i++) {
+ /* OpenLDAP SDK supports BASE64 files. */
+ switch (ents[i].type) {
+ case APR_LDAP_CA_TYPE_BASE64:
+ result->rc = ldap_set_option(ldap, LDAP_OPT_X_TLS_CACERTFILE,
+ (void *)ents[i].path);
+ result->msg = ldap_err2string(result->rc);
+ break;
+ case APR_LDAP_CERT_TYPE_BASE64:
+ result->rc = ldap_set_option(ldap, LDAP_OPT_X_TLS_CERTFILE,
+ (void *)ents[i].path);
+ result->msg = ldap_err2string(result->rc);
+ break;
+ case APR_LDAP_KEY_TYPE_BASE64:
+ result->rc = ldap_set_option(ldap, LDAP_OPT_X_TLS_KEYFILE,
+ (void *)ents[i].path);
+ result->msg = ldap_err2string(result->rc);
+ break;
+#ifdef LDAP_OPT_X_TLS_CACERTDIR
+ case APR_LDAP_CA_TYPE_CACERTDIR_BASE64:
+ result->rc = ldap_set_option(ldap, LDAP_OPT_X_TLS_CACERTDIR,
+ (void *)ents[i].path);
+ result->msg = ldap_err2string(result->rc);
+ break;
+#endif
+ default:
+ result->rc = -1;
+ result->reason = "LDAP: The OpenLDAP SDK only understands the "
+ "PEM (BASE64) file type.";
+ break;
+ }
+ if (result->rc != LDAP_SUCCESS) {
+ break;
+ }
+ }
+#else
+ result->reason = "LDAP: LDAP_OPT_X_TLS_CACERTFILE not "
+ "defined by this OpenLDAP SDK. Certificate "
+ "authority file not set";
+ result->rc = -1;
+#endif
+#endif
+
+ /* Microsoft SDK */
+#if APR_HAS_MICROSOFT_LDAPSDK
+ /* Microsoft SDK use the registry certificate store - error out
+ * here with a message explaining this. */
+ result->reason = "LDAP: CA certificates cannot be set using this method, "
+ "as they are stored in the registry instead.";
+ result->rc = -1;
+#endif
+
+ /* SDK not recognised */
+#if APR_HAS_OTHER_LDAPSDK
+ result->reason = "LDAP: LDAP_OPT_X_TLS_CACERTFILE not "
+ "defined by this LDAP SDK. Certificate "
+ "authority file not set";
+ result->rc = -1;
+#endif
+
+#else /* not compiled with SSL Support */
+ result->reason = "LDAP: Attempt to set certificate(s) failed. "
+ "Not built with SSL support";
+ result->rc = -1;
+#endif /* APR_HAS_LDAP_SSL */
+
+}
+
+#endif /* APR_HAS_LDAP */
+
diff --git a/contrib/apr-util/ldap/apr_ldap_rebind.c b/contrib/apr-util/ldap/apr_ldap_rebind.c
new file mode 100644
index 000000000000..1f91b2bb7144
--- /dev/null
+++ b/contrib/apr-util/ldap/apr_ldap_rebind.c
@@ -0,0 +1,377 @@
+/* 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.
+ */
+
+/* apr_ldap_rebind.c -- LDAP rebind callbacks for referrals
+ *
+ * The LDAP SDK allows a callback to be set to enable rebinding
+ * for referral processing.
+ *
+ */
+
+#include "apr.h"
+#include "apu.h"
+#include "apu_config.h"
+
+#if APU_DSO_BUILD
+#define APU_DSO_LDAP_BUILD
+#endif
+
+#include "apr_ldap.h"
+#include "apr_errno.h"
+#include "apr_strings.h"
+#include "apr_ldap_rebind.h"
+
+#include "stdio.h"
+
+#if APR_HAS_LDAP
+
+/* Used to store information about connections for use in the referral rebind callback. */
+struct apr_ldap_rebind_entry {
+ apr_pool_t *pool;
+ LDAP *index;
+ const char *bindDN;
+ const char *bindPW;
+ struct apr_ldap_rebind_entry *next;
+};
+typedef struct apr_ldap_rebind_entry apr_ldap_rebind_entry_t;
+
+
+#ifdef NETWARE
+#include "apr_private.h"
+#define get_apd APP_DATA* apd = (APP_DATA*)get_app_data(gLibId);
+#define apr_ldap_xref_lock ((apr_thread_mutex_t *)(apd->gs_ldap_xref_lock))
+#define xref_head ((apr_ldap_rebind_entry_t *)(apd->gs_xref_head))
+#else
+#if APR_HAS_THREADS
+static apr_thread_mutex_t *apr_ldap_xref_lock = NULL;
+#endif
+static apr_ldap_rebind_entry_t *xref_head = NULL;
+#endif
+
+static int apr_ldap_rebind_set_callback(LDAP *ld);
+static apr_status_t apr_ldap_rebind_remove_helper(void *data);
+
+static apr_status_t apr_ldap_pool_cleanup_set_null(void *data_)
+{
+ void **ptr = (void **)data_;
+ *ptr = NULL;
+ return APR_SUCCESS;
+}
+
+
+/* APR utility routine used to create the xref_lock. */
+APU_DECLARE_LDAP(apr_status_t) apr_ldap_rebind_init(apr_pool_t *pool)
+{
+ apr_status_t retcode = APR_SUCCESS;
+
+#ifdef NETWARE
+ get_apd
+#endif
+
+#if APR_HAS_THREADS
+ /* run after apr_thread_mutex_create cleanup */
+ apr_pool_cleanup_register(pool, &apr_ldap_xref_lock, apr_ldap_pool_cleanup_set_null,
+ apr_pool_cleanup_null);
+
+ if (apr_ldap_xref_lock == NULL) {
+ retcode = apr_thread_mutex_create(&apr_ldap_xref_lock, APR_THREAD_MUTEX_DEFAULT, pool);
+ }
+#endif
+
+ return(retcode);
+}
+
+
+APU_DECLARE_LDAP(apr_status_t) apr_ldap_rebind_add(apr_pool_t *pool,
+ LDAP *ld,
+ const char *bindDN,
+ const char *bindPW)
+{
+ apr_status_t retcode = APR_SUCCESS;
+ apr_ldap_rebind_entry_t *new_xref;
+
+#ifdef NETWARE
+ get_apd
+#endif
+
+ new_xref = (apr_ldap_rebind_entry_t *)apr_pcalloc(pool, sizeof(apr_ldap_rebind_entry_t));
+ if (new_xref) {
+ new_xref->pool = pool;
+ new_xref->index = ld;
+ if (bindDN) {
+ new_xref->bindDN = apr_pstrdup(pool, bindDN);
+ }
+ if (bindPW) {
+ new_xref->bindPW = apr_pstrdup(pool, bindPW);
+ }
+
+#if APR_HAS_THREADS
+ retcode = apr_thread_mutex_lock(apr_ldap_xref_lock);
+ if (retcode != APR_SUCCESS) {
+ return retcode;
+ }
+#endif
+
+ new_xref->next = xref_head;
+ xref_head = new_xref;
+
+#if APR_HAS_THREADS
+ retcode = apr_thread_mutex_unlock(apr_ldap_xref_lock);
+ if (retcode != APR_SUCCESS) {
+ return retcode;
+ }
+#endif
+ }
+ else {
+ return(APR_ENOMEM);
+ }
+
+ retcode = apr_ldap_rebind_set_callback(ld);
+ if (APR_SUCCESS != retcode) {
+ apr_ldap_rebind_remove(ld);
+ return retcode;
+ }
+
+ apr_pool_cleanup_register(pool, ld,
+ apr_ldap_rebind_remove_helper,
+ apr_pool_cleanup_null);
+
+ return(APR_SUCCESS);
+}
+
+
+APU_DECLARE_LDAP(apr_status_t) apr_ldap_rebind_remove(LDAP *ld)
+{
+ apr_ldap_rebind_entry_t *tmp_xref, *prev = NULL;
+ apr_status_t retcode = 0;
+
+#ifdef NETWARE
+ get_apd
+#endif
+
+#if APR_HAS_THREADS
+ retcode = apr_thread_mutex_lock(apr_ldap_xref_lock);
+ if (retcode != APR_SUCCESS) {
+ return retcode;
+ }
+#endif
+ tmp_xref = xref_head;
+
+ while ((tmp_xref) && (tmp_xref->index != ld)) {
+ prev = tmp_xref;
+ tmp_xref = tmp_xref->next;
+ }
+
+ if (tmp_xref) {
+ if (tmp_xref == xref_head) {
+ xref_head = xref_head->next;
+ }
+ else {
+ prev->next = tmp_xref->next;
+ }
+
+ /* tmp_xref and its contents were pool allocated so they don't need to be freed here. */
+
+ /* remove the cleanup, just in case this was done manually */
+ apr_pool_cleanup_kill(tmp_xref->pool, tmp_xref->index,
+ apr_ldap_rebind_remove_helper);
+ }
+
+#if APR_HAS_THREADS
+ retcode = apr_thread_mutex_unlock(apr_ldap_xref_lock);
+ if (retcode != APR_SUCCESS) {
+ return retcode;
+ }
+#endif
+ return APR_SUCCESS;
+}
+
+
+static apr_status_t apr_ldap_rebind_remove_helper(void *data)
+{
+ LDAP *ld = (LDAP *)data;
+ apr_ldap_rebind_remove(ld);
+ return APR_SUCCESS;
+}
+
+#if APR_HAS_TIVOLI_LDAPSDK || APR_HAS_OPENLDAP_LDAPSDK || APR_HAS_NOVELL_LDAPSDK
+static apr_ldap_rebind_entry_t *apr_ldap_rebind_lookup(LDAP *ld)
+{
+ apr_ldap_rebind_entry_t *tmp_xref, *match = NULL;
+
+#ifdef NETWARE
+ get_apd
+#endif
+
+#if APR_HAS_THREADS
+ apr_thread_mutex_lock(apr_ldap_xref_lock);
+#endif
+ tmp_xref = xref_head;
+
+ while (tmp_xref) {
+ if (tmp_xref->index == ld) {
+ match = tmp_xref;
+ tmp_xref = NULL;
+ }
+ else {
+ tmp_xref = tmp_xref->next;
+ }
+ }
+
+#if APR_HAS_THREADS
+ apr_thread_mutex_unlock(apr_ldap_xref_lock);
+#endif
+
+ return (match);
+}
+#endif
+
+#if APR_HAS_TIVOLI_LDAPSDK
+
+/* LDAP_rebindproc() Tivoli LDAP style
+ * Rebind callback function. Called when chasing referrals. See API docs.
+ * ON ENTRY:
+ * ld Pointer to an LDAP control structure. (input only)
+ * binddnp Pointer to an Application DName used for binding (in *or* out)
+ * passwdp Pointer to the password associated with the DName (in *or* out)
+ * methodp Pointer to the Auth method (output only)
+ * freeit Flag to indicate if this is a lookup or a free request (input only)
+ */
+static int LDAP_rebindproc(LDAP *ld, char **binddnp, char **passwdp, int *methodp, int freeit)
+{
+ if (!freeit) {
+ apr_ldap_rebind_entry_t *my_conn;
+
+ *methodp = LDAP_AUTH_SIMPLE;
+ my_conn = apr_ldap_rebind_lookup(ld);
+
+ if ((my_conn) && (my_conn->bindDN != NULL)) {
+ *binddnp = strdup(my_conn->bindDN);
+ *passwdp = strdup(my_conn->bindPW);
+ } else {
+ *binddnp = NULL;
+ *passwdp = NULL;
+ }
+ } else {
+ if (*binddnp) {
+ free(*binddnp);
+ }
+ if (*passwdp) {
+ free(*passwdp);
+ }
+ }
+
+ return LDAP_SUCCESS;
+}
+
+static int apr_ldap_rebind_set_callback(LDAP *ld)
+{
+ ldap_set_rebind_proc(ld, (LDAPRebindProc)LDAP_rebindproc);
+ return APR_SUCCESS;
+}
+
+#elif APR_HAS_OPENLDAP_LDAPSDK
+
+/* LDAP_rebindproc() openLDAP V3 style
+ * ON ENTRY:
+ * ld Pointer to an LDAP control structure. (input only)
+ * url Unused in this routine
+ * request Unused in this routine
+ * msgid Unused in this routine
+ * params Unused in this routine
+ *
+ * or
+ *
+ * ld Pointer to an LDAP control structure. (input only)
+ * url Unused in this routine
+ * request Unused in this routine
+ * msgid Unused in this routine
+ */
+#if defined(LDAP_SET_REBIND_PROC_THREE)
+static int LDAP_rebindproc(LDAP *ld, LDAP_CONST char *url, ber_tag_t request,
+ ber_int_t msgid, void *params)
+#else
+static int LDAP_rebindproc(LDAP *ld, LDAP_CONST char *url, int request,
+ ber_int_t msgid)
+#endif
+{
+ apr_ldap_rebind_entry_t *my_conn;
+ const char *bindDN = NULL;
+ const char *bindPW = NULL;
+
+ my_conn = apr_ldap_rebind_lookup(ld);
+
+ if ((my_conn) && (my_conn->bindDN != NULL)) {
+ bindDN = my_conn->bindDN;
+ bindPW = my_conn->bindPW;
+ }
+
+ return (ldap_bind_s(ld, bindDN, bindPW, LDAP_AUTH_SIMPLE));
+}
+
+static int apr_ldap_rebind_set_callback(LDAP *ld)
+{
+#if defined(LDAP_SET_REBIND_PROC_THREE)
+ ldap_set_rebind_proc(ld, LDAP_rebindproc, NULL);
+#else
+ ldap_set_rebind_proc(ld, LDAP_rebindproc);
+#endif
+ return APR_SUCCESS;
+}
+
+#elif APR_HAS_NOVELL_LDAPSDK
+
+/* LDAP_rebindproc() openLDAP V3 style
+ * ON ENTRY:
+ * ld Pointer to an LDAP control structure. (input only)
+ * url Unused in this routine
+ * request Unused in this routine
+ * msgid Unused in this routine
+ */
+static int LDAP_rebindproc(LDAP *ld, LDAP_CONST char *url, int request, ber_int_t msgid)
+{
+
+ apr_ldap_rebind_entry_t *my_conn;
+ const char *bindDN = NULL;
+ const char *bindPW = NULL;
+
+ my_conn = apr_ldap_rebind_lookup(ld);
+
+ if ((my_conn) && (my_conn->bindDN != NULL)) {
+ bindDN = my_conn->bindDN;
+ bindPW = my_conn->bindPW;
+ }
+
+ return (ldap_bind_s(ld, bindDN, bindPW, LDAP_AUTH_SIMPLE));
+}
+
+static int apr_ldap_rebind_set_callback(LDAP *ld)
+{
+ ldap_set_rebind_proc(ld, LDAP_rebindproc);
+ return APR_SUCCESS;
+}
+
+#else /* Implementation not recognised */
+
+static int apr_ldap_rebind_set_callback(LDAP *ld)
+{
+ return APR_ENOTIMPL;
+}
+
+#endif
+
+
+#endif /* APR_HAS_LDAP */
diff --git a/contrib/apr-util/ldap/apr_ldap_stub.c b/contrib/apr-util/ldap/apr_ldap_stub.c
new file mode 100644
index 000000000000..97c15514ef8c
--- /dev/null
+++ b/contrib/apr-util/ldap/apr_ldap_stub.c
@@ -0,0 +1,145 @@
+/* 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.h"
+#include "apu.h"
+#include "apu_config.h"
+#include "apr_ldap.h"
+#include "apu_internal.h"
+#include "apr_dso.h"
+#include "apr_errno.h"
+#include "apr_pools.h"
+#include "apr_strings.h"
+#include "apu_version.h"
+
+#if APR_HAS_LDAP
+
+#if APU_DSO_BUILD
+
+static struct apr__ldap_dso_fntable *lfn = NULL;
+
+static apr_status_t load_ldap(apr_pool_t *pool)
+{
+ char *modname;
+ apr_dso_handle_sym_t symbol;
+ apr_status_t rv;
+
+ /* deprecate in 2.0 - permit implicit initialization */
+ apu_dso_init(pool);
+
+ rv = apu_dso_mutex_lock();
+ if (rv) {
+ return rv;
+ }
+
+#if defined(WIN32)
+ modname = "apr_ldap-" APU_STRINGIFY(APU_MAJOR_VERSION) ".dll";
+#else
+ modname = "apr_ldap-" APU_STRINGIFY(APU_MAJOR_VERSION) ".so";
+#endif
+ rv = apu_dso_load(NULL, &symbol, modname, "apr__ldap_fns", pool);
+ if (rv == APR_SUCCESS) {
+ lfn = symbol;
+ }
+ apu_dso_mutex_unlock();
+
+ return rv;
+}
+
+#define LOAD_LDAP_STUB(pool, failres) \
+ if (!lfn && (load_ldap(pool) != APR_SUCCESS)) \
+ return failres;
+
+APU_DECLARE_LDAP(int) apr_ldap_info(apr_pool_t *pool,
+ apr_ldap_err_t **result_err)
+{
+ LOAD_LDAP_STUB(pool, -1);
+ return lfn->info(pool, result_err);
+}
+
+APU_DECLARE_LDAP(int) apr_ldap_init(apr_pool_t *pool,
+ LDAP **ldap,
+ const char *hostname,
+ int portno,
+ int secure,
+ apr_ldap_err_t **result_err)
+{
+ LOAD_LDAP_STUB(pool, -1);
+ return lfn->init(pool, ldap, hostname, portno, secure, result_err);
+}
+
+APU_DECLARE_LDAP(int) apr_ldap_ssl_init(apr_pool_t *pool,
+ const char *cert_auth_file,
+ int cert_file_type,
+ apr_ldap_err_t **result_err)
+{
+ LOAD_LDAP_STUB(pool, -1);
+ return lfn->ssl_init(pool, cert_auth_file, cert_file_type, result_err);
+}
+
+APU_DECLARE_LDAP(int) apr_ldap_ssl_deinit(void)
+{
+ if (!lfn)
+ return -1;
+ return lfn->ssl_deinit();
+}
+
+APU_DECLARE_LDAP(int) apr_ldap_get_option(apr_pool_t *pool,
+ LDAP *ldap,
+ int option,
+ void *outvalue,
+ apr_ldap_err_t **result_err)
+{
+ LOAD_LDAP_STUB(pool, -1);
+ return lfn->get_option(pool, ldap, option, outvalue, result_err);
+}
+
+APU_DECLARE_LDAP(int) apr_ldap_set_option(apr_pool_t *pool,
+ LDAP *ldap,
+ int option,
+ const void *invalue,
+ apr_ldap_err_t **result_err)
+{
+ LOAD_LDAP_STUB(pool, -1);
+ return lfn->set_option(pool, ldap, option, invalue, result_err);
+}
+
+APU_DECLARE_LDAP(apr_status_t) apr_ldap_rebind_init(apr_pool_t *pool)
+{
+ LOAD_LDAP_STUB(pool, APR_EGENERAL);
+ return lfn->rebind_init(pool);
+}
+
+APU_DECLARE_LDAP(apr_status_t) apr_ldap_rebind_add(apr_pool_t *pool,
+ LDAP *ld,
+ const char *bindDN,
+ const char *bindPW)
+{
+ LOAD_LDAP_STUB(pool, APR_EGENERAL);
+ return lfn->rebind_add(pool, ld, bindDN, bindPW);
+}
+
+APU_DECLARE_LDAP(apr_status_t) apr_ldap_rebind_remove(LDAP *ld)
+{
+ if (!lfn)
+ return APR_EGENERAL;
+ return lfn->rebind_remove(ld);
+}
+
+#endif /* APU_DSO_BUILD */
+
+#endif /* APR_HAS_LDAP */
+
diff --git a/contrib/apr-util/ldap/apr_ldap_url.c b/contrib/apr-util/ldap/apr_ldap_url.c
new file mode 100644
index 000000000000..52e37b253f9c
--- /dev/null
+++ b/contrib/apr-util/ldap/apr_ldap_url.c
@@ -0,0 +1,694 @@
+/* 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.
+ */
+
+/* Portions Copyright 1998-2002 The OpenLDAP Foundation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted only as authorized by the OpenLDAP
+ * Public License. A copy of this license is available at
+ * http://www.OpenLDAP.org/license.html or in file LICENSE in the
+ * top-level directory of the distribution.
+ *
+ * OpenLDAP is a registered trademark of the OpenLDAP Foundation.
+ *
+ * Individual files and/or contributed packages may be copyright by
+ * other parties and subject to additional restrictions.
+ *
+ * This work is derived from the University of Michigan LDAP v3.3
+ * distribution. Information concerning this software is available
+ * at: http://www.umich.edu/~dirsvcs/ldap/
+ *
+ * This work also contains materials derived from public sources.
+ *
+ * Additional information about OpenLDAP can be obtained at:
+ * http://www.openldap.org/
+ */
+
+/*
+ * Portions Copyright (c) 1992-1996 Regents of the University of Michigan.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and that due credit is given
+ * to the University of Michigan at Ann Arbor. The name of the University
+ * may not be used to endorse or promote products derived from this
+ * software without specific prior written permission. This software
+ * is provided ``as is'' without express or implied warranty.
+ */
+
+/* apr_ldap_url.c -- LDAP URL (RFC 2255) related routines
+ *
+ * Win32 and perhaps other non-OpenLDAP based ldap libraries may be
+ * missing ldap_url_* APIs. We focus here on the one significant
+ * aspect, which is parsing. We have [for the time being] omitted
+ * the ldap_url_search APIs.
+ *
+ * LDAP URLs look like this:
+ * ldap[is]://host:port[/[dn[?[attributes][?[scope][?[filter][?exts]]]]]]
+ *
+ * where:
+ * attributes is a comma separated list
+ * scope is one of these three strings: base one sub (default=base)
+ * filter is an string-represented filter as in RFC 2254
+ *
+ * e.g., ldap://host:port/dc=com?o,cn?base?o=openldap?extension
+ *
+ * Tolerates URLs that look like: <ldapurl> and <URL:ldapurl>
+ */
+
+#include "apu.h"
+#include "apr_pools.h"
+#include "apr_general.h"
+#include "apr_strings.h"
+#include "apr_ldap.h"
+
+#if APR_HAS_LDAP
+
+#if APR_HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifndef LDAPS_PORT
+#define LDAPS_PORT 636 /* ldaps:/// default LDAP over TLS port */
+#endif
+
+#define APR_LDAP_URL_PREFIX "ldap://"
+#define APR_LDAP_URL_PREFIX_LEN (sizeof(APR_LDAP_URL_PREFIX)-1)
+#define APR_LDAPS_URL_PREFIX "ldaps://"
+#define APR_LDAPS_URL_PREFIX_LEN (sizeof(APR_LDAPS_URL_PREFIX)-1)
+#define APR_LDAPI_URL_PREFIX "ldapi://"
+#define APR_LDAPI_URL_PREFIX_LEN (sizeof(APR_LDAPI_URL_PREFIX)-1)
+#define APR_LDAP_URL_URLCOLON "URL:"
+#define APR_LDAP_URL_URLCOLON_LEN (sizeof(APR_LDAP_URL_URLCOLON)-1)
+
+
+/* local functions */
+static const char* skip_url_prefix(const char *url,
+ int *enclosedp,
+ const char **scheme);
+
+static void apr_ldap_pvt_hex_unescape(char *s);
+
+static int apr_ldap_pvt_unhex(int c);
+
+static char **apr_ldap_str2charray(apr_pool_t *pool,
+ const char *str,
+ const char *brkstr);
+
+
+/**
+ * Is this URL an ldap url?
+ *
+ */
+APU_DECLARE(int) apr_ldap_is_ldap_url(const char *url)
+{
+ int enclosed;
+ const char * scheme;
+
+ if( url == NULL ) {
+ return 0;
+ }
+
+ if( skip_url_prefix( url, &enclosed, &scheme ) == NULL ) {
+ return 0;
+ }
+
+ return 1;
+}
+
+/**
+ * Is this URL a secure ldap url?
+ *
+ */
+APU_DECLARE(int) apr_ldap_is_ldaps_url(const char *url)
+{
+ int enclosed;
+ const char * scheme;
+
+ if( url == NULL ) {
+ return 0;
+ }
+
+ if( skip_url_prefix( url, &enclosed, &scheme ) == NULL ) {
+ return 0;
+ }
+
+ return strcmp(scheme, "ldaps") == 0;
+}
+
+/**
+ * Is this URL an ldap socket url?
+ *
+ */
+APU_DECLARE(int) apr_ldap_is_ldapi_url(const char *url)
+{
+ int enclosed;
+ const char * scheme;
+
+ if( url == NULL ) {
+ return 0;
+ }
+
+ if( skip_url_prefix( url, &enclosed, &scheme ) == NULL ) {
+ return 0;
+ }
+
+ return strcmp(scheme, "ldapi") == 0;
+}
+
+
+static const char *skip_url_prefix(const char *url, int *enclosedp,
+ const char **scheme)
+{
+ /*
+ * return non-zero if this looks like a LDAP URL; zero if not
+ * if non-zero returned, *urlp will be moved past "ldap://" part of URL
+ */
+ const char *p;
+
+ if ( url == NULL ) {
+ return( NULL );
+ }
+
+ p = url;
+
+ /* skip leading '<' (if any) */
+ if ( *p == '<' ) {
+ *enclosedp = 1;
+ ++p;
+ } else {
+ *enclosedp = 0;
+ }
+
+ /* skip leading "URL:" (if any) */
+ if ( strncasecmp( p, APR_LDAP_URL_URLCOLON, APR_LDAP_URL_URLCOLON_LEN ) == 0 ) {
+ p += APR_LDAP_URL_URLCOLON_LEN;
+ }
+
+ /* check for "ldap://" prefix */
+ if ( strncasecmp( p, APR_LDAP_URL_PREFIX, APR_LDAP_URL_PREFIX_LEN ) == 0 ) {
+ /* skip over "ldap://" prefix and return success */
+ p += APR_LDAP_URL_PREFIX_LEN;
+ *scheme = "ldap";
+ return( p );
+ }
+
+ /* check for "ldaps://" prefix */
+ if ( strncasecmp( p, APR_LDAPS_URL_PREFIX, APR_LDAPS_URL_PREFIX_LEN ) == 0 ) {
+ /* skip over "ldaps://" prefix and return success */
+ p += APR_LDAPS_URL_PREFIX_LEN;
+ *scheme = "ldaps";
+ return( p );
+ }
+
+ /* check for "ldapi://" prefix */
+ if ( strncasecmp( p, APR_LDAPI_URL_PREFIX, APR_LDAPI_URL_PREFIX_LEN ) == 0 ) {
+ /* skip over "ldapi://" prefix and return success */
+ p += APR_LDAPI_URL_PREFIX_LEN;
+ *scheme = "ldapi";
+ return( p );
+ }
+
+ return( NULL );
+}
+
+
+static int str2scope(const char *p)
+{
+ if ( strcasecmp( p, "one" ) == 0 ) {
+ return LDAP_SCOPE_ONELEVEL;
+
+ } else if ( strcasecmp( p, "onetree" ) == 0 ) {
+ return LDAP_SCOPE_ONELEVEL;
+
+ } else if ( strcasecmp( p, "base" ) == 0 ) {
+ return LDAP_SCOPE_BASE;
+
+ } else if ( strcasecmp( p, "sub" ) == 0 ) {
+ return LDAP_SCOPE_SUBTREE;
+
+ } else if ( strcasecmp( p, "subtree" ) == 0 ) {
+ return LDAP_SCOPE_SUBTREE;
+ }
+
+ return( -1 );
+}
+
+
+/**
+ * Parse the URL provided into an apr_ldap_url_desc_t object.
+ *
+ * APR_SUCCESS is returned on success, APR_EGENERAL on failure.
+ * The LDAP result code and reason string is returned in the
+ * apr_ldap_err_t structure.
+ */
+APU_DECLARE(int) apr_ldap_url_parse_ext(apr_pool_t *pool,
+ const char *url_in,
+ apr_ldap_url_desc_t **ludpp,
+ apr_ldap_err_t **result_err)
+{
+ apr_ldap_url_desc_t *ludp;
+ char *p, *q, *r;
+ int i, enclosed;
+ const char *scheme = NULL;
+ const char *url_tmp;
+ char *url;
+
+ apr_ldap_err_t *result = (apr_ldap_err_t *)apr_pcalloc(pool, sizeof(apr_ldap_err_t));
+ *result_err = result;
+
+ /* sanity check our parameters */
+ if( url_in == NULL || ludpp == NULL ) {
+ result->reason = "Either the LDAP URL, or the URL structure was NULL. Oops.";
+ result->rc = APR_LDAP_URL_ERR_PARAM;
+ return APR_EGENERAL;
+ }
+
+ *ludpp = NULL; /* pessimistic */
+
+ url_tmp = skip_url_prefix( url_in, &enclosed, &scheme );
+ if ( url_tmp == NULL ) {
+ result->reason = "The scheme was not recognised as a valid LDAP URL scheme.";
+ result->rc = APR_LDAP_URL_ERR_BADSCHEME;
+ return APR_EGENERAL;
+ }
+
+ /* make working copy of the remainder of the URL */
+ url = (char *)apr_pstrdup(pool, url_tmp);
+ if ( url == NULL ) {
+ result->reason = "Out of memory parsing LDAP URL.";
+ result->rc = APR_LDAP_URL_ERR_MEM;
+ return APR_EGENERAL;
+ }
+
+ if ( enclosed ) {
+ p = &url[strlen(url)-1];
+
+ if( *p != '>' ) {
+ result->reason = "Bad enclosure error while parsing LDAP URL.";
+ result->rc = APR_LDAP_URL_ERR_BADENCLOSURE;
+ return APR_EGENERAL;
+ }
+
+ *p = '\0';
+ }
+
+ /* allocate return struct */
+ ludp = (apr_ldap_url_desc_t *)apr_pcalloc(pool, sizeof(apr_ldap_url_desc_t));
+ if ( ludp == NULL ) {
+ result->reason = "Out of memory parsing LDAP URL.";
+ result->rc = APR_LDAP_URL_ERR_MEM;
+ return APR_EGENERAL;
+ }
+
+ ludp->lud_next = NULL;
+ ludp->lud_host = NULL;
+ ludp->lud_port = LDAP_PORT;
+ ludp->lud_dn = NULL;
+ ludp->lud_attrs = NULL;
+ ludp->lud_filter = NULL;
+ ludp->lud_scope = -1;
+ ludp->lud_filter = NULL;
+ ludp->lud_exts = NULL;
+
+ ludp->lud_scheme = (char *)apr_pstrdup(pool, scheme);
+ if ( ludp->lud_scheme == NULL ) {
+ result->reason = "Out of memory parsing LDAP URL.";
+ result->rc = APR_LDAP_URL_ERR_MEM;
+ return APR_EGENERAL;
+ }
+
+ if( strcasecmp( ludp->lud_scheme, "ldaps" ) == 0 ) {
+ ludp->lud_port = LDAPS_PORT;
+ }
+
+ /* scan forward for '/' that marks end of hostport and begin. of dn */
+ p = strchr( url, '/' );
+
+ if( p != NULL ) {
+ /* terminate hostport; point to start of dn */
+ *p++ = '\0';
+ }
+
+ /* IPv6 syntax with [ip address]:port */
+ if ( *url == '[' ) {
+ r = strchr( url, ']' );
+ if ( r == NULL ) {
+ result->reason = "Bad LDAP URL while parsing IPV6 syntax.";
+ result->rc = APR_LDAP_URL_ERR_BADURL;
+ return APR_EGENERAL;
+ }
+ *r++ = '\0';
+ q = strrchr( r, ':' );
+ } else {
+ q = strrchr( url, ':' );
+ }
+
+ if ( q != NULL ) {
+ apr_ldap_pvt_hex_unescape( ++q );
+
+ if( *q == '\0' ) {
+ result->reason = "Bad LDAP URL while parsing.";
+ result->rc = APR_LDAP_URL_ERR_BADURL;
+ return APR_EGENERAL;
+ }
+
+ ludp->lud_port = atoi( q );
+ }
+
+ apr_ldap_pvt_hex_unescape( url );
+
+ /* If [ip address]:port syntax, url is [ip and we skip the [ */
+ ludp->lud_host = (char *)apr_pstrdup(pool, url + ( *url == '[' ));
+ if( ludp->lud_host == NULL ) {
+ result->reason = "Out of memory parsing LDAP URL.";
+ result->rc = APR_LDAP_URL_ERR_MEM;
+ return APR_EGENERAL;
+ }
+
+ /*
+ * Kludge. ldap://111.222.333.444:389??cn=abc,o=company
+ *
+ * On early Novell releases, search references/referrals were returned
+ * in this format, i.e., the dn was kind of in the scope position,
+ * but the required slash is missing. The whole thing is illegal syntax,
+ * but we need to account for it. Fortunately it can't be confused with
+ * anything real.
+ */
+ if( (p == NULL) && (q != NULL) && ((q = strchr( q, '?')) != NULL)) {
+ q++;
+ /* ? immediately followed by question */
+ if( *q == '?') {
+ q++;
+ if( *q != '\0' ) {
+ /* parse dn part */
+ apr_ldap_pvt_hex_unescape( q );
+ ludp->lud_dn = (char *)apr_pstrdup(pool, q);
+ } else {
+ ludp->lud_dn = (char *)apr_pstrdup(pool, "");
+ }
+
+ if( ludp->lud_dn == NULL ) {
+ result->reason = "Out of memory parsing LDAP URL.";
+ result->rc = APR_LDAP_URL_ERR_MEM;
+ return APR_EGENERAL;
+ }
+ }
+ }
+
+ if( p == NULL ) {
+ *ludpp = ludp;
+ return APR_SUCCESS;
+ }
+
+ /* scan forward for '?' that may marks end of dn */
+ q = strchr( p, '?' );
+
+ if( q != NULL ) {
+ /* terminate dn part */
+ *q++ = '\0';
+ }
+
+ if( *p != '\0' ) {
+ /* parse dn part */
+ apr_ldap_pvt_hex_unescape( p );
+ ludp->lud_dn = (char *)apr_pstrdup(pool, p);
+ } else {
+ ludp->lud_dn = (char *)apr_pstrdup(pool, "");
+ }
+
+ if( ludp->lud_dn == NULL ) {
+ result->reason = "Out of memory parsing LDAP URL.";
+ result->rc = APR_LDAP_URL_ERR_MEM;
+ return APR_EGENERAL;
+ }
+
+ if( q == NULL ) {
+ /* no more */
+ *ludpp = ludp;
+ return APR_SUCCESS;
+ }
+
+ /* scan forward for '?' that may marks end of attributes */
+ p = q;
+ q = strchr( p, '?' );
+
+ if( q != NULL ) {
+ /* terminate attributes part */
+ *q++ = '\0';
+ }
+
+ if( *p != '\0' ) {
+ /* parse attributes */
+ apr_ldap_pvt_hex_unescape( p );
+ ludp->lud_attrs = apr_ldap_str2charray(pool, p, ",");
+
+ if( ludp->lud_attrs == NULL ) {
+ result->reason = "Bad attributes encountered while parsing LDAP URL.";
+ result->rc = APR_LDAP_URL_ERR_BADATTRS;
+ return APR_EGENERAL;
+ }
+ }
+
+ if ( q == NULL ) {
+ /* no more */
+ *ludpp = ludp;
+ return APR_SUCCESS;
+ }
+
+ /* scan forward for '?' that may marks end of scope */
+ p = q;
+ q = strchr( p, '?' );
+
+ if( q != NULL ) {
+ /* terminate the scope part */
+ *q++ = '\0';
+ }
+
+ if( *p != '\0' ) {
+ /* parse the scope */
+ apr_ldap_pvt_hex_unescape( p );
+ ludp->lud_scope = str2scope( p );
+
+ if( ludp->lud_scope == -1 ) {
+ result->reason = "Bad scope encountered while parsing LDAP URL.";
+ result->rc = APR_LDAP_URL_ERR_BADSCOPE;
+ return APR_EGENERAL;
+ }
+ }
+
+ if ( q == NULL ) {
+ /* no more */
+ *ludpp = ludp;
+ return APR_SUCCESS;
+ }
+
+ /* scan forward for '?' that may marks end of filter */
+ p = q;
+ q = strchr( p, '?' );
+
+ if( q != NULL ) {
+ /* terminate the filter part */
+ *q++ = '\0';
+ }
+
+ if( *p != '\0' ) {
+ /* parse the filter */
+ apr_ldap_pvt_hex_unescape( p );
+
+ if( ! *p ) {
+ /* missing filter */
+ result->reason = "Bad filter encountered while parsing LDAP URL.";
+ result->rc = APR_LDAP_URL_ERR_BADFILTER;
+ return APR_EGENERAL;
+ }
+
+ ludp->lud_filter = (char *)apr_pstrdup(pool, p);
+ if( ludp->lud_filter == NULL ) {
+ result->reason = "Out of memory parsing LDAP URL.";
+ result->rc = APR_LDAP_URL_ERR_MEM;
+ return APR_EGENERAL;
+ }
+ }
+
+ if ( q == NULL ) {
+ /* no more */
+ *ludpp = ludp;
+ return APR_SUCCESS;
+ }
+
+ /* scan forward for '?' that may marks end of extensions */
+ p = q;
+ q = strchr( p, '?' );
+
+ if( q != NULL ) {
+ /* extra '?' */
+ result->reason = "Bad URL encountered while parsing LDAP URL.";
+ result->rc = APR_LDAP_URL_ERR_BADURL;
+ return APR_EGENERAL;
+ }
+
+ /* parse the extensions */
+ ludp->lud_exts = apr_ldap_str2charray(pool, p, ",");
+ if( ludp->lud_exts == NULL ) {
+ result->reason = "Bad extensions encountered while parsing LDAP URL.";
+ result->rc = APR_LDAP_URL_ERR_BADEXTS;
+ return APR_EGENERAL;
+ }
+
+ for( i=0; ludp->lud_exts[i] != NULL; i++ ) {
+ apr_ldap_pvt_hex_unescape( ludp->lud_exts[i] );
+
+ if( *ludp->lud_exts[i] == '!' ) {
+ /* count the number of critical extensions */
+ ludp->lud_crit_exts++;
+ }
+ }
+
+ if( i == 0 ) {
+ /* must have 1 or more */
+ result->reason = "Bad extensions encountered while parsing LDAP URL.";
+ result->rc = APR_LDAP_URL_ERR_BADEXTS;
+ return APR_EGENERAL;
+ }
+
+ /* no more */
+ *ludpp = ludp;
+ return APR_SUCCESS;
+}
+
+
+/**
+ * Parse the URL provided into an apr_ldap_url_desc_t object.
+ *
+ * APR_SUCCESS is returned on success, APR_EGENERAL on failure.
+ * The LDAP result code and reason string is returned in the
+ * apr_ldap_err_t structure.
+ */
+APU_DECLARE(int) apr_ldap_url_parse(apr_pool_t *pool,
+ const char *url_in,
+ apr_ldap_url_desc_t **ludpp,
+ apr_ldap_err_t **result_err)
+{
+
+ int rc = apr_ldap_url_parse_ext(pool, url_in, ludpp, result_err);
+ if( rc != APR_SUCCESS ) {
+ return rc;
+ }
+
+ if ((*ludpp)->lud_scope == -1) {
+ (*ludpp)->lud_scope = LDAP_SCOPE_BASE;
+ }
+
+ if ((*ludpp)->lud_host != NULL && *(*ludpp)->lud_host == '\0') {
+ (*ludpp)->lud_host = NULL;
+ }
+
+ return rc;
+
+}
+
+
+static void apr_ldap_pvt_hex_unescape(char *s)
+{
+ /*
+ * Remove URL hex escapes from s... done in place. The basic concept for
+ * this routine is borrowed from the WWW library HTUnEscape() routine.
+ */
+ char *p;
+
+ for ( p = s; *s != '\0'; ++s ) {
+ if ( *s == '%' ) {
+ if ( *++s == '\0' ) {
+ break;
+ }
+ *p = apr_ldap_pvt_unhex( *s ) << 4;
+ if ( *++s == '\0' ) {
+ break;
+ }
+ *p++ += apr_ldap_pvt_unhex( *s );
+ } else {
+ *p++ = *s;
+ }
+ }
+
+ *p = '\0';
+}
+
+
+static int apr_ldap_pvt_unhex(int c)
+{
+ return( c >= '0' && c <= '9' ? c - '0'
+ : c >= 'A' && c <= 'F' ? c - 'A' + 10
+ : c - 'a' + 10 );
+}
+
+
+/**
+ * Convert a string to a character array
+ */
+static char **apr_ldap_str2charray(apr_pool_t *pool,
+ const char *str_in,
+ const char *brkstr)
+{
+ char **res;
+ char *str, *s;
+ char *lasts;
+ int i;
+
+ /* protect the input string from strtok */
+ str = (char *)apr_pstrdup(pool, str_in);
+ if( str == NULL ) {
+ return NULL;
+ }
+
+ i = 1;
+ for ( s = str; *s; s++ ) {
+ /* Warning: this strchr was previously ldap_utf8_strchr(), check
+ * whether this particular code has any charset issues.
+ */
+ if ( strchr( brkstr, *s ) != NULL ) {
+ i++;
+ }
+ }
+
+ res = (char **) apr_pcalloc(pool, (i + 1) * sizeof(char *));
+ if( res == NULL ) {
+ return NULL;
+ }
+
+ i = 0;
+
+ for ( s = (char *)apr_strtok( str, brkstr, &lasts );
+ s != NULL;
+ s = (char *)apr_strtok( NULL, brkstr, &lasts ) ) {
+
+ res[i] = (char *)apr_pstrdup(pool, s);
+ if(res[i] == NULL) {
+ return NULL;
+ }
+
+ i++;
+ }
+
+ res[i] = NULL;
+
+ return( res );
+
+}
+
+#endif /* APR_HAS_LDAP */
diff --git a/contrib/apr-util/libaprutil.rc b/contrib/apr-util/libaprutil.rc
new file mode 100644
index 000000000000..a1ffddbd5bfc
--- /dev/null
+++ b/contrib/apr-util/libaprutil.rc
@@ -0,0 +1,69 @@
+#include "apu_version.h"
+
+#define APU_LICENSE \
+ "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\r\n\r\n" \
+ "http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n" \
+ "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."
+
+#ifdef DLL_NAME
+#define APU_DLL_BASENAME APU_STRINGIFY(DLL_NAME) "-" APU_STRINGIFY(APU_MAJOR_VERSION)
+#define APU_DLL_DESCRIPTION "Apache Portable Runtime " APU_STRINGIFY(DLL_NAME) " Module"
+#else
+#define APU_DLL_BASENAME "libaprutil-" APU_STRINGIFY(APU_MAJOR_VERSION)
+#define APU_DLL_DESCRIPTION "Apache Portable Runtime Utility Library"
+#endif
+
+1 VERSIONINFO
+ FILEVERSION APU_VERSION_STRING_CSV,0
+ PRODUCTVERSION APU_VERSION_STRING_CSV,0
+ FILEFLAGSMASK 0x3fL
+#if defined(APU_IS_DEV_VERSION)
+#if defined(_DEBUG)
+ FILEFLAGS 0x03L
+#else
+ FILEFLAGS 0x02L
+#endif
+#else
+#if defined(_DEBUG)
+ FILEFLAGS 0x01L
+#else
+ FILEFLAGS 0x00L
+#endif
+#endif
+#if defined(WINNT) || defined(WIN64)
+ FILEOS 0x40004L
+#else
+ FILEOS 0x4L
+#endif
+ FILETYPE 0x2L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904b0"
+ BEGIN
+ VALUE "Comments", APU_LICENSE "\0"
+ VALUE "CompanyName", "Apache Software Foundation\0"
+ VALUE "FileDescription", APU_DLL_DESCRIPTION "\0"
+ VALUE "FileVersion", APU_VERSION_STRING "\0"
+ VALUE "InternalName", APU_DLL_BASENAME "\0"
+ VALUE "LegalCopyright", APU_COPYRIGHT "\0"
+ VALUE "OriginalFilename", APU_DLL_BASENAME ".dll\0"
+ VALUE "ProductName", "Apache Portable Runtime Project\0"
+ VALUE "ProductVersion", APU_VERSION_STRING "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/contrib/apr-util/memcache/apr_memcache.c b/contrib/apr-util/memcache/apr_memcache.c
new file mode 100644
index 000000000000..b9922fb767a0
--- /dev/null
+++ b/contrib/apr-util/memcache/apr_memcache.c
@@ -0,0 +1,1709 @@
+/* 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_memcache.h"
+#include "apr_poll.h"
+#include "apr_version.h"
+#include <stdlib.h>
+
+#define BUFFER_SIZE 512
+struct apr_memcache_conn_t
+{
+ char *buffer;
+ apr_size_t blen;
+ apr_pool_t *p;
+ apr_pool_t *tp;
+ apr_socket_t *sock;
+ apr_bucket_brigade *bb;
+ apr_bucket_brigade *tb;
+ apr_memcache_server_t *ms;
+};
+
+/* Strings for Client Commands */
+
+#define MC_EOL "\r\n"
+#define MC_EOL_LEN (sizeof(MC_EOL)-1)
+
+#define MC_WS " "
+#define MC_WS_LEN (sizeof(MC_WS)-1)
+
+#define MC_GET "get "
+#define MC_GET_LEN (sizeof(MC_GET)-1)
+
+#define MC_SET "set "
+#define MC_SET_LEN (sizeof(MC_SET)-1)
+
+#define MC_ADD "add "
+#define MC_ADD_LEN (sizeof(MC_ADD)-1)
+
+#define MC_REPLACE "replace "
+#define MC_REPLACE_LEN (sizeof(MC_REPLACE)-1)
+
+#define MC_DELETE "delete "
+#define MC_DELETE_LEN (sizeof(MC_DELETE)-1)
+
+#define MC_INCR "incr "
+#define MC_INCR_LEN (sizeof(MC_INCR)-1)
+
+#define MC_DECR "decr "
+#define MC_DECR_LEN (sizeof(MC_DECR)-1)
+
+#define MC_VERSION "version"
+#define MC_VERSION_LEN (sizeof(MC_VERSION)-1)
+
+#define MC_STATS "stats"
+#define MC_STATS_LEN (sizeof(MC_STATS)-1)
+
+#define MC_QUIT "quit"
+#define MC_QUIT_LEN (sizeof(MC_QUIT)-1)
+
+/* Strings for Server Replies */
+
+#define MS_STORED "STORED"
+#define MS_STORED_LEN (sizeof(MS_STORED)-1)
+
+#define MS_NOT_STORED "NOT_STORED"
+#define MS_NOT_STORED_LEN (sizeof(MS_NOT_STORED)-1)
+
+#define MS_DELETED "DELETED"
+#define MS_DELETED_LEN (sizeof(MS_DELETED)-1)
+
+#define MS_NOT_FOUND "NOT_FOUND"
+#define MS_NOT_FOUND_LEN (sizeof(MS_NOT_FOUND)-1)
+
+#define MS_VALUE "VALUE"
+#define MS_VALUE_LEN (sizeof(MS_VALUE)-1)
+
+#define MS_ERROR "ERROR"
+#define MS_ERROR_LEN (sizeof(MS_ERROR)-1)
+
+#define MS_VERSION "VERSION"
+#define MS_VERSION_LEN (sizeof(MS_VERSION)-1)
+
+#define MS_STAT "STAT"
+#define MS_STAT_LEN (sizeof(MS_STAT)-1)
+
+#define MS_END "END"
+#define MS_END_LEN (sizeof(MS_END)-1)
+
+/** Server and Query Structure for a multiple get */
+struct cache_server_query_t {
+ apr_memcache_server_t* ms;
+ apr_memcache_conn_t* conn;
+ struct iovec* query_vec;
+ apr_int32_t query_vec_count;
+};
+
+#define MULT_GET_TIMEOUT 50000
+
+static apr_status_t make_server_dead(apr_memcache_t *mc, apr_memcache_server_t *ms)
+{
+#if APR_HAS_THREADS
+ apr_thread_mutex_lock(ms->lock);
+#endif
+ ms->status = APR_MC_SERVER_DEAD;
+ ms->btime = apr_time_now();
+#if APR_HAS_THREADS
+ apr_thread_mutex_unlock(ms->lock);
+#endif
+ return APR_SUCCESS;
+}
+
+static apr_status_t make_server_live(apr_memcache_t *mc, apr_memcache_server_t *ms)
+{
+ ms->status = APR_MC_SERVER_LIVE;
+ return APR_SUCCESS;
+}
+
+
+APU_DECLARE(apr_status_t) apr_memcache_add_server(apr_memcache_t *mc, apr_memcache_server_t *ms)
+{
+ apr_status_t rv = APR_SUCCESS;
+
+ if(mc->ntotal >= mc->nalloc) {
+ return APR_ENOMEM;
+ }
+
+ mc->live_servers[mc->ntotal] = ms;
+ mc->ntotal++;
+ make_server_live(mc, ms);
+ return rv;
+}
+
+static apr_status_t mc_version_ping(apr_memcache_server_t *ms);
+
+APU_DECLARE(apr_memcache_server_t *)
+apr_memcache_find_server_hash(apr_memcache_t *mc, const apr_uint32_t hash)
+{
+ if (mc->server_func) {
+ return mc->server_func(mc->server_baton, mc, hash);
+ }
+ else {
+ return apr_memcache_find_server_hash_default(NULL, mc, hash);
+ }
+}
+
+APU_DECLARE(apr_memcache_server_t *)
+apr_memcache_find_server_hash_default(void *baton, apr_memcache_t *mc,
+ const apr_uint32_t hash)
+{
+ apr_memcache_server_t *ms = NULL;
+ apr_uint32_t h = hash ? hash : 1;
+ apr_uint32_t i = 0;
+ apr_time_t curtime = 0;
+
+ if(mc->ntotal == 0) {
+ return NULL;
+ }
+
+ do {
+ ms = mc->live_servers[h % mc->ntotal];
+ if(ms->status == APR_MC_SERVER_LIVE) {
+ break;
+ }
+ else {
+ if (curtime == 0) {
+ curtime = apr_time_now();
+ }
+#if APR_HAS_THREADS
+ apr_thread_mutex_lock(ms->lock);
+#endif
+ /* Try the dead server, every 5 seconds */
+ if (curtime - ms->btime > apr_time_from_sec(5)) {
+ ms->btime = curtime;
+ if (mc_version_ping(ms) == APR_SUCCESS) {
+ make_server_live(mc, ms);
+#if APR_HAS_THREADS
+ apr_thread_mutex_unlock(ms->lock);
+#endif
+ break;
+ }
+ }
+#if APR_HAS_THREADS
+ apr_thread_mutex_unlock(ms->lock);
+#endif
+ }
+ h++;
+ i++;
+ } while(i < mc->ntotal);
+
+ if (i == mc->ntotal) {
+ ms = NULL;
+ }
+
+ return ms;
+}
+
+APU_DECLARE(apr_memcache_server_t *) apr_memcache_find_server(apr_memcache_t *mc, const char *host, apr_port_t port)
+{
+ int i;
+
+ for (i = 0; i < mc->ntotal; i++) {
+ if (strcmp(mc->live_servers[i]->host, host) == 0
+ && mc->live_servers[i]->port == port) {
+
+ return mc->live_servers[i];
+ }
+ }
+
+ return NULL;
+}
+
+static apr_status_t ms_find_conn(apr_memcache_server_t *ms, apr_memcache_conn_t **conn)
+{
+ apr_status_t rv;
+ apr_bucket_alloc_t *balloc;
+ apr_bucket *e;
+
+#if APR_HAS_THREADS
+ rv = apr_reslist_acquire(ms->conns, (void **)conn);
+#else
+ *conn = ms->conn;
+ rv = APR_SUCCESS;
+#endif
+
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+
+ balloc = apr_bucket_alloc_create((*conn)->tp);
+ (*conn)->bb = apr_brigade_create((*conn)->tp, balloc);
+ (*conn)->tb = apr_brigade_create((*conn)->tp, balloc);
+
+ e = apr_bucket_socket_create((*conn)->sock, balloc);
+ APR_BRIGADE_INSERT_TAIL((*conn)->bb, e);
+
+ return rv;
+}
+
+static apr_status_t ms_bad_conn(apr_memcache_server_t *ms, apr_memcache_conn_t *conn)
+{
+#if APR_HAS_THREADS
+ return apr_reslist_invalidate(ms->conns, conn);
+#else
+ return APR_SUCCESS;
+#endif
+}
+
+static apr_status_t ms_release_conn(apr_memcache_server_t *ms, apr_memcache_conn_t *conn)
+{
+ apr_pool_clear(conn->tp);
+#if APR_HAS_THREADS
+ return apr_reslist_release(ms->conns, conn);
+#else
+ return APR_SUCCESS;
+#endif
+}
+
+APU_DECLARE(apr_status_t) apr_memcache_enable_server(apr_memcache_t *mc, apr_memcache_server_t *ms)
+{
+ apr_status_t rv = APR_SUCCESS;
+
+ if (ms->status == APR_MC_SERVER_LIVE) {
+ return rv;
+ }
+
+ rv = make_server_live(mc, ms);
+ return rv;
+}
+
+APU_DECLARE(apr_status_t) apr_memcache_disable_server(apr_memcache_t *mc, apr_memcache_server_t *ms)
+{
+ return make_server_dead(mc, ms);
+}
+
+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;
+#else
+ apr_int32_t family = APR_INET;
+#endif
+
+ rv = apr_sockaddr_info_get(&sa, conn->ms->host, family, conn->ms->port, 0, conn->p);
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+
+ 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) {
+ return rv;
+ }
+
+ rv = apr_socket_timeout_set(conn->sock, -1);
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+
+ return rv;
+}
+
+
+static apr_status_t
+mc_conn_construct(void **conn_, void *params, apr_pool_t *pool)
+{
+ apr_status_t rv = APR_SUCCESS;
+ apr_memcache_conn_t *conn;
+ 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_INET : APR_UNIX;
+#else
+ apr_int32_t family = APR_INET;
+#endif
+
+ rv = apr_pool_create(&np, pool);
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+
+ rv = apr_pool_create(&tp, np);
+ if (rv != APR_SUCCESS) {
+ apr_pool_destroy(np);
+ return rv;
+ }
+
+ conn = apr_palloc(np, sizeof( apr_memcache_conn_t ));
+
+ 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);
+ conn->blen = 0;
+ conn->ms = ms;
+
+ rv = conn_connect(conn);
+ if (rv != APR_SUCCESS) {
+ apr_pool_destroy(np);
+ }
+ else {
+ *conn_ = conn;
+ }
+
+ return rv;
+}
+
+#if APR_HAS_THREADS
+static apr_status_t
+mc_conn_destruct(void *conn_, void *params, apr_pool_t *pool)
+{
+ apr_memcache_conn_t *conn = (apr_memcache_conn_t*)conn_;
+ struct iovec vec[2];
+ apr_size_t written;
+
+ /* send a quit message to the memcached server to be nice about it. */
+ vec[0].iov_base = MC_QUIT;
+ vec[0].iov_len = MC_QUIT_LEN;
+
+ vec[1].iov_base = MC_EOL;
+ vec[1].iov_len = MC_EOL_LEN;
+
+ /* Return values not checked, since we just want to make it go away. */
+ apr_socket_sendv(conn->sock, vec, 2, &written);
+ apr_socket_close(conn->sock);
+
+ apr_pool_destroy(conn->p);
+
+ return APR_SUCCESS;
+}
+#endif
+
+APU_DECLARE(apr_status_t) apr_memcache_server_create(apr_pool_t *p,
+ const char *host, apr_port_t port,
+ apr_uint32_t min, apr_uint32_t smax,
+ apr_uint32_t max, apr_uint32_t ttl,
+ apr_memcache_server_t **ms)
+{
+ apr_status_t rv = APR_SUCCESS;
+ apr_memcache_server_t *server;
+ apr_pool_t *np;
+
+ rv = apr_pool_create(&np, p);
+
+ server = apr_palloc(np, sizeof(apr_memcache_server_t));
+
+ server->p = np;
+ server->host = apr_pstrdup(np, host);
+ server->port = port;
+ server->status = APR_MC_SERVER_DEAD;
+#if APR_HAS_THREADS
+ rv = apr_thread_mutex_create(&server->lock, APR_THREAD_MUTEX_DEFAULT, np);
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+
+ rv = apr_reslist_create(&server->conns,
+ min, /* hard minimum */
+ smax, /* soft maximum */
+ max, /* hard maximum */
+ ttl, /* Time to live */
+ mc_conn_construct, /* Make a New Connection */
+ mc_conn_destruct, /* Kill Old Connection */
+ server, np);
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+
+ apr_reslist_cleanup_order_set(server->conns, APR_RESLIST_CLEANUP_FIRST);
+#else
+ rv = mc_conn_construct((void**)&(server->conn), server, np);
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+#endif
+
+ *ms = server;
+
+ return rv;
+}
+
+APU_DECLARE(apr_status_t) apr_memcache_create(apr_pool_t *p,
+ apr_uint16_t max_servers, apr_uint32_t flags,
+ apr_memcache_t **memcache)
+{
+ apr_status_t rv = APR_SUCCESS;
+ apr_memcache_t *mc;
+
+ mc = apr_palloc(p, sizeof(apr_memcache_t));
+ mc->p = p;
+ mc->nalloc = max_servers;
+ mc->ntotal = 0;
+ mc->live_servers = apr_palloc(p, mc->nalloc * sizeof(struct apr_memcache_server_t *));
+ mc->hash_func = NULL;
+ mc->hash_baton = NULL;
+ mc->server_func = NULL;
+ mc->server_baton = NULL;
+ *memcache = mc;
+ return rv;
+}
+
+
+/* The crc32 functions and data was originally written by Spencer
+ * Garrett <srg@quick.com> and was gleaned from the PostgreSQL source
+ * tree via the files contrib/ltree/crc32.[ch] and from FreeBSD at
+ * src/usr.bin/cksum/crc32.c.
+ */
+
+static const apr_uint32_t crc32tab[256] = {
+ 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
+ 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
+ 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
+ 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
+ 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
+ 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
+ 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
+ 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
+ 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
+ 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
+ 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
+ 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
+ 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
+ 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
+ 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
+ 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
+ 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
+ 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
+ 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
+ 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
+ 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
+ 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
+ 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
+ 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
+ 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
+ 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
+ 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
+ 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
+ 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
+ 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
+ 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
+ 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
+ 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
+ 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
+ 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
+ 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
+ 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
+ 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
+ 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
+ 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
+ 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
+ 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
+ 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
+ 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
+ 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
+ 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
+ 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
+ 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
+ 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
+ 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
+ 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
+ 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
+ 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
+ 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
+ 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
+ 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
+ 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
+ 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
+ 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
+ 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
+ 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
+ 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
+ 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
+ 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,
+};
+
+APU_DECLARE(apr_uint32_t) apr_memcache_hash_crc32(void *baton,
+ const char *data,
+ const apr_size_t data_len)
+{
+ apr_uint32_t i;
+ apr_uint32_t crc;
+ crc = ~0;
+
+ for (i = 0; i < data_len; i++)
+ crc = (crc >> 8) ^ crc32tab[(crc ^ (data[i])) & 0xff];
+
+ return ~crc;
+}
+
+APU_DECLARE(apr_uint32_t) apr_memcache_hash_default(void *baton,
+ const char *data,
+ const apr_size_t data_len)
+{
+ /* The default Perl Client doesn't actually use just crc32 -- it shifts it again
+ * like this....
+ */
+ return ((apr_memcache_hash_crc32(baton, data, data_len) >> 16) & 0x7fff);
+}
+
+APU_DECLARE(apr_uint32_t) apr_memcache_hash(apr_memcache_t *mc,
+ const char *data,
+ const apr_size_t data_len)
+{
+ if (mc->hash_func) {
+ return mc->hash_func(mc->hash_baton, data, data_len);
+ }
+ else {
+ return apr_memcache_hash_default(NULL, data, data_len);
+ }
+}
+
+static apr_status_t get_server_line(apr_memcache_conn_t *conn)
+{
+ apr_size_t bsize = BUFFER_SIZE;
+ apr_status_t rv = APR_SUCCESS;
+
+ rv = apr_brigade_split_line(conn->tb, conn->bb, APR_BLOCK_READ, BUFFER_SIZE);
+
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+
+ rv = apr_brigade_flatten(conn->tb, conn->buffer, &bsize);
+
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+
+ conn->blen = bsize;
+ conn->buffer[bsize] = '\0';
+
+ return apr_brigade_cleanup(conn->tb);
+}
+
+static apr_status_t storage_cmd_write(apr_memcache_t *mc,
+ char *cmd,
+ const apr_size_t cmd_size,
+ const char *key,
+ char *data,
+ const apr_size_t data_size,
+ apr_uint32_t timeout,
+ apr_uint16_t flags)
+{
+ apr_uint32_t hash;
+ apr_memcache_server_t *ms;
+ apr_memcache_conn_t *conn;
+ apr_status_t rv;
+ apr_size_t written;
+ struct iovec vec[5];
+ apr_size_t klen;
+
+ apr_size_t key_size = strlen(key);
+
+ hash = apr_memcache_hash(mc, key, key_size);
+
+ ms = apr_memcache_find_server_hash(mc, hash);
+
+ if (ms == NULL)
+ return APR_NOTFOUND;
+
+ rv = ms_find_conn(ms, &conn);
+
+ if (rv != APR_SUCCESS) {
+ apr_memcache_disable_server(mc, ms);
+ return rv;
+ }
+
+ /* <command name> <key> <flags> <exptime> <bytes>\r\n<data>\r\n */
+
+ vec[0].iov_base = cmd;
+ vec[0].iov_len = cmd_size;
+
+ vec[1].iov_base = (void*)key;
+ vec[1].iov_len = key_size;
+
+ klen = apr_snprintf(conn->buffer, BUFFER_SIZE, " %u %u %" APR_SIZE_T_FMT " " MC_EOL,
+ flags, timeout, data_size);
+
+ vec[2].iov_base = conn->buffer;
+ vec[2].iov_len = klen;
+
+ vec[3].iov_base = data;
+ vec[3].iov_len = data_size;
+
+ vec[4].iov_base = MC_EOL;
+ vec[4].iov_len = MC_EOL_LEN;
+
+ rv = apr_socket_sendv(conn->sock, vec, 5, &written);
+
+ if (rv != APR_SUCCESS) {
+ ms_bad_conn(ms, conn);
+ apr_memcache_disable_server(mc, ms);
+ return rv;
+ }
+
+ rv = get_server_line(conn);
+
+ if (rv != APR_SUCCESS) {
+ ms_bad_conn(ms, conn);
+ apr_memcache_disable_server(mc, ms);
+ return rv;
+ }
+
+ if (strcmp(conn->buffer, MS_STORED MC_EOL) == 0) {
+ rv = APR_SUCCESS;
+ }
+ else if (strcmp(conn->buffer, MS_NOT_STORED MC_EOL) == 0) {
+ rv = APR_EEXIST;
+ }
+ else {
+ rv = APR_EGENERAL;
+ }
+
+ ms_release_conn(ms, conn);
+
+ return rv;
+}
+
+APU_DECLARE(apr_status_t)
+apr_memcache_set(apr_memcache_t *mc,
+ const char *key,
+ char *data,
+ const apr_size_t data_size,
+ apr_uint32_t timeout,
+ apr_uint16_t flags)
+{
+ return storage_cmd_write(mc,
+ MC_SET, MC_SET_LEN,
+ key,
+ data, data_size,
+ timeout, flags);
+}
+
+APU_DECLARE(apr_status_t)
+apr_memcache_add(apr_memcache_t *mc,
+ const char *key,
+ char *data,
+ const apr_size_t data_size,
+ apr_uint32_t timeout,
+ apr_uint16_t flags)
+{
+ return storage_cmd_write(mc,
+ MC_ADD, MC_ADD_LEN,
+ key,
+ data, data_size,
+ timeout, flags);
+}
+
+APU_DECLARE(apr_status_t)
+apr_memcache_replace(apr_memcache_t *mc,
+ const char *key,
+ char *data,
+ const apr_size_t data_size,
+ apr_uint32_t timeout,
+ apr_uint16_t flags)
+{
+ return storage_cmd_write(mc,
+ MC_REPLACE, MC_REPLACE_LEN,
+ key,
+ data, data_size,
+ timeout, flags);
+
+}
+
+APU_DECLARE(apr_status_t)
+apr_memcache_getp(apr_memcache_t *mc,
+ apr_pool_t *p,
+ const char *key,
+ char **baton,
+ apr_size_t *new_length,
+ apr_uint16_t *flags_)
+{
+ apr_status_t rv;
+ apr_memcache_server_t *ms;
+ apr_memcache_conn_t *conn;
+ apr_uint32_t hash;
+ apr_size_t written;
+ apr_size_t klen = strlen(key);
+ struct iovec vec[3];
+
+ hash = apr_memcache_hash(mc, key, klen);
+ ms = apr_memcache_find_server_hash(mc, hash);
+ if (ms == NULL)
+ return APR_NOTFOUND;
+
+ rv = ms_find_conn(ms, &conn);
+
+ if (rv != APR_SUCCESS) {
+ apr_memcache_disable_server(mc, ms);
+ return rv;
+ }
+
+ /* get <key>[ <key>[...]]\r\n */
+ vec[0].iov_base = MC_GET;
+ vec[0].iov_len = MC_GET_LEN;
+
+ vec[1].iov_base = (void*)key;
+ vec[1].iov_len = klen;
+
+ vec[2].iov_base = MC_EOL;
+ vec[2].iov_len = MC_EOL_LEN;
+
+ rv = apr_socket_sendv(conn->sock, vec, 3, &written);
+
+ if (rv != APR_SUCCESS) {
+ ms_bad_conn(ms, conn);
+ apr_memcache_disable_server(mc, ms);
+ return rv;
+ }
+
+ rv = get_server_line(conn);
+ if (rv != APR_SUCCESS) {
+ ms_bad_conn(ms, conn);
+ apr_memcache_disable_server(mc, ms);
+ return rv;
+ }
+
+ if (strncmp(MS_VALUE, conn->buffer, MS_VALUE_LEN) == 0) {
+ char *flags;
+ char *length;
+ char *last;
+ apr_size_t len = 0;
+
+ flags = apr_strtok(conn->buffer, " ", &last);
+ flags = apr_strtok(NULL, " ", &last);
+ flags = apr_strtok(NULL, " ", &last);
+
+ if (flags_) {
+ *flags_ = atoi(flags);
+ }
+
+ length = apr_strtok(NULL, " ", &last);
+ if (length) {
+ len = strtol(length, (char **)NULL, 10);
+ }
+
+ if (len == 0 ) {
+ *new_length = 0;
+ *baton = NULL;
+ }
+ else {
+ apr_bucket_brigade *bbb;
+ apr_bucket *e;
+
+ /* eat the trailing \r\n */
+ rv = apr_brigade_partition(conn->bb, len+2, &e);
+
+ if (rv != APR_SUCCESS) {
+ ms_bad_conn(ms, conn);
+ apr_memcache_disable_server(mc, ms);
+ return rv;
+ }
+
+ bbb = apr_brigade_split(conn->bb, e);
+
+ rv = apr_brigade_pflatten(conn->bb, baton, &len, p);
+
+ if (rv != APR_SUCCESS) {
+ ms_bad_conn(ms, conn);
+ apr_memcache_disable_server(mc, ms);
+ return rv;
+ }
+
+ rv = apr_brigade_destroy(conn->bb);
+ if (rv != APR_SUCCESS) {
+ ms_bad_conn(ms, conn);
+ apr_memcache_disable_server(mc, ms);
+ return rv;
+ }
+
+ conn->bb = bbb;
+
+ *new_length = len - 2;
+ (*baton)[*new_length] = '\0';
+ }
+
+ rv = get_server_line(conn);
+ if (rv != APR_SUCCESS) {
+ ms_bad_conn(ms, conn);
+ apr_memcache_disable_server(mc, ms);
+ return rv;
+ }
+
+ if (strncmp(MS_END, conn->buffer, MS_END_LEN) != 0) {
+ rv = APR_EGENERAL;
+ }
+ }
+ else if (strncmp(MS_END, conn->buffer, MS_END_LEN) == 0) {
+ rv = APR_NOTFOUND;
+ }
+ else {
+ rv = APR_EGENERAL;
+ }
+
+ ms_release_conn(ms, conn);
+
+ return rv;
+}
+
+APU_DECLARE(apr_status_t)
+apr_memcache_delete(apr_memcache_t *mc,
+ const char *key,
+ apr_uint32_t timeout)
+{
+ apr_status_t rv;
+ apr_memcache_server_t *ms;
+ apr_memcache_conn_t *conn;
+ apr_uint32_t hash;
+ apr_size_t written;
+ struct iovec vec[3];
+ apr_size_t klen = strlen(key);
+
+ hash = apr_memcache_hash(mc, key, klen);
+ ms = apr_memcache_find_server_hash(mc, hash);
+ if (ms == NULL)
+ return APR_NOTFOUND;
+
+ rv = ms_find_conn(ms, &conn);
+
+ if (rv != APR_SUCCESS) {
+ apr_memcache_disable_server(mc, ms);
+ return rv;
+ }
+
+ /* delete <key> <time>\r\n */
+ vec[0].iov_base = MC_DELETE;
+ vec[0].iov_len = MC_DELETE_LEN;
+
+ vec[1].iov_base = (void*)key;
+ vec[1].iov_len = klen;
+
+ klen = apr_snprintf(conn->buffer, BUFFER_SIZE, " %u" MC_EOL, timeout);
+
+ vec[2].iov_base = conn->buffer;
+ vec[2].iov_len = klen;
+
+ rv = apr_socket_sendv(conn->sock, vec, 3, &written);
+
+ if (rv != APR_SUCCESS) {
+ ms_bad_conn(ms, conn);
+ apr_memcache_disable_server(mc, ms);
+ return rv;
+ }
+
+ rv = get_server_line(conn);
+ if (rv != APR_SUCCESS) {
+ ms_bad_conn(ms, conn);
+ apr_memcache_disable_server(mc, ms);
+ return rv;
+ }
+
+ if (strncmp(MS_DELETED, conn->buffer, MS_DELETED_LEN) == 0) {
+ rv = APR_SUCCESS;
+ }
+ else if (strncmp(MS_NOT_FOUND, conn->buffer, MS_NOT_FOUND_LEN) == 0) {
+ rv = APR_NOTFOUND;
+ }
+ else {
+ rv = APR_EGENERAL;
+ }
+
+ ms_release_conn(ms, conn);
+
+ return rv;
+}
+
+static apr_status_t num_cmd_write(apr_memcache_t *mc,
+ char *cmd,
+ const apr_uint32_t cmd_size,
+ const char *key,
+ const apr_int32_t inc,
+ apr_uint32_t *new_value)
+{
+ apr_status_t rv;
+ apr_memcache_server_t *ms;
+ apr_memcache_conn_t *conn;
+ apr_uint32_t hash;
+ apr_size_t written;
+ struct iovec vec[3];
+ apr_size_t klen = strlen(key);
+
+ hash = apr_memcache_hash(mc, key, klen);
+ ms = apr_memcache_find_server_hash(mc, hash);
+ if (ms == NULL)
+ return APR_NOTFOUND;
+
+ rv = ms_find_conn(ms, &conn);
+
+ if (rv != APR_SUCCESS) {
+ apr_memcache_disable_server(mc, ms);
+ return rv;
+ }
+
+ /* <cmd> <key> <value>\r\n */
+ vec[0].iov_base = cmd;
+ vec[0].iov_len = cmd_size;
+
+ vec[1].iov_base = (void*)key;
+ vec[1].iov_len = klen;
+
+ klen = apr_snprintf(conn->buffer, BUFFER_SIZE, " %u" MC_EOL, inc);
+
+ vec[2].iov_base = conn->buffer;
+ vec[2].iov_len = klen;
+
+ rv = apr_socket_sendv(conn->sock, vec, 3, &written);
+
+ if (rv != APR_SUCCESS) {
+ ms_bad_conn(ms, conn);
+ apr_memcache_disable_server(mc, ms);
+ return rv;
+ }
+
+ rv = get_server_line(conn);
+ if (rv != APR_SUCCESS) {
+ ms_bad_conn(ms, conn);
+ apr_memcache_disable_server(mc, ms);
+ return rv;
+ }
+
+ if (strncmp(MS_ERROR, conn->buffer, MS_ERROR_LEN) == 0) {
+ rv = APR_EGENERAL;
+ }
+ else if (strncmp(MS_NOT_FOUND, conn->buffer, MS_NOT_FOUND_LEN) == 0) {
+ rv = APR_NOTFOUND;
+ }
+ else {
+ if (new_value) {
+ *new_value = atoi(conn->buffer);
+ }
+ rv = APR_SUCCESS;
+ }
+
+ ms_release_conn(ms, conn);
+
+ return rv;
+}
+
+APU_DECLARE(apr_status_t)
+apr_memcache_incr(apr_memcache_t *mc,
+ const char *key,
+ apr_int32_t inc,
+ apr_uint32_t *new_value)
+{
+ return num_cmd_write(mc,
+ MC_INCR,
+ MC_INCR_LEN,
+ key,
+ inc,
+ new_value);
+}
+
+
+APU_DECLARE(apr_status_t)
+apr_memcache_decr(apr_memcache_t *mc,
+ const char *key,
+ apr_int32_t inc,
+ apr_uint32_t *new_value)
+{
+ return num_cmd_write(mc,
+ MC_DECR,
+ MC_DECR_LEN,
+ key,
+ inc,
+ new_value);
+}
+
+
+
+APU_DECLARE(apr_status_t)
+apr_memcache_version(apr_memcache_server_t *ms,
+ apr_pool_t *p,
+ char **baton)
+{
+ apr_status_t rv;
+ apr_memcache_conn_t *conn;
+ apr_size_t written;
+ struct iovec vec[2];
+
+ rv = ms_find_conn(ms, &conn);
+
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+
+ /* version\r\n */
+ vec[0].iov_base = MC_VERSION;
+ vec[0].iov_len = MC_VERSION_LEN;
+
+ vec[1].iov_base = MC_EOL;
+ vec[1].iov_len = MC_EOL_LEN;
+
+ rv = apr_socket_sendv(conn->sock, vec, 2, &written);
+
+ if (rv != APR_SUCCESS) {
+ ms_bad_conn(ms, conn);
+ return rv;
+ }
+
+ rv = get_server_line(conn);
+ if (rv != APR_SUCCESS) {
+ ms_bad_conn(ms, conn);
+ return rv;
+ }
+
+ if (strncmp(MS_VERSION, conn->buffer, MS_VERSION_LEN) == 0) {
+ *baton = apr_pstrmemdup(p, conn->buffer+MS_VERSION_LEN+1,
+ conn->blen - MS_VERSION_LEN - 2);
+ rv = APR_SUCCESS;
+ }
+ else {
+ rv = APR_EGENERAL;
+ }
+
+ ms_release_conn(ms, conn);
+
+ return rv;
+}
+
+apr_status_t mc_version_ping(apr_memcache_server_t *ms)
+{
+ apr_status_t rv;
+ apr_size_t written;
+ struct iovec vec[2];
+ apr_memcache_conn_t *conn;
+
+ rv = ms_find_conn(ms, &conn);
+
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+
+ /* version\r\n */
+ vec[0].iov_base = MC_VERSION;
+ vec[0].iov_len = MC_VERSION_LEN;
+
+ vec[1].iov_base = MC_EOL;
+ vec[1].iov_len = MC_EOL_LEN;
+
+ rv = apr_socket_sendv(conn->sock, vec, 2, &written);
+
+ if (rv != APR_SUCCESS) {
+ ms_bad_conn(ms, conn);
+ return rv;
+ }
+
+ rv = get_server_line(conn);
+ ms_release_conn(ms, conn);
+ return rv;
+}
+
+
+APU_DECLARE(void)
+apr_memcache_add_multget_key(apr_pool_t *data_pool,
+ const char* key,
+ apr_hash_t **values)
+{
+ apr_memcache_value_t* value;
+ apr_size_t klen = strlen(key);
+
+ /* create the value hash if need be */
+ if (!*values) {
+ *values = apr_hash_make(data_pool);
+ }
+
+ /* init key and add it to the value hash */
+ value = apr_pcalloc(data_pool, sizeof(apr_memcache_value_t));
+
+ value->status = APR_NOTFOUND;
+ value->key = apr_pstrdup(data_pool, key);
+
+ apr_hash_set(*values, value->key, klen, value);
+}
+
+static void mget_conn_result(int serverup,
+ int connup,
+ apr_status_t rv,
+ apr_memcache_t *mc,
+ apr_memcache_server_t *ms,
+ apr_memcache_conn_t *conn,
+ struct cache_server_query_t *server_query,
+ apr_hash_t *values,
+ apr_hash_t *server_queries)
+{
+ apr_int32_t j;
+ apr_memcache_value_t* value;
+
+ apr_hash_set(server_queries, &ms, sizeof(ms), NULL);
+
+ if (connup) {
+ ms_release_conn(ms, conn);
+ } else {
+ ms_bad_conn(ms, conn);
+
+ if (!serverup) {
+ apr_memcache_disable_server(mc, ms);
+ }
+ }
+
+ for (j = 1; j < server_query->query_vec_count ; j+=2) {
+ if (server_query->query_vec[j].iov_base) {
+ value = apr_hash_get(values, server_query->query_vec[j].iov_base,
+ strlen(server_query->query_vec[j].iov_base));
+
+ if (value->status == APR_NOTFOUND) {
+ value->status = rv;
+ }
+ }
+ }
+}
+
+APU_DECLARE(apr_status_t)
+apr_memcache_multgetp(apr_memcache_t *mc,
+ apr_pool_t *temp_pool,
+ apr_pool_t *data_pool,
+ apr_hash_t *values)
+{
+ apr_status_t rv;
+ apr_memcache_server_t* ms;
+ apr_memcache_conn_t* conn;
+ apr_uint32_t hash;
+ apr_size_t written;
+ apr_size_t klen;
+
+ apr_memcache_value_t* value;
+ apr_hash_index_t* value_hash_index;
+
+ /* this is a little over aggresive, but beats multiple loops
+ * to figure out how long each vector needs to be per-server.
+ */
+ apr_int32_t veclen = 2 + 2 * apr_hash_count(values) - 1; /* get <key>[<space><key>...]\r\n */
+ apr_int32_t i, j;
+ apr_int32_t queries_sent;
+ apr_int32_t queries_recvd;
+
+ apr_hash_t * server_queries = apr_hash_make(temp_pool);
+ struct cache_server_query_t* server_query;
+ apr_hash_index_t * query_hash_index;
+
+ apr_pollset_t* pollset;
+ const apr_pollfd_t* activefds;
+ apr_pollfd_t* pollfds;
+
+
+ /* build all the queries */
+ value_hash_index = apr_hash_first(temp_pool, values);
+ while (value_hash_index) {
+ void *v;
+ apr_hash_this(value_hash_index, NULL, NULL, &v);
+ value = v;
+ value_hash_index = apr_hash_next(value_hash_index);
+ klen = strlen(value->key);
+
+ hash = apr_memcache_hash(mc, value->key, klen);
+ ms = apr_memcache_find_server_hash(mc, hash);
+ if (ms == NULL) {
+ continue;
+ }
+
+ server_query = apr_hash_get(server_queries, &ms, sizeof(ms));
+
+ if (!server_query) {
+ rv = ms_find_conn(ms, &conn);
+
+ if (rv != APR_SUCCESS) {
+ apr_memcache_disable_server(mc, ms);
+ value->status = rv;
+ continue;
+ }
+
+ server_query = apr_pcalloc(temp_pool,sizeof(struct cache_server_query_t));
+
+ apr_hash_set(server_queries, &ms, sizeof(ms), server_query);
+
+ server_query->ms = ms;
+ server_query->conn = conn;
+ server_query->query_vec = apr_pcalloc(temp_pool, sizeof(struct iovec)*veclen);
+
+ /* set up the first key */
+ server_query->query_vec[0].iov_base = MC_GET;
+ server_query->query_vec[0].iov_len = MC_GET_LEN;
+
+ server_query->query_vec[1].iov_base = (void*)(value->key);
+ server_query->query_vec[1].iov_len = klen;
+
+ server_query->query_vec[2].iov_base = MC_EOL;
+ server_query->query_vec[2].iov_len = MC_EOL_LEN;
+
+ server_query->query_vec_count = 3;
+ }
+ else {
+ j = server_query->query_vec_count - 1;
+
+ server_query->query_vec[j].iov_base = MC_WS;
+ server_query->query_vec[j].iov_len = MC_WS_LEN;
+ j++;
+
+ server_query->query_vec[j].iov_base = (void*)(value->key);
+ server_query->query_vec[j].iov_len = klen;
+ j++;
+
+ server_query->query_vec[j].iov_base = MC_EOL;
+ server_query->query_vec[j].iov_len = MC_EOL_LEN;
+ j++;
+
+ server_query->query_vec_count = j;
+ }
+ }
+
+ /* create polling structures */
+ pollfds = apr_pcalloc(temp_pool, apr_hash_count(server_queries) * sizeof(apr_pollfd_t));
+
+ rv = apr_pollset_create(&pollset, apr_hash_count(server_queries), temp_pool, 0);
+
+ if (rv != APR_SUCCESS) {
+ query_hash_index = apr_hash_first(temp_pool, server_queries);
+
+ while (query_hash_index) {
+ void *v;
+ apr_hash_this(query_hash_index, NULL, NULL, &v);
+ server_query = v;
+ query_hash_index = apr_hash_next(query_hash_index);
+
+ mget_conn_result(TRUE, TRUE, rv, mc, server_query->ms, server_query->conn,
+ server_query, values, server_queries);
+ }
+
+ return rv;
+ }
+
+ /* send all the queries */
+ queries_sent = 0;
+ query_hash_index = apr_hash_first(temp_pool, server_queries);
+
+ while (query_hash_index) {
+ void *v;
+ apr_hash_this(query_hash_index, NULL, NULL, &v);
+ server_query = v;
+ query_hash_index = apr_hash_next(query_hash_index);
+
+ conn = server_query->conn;
+ ms = server_query->ms;
+
+ for (i = 0, rv = APR_SUCCESS; i < veclen && rv == APR_SUCCESS; i += APR_MAX_IOVEC_SIZE) {
+ rv = apr_socket_sendv(conn->sock, &(server_query->query_vec[i]),
+ veclen-i>APR_MAX_IOVEC_SIZE ? APR_MAX_IOVEC_SIZE : veclen-i , &written);
+ }
+
+ if (rv != APR_SUCCESS) {
+ mget_conn_result(FALSE, FALSE, rv, mc, ms, conn,
+ server_query, values, server_queries);
+ continue;
+ }
+
+ pollfds[queries_sent].desc_type = APR_POLL_SOCKET;
+ pollfds[queries_sent].reqevents = APR_POLLIN;
+ pollfds[queries_sent].p = temp_pool;
+ pollfds[queries_sent].desc.s = conn->sock;
+ pollfds[queries_sent].client_data = (void *)server_query;
+ apr_pollset_add (pollset, &pollfds[queries_sent]);
+
+ queries_sent++;
+ }
+
+ while (queries_sent) {
+ rv = apr_pollset_poll(pollset, MULT_GET_TIMEOUT, &queries_recvd, &activefds);
+
+ if (rv != APR_SUCCESS) {
+ /* timeout */
+ queries_sent = 0;
+ continue;
+ }
+ for (i = 0; i < queries_recvd; i++) {
+ server_query = activefds[i].client_data;
+ conn = server_query->conn;
+ ms = server_query->ms;
+
+ rv = get_server_line(conn);
+
+ if (rv != APR_SUCCESS) {
+ apr_pollset_remove (pollset, &activefds[i]);
+ mget_conn_result(FALSE, FALSE, rv, mc, ms, conn,
+ server_query, values, server_queries);
+ queries_sent--;
+ continue;
+ }
+
+ if (strncmp(MS_VALUE, conn->buffer, MS_VALUE_LEN) == 0) {
+ char *key;
+ char *flags;
+ char *length;
+ char *last;
+ char *data;
+ apr_size_t len = 0;
+
+ key = apr_strtok(conn->buffer, " ", &last); /* just the VALUE, ignore */
+ key = apr_strtok(NULL, " ", &last);
+ flags = apr_strtok(NULL, " ", &last);
+
+
+ length = apr_strtok(NULL, " ", &last);
+ if (length) {
+ len = strtol(length, (char **) NULL, 10);
+ }
+
+ value = apr_hash_get(values, key, strlen(key));
+
+
+ if (value) {
+ if (len != 0) {
+ apr_bucket_brigade *bbb;
+ apr_bucket *e;
+
+ /* eat the trailing \r\n */
+ rv = apr_brigade_partition(conn->bb, len+2, &e);
+
+ if (rv != APR_SUCCESS) {
+ apr_pollset_remove (pollset, &activefds[i]);
+ mget_conn_result(FALSE, FALSE, rv, mc, ms, conn,
+ server_query, values, server_queries);
+ queries_sent--;
+ continue;
+ }
+
+ bbb = apr_brigade_split(conn->bb, e);
+
+ rv = apr_brigade_pflatten(conn->bb, &data, &len, data_pool);
+
+ if (rv != APR_SUCCESS) {
+ apr_pollset_remove (pollset, &activefds[i]);
+ mget_conn_result(FALSE, FALSE, rv, mc, ms, conn,
+ server_query, values, server_queries);
+ queries_sent--;
+ continue;
+ }
+
+ rv = apr_brigade_destroy(conn->bb);
+ if (rv != APR_SUCCESS) {
+ apr_pollset_remove (pollset, &activefds[i]);
+ mget_conn_result(FALSE, FALSE, rv, mc, ms, conn,
+ server_query, values, server_queries);
+ queries_sent--;
+ continue;
+ }
+
+ conn->bb = bbb;
+
+ value->len = len - 2;
+ data[value->len] = '\0';
+ value->data = data;
+ }
+
+ value->status = rv;
+ value->flags = atoi(flags);
+
+ /* stay on the server */
+ i--;
+
+ }
+ else {
+ /* TODO: Server Sent back a key I didn't ask for or my
+ * hash is corrupt */
+ }
+ }
+ else if (strncmp(MS_END, conn->buffer, MS_END_LEN) == 0) {
+ /* this connection is done */
+ apr_pollset_remove (pollset, &activefds[i]);
+ ms_release_conn(ms, conn);
+ apr_hash_set(server_queries, &ms, sizeof(ms), NULL);
+
+ queries_sent--;
+ }
+ else {
+ /* unknown reply? */
+ rv = APR_EGENERAL;
+ }
+
+ } /* /for */
+ } /* /while */
+
+ query_hash_index = apr_hash_first(temp_pool, server_queries);
+ while (query_hash_index) {
+ void *v;
+ apr_hash_this(query_hash_index, NULL, NULL, &v);
+ server_query = v;
+ query_hash_index = apr_hash_next(query_hash_index);
+
+ conn = server_query->conn;
+ ms = server_query->ms;
+
+ mget_conn_result(TRUE, (rv == APR_SUCCESS), rv, mc, ms, conn,
+ server_query, values, server_queries);
+ continue;
+ }
+
+ apr_pollset_destroy(pollset);
+ apr_pool_clear(temp_pool);
+ return APR_SUCCESS;
+
+}
+
+
+
+/**
+ * Define all of the strings for stats
+ */
+
+#define STAT_pid MS_STAT " pid "
+#define STAT_pid_LEN (sizeof(STAT_pid)-1)
+
+#define STAT_uptime MS_STAT " uptime "
+#define STAT_uptime_LEN (sizeof(STAT_uptime)-1)
+
+#define STAT_time MS_STAT " time "
+#define STAT_time_LEN (sizeof(STAT_time)-1)
+
+#define STAT_version MS_STAT " version "
+#define STAT_version_LEN (sizeof(STAT_version)-1)
+
+#define STAT_pointer_size MS_STAT " pointer_size "
+#define STAT_pointer_size_LEN (sizeof(STAT_pointer_size)-1)
+
+#define STAT_rusage_user MS_STAT " rusage_user "
+#define STAT_rusage_user_LEN (sizeof(STAT_rusage_user)-1)
+
+#define STAT_rusage_system MS_STAT " rusage_system "
+#define STAT_rusage_system_LEN (sizeof(STAT_rusage_system)-1)
+
+#define STAT_curr_items MS_STAT " curr_items "
+#define STAT_curr_items_LEN (sizeof(STAT_curr_items)-1)
+
+#define STAT_total_items MS_STAT " total_items "
+#define STAT_total_items_LEN (sizeof(STAT_total_items)-1)
+
+#define STAT_bytes MS_STAT " bytes "
+#define STAT_bytes_LEN (sizeof(STAT_bytes)-1)
+
+#define STAT_curr_connections MS_STAT " curr_connections "
+#define STAT_curr_connections_LEN (sizeof(STAT_curr_connections)-1)
+
+#define STAT_total_connections MS_STAT " total_connections "
+#define STAT_total_connections_LEN (sizeof(STAT_total_connections)-1)
+
+#define STAT_connection_structures MS_STAT " connection_structures "
+#define STAT_connection_structures_LEN (sizeof(STAT_connection_structures)-1)
+
+#define STAT_cmd_get MS_STAT " cmd_get "
+#define STAT_cmd_get_LEN (sizeof(STAT_cmd_get)-1)
+
+#define STAT_cmd_set MS_STAT " cmd_set "
+#define STAT_cmd_set_LEN (sizeof(STAT_cmd_set)-1)
+
+#define STAT_get_hits MS_STAT " get_hits "
+#define STAT_get_hits_LEN (sizeof(STAT_get_hits)-1)
+
+#define STAT_get_misses MS_STAT " get_misses "
+#define STAT_get_misses_LEN (sizeof(STAT_get_misses)-1)
+
+#define STAT_evictions MS_STAT " evictions "
+#define STAT_evictions_LEN (sizeof(STAT_evictions)-1)
+
+#define STAT_bytes_read MS_STAT " bytes_read "
+#define STAT_bytes_read_LEN (sizeof(STAT_bytes_read)-1)
+
+#define STAT_bytes_written MS_STAT " bytes_written "
+#define STAT_bytes_written_LEN (sizeof(STAT_bytes_written)-1)
+
+#define STAT_limit_maxbytes MS_STAT " limit_maxbytes "
+#define STAT_limit_maxbytes_LEN (sizeof(STAT_limit_maxbytes)-1)
+
+#define STAT_threads MS_STAT " threads "
+#define STAT_threads_LEN (sizeof(STAT_threads)-1)
+
+static const char *stat_read_string(apr_pool_t *p, char *buf, apr_size_t len)
+{
+ /* remove trailing \r\n and null char */
+ return apr_pstrmemdup(p, buf, len-2);
+}
+
+static apr_uint32_t stat_read_uint32(apr_pool_t *p, char *buf, apr_size_t len)
+{
+ buf[len-2] = '\0';
+ return atoi(buf);
+}
+
+static apr_uint64_t stat_read_uint64(apr_pool_t *p, char *buf, apr_size_t len)
+{
+ buf[len-2] = '\0';
+ return apr_atoi64(buf);
+}
+
+static apr_time_t stat_read_time(apr_pool_t *p, char *buf, apr_size_t len)
+{
+ buf[len-2] = '\0';
+ return apr_time_from_sec(atoi(buf));
+}
+
+static apr_time_t stat_read_rtime(apr_pool_t *p, char *buf, apr_size_t len)
+{
+ char *tok;
+ char *secs;
+ char *usecs;
+ const char *sep = ":.";
+
+ buf[len-2] = '\0';
+
+ secs = apr_strtok(buf, sep, &tok);
+ usecs = apr_strtok(NULL, sep, &tok);
+ if (secs && usecs) {
+ return apr_time_make(atoi(secs), atoi(usecs));
+ }
+ else {
+ return apr_time_make(0, 0);
+ }
+}
+
+/**
+ * I got tired of Typing. Meh.
+ *
+ * TODO: Convert it to static tables to make it cooler.
+ */
+
+#define mc_stat_cmp(name) \
+ strncmp(STAT_ ## name, conn->buffer, STAT_ ## name ## _LEN) == 0
+
+#define mc_stat_str(name) \
+ stat_read_string(p, conn->buffer + name, \
+ conn->blen - name)
+
+#define mc_stat_uint32(name) \
+ stat_read_uint32(p, conn->buffer + name, \
+ conn->blen - name)
+
+#define mc_stat_uint64(name) \
+ stat_read_uint64(p, conn->buffer + name, \
+ conn->blen - name)
+
+#define mc_stat_time(name) \
+ stat_read_time(p, conn->buffer + name, \
+ conn->blen - name)
+
+#define mc_stat_rtime(name) \
+ stat_read_rtime(p, conn->buffer + name, \
+ conn->blen - name)
+
+
+#define mc_do_stat(name, type) \
+ if (mc_stat_cmp(name)) { \
+ stats-> name = mc_stat_ ## type ((STAT_ ## name ## _LEN)); \
+ }
+
+static void update_stats(apr_pool_t *p, apr_memcache_conn_t *conn,
+ apr_memcache_stats_t *stats)
+{
+
+ mc_do_stat(version, str)
+ else mc_do_stat(pid, uint32)
+ else mc_do_stat(uptime, uint32)
+ else mc_do_stat(pointer_size, uint32)
+ else mc_do_stat(time, time)
+ else mc_do_stat(rusage_user, rtime)
+ else mc_do_stat(rusage_system, rtime)
+ else mc_do_stat(curr_items, uint32)
+ else mc_do_stat(total_items, uint32)
+ else mc_do_stat(bytes, uint64)
+ else mc_do_stat(curr_connections, uint32)
+ else mc_do_stat(total_connections, uint32)
+ else mc_do_stat(connection_structures, uint32)
+ else mc_do_stat(cmd_get, uint32)
+ else mc_do_stat(cmd_set, uint32)
+ else mc_do_stat(get_hits, uint32)
+ else mc_do_stat(get_misses, uint32)
+ else mc_do_stat(evictions, uint64)
+ else mc_do_stat(bytes_read, uint64)
+ else mc_do_stat(bytes_written, uint64)
+ else mc_do_stat(limit_maxbytes, uint32)
+ else mc_do_stat(threads, uint32)
+}
+
+APU_DECLARE(apr_status_t)
+apr_memcache_stats(apr_memcache_server_t *ms,
+ apr_pool_t *p,
+ apr_memcache_stats_t **stats)
+{
+ apr_memcache_stats_t *ret;
+ apr_status_t rv;
+ apr_memcache_conn_t *conn;
+ apr_size_t written;
+ struct iovec vec[2];
+
+ rv = ms_find_conn(ms, &conn);
+
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+
+ /* version\r\n */
+ vec[0].iov_base = MC_STATS;
+ vec[0].iov_len = MC_STATS_LEN;
+
+ vec[1].iov_base = MC_EOL;
+ vec[1].iov_len = MC_EOL_LEN;
+
+ rv = apr_socket_sendv(conn->sock, vec, 2, &written);
+
+ if (rv != APR_SUCCESS) {
+ ms_bad_conn(ms, conn);
+ return rv;
+ }
+
+ ret = apr_pcalloc(p, sizeof(apr_memcache_stats_t));
+
+ do {
+ rv = get_server_line(conn);
+ if (rv != APR_SUCCESS) {
+ ms_bad_conn(ms, conn);
+ return rv;
+ }
+
+ if (strncmp(MS_END, conn->buffer, MS_END_LEN) == 0) {
+ rv = APR_SUCCESS;
+ break;
+ }
+ else if (strncmp(MS_STAT, conn->buffer, MS_STAT_LEN) == 0) {
+ update_stats(p, conn, ret);
+ continue;
+ }
+ else {
+ rv = APR_EGENERAL;
+ break;
+ }
+
+ } while(1);
+
+ ms_release_conn(ms, conn);
+
+ if (stats) {
+ *stats = ret;
+ }
+
+ return rv;
+}
+
diff --git a/contrib/apr-util/misc/apr_date.c b/contrib/apr-util/misc/apr_date.c
new file mode 100644
index 000000000000..28086e334b35
--- /dev/null
+++ b/contrib/apr-util/misc/apr_date.c
@@ -0,0 +1,637 @@
+/* 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.
+ */
+
+/*
+ * apr_date.c: date parsing utility routines
+ * These routines are (hopefully) platform independent.
+ *
+ * 27 Oct 1996 Roy Fielding
+ * Extracted (with many modifications) from mod_proxy.c and
+ * tested with over 50,000 randomly chosen valid date strings
+ * and several hundred variations of invalid date strings.
+ *
+ */
+
+#include "apr.h"
+#include "apr_lib.h"
+
+#define APR_WANT_STRFUNC
+#include "apr_want.h"
+
+#if APR_HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#if APR_HAVE_CTYPE_H
+#include <ctype.h>
+#endif
+
+#include "apr_date.h"
+
+/*
+ * Compare a string to a mask
+ * Mask characters (arbitrary maximum is 256 characters, just in case):
+ * @ - uppercase letter
+ * $ - lowercase letter
+ * & - hex digit
+ * # - digit
+ * ~ - digit or space
+ * * - swallow remaining characters
+ * <x> - exact match for any other character
+ */
+APU_DECLARE(int) apr_date_checkmask(const char *data, const char *mask)
+{
+ int i;
+ char d;
+
+ for (i = 0; i < 256; i++) {
+ d = data[i];
+ switch (mask[i]) {
+ case '\0':
+ return (d == '\0');
+
+ case '*':
+ return 1;
+
+ case '@':
+ if (!apr_isupper(d))
+ return 0;
+ break;
+ case '$':
+ if (!apr_islower(d))
+ return 0;
+ break;
+ case '#':
+ if (!apr_isdigit(d))
+ return 0;
+ break;
+ case '&':
+ if (!apr_isxdigit(d))
+ return 0;
+ break;
+ case '~':
+ if ((d != ' ') && !apr_isdigit(d))
+ return 0;
+ break;
+ default:
+ if (mask[i] != d)
+ return 0;
+ break;
+ }
+ }
+ return 0; /* We only get here if mask is corrupted (exceeds 256) */
+}
+
+/*
+ * Parses an HTTP date in one of three standard forms:
+ *
+ * Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123
+ * Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
+ * Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format
+ *
+ * and returns the apr_time_t number of microseconds since 1 Jan 1970 GMT,
+ * or APR_DATE_BAD if this would be out of range or if the date is invalid.
+ *
+ * The restricted HTTP syntax is
+ *
+ * HTTP-date = rfc1123-date | rfc850-date | asctime-date
+ *
+ * rfc1123-date = wkday "," SP date1 SP time SP "GMT"
+ * rfc850-date = weekday "," SP date2 SP time SP "GMT"
+ * asctime-date = wkday SP date3 SP time SP 4DIGIT
+ *
+ * date1 = 2DIGIT SP month SP 4DIGIT
+ * ; day month year (e.g., 02 Jun 1982)
+ * date2 = 2DIGIT "-" month "-" 2DIGIT
+ * ; day-month-year (e.g., 02-Jun-82)
+ * date3 = month SP ( 2DIGIT | ( SP 1DIGIT ))
+ * ; month day (e.g., Jun 2)
+ *
+ * time = 2DIGIT ":" 2DIGIT ":" 2DIGIT
+ * ; 00:00:00 - 23:59:59
+ *
+ * wkday = "Mon" | "Tue" | "Wed"
+ * | "Thu" | "Fri" | "Sat" | "Sun"
+ *
+ * weekday = "Monday" | "Tuesday" | "Wednesday"
+ * | "Thursday" | "Friday" | "Saturday" | "Sunday"
+ *
+ * month = "Jan" | "Feb" | "Mar" | "Apr"
+ * | "May" | "Jun" | "Jul" | "Aug"
+ * | "Sep" | "Oct" | "Nov" | "Dec"
+ *
+ * However, for the sake of robustness (and Netscapeness), we ignore the
+ * weekday and anything after the time field (including the timezone).
+ *
+ * This routine is intended to be very fast; 10x faster than using sscanf.
+ *
+ * Originally from Andrew Daviel <andrew@vancouver-webpages.com>, 29 Jul 96
+ * but many changes since then.
+ *
+ */
+APU_DECLARE(apr_time_t) apr_date_parse_http(const char *date)
+{
+ apr_time_exp_t ds;
+ apr_time_t result;
+ int mint, mon;
+ const char *monstr, *timstr;
+ static const int months[12] =
+ {
+ ('J' << 16) | ('a' << 8) | 'n', ('F' << 16) | ('e' << 8) | 'b',
+ ('M' << 16) | ('a' << 8) | 'r', ('A' << 16) | ('p' << 8) | 'r',
+ ('M' << 16) | ('a' << 8) | 'y', ('J' << 16) | ('u' << 8) | 'n',
+ ('J' << 16) | ('u' << 8) | 'l', ('A' << 16) | ('u' << 8) | 'g',
+ ('S' << 16) | ('e' << 8) | 'p', ('O' << 16) | ('c' << 8) | 't',
+ ('N' << 16) | ('o' << 8) | 'v', ('D' << 16) | ('e' << 8) | 'c'};
+
+ if (!date)
+ return APR_DATE_BAD;
+
+ while (*date && apr_isspace(*date)) /* Find first non-whitespace char */
+ ++date;
+
+ if (*date == '\0')
+ return APR_DATE_BAD;
+
+ if ((date = strchr(date, ' ')) == NULL) /* Find space after weekday */
+ return APR_DATE_BAD;
+
+ ++date; /* Now pointing to first char after space, which should be */
+
+ /* start of the actual date information for all 4 formats. */
+
+ if (apr_date_checkmask(date, "## @$$ #### ##:##:## *")) {
+ /* RFC 1123 format with two days */
+ ds.tm_year = ((date[7] - '0') * 10 + (date[8] - '0') - 19) * 100;
+ if (ds.tm_year < 0)
+ return APR_DATE_BAD;
+
+ ds.tm_year += ((date[9] - '0') * 10) + (date[10] - '0');
+
+ ds.tm_mday = ((date[0] - '0') * 10) + (date[1] - '0');
+
+ monstr = date + 3;
+ timstr = date + 12;
+ }
+ else if (apr_date_checkmask(date, "##-@$$-## ##:##:## *")) {
+ /* RFC 850 format */
+ ds.tm_year = ((date[7] - '0') * 10) + (date[8] - '0');
+ if (ds.tm_year < 70)
+ ds.tm_year += 100;
+
+ ds.tm_mday = ((date[0] - '0') * 10) + (date[1] - '0');
+
+ monstr = date + 3;
+ timstr = date + 10;
+ }
+ else if (apr_date_checkmask(date, "@$$ ~# ##:##:## ####*")) {
+ /* asctime format */
+ ds.tm_year = ((date[16] - '0') * 10 + (date[17] - '0') - 19) * 100;
+ if (ds.tm_year < 0)
+ return APR_DATE_BAD;
+
+ ds.tm_year += ((date[18] - '0') * 10) + (date[19] - '0');
+
+ if (date[4] == ' ')
+ ds.tm_mday = 0;
+ else
+ ds.tm_mday = (date[4] - '0') * 10;
+
+ ds.tm_mday += (date[5] - '0');
+
+ monstr = date;
+ timstr = date + 7;
+ }
+ else if (apr_date_checkmask(date, "# @$$ #### ##:##:## *")) {
+ /* RFC 1123 format with one day */
+ ds.tm_year = ((date[6] - '0') * 10 + (date[7] - '0') - 19) * 100;
+ if (ds.tm_year < 0)
+ return APR_DATE_BAD;
+
+ ds.tm_year += ((date[8] - '0') * 10) + (date[9] - '0');
+
+ ds.tm_mday = (date[0] - '0');
+
+ monstr = date + 2;
+ timstr = date + 11;
+ }
+ else
+ return APR_DATE_BAD;
+
+ if (ds.tm_mday <= 0 || ds.tm_mday > 31)
+ return APR_DATE_BAD;
+
+ ds.tm_hour = ((timstr[0] - '0') * 10) + (timstr[1] - '0');
+ ds.tm_min = ((timstr[3] - '0') * 10) + (timstr[4] - '0');
+ ds.tm_sec = ((timstr[6] - '0') * 10) + (timstr[7] - '0');
+
+ if ((ds.tm_hour > 23) || (ds.tm_min > 59) || (ds.tm_sec > 61))
+ return APR_DATE_BAD;
+
+ mint = (monstr[0] << 16) | (monstr[1] << 8) | monstr[2];
+ for (mon = 0; mon < 12; mon++)
+ if (mint == months[mon])
+ break;
+
+ if (mon == 12)
+ return APR_DATE_BAD;
+
+ if ((ds.tm_mday == 31) && (mon == 3 || mon == 5 || mon == 8 || mon == 10))
+ return APR_DATE_BAD;
+
+ /* February gets special check for leapyear */
+ if ((mon == 1) &&
+ ((ds.tm_mday > 29) ||
+ ((ds.tm_mday == 29)
+ && ((ds.tm_year & 3)
+ || (((ds.tm_year % 100) == 0)
+ && (((ds.tm_year % 400) != 100)))))))
+ return APR_DATE_BAD;
+
+ ds.tm_mon = mon;
+
+ /* ap_mplode_time uses tm_usec and tm_gmtoff fields, but they haven't
+ * been set yet.
+ * It should be safe to just zero out these values.
+ * tm_usec is the number of microseconds into the second. HTTP only
+ * cares about second granularity.
+ * tm_gmtoff is the number of seconds off of GMT the time is. By
+ * definition all times going through this function are in GMT, so this
+ * is zero.
+ */
+ ds.tm_usec = 0;
+ ds.tm_gmtoff = 0;
+ if (apr_time_exp_get(&result, &ds) != APR_SUCCESS)
+ return APR_DATE_BAD;
+
+ return result;
+}
+
+/*
+ * Parses a string resembling an RFC 822 date. This is meant to be
+ * leinent in its parsing of dates. Hence, this will parse a wider
+ * range of dates than apr_date_parse_http.
+ *
+ * The prominent mailer (or poster, if mailer is unknown) that has
+ * been seen in the wild is included for the unknown formats.
+ *
+ * Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123
+ * Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
+ * Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format
+ * Sun, 6 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123
+ * Sun, 06 Nov 94 08:49:37 GMT ; RFC 822
+ * Sun, 6 Nov 94 08:49:37 GMT ; RFC 822
+ * Sun, 06 Nov 94 08:49 GMT ; Unknown [drtr@ast.cam.ac.uk]
+ * Sun, 6 Nov 94 08:49 GMT ; Unknown [drtr@ast.cam.ac.uk]
+ * Sun, 06 Nov 94 8:49:37 GMT ; Unknown [Elm 70.85]
+ * Sun, 6 Nov 94 8:49:37 GMT ; Unknown [Elm 70.85]
+ * Mon, 7 Jan 2002 07:21:22 GMT ; Unknown [Postfix]
+ * Sun, 06-Nov-1994 08:49:37 GMT ; RFC 850 with four digit years
+ *
+ */
+
+#define TIMEPARSE(ds,hr10,hr1,min10,min1,sec10,sec1) \
+ { \
+ ds.tm_hour = ((hr10 - '0') * 10) + (hr1 - '0'); \
+ ds.tm_min = ((min10 - '0') * 10) + (min1 - '0'); \
+ ds.tm_sec = ((sec10 - '0') * 10) + (sec1 - '0'); \
+ }
+#define TIMEPARSE_STD(ds,timstr) \
+ { \
+ TIMEPARSE(ds, timstr[0],timstr[1], \
+ timstr[3],timstr[4], \
+ timstr[6],timstr[7]); \
+ }
+
+APU_DECLARE(apr_time_t) apr_date_parse_rfc(const char *date)
+{
+ apr_time_exp_t ds;
+ apr_time_t result;
+ int mint, mon;
+ const char *monstr, *timstr, *gmtstr;
+ static const int months[12] =
+ {
+ ('J' << 16) | ('a' << 8) | 'n', ('F' << 16) | ('e' << 8) | 'b',
+ ('M' << 16) | ('a' << 8) | 'r', ('A' << 16) | ('p' << 8) | 'r',
+ ('M' << 16) | ('a' << 8) | 'y', ('J' << 16) | ('u' << 8) | 'n',
+ ('J' << 16) | ('u' << 8) | 'l', ('A' << 16) | ('u' << 8) | 'g',
+ ('S' << 16) | ('e' << 8) | 'p', ('O' << 16) | ('c' << 8) | 't',
+ ('N' << 16) | ('o' << 8) | 'v', ('D' << 16) | ('e' << 8) | 'c' };
+
+ if (!date)
+ return APR_DATE_BAD;
+
+ /* Not all dates have text days at the beginning. */
+ if (!apr_isdigit(date[0]))
+ {
+ while (*date && apr_isspace(*date)) /* Find first non-whitespace char */
+ ++date;
+
+ if (*date == '\0')
+ return APR_DATE_BAD;
+
+ if ((date = strchr(date, ' ')) == NULL) /* Find space after weekday */
+ return APR_DATE_BAD;
+
+ ++date; /* Now pointing to first char after space, which should be */ }
+
+ /* start of the actual date information for all 11 formats. */
+ if (apr_date_checkmask(date, "## @$$ #### ##:##:## *")) { /* RFC 1123 format */
+ ds.tm_year = ((date[7] - '0') * 10 + (date[8] - '0') - 19) * 100;
+
+ if (ds.tm_year < 0)
+ return APR_DATE_BAD;
+
+ ds.tm_year += ((date[9] - '0') * 10) + (date[10] - '0');
+
+ ds.tm_mday = ((date[0] - '0') * 10) + (date[1] - '0');
+
+ monstr = date + 3;
+ timstr = date + 12;
+ gmtstr = date + 21;
+
+ TIMEPARSE_STD(ds, timstr);
+ }
+ else if (apr_date_checkmask(date, "##-@$$-## ##:##:## *")) {/* RFC 850 format */
+ ds.tm_year = ((date[7] - '0') * 10) + (date[8] - '0');
+
+ if (ds.tm_year < 70)
+ ds.tm_year += 100;
+
+ ds.tm_mday = ((date[0] - '0') * 10) + (date[1] - '0');
+
+ monstr = date + 3;
+ timstr = date + 10;
+ gmtstr = date + 19;
+
+ TIMEPARSE_STD(ds, timstr);
+ }
+ else if (apr_date_checkmask(date, "@$$ ~# ##:##:## ####*")) {
+ /* asctime format */
+ ds.tm_year = ((date[16] - '0') * 10 + (date[17] - '0') - 19) * 100;
+ if (ds.tm_year < 0)
+ return APR_DATE_BAD;
+
+ ds.tm_year += ((date[18] - '0') * 10) + (date[19] - '0');
+
+ if (date[4] == ' ')
+ ds.tm_mday = 0;
+ else
+ ds.tm_mday = (date[4] - '0') * 10;
+
+ ds.tm_mday += (date[5] - '0');
+
+ monstr = date;
+ timstr = date + 7;
+ gmtstr = NULL;
+
+ TIMEPARSE_STD(ds, timstr);
+ }
+ else if (apr_date_checkmask(date, "# @$$ #### ##:##:## *")) {
+ /* RFC 1123 format*/
+ ds.tm_year = ((date[6] - '0') * 10 + (date[7] - '0') - 19) * 100;
+
+ if (ds.tm_year < 0)
+ return APR_DATE_BAD;
+
+ ds.tm_year += ((date[8] - '0') * 10) + (date[9] - '0');
+ ds.tm_mday = (date[0] - '0');
+
+ monstr = date + 2;
+ timstr = date + 11;
+ gmtstr = date + 20;
+
+ TIMEPARSE_STD(ds, timstr);
+ }
+ else if (apr_date_checkmask(date, "## @$$ ## ##:##:## *")) {
+ /* This is the old RFC 1123 date format - many many years ago, people
+ * used two-digit years. Oh, how foolish.
+ *
+ * Two-digit day, two-digit year version. */
+ ds.tm_year = ((date[7] - '0') * 10) + (date[8] - '0');
+
+ if (ds.tm_year < 70)
+ ds.tm_year += 100;
+
+ ds.tm_mday = ((date[0] - '0') * 10) + (date[1] - '0');
+
+ monstr = date + 3;
+ timstr = date + 10;
+ gmtstr = date + 19;
+
+ TIMEPARSE_STD(ds, timstr);
+ }
+ else if (apr_date_checkmask(date, " # @$$ ## ##:##:## *")) {
+ /* This is the old RFC 1123 date format - many many years ago, people
+ * used two-digit years. Oh, how foolish.
+ *
+ * Space + one-digit day, two-digit year version.*/
+ ds.tm_year = ((date[7] - '0') * 10) + (date[8] - '0');
+
+ if (ds.tm_year < 70)
+ ds.tm_year += 100;
+
+ ds.tm_mday = (date[1] - '0');
+
+ monstr = date + 3;
+ timstr = date + 10;
+ gmtstr = date + 19;
+
+ TIMEPARSE_STD(ds, timstr);
+ }
+ else if (apr_date_checkmask(date, "# @$$ ## ##:##:## *")) {
+ /* This is the old RFC 1123 date format - many many years ago, people
+ * used two-digit years. Oh, how foolish.
+ *
+ * One-digit day, two-digit year version. */
+ ds.tm_year = ((date[6] - '0') * 10) + (date[7] - '0');
+
+ if (ds.tm_year < 70)
+ ds.tm_year += 100;
+
+ ds.tm_mday = (date[0] - '0');
+
+ monstr = date + 2;
+ timstr = date + 9;
+ gmtstr = date + 18;
+
+ TIMEPARSE_STD(ds, timstr);
+ }
+ else if (apr_date_checkmask(date, "## @$$ ## ##:## *")) {
+ /* Loser format. This is quite bogus. */
+ ds.tm_year = ((date[7] - '0') * 10) + (date[8] - '0');
+
+ if (ds.tm_year < 70)
+ ds.tm_year += 100;
+
+ ds.tm_mday = ((date[0] - '0') * 10) + (date[1] - '0');
+
+ monstr = date + 3;
+ timstr = date + 10;
+ gmtstr = NULL;
+
+ TIMEPARSE(ds, timstr[0],timstr[1], timstr[3],timstr[4], '0','0');
+ }
+ else if (apr_date_checkmask(date, "# @$$ ## ##:## *")) {
+ /* Loser format. This is quite bogus. */
+ ds.tm_year = ((date[6] - '0') * 10) + (date[7] - '0');
+
+ if (ds.tm_year < 70)
+ ds.tm_year += 100;
+
+ ds.tm_mday = (date[0] - '0');
+
+ monstr = date + 2;
+ timstr = date + 9;
+ gmtstr = NULL;
+
+ TIMEPARSE(ds, timstr[0],timstr[1], timstr[3],timstr[4], '0','0');
+ }
+ else if (apr_date_checkmask(date, "## @$$ ## #:##:## *")) {
+ /* Loser format. This is quite bogus. */
+ ds.tm_year = ((date[7] - '0') * 10) + (date[8] - '0');
+
+ if (ds.tm_year < 70)
+ ds.tm_year += 100;
+
+ ds.tm_mday = ((date[0] - '0') * 10) + (date[1] - '0');
+
+ monstr = date + 3;
+ timstr = date + 9;
+ gmtstr = date + 18;
+
+ TIMEPARSE(ds, '0',timstr[1], timstr[3],timstr[4], timstr[6],timstr[7]);
+ }
+ else if (apr_date_checkmask(date, "# @$$ ## #:##:## *")) {
+ /* Loser format. This is quite bogus. */
+ ds.tm_year = ((date[6] - '0') * 10) + (date[7] - '0');
+
+ if (ds.tm_year < 70)
+ ds.tm_year += 100;
+
+ ds.tm_mday = (date[0] - '0');
+
+ monstr = date + 2;
+ timstr = date + 8;
+ gmtstr = date + 17;
+
+ TIMEPARSE(ds, '0',timstr[1], timstr[3],timstr[4], timstr[6],timstr[7]);
+ }
+ else if (apr_date_checkmask(date, " # @$$ #### ##:##:## *")) {
+ /* RFC 1123 format with a space instead of a leading zero. */
+ ds.tm_year = ((date[7] - '0') * 10 + (date[8] - '0') - 19) * 100;
+
+ if (ds.tm_year < 0)
+ return APR_DATE_BAD;
+
+ ds.tm_year += ((date[9] - '0') * 10) + (date[10] - '0');
+
+ ds.tm_mday = (date[1] - '0');
+
+ monstr = date + 3;
+ timstr = date + 12;
+ gmtstr = date + 21;
+
+ TIMEPARSE_STD(ds, timstr);
+ }
+ else if (apr_date_checkmask(date, "##-@$$-#### ##:##:## *")) {
+ /* RFC 1123 with dashes instead of spaces between date/month/year
+ * This also looks like RFC 850 with four digit years.
+ */
+ ds.tm_year = ((date[7] - '0') * 10 + (date[8] - '0') - 19) * 100;
+ if (ds.tm_year < 0)
+ return APR_DATE_BAD;
+
+ ds.tm_year += ((date[9] - '0') * 10) + (date[10] - '0');
+
+ ds.tm_mday = ((date[0] - '0') * 10) + (date[1] - '0');
+
+ monstr = date + 3;
+ timstr = date + 12;
+ gmtstr = date + 21;
+
+ TIMEPARSE_STD(ds, timstr);
+ }
+ else
+ return APR_DATE_BAD;
+
+ if (ds.tm_mday <= 0 || ds.tm_mday > 31)
+ return APR_DATE_BAD;
+
+ if ((ds.tm_hour > 23) || (ds.tm_min > 59) || (ds.tm_sec > 61))
+ return APR_DATE_BAD;
+
+ mint = (monstr[0] << 16) | (monstr[1] << 8) | monstr[2];
+ for (mon = 0; mon < 12; mon++)
+ if (mint == months[mon])
+ break;
+
+ if (mon == 12)
+ return APR_DATE_BAD;
+
+ if ((ds.tm_mday == 31) && (mon == 3 || mon == 5 || mon == 8 || mon == 10))
+ return APR_DATE_BAD;
+
+ /* February gets special check for leapyear */
+
+ if ((mon == 1) &&
+ ((ds.tm_mday > 29)
+ || ((ds.tm_mday == 29)
+ && ((ds.tm_year & 3)
+ || (((ds.tm_year % 100) == 0)
+ && (((ds.tm_year % 400) != 100)))))))
+ return APR_DATE_BAD;
+
+ ds.tm_mon = mon;
+
+ /* tm_gmtoff is the number of seconds off of GMT the time is.
+ *
+ * We only currently support: [+-]ZZZZ where Z is the offset in
+ * hours from GMT.
+ *
+ * If there is any confusion, tm_gmtoff will remain 0.
+ */
+ ds.tm_gmtoff = 0;
+
+ /* Do we have a timezone ? */
+ if (gmtstr) {
+ int offset;
+ switch (*gmtstr) {
+ case '-':
+ offset = atoi(gmtstr+1);
+ ds.tm_gmtoff -= (offset / 100) * 60 * 60;
+ ds.tm_gmtoff -= (offset % 100) * 60;
+ break;
+ case '+':
+ offset = atoi(gmtstr+1);
+ ds.tm_gmtoff += (offset / 100) * 60 * 60;
+ ds.tm_gmtoff += (offset % 100) * 60;
+ break;
+ }
+ }
+
+ /* apr_time_exp_get uses tm_usec field, but it hasn't been set yet.
+ * It should be safe to just zero out this value.
+ * tm_usec is the number of microseconds into the second. HTTP only
+ * cares about second granularity.
+ */
+ ds.tm_usec = 0;
+
+ if (apr_time_exp_gmt_get(&result, &ds) != APR_SUCCESS)
+ return APR_DATE_BAD;
+
+ return result;
+}
diff --git a/contrib/apr-util/misc/apr_queue.c b/contrib/apr-util/misc/apr_queue.c
new file mode 100644
index 000000000000..82859c845721
--- /dev/null
+++ b/contrib/apr-util/misc/apr_queue.c
@@ -0,0 +1,398 @@
+/* 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.h"
+
+#if APR_HAVE_STDIO_H
+#include <stdio.h>
+#endif
+#if APR_HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#if APR_HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include "apu.h"
+#include "apr_portable.h"
+#include "apr_thread_mutex.h"
+#include "apr_thread_cond.h"
+#include "apr_errno.h"
+#include "apr_queue.h"
+
+#if APR_HAS_THREADS
+/*
+ * define this to get debug messages
+ *
+#define QUEUE_DEBUG
+ */
+
+struct apr_queue_t {
+ void **data;
+ unsigned int nelts; /**< # elements */
+ unsigned int in; /**< next empty location */
+ unsigned int out; /**< next filled location */
+ unsigned int bounds;/**< max size of queue */
+ unsigned int full_waiters;
+ unsigned int empty_waiters;
+ apr_thread_mutex_t *one_big_mutex;
+ apr_thread_cond_t *not_empty;
+ apr_thread_cond_t *not_full;
+ int terminated;
+};
+
+#ifdef QUEUE_DEBUG
+static void Q_DBG(char*msg, apr_queue_t *q) {
+ fprintf(stderr, "%ld\t#%d in %d out %d\t%s\n",
+ apr_os_thread_current(),
+ q->nelts, q->in, q->out,
+ msg
+ );
+}
+#else
+#define Q_DBG(x,y)
+#endif
+
+/**
+ * Detects when the apr_queue_t is full. This utility function is expected
+ * to be called from within critical sections, and is not threadsafe.
+ */
+#define apr_queue_full(queue) ((queue)->nelts == (queue)->bounds)
+
+/**
+ * Detects when the apr_queue_t is empty. This utility function is expected
+ * to be called from within critical sections, and is not threadsafe.
+ */
+#define apr_queue_empty(queue) ((queue)->nelts == 0)
+
+/**
+ * Callback routine that is called to destroy this
+ * apr_queue_t when its pool is destroyed.
+ */
+static apr_status_t queue_destroy(void *data)
+{
+ apr_queue_t *queue = data;
+
+ /* Ignore errors here, we can't do anything about them anyway. */
+
+ apr_thread_cond_destroy(queue->not_empty);
+ apr_thread_cond_destroy(queue->not_full);
+ apr_thread_mutex_destroy(queue->one_big_mutex);
+
+ return APR_SUCCESS;
+}
+
+/**
+ * Initialize the apr_queue_t.
+ */
+APU_DECLARE(apr_status_t) apr_queue_create(apr_queue_t **q,
+ unsigned int queue_capacity,
+ apr_pool_t *a)
+{
+ apr_status_t rv;
+ apr_queue_t *queue;
+ queue = apr_palloc(a, sizeof(apr_queue_t));
+ *q = queue;
+
+ /* nested doesn't work ;( */
+ rv = apr_thread_mutex_create(&queue->one_big_mutex,
+ APR_THREAD_MUTEX_UNNESTED,
+ a);
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+
+ rv = apr_thread_cond_create(&queue->not_empty, a);
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+
+ rv = apr_thread_cond_create(&queue->not_full, a);
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+
+ /* Set all the data in the queue to NULL */
+ queue->data = apr_pcalloc(a, queue_capacity * sizeof(void*));
+ queue->bounds = queue_capacity;
+ queue->nelts = 0;
+ queue->in = 0;
+ queue->out = 0;
+ queue->terminated = 0;
+ queue->full_waiters = 0;
+ queue->empty_waiters = 0;
+
+ apr_pool_cleanup_register(a, queue, queue_destroy, apr_pool_cleanup_null);
+
+ return APR_SUCCESS;
+}
+
+/**
+ * Push new data onto the queue. Blocks if the queue is full. Once
+ * the push operation has completed, it signals other threads waiting
+ * in apr_queue_pop() that they may continue consuming sockets.
+ */
+APU_DECLARE(apr_status_t) apr_queue_push(apr_queue_t *queue, void *data)
+{
+ apr_status_t rv;
+
+ if (queue->terminated) {
+ return APR_EOF; /* no more elements ever again */
+ }
+
+ rv = apr_thread_mutex_lock(queue->one_big_mutex);
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+
+ if (apr_queue_full(queue)) {
+ if (!queue->terminated) {
+ queue->full_waiters++;
+ rv = apr_thread_cond_wait(queue->not_full, queue->one_big_mutex);
+ queue->full_waiters--;
+ if (rv != APR_SUCCESS) {
+ apr_thread_mutex_unlock(queue->one_big_mutex);
+ return rv;
+ }
+ }
+ /* If we wake up and it's still empty, then we were interrupted */
+ if (apr_queue_full(queue)) {
+ Q_DBG("queue full (intr)", queue);
+ rv = apr_thread_mutex_unlock(queue->one_big_mutex);
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+ if (queue->terminated) {
+ return APR_EOF; /* no more elements ever again */
+ }
+ else {
+ return APR_EINTR;
+ }
+ }
+ }
+
+ queue->data[queue->in] = data;
+ queue->in++;
+ if (queue->in >= queue->bounds)
+ queue->in -= queue->bounds;
+ queue->nelts++;
+
+ if (queue->empty_waiters) {
+ Q_DBG("sig !empty", queue);
+ rv = apr_thread_cond_signal(queue->not_empty);
+ if (rv != APR_SUCCESS) {
+ apr_thread_mutex_unlock(queue->one_big_mutex);
+ return rv;
+ }
+ }
+
+ rv = apr_thread_mutex_unlock(queue->one_big_mutex);
+ return rv;
+}
+
+/**
+ * Push new data onto the queue. If the queue is full, return APR_EAGAIN. If
+ * the push operation completes successfully, it signals other threads
+ * waiting in apr_queue_pop() that they may continue consuming sockets.
+ */
+APU_DECLARE(apr_status_t) apr_queue_trypush(apr_queue_t *queue, void *data)
+{
+ apr_status_t rv;
+
+ if (queue->terminated) {
+ return APR_EOF; /* no more elements ever again */
+ }
+
+ rv = apr_thread_mutex_lock(queue->one_big_mutex);
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+
+ if (apr_queue_full(queue)) {
+ rv = apr_thread_mutex_unlock(queue->one_big_mutex);
+ return APR_EAGAIN;
+ }
+
+ queue->data[queue->in] = data;
+ queue->in++;
+ if (queue->in >= queue->bounds)
+ queue->in -= queue->bounds;
+ queue->nelts++;
+
+ if (queue->empty_waiters) {
+ Q_DBG("sig !empty", queue);
+ rv = apr_thread_cond_signal(queue->not_empty);
+ if (rv != APR_SUCCESS) {
+ apr_thread_mutex_unlock(queue->one_big_mutex);
+ return rv;
+ }
+ }
+
+ rv = apr_thread_mutex_unlock(queue->one_big_mutex);
+ return rv;
+}
+
+/**
+ * not thread safe
+ */
+APU_DECLARE(unsigned int) apr_queue_size(apr_queue_t *queue) {
+ return queue->nelts;
+}
+
+/**
+ * Retrieves the next item from the queue. If there are no
+ * items available, it will block until one becomes available.
+ * Once retrieved, the item is placed into the address specified by
+ * 'data'.
+ */
+APU_DECLARE(apr_status_t) apr_queue_pop(apr_queue_t *queue, void **data)
+{
+ apr_status_t rv;
+
+ if (queue->terminated) {
+ return APR_EOF; /* no more elements ever again */
+ }
+
+ rv = apr_thread_mutex_lock(queue->one_big_mutex);
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+
+ /* Keep waiting until we wake up and find that the queue is not empty. */
+ if (apr_queue_empty(queue)) {
+ if (!queue->terminated) {
+ queue->empty_waiters++;
+ rv = apr_thread_cond_wait(queue->not_empty, queue->one_big_mutex);
+ queue->empty_waiters--;
+ if (rv != APR_SUCCESS) {
+ apr_thread_mutex_unlock(queue->one_big_mutex);
+ return rv;
+ }
+ }
+ /* If we wake up and it's still empty, then we were interrupted */
+ if (apr_queue_empty(queue)) {
+ Q_DBG("queue empty (intr)", queue);
+ rv = apr_thread_mutex_unlock(queue->one_big_mutex);
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+ if (queue->terminated) {
+ return APR_EOF; /* no more elements ever again */
+ }
+ else {
+ return APR_EINTR;
+ }
+ }
+ }
+
+ *data = queue->data[queue->out];
+ queue->nelts--;
+
+ queue->out++;
+ if (queue->out >= queue->bounds)
+ queue->out -= queue->bounds;
+ if (queue->full_waiters) {
+ Q_DBG("signal !full", queue);
+ rv = apr_thread_cond_signal(queue->not_full);
+ if (rv != APR_SUCCESS) {
+ apr_thread_mutex_unlock(queue->one_big_mutex);
+ return rv;
+ }
+ }
+
+ rv = apr_thread_mutex_unlock(queue->one_big_mutex);
+ return rv;
+}
+
+/**
+ * Retrieves the next item from the queue. If there are no
+ * items available, return APR_EAGAIN. Once retrieved,
+ * the item is placed into the address specified by 'data'.
+ */
+APU_DECLARE(apr_status_t) apr_queue_trypop(apr_queue_t *queue, void **data)
+{
+ apr_status_t rv;
+
+ if (queue->terminated) {
+ return APR_EOF; /* no more elements ever again */
+ }
+
+ rv = apr_thread_mutex_lock(queue->one_big_mutex);
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+
+ if (apr_queue_empty(queue)) {
+ rv = apr_thread_mutex_unlock(queue->one_big_mutex);
+ return APR_EAGAIN;
+ }
+
+ *data = queue->data[queue->out];
+ queue->nelts--;
+
+ queue->out++;
+ if (queue->out >= queue->bounds)
+ queue->out -= queue->bounds;
+ if (queue->full_waiters) {
+ Q_DBG("signal !full", queue);
+ rv = apr_thread_cond_signal(queue->not_full);
+ if (rv != APR_SUCCESS) {
+ apr_thread_mutex_unlock(queue->one_big_mutex);
+ return rv;
+ }
+ }
+
+ rv = apr_thread_mutex_unlock(queue->one_big_mutex);
+ return rv;
+}
+
+APU_DECLARE(apr_status_t) apr_queue_interrupt_all(apr_queue_t *queue)
+{
+ apr_status_t rv;
+ Q_DBG("intr all", queue);
+ if ((rv = apr_thread_mutex_lock(queue->one_big_mutex)) != APR_SUCCESS) {
+ return rv;
+ }
+ apr_thread_cond_broadcast(queue->not_empty);
+ apr_thread_cond_broadcast(queue->not_full);
+
+ if ((rv = apr_thread_mutex_unlock(queue->one_big_mutex)) != APR_SUCCESS) {
+ return rv;
+ }
+
+ return APR_SUCCESS;
+}
+
+APU_DECLARE(apr_status_t) apr_queue_term(apr_queue_t *queue)
+{
+ apr_status_t rv;
+
+ if ((rv = apr_thread_mutex_lock(queue->one_big_mutex)) != APR_SUCCESS) {
+ return rv;
+ }
+
+ /* we must hold one_big_mutex when setting this... otherwise,
+ * we could end up setting it and waking everybody up just after a
+ * would-be popper checks it but right before they block
+ */
+ queue->terminated = 1;
+ if ((rv = apr_thread_mutex_unlock(queue->one_big_mutex)) != APR_SUCCESS) {
+ return rv;
+ }
+ return apr_queue_interrupt_all(queue);
+}
+
+#endif /* APR_HAS_THREADS */
diff --git a/contrib/apr-util/misc/apr_reslist.c b/contrib/apr-util/misc/apr_reslist.c
new file mode 100644
index 000000000000..0c43e07473cc
--- /dev/null
+++ b/contrib/apr-util/misc/apr_reslist.c
@@ -0,0 +1,473 @@
+/* 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 <assert.h>
+
+#include "apu.h"
+#include "apr_reslist.h"
+#include "apr_errno.h"
+#include "apr_strings.h"
+#include "apr_thread_mutex.h"
+#include "apr_thread_cond.h"
+#include "apr_ring.h"
+
+/**
+ * A single resource element.
+ */
+struct apr_res_t {
+ apr_time_t freed;
+ void *opaque;
+ APR_RING_ENTRY(apr_res_t) link;
+};
+typedef struct apr_res_t apr_res_t;
+
+/**
+ * A ring of resources representing the list of available resources.
+ */
+APR_RING_HEAD(apr_resring_t, apr_res_t);
+typedef struct apr_resring_t apr_resring_t;
+
+struct apr_reslist_t {
+ apr_pool_t *pool; /* the pool used in constructor and destructor calls */
+ int ntotal; /* total number of resources managed by this list */
+ int nidle; /* number of available resources */
+ int min; /* desired minimum number of available resources */
+ int smax; /* soft maximum on the total number of resources */
+ int hmax; /* hard maximum on the total number of resources */
+ apr_interval_time_t ttl; /* TTL when we have too many resources */
+ apr_interval_time_t timeout; /* Timeout for waiting on resource */
+ apr_reslist_constructor constructor;
+ apr_reslist_destructor destructor;
+ void *params; /* opaque data passed to constructor and destructor calls */
+ apr_resring_t avail_list;
+ apr_resring_t free_list;
+#if APR_HAS_THREADS
+ apr_thread_mutex_t *listlock;
+ apr_thread_cond_t *avail;
+#endif
+};
+
+/**
+ * Grab a resource from the front of the resource list.
+ * Assumes: that the reslist is locked.
+ */
+static apr_res_t *pop_resource(apr_reslist_t *reslist)
+{
+ apr_res_t *res;
+ res = APR_RING_FIRST(&reslist->avail_list);
+ APR_RING_REMOVE(res, link);
+ reslist->nidle--;
+ return res;
+}
+
+/**
+ * Add a resource to the beginning of the list, set the time at which
+ * it was added to the list.
+ * Assumes: that the reslist is locked.
+ */
+static void push_resource(apr_reslist_t *reslist, apr_res_t *resource)
+{
+ APR_RING_INSERT_HEAD(&reslist->avail_list, resource, apr_res_t, link);
+ resource->freed = apr_time_now();
+ reslist->nidle++;
+}
+
+/**
+ * Get an resource container from the free list or create a new one.
+ */
+static apr_res_t *get_container(apr_reslist_t *reslist)
+{
+ apr_res_t *res;
+
+ if (!APR_RING_EMPTY(&reslist->free_list, apr_res_t, link)) {
+ res = APR_RING_FIRST(&reslist->free_list);
+ APR_RING_REMOVE(res, link);
+ }
+ else
+ res = apr_pcalloc(reslist->pool, sizeof(*res));
+ return res;
+}
+
+/**
+ * Free up a resource container by placing it on the free list.
+ */
+static void free_container(apr_reslist_t *reslist, apr_res_t *container)
+{
+ APR_RING_INSERT_TAIL(&reslist->free_list, container, apr_res_t, link);
+}
+
+/**
+ * Create a new resource and return it.
+ * Assumes: that the reslist is locked.
+ */
+static apr_status_t create_resource(apr_reslist_t *reslist, apr_res_t **ret_res)
+{
+ apr_status_t rv;
+ apr_res_t *res;
+
+ res = get_container(reslist);
+
+ rv = reslist->constructor(&res->opaque, reslist->params, reslist->pool);
+
+ *ret_res = res;
+ return rv;
+}
+
+/**
+ * Destroy a single idle resource.
+ * Assumes: that the reslist is locked.
+ */
+static apr_status_t destroy_resource(apr_reslist_t *reslist, apr_res_t *res)
+{
+ return reslist->destructor(res->opaque, reslist->params, reslist->pool);
+}
+
+static apr_status_t reslist_cleanup(void *data_)
+{
+ apr_status_t rv = APR_SUCCESS;
+ apr_reslist_t *rl = data_;
+ apr_res_t *res;
+
+#if APR_HAS_THREADS
+ apr_thread_mutex_lock(rl->listlock);
+#endif
+
+ while (rl->nidle > 0) {
+ apr_status_t rv1;
+ res = pop_resource(rl);
+ rl->ntotal--;
+ rv1 = destroy_resource(rl, res);
+ if (rv1 != APR_SUCCESS) {
+ rv = rv1; /* loses info in the unlikely event of
+ * multiple *different* failures */
+ }
+ free_container(rl, res);
+ }
+
+ assert(rl->nidle == 0);
+ assert(rl->ntotal == 0);
+
+#if APR_HAS_THREADS
+ apr_thread_mutex_unlock(rl->listlock);
+ apr_thread_mutex_destroy(rl->listlock);
+ apr_thread_cond_destroy(rl->avail);
+#endif
+
+ return rv;
+}
+
+/**
+ * Perform routine maintenance on the resource list. This call
+ * may instantiate new resources or expire old resources.
+ */
+APU_DECLARE(apr_status_t) apr_reslist_maintain(apr_reslist_t *reslist)
+{
+ apr_time_t now;
+ apr_status_t rv;
+ apr_res_t *res;
+ int created_one = 0;
+
+#if APR_HAS_THREADS
+ apr_thread_mutex_lock(reslist->listlock);
+#endif
+
+ /* Check if we need to create more resources, and if we are allowed to. */
+ while (reslist->nidle < reslist->min && reslist->ntotal < reslist->hmax) {
+ /* Create the resource */
+ rv = create_resource(reslist, &res);
+ if (rv != APR_SUCCESS) {
+ free_container(reslist, res);
+#if APR_HAS_THREADS
+ apr_thread_mutex_unlock(reslist->listlock);
+#endif
+ return rv;
+ }
+ /* Add it to the list */
+ push_resource(reslist, res);
+ /* Update our counters */
+ reslist->ntotal++;
+ /* If someone is waiting on that guy, wake them up. */
+#if APR_HAS_THREADS
+ rv = apr_thread_cond_signal(reslist->avail);
+ if (rv != APR_SUCCESS) {
+ apr_thread_mutex_unlock(reslist->listlock);
+ return rv;
+ }
+#endif
+ created_one++;
+ }
+
+ /* We don't need to see if we're over the max if we were under it before */
+ if (created_one) {
+#if APR_HAS_THREADS
+ apr_thread_mutex_unlock(reslist->listlock);
+#endif
+ return APR_SUCCESS;
+ }
+
+ /* Check if we need to expire old resources */
+ now = apr_time_now();
+ while (reslist->nidle > reslist->smax && reslist->nidle > 0) {
+ /* Peak at the last resource in the list */
+ res = APR_RING_LAST(&reslist->avail_list);
+ /* See if the oldest entry should be expired */
+ if (now - res->freed < reslist->ttl) {
+ /* If this entry is too young, none of the others
+ * will be ready to be expired either, so we are done. */
+ break;
+ }
+ APR_RING_REMOVE(res, link);
+ reslist->nidle--;
+ reslist->ntotal--;
+ rv = destroy_resource(reslist, res);
+ free_container(reslist, res);
+ if (rv != APR_SUCCESS) {
+#if APR_HAS_THREADS
+ apr_thread_mutex_unlock(reslist->listlock);
+#endif
+ return rv;
+ }
+ }
+
+#if APR_HAS_THREADS
+ apr_thread_mutex_unlock(reslist->listlock);
+#endif
+ return APR_SUCCESS;
+}
+
+APU_DECLARE(apr_status_t) apr_reslist_create(apr_reslist_t **reslist,
+ int min, int smax, int hmax,
+ apr_interval_time_t ttl,
+ apr_reslist_constructor con,
+ apr_reslist_destructor de,
+ void *params,
+ apr_pool_t *pool)
+{
+ apr_status_t rv;
+ apr_reslist_t *rl;
+
+ /* Do some sanity checks so we don't thrash around in the
+ * maintenance routine later. */
+ if (min < 0 || min > smax || min > hmax || smax > hmax || hmax == 0 ||
+ ttl < 0) {
+ return APR_EINVAL;
+ }
+
+#if !APR_HAS_THREADS
+ /* There can be only one resource when we have no threads. */
+ if (min > 0) {
+ min = 1;
+ }
+ if (smax > 0) {
+ smax = 1;
+ }
+ hmax = 1;
+#endif
+
+ rl = apr_pcalloc(pool, sizeof(*rl));
+ rl->pool = pool;
+ rl->min = min;
+ rl->smax = smax;
+ rl->hmax = hmax;
+ rl->ttl = ttl;
+ rl->constructor = con;
+ rl->destructor = de;
+ rl->params = params;
+
+ APR_RING_INIT(&rl->avail_list, apr_res_t, link);
+ APR_RING_INIT(&rl->free_list, apr_res_t, link);
+
+#if APR_HAS_THREADS
+ rv = apr_thread_mutex_create(&rl->listlock, APR_THREAD_MUTEX_DEFAULT,
+ pool);
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+ rv = apr_thread_cond_create(&rl->avail, pool);
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+#endif
+
+ rv = apr_reslist_maintain(rl);
+ if (rv != APR_SUCCESS) {
+ /* Destroy what we've created so far.
+ */
+ reslist_cleanup(rl);
+ return rv;
+ }
+
+ apr_pool_cleanup_register(rl->pool, rl, reslist_cleanup,
+ apr_pool_cleanup_null);
+
+ *reslist = rl;
+
+ return APR_SUCCESS;
+}
+
+APU_DECLARE(apr_status_t) apr_reslist_destroy(apr_reslist_t *reslist)
+{
+ return apr_pool_cleanup_run(reslist->pool, reslist, reslist_cleanup);
+}
+
+APU_DECLARE(apr_status_t) apr_reslist_acquire(apr_reslist_t *reslist,
+ void **resource)
+{
+ apr_status_t rv;
+ apr_res_t *res;
+ apr_time_t now;
+
+#if APR_HAS_THREADS
+ apr_thread_mutex_lock(reslist->listlock);
+#endif
+ /* If there are idle resources on the available list, use
+ * them right away. */
+ now = apr_time_now();
+ while (reslist->nidle > 0) {
+ /* Pop off the first resource */
+ res = pop_resource(reslist);
+ if (reslist->ttl && (now - res->freed >= reslist->ttl)) {
+ /* this res is expired - kill it */
+ reslist->ntotal--;
+ rv = destroy_resource(reslist, res);
+ free_container(reslist, res);
+ if (rv != APR_SUCCESS) {
+#if APR_HAS_THREADS
+ apr_thread_mutex_unlock(reslist->listlock);
+#endif
+ return rv; /* FIXME: this might cause unnecessary fails */
+ }
+ continue;
+ }
+ *resource = res->opaque;
+ free_container(reslist, res);
+#if APR_HAS_THREADS
+ apr_thread_mutex_unlock(reslist->listlock);
+#endif
+ return APR_SUCCESS;
+ }
+ /* If we've hit our max, block until we're allowed to create
+ * a new one, or something becomes free. */
+ while (reslist->ntotal >= reslist->hmax && reslist->nidle <= 0) {
+#if APR_HAS_THREADS
+ if (reslist->timeout) {
+ if ((rv = apr_thread_cond_timedwait(reslist->avail,
+ reslist->listlock, reslist->timeout)) != APR_SUCCESS) {
+ apr_thread_mutex_unlock(reslist->listlock);
+ return rv;
+ }
+ }
+ else {
+ apr_thread_cond_wait(reslist->avail, reslist->listlock);
+ }
+#else
+ return APR_EAGAIN;
+#endif
+ }
+ /* If we popped out of the loop, first try to see if there
+ * are new resources available for immediate use. */
+ if (reslist->nidle > 0) {
+ res = pop_resource(reslist);
+ *resource = res->opaque;
+ free_container(reslist, res);
+#if APR_HAS_THREADS
+ apr_thread_mutex_unlock(reslist->listlock);
+#endif
+ return APR_SUCCESS;
+ }
+ /* Otherwise the reason we dropped out of the loop
+ * was because there is a new slot available, so create
+ * a resource to fill the slot and use it. */
+ else {
+ rv = create_resource(reslist, &res);
+ if (rv == APR_SUCCESS) {
+ reslist->ntotal++;
+ *resource = res->opaque;
+ }
+ free_container(reslist, res);
+#if APR_HAS_THREADS
+ apr_thread_mutex_unlock(reslist->listlock);
+#endif
+ return rv;
+ }
+}
+
+APU_DECLARE(apr_status_t) apr_reslist_release(apr_reslist_t *reslist,
+ void *resource)
+{
+ apr_res_t *res;
+
+#if APR_HAS_THREADS
+ apr_thread_mutex_lock(reslist->listlock);
+#endif
+ res = get_container(reslist);
+ res->opaque = resource;
+ push_resource(reslist, res);
+#if APR_HAS_THREADS
+ apr_thread_cond_signal(reslist->avail);
+ apr_thread_mutex_unlock(reslist->listlock);
+#endif
+
+ return apr_reslist_maintain(reslist);
+}
+
+APU_DECLARE(void) apr_reslist_timeout_set(apr_reslist_t *reslist,
+ apr_interval_time_t timeout)
+{
+ reslist->timeout = timeout;
+}
+
+APU_DECLARE(apr_uint32_t) apr_reslist_acquired_count(apr_reslist_t *reslist)
+{
+ apr_uint32_t count;
+
+#if APR_HAS_THREADS
+ apr_thread_mutex_lock(reslist->listlock);
+#endif
+ count = reslist->ntotal - reslist->nidle;
+#if APR_HAS_THREADS
+ apr_thread_mutex_unlock(reslist->listlock);
+#endif
+
+ return count;
+}
+
+APU_DECLARE(apr_status_t) apr_reslist_invalidate(apr_reslist_t *reslist,
+ void *resource)
+{
+ apr_status_t ret;
+#if APR_HAS_THREADS
+ apr_thread_mutex_lock(reslist->listlock);
+#endif
+ ret = reslist->destructor(resource, reslist->params, reslist->pool);
+ reslist->ntotal--;
+#if APR_HAS_THREADS
+ apr_thread_cond_signal(reslist->avail);
+ apr_thread_mutex_unlock(reslist->listlock);
+#endif
+ return ret;
+}
+
+APU_DECLARE(void) apr_reslist_cleanup_order_set(apr_reslist_t *rl,
+ apr_uint32_t mode)
+{
+ apr_pool_cleanup_kill(rl->pool, rl, reslist_cleanup);
+ if (mode == APR_RESLIST_CLEANUP_FIRST)
+ apr_pool_pre_cleanup_register(rl->pool, rl, reslist_cleanup);
+ else
+ apr_pool_cleanup_register(rl->pool, rl, reslist_cleanup,
+ apr_pool_cleanup_null);
+}
diff --git a/contrib/apr-util/misc/apr_rmm.c b/contrib/apr-util/misc/apr_rmm.c
new file mode 100644
index 000000000000..1fd420b64160
--- /dev/null
+++ b/contrib/apr-util/misc/apr_rmm.c
@@ -0,0 +1,457 @@
+/* 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_general.h"
+#include "apr_rmm.h"
+#include "apr_errno.h"
+#include "apr_lib.h"
+#include "apr_strings.h"
+
+/* The RMM region is made up of two doubly-linked-list of blocks; the
+ * list of used blocks, and the list of free blocks (either list may
+ * be empty). The base pointer, rmm->base, points at the beginning of
+ * the shmem region in use. Each block is addressable by an
+ * apr_rmm_off_t value, which represents the offset from the base
+ * pointer. The term "address" is used here to mean such a value; an
+ * "offset from rmm->base".
+ *
+ * The RMM region contains exactly one "rmm_hdr_block_t" structure,
+ * the "header block", which is always stored at the base pointer.
+ * The firstused field in this structure is the address of the first
+ * block in the "used blocks" list; the firstfree field is the address
+ * of the first block in the "free blocks" list.
+ *
+ * Each block is prefixed by an "rmm_block_t" structure, followed by
+ * the caller-usable region represented by the block. The next and
+ * prev fields of the structure are zero if the block is at the end or
+ * beginning of the linked-list respectively, or otherwise hold the
+ * address of the next and previous blocks in the list. ("address 0",
+ * i.e. rmm->base is *not* a valid address for a block, since the
+ * header block is always stored at that address).
+ *
+ * At creation, the RMM region is initialized to hold a single block
+ * on the free list representing the entire available shm segment
+ * (minus header block); subsequent allocation and deallocation of
+ * blocks involves splitting blocks and coalescing adjacent blocks,
+ * and switching them between the free and used lists as
+ * appropriate. */
+
+typedef struct rmm_block_t {
+ apr_size_t size;
+ apr_rmm_off_t prev;
+ apr_rmm_off_t next;
+} rmm_block_t;
+
+/* Always at our apr_rmm_off(0):
+ */
+typedef struct rmm_hdr_block_t {
+ apr_size_t abssize;
+ apr_rmm_off_t /* rmm_block_t */ firstused;
+ apr_rmm_off_t /* rmm_block_t */ firstfree;
+} rmm_hdr_block_t;
+
+#define RMM_HDR_BLOCK_SIZE (APR_ALIGN_DEFAULT(sizeof(rmm_hdr_block_t)))
+#define RMM_BLOCK_SIZE (APR_ALIGN_DEFAULT(sizeof(rmm_block_t)))
+
+struct apr_rmm_t {
+ apr_pool_t *p;
+ rmm_hdr_block_t *base;
+ apr_size_t size;
+ apr_anylock_t lock;
+};
+
+static apr_rmm_off_t find_block_by_offset(apr_rmm_t *rmm, apr_rmm_off_t next,
+ apr_rmm_off_t find, int includes)
+{
+ apr_rmm_off_t prev = 0;
+
+ while (next) {
+ struct rmm_block_t *blk = (rmm_block_t*)((char*)rmm->base + next);
+
+ if (find == next)
+ return next;
+
+ /* Overshot? */
+ if (find < next)
+ return includes ? prev : 0;
+
+ prev = next;
+ next = blk->next;
+ }
+ return includes ? prev : 0;
+}
+
+static apr_rmm_off_t find_block_of_size(apr_rmm_t *rmm, apr_size_t size)
+{
+ apr_rmm_off_t next = rmm->base->firstfree;
+ apr_rmm_off_t best = 0;
+ apr_rmm_off_t bestsize = 0;
+
+ while (next) {
+ struct rmm_block_t *blk = (rmm_block_t*)((char*)rmm->base + next);
+
+ if (blk->size == size)
+ return next;
+
+ if (blk->size >= size) {
+ /* XXX: sub optimal algorithm
+ * We need the most thorough best-fit logic, since we can
+ * never grow our rmm, we are SOL when we hit the wall.
+ */
+ if (!bestsize || (blk->size < bestsize)) {
+ bestsize = blk->size;
+ best = next;
+ }
+ }
+
+ next = blk->next;
+ }
+
+ if (bestsize > RMM_BLOCK_SIZE + size) {
+ struct rmm_block_t *blk = (rmm_block_t*)((char*)rmm->base + best);
+ struct rmm_block_t *new = (rmm_block_t*)((char*)rmm->base + best + size);
+
+ new->size = blk->size - size;
+ new->next = blk->next;
+ new->prev = best;
+
+ blk->size = size;
+ blk->next = best + size;
+
+ if (new->next) {
+ blk = (rmm_block_t*)((char*)rmm->base + new->next);
+ blk->prev = best + size;
+ }
+ }
+
+ return best;
+}
+
+static void move_block(apr_rmm_t *rmm, apr_rmm_off_t this, int free)
+{
+ struct rmm_block_t *blk = (rmm_block_t*)((char*)rmm->base + this);
+
+ /* close the gap */
+ if (blk->prev) {
+ struct rmm_block_t *prev = (rmm_block_t*)((char*)rmm->base + blk->prev);
+ prev->next = blk->next;
+ }
+ else {
+ if (free) {
+ rmm->base->firstused = blk->next;
+ }
+ else {
+ rmm->base->firstfree = blk->next;
+ }
+ }
+ if (blk->next) {
+ struct rmm_block_t *next = (rmm_block_t*)((char*)rmm->base + blk->next);
+ next->prev = blk->prev;
+ }
+
+ /* now find it in the other list, pushing it to the head if required */
+ if (free) {
+ blk->prev = find_block_by_offset(rmm, rmm->base->firstfree, this, 1);
+ if (!blk->prev) {
+ blk->next = rmm->base->firstfree;
+ rmm->base->firstfree = this;
+ }
+ }
+ else {
+ blk->prev = find_block_by_offset(rmm, rmm->base->firstused, this, 1);
+ if (!blk->prev) {
+ blk->next = rmm->base->firstused;
+ rmm->base->firstused = this;
+ }
+ }
+
+ /* and open it up */
+ if (blk->prev) {
+ struct rmm_block_t *prev = (rmm_block_t*)((char*)rmm->base + blk->prev);
+ if (free && (blk->prev + prev->size == this)) {
+ /* Collapse us into our predecessor */
+ prev->size += blk->size;
+ this = blk->prev;
+ blk = prev;
+ }
+ else {
+ blk->next = prev->next;
+ prev->next = this;
+ }
+ }
+
+ if (blk->next) {
+ struct rmm_block_t *next = (rmm_block_t*)((char*)rmm->base + blk->next);
+ if (free && (this + blk->size == blk->next)) {
+ /* Collapse us into our successor */
+ blk->size += next->size;
+ blk->next = next->next;
+ if (blk->next) {
+ next = (rmm_block_t*)((char*)rmm->base + blk->next);
+ next->prev = this;
+ }
+ }
+ else {
+ next->prev = this;
+ }
+ }
+}
+
+APU_DECLARE(apr_status_t) apr_rmm_init(apr_rmm_t **rmm, apr_anylock_t *lock,
+ void *base, apr_size_t size,
+ apr_pool_t *p)
+{
+ apr_status_t rv;
+ rmm_block_t *blk;
+ apr_anylock_t nulllock;
+
+ if (!lock) {
+ nulllock.type = apr_anylock_none;
+ nulllock.lock.pm = NULL;
+ lock = &nulllock;
+ }
+ if ((rv = APR_ANYLOCK_LOCK(lock)) != APR_SUCCESS)
+ return rv;
+
+ (*rmm) = (apr_rmm_t *)apr_pcalloc(p, sizeof(apr_rmm_t));
+ (*rmm)->p = p;
+ (*rmm)->base = base;
+ (*rmm)->size = size;
+ (*rmm)->lock = *lock;
+
+ (*rmm)->base->abssize = size;
+ (*rmm)->base->firstused = 0;
+ (*rmm)->base->firstfree = RMM_HDR_BLOCK_SIZE;
+
+ blk = (rmm_block_t *)((char*)base + (*rmm)->base->firstfree);
+
+ blk->size = size - (*rmm)->base->firstfree;
+ blk->prev = 0;
+ blk->next = 0;
+
+ return APR_ANYLOCK_UNLOCK(lock);
+}
+
+APU_DECLARE(apr_status_t) apr_rmm_destroy(apr_rmm_t *rmm)
+{
+ apr_status_t rv;
+ rmm_block_t *blk;
+
+ if ((rv = APR_ANYLOCK_LOCK(&rmm->lock)) != APR_SUCCESS) {
+ return rv;
+ }
+ /* Blast it all --- no going back :) */
+ if (rmm->base->firstused) {
+ apr_rmm_off_t this = rmm->base->firstused;
+ do {
+ blk = (rmm_block_t *)((char*)rmm->base + this);
+ this = blk->next;
+ blk->next = blk->prev = 0;
+ } while (this);
+ rmm->base->firstused = 0;
+ }
+ if (rmm->base->firstfree) {
+ apr_rmm_off_t this = rmm->base->firstfree;
+ do {
+ blk = (rmm_block_t *)((char*)rmm->base + this);
+ this = blk->next;
+ blk->next = blk->prev = 0;
+ } while (this);
+ rmm->base->firstfree = 0;
+ }
+ rmm->base->abssize = 0;
+ rmm->size = 0;
+
+ return APR_ANYLOCK_UNLOCK(&rmm->lock);
+}
+
+APU_DECLARE(apr_status_t) apr_rmm_attach(apr_rmm_t **rmm, apr_anylock_t *lock,
+ void *base, apr_pool_t *p)
+{
+ apr_anylock_t nulllock;
+
+ if (!lock) {
+ nulllock.type = apr_anylock_none;
+ nulllock.lock.pm = NULL;
+ lock = &nulllock;
+ }
+
+ /* sanity would be good here */
+ (*rmm) = (apr_rmm_t *)apr_pcalloc(p, sizeof(apr_rmm_t));
+ (*rmm)->p = p;
+ (*rmm)->base = base;
+ (*rmm)->size = (*rmm)->base->abssize;
+ (*rmm)->lock = *lock;
+ return APR_SUCCESS;
+}
+
+APU_DECLARE(apr_status_t) apr_rmm_detach(apr_rmm_t *rmm)
+{
+ /* A noop until we introduce locked/refcounts */
+ return APR_SUCCESS;
+}
+
+APU_DECLARE(apr_rmm_off_t) apr_rmm_malloc(apr_rmm_t *rmm, apr_size_t reqsize)
+{
+ apr_size_t size;
+ apr_rmm_off_t this;
+
+ size = APR_ALIGN_DEFAULT(reqsize) + RMM_BLOCK_SIZE;
+ if (size < reqsize) {
+ return 0;
+ }
+
+ APR_ANYLOCK_LOCK(&rmm->lock);
+
+ this = find_block_of_size(rmm, size);
+
+ if (this) {
+ move_block(rmm, this, 0);
+ this += RMM_BLOCK_SIZE;
+ }
+
+ APR_ANYLOCK_UNLOCK(&rmm->lock);
+ return this;
+}
+
+APU_DECLARE(apr_rmm_off_t) apr_rmm_calloc(apr_rmm_t *rmm, apr_size_t reqsize)
+{
+ apr_size_t size;
+ apr_rmm_off_t this;
+
+ size = APR_ALIGN_DEFAULT(reqsize) + RMM_BLOCK_SIZE;
+ if (size < reqsize) {
+ return 0;
+ }
+
+ APR_ANYLOCK_LOCK(&rmm->lock);
+
+ this = find_block_of_size(rmm, size);
+
+ if (this) {
+ move_block(rmm, this, 0);
+ this += RMM_BLOCK_SIZE;
+ memset((char*)rmm->base + this, 0, size - RMM_BLOCK_SIZE);
+ }
+
+ APR_ANYLOCK_UNLOCK(&rmm->lock);
+ return this;
+}
+
+APU_DECLARE(apr_rmm_off_t) apr_rmm_realloc(apr_rmm_t *rmm, void *entity,
+ apr_size_t reqsize)
+{
+ apr_rmm_off_t this;
+ apr_rmm_off_t old;
+ struct rmm_block_t *blk;
+ apr_size_t size, oldsize;
+
+ if (!entity) {
+ return apr_rmm_malloc(rmm, reqsize);
+ }
+
+ size = APR_ALIGN_DEFAULT(reqsize);
+ if (size < reqsize) {
+ return 0;
+ }
+ old = apr_rmm_offset_get(rmm, entity);
+
+ if ((this = apr_rmm_malloc(rmm, size)) == 0) {
+ return 0;
+ }
+
+ blk = (rmm_block_t*)((char*)rmm->base + old - RMM_BLOCK_SIZE);
+ oldsize = blk->size;
+
+ memcpy(apr_rmm_addr_get(rmm, this),
+ apr_rmm_addr_get(rmm, old), oldsize < size ? oldsize : size);
+ apr_rmm_free(rmm, old);
+
+ return this;
+}
+
+APU_DECLARE(apr_status_t) apr_rmm_free(apr_rmm_t *rmm, apr_rmm_off_t this)
+{
+ apr_status_t rv;
+ struct rmm_block_t *blk;
+
+ /* A little sanity check is always healthy, especially here.
+ * If we really cared, we could make this compile-time
+ */
+ if (this < RMM_HDR_BLOCK_SIZE + RMM_BLOCK_SIZE) {
+ return APR_EINVAL;
+ }
+
+ this -= RMM_BLOCK_SIZE;
+
+ blk = (rmm_block_t*)((char*)rmm->base + this);
+
+ if ((rv = APR_ANYLOCK_LOCK(&rmm->lock)) != APR_SUCCESS) {
+ return rv;
+ }
+ if (blk->prev) {
+ struct rmm_block_t *prev = (rmm_block_t*)((char*)rmm->base + blk->prev);
+ if (prev->next != this) {
+ APR_ANYLOCK_UNLOCK(&rmm->lock);
+ return APR_EINVAL;
+ }
+ }
+ else {
+ if (rmm->base->firstused != this) {
+ APR_ANYLOCK_UNLOCK(&rmm->lock);
+ return APR_EINVAL;
+ }
+ }
+
+ if (blk->next) {
+ struct rmm_block_t *next = (rmm_block_t*)((char*)rmm->base + blk->next);
+ if (next->prev != this) {
+ APR_ANYLOCK_UNLOCK(&rmm->lock);
+ return APR_EINVAL;
+ }
+ }
+
+ /* Ok, it remained [apparently] sane, so unlink it
+ */
+ move_block(rmm, this, 1);
+
+ return APR_ANYLOCK_UNLOCK(&rmm->lock);
+}
+
+APU_DECLARE(void *) apr_rmm_addr_get(apr_rmm_t *rmm, apr_rmm_off_t entity)
+{
+ /* debug-sanity checking here would be good
+ */
+ return (void*)((char*)rmm->base + entity);
+}
+
+APU_DECLARE(apr_rmm_off_t) apr_rmm_offset_get(apr_rmm_t *rmm, void* entity)
+{
+ /* debug, or always, sanity checking here would be good
+ * since the primitive is apr_rmm_off_t, I don't mind penalizing
+ * inverse conversions for safety, unless someone can prove that
+ * there is no choice in some cases.
+ */
+ return ((char*)entity - (char*)rmm->base);
+}
+
+APU_DECLARE(apr_size_t) apr_rmm_overhead_get(int n)
+{
+ /* overhead per block is at most APR_ALIGN_DEFAULT(1) wasted bytes
+ * for alignment overhead, plus the size of the rmm_block_t
+ * structure. */
+ return RMM_HDR_BLOCK_SIZE + n * (RMM_BLOCK_SIZE + APR_ALIGN_DEFAULT(1));
+}
diff --git a/contrib/apr-util/misc/apr_thread_pool.c b/contrib/apr-util/misc/apr_thread_pool.c
new file mode 100644
index 000000000000..a12f31ab091e
--- /dev/null
+++ b/contrib/apr-util/misc/apr_thread_pool.c
@@ -0,0 +1,956 @@
+/*
+ * 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 <assert.h>
+#include "apr_thread_pool.h"
+#include "apr_ring.h"
+#include "apr_thread_cond.h"
+#include "apr_portable.h"
+
+#if APR_HAS_THREADS
+
+#define TASK_PRIORITY_SEGS 4
+#define TASK_PRIORITY_SEG(x) (((x)->dispatch.priority & 0xFF) / 64)
+
+typedef struct apr_thread_pool_task
+{
+ APR_RING_ENTRY(apr_thread_pool_task) link;
+ apr_thread_start_t func;
+ void *param;
+ void *owner;
+ union
+ {
+ apr_byte_t priority;
+ apr_time_t time;
+ } dispatch;
+} apr_thread_pool_task_t;
+
+APR_RING_HEAD(apr_thread_pool_tasks, apr_thread_pool_task);
+
+struct apr_thread_list_elt
+{
+ APR_RING_ENTRY(apr_thread_list_elt) link;
+ apr_thread_t *thd;
+ volatile void *current_owner;
+ volatile enum { TH_RUN, TH_STOP, TH_PROBATION } state;
+};
+
+APR_RING_HEAD(apr_thread_list, apr_thread_list_elt);
+
+struct apr_thread_pool
+{
+ apr_pool_t *pool;
+ volatile apr_size_t thd_max;
+ volatile apr_size_t idle_max;
+ volatile apr_interval_time_t idle_wait;
+ volatile apr_size_t thd_cnt;
+ volatile apr_size_t idle_cnt;
+ volatile apr_size_t task_cnt;
+ volatile apr_size_t scheduled_task_cnt;
+ volatile apr_size_t threshold;
+ volatile apr_size_t tasks_run;
+ volatile apr_size_t tasks_high;
+ volatile apr_size_t thd_high;
+ volatile apr_size_t thd_timed_out;
+ struct apr_thread_pool_tasks *tasks;
+ struct apr_thread_pool_tasks *scheduled_tasks;
+ struct apr_thread_list *busy_thds;
+ struct apr_thread_list *idle_thds;
+ apr_thread_mutex_t *lock;
+ apr_thread_cond_t *cond;
+ volatile int terminated;
+ struct apr_thread_pool_tasks *recycled_tasks;
+ struct apr_thread_list *recycled_thds;
+ apr_thread_pool_task_t *task_idx[TASK_PRIORITY_SEGS];
+};
+
+static apr_status_t thread_pool_construct(apr_thread_pool_t * me,
+ apr_size_t init_threads,
+ apr_size_t max_threads)
+{
+ apr_status_t rv;
+ int i;
+
+ me->thd_max = max_threads;
+ me->idle_max = init_threads;
+ me->threshold = init_threads / 2;
+ rv = apr_thread_mutex_create(&me->lock, APR_THREAD_MUTEX_NESTED,
+ me->pool);
+ if (APR_SUCCESS != rv) {
+ return rv;
+ }
+ rv = apr_thread_cond_create(&me->cond, me->pool);
+ if (APR_SUCCESS != rv) {
+ apr_thread_mutex_destroy(me->lock);
+ return rv;
+ }
+ me->tasks = apr_palloc(me->pool, sizeof(*me->tasks));
+ if (!me->tasks) {
+ goto CATCH_ENOMEM;
+ }
+ APR_RING_INIT(me->tasks, apr_thread_pool_task, link);
+ me->scheduled_tasks = apr_palloc(me->pool, sizeof(*me->scheduled_tasks));
+ if (!me->scheduled_tasks) {
+ goto CATCH_ENOMEM;
+ }
+ APR_RING_INIT(me->scheduled_tasks, apr_thread_pool_task, link);
+ me->recycled_tasks = apr_palloc(me->pool, sizeof(*me->recycled_tasks));
+ if (!me->recycled_tasks) {
+ goto CATCH_ENOMEM;
+ }
+ APR_RING_INIT(me->recycled_tasks, apr_thread_pool_task, link);
+ me->busy_thds = apr_palloc(me->pool, sizeof(*me->busy_thds));
+ if (!me->busy_thds) {
+ goto CATCH_ENOMEM;
+ }
+ APR_RING_INIT(me->busy_thds, apr_thread_list_elt, link);
+ me->idle_thds = apr_palloc(me->pool, sizeof(*me->idle_thds));
+ if (!me->idle_thds) {
+ goto CATCH_ENOMEM;
+ }
+ APR_RING_INIT(me->idle_thds, apr_thread_list_elt, link);
+ me->recycled_thds = apr_palloc(me->pool, sizeof(*me->recycled_thds));
+ if (!me->recycled_thds) {
+ goto CATCH_ENOMEM;
+ }
+ APR_RING_INIT(me->recycled_thds, apr_thread_list_elt, link);
+ me->thd_cnt = me->idle_cnt = me->task_cnt = me->scheduled_task_cnt = 0;
+ me->tasks_run = me->tasks_high = me->thd_high = me->thd_timed_out = 0;
+ me->idle_wait = 0;
+ me->terminated = 0;
+ for (i = 0; i < TASK_PRIORITY_SEGS; i++) {
+ me->task_idx[i] = NULL;
+ }
+ goto FINAL_EXIT;
+ CATCH_ENOMEM:
+ rv = APR_ENOMEM;
+ apr_thread_mutex_destroy(me->lock);
+ apr_thread_cond_destroy(me->cond);
+ FINAL_EXIT:
+ return rv;
+}
+
+/*
+ * NOTE: This function is not thread safe by itself. Caller should hold the lock
+ */
+static apr_thread_pool_task_t *pop_task(apr_thread_pool_t * me)
+{
+ apr_thread_pool_task_t *task = NULL;
+ int seg;
+
+ /* check for scheduled tasks */
+ if (me->scheduled_task_cnt > 0) {
+ task = APR_RING_FIRST(me->scheduled_tasks);
+ assert(task != NULL);
+ assert(task !=
+ APR_RING_SENTINEL(me->scheduled_tasks, apr_thread_pool_task,
+ link));
+ /* if it's time */
+ if (task->dispatch.time <= apr_time_now()) {
+ --me->scheduled_task_cnt;
+ APR_RING_REMOVE(task, link);
+ return task;
+ }
+ }
+ /* check for normal tasks if we're not returning a scheduled task */
+ if (me->task_cnt == 0) {
+ return NULL;
+ }
+
+ task = APR_RING_FIRST(me->tasks);
+ assert(task != NULL);
+ assert(task != APR_RING_SENTINEL(me->tasks, apr_thread_pool_task, link));
+ --me->task_cnt;
+ seg = TASK_PRIORITY_SEG(task);
+ if (task == me->task_idx[seg]) {
+ me->task_idx[seg] = APR_RING_NEXT(task, link);
+ if (me->task_idx[seg] == APR_RING_SENTINEL(me->tasks,
+ apr_thread_pool_task, link)
+ || TASK_PRIORITY_SEG(me->task_idx[seg]) != seg) {
+ me->task_idx[seg] = NULL;
+ }
+ }
+ APR_RING_REMOVE(task, link);
+ return task;
+}
+
+static apr_interval_time_t waiting_time(apr_thread_pool_t * me)
+{
+ apr_thread_pool_task_t *task = NULL;
+
+ task = APR_RING_FIRST(me->scheduled_tasks);
+ assert(task != NULL);
+ assert(task !=
+ APR_RING_SENTINEL(me->scheduled_tasks, apr_thread_pool_task,
+ link));
+ return task->dispatch.time - apr_time_now();
+}
+
+/*
+ * NOTE: This function is not thread safe by itself. Caller should hold the lock
+ */
+static struct apr_thread_list_elt *elt_new(apr_thread_pool_t * me,
+ apr_thread_t * t)
+{
+ struct apr_thread_list_elt *elt;
+
+ if (APR_RING_EMPTY(me->recycled_thds, apr_thread_list_elt, link)) {
+ elt = apr_pcalloc(me->pool, sizeof(*elt));
+ if (NULL == elt) {
+ return NULL;
+ }
+ }
+ else {
+ elt = APR_RING_FIRST(me->recycled_thds);
+ APR_RING_REMOVE(elt, link);
+ }
+
+ APR_RING_ELEM_INIT(elt, link);
+ elt->thd = t;
+ elt->current_owner = NULL;
+ elt->state = TH_RUN;
+ return elt;
+}
+
+/*
+ * The worker thread function. Take a task from the queue and perform it if
+ * there is any. Otherwise, put itself into the idle thread list and waiting
+ * for signal to wake up.
+ * The thread terminate directly by detach and exit when it is asked to stop
+ * after finishing a task. Otherwise, the thread should be in idle thread list
+ * and should be joined.
+ */
+static void *APR_THREAD_FUNC thread_pool_func(apr_thread_t * t, void *param)
+{
+ apr_thread_pool_t *me = param;
+ apr_thread_pool_task_t *task = NULL;
+ apr_interval_time_t wait;
+ struct apr_thread_list_elt *elt;
+
+ apr_thread_mutex_lock(me->lock);
+ elt = elt_new(me, t);
+ if (!elt) {
+ apr_thread_mutex_unlock(me->lock);
+ apr_thread_exit(t, APR_ENOMEM);
+ }
+
+ while (!me->terminated && elt->state != TH_STOP) {
+ /* Test if not new element, it is awakened from idle */
+ if (APR_RING_NEXT(elt, link) != elt) {
+ --me->idle_cnt;
+ APR_RING_REMOVE(elt, link);
+ }
+
+ APR_RING_INSERT_TAIL(me->busy_thds, elt, apr_thread_list_elt, link);
+ task = pop_task(me);
+ while (NULL != task && !me->terminated) {
+ ++me->tasks_run;
+ elt->current_owner = task->owner;
+ apr_thread_mutex_unlock(me->lock);
+ apr_thread_data_set(task, "apr_thread_pool_task", NULL, t);
+ task->func(t, task->param);
+ apr_thread_mutex_lock(me->lock);
+ APR_RING_INSERT_TAIL(me->recycled_tasks, task,
+ apr_thread_pool_task, link);
+ elt->current_owner = NULL;
+ if (TH_STOP == elt->state) {
+ break;
+ }
+ task = pop_task(me);
+ }
+ assert(NULL == elt->current_owner);
+ if (TH_STOP != elt->state)
+ APR_RING_REMOVE(elt, link);
+
+ /* Test if a busy thread been asked to stop, which is not joinable */
+ if ((me->idle_cnt >= me->idle_max
+ && !(me->scheduled_task_cnt && 0 >= me->idle_max)
+ && !me->idle_wait)
+ || me->terminated || elt->state != TH_RUN) {
+ --me->thd_cnt;
+ if ((TH_PROBATION == elt->state) && me->idle_wait)
+ ++me->thd_timed_out;
+ APR_RING_INSERT_TAIL(me->recycled_thds, elt,
+ apr_thread_list_elt, link);
+ apr_thread_mutex_unlock(me->lock);
+ apr_thread_detach(t);
+ apr_thread_exit(t, APR_SUCCESS);
+ return NULL; /* should not be here, safe net */
+ }
+
+ /* busy thread become idle */
+ ++me->idle_cnt;
+ APR_RING_INSERT_TAIL(me->idle_thds, elt, apr_thread_list_elt, link);
+
+ /*
+ * If there is a scheduled task, always scheduled to perform that task.
+ * Since there is no guarantee that current idle threads are scheduled
+ * for next scheduled task.
+ */
+ if (me->scheduled_task_cnt)
+ wait = waiting_time(me);
+ else if (me->idle_cnt > me->idle_max) {
+ wait = me->idle_wait;
+ elt->state = TH_PROBATION;
+ }
+ else
+ wait = -1;
+
+ if (wait >= 0) {
+ apr_thread_cond_timedwait(me->cond, me->lock, wait);
+ }
+ else {
+ apr_thread_cond_wait(me->cond, me->lock);
+ }
+ }
+
+ /* idle thread been asked to stop, will be joined */
+ --me->thd_cnt;
+ apr_thread_mutex_unlock(me->lock);
+ apr_thread_exit(t, APR_SUCCESS);
+ return NULL; /* should not be here, safe net */
+}
+
+static apr_status_t thread_pool_cleanup(void *me)
+{
+ apr_thread_pool_t *_myself = me;
+
+ _myself->terminated = 1;
+ apr_thread_pool_idle_max_set(_myself, 0);
+ while (_myself->thd_cnt) {
+ apr_sleep(20 * 1000); /* spin lock with 20 ms */
+ }
+ apr_thread_mutex_destroy(_myself->lock);
+ apr_thread_cond_destroy(_myself->cond);
+ return APR_SUCCESS;
+}
+
+APU_DECLARE(apr_status_t) apr_thread_pool_create(apr_thread_pool_t ** me,
+ apr_size_t init_threads,
+ apr_size_t max_threads,
+ apr_pool_t * pool)
+{
+ apr_thread_t *t;
+ apr_status_t rv = APR_SUCCESS;
+ apr_thread_pool_t *tp;
+
+ *me = NULL;
+ tp = apr_pcalloc(pool, sizeof(apr_thread_pool_t));
+
+ /*
+ * This pool will be used by different threads. As we cannot ensure that
+ * our caller won't use the pool without acquiring the mutex, we must
+ * create a new sub pool.
+ */
+ rv = apr_pool_create(&tp->pool, pool);
+ if (APR_SUCCESS != rv)
+ return rv;
+ rv = thread_pool_construct(tp, init_threads, max_threads);
+ if (APR_SUCCESS != rv)
+ return rv;
+ apr_pool_pre_cleanup_register(tp->pool, tp, thread_pool_cleanup);
+
+ while (init_threads) {
+ /* Grab the mutex as apr_thread_create() and thread_pool_func() will
+ * allocate from (*me)->pool. This is dangerous if there are multiple
+ * initial threads to create.
+ */
+ apr_thread_mutex_lock(tp->lock);
+ rv = apr_thread_create(&t, NULL, thread_pool_func, tp, tp->pool);
+ apr_thread_mutex_unlock(tp->lock);
+ if (APR_SUCCESS != rv) {
+ break;
+ }
+ tp->thd_cnt++;
+ if (tp->thd_cnt > tp->thd_high) {
+ tp->thd_high = tp->thd_cnt;
+ }
+ --init_threads;
+ }
+
+ if (rv == APR_SUCCESS) {
+ *me = tp;
+ }
+
+ return rv;
+}
+
+APU_DECLARE(apr_status_t) apr_thread_pool_destroy(apr_thread_pool_t * me)
+{
+ apr_pool_destroy(me->pool);
+ return APR_SUCCESS;
+}
+
+/*
+ * NOTE: This function is not thread safe by itself. Caller should hold the lock
+ */
+static apr_thread_pool_task_t *task_new(apr_thread_pool_t * me,
+ apr_thread_start_t func,
+ void *param, apr_byte_t priority,
+ void *owner, apr_time_t time)
+{
+ apr_thread_pool_task_t *t;
+
+ if (APR_RING_EMPTY(me->recycled_tasks, apr_thread_pool_task, link)) {
+ t = apr_pcalloc(me->pool, sizeof(*t));
+ if (NULL == t) {
+ return NULL;
+ }
+ }
+ else {
+ t = APR_RING_FIRST(me->recycled_tasks);
+ APR_RING_REMOVE(t, link);
+ }
+
+ APR_RING_ELEM_INIT(t, link);
+ t->func = func;
+ t->param = param;
+ t->owner = owner;
+ if (time > 0) {
+ t->dispatch.time = apr_time_now() + time;
+ }
+ else {
+ t->dispatch.priority = priority;
+ }
+ return t;
+}
+
+/*
+ * Test it the task is the only one within the priority segment.
+ * If it is not, return the first element with same or lower priority.
+ * Otherwise, add the task into the queue and return NULL.
+ *
+ * NOTE: This function is not thread safe by itself. Caller should hold the lock
+ */
+static apr_thread_pool_task_t *add_if_empty(apr_thread_pool_t * me,
+ apr_thread_pool_task_t * const t)
+{
+ int seg;
+ int next;
+ apr_thread_pool_task_t *t_next;
+
+ seg = TASK_PRIORITY_SEG(t);
+ if (me->task_idx[seg]) {
+ assert(APR_RING_SENTINEL(me->tasks, apr_thread_pool_task, link) !=
+ me->task_idx[seg]);
+ t_next = me->task_idx[seg];
+ while (t_next->dispatch.priority > t->dispatch.priority) {
+ t_next = APR_RING_NEXT(t_next, link);
+ if (APR_RING_SENTINEL(me->tasks, apr_thread_pool_task, link) ==
+ t_next) {
+ return t_next;
+ }
+ }
+ return t_next;
+ }
+
+ for (next = seg - 1; next >= 0; next--) {
+ if (me->task_idx[next]) {
+ APR_RING_INSERT_BEFORE(me->task_idx[next], t, link);
+ break;
+ }
+ }
+ if (0 > next) {
+ APR_RING_INSERT_TAIL(me->tasks, t, apr_thread_pool_task, link);
+ }
+ me->task_idx[seg] = t;
+ return NULL;
+}
+
+/*
+* schedule a task to run in "time" microseconds. Find the spot in the ring where
+* the time fits. Adjust the short_time so the thread wakes up when the time is reached.
+*/
+static apr_status_t schedule_task(apr_thread_pool_t *me,
+ apr_thread_start_t func, void *param,
+ void *owner, apr_interval_time_t time)
+{
+ apr_thread_pool_task_t *t;
+ apr_thread_pool_task_t *t_loc;
+ apr_thread_t *thd;
+ apr_status_t rv = APR_SUCCESS;
+ apr_thread_mutex_lock(me->lock);
+
+ t = task_new(me, func, param, 0, owner, time);
+ if (NULL == t) {
+ apr_thread_mutex_unlock(me->lock);
+ return APR_ENOMEM;
+ }
+ t_loc = APR_RING_FIRST(me->scheduled_tasks);
+ while (NULL != t_loc) {
+ /* if the time is less than the entry insert ahead of it */
+ if (t->dispatch.time < t_loc->dispatch.time) {
+ ++me->scheduled_task_cnt;
+ APR_RING_INSERT_BEFORE(t_loc, t, link);
+ break;
+ }
+ else {
+ t_loc = APR_RING_NEXT(t_loc, link);
+ if (t_loc ==
+ APR_RING_SENTINEL(me->scheduled_tasks, apr_thread_pool_task,
+ link)) {
+ ++me->scheduled_task_cnt;
+ APR_RING_INSERT_TAIL(me->scheduled_tasks, t,
+ apr_thread_pool_task, link);
+ break;
+ }
+ }
+ }
+ /* there should be at least one thread for scheduled tasks */
+ if (0 == me->thd_cnt) {
+ rv = apr_thread_create(&thd, NULL, thread_pool_func, me, me->pool);
+ if (APR_SUCCESS == rv) {
+ ++me->thd_cnt;
+ if (me->thd_cnt > me->thd_high)
+ me->thd_high = me->thd_cnt;
+ }
+ }
+ apr_thread_cond_signal(me->cond);
+ apr_thread_mutex_unlock(me->lock);
+ return rv;
+}
+
+static apr_status_t add_task(apr_thread_pool_t *me, apr_thread_start_t func,
+ void *param, apr_byte_t priority, int push,
+ void *owner)
+{
+ apr_thread_pool_task_t *t;
+ apr_thread_pool_task_t *t_loc;
+ apr_thread_t *thd;
+ apr_status_t rv = APR_SUCCESS;
+
+ apr_thread_mutex_lock(me->lock);
+
+ t = task_new(me, func, param, priority, owner, 0);
+ if (NULL == t) {
+ apr_thread_mutex_unlock(me->lock);
+ return APR_ENOMEM;
+ }
+
+ t_loc = add_if_empty(me, t);
+ if (NULL == t_loc) {
+ goto FINAL_EXIT;
+ }
+
+ if (push) {
+ while (APR_RING_SENTINEL(me->tasks, apr_thread_pool_task, link) !=
+ t_loc && t_loc->dispatch.priority >= t->dispatch.priority) {
+ t_loc = APR_RING_NEXT(t_loc, link);
+ }
+ }
+ APR_RING_INSERT_BEFORE(t_loc, t, link);
+ if (!push) {
+ if (t_loc == me->task_idx[TASK_PRIORITY_SEG(t)]) {
+ me->task_idx[TASK_PRIORITY_SEG(t)] = t;
+ }
+ }
+
+ FINAL_EXIT:
+ me->task_cnt++;
+ if (me->task_cnt > me->tasks_high)
+ me->tasks_high = me->task_cnt;
+ if (0 == me->thd_cnt || (0 == me->idle_cnt && me->thd_cnt < me->thd_max &&
+ me->task_cnt > me->threshold)) {
+ rv = apr_thread_create(&thd, NULL, thread_pool_func, me, me->pool);
+ if (APR_SUCCESS == rv) {
+ ++me->thd_cnt;
+ if (me->thd_cnt > me->thd_high)
+ me->thd_high = me->thd_cnt;
+ }
+ }
+
+ apr_thread_cond_signal(me->cond);
+ apr_thread_mutex_unlock(me->lock);
+
+ return rv;
+}
+
+APU_DECLARE(apr_status_t) apr_thread_pool_push(apr_thread_pool_t *me,
+ apr_thread_start_t func,
+ void *param,
+ apr_byte_t priority,
+ void *owner)
+{
+ return add_task(me, func, param, priority, 1, owner);
+}
+
+APU_DECLARE(apr_status_t) apr_thread_pool_schedule(apr_thread_pool_t *me,
+ apr_thread_start_t func,
+ void *param,
+ apr_interval_time_t time,
+ void *owner)
+{
+ return schedule_task(me, func, param, owner, time);
+}
+
+APU_DECLARE(apr_status_t) apr_thread_pool_top(apr_thread_pool_t *me,
+ apr_thread_start_t func,
+ void *param,
+ apr_byte_t priority,
+ void *owner)
+{
+ return add_task(me, func, param, priority, 0, owner);
+}
+
+static apr_status_t remove_scheduled_tasks(apr_thread_pool_t *me,
+ void *owner)
+{
+ apr_thread_pool_task_t *t_loc;
+ apr_thread_pool_task_t *next;
+
+ t_loc = APR_RING_FIRST(me->scheduled_tasks);
+ while (t_loc !=
+ APR_RING_SENTINEL(me->scheduled_tasks, apr_thread_pool_task,
+ link)) {
+ next = APR_RING_NEXT(t_loc, link);
+ /* if this is the owner remove it */
+ if (t_loc->owner == owner) {
+ --me->scheduled_task_cnt;
+ APR_RING_REMOVE(t_loc, link);
+ }
+ t_loc = next;
+ }
+ return APR_SUCCESS;
+}
+
+static apr_status_t remove_tasks(apr_thread_pool_t *me, void *owner)
+{
+ apr_thread_pool_task_t *t_loc;
+ apr_thread_pool_task_t *next;
+ int seg;
+
+ t_loc = APR_RING_FIRST(me->tasks);
+ while (t_loc != APR_RING_SENTINEL(me->tasks, apr_thread_pool_task, link)) {
+ next = APR_RING_NEXT(t_loc, link);
+ if (t_loc->owner == owner) {
+ --me->task_cnt;
+ seg = TASK_PRIORITY_SEG(t_loc);
+ if (t_loc == me->task_idx[seg]) {
+ me->task_idx[seg] = APR_RING_NEXT(t_loc, link);
+ if (me->task_idx[seg] == APR_RING_SENTINEL(me->tasks,
+ apr_thread_pool_task,
+ link)
+ || TASK_PRIORITY_SEG(me->task_idx[seg]) != seg) {
+ me->task_idx[seg] = NULL;
+ }
+ }
+ APR_RING_REMOVE(t_loc, link);
+ }
+ t_loc = next;
+ }
+ return APR_SUCCESS;
+}
+
+static void wait_on_busy_threads(apr_thread_pool_t *me, void *owner)
+{
+#ifndef NDEBUG
+ apr_os_thread_t *os_thread;
+#endif
+ struct apr_thread_list_elt *elt;
+ apr_thread_mutex_lock(me->lock);
+ elt = APR_RING_FIRST(me->busy_thds);
+ while (elt != APR_RING_SENTINEL(me->busy_thds, apr_thread_list_elt, link)) {
+ if (elt->current_owner != owner) {
+ elt = APR_RING_NEXT(elt, link);
+ continue;
+ }
+#ifndef NDEBUG
+ /* make sure the thread is not the one calling tasks_cancel */
+ apr_os_thread_get(&os_thread, elt->thd);
+#ifdef WIN32
+ /* hack for apr win32 bug */
+ assert(!apr_os_thread_equal(apr_os_thread_current(), os_thread));
+#else
+ assert(!apr_os_thread_equal(apr_os_thread_current(), *os_thread));
+#endif
+#endif
+ while (elt->current_owner == owner) {
+ apr_thread_mutex_unlock(me->lock);
+ apr_sleep(200 * 1000);
+ apr_thread_mutex_lock(me->lock);
+ }
+ elt = APR_RING_FIRST(me->busy_thds);
+ }
+ apr_thread_mutex_unlock(me->lock);
+ return;
+}
+
+APU_DECLARE(apr_status_t) apr_thread_pool_tasks_cancel(apr_thread_pool_t *me,
+ void *owner)
+{
+ apr_status_t rv = APR_SUCCESS;
+
+ apr_thread_mutex_lock(me->lock);
+ if (me->task_cnt > 0) {
+ rv = remove_tasks(me, owner);
+ }
+ if (me->scheduled_task_cnt > 0) {
+ rv = remove_scheduled_tasks(me, owner);
+ }
+ apr_thread_mutex_unlock(me->lock);
+ wait_on_busy_threads(me, owner);
+
+ return rv;
+}
+
+APU_DECLARE(apr_size_t) apr_thread_pool_tasks_count(apr_thread_pool_t *me)
+{
+ return me->task_cnt;
+}
+
+APU_DECLARE(apr_size_t)
+ apr_thread_pool_scheduled_tasks_count(apr_thread_pool_t *me)
+{
+ return me->scheduled_task_cnt;
+}
+
+APU_DECLARE(apr_size_t) apr_thread_pool_threads_count(apr_thread_pool_t *me)
+{
+ return me->thd_cnt;
+}
+
+APU_DECLARE(apr_size_t) apr_thread_pool_busy_count(apr_thread_pool_t *me)
+{
+ return me->thd_cnt - me->idle_cnt;
+}
+
+APU_DECLARE(apr_size_t) apr_thread_pool_idle_count(apr_thread_pool_t *me)
+{
+ return me->idle_cnt;
+}
+
+APU_DECLARE(apr_size_t)
+ apr_thread_pool_tasks_run_count(apr_thread_pool_t * me)
+{
+ return me->tasks_run;
+}
+
+APU_DECLARE(apr_size_t)
+ apr_thread_pool_tasks_high_count(apr_thread_pool_t * me)
+{
+ return me->tasks_high;
+}
+
+APU_DECLARE(apr_size_t)
+ apr_thread_pool_threads_high_count(apr_thread_pool_t * me)
+{
+ return me->thd_high;
+}
+
+APU_DECLARE(apr_size_t)
+ apr_thread_pool_threads_idle_timeout_count(apr_thread_pool_t * me)
+{
+ return me->thd_timed_out;
+}
+
+
+APU_DECLARE(apr_size_t) apr_thread_pool_idle_max_get(apr_thread_pool_t *me)
+{
+ return me->idle_max;
+}
+
+APU_DECLARE(apr_interval_time_t)
+ apr_thread_pool_idle_wait_get(apr_thread_pool_t * me)
+{
+ return me->idle_wait;
+}
+
+/*
+ * This function stop extra idle threads to the cnt.
+ * @return the number of threads stopped
+ * NOTE: There could be busy threads become idle during this function
+ */
+static struct apr_thread_list_elt *trim_threads(apr_thread_pool_t *me,
+ apr_size_t *cnt, int idle)
+{
+ struct apr_thread_list *thds;
+ apr_size_t n, n_dbg, i;
+ struct apr_thread_list_elt *head, *tail, *elt;
+
+ apr_thread_mutex_lock(me->lock);
+ if (idle) {
+ thds = me->idle_thds;
+ n = me->idle_cnt;
+ }
+ else {
+ thds = me->busy_thds;
+ n = me->thd_cnt - me->idle_cnt;
+ }
+ if (n <= *cnt) {
+ apr_thread_mutex_unlock(me->lock);
+ *cnt = 0;
+ return NULL;
+ }
+ n -= *cnt;
+
+ head = APR_RING_FIRST(thds);
+ for (i = 0; i < *cnt; i++) {
+ head = APR_RING_NEXT(head, link);
+ }
+ tail = APR_RING_LAST(thds);
+ if (idle) {
+ APR_RING_UNSPLICE(head, tail, link);
+ me->idle_cnt = *cnt;
+ }
+
+ n_dbg = 0;
+ for (elt = head; elt != tail; elt = APR_RING_NEXT(elt, link)) {
+ elt->state = TH_STOP;
+ n_dbg++;
+ }
+ elt->state = TH_STOP;
+ n_dbg++;
+ assert(n == n_dbg);
+ *cnt = n;
+
+ apr_thread_mutex_unlock(me->lock);
+
+ APR_RING_PREV(head, link) = NULL;
+ APR_RING_NEXT(tail, link) = NULL;
+ return head;
+}
+
+static apr_size_t trim_idle_threads(apr_thread_pool_t *me, apr_size_t cnt)
+{
+ apr_size_t n_dbg;
+ struct apr_thread_list_elt *elt, *head, *tail;
+ apr_status_t rv;
+
+ elt = trim_threads(me, &cnt, 1);
+
+ apr_thread_mutex_lock(me->lock);
+ apr_thread_cond_broadcast(me->cond);
+ apr_thread_mutex_unlock(me->lock);
+
+ n_dbg = 0;
+ if (NULL != (head = elt)) {
+ while (elt) {
+ tail = elt;
+ apr_thread_join(&rv, elt->thd);
+ elt = APR_RING_NEXT(elt, link);
+ ++n_dbg;
+ }
+ apr_thread_mutex_lock(me->lock);
+ APR_RING_SPLICE_TAIL(me->recycled_thds, head, tail,
+ apr_thread_list_elt, link);
+ apr_thread_mutex_unlock(me->lock);
+ }
+ assert(cnt == n_dbg);
+
+ return cnt;
+}
+
+/* don't join on busy threads for performance reasons, who knows how long will
+ * the task takes to perform
+ */
+static apr_size_t trim_busy_threads(apr_thread_pool_t *me, apr_size_t cnt)
+{
+ trim_threads(me, &cnt, 0);
+ return cnt;
+}
+
+APU_DECLARE(apr_size_t) apr_thread_pool_idle_max_set(apr_thread_pool_t *me,
+ apr_size_t cnt)
+{
+ me->idle_max = cnt;
+ cnt = trim_idle_threads(me, cnt);
+ return cnt;
+}
+
+APU_DECLARE(apr_interval_time_t)
+ apr_thread_pool_idle_wait_set(apr_thread_pool_t * me,
+ apr_interval_time_t timeout)
+{
+ apr_interval_time_t oldtime;
+
+ oldtime = me->idle_wait;
+ me->idle_wait = timeout;
+
+ return oldtime;
+}
+
+APU_DECLARE(apr_size_t) apr_thread_pool_thread_max_get(apr_thread_pool_t *me)
+{
+ return me->thd_max;
+}
+
+/*
+ * This function stop extra working threads to the new limit.
+ * NOTE: There could be busy threads become idle during this function
+ */
+APU_DECLARE(apr_size_t) apr_thread_pool_thread_max_set(apr_thread_pool_t *me,
+ apr_size_t cnt)
+{
+ unsigned int n;
+
+ me->thd_max = cnt;
+ if (0 == cnt || me->thd_cnt <= cnt) {
+ return 0;
+ }
+
+ n = me->thd_cnt - cnt;
+ if (n >= me->idle_cnt) {
+ trim_busy_threads(me, n - me->idle_cnt);
+ trim_idle_threads(me, 0);
+ }
+ else {
+ trim_idle_threads(me, me->idle_cnt - n);
+ }
+ return n;
+}
+
+APU_DECLARE(apr_size_t) apr_thread_pool_threshold_get(apr_thread_pool_t *me)
+{
+ return me->threshold;
+}
+
+APU_DECLARE(apr_size_t) apr_thread_pool_threshold_set(apr_thread_pool_t *me,
+ apr_size_t val)
+{
+ apr_size_t ov;
+
+ ov = me->threshold;
+ me->threshold = val;
+ return ov;
+}
+
+APU_DECLARE(apr_status_t) apr_thread_pool_task_owner_get(apr_thread_t *thd,
+ void **owner)
+{
+ apr_status_t rv;
+ apr_thread_pool_task_t *task;
+ void *data;
+
+ rv = apr_thread_data_get(&data, "apr_thread_pool_task", thd);
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+
+ task = data;
+ if (!task) {
+ *owner = NULL;
+ return APR_BADARG;
+ }
+
+ *owner = task->owner;
+ return APR_SUCCESS;
+}
+
+#endif /* APR_HAS_THREADS */
+
+/* vim: set ts=4 sw=4 et cin tw=80: */
diff --git a/contrib/apr-util/misc/apu_dso.c b/contrib/apr-util/misc/apu_dso.c
new file mode 100644
index 000000000000..9d7f20659b50
--- /dev/null
+++ b/contrib/apr-util/misc/apu_dso.c
@@ -0,0 +1,209 @@
+/* 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 <ctype.h>
+#include <stdio.h>
+
+#include "apu_config.h"
+#include "apu.h"
+
+#include "apr_pools.h"
+#include "apr_tables.h"
+#include "apr_dso.h"
+#include "apr_strings.h"
+#include "apr_hash.h"
+#include "apr_file_io.h"
+#include "apr_env.h"
+#include "apr_atomic.h"
+
+#include "apu_internal.h"
+#include "apu_version.h"
+
+#if APU_DSO_BUILD
+
+#if APR_HAS_THREADS
+static apr_thread_mutex_t* mutex = NULL;
+#endif
+static apr_hash_t *dsos = NULL;
+static apr_uint32_t initialised = 0, in_init = 1;
+
+#if APR_HAS_THREADS
+apr_status_t apu_dso_mutex_lock()
+{
+ return apr_thread_mutex_lock(mutex);
+}
+apr_status_t apu_dso_mutex_unlock()
+{
+ return apr_thread_mutex_unlock(mutex);
+}
+#else
+apr_status_t apu_dso_mutex_lock() {
+ return APR_SUCCESS;
+}
+apr_status_t apu_dso_mutex_unlock() {
+ return APR_SUCCESS;
+}
+#endif
+
+static apr_status_t apu_dso_term(void *ptr)
+{
+ /* set statics to NULL so init can work again */
+ dsos = NULL;
+#if APR_HAS_THREADS
+ mutex = NULL;
+#endif
+
+ /* Everything else we need is handled by cleanups registered
+ * when we created mutexes and loaded DSOs
+ */
+ return APR_SUCCESS;
+}
+
+apr_status_t apu_dso_init(apr_pool_t *pool)
+{
+ apr_status_t ret = APR_SUCCESS;
+ apr_pool_t *parent;
+
+ if (apr_atomic_inc32(&initialised)) {
+ apr_atomic_set32(&initialised, 1); /* prevent wrap-around */
+
+ while (apr_atomic_read32(&in_init)) /* wait until we get fully inited */
+ ;
+
+ return APR_SUCCESS;
+ }
+
+ /* Top level pool scope, need process-scope lifetime */
+ for (parent = apr_pool_parent_get(pool);
+ parent && parent != pool;
+ parent = apr_pool_parent_get(pool))
+ pool = parent;
+
+ dsos = apr_hash_make(pool);
+
+#if APR_HAS_THREADS
+ ret = apr_thread_mutex_create(&mutex, APR_THREAD_MUTEX_DEFAULT, pool);
+ /* This already registers a pool cleanup */
+#endif
+
+ apr_pool_cleanup_register(pool, NULL, apu_dso_term,
+ apr_pool_cleanup_null);
+
+ apr_atomic_dec32(&in_init);
+
+ return ret;
+}
+
+apr_status_t apu_dso_load(apr_dso_handle_t **dlhandleptr,
+ apr_dso_handle_sym_t *dsoptr,
+ const char *module,
+ const char *modsym,
+ apr_pool_t *pool)
+{
+ apr_dso_handle_t *dlhandle = NULL;
+ char *pathlist;
+ char path[APR_PATH_MAX + 1];
+ apr_array_header_t *paths;
+ apr_pool_t *global;
+ apr_status_t rv = APR_EDSOOPEN;
+ char *eos = NULL;
+ int i;
+
+ *dsoptr = apr_hash_get(dsos, module, APR_HASH_KEY_STRING);
+ if (*dsoptr) {
+ return APR_EINIT;
+ }
+
+ /* The driver DSO must have exactly the same lifetime as the
+ * drivers hash table; ignore the passed-in pool */
+ global = apr_hash_pool_get(dsos);
+
+ /* Retrieve our path search list or prepare for a single search */
+ if ((apr_env_get(&pathlist, APR_DSOPATH, pool) != APR_SUCCESS)
+ || (apr_filepath_list_split(&paths, pathlist, pool) != APR_SUCCESS))
+ paths = apr_array_make(pool, 1, sizeof(char*));
+
+#if defined(APU_DSO_LIBDIR)
+ /* Always search our prefix path, but on some platforms such as
+ * win32 this may be left undefined
+ */
+ (*((char **)apr_array_push(paths))) = APU_DSO_LIBDIR;
+#endif
+
+ for (i = 0; i < paths->nelts; ++i)
+ {
+#if defined(WIN32)
+ /* Use win32 dso search semantics and attempt to
+ * load the relative lib on the first pass.
+ */
+ if (!eos) {
+ eos = path;
+ --i;
+ }
+ else
+#endif
+ {
+ eos = apr_cpystrn(path, ((char**)paths->elts)[i], sizeof(path));
+ if ((eos > path) && (eos - path < sizeof(path) - 1))
+ *(eos++) = '/';
+ }
+ apr_cpystrn(eos, module, sizeof(path) - (eos - path));
+
+ rv = apr_dso_load(&dlhandle, path, global);
+ if (dlhandleptr) {
+ *dlhandleptr = dlhandle;
+ }
+ if (rv == APR_SUCCESS) { /* APR_EDSOOPEN */
+ break;
+ }
+#if defined(APU_DSO_LIBDIR)
+ else if (i < paths->nelts - 1) {
+#else
+ else { /* No APU_DSO_LIBDIR to skip */
+#endif
+ /* try with apr-util-APU_MAJOR_VERSION appended */
+ eos = apr_cpystrn(eos,
+ "apr-util-" APU_STRINGIFY(APU_MAJOR_VERSION) "/",
+ sizeof(path) - (eos - path));
+
+ apr_cpystrn(eos, module, sizeof(path) - (eos - path));
+
+ rv = apr_dso_load(&dlhandle, path, global);
+ if (dlhandleptr) {
+ *dlhandleptr = dlhandle;
+ }
+ if (rv == APR_SUCCESS) { /* APR_EDSOOPEN */
+ break;
+ }
+ }
+ }
+
+ if (rv != APR_SUCCESS) /* APR_ESYMNOTFOUND */
+ return rv;
+
+ rv = apr_dso_sym(dsoptr, dlhandle, modsym);
+ if (rv != APR_SUCCESS) { /* APR_ESYMNOTFOUND */
+ apr_dso_unload(dlhandle);
+ }
+ else {
+ module = apr_pstrdup(global, module);
+ apr_hash_set(dsos, module, APR_HASH_KEY_STRING, *dsoptr);
+ }
+ return rv;
+}
+
+#endif /* APU_DSO_BUILD */
+
diff --git a/contrib/apr-util/misc/apu_version.c b/contrib/apr-util/misc/apu_version.c
new file mode 100644
index 000000000000..97e73099741a
--- /dev/null
+++ b/contrib/apr-util/misc/apu_version.c
@@ -0,0 +1,37 @@
+/* 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_general.h" /* for APR_STRINGIFY */
+
+#include "apu.h"
+#include "apu_version.h"
+
+APU_DECLARE(void) apu_version(apr_version_t *pvsn)
+{
+ pvsn->major = APU_MAJOR_VERSION;
+ pvsn->minor = APU_MINOR_VERSION;
+ pvsn->patch = APU_PATCH_VERSION;
+#ifdef APU_IS_DEV_VERSION
+ pvsn->is_dev = 1;
+#else
+ pvsn->is_dev = 0;
+#endif
+}
+
+APU_DECLARE(const char *) apu_version_string(void)
+{
+ return APU_VERSION_STRING;
+}
diff --git a/contrib/apr-util/renames_pending b/contrib/apr-util/renames_pending
new file mode 100644
index 000000000000..0ebcfe2eb30a
--- /dev/null
+++ b/contrib/apr-util/renames_pending
@@ -0,0 +1,2 @@
+Symbol renames pending for apr-util (keep ordered and complete, please!)
+
diff --git a/contrib/apr-util/strmatch/apr_strmatch.c b/contrib/apr-util/strmatch/apr_strmatch.c
new file mode 100644
index 000000000000..6a4bf6f9edf9
--- /dev/null
+++ b/contrib/apr-util/strmatch/apr_strmatch.c
@@ -0,0 +1,118 @@
+/* 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_strmatch.h"
+#include "apr_lib.h"
+#define APR_WANT_STRFUNC
+#include "apr_want.h"
+
+
+#define NUM_CHARS 256
+
+/*
+ * String searching functions
+ */
+static const char *match_no_op(const apr_strmatch_pattern *this_pattern,
+ const char *s, apr_size_t slen)
+{
+ return s;
+}
+
+static const char *match_boyer_moore_horspool(
+ const apr_strmatch_pattern *this_pattern,
+ const char *s, apr_size_t slen)
+{
+ const char *s_end = s + slen;
+ apr_size_t *shift = (apr_size_t *)(this_pattern->context);
+ const char *s_next = s + this_pattern->length - 1;
+ const char *p_start = this_pattern->pattern;
+ const char *p_end = p_start + this_pattern->length - 1;
+ while (s_next < s_end) {
+ const char *s_tmp = s_next;
+ const char *p_tmp = p_end;
+ while (*s_tmp == *p_tmp) {
+ p_tmp--;
+ if (p_tmp < p_start) {
+ return s_tmp;
+ }
+ s_tmp--;
+ }
+ s_next += shift[(int)*((const unsigned char *)s_next)];
+ }
+ return NULL;
+}
+
+static const char *match_boyer_moore_horspool_nocase(
+ const apr_strmatch_pattern *this_pattern,
+ const char *s, apr_size_t slen)
+{
+ const char *s_end = s + slen;
+ apr_size_t *shift = (apr_size_t *)(this_pattern->context);
+ const char *s_next = s + this_pattern->length - 1;
+ const char *p_start = this_pattern->pattern;
+ const char *p_end = p_start + this_pattern->length - 1;
+ while (s_next < s_end) {
+ const char *s_tmp = s_next;
+ const char *p_tmp = p_end;
+ while (apr_tolower(*s_tmp) == apr_tolower(*p_tmp)) {
+ p_tmp--;
+ if (p_tmp < p_start) {
+ return s_tmp;
+ }
+ s_tmp--;
+ }
+ s_next += shift[(unsigned char)apr_tolower(*s_next)];
+ }
+ return NULL;
+}
+
+APU_DECLARE(const apr_strmatch_pattern *) apr_strmatch_precompile(
+ apr_pool_t *p, const char *s,
+ int case_sensitive)
+{
+ apr_strmatch_pattern *pattern;
+ apr_size_t i;
+ apr_size_t *shift;
+
+ pattern = apr_palloc(p, sizeof(*pattern));
+ pattern->pattern = s;
+ pattern->length = strlen(s);
+ if (pattern->length == 0) {
+ pattern->compare = match_no_op;
+ pattern->context = NULL;
+ return pattern;
+ }
+
+ shift = (apr_size_t *)apr_palloc(p, sizeof(apr_size_t) * NUM_CHARS);
+ for (i = 0; i < NUM_CHARS; i++) {
+ shift[i] = pattern->length;
+ }
+ if (case_sensitive) {
+ pattern->compare = match_boyer_moore_horspool;
+ for (i = 0; i < pattern->length - 1; i++) {
+ shift[(unsigned char)s[i]] = pattern->length - i - 1;
+ }
+ }
+ else {
+ pattern->compare = match_boyer_moore_horspool_nocase;
+ for (i = 0; i < pattern->length - 1; i++) {
+ shift[(unsigned char)apr_tolower(s[i])] = pattern->length - i - 1;
+ }
+ }
+ pattern->context = shift;
+
+ return pattern;
+}
diff --git a/contrib/apr-util/test/Makefile.in b/contrib/apr-util/test/Makefile.in
new file mode 100644
index 000000000000..5f4cf91b9b13
--- /dev/null
+++ b/contrib/apr-util/test/Makefile.in
@@ -0,0 +1,90 @@
+srcdir = @srcdir@
+VPATH = @srcdir@
+
+# PROGRAMS includes all test programs built on this platform.
+# STDTEST_PORTABLE
+# test programs invoked via standard user interface, run on all platforms
+# ALL_TESTS
+# test modules invoked through the abts suite (./testall)
+# OTHER_PROGRAMS
+# programs such as sockperf, that have to be invoked in a special sequence
+# or with special parameters
+
+INCLUDES = @APRUTIL_PRIV_INCLUDES@ @APR_INCLUDES@ @APRUTIL_INCLUDES@
+
+STDTEST_PORTABLE = dbd testall
+
+TESTS = teststrmatch.lo testuri.lo testuuid.lo testbuckets.lo testpass.lo \
+ testmd4.lo testmd5.lo testldap.lo testdate.lo testdbm.lo testdbd.lo \
+ testxml.lo testrmm.lo testreslist.lo testqueue.lo testxlate.lo \
+ testmemcache.lo testcrypto.lo
+
+PROGRAMS = $(STDTEST_PORTABLE)
+
+TARGETS = $(PROGRAMS)
+
+LOCAL_LIBS = ../lib@APRUTIL_LIBNAME@@APRUTIL_MAJOR_VERSION@.la
+
+CLEAN_TARGETS = manyfile.bin testfile.txt data/sqlite*.db
+
+# bring in rules.mk for standard functionality
+@INCLUDE_RULES@
+APRUTIL_LIBS = @APRUTIL_LIBS@
+APRUTIL_LDFLAGS = $(ALL_LDFLAGS) @LT_NO_INSTALL@ @APRUTIL_LDFLAGS@
+
+# link programs using -no-install to get real executables not
+# libtool wrapper scripts which link an executable when first run.
+LINK_PROG = $(LIBTOOL) $(LTFLAGS) --mode=link $(COMPILE) $(LT_LDFLAGS) \
+ $(APRUTIL_LDFLAGS) -o $@
+
+# STDTEST_PORTABLE;
+
+abts.lo: $(srcdir)/abts.c $(srcdir)/abts.h $(srcdir)/abts_tests.h \
+ $(srcdir)/testutil.h
+
+testutil.lo: $(srcdir)/abts.c $(srcdir)/abts.h $(srcdir)/abts_tests.h \
+ $(srcdir)/testutil.h
+
+OBJECTS_testall = abts.lo testutil.lo $(TESTS) $(LOCAL_LIBS)
+testall: $(OBJECTS_testall)
+ $(LINK_PROG) $(OBJECTS_testall) $(APRUTIL_LIBS) @LDADD_ldap@
+# For VPATH builds; where we have no ./data, copy us some data
+# if we wait until 'make check', then 'make; ./testall' fails;
+ if test ! -d "./data"; then cp -r $(srcdir)/data data; fi
+
+OBJECTS_dbd = dbd.lo $(LOCAL_LIBS)
+dbd: $(OBJECTS_dbd)
+ $(LINK_PROG) $(OBJECTS_dbd) $(APRUTIL_LIBS)
+
+check: $(TESTALL_COMPONENTS) $(STDTEST_PORTABLE) $(STDTEST_NONPORTABLE)
+ teststatus=0; \
+ progfailed=""; \
+ for prog in $(STDTEST_NONPORTABLE) $(STDTEST_PORTABLE); do \
+ if test "$$prog" = 'dbd'; then \
+ for driver in none @apu_dbd_tests@; do \
+ if test "$$driver" != 'none'; then \
+ @apr_shlibpath_var@="`echo "../crypto/.libs:../dbm/.libs:../dbd/.libs:../ldap/.libs:$$@apr_shlibpath_var@" | sed -e 's/::*$$//'`" \
+ ./$$prog $$driver; \
+ status=$$?; \
+ if test $$status != 0; then \
+ teststatus=$$status; \
+ progfailed="$$progfailed '$$prog $$driver'"; \
+ fi; \
+ fi; \
+ done; \
+ else \
+ @apr_shlibpath_var@="`echo "../crypto/.libs:../dbm/.libs:../dbd/.libs:../ldap/.libs:$$@apr_shlibpath_var@" | sed -e 's/::*$$//'`" \
+ ./$$prog; \
+ status=$$?; \
+ if test $$status != 0; then \
+ teststatus=$$status; \
+ progfailed="$$progfailed $$prog"; \
+ fi; \
+ fi; \
+ done; \
+ if test $$teststatus != 0; then \
+ echo "Programs failed:$$progfailed"; \
+ fi; \
+ exit $$teststatus
+
+# DO NOT REMOVE
diff --git a/contrib/apr-util/test/Makefile.win b/contrib/apr-util/test/Makefile.win
new file mode 100644
index 000000000000..a30f39e2b520
--- /dev/null
+++ b/contrib/apr-util/test/Makefile.win
@@ -0,0 +1,171 @@
+# PROGRAMS
+# test programs invoked via standard user interface, run on all platforms
+# ALL_TESTS
+# test modules invoked through the abts suite (./testall)
+# OTHER_PROGRAMS
+# programs such as sendfile, that have to be invoked in a special sequence
+# or with special parameters
+
+# Windows Specific;
+# MODEL
+# dynamic or static - refers to which set of bindings are desired
+# and controls which libraries (apr-1 or libapr-1) will be linked.
+# OUTDIR
+# the library path of the libraries, and also the path within test/
+# where all of the tests for that library will be built
+# APROUTDIR
+# The library path of apr (if different from OUTDIR)
+# APR_PATH
+# relative or absolute path to locate apr libs and includes
+# API_PATH
+# relative or absolute path to locate apr-iconv libs and includes
+
+!IFNDEF MODEL
+MODEL=dynamic
+!ENDIF
+
+!IFNDEF OUTDIR
+!IF "$(MODEL)" == "static"
+OUTDIR=LibR
+!ELSE
+OUTDIR=Release
+!ENDIF
+
+!IF [$(COMSPEC) /c cl /nologo /? \
+ | $(SystemRoot)\System32\find.exe "x64" >NUL ] == 0
+OUTDIR=x64\$(OUTDIR)
+!ENDIF
+!ENDIF
+
+!IF !EXIST("$(OUTDIR)\.")
+!IF ([$(COMSPEC) /C mkdir $(OUTDIR)] == 0)
+!ENDIF
+!ENDIF
+
+!IFNDEF INTDIR
+INTDIR=$(OUTDIR)
+!ELSE
+!IF !EXIST("$(INTDIR)\.")
+!IF ([$(COMSPEC) /C mkdir $(INTDIR)] == 0)
+!ENDIF
+!ENDIF
+!ENDIF
+
+!MESSAGE Building tests into $(OUTDIR) for $(MODEL)
+
+ALL_TESTS = $(INTDIR)\teststrmatch.obj $(INTDIR)\testuri.obj \
+ $(INTDIR)\testuuid.obj $(INTDIR)\testutil.obj \
+ $(INTDIR)\testbuckets.obj $(INTDIR)\testpass.obj \
+ $(INTDIR)\testmd4.obj $(INTDIR)\testmd5.obj \
+ $(INTDIR)\testldap.obj $(INTDIR)\testdbd.obj \
+ $(INTDIR)\testdbm.obj $(INTDIR)\testreslist.obj \
+ $(INTDIR)\testxml.obj $(INTDIR)\testqueue.obj \
+ $(INTDIR)\testrmm.obj $(INTDIR)\testxlate.obj \
+ $(INTDIR)\testdate.obj $(INTDIR)\testmemcache.obj \
+ $(INTDIR)\testcrypto.obj
+
+CLEAN_DATA = manyfile.bin testfile.txt data\sqlite*.db
+
+CLEAN_BUILDDIRS = Debug Release LibD LibR 9x x64
+
+PROGRAMS = \
+ $(OUTDIR)\testall.exe
+
+OTHER_PROGRAMS = \
+ $(OUTDIR)\dbd.exe
+
+# bring in rules.mk for standard functionality
+ALL: $(PROGRAMS) $(OTHER_PROGRAMS)
+
+CL = cl.exe
+LD = link.exe
+
+APR_PATH = ..\..\apr
+API_PATH = ..\..\apr-iconv
+
+APROUTDIR=$(OUTDIR)
+
+!IF "$(MODEL)" == "static"
+PROGRAM_DEPENDENCIES = \
+ $(APR_PATH)\$(APROUTDIR)\apr-1.lib \
+ $(API_PATH)\$(OUTDIR)\apriconv-1.lib \
+ ..\xml\expat\lib\$(OUTDIR)\xml.lib \
+ ..\$(OUTDIR)\aprutil-1.lib
+STATIC_CFLAGS = /D APR_DECLARE_STATIC /D APU_DECLARE_STATIC
+STATIC_LIBS = odbc32.lib odbccp32.lib wldap32.lib
+!ELSE
+PROGRAM_DEPENDENCIES = \
+ $(APR_PATH)\$(APROUTDIR)\libapr-1.lib \
+ ..\$(OUTDIR)\libaprutil-1.lib
+STATIC_CFLAGS =
+# APR 1.3 doesn't fully abstract ldap_ calls to permit switching providers;
+STATIC_LIBS = wldap32.lib
+!ENDIF
+
+!IFDEF _DEBUG
+DEBUG_CFLAGS = /MDd
+!ELSE
+DEBUG_CFLAGS = /MD
+!ENDIF
+
+INCLUDES=/I "../include" /I "$(API_PATH)/include" /I "$(APR_PATH)/include"
+
+CFLAGS = /nologo /c /W3 /Gm /EHsc /Zi /Od $(INCLUDES) \
+ $(STATIC_CFLAGS) $(DEBUG_CFLAGS) /D "BINPATH=$(OUTDIR:\=/)" \
+ /D _DEBUG /D WIN32 /Fo"$(INTDIR)/" /FD
+
+LD_LIBS = kernel32.lib advapi32.lib ws2_32.lib wsock32.lib \
+ ole32.lib shell32.lib rpcrt4.lib $(STATIC_LIBS)
+
+LDFLAGS = /nologo /debug /subsystem:console /incremental:no
+SHLDFLAGS = /nologo /dll /debug /subsystem:windows /incremental:no
+
+.c{$(INTDIR)}.obj::
+ $(CL) $(CFLAGS) -c $< -Fd$(INTDIR)\ $(INCLUDES)
+
+# PROGRAMS;
+
+abts.c: abts.h abts_tests.h testutil.h
+
+testutil.c: abts.h abts_tests.h testutil.h
+
+$(OUTDIR)\testall.exe: $(ALL_TESTS) $(INTDIR)\abts.obj $(PROGRAM_DEPENDENCIES)
+ $(LD) $(LDFLAGS) /out:"$@" $** $(LD_LIBS)
+ @if exist "$@.manifest" \
+ mt.exe -manifest "$@.manifest" -outputresource:$@;1
+
+# OTHER_PROGRAMS;
+
+$(OUTDIR)\dbd.exe: $(INTDIR)\dbd.obj $(PROGRAM_DEPENDENCIES)
+ $(LD) $(LDFLAGS) /out:"$@" $** $(LD_LIBS)
+ @if exist "$@.manifest" \
+ mt.exe -manifest "$@.manifest" -outputresource:$@;1
+
+
+cleandata:
+ @for %f in ($(CLEAN_DATA)) do @if EXIST %f del /f %f
+
+clean: cleandata
+ @if EXIST $(INTDIR)\. rmdir /s /q $(INTDIR)
+ @if EXIST $(OUTDIR)\. rmdir /s /q $(OUTDIR)
+
+cleanall:
+ @for %d in ($(CLEAN_BUILDDIRS) $(INTDIR) $(OUTDIR)) do \
+ @if EXIST %d\. rmdir /s /q %d
+
+
+!IF "$(MODEL)" != "static"
+PATH=$(OUTDIR);..\$(OUTDIR);..\ldap\$(OUTDIR);..\dbd\$(OUTDIR);$(API_PATH)\$(OUTDIR);$(APR_PATH)\$(APROUTDIR);$(PATH)
+!ENDIF
+APR_ICONV1_PATH=$(API_PATH)\$(OUTDIR)\iconv
+
+check: $(PROGRAMS) $(OTHER_PROGRAMS)
+ echo Testing dbd sqlite2 && $(OUTDIR)\dbd.exe sqlite2 || echo Failed
+ echo Testing dbd sqlite3 && $(OUTDIR)\dbd.exe sqlite3 || echo Failed
+ @for %p in ($(PROGRAMS)) do @( \
+ echo Testing %p && %p -v || echo %p failed \
+ )
+
+checkall: check
+
+# DO NOT REMOVE
diff --git a/contrib/apr-util/test/NWGNUaputest b/contrib/apr-util/test/NWGNUaputest
new file mode 100644
index 000000000000..6b710ad84d53
--- /dev/null
+++ b/contrib/apr-util/test/NWGNUaputest
@@ -0,0 +1,281 @@
+#
+# Make sure all needed macro's are defined
+#
+
+#
+# Get the 'head' of the build environment if necessary. This includes default
+# targets and paths to tools
+#
+
+ifndef EnvironmentDefined
+include $(APR_WORK)/build/NWGNUhead.inc
+endif
+
+#
+# These directories will be at the beginning of the include list, followed by
+# INCDIRS
+#
+XINCDIRS += \
+ $(APR)/include \
+ $(APR)/include/arch/NetWare \
+ $(APU)/include \
+ $(LDAPSDK)/inc \
+ $(EOLIST)
+
+#
+# These flags will come after CFLAGS
+#
+XCFLAGS += \
+ $(EOLIST)
+
+#
+# These defines will come after DEFINES
+#
+XDEFINES += \
+ $(EOLIST)
+
+#
+# These flags will be added to the link.opt file
+#
+XLFLAGS += \
+ $(EOLIST)
+
+#
+# These values will be appended to the correct variables based on the value of
+# RELEASE
+#
+ifeq "$(RELEASE)" "debug"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "noopt"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "release"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+#
+# These are used by the link target if an NLM is being generated
+# This is used by the link 'name' directive to name the nlm. If left blank
+# TARGET_nlm (see below) will be used.
+#
+NLM_NAME = aputest
+#
+# This is used by the link '-desc ' directive.
+# If left blank, NLM_NAME will be used.
+#
+NLM_DESCRIPTION = NLM is to test the apu layer
+
+#
+# This is used by the '-threadname' directive. If left blank,
+# NLM_NAME Thread will be used.
+#
+NLM_THREAD_NAME = aputest
+
+#
+# This is used by the '-screenname' directive. If left blank,
+# 'Apache for NetWare' Thread will be used.
+#
+NLM_SCREEN_NAME = aputest
+
+#
+# If this is specified, it will override VERSION value in
+# $(APR_WORK)/build/NWGNUenvironment.inc
+#
+NLM_VERSION =
+
+#
+# If this is specified, it will override the default of 64K
+#
+NLM_STACK_SIZE = 524288
+
+#
+# If this is specified it will be used by the link '-entry' directive
+#
+NLM_ENTRY_SYM =
+
+#
+# If this is specified it will be used by the link '-exit' directive
+#
+NLM_EXIT_SYM =
+
+#
+# If this is specified it will be used by the link '-check' directive
+#
+NLM_CHECK_SYM =
+
+#
+# If this is specified it will be used by the link '-flags' directive
+#
+NLM_FLAGS =
+
+#
+# If this is specified it will be linked in with the XDCData option in the def
+# file instead of the default of $(APR)/misc/netware/apache.xdc. XDCData can
+# be disabled by setting APACHE_UNIPROC in the environment
+#
+XDCDATA =
+
+#
+# Declare all target files (you must add your files here)
+#
+
+#
+# If there is an NLM target, put it here
+#
+TARGET_nlm = \
+ $(OBJDIR)/aputest.nlm \
+ $(EOLIST)
+
+#
+# If there is an LIB target, put it here
+#
+TARGET_lib = \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the NLM target above.
+# Paths must all use the '/' character
+#
+
+FILES_nlm_objs = \
+ $(OBJDIR)/abts.o \
+ $(OBJDIR)/testbuckets.o \
+ $(OBJDIR)/testcrypto.o \
+ $(OBJDIR)/testdate.o \
+ $(OBJDIR)/testdbd.o \
+ $(OBJDIR)/testdbm.o \
+ $(OBJDIR)/testmemcache.o \
+ $(OBJDIR)/testmd4.o \
+ $(OBJDIR)/testmd5.o \
+ $(OBJDIR)/testldap.o \
+ $(OBJDIR)/testpass.o \
+ $(OBJDIR)/testqueue.o \
+ $(OBJDIR)/testreslist.o \
+ $(OBJDIR)/testrmm.o \
+ $(OBJDIR)/teststrmatch.o \
+ $(OBJDIR)/testuri.o \
+ $(OBJDIR)/testutil.o \
+ $(OBJDIR)/testuuid.o \
+ $(OBJDIR)/testxml.o \
+ $(OBJDIR)/testxlate.o \
+ $(OBJDIR)/nw_misc.o \
+ $(EOLIST)
+
+# Pending tests
+
+#
+# These are the LIB files needed to create the NLM target above.
+# These will be added as a library command in the link.opt file.
+#
+FILES_nlm_libs = \
+ $(PRELUDE) \
+ $(EOLIST)
+
+#
+# These are the modules that the above NLM target depends on to load.
+# These will be added as a module command in the link.opt file.
+#
+FILES_nlm_modules = \
+ Libc \
+ APRLIB \
+ lldapsdk \
+ lldapssl \
+ $(EOLIST)
+
+#
+# If the nlm has a msg file, put it's path here
+#
+FILE_nlm_msg =
+
+#
+# If the nlm has a hlp file put it's path here
+#
+FILE_nlm_hlp =
+
+#
+# If this is specified, it will override the default copyright.
+#
+FILE_nlm_copyright =
+
+#
+# Any additional imports go here
+#
+FILES_nlm_Ximports = \
+ @libc.imp \
+ @aprlib.imp \
+ @lldapsdk.imp \
+ @lldapssl.imp \
+ $(EOLIST)
+
+#
+# Any symbols exported to here
+#
+FILES_nlm_exports = \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the LIB target above.
+# Paths must all use the '/' character
+#
+FILES_lib_objs = \
+ $(EOLIST)
+
+#
+# implement targets and dependancies (leave this section alone)
+#
+
+libs :: $(OBJDIR) $(TARGET_lib)
+
+nlms :: libs $(TARGET_nlm)
+
+#
+# Updated this target to create necessary directories and copy files to the
+# correct place. (See $(APR_WORK)/build/NWGNUhead.inc for examples)
+#
+install :: nlms FORCE
+
+#
+# Any specialized rules here
+#
+
+
+#
+# Include the 'tail' makefile that has targets that depend on variables defined
+# in this makefile
+#
+
+include $(APRBUILD)/NWGNUtail.inc
+
diff --git a/contrib/apr-util/test/NWGNUmakefile b/contrib/apr-util/test/NWGNUmakefile
new file mode 100644
index 000000000000..a955f2c0be46
--- /dev/null
+++ b/contrib/apr-util/test/NWGNUmakefile
@@ -0,0 +1,258 @@
+#
+# Declare the sub-directories to be built here
+#
+
+SUBDIRS = \
+ $(EOLIST)
+
+#
+# Get the 'head' of the build environment. This includes default targets and
+# paths to tools
+#
+
+include $(APR_WORK)/build/NWGNUhead.inc
+
+#
+# build this level's files
+
+#
+# Make sure all needed macro's are defined
+#
+
+
+#
+# These directories will be at the beginning of the include list, followed by
+# INCDIRS
+#
+XINCDIRS += \
+ $(APR)/include \
+ $(APR)/include/arch/NetWare \
+ $(EOLIST)
+
+#
+# These flags will come after CFLAGS
+#
+XCFLAGS += \
+ $(EOLIST)
+
+#
+# These defines will come after DEFINES
+#
+XDEFINES += \
+ $(EOLIST)
+
+#
+# These flags will be added to the link.opt file
+#
+XLFLAGS += \
+ $(EOLIST)
+
+#
+# These values will be appended to the correct variables based on the value of
+# RELEASE
+#
+ifeq "$(RELEASE)" "debug"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "noopt"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "release"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+#
+# These are used by the link target if an NLM is being generated
+# This is used by the link 'name' directive to name the nlm. If left blank
+# TARGET_nlm (see below) will be used.
+#
+NLM_NAME =
+
+#
+# This is used by the link '-desc ' directive.
+# If left blank, NLM_NAME will be used.
+#
+NLM_DESCRIPTION =
+
+#
+# This is used by the '-threadname' directive. If left blank,
+# NLM_NAME Thread will be used.
+#
+NLM_THREAD_NAME =
+
+#
+# This is used by the '-screenname' directive. If left blank,
+# 'Apache for NetWare' Thread will be used.
+#
+NLM_SCREEN_NAME =
+
+#
+# If this is specified, it will override VERSION value in
+# $(APR_WORK)/build/NWGNUenvironment.inc
+#
+NLM_VERSION =
+
+#
+# If this is specified, it will override the default of 64K
+#
+NLM_STACK_SIZE =
+
+#
+# If this is specified it will be used by the link '-entry' directive
+#
+NLM_ENTRY_SYM =
+
+#
+# If this is specified it will be used by the link '-exit' directive
+#
+NLM_EXIT_SYM =
+
+#
+# If this is specified it will be used by the link '-check' directive
+#
+NLM_CHECK_SYM =
+
+#
+# If this is specified it will be used by the link '-flags' directive
+#
+NLM_FLAGS =
+
+#
+# If this is specified it will be linked in with the XDCData option in the def
+# file instead of the default of $(APR)/misc/netware/apache.xdc. XDCData can
+# be disabled by setting APACHE_UNIPROC in the environment
+#
+XDCDATA =
+
+#
+# Declare all target files (you must add your files here)
+#
+
+#
+# If there is an NLM target, put it here
+#
+TARGET_nlm = \
+ $(OBJDIR)/aputest.nlm \
+ $(OBJDIR)/aputest.nlm \
+ $(EOLIST)
+#
+# If there is an LIB target, put it here
+#
+TARGET_lib = \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the NLM target above.
+# Paths must all use the '/' character
+#
+FILES_nlm_objs = \
+ $(EOLIST)
+
+#
+# These are the LIB files needed to create the NLM target above.
+# These will be added as a library command in the link.opt file.
+#
+FILES_nlm_libs = \
+ $(EOLIST)
+
+#
+# These are the modules that the above NLM target depends on to load.
+# These will be added as a module command in the link.opt file.
+#
+FILES_nlm_modules = \
+ aprlib \
+ $(EOLIST)
+
+#
+# If the nlm has a msg file, put it's path here
+#
+FILE_nlm_msg =
+
+#
+# If the nlm has a hlp file put it's path here
+#
+FILE_nlm_hlp =
+
+#
+# If this is specified, it will override the default copyright.
+#
+FILE_nlm_copyright =
+
+#
+# Any additional imports go here
+#
+FILES_nlm_Ximports = \
+ $(EOLIST)
+
+#
+# Any symbols exported to here
+#
+FILES_nlm_exports = \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the LIB target above.
+# Paths must all use the '/' character
+#
+FILES_lib_objs = \
+ $(EOLIST)
+
+#
+# implement targets and dependancies (leave this section alone)
+#
+
+libs :: $(OBJDIR) $(TARGET_lib)
+
+nlms :: libs $(TARGET_nlm)
+
+#
+# Updated this target to create necessary directories and copy files to the
+# correct place. (See $(APR_WORK)/build/NWGNUhead.inc for examples)
+#
+install :: nlms FORCE
+ $(call COPY,$(OBJDIR)/*.nlm,$(INSTALLBASE))
+ $(call COPYR,data,$(INSTALLBASE)/data/)
+
+#
+# Any specialized rules here
+#
+
+#
+# Include the 'tail' makefile that has targets that depend on variables defined
+# in this makefile
+#
+
+include $(APRBUILD)/NWGNUtail.inc
+
diff --git a/contrib/apr-util/test/abts.c b/contrib/apr-util/test/abts.c
new file mode 100644
index 000000000000..da0097d05d36
--- /dev/null
+++ b/contrib/apr-util/test/abts.c
@@ -0,0 +1,423 @@
+/* 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 "abts.h"
+#include "abts_tests.h"
+#include "testutil.h"
+
+#define ABTS_STAT_SIZE 6
+static char status[ABTS_STAT_SIZE] = {'|', '/', '-', '|', '\\', '-'};
+static int curr_char;
+static int verbose = 0;
+static int exclude = 0;
+static int quiet = 0;
+static int list_tests = 0;
+
+const char **testlist = NULL;
+
+static int find_test_name(const char *testname) {
+ int i;
+ for (i = 0; testlist[i] != NULL; i++) {
+ if (!strcmp(testlist[i], testname)) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+/* Determine if the test should be run at all */
+static int should_test_run(const char *testname) {
+ int found = 0;
+ if (list_tests == 1) {
+ return 0;
+ }
+ if (testlist == NULL) {
+ return 1;
+ }
+ found = find_test_name(testname);
+ if ((found && !exclude) || (!found && exclude)) {
+ return 1;
+ }
+ return 0;
+}
+
+static void reset_status(void)
+{
+ curr_char = 0;
+}
+
+static void update_status(void)
+{
+ if (!quiet) {
+ curr_char = (curr_char + 1) % ABTS_STAT_SIZE;
+ fprintf(stdout, "\b%c", status[curr_char]);
+ fflush(stdout);
+ }
+}
+
+static void end_suite(abts_suite *suite)
+{
+ if (suite != NULL) {
+ sub_suite *last = suite->tail;
+ if (!quiet) {
+ fprintf(stdout, "\b");
+ fflush(stdout);
+ }
+ if (last->failed == 0) {
+ fprintf(stdout, "SUCCESS\n");
+ fflush(stdout);
+ }
+ else {
+ fprintf(stdout, "FAILED %d of %d\n", last->failed, last->num_test);
+ fflush(stdout);
+ }
+ }
+}
+
+abts_suite *abts_add_suite(abts_suite *suite, const char *suite_name_full)
+{
+ sub_suite *subsuite;
+ char *p;
+ const char *suite_name;
+ curr_char = 0;
+
+ /* Only end the suite if we actually ran it */
+ if (suite && suite->tail &&!suite->tail->not_run) {
+ end_suite(suite);
+ }
+
+ subsuite = malloc(sizeof(*subsuite));
+ subsuite->num_test = 0;
+ subsuite->failed = 0;
+ subsuite->next = NULL;
+ /* suite_name_full may be an absolute path depending on __FILE__
+ * expansion */
+ suite_name = strrchr(suite_name_full, '/');
+ if (!suite_name) {
+ suite_name = strrchr(suite_name_full, '\\');
+ }
+ if (suite_name) {
+ suite_name++;
+ } else {
+ suite_name = suite_name_full;
+ }
+ p = strrchr(suite_name, '.');
+ if (p) {
+ subsuite->name = memcpy(calloc(p - suite_name + 1, 1),
+ suite_name, p - suite_name);
+ }
+ else {
+ subsuite->name = suite_name;
+ }
+
+ if (list_tests) {
+ fprintf(stdout, "%s\n", subsuite->name);
+ }
+
+ subsuite->not_run = 0;
+
+ if (suite == NULL) {
+ suite = malloc(sizeof(*suite));
+ suite->head = subsuite;
+ suite->tail = subsuite;
+ }
+ else {
+ suite->tail->next = subsuite;
+ suite->tail = subsuite;
+ }
+
+ if (!should_test_run(subsuite->name)) {
+ subsuite->not_run = 1;
+ return suite;
+ }
+
+ reset_status();
+ fprintf(stdout, "%-20s: ", subsuite->name);
+ update_status();
+ fflush(stdout);
+
+ return suite;
+}
+
+void abts_run_test(abts_suite *ts, test_func f, void *value)
+{
+ abts_case *tc;
+ sub_suite *ss;
+
+ if (!should_test_run(ts->tail->name)) {
+ return;
+ }
+ ss = ts->tail;
+
+ tc = malloc(sizeof(*tc));
+ tc->failed = 0;
+ tc->suite = ss;
+
+ ss->num_test++;
+ update_status();
+
+ f(tc, value);
+
+ if (tc->failed) {
+ ss->failed++;
+ }
+ free(tc);
+}
+
+static int report(abts_suite *suite)
+{
+ int count = 0;
+ sub_suite *dptr;
+
+ if (suite && suite->tail &&!suite->tail->not_run) {
+ end_suite(suite);
+ }
+
+ for (dptr = suite->head; dptr; dptr = dptr->next) {
+ count += dptr->failed;
+ }
+
+ if (list_tests) {
+ return 0;
+ }
+
+ if (count == 0) {
+ printf("All tests passed.\n");
+ return 0;
+ }
+
+ dptr = suite->head;
+ fprintf(stdout, "%-15s\t\tTotal\tFail\tFailed %%\n", "Failed Tests");
+ fprintf(stdout, "===================================================\n");
+ while (dptr != NULL) {
+ if (dptr->failed != 0) {
+ float percent = ((float)dptr->failed / (float)dptr->num_test);
+ fprintf(stdout, "%-15s\t\t%5d\t%4d\t%6.2f%%\n", dptr->name,
+ dptr->num_test, dptr->failed, percent * 100);
+ }
+ dptr = dptr->next;
+ }
+ return 1;
+}
+
+void abts_log_message(const char *fmt, ...)
+{
+ va_list args;
+ update_status();
+
+ if (verbose) {
+ va_start(args, fmt);
+ vfprintf(stderr, fmt, args);
+ va_end(args);
+ fprintf(stderr, "\n");
+ fflush(stderr);
+ }
+}
+
+void abts_int_equal(abts_case *tc, const int expected, const int actual, int lineno)
+{
+ update_status();
+ if (tc->failed) return;
+
+ if (expected == actual) return;
+
+ tc->failed = TRUE;
+ if (verbose) {
+ fprintf(stderr, "Line %d: expected <%d>, but saw <%d>\n", lineno, expected, actual);
+ fflush(stderr);
+ }
+}
+
+void abts_int_nequal(abts_case *tc, const int expected, const int actual, int lineno)
+{
+ update_status();
+ if (tc->failed) return;
+
+ if (expected != actual) return;
+
+ tc->failed = TRUE;
+ if (verbose) {
+ fprintf(stderr, "Line %d: expected something other than <%d>, but saw <%d>\n",
+ lineno, expected, actual);
+ fflush(stderr);
+ }
+}
+
+void abts_str_equal(abts_case *tc, const char *expected, const char *actual, int lineno)
+{
+ update_status();
+ if (tc->failed) return;
+
+ /* If both are NULL, match is good */
+ if (!expected && !actual) return;
+ if (expected && actual)
+ if (!strcmp(expected, actual)) return;
+
+ tc->failed = TRUE;
+ if (verbose) {
+ fprintf(stderr, "Line %d: expected <%s>, but saw <%s>\n", lineno, expected, actual);
+ fflush(stderr);
+ }
+}
+
+void abts_str_nequal(abts_case *tc, const char *expected, const char *actual,
+ size_t n, int lineno)
+{
+ update_status();
+ if (tc->failed) return;
+
+ if (!strncmp(expected, actual, n)) return;
+
+ tc->failed = TRUE;
+ if (verbose) {
+ fprintf(stderr, "Line %d: expected something other than <%s>, but saw <%s>\n",
+ lineno, expected, actual);
+ fflush(stderr);
+ }
+}
+
+void abts_ptr_notnull(abts_case *tc, const void *ptr, int lineno)
+{
+ update_status();
+ if (tc->failed) return;
+
+ if (ptr != NULL) return;
+
+ tc->failed = TRUE;
+ if (verbose) {
+ fprintf(stderr, "Line %d: expected non-NULL, but saw NULL\n", lineno);
+ fflush(stderr);
+ }
+}
+
+void abts_ptr_equal(abts_case *tc, const void *expected, const void *actual, int lineno)
+{
+ update_status();
+ if (tc->failed) return;
+
+ if (expected == actual) return;
+
+ tc->failed = TRUE;
+ if (verbose) {
+ fprintf(stderr, "Line %d: expected <%p>, but saw <%p>\n", lineno, expected, actual);
+ fflush(stderr);
+ }
+}
+
+void abts_fail(abts_case *tc, const char *message, int lineno)
+{
+ update_status();
+ if (tc->failed) return;
+
+ tc->failed = TRUE;
+ if (verbose) {
+ fprintf(stderr, "Line %d: %s\n", lineno, message);
+ fflush(stderr);
+ }
+}
+
+void abts_assert(abts_case *tc, const char *message, int condition, int lineno)
+{
+ update_status();
+ if (tc->failed) return;
+
+ if (condition) return;
+
+ tc->failed = TRUE;
+ if (verbose) {
+ fprintf(stderr, "Line %d: %s\n", lineno, message);
+ fflush(stderr);
+ }
+}
+
+void abts_true(abts_case *tc, int condition, int lineno)
+{
+ update_status();
+ if (tc->failed) return;
+
+ if (condition) return;
+
+ tc->failed = TRUE;
+ if (verbose) {
+ fprintf(stderr, "Line %d: Condition is false, but expected true\n", lineno);
+ fflush(stderr);
+ }
+}
+
+void abts_not_impl(abts_case *tc, const char *message, int lineno)
+{
+ update_status();
+
+ tc->suite->not_impl++;
+ if (verbose) {
+ fprintf(stderr, "Line %d: %s\n", lineno, message);
+ fflush(stderr);
+ }
+}
+
+int main(int argc, const char *const argv[]) {
+ int i;
+ int rv;
+ int list_provided = 0;
+ abts_suite *suite = NULL;
+
+ initialize();
+
+ quiet = !isatty(STDOUT_FILENO);
+
+ for (i = 1; i < argc; i++) {
+ if (!strcmp(argv[i], "-v")) {
+ verbose = 1;
+ continue;
+ }
+ if (!strcmp(argv[i], "-x")) {
+ exclude = 1;
+ continue;
+ }
+ if (!strcmp(argv[i], "-l")) {
+ list_tests = 1;
+ continue;
+ }
+ if (!strcmp(argv[i], "-q")) {
+ quiet = 1;
+ continue;
+ }
+ if (argv[i][0] == '-') {
+ fprintf(stderr, "Invalid option: `%s'\n", argv[i]);
+ exit(1);
+ }
+ list_provided = 1;
+ }
+
+ if (list_provided) {
+ /* Waste a little space here, because it is easier than counting the
+ * number of tests listed. Besides it is at most three char *.
+ */
+ testlist = calloc(argc + 1, sizeof(char *));
+ for (i = 1; i < argc; i++) {
+ testlist[i - 1] = argv[i];
+ }
+ }
+
+ for (i = 0; i < (sizeof(alltests) / sizeof(struct testlist *)); i++) {
+ suite = alltests[i].func(suite);
+ apr_pool_clear(p);
+ }
+
+ rv = report(suite);
+ return rv;
+}
+
diff --git a/contrib/apr-util/test/abts.h b/contrib/apr-util/test/abts.h
new file mode 100644
index 000000000000..a31def7623e7
--- /dev/null
+++ b/contrib/apr-util/test/abts.h
@@ -0,0 +1,101 @@
+/* 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.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef WIN32
+#include <io.h>
+#else
+#include <unistd.h>
+#endif
+
+#ifndef ABTS_H
+#define ABTS_H
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+struct sub_suite {
+ const char *name;
+ int num_test;
+ int failed;
+ int not_run;
+ int not_impl;
+ struct sub_suite *next;
+};
+typedef struct sub_suite sub_suite;
+
+struct abts_suite {
+ sub_suite *head;
+ sub_suite *tail;
+};
+typedef struct abts_suite abts_suite;
+
+struct abts_case {
+ int failed;
+ sub_suite *suite;
+};
+typedef struct abts_case abts_case;
+
+typedef void (*test_func)(abts_case *tc, void *data);
+
+#define ADD_SUITE(suite) abts_add_suite(suite, __FILE__);
+
+abts_suite *abts_add_suite(abts_suite *suite, const char *suite_name);
+void abts_run_test(abts_suite *ts, test_func f, void *value);
+void abts_log_message(const char *fmt, ...);
+
+void abts_int_equal(abts_case *tc, const int expected, const int actual, int lineno);
+void abts_int_nequal(abts_case *tc, const int expected, const int actual, int lineno);
+void abts_str_equal(abts_case *tc, const char *expected, const char *actual, int lineno);
+void abts_str_nequal(abts_case *tc, const char *expected, const char *actual,
+ size_t n, int lineno);
+void abts_ptr_notnull(abts_case *tc, const void *ptr, int lineno);
+void abts_ptr_equal(abts_case *tc, const void *expected, const void *actual, int lineno);
+void abts_true(abts_case *tc, int condition, int lineno);
+void abts_fail(abts_case *tc, const char *message, int lineno);
+void abts_not_impl(abts_case *tc, const char *message, int lineno);
+void abts_assert(abts_case *tc, const char *message, int condition, int lineno);
+
+/* Convenience macros. Ryan hates these! */
+#define ABTS_INT_EQUAL(a, b, c) abts_int_equal(a, b, c, __LINE__)
+#define ABTS_INT_NEQUAL(a, b, c) abts_int_nequal(a, b, c, __LINE__)
+#define ABTS_STR_EQUAL(a, b, c) abts_str_equal(a, b, c, __LINE__)
+#define ABTS_STR_NEQUAL(a, b, c, d) abts_str_nequal(a, b, c, d, __LINE__)
+#define ABTS_PTR_NOTNULL(a, b) abts_ptr_notnull(a, b, __LINE__)
+#define ABTS_PTR_EQUAL(a, b, c) abts_ptr_equal(a, b, c, __LINE__)
+#define ABTS_TRUE(a, b) abts_true(a, b, __LINE__);
+#define ABTS_FAIL(a, b) abts_fail(a, b, __LINE__);
+#define ABTS_NOT_IMPL(a, b) abts_not_impl(a, b, __LINE__);
+#define ABTS_ASSERT(a, b, c) abts_assert(a, b, c, __LINE__);
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/contrib/apr-util/test/abts_tests.h b/contrib/apr-util/test/abts_tests.h
new file mode 100644
index 000000000000..b612d31b8fa5
--- /dev/null
+++ b/contrib/apr-util/test/abts_tests.h
@@ -0,0 +1,46 @@
+/* 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.
+ */
+
+#ifndef APR_TEST_INCLUDES
+#define APR_TEST_INCLUDES
+
+#include "abts.h"
+#include "testutil.h"
+
+const struct testlist {
+ abts_suite *(*func)(abts_suite *suite);
+} alltests[] = {
+ {teststrmatch},
+ {testuri},
+ {testuuid},
+ {testbuckets},
+ {testpass},
+ {testmd4},
+ {testmd5},
+ {testcrypto},
+ {testldap},
+ {testdbd},
+ {testdate},
+ {testmemcache},
+ {testxml},
+ {testxlate},
+ {testrmm},
+ {testdbm},
+ {testqueue},
+ {testreslist}
+};
+
+#endif /* APR_TEST_INCLUDES */
diff --git a/contrib/apr-util/test/data/billion-laughs.xml b/contrib/apr-util/test/data/billion-laughs.xml
new file mode 100644
index 000000000000..3af89ae4dc77
--- /dev/null
+++ b/contrib/apr-util/test/data/billion-laughs.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<!DOCTYPE billion [
+<!ELEMENT billion (#PCDATA)>
+<!ENTITY laugh0 "ha">
+<!ENTITY laugh1 "&laugh0;&laugh0;">
+<!ENTITY laugh2 "&laugh1;&laugh1;">
+<!ENTITY laugh3 "&laugh2;&laugh2;">
+<!ENTITY laugh4 "&laugh3;&laugh3;">
+<!ENTITY laugh5 "&laugh4;&laugh4;">
+<!ENTITY laugh6 "&laugh5;&laugh5;">
+<!ENTITY laugh7 "&laugh6;&laugh6;">
+<!ENTITY laugh8 "&laugh7;&laugh7;">
+<!ENTITY laugh9 "&laugh8;&laugh8;">
+<!ENTITY laugh10 "&laugh9;&laugh9;">
+<!ENTITY laugh11 "&laugh10;&laugh10;">
+<!ENTITY laugh12 "&laugh11;&laugh11;">
+<!ENTITY laugh13 "&laugh12;&laugh12;">
+<!ENTITY laugh14 "&laugh13;&laugh13;">
+<!ENTITY laugh15 "&laugh14;&laugh14;">
+<!ENTITY laugh16 "&laugh15;&laugh15;">
+<!ENTITY laugh17 "&laugh16;&laugh16;">
+<!ENTITY laugh18 "&laugh17;&laugh17;">
+<!ENTITY laugh19 "&laugh18;&laugh18;">
+<!ENTITY laugh20 "&laugh19;&laugh19;">
+<!ENTITY laugh21 "&laugh20;&laugh20;">
+<!ENTITY laugh22 "&laugh21;&laugh21;">
+<!ENTITY laugh23 "&laugh22;&laugh22;">
+<!ENTITY laugh24 "&laugh23;&laugh23;">
+<!ENTITY laugh25 "&laugh24;&laugh24;">
+<!ENTITY laugh26 "&laugh25;&laugh25;">
+<!ENTITY laugh27 "&laugh26;&laugh26;">
+<!ENTITY laugh28 "&laugh27;&laugh27;">
+<!ENTITY laugh29 "&laugh28;&laugh28;">
+<!ENTITY laugh30 "&laugh29;&laugh29;">
+]>
+<billion>&laugh30;</billion>
diff --git a/contrib/apr-util/test/dbd.c b/contrib/apr-util/test/dbd.c
new file mode 100644
index 000000000000..61f49ab6799f
--- /dev/null
+++ b/contrib/apr-util/test/dbd.c
@@ -0,0 +1,407 @@
+/* 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 "apu.h"
+#include "apr_pools.h"
+#include "apr_dbd.h"
+
+#include <stdio.h>
+
+#define TEST(msg,func) \
+ printf("======== %s ========\n", msg); \
+ rv = func(pool, sql, driver); \
+ if (rv != 0) { \
+ printf("Error in %s: rc=%d\n\n", msg, rv); \
+ } \
+ else { \
+ printf("%s test successful\n\n", msg); \
+ } \
+ fflush(stdout);
+
+static int create_table(apr_pool_t* pool, apr_dbd_t* handle,
+ const apr_dbd_driver_t* driver)
+{
+ int rv = 0;
+ int nrows;
+ const char *statement = "CREATE TABLE apr_dbd_test ("
+ "col1 varchar(40) not null,"
+ "col2 varchar(40),"
+ "col3 integer)" ;
+ rv = apr_dbd_query(driver, handle, &nrows, statement);
+ return rv;
+}
+static int drop_table(apr_pool_t* pool, apr_dbd_t* handle,
+ const apr_dbd_driver_t* driver)
+{
+ int rv = 0;
+ int nrows;
+ const char *statement = "DROP TABLE apr_dbd_test" ;
+ rv = apr_dbd_query(driver, handle, &nrows, statement);
+ return rv;
+}
+static int insert_rows(apr_pool_t* pool, apr_dbd_t* handle,
+ const apr_dbd_driver_t* driver)
+{
+ int i;
+ int rv = 0;
+ int nrows;
+ int nerrors = 0;
+ const char *statement =
+ "INSERT into apr_dbd_test (col1) values ('foo');"
+ "INSERT into apr_dbd_test values ('wibble', 'other', 5);"
+ "INSERT into apr_dbd_test values ('wibble', 'nothing', 5);"
+ "INSERT into apr_dbd_test values ('qwerty', 'foo', 0);"
+ "INSERT into apr_dbd_test values ('asdfgh', 'bar', 1);"
+ ;
+ rv = apr_dbd_query(driver, handle, &nrows, statement);
+ if (rv) {
+ const char* stmt[] = {
+ "INSERT into apr_dbd_test (col1) values ('foo');",
+ "INSERT into apr_dbd_test values ('wibble', 'other', 5);",
+ "INSERT into apr_dbd_test values ('wibble', 'nothing', 5);",
+ "INSERT into apr_dbd_test values ('qwerty', 'foo', 0);",
+ "INSERT into apr_dbd_test values ('asdfgh', 'bar', 1);",
+ NULL
+ };
+ printf("Compound insert failed; trying statements one-by-one\n") ;
+ for (i=0; stmt[i] != NULL; ++i) {
+ statement = stmt[i];
+ rv = apr_dbd_query(driver, handle, &nrows, statement);
+ if (rv) {
+ nerrors++;
+ }
+ }
+ if (nerrors) {
+ printf("%d single inserts failed too.\n", nerrors) ;
+ }
+ }
+ return rv;
+}
+static int invalid_op(apr_pool_t* pool, apr_dbd_t* handle,
+ const apr_dbd_driver_t* driver)
+{
+ int rv = 0;
+ int nrows;
+ const char *statement = "INSERT into apr_dbd_test1 (col2) values ('foo')" ;
+ rv = apr_dbd_query(driver, handle, &nrows, statement);
+ printf("invalid op returned %d (should be nonzero). Error msg follows\n", rv);
+ printf("'%s'\n", apr_dbd_error(driver, handle, rv));
+ statement = "INSERT into apr_dbd_test (col1, col2) values ('bar', 'foo')" ;
+ rv = apr_dbd_query(driver, handle, &nrows, statement);
+ printf("valid op returned %d (should be zero; error shouldn't affect subsequent ops)\n", rv);
+ return rv;
+}
+static int select_sequential(apr_pool_t* pool, apr_dbd_t* handle,
+ const apr_dbd_driver_t* driver)
+{
+ int rv = 0;
+ int i = 0;
+ int n;
+ const char* entry;
+ const char* statement = "SELECT * FROM apr_dbd_test ORDER BY col1, col2";
+ apr_dbd_results_t *res = NULL;
+ apr_dbd_row_t *row = NULL;
+ rv = apr_dbd_select(driver,pool,handle,&res,statement,0);
+ if (rv) {
+ printf("Select failed: %s", apr_dbd_error(driver, handle, rv));
+ return rv;
+ }
+ for (rv = apr_dbd_get_row(driver, pool, res, &row, -1);
+ rv == 0;
+ rv = apr_dbd_get_row(driver, pool, res, &row, -1)) {
+ printf("ROW %d: ", ++i) ;
+ for (n = 0; n < apr_dbd_num_cols(driver, res); ++n) {
+ entry = apr_dbd_get_entry(driver, row, n);
+ if (entry == NULL) {
+ printf("(null) ") ;
+ }
+ else {
+ printf("%s ", entry);
+ }
+ }
+ fputs("\n", stdout);
+ }
+ return (rv == -1) ? 0 : 1;
+}
+static int select_random(apr_pool_t* pool, apr_dbd_t* handle,
+ const apr_dbd_driver_t* driver)
+{
+ int rv = 0;
+ int n;
+ const char* entry;
+ const char* statement = "SELECT * FROM apr_dbd_test ORDER BY col1, col2";
+ apr_dbd_results_t *res = NULL;
+ apr_dbd_row_t *row = NULL;
+ rv = apr_dbd_select(driver,pool,handle,&res,statement,1);
+ if (rv) {
+ printf("Select failed: %s", apr_dbd_error(driver, handle, rv));
+ return rv;
+ }
+ rv = apr_dbd_get_row(driver, pool, res, &row, 5) ;
+ if (rv) {
+ printf("get_row failed: %s", apr_dbd_error(driver, handle, rv));
+ return rv;
+ }
+ printf("ROW 5: ");
+ for (n = 0; n < apr_dbd_num_cols(driver, res); ++n) {
+ entry = apr_dbd_get_entry(driver, row, n);
+ if (entry == NULL) {
+ printf("(null) ") ;
+ }
+ else {
+ printf("%s ", entry);
+ }
+ }
+ fputs("\n", stdout);
+ rv = apr_dbd_get_row(driver, pool, res, &row, 1) ;
+ if (rv) {
+ printf("get_row failed: %s", apr_dbd_error(driver, handle, rv));
+ return rv;
+ }
+ printf("ROW 1: ");
+ for (n = 0; n < apr_dbd_num_cols(driver, res); ++n) {
+ entry = apr_dbd_get_entry(driver, row, n);
+ if (entry == NULL) {
+ printf("(null) ") ;
+ }
+ else {
+ printf("%s ", entry);
+ }
+ }
+ fputs("\n", stdout);
+ rv = apr_dbd_get_row(driver, pool, res, &row, 11) ;
+ if (rv != -1) {
+ printf("Oops! get_row out of range but thinks it succeeded!\n%s\n",
+ apr_dbd_error(driver, handle, rv));
+ return -1;
+ }
+ rv = 0;
+
+ return rv;
+}
+static int test_transactions(apr_pool_t* pool, apr_dbd_t* handle,
+ const apr_dbd_driver_t* driver)
+{
+ int rv = 0;
+ int nrows;
+ apr_dbd_transaction_t *trans = NULL;
+ const char* statement;
+
+ /* trans 1 - error out early */
+ printf("Transaction 1\n");
+ rv = apr_dbd_transaction_start(driver, pool, handle, &trans);
+ if (rv) {
+ printf("Start transaction failed!\n%s\n",
+ apr_dbd_error(driver, handle, rv));
+ return rv;
+ }
+ statement = "UPDATE apr_dbd_test SET col2 = 'failed'";
+ rv = apr_dbd_query(driver, handle, &nrows, statement);
+ if (rv) {
+ printf("Update failed: '%s'\n", apr_dbd_error(driver, handle, rv));
+ apr_dbd_transaction_end(driver, pool, trans);
+ return rv;
+ }
+ printf("%d rows updated\n", nrows);
+
+ statement = "INSERT INTO apr_dbd_test1 (col3) values (3)";
+ rv = apr_dbd_query(driver, handle, &nrows, statement);
+ if (!rv) {
+ printf("Oops, invalid op succeeded but shouldn't!\n");
+ }
+ statement = "INSERT INTO apr_dbd_test values ('zzz', 'aaa', 3)";
+ rv = apr_dbd_query(driver, handle, &nrows, statement);
+ printf("Valid insert returned %d. Should be nonzero (fail) because transaction is bad\n", rv) ;
+
+ rv = apr_dbd_transaction_end(driver, pool, trans);
+ if (rv) {
+ printf("End transaction failed!\n%s\n",
+ apr_dbd_error(driver, handle, rv));
+ return rv;
+ }
+ printf("Transaction ended (should be rollback) - viewing table\n"
+ "A column of \"failed\" indicates transaction failed (no rollback)\n");
+ select_sequential(pool, handle, driver);
+
+ /* trans 2 - complete successfully */
+ printf("Transaction 2\n");
+ rv = apr_dbd_transaction_start(driver, pool, handle, &trans);
+ if (rv) {
+ printf("Start transaction failed!\n%s\n",
+ apr_dbd_error(driver, handle, rv));
+ return rv;
+ }
+ statement = "UPDATE apr_dbd_test SET col2 = 'success'";
+ rv = apr_dbd_query(driver, handle, &nrows, statement);
+ if (rv) {
+ printf("Update failed: '%s'\n", apr_dbd_error(driver, handle, rv));
+ apr_dbd_transaction_end(driver, pool, trans);
+ return rv;
+ }
+ printf("%d rows updated\n", nrows);
+ statement = "INSERT INTO apr_dbd_test values ('aaa', 'zzz', 3)";
+ rv = apr_dbd_query(driver, handle, &nrows, statement);
+ printf("Valid insert returned %d. Should be zero (OK)\n", rv) ;
+ rv = apr_dbd_transaction_end(driver, pool, trans);
+ if (rv) {
+ printf("End transaction failed!\n%s\n",
+ apr_dbd_error(driver, handle, rv));
+ return rv;
+ }
+ printf("Transaction ended (should be commit) - viewing table\n");
+ select_sequential(pool, handle, driver);
+ return rv;
+}
+static int test_pselect(apr_pool_t* pool, apr_dbd_t* handle,
+ const apr_dbd_driver_t* driver)
+{
+ int rv = 0;
+ int i, n;
+ const char *query =
+ "SELECT * FROM apr_dbd_test WHERE col3 <= %s or col1 = 'bar'" ;
+ const char *label = "lowvalues";
+ apr_dbd_prepared_t *statement = NULL;
+ apr_dbd_results_t *res = NULL;
+ apr_dbd_row_t *row = NULL;
+ const char *entry = NULL;
+
+ rv = apr_dbd_prepare(driver, pool, handle, query, label, &statement);
+ if (rv) {
+ printf("Prepare statement failed!\n%s\n",
+ apr_dbd_error(driver, handle, rv));
+ return rv;
+ }
+ rv = apr_dbd_pvselect(driver, pool, handle, &res, statement, 0, "3", NULL);
+ if (rv) {
+ printf("Exec of prepared statement failed!\n%s\n",
+ apr_dbd_error(driver, handle, rv));
+ return rv;
+ }
+ i = 0;
+ printf("Selecting rows where col3 <= 3 and bar row where it's unset.\nShould show four rows.\n");
+ for (rv = apr_dbd_get_row(driver, pool, res, &row, -1);
+ rv == 0;
+ rv = apr_dbd_get_row(driver, pool, res, &row, -1)) {
+ printf("ROW %d: ", ++i) ;
+ for (n = 0; n < apr_dbd_num_cols(driver, res); ++n) {
+ entry = apr_dbd_get_entry(driver, row, n);
+ if (entry == NULL) {
+ printf("(null) ") ;
+ }
+ else {
+ printf("%s ", entry);
+ }
+ }
+ fputs("\n", stdout);
+ }
+ return (rv == -1) ? 0 : 1;
+}
+static int test_pquery(apr_pool_t* pool, apr_dbd_t* handle,
+ const apr_dbd_driver_t* driver)
+{
+ int rv = 0;
+ const char *query = "INSERT INTO apr_dbd_test VALUES (%s, %s, %d)";
+ apr_dbd_prepared_t *statement = NULL;
+ const char *label = "testpquery";
+ int nrows;
+ apr_dbd_transaction_t *trans =0;
+
+ rv = apr_dbd_prepare(driver, pool, handle, query, label, &statement);
+ /* rv = apr_dbd_prepare(driver, pool, handle, query, NULL, &statement); */
+ if (rv) {
+ printf("Prepare statement failed!\n%s\n",
+ apr_dbd_error(driver, handle, rv));
+ return rv;
+ }
+ apr_dbd_transaction_start(driver, pool, handle, &trans);
+ rv = apr_dbd_pvquery(driver, pool, handle, &nrows, statement,
+ "prepared", "insert", "2", NULL);
+ apr_dbd_transaction_end(driver, pool, trans);
+ if (rv) {
+ printf("Exec of prepared statement failed!\n%s\n",
+ apr_dbd_error(driver, handle, rv));
+ return rv;
+ }
+ printf("Showing table (should now contain row \"prepared insert 2\")\n");
+ select_sequential(pool, handle, driver);
+ return rv;
+}
+int main(int argc, char** argv)
+{
+ const char *name;
+ const char *params;
+ apr_pool_t *pool = NULL;
+ apr_dbd_t *sql = NULL;
+ const apr_dbd_driver_t *driver = NULL;
+ int rv;
+
+ apr_initialize();
+ apr_pool_create(&pool, NULL);
+
+ if (argc >= 2 && argc <= 3) {
+ name = argv[1];
+ params = ( argc == 3 ) ? argv[2] : "";
+ apr_dbd_init(pool);
+ setbuf(stdout,NULL);
+ rv = apr_dbd_get_driver(pool, name, &driver);
+ switch (rv) {
+ case APR_SUCCESS:
+ printf("Loaded %s driver OK.\n", name);
+ break;
+ case APR_EDSOOPEN:
+ printf("Failed to load driver file apr_dbd_%s.so\n", name);
+ goto finish;
+ case APR_ESYMNOTFOUND:
+ printf("Failed to load driver apr_dbd_%s_driver.\n", name);
+ goto finish;
+ case APR_ENOTIMPL:
+ printf("No driver available for %s.\n", name);
+ goto finish;
+ default: /* it's a bug if none of the above happen */
+ printf("Internal error loading %s.\n", name);
+ goto finish;
+ }
+ rv = apr_dbd_open(driver, pool, params, &sql);
+ switch (rv) {
+ case APR_SUCCESS:
+ printf("Opened %s[%s] OK\n", name, params);
+ break;
+ case APR_EGENERAL:
+ printf("Failed to open %s[%s]\n", name, params);
+ goto finish;
+ default: /* it's a bug if none of the above happen */
+ printf("Internal error opening %s[%s]\n", name, params);
+ goto finish;
+ }
+ TEST("create table", create_table);
+ TEST("insert rows", insert_rows);
+ TEST("invalid op", invalid_op);
+ TEST("select random", select_random);
+ TEST("select sequential", select_sequential);
+ TEST("transactions", test_transactions);
+ TEST("prepared select", test_pselect);
+ TEST("prepared query", test_pquery);
+ TEST("drop table", drop_table);
+ apr_dbd_close(driver, sql);
+ }
+ else {
+ fprintf(stderr, "Usage: %s driver-name [params]\n", argv[0]);
+ }
+finish:
+ apr_pool_destroy(pool);
+ apr_terminate();
+ return 0;
+}
diff --git a/contrib/apr-util/test/nw_misc.c b/contrib/apr-util/test/nw_misc.c
new file mode 100644
index 000000000000..b45f9516dcea
--- /dev/null
+++ b/contrib/apr-util/test/nw_misc.c
@@ -0,0 +1,23 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <screen.h>
+/*
+#include "testutil.h"
+*/
+
+/* function to keep the screen open if not launched from bash */
+void _NonAppStop( void )
+{
+ if (getenv("_IN_NETWARE_BASH_") == NULL) {
+ printf("\r\n<Press any key to close screen> ");
+ getcharacter();
+ }
+}
+
+/*
+static void test_not_impl(CuTest *tc)
+{
+ CuNotImpl(tc, "Test not implemented on this platform yet");
+}
+*/
+
diff --git a/contrib/apr-util/test/test_apu.h b/contrib/apr-util/test/test_apu.h
new file mode 100644
index 000000000000..642edec25681
--- /dev/null
+++ b/contrib/apr-util/test/test_apu.h
@@ -0,0 +1,100 @@
+/* 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.
+ */
+
+/* Some simple functions to make the test apps easier to write and
+ * a bit more consistent...
+ * this is a >copy< of apr_test.h
+ */
+
+/* Things to bear in mind when using these...
+ *
+ * If you include '\t' within the string passed in it won't be included
+ * in the spacing, so use spaces instead :)
+ *
+ */
+
+#ifndef APU_TEST_INCLUDES
+#define APU_TEST_INCLUDES
+
+#include "apr_strings.h"
+#include "apr_time.h"
+
+#define TEST_EQ(str, func, value, good, bad) \
+ printf("%-60s", str); \
+ { \
+ apr_status_t rv; \
+ if ((rv = func) == value){ \
+ char errmsg[200]; \
+ printf("%s\n", bad); \
+ fprintf(stderr, "Error was %d : %s\n", rv, \
+ apr_strerror(rv, (char*)&errmsg, 200)); \
+ exit(-1); \
+ } \
+ printf("%s\n", good); \
+ }
+
+#define TEST_NEQ(str, func, value, good, bad) \
+ printf("%-60s", str); \
+ { \
+ apr_status_t rv; \
+ if ((rv = func) != value){ \
+ char errmsg[200]; \
+ printf("%s\n", bad); \
+ fprintf(stderr, "Error was %d : %s\n", rv, \
+ apr_strerror(rv, (char*)&errmsg, 200)); \
+ exit(-1); \
+ } \
+ printf("%s\n", good); \
+ }
+
+#define TEST_STATUS(str, func, testmacro, good, bad) \
+ printf("%-60s", str); \
+ { \
+ apr_status_t rv = func; \
+ if (!testmacro(rv)) { \
+ char errmsg[200]; \
+ printf("%s\n", bad); \
+ fprintf(stderr, "Error was %d : %s\n", rv, \
+ apr_strerror(rv, (char*)&errmsg, 200)); \
+ exit(-1); \
+ } \
+ printf("%s\n", good); \
+ }
+
+#define STD_TEST_NEQ(str, func) \
+ TEST_NEQ(str, func, APR_SUCCESS, "OK", "Failed");
+
+#define PRINT_ERROR(rv) \
+ { \
+ char errmsg[200]; \
+ fprintf(stderr, "Error was %d : %s\n", rv, \
+ apr_strerror(rv, (char*)&errmsg, 200)); \
+ exit(-1); \
+ }
+
+#define MSG_AND_EXIT(msg) \
+ printf("%s\n", msg); \
+ exit (-1);
+
+#define TIME_FUNCTION(time, function) \
+ { \
+ apr_time_t tt = apr_time_now(); \
+ function; \
+ time = apr_time_now() - tt; \
+ }
+
+
+#endif /* APU_TEST_INCLUDES */
diff --git a/contrib/apr-util/test/testall.dsw b/contrib/apr-util/test/testall.dsw
new file mode 100644
index 000000000000..0a640c8be296
--- /dev/null
+++ b/contrib/apr-util/test/testall.dsw
@@ -0,0 +1,530 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "apr"="..\..\apr\apr.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "aprapp"="..\..\apr\build\aprapp.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name preaprapp
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "apr_dbd_freetds"="..\dbd\apr_dbd_freetds.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libaprutil
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "apr_dbd_mysql"="..\dbd\apr_dbd_mysql.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libaprutil
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "apr_dbd_odbc"="..\dbd\apr_dbd_odbc.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libaprutil
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "apr_dbd_oracle"="..\dbd\apr_dbd_oracle.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libaprutil
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "apr_dbd_pgsql"="..\dbd\apr_dbd_pgsql.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libaprutil
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "apr_dbd_sqlite2"="..\dbd\apr_dbd_sqlite2.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libaprutil
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "apr_dbd_sqlite3"="..\dbd\apr_dbd_sqlite3.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libaprutil
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "apr_dbm_db"="..\dbm\apr_dbm_db.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libaprutil
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "apr_dbm_gdbm"="..\dbm\apr_dbm_gdbm.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libaprutil
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "apr_ldap"="..\ldap\apr_ldap.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libaprutil
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "apriconv"="..\..\apr-iconv\apriconv.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name preapriconv
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "aprutil"="..\aprutil.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name preaprutil
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name apriconv
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name xml
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "libapr"="..\..\apr\libapr.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "libaprapp"="..\..\apr\build\libaprapp.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name prelibaprapp
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "libapriconv"="..\..\apr-iconv\libapriconv.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "libapriconv_ccs_modules"="..\..\apr-iconv\ccs\libapriconv_ccs_modules.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libapriconv
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "libapriconv_ces_modules"="..\..\apr-iconv\ces\libapriconv_ces_modules.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libapriconv
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "libaprutil"="..\libaprutil.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libaprapp
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libapriconv
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libapriconv_ccs_modules
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libapriconv_ces_modules
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name xml
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "preaprapp"="..\..\apr\build\preaprapp.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name apr
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "preapriconv"="..\..\apr-iconv\build\preapriconv.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name apr
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "preaprutil"="..\build\preaprutil.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name apr
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name aprapp
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "prelibaprapp"="..\..\apr\build\prelibaprapp.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "testdll"="..\..\apr\test\testdll.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name apr_ldap
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libaprapp
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "testlib"="..\..\apr\test\testlib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name apr
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name aprapp
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "testutildll"=".\testutildll.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libapr
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libaprapp
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libapriconv
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libaprutil
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "testutillib"=".\testutillib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name apr
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name aprapp
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name apriconv
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name aprutil
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "xml"="..\xml\expat\lib\xml.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/contrib/apr-util/test/testbuckets.c b/contrib/apr-util/test/testbuckets.c
new file mode 100644
index 000000000000..3d0d46d0a5b4
--- /dev/null
+++ b/contrib/apr-util/test/testbuckets.c
@@ -0,0 +1,535 @@
+/* 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 "abts.h"
+#include "testutil.h"
+#include "apr_buckets.h"
+#include "apr_strings.h"
+
+static void test_create(abts_case *tc, void *data)
+{
+ apr_bucket_alloc_t *ba;
+ apr_bucket_brigade *bb;
+
+ ba = apr_bucket_alloc_create(p);
+ bb = apr_brigade_create(p, ba);
+
+ ABTS_ASSERT(tc, "new brigade not NULL", bb != NULL);
+ ABTS_ASSERT(tc, "new brigade is empty", APR_BRIGADE_EMPTY(bb));
+
+ apr_brigade_destroy(bb);
+ apr_bucket_alloc_destroy(ba);
+}
+
+static void test_simple(abts_case *tc, void *data)
+{
+ apr_bucket_alloc_t *ba;
+ apr_bucket_brigade *bb;
+ apr_bucket *fb, *tb;
+
+ ba = apr_bucket_alloc_create(p);
+ bb = apr_brigade_create(p, ba);
+
+ fb = APR_BRIGADE_FIRST(bb);
+ ABTS_ASSERT(tc, "first bucket of empty brigade is sentinel",
+ fb == APR_BRIGADE_SENTINEL(bb));
+
+ fb = apr_bucket_flush_create(ba);
+ APR_BRIGADE_INSERT_HEAD(bb, fb);
+
+ ABTS_ASSERT(tc, "first bucket of brigade is flush",
+ APR_BRIGADE_FIRST(bb) == fb);
+
+ ABTS_ASSERT(tc, "bucket after flush is sentinel",
+ APR_BUCKET_NEXT(fb) == APR_BRIGADE_SENTINEL(bb));
+
+ tb = apr_bucket_transient_create("aaa", 3, ba);
+ APR_BUCKET_INSERT_BEFORE(fb, tb);
+
+ ABTS_ASSERT(tc, "bucket before flush now transient",
+ APR_BUCKET_PREV(fb) == tb);
+ ABTS_ASSERT(tc, "bucket after transient is flush",
+ APR_BUCKET_NEXT(tb) == fb);
+ ABTS_ASSERT(tc, "bucket before transient is sentinel",
+ APR_BUCKET_PREV(tb) == APR_BRIGADE_SENTINEL(bb));
+
+ apr_brigade_cleanup(bb);
+
+ ABTS_ASSERT(tc, "cleaned up brigade was empty", APR_BRIGADE_EMPTY(bb));
+
+ apr_brigade_destroy(bb);
+ apr_bucket_alloc_destroy(ba);
+}
+
+static apr_bucket_brigade *make_simple_brigade(apr_bucket_alloc_t *ba,
+ const char *first,
+ const char *second)
+{
+ apr_bucket_brigade *bb = apr_brigade_create(p, ba);
+ apr_bucket *e;
+
+ e = apr_bucket_transient_create(first, strlen(first), ba);
+ APR_BRIGADE_INSERT_TAIL(bb, e);
+
+ e = apr_bucket_transient_create(second, strlen(second), ba);
+ APR_BRIGADE_INSERT_TAIL(bb, e);
+
+ return bb;
+}
+
+/* tests that 'bb' flattens to string 'expect'. */
+static void flatten_match(abts_case *tc, const char *ctx,
+ apr_bucket_brigade *bb,
+ const char *expect)
+{
+ apr_size_t elen = strlen(expect);
+ char *buf = malloc(elen);
+ apr_size_t len = elen;
+ char msg[200];
+
+ sprintf(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);
+ ABTS_ASSERT(tc, msg, len == elen);
+ sprintf(msg, "%s: result match", msg);
+ ABTS_STR_NEQUAL(tc, expect, buf, len);
+ free(buf);
+}
+
+static void test_flatten(abts_case *tc, void *data)
+{
+ apr_bucket_alloc_t *ba = apr_bucket_alloc_create(p);
+ apr_bucket_brigade *bb;
+
+ bb = make_simple_brigade(ba, "hello, ", "world");
+
+ flatten_match(tc, "flatten brigade", bb, "hello, world");
+
+ apr_brigade_destroy(bb);
+ apr_bucket_alloc_destroy(ba);
+}
+
+static int count_buckets(apr_bucket_brigade *bb)
+{
+ apr_bucket *e;
+ int count = 0;
+
+ for (e = APR_BRIGADE_FIRST(bb);
+ e != APR_BRIGADE_SENTINEL(bb);
+ e = APR_BUCKET_NEXT(e)) {
+ count++;
+ }
+
+ return count;
+}
+
+static void test_split(abts_case *tc, void *data)
+{
+ apr_bucket_alloc_t *ba = apr_bucket_alloc_create(p);
+ apr_bucket_brigade *bb, *bb2;
+ apr_bucket *e;
+
+ bb = make_simple_brigade(ba, "hello, ", "world");
+
+ /* split at the "world" bucket */
+ e = APR_BRIGADE_LAST(bb);
+ bb2 = apr_brigade_split(bb, e);
+
+ ABTS_ASSERT(tc, "split brigade contains one bucket",
+ count_buckets(bb2) == 1);
+ ABTS_ASSERT(tc, "original brigade contains one bucket",
+ count_buckets(bb) == 1);
+
+ flatten_match(tc, "match original brigade", bb, "hello, ");
+ flatten_match(tc, "match split brigade", bb2, "world");
+
+ apr_brigade_destroy(bb2);
+ apr_brigade_destroy(bb);
+ apr_bucket_alloc_destroy(ba);
+}
+
+#define COUNT 3000
+#define THESTR "hello"
+
+static void test_bwrite(abts_case *tc, void *data)
+{
+ apr_bucket_alloc_t *ba = apr_bucket_alloc_create(p);
+ apr_bucket_brigade *bb = apr_brigade_create(p, ba);
+ apr_off_t length;
+ int n;
+
+ for (n = 0; n < COUNT; n++) {
+ apr_assert_success(tc, "brigade_write",
+ apr_brigade_write(bb, NULL, NULL,
+ THESTR, sizeof THESTR));
+ }
+
+ apr_assert_success(tc, "determine brigade length",
+ apr_brigade_length(bb, 1, &length));
+
+ ABTS_ASSERT(tc, "brigade has correct length",
+ length == (COUNT * sizeof THESTR));
+
+ apr_brigade_destroy(bb);
+ apr_bucket_alloc_destroy(ba);
+}
+
+static void test_splitline(abts_case *tc, void *data)
+{
+ apr_bucket_alloc_t *ba = apr_bucket_alloc_create(p);
+ apr_bucket_brigade *bin, *bout;
+
+ bin = make_simple_brigade(ba, "blah blah blah-",
+ "end of line.\nfoo foo foo");
+ bout = apr_brigade_create(p, ba);
+
+ apr_assert_success(tc, "split line",
+ apr_brigade_split_line(bout, bin,
+ APR_BLOCK_READ, 100));
+
+ flatten_match(tc, "split line", bout, "blah blah blah-end of line.\n");
+ flatten_match(tc, "remainder", bin, "foo foo foo");
+
+ apr_brigade_destroy(bout);
+ apr_brigade_destroy(bin);
+ apr_bucket_alloc_destroy(ba);
+}
+
+/* Test that bucket E has content EDATA of length ELEN. */
+static void test_bucket_content(abts_case *tc,
+ apr_bucket *e,
+ const char *edata,
+ apr_size_t elen)
+{
+ const char *adata;
+ apr_size_t alen;
+
+ apr_assert_success(tc, "read from bucket",
+ apr_bucket_read(e, &adata, &alen,
+ APR_BLOCK_READ));
+
+ ABTS_ASSERT(tc, "read expected length", alen == elen);
+ ABTS_STR_NEQUAL(tc, edata, adata, elen);
+}
+
+static void test_splits(abts_case *tc, void *ctx)
+{
+ apr_bucket_alloc_t *ba = apr_bucket_alloc_create(p);
+ apr_bucket_brigade *bb;
+ apr_bucket *e;
+ char *str = "alphabeta";
+ int n;
+
+ bb = apr_brigade_create(p, ba);
+
+ APR_BRIGADE_INSERT_TAIL(bb,
+ apr_bucket_immortal_create(str, 9, ba));
+ APR_BRIGADE_INSERT_TAIL(bb,
+ apr_bucket_transient_create(str, 9, ba));
+ APR_BRIGADE_INSERT_TAIL(bb,
+ apr_bucket_heap_create(strdup(str), 9, free, ba));
+ APR_BRIGADE_INSERT_TAIL(bb,
+ apr_bucket_pool_create(apr_pstrdup(p, str), 9, p,
+ ba));
+
+ ABTS_ASSERT(tc, "four buckets inserted", count_buckets(bb) == 4);
+
+ /* now split each of the buckets after byte 5 */
+ for (n = 0, e = APR_BRIGADE_FIRST(bb); n < 4; n++) {
+ ABTS_ASSERT(tc, "reached end of brigade",
+ e != APR_BRIGADE_SENTINEL(bb));
+ ABTS_ASSERT(tc, "split bucket OK",
+ apr_bucket_split(e, 5) == APR_SUCCESS);
+ e = APR_BUCKET_NEXT(e);
+ ABTS_ASSERT(tc, "split OK", e != APR_BRIGADE_SENTINEL(bb));
+ e = APR_BUCKET_NEXT(e);
+ }
+
+ ABTS_ASSERT(tc, "four buckets split into eight",
+ count_buckets(bb) == 8);
+
+ for (n = 0, e = APR_BRIGADE_FIRST(bb); n < 4; n++) {
+ const char *data;
+ apr_size_t len;
+
+ apr_assert_success(tc, "read alpha from bucket",
+ apr_bucket_read(e, &data, &len, APR_BLOCK_READ));
+ ABTS_ASSERT(tc, "read 5 bytes", len == 5);
+ ABTS_STR_NEQUAL(tc, "alpha", data, 5);
+
+ e = APR_BUCKET_NEXT(e);
+
+ apr_assert_success(tc, "read beta from bucket",
+ apr_bucket_read(e, &data, &len, APR_BLOCK_READ));
+ ABTS_ASSERT(tc, "read 4 bytes", len == 4);
+ ABTS_STR_NEQUAL(tc, "beta", data, 5);
+
+ e = APR_BUCKET_NEXT(e);
+ }
+
+ /* now delete the "alpha" buckets */
+ for (n = 0, e = APR_BRIGADE_FIRST(bb); n < 4; n++) {
+ apr_bucket *f;
+
+ ABTS_ASSERT(tc, "reached end of brigade",
+ e != APR_BRIGADE_SENTINEL(bb));
+ f = APR_BUCKET_NEXT(e);
+ apr_bucket_delete(e);
+ e = APR_BUCKET_NEXT(f);
+ }
+
+ ABTS_ASSERT(tc, "eight buckets reduced to four",
+ count_buckets(bb) == 4);
+
+ flatten_match(tc, "flatten beta brigade", bb,
+ "beta" "beta" "beta" "beta");
+
+ apr_brigade_destroy(bb);
+ apr_bucket_alloc_destroy(ba);
+}
+
+#define TIF_FNAME "testfile.txt"
+
+static void test_insertfile(abts_case *tc, void *ctx)
+{
+ apr_bucket_alloc_t *ba = apr_bucket_alloc_create(p);
+ apr_bucket_brigade *bb;
+ const apr_off_t bignum = (APR_INT64_C(2) << 32) + 424242;
+ apr_off_t count;
+ apr_file_t *f;
+ apr_bucket *e;
+
+ ABTS_ASSERT(tc, "open test file",
+ apr_file_open(&f, TIF_FNAME,
+ APR_FOPEN_WRITE | APR_FOPEN_TRUNCATE
+ | APR_FOPEN_CREATE | APR_FOPEN_SPARSE,
+ APR_OS_DEFAULT, p) == APR_SUCCESS);
+
+ if (apr_file_trunc(f, bignum)) {
+ apr_file_close(f);
+ apr_file_remove(TIF_FNAME, p);
+ ABTS_NOT_IMPL(tc, "Skipped: could not create large file");
+ return;
+ }
+
+ bb = apr_brigade_create(p, ba);
+
+ e = apr_brigade_insert_file(bb, f, 0, bignum, p);
+
+ ABTS_ASSERT(tc, "inserted file was not at end of brigade",
+ e == APR_BRIGADE_LAST(bb));
+
+ /* check that the total size of inserted buckets is equal to the
+ * total size of the file. */
+ count = 0;
+
+ for (e = APR_BRIGADE_FIRST(bb);
+ e != APR_BRIGADE_SENTINEL(bb);
+ e = APR_BUCKET_NEXT(e)) {
+ ABTS_ASSERT(tc, "bucket size sane", e->length != (apr_size_t)-1);
+ count += e->length;
+ }
+
+ ABTS_ASSERT(tc, "total size of buckets incorrect", count == bignum);
+
+ apr_brigade_destroy(bb);
+
+ /* Truncate the file to zero size before close() so that we don't
+ * actually write out the large file if we are on a non-sparse file
+ * system - like Mac OS X's HFS. Otherwise, pity the poor user who
+ * has to wait for the 8GB file to be written to disk.
+ */
+ apr_file_trunc(f, 0);
+
+ apr_file_close(f);
+ apr_bucket_alloc_destroy(ba);
+ apr_file_remove(TIF_FNAME, p);
+}
+
+/* Make a test file named FNAME, and write CONTENTS to it. */
+static apr_file_t *make_test_file(abts_case *tc, const char *fname,
+ const char *contents)
+{
+ apr_file_t *f;
+
+ ABTS_ASSERT(tc, "create test file",
+ apr_file_open(&f, fname,
+ APR_FOPEN_READ|APR_FOPEN_WRITE|APR_FOPEN_TRUNCATE|APR_FOPEN_CREATE,
+ APR_OS_DEFAULT, p) == APR_SUCCESS);
+
+ ABTS_ASSERT(tc, "write test file contents",
+ apr_file_puts(contents, f) == APR_SUCCESS);
+
+ return f;
+}
+
+static void test_manyfile(abts_case *tc, void *data)
+{
+ apr_bucket_alloc_t *ba = apr_bucket_alloc_create(p);
+ apr_bucket_brigade *bb = apr_brigade_create(p, ba);
+ apr_file_t *f;
+
+ f = make_test_file(tc, "manyfile.bin",
+ "world" "hello" "brave" " ,\n");
+
+ apr_brigade_insert_file(bb, f, 5, 5, p);
+ apr_brigade_insert_file(bb, f, 16, 1, p);
+ apr_brigade_insert_file(bb, f, 15, 1, p);
+ apr_brigade_insert_file(bb, f, 10, 5, p);
+ apr_brigade_insert_file(bb, f, 15, 1, p);
+ apr_brigade_insert_file(bb, f, 0, 5, p);
+ apr_brigade_insert_file(bb, f, 17, 1, p);
+
+ /* can you tell what it is yet? */
+ flatten_match(tc, "file seek test", bb,
+ "hello, brave world\n");
+
+ apr_file_close(f);
+ apr_brigade_destroy(bb);
+ apr_bucket_alloc_destroy(ba);
+}
+
+/* Regression test for PR 34708, where a file bucket will keep
+ * duplicating itself on being read() when EOF is reached
+ * prematurely. */
+static void test_truncfile(abts_case *tc, void *data)
+{
+ apr_bucket_alloc_t *ba = apr_bucket_alloc_create(p);
+ apr_bucket_brigade *bb = apr_brigade_create(p, ba);
+ apr_file_t *f = make_test_file(tc, "testfile.txt", "hello");
+ apr_bucket *e;
+ const char *buf;
+ apr_size_t len;
+
+ apr_brigade_insert_file(bb, f, 0, 5, p);
+
+ apr_file_trunc(f, 0);
+
+ e = APR_BRIGADE_FIRST(bb);
+
+ ABTS_ASSERT(tc, "single bucket in brigade",
+ APR_BUCKET_NEXT(e) == APR_BRIGADE_SENTINEL(bb));
+
+ apr_bucket_file_enable_mmap(e, 0);
+
+ ABTS_ASSERT(tc, "read gave APR_EOF",
+ apr_bucket_read(e, &buf, &len, APR_BLOCK_READ) == APR_EOF);
+
+ ABTS_ASSERT(tc, "read length 0", len == 0);
+
+ ABTS_ASSERT(tc, "still a single bucket in brigade",
+ APR_BUCKET_NEXT(e) == APR_BRIGADE_SENTINEL(bb));
+
+ apr_file_close(f);
+ apr_brigade_destroy(bb);
+ apr_bucket_alloc_destroy(ba);
+}
+
+static const char hello[] = "hello, world";
+
+static void test_partition(abts_case *tc, void *data)
+{
+ apr_bucket_alloc_t *ba = apr_bucket_alloc_create(p);
+ apr_bucket_brigade *bb = apr_brigade_create(p, ba);
+ apr_bucket *e;
+
+ e = apr_bucket_immortal_create(hello, strlen(hello), ba);
+ APR_BRIGADE_INSERT_HEAD(bb, e);
+
+ apr_assert_success(tc, "partition brigade",
+ apr_brigade_partition(bb, 5, &e));
+
+ test_bucket_content(tc, APR_BRIGADE_FIRST(bb),
+ "hello", 5);
+
+ test_bucket_content(tc, APR_BRIGADE_LAST(bb),
+ ", world", 7);
+
+ ABTS_ASSERT(tc, "partition returns APR_INCOMPLETE",
+ apr_brigade_partition(bb, 8192, &e));
+
+ ABTS_ASSERT(tc, "APR_INCOMPLETE partition returned sentinel",
+ e == APR_BRIGADE_SENTINEL(bb));
+
+ apr_brigade_destroy(bb);
+ apr_bucket_alloc_destroy(ba);
+}
+
+static void test_write_split(abts_case *tc, void *data)
+{
+ apr_bucket_alloc_t *ba = apr_bucket_alloc_create(p);
+ apr_bucket_brigade *bb1 = apr_brigade_create(p, ba);
+ apr_bucket_brigade *bb2;
+ apr_bucket *e;
+
+ e = apr_bucket_heap_create(hello, strlen(hello), NULL, ba);
+ APR_BRIGADE_INSERT_HEAD(bb1, e);
+ apr_bucket_split(e, strlen("hello, "));
+ bb2 = apr_brigade_split(bb1, APR_BRIGADE_LAST(bb1));
+ apr_brigade_write(bb1, NULL, NULL, "foo", strlen("foo"));
+ test_bucket_content(tc, APR_BRIGADE_FIRST(bb2), "world", 5);
+
+ apr_brigade_destroy(bb1);
+ apr_brigade_destroy(bb2);
+ apr_bucket_alloc_destroy(ba);
+}
+
+static void test_write_putstrs(abts_case *tc, void *data)
+{
+ apr_bucket_alloc_t *ba = apr_bucket_alloc_create(p);
+ apr_bucket_brigade *bb = apr_brigade_create(p, ba);
+ apr_bucket *e;
+ char buf[30];
+ apr_size_t len = sizeof(buf);
+ const char *expect = "123456789abcdefghij";
+
+ e = apr_bucket_heap_create("1", 1, NULL, ba);
+ APR_BRIGADE_INSERT_HEAD(bb, e);
+
+ apr_brigade_putstrs(bb, NULL, NULL, "2", "34", "567", "8", "9a", "bcd",
+ "e", "f", "gh", "i", NULL);
+ apr_brigade_putstrs(bb, NULL, NULL, "j", NULL);
+ apr_assert_success(tc, "apr_brigade_flatten",
+ apr_brigade_flatten(bb, buf, &len));
+ ABTS_STR_NEQUAL(tc, expect, buf, strlen(expect));
+
+ apr_brigade_destroy(bb);
+ apr_bucket_alloc_destroy(ba);
+}
+
+abts_suite *testbuckets(abts_suite *suite)
+{
+ suite = ADD_SUITE(suite);
+
+ abts_run_test(suite, test_create, NULL);
+ abts_run_test(suite, test_simple, NULL);
+ abts_run_test(suite, test_flatten, NULL);
+ abts_run_test(suite, test_split, NULL);
+ abts_run_test(suite, test_bwrite, NULL);
+ abts_run_test(suite, test_splitline, NULL);
+ abts_run_test(suite, test_splits, NULL);
+ abts_run_test(suite, test_insertfile, NULL);
+ abts_run_test(suite, test_manyfile, NULL);
+ abts_run_test(suite, test_truncfile, NULL);
+ abts_run_test(suite, test_partition, NULL);
+ abts_run_test(suite, test_write_split, NULL);
+ abts_run_test(suite, test_write_putstrs, NULL);
+
+ return suite;
+}
+
+
diff --git a/contrib/apr-util/test/testcrypto.c b/contrib/apr-util/test/testcrypto.c
new file mode 100644
index 000000000000..335c3ae65d77
--- /dev/null
+++ b/contrib/apr-util/test/testcrypto.c
@@ -0,0 +1,888 @@
+/* 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 "testutil.h"
+#include "apr.h"
+#include "apu.h"
+#include "apu_errno.h"
+#include "apr_pools.h"
+#include "apr_dso.h"
+#include "apr_crypto.h"
+#include "apr_strings.h"
+
+#if APU_HAVE_CRYPTO
+
+#define TEST_STRING "12345"
+#define ALIGNED_STRING "123456789012345"
+
+static const apr_crypto_driver_t *get_driver(abts_case *tc, apr_pool_t *pool,
+ const char *name, const char *params)
+{
+
+ const apr_crypto_driver_t *driver = NULL;
+ const apu_err_t *err = NULL;
+ apr_status_t rv;
+
+ rv = apr_crypto_init(pool);
+ ABTS_ASSERT(tc, "failed to init apr_crypto", rv == APR_SUCCESS);
+
+ rv = apr_crypto_get_driver(&driver, name, params, &err, pool);
+ if (APR_SUCCESS != rv && err) {
+ ABTS_NOT_IMPL(tc, err->msg);
+ return NULL;
+ }
+ if (APR_ENOTIMPL == rv) {
+ ABTS_NOT_IMPL(tc, (char *)driver);
+ return NULL;
+ }
+ ABTS_ASSERT(tc, "failed to apr_crypto_get_driver", rv == APR_SUCCESS);
+ ABTS_ASSERT(tc, "apr_crypto_get_driver returned NULL", driver != NULL);
+ if (!driver || rv) {
+ return NULL;
+ }
+
+ return driver;
+
+}
+
+static const apr_crypto_driver_t *get_nss_driver(abts_case *tc,
+ apr_pool_t *pool)
+{
+
+ /* initialise NSS */
+ return get_driver(tc, pool, "nss", "dir=data");
+
+}
+
+static const apr_crypto_driver_t *get_openssl_driver(abts_case *tc,
+ apr_pool_t *pool)
+{
+
+ return get_driver(tc, pool, "openssl", NULL);
+
+}
+
+static apr_crypto_t *make(abts_case *tc, apr_pool_t *pool,
+ const apr_crypto_driver_t *driver)
+{
+
+ apr_crypto_t *f = NULL;
+
+ if (!driver) {
+ return NULL;
+ }
+
+ /* get the context */
+ apr_crypto_make(&f, driver, "engine=openssl", pool);
+ ABTS_ASSERT(tc, "apr_crypto_make returned NULL", f != NULL);
+
+ return f;
+
+}
+
+static const apr_crypto_key_t *passphrase(abts_case *tc, apr_pool_t *pool,
+ const apr_crypto_driver_t *driver, const apr_crypto_t *f,
+ apr_crypto_block_key_type_e type, apr_crypto_block_key_mode_e mode,
+ int doPad, const char *description)
+{
+
+ apr_crypto_key_t *key = NULL;
+ const apu_err_t *result = NULL;
+ const char *pass = "secret";
+ const char *salt = "salt";
+ apr_status_t rv;
+
+ if (!f) {
+ return NULL;
+ }
+
+ /* init the passphrase */
+ rv = apr_crypto_passphrase(&key, NULL, pass, strlen(pass),
+ (unsigned char *) salt, strlen(salt), type, mode, doPad, 4096, f,
+ pool);
+ if (APR_ENOCIPHER == rv) {
+ apr_crypto_error(&result, f);
+ ABTS_NOT_IMPL(tc, apr_psprintf(pool,
+ "skipped: %s %s passphrase return APR_ENOCIPHER: error %d: %s (%s)\n",
+ description, apr_crypto_driver_name(driver), result->rc,
+ result->reason ? result->reason : "", result->msg ? result->msg : ""));
+ return NULL;
+ }
+ else {
+ if (APR_SUCCESS != rv) {
+ apr_crypto_error(&result, f);
+ fprintf(stderr, "passphrase: %s %s native error %d: %s (%s)\n",
+ description, apr_crypto_driver_name(driver), result->rc,
+ result->reason ? result->reason : "",
+ result->msg ? result->msg : "");
+ }
+ ABTS_ASSERT(tc, "apr_crypto_passphrase returned APR_ENOKEY", rv != APR_ENOKEY);
+ ABTS_ASSERT(tc, "apr_crypto_passphrase returned APR_EPADDING", rv != APR_EPADDING);
+ ABTS_ASSERT(tc, "apr_crypto_passphrase returned APR_EKEYTYPE", rv != APR_EKEYTYPE);
+ ABTS_ASSERT(tc, "failed to apr_crypto_passphrase", rv == APR_SUCCESS);
+ ABTS_ASSERT(tc, "apr_crypto_passphrase returned NULL context", key != NULL);
+ }
+ if (rv) {
+ return NULL;
+ }
+ return key;
+
+}
+
+static unsigned char *encrypt_block(abts_case *tc, apr_pool_t *pool,
+ const apr_crypto_driver_t *driver, const apr_crypto_t *f,
+ const apr_crypto_key_t *key, const unsigned char *in,
+ const apr_size_t inlen, unsigned char **cipherText,
+ apr_size_t *cipherTextLen, const unsigned char **iv,
+ apr_size_t *blockSize, const char *description)
+{
+
+ apr_crypto_block_t *block = NULL;
+ const apu_err_t *result = NULL;
+ apr_size_t len = 0;
+ apr_status_t rv;
+
+ if (!driver || !f || !key || !in) {
+ return NULL;
+ }
+
+ /* init the encryption */
+ rv = apr_crypto_block_encrypt_init(&block, iv, key, blockSize, pool);
+ if (APR_ENOTIMPL == rv) {
+ ABTS_NOT_IMPL(tc, "apr_crypto_block_encrypt_init returned APR_ENOTIMPL");
+ }
+ else {
+ if (APR_SUCCESS != rv) {
+ apr_crypto_error(&result, f);
+ fprintf(stderr, "encrypt_init: %s %s native error %d: %s (%s)\n",
+ description, apr_crypto_driver_name(driver), result->rc,
+ result->reason ? result->reason : "",
+ result->msg ? result->msg : "");
+ }
+ ABTS_ASSERT(tc, "apr_crypto_block_encrypt_init returned APR_ENOKEY", rv != APR_ENOKEY);
+ ABTS_ASSERT(tc, "apr_crypto_block_encrypt_init returned APR_ENOIV", rv != APR_ENOIV);
+ ABTS_ASSERT(tc, "apr_crypto_block_encrypt_init returned APR_EKEYTYPE", rv != APR_EKEYTYPE);
+ ABTS_ASSERT(tc, "apr_crypto_block_encrypt_init returned APR_EKEYLENGTH", rv != APR_EKEYLENGTH);
+ ABTS_ASSERT(tc, "failed to apr_crypto_block_encrypt_init", rv == APR_SUCCESS);
+ ABTS_ASSERT(tc, "apr_crypto_block_encrypt_init returned NULL context", block != NULL);
+ }
+ if (!block || rv) {
+ return NULL;
+ }
+
+ /* encrypt the block */
+ rv = apr_crypto_block_encrypt(cipherText, cipherTextLen, in, inlen, block);
+ if (APR_SUCCESS != rv) {
+ apr_crypto_error(&result, f);
+ fprintf(stderr, "encrypt: %s %s native error %d: %s (%s)\n",
+ description, apr_crypto_driver_name(driver), result->rc,
+ result->reason ? result->reason : "", result->msg ? result->msg
+ : "");
+ }
+ ABTS_ASSERT(tc, "apr_crypto_block_encrypt returned APR_ECRYPT", rv != APR_ECRYPT);
+ ABTS_ASSERT(tc, "failed to apr_crypto_block_encrypt", rv == APR_SUCCESS);
+ ABTS_ASSERT(tc, "apr_crypto_block_encrypt failed to allocate buffer", *cipherText != NULL);
+ if (rv) {
+ return NULL;
+ }
+
+ /* finalise the encryption */
+ rv = apr_crypto_block_encrypt_finish(*cipherText + *cipherTextLen, &len,
+ block);
+ if (APR_SUCCESS != rv) {
+ apr_crypto_error(&result, f);
+ fprintf(stderr, "encrypt_finish: %s %s native error %d: %s (%s)\n",
+ description, apr_crypto_driver_name(driver), result->rc,
+ result->reason ? result->reason : "", result->msg ? result->msg
+ : "");
+ }
+ ABTS_ASSERT(tc, "apr_crypto_block_encrypt_finish returned APR_ECRYPT", rv != APR_ECRYPT);
+ ABTS_ASSERT(tc, "apr_crypto_block_encrypt_finish returned APR_EPADDING", rv != APR_EPADDING);
+ ABTS_ASSERT(tc, "failed to apr_crypto_block_encrypt_finish", rv == APR_SUCCESS);
+ *cipherTextLen += len;
+ apr_crypto_block_cleanup(block);
+ if (rv) {
+ return NULL;
+ }
+
+ return *cipherText;
+
+}
+
+static unsigned char *decrypt_block(abts_case *tc, apr_pool_t *pool,
+ const apr_crypto_driver_t *driver, const apr_crypto_t *f,
+ const apr_crypto_key_t *key, unsigned char *cipherText,
+ apr_size_t cipherTextLen, unsigned char **plainText,
+ apr_size_t *plainTextLen, const unsigned char *iv,
+ apr_size_t *blockSize, const char *description)
+{
+
+ apr_crypto_block_t *block = NULL;
+ const apu_err_t *result = NULL;
+ apr_size_t len = 0;
+ apr_status_t rv;
+
+ if (!driver || !f || !key || !cipherText) {
+ return NULL;
+ }
+
+ /* init the decryption */
+ rv = apr_crypto_block_decrypt_init(&block, blockSize, iv, key, pool);
+ if (APR_ENOTIMPL == rv) {
+ ABTS_NOT_IMPL(tc, "apr_crypto_block_decrypt_init returned APR_ENOTIMPL");
+ }
+ else {
+ if (APR_SUCCESS != rv) {
+ apr_crypto_error(&result, f);
+ fprintf(stderr, "decrypt_init: %s %s native error %d: %s (%s)\n",
+ description, apr_crypto_driver_name(driver), result->rc,
+ result->reason ? result->reason : "",
+ result->msg ? result->msg : "");
+ }
+ ABTS_ASSERT(tc, "apr_crypto_block_decrypt_init returned APR_ENOKEY", rv != APR_ENOKEY);
+ ABTS_ASSERT(tc, "apr_crypto_block_decrypt_init returned APR_ENOIV", rv != APR_ENOIV);
+ ABTS_ASSERT(tc, "apr_crypto_block_decrypt_init returned APR_EKEYTYPE", rv != APR_EKEYTYPE);
+ ABTS_ASSERT(tc, "apr_crypto_block_decrypt_init returned APR_EKEYLENGTH", rv != APR_EKEYLENGTH);
+ ABTS_ASSERT(tc, "failed to apr_crypto_block_decrypt_init", rv == APR_SUCCESS);
+ ABTS_ASSERT(tc, "apr_crypto_block_decrypt_init returned NULL context", block != NULL);
+ }
+ if (!block || rv) {
+ return NULL;
+ }
+
+ /* decrypt the block */
+ rv = apr_crypto_block_decrypt(plainText, plainTextLen, cipherText,
+ cipherTextLen, block);
+ if (APR_SUCCESS != rv) {
+ apr_crypto_error(&result, f);
+ fprintf(stderr, "decrypt: %s %s native error %d: %s (%s)\n",
+ description, apr_crypto_driver_name(driver), result->rc,
+ result->reason ? result->reason : "", result->msg ? result->msg
+ : "");
+ }
+ ABTS_ASSERT(tc, "apr_crypto_block_decrypt returned APR_ECRYPT", rv != APR_ECRYPT);
+ ABTS_ASSERT(tc, "failed to apr_crypto_block_decrypt", rv == APR_SUCCESS);
+ ABTS_ASSERT(tc, "apr_crypto_block_decrypt failed to allocate buffer", *plainText != NULL);
+ if (rv) {
+ return NULL;
+ }
+
+ /* finalise the decryption */
+ rv = apr_crypto_block_decrypt_finish(*plainText + *plainTextLen, &len,
+ block);
+ if (APR_SUCCESS != rv) {
+ apr_crypto_error(&result, f);
+ fprintf(stderr, "decrypt_finish: %s %s native error %d: %s (%s)\n",
+ description, apr_crypto_driver_name(driver), result->rc,
+ result->reason ? result->reason : "", result->msg ? result->msg
+ : "");
+ }
+ ABTS_ASSERT(tc, "apr_crypto_block_decrypt_finish returned APR_ECRYPT", rv != APR_ECRYPT);
+ ABTS_ASSERT(tc, "apr_crypto_block_decrypt_finish returned APR_EPADDING", rv != APR_EPADDING);
+ ABTS_ASSERT(tc, "failed to apr_crypto_block_decrypt_finish", rv == APR_SUCCESS);
+ if (rv) {
+ return NULL;
+ }
+
+ *plainTextLen += len;
+ apr_crypto_block_cleanup(block);
+
+ return *plainText;
+
+}
+
+/**
+ * Interoperability test.
+ *
+ * data must point at an array of two driver structures. Data will be encrypted
+ * with the first driver, and decrypted with the second.
+ *
+ * If the two drivers interoperate, the test passes.
+ */
+static void crypto_block_cross(abts_case *tc, apr_pool_t *pool,
+ const apr_crypto_driver_t **drivers,
+ const apr_crypto_block_key_type_e type,
+ const apr_crypto_block_key_mode_e mode, int doPad,
+ const unsigned char *in, apr_size_t inlen, const char *description)
+{
+ const apr_crypto_driver_t *driver1 = drivers[0];
+ const apr_crypto_driver_t *driver2 = drivers[1];
+ apr_crypto_t *f1 = NULL;
+ apr_crypto_t *f2 = NULL;
+ const apr_crypto_key_t *key1 = NULL;
+ const apr_crypto_key_t *key2 = NULL;
+
+ unsigned char *cipherText = NULL;
+ apr_size_t cipherTextLen = 0;
+ unsigned char *plainText = NULL;
+ apr_size_t plainTextLen = 0;
+ const unsigned char *iv = NULL;
+ apr_size_t blockSize = 0;
+
+ f1 = make(tc, pool, driver1);
+ f2 = make(tc, pool, driver2);
+ key1 = passphrase(tc, pool, driver1, f1, type, mode, doPad, description);
+ key2 = passphrase(tc, pool, driver2, f2, type, mode, doPad, description);
+
+ cipherText = encrypt_block(tc, pool, driver1, f1, key1, in, inlen,
+ &cipherText, &cipherTextLen, &iv, &blockSize, description);
+ plainText = decrypt_block(tc, pool, driver2, f2, key2, cipherText,
+ cipherTextLen, &plainText, &plainTextLen, iv, &blockSize,
+ description);
+
+ if (cipherText && plainText) {
+ if (memcmp(in, plainText, inlen)) {
+ fprintf(stderr, "cross mismatch: %s %s/%s\n", description,
+ apr_crypto_driver_name(driver1), apr_crypto_driver_name(
+ driver2));
+ }
+ ABTS_STR_EQUAL(tc, (char *)in, (char *)plainText);
+ }
+
+}
+
+/**
+ * Test initialisation.
+ */
+static void test_crypto_init(abts_case *tc, void *data)
+{
+ apr_pool_t *pool = NULL;
+ apr_status_t rv;
+
+ apr_pool_create(&pool, NULL);
+
+ rv = apr_crypto_init(pool);
+ ABTS_ASSERT(tc, "failed to init apr_crypto", rv == APR_SUCCESS);
+
+ apr_pool_destroy(pool);
+
+}
+
+/**
+ * Simple test of OpenSSL block crypt.
+ */
+static void test_crypto_block_openssl(abts_case *tc, void *data)
+{
+ apr_pool_t *pool = NULL;
+ const apr_crypto_driver_t *drivers[] = { NULL, NULL };
+
+ const unsigned char *in = (const unsigned char *) ALIGNED_STRING;
+ apr_size_t inlen = sizeof(ALIGNED_STRING);
+
+ apr_pool_create(&pool, NULL);
+ drivers[0] = get_openssl_driver(tc, pool);
+ drivers[1] = get_openssl_driver(tc, pool);
+ crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_CBC, 0,
+ in, inlen, "KEY_3DES_192/MODE_CBC");
+ crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_ECB, 0,
+ in, inlen, "KEY_3DES_192/MODE_ECB");
+ crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_CBC, 0, in,
+ inlen, "KEY_AES_256/MODE_CBC");
+ crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_ECB, 0, in,
+ inlen, "KEY_AES_256/MODE_ECB");
+ crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_CBC, 0, in,
+ inlen, "KEY_AES_192/MODE_CBC");
+ crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_ECB, 0, in,
+ inlen, "KEY_AES_192/MODE_ECB");
+ crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_CBC, 0, in,
+ inlen, "KEY_AES_128/MODE_CBC");
+ crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_ECB, 0, in,
+ inlen, "KEY_AES_128/MODE_ECB");
+ apr_pool_destroy(pool);
+
+}
+
+/**
+ * Simple test of NSS block crypt.
+ */
+static void test_crypto_block_nss(abts_case *tc, void *data)
+{
+ apr_pool_t *pool = NULL;
+ const apr_crypto_driver_t *drivers[] = { NULL, NULL };
+
+ const unsigned char *in = (const unsigned char *) ALIGNED_STRING;
+ apr_size_t inlen = sizeof(ALIGNED_STRING);
+
+ apr_pool_create(&pool, NULL);
+ drivers[0] = get_nss_driver(tc, pool);
+ drivers[1] = get_nss_driver(tc, pool);
+ crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_CBC, 0,
+ in, inlen, "KEY_3DES_192/MODE_CBC");
+ /* KEY_3DES_192 / MODE_ECB doesn't work on NSS */
+ /* crypto_block_cross(tc, pool, drivers, KEY_3DES_192, MODE_ECB, 0, in, inlen, "KEY_3DES_192/MODE_ECB"); */
+ crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_CBC, 0, in,
+ inlen, "KEY_AES_256/MODE_CBC");
+ crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_ECB, 0, in,
+ inlen, "KEY_AES_256/MODE_ECB");
+ crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_CBC, 0, in,
+ inlen, "KEY_AES_192/MODE_CBC");
+ crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_ECB, 0, in,
+ inlen, "KEY_AES_192/MODE_ECB");
+ crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_CBC, 0, in,
+ inlen, "KEY_AES_128/MODE_CBC");
+ crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_ECB, 0, in,
+ inlen, "KEY_AES_128/MODE_ECB");
+ apr_pool_destroy(pool);
+
+}
+
+/**
+ * Encrypt NSS, decrypt OpenSSL.
+ */
+static void test_crypto_block_nss_openssl(abts_case *tc, void *data)
+{
+ apr_pool_t *pool = NULL;
+ const apr_crypto_driver_t *drivers[] = { NULL, NULL };
+
+ const unsigned char *in = (const unsigned char *) ALIGNED_STRING;
+ apr_size_t inlen = sizeof(ALIGNED_STRING);
+
+ apr_pool_create(&pool, NULL);
+ drivers[0] = get_nss_driver(tc, pool);
+ drivers[1] = get_openssl_driver(tc, pool);
+
+ crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_CBC, 0,
+ in, inlen, "KEY_3DES_192/MODE_CBC");
+
+ /* KEY_3DES_192 / MODE_ECB doesn't work on NSS */
+ /* crypto_block_cross(tc, pool, drivers, KEY_3DES_192, MODE_ECB, 0, in, inlen, "KEY_3DES_192/MODE_ECB"); */
+ crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_CBC, 0, in,
+ inlen, "KEY_AES_256/MODE_CBC");
+ crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_ECB, 0, in,
+ inlen, "KEY_AES_256/MODE_ECB");
+
+ /* all 4 of these tests fail to interoperate - a clue from the xml-security code is that
+ * NSS cannot distinguish between the 128 and 192 bit versions of AES. Will need to be
+ * investigated.
+ */
+ /*
+ crypto_block_cross(tc, pool, drivers, KEY_AES_192, MODE_CBC, 0, in, inlen, "KEY_AES_192/MODE_CBC");
+ crypto_block_cross(tc, pool, drivers, KEY_AES_192, MODE_ECB, 0, in, inlen, "KEY_AES_192/MODE_ECB");
+ crypto_block_cross(tc, pool, drivers, KEY_AES_128, MODE_CBC, 0, in, inlen, "KEY_AES_128/MODE_CBC");
+ crypto_block_cross(tc, pool, drivers, KEY_AES_128, MODE_ECB, 0, in, inlen, "KEY_AES_128/MODE_ECB");
+ */
+ apr_pool_destroy(pool);
+
+}
+
+/**
+ * Encrypt OpenSSL, decrypt NSS.
+ */
+static void test_crypto_block_openssl_nss(abts_case *tc, void *data)
+{
+ apr_pool_t *pool = NULL;
+ const apr_crypto_driver_t *drivers[] = { NULL, NULL };
+
+ const unsigned char *in = (const unsigned char *) ALIGNED_STRING;
+ apr_size_t inlen = sizeof(ALIGNED_STRING);
+
+ apr_pool_create(&pool, NULL);
+ drivers[0] = get_openssl_driver(tc, pool);
+ drivers[1] = get_nss_driver(tc, pool);
+ crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_CBC, 0,
+ in, inlen, "KEY_3DES_192/MODE_CBC");
+
+ /* KEY_3DES_192 / MODE_ECB doesn't work on NSS */
+ /* crypto_block_cross(tc, pool, drivers, KEY_3DES_192, MODE_ECB, 0, in, inlen, "KEY_3DES_192/MODE_ECB"); */
+
+ crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_CBC, 0, in,
+ inlen, "KEY_AES_256/MODE_CBC");
+ crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_ECB, 0, in,
+ inlen, "KEY_AES_256/MODE_ECB");
+
+ /* all 4 of these tests fail to interoperate - a clue from the xml-security code is that
+ * NSS cannot distinguish between the 128 and 192 bit versions of AES. Will need to be
+ * investigated.
+ */
+ /*
+ crypto_block_cross(tc, pool, drivers, KEY_AES_192, MODE_CBC, 0, in, inlen, "KEY_AES_192/MODE_CBC");
+ crypto_block_cross(tc, pool, drivers, KEY_AES_192, MODE_ECB, 0, in, inlen, "KEY_AES_192/MODE_ECB");
+ crypto_block_cross(tc, pool, drivers, KEY_AES_128, MODE_CBC, 0, in, inlen, "KEY_AES_128/MODE_CBC");
+ crypto_block_cross(tc, pool, drivers, KEY_AES_128, MODE_ECB, 0, in, inlen, "KEY_AES_128/MODE_ECB");
+ */
+ apr_pool_destroy(pool);
+
+}
+
+/**
+ * Simple test of OpenSSL block crypt.
+ */
+static void test_crypto_block_openssl_pad(abts_case *tc, void *data)
+{
+ apr_pool_t *pool = NULL;
+ const apr_crypto_driver_t *drivers[] = { NULL, NULL };
+
+ const unsigned char *in = (const unsigned char *) TEST_STRING;
+ apr_size_t inlen = sizeof(TEST_STRING);
+
+ apr_pool_create(&pool, NULL);
+ drivers[0] = get_openssl_driver(tc, pool);
+ drivers[1] = get_openssl_driver(tc, pool);
+
+ crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_CBC, 1,
+ in, inlen, "KEY_3DES_192/MODE_CBC");
+ crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_ECB, 1,
+ in, inlen, "KEY_3DES_192/MODE_ECB");
+ crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_CBC, 1, in,
+ inlen, "KEY_AES_256/MODE_CBC");
+ crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_ECB, 1, in,
+ inlen, "KEY_AES_256/MODE_ECB");
+ crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_CBC, 1, in,
+ inlen, "KEY_AES_192/MODE_CBC");
+ crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_ECB, 1, in,
+ inlen, "KEY_AES_192/MODE_ECB");
+ crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_CBC, 1, in,
+ inlen, "KEY_AES_128/MODE_CBC");
+ crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_ECB, 1, in,
+ inlen, "KEY_AES_128/MODE_ECB");
+
+ apr_pool_destroy(pool);
+
+}
+
+/**
+ * Simple test of NSS block crypt.
+ */
+static void test_crypto_block_nss_pad(abts_case *tc, void *data)
+{
+ apr_pool_t *pool = NULL;
+ const apr_crypto_driver_t *drivers[] =
+ { NULL, NULL };
+
+ const unsigned char *in = (const unsigned char *) TEST_STRING;
+ apr_size_t inlen = sizeof(TEST_STRING);
+
+ apr_pool_create(&pool, NULL);
+ drivers[0] = get_nss_driver(tc, pool);
+ drivers[1] = get_nss_driver(tc, pool);
+
+ crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_CBC, 1,
+ in, inlen, "KEY_3DES_192/MODE_CBC");
+ /* KEY_3DES_192 / MODE_ECB doesn't work on NSS */
+ /* crypto_block_cross(tc, pool, drivers, KEY_3DES_192, MODE_ECB, 1, in, inlen, "KEY_3DES_192/MODE_ECB"); */
+
+ crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_CBC, 1, in,
+ inlen, "KEY_AES_256/MODE_CBC");
+
+ /* KEY_AES_256 / MODE_ECB doesn't support padding on NSS */
+ /*crypto_block_cross(tc, pool, drivers, KEY_AES_256, MODE_ECB, 1, in, inlen, "KEY_AES_256/MODE_ECB");*/
+
+ crypto_block_cross(tc, pool, drivers, APR_KEY_AES_192, APR_MODE_CBC, 1, in,
+ inlen, "KEY_AES_192/MODE_CBC");
+
+ /* KEY_AES_256 / MODE_ECB doesn't support padding on NSS */
+ /*crypto_block_cross(tc, pool, drivers, KEY_AES_192, MODE_ECB, 1, in, inlen, "KEY_AES_192/MODE_ECB");*/
+
+ crypto_block_cross(tc, pool, drivers, APR_KEY_AES_128, APR_MODE_CBC, 1, in,
+ inlen, "KEY_AES_128/MODE_CBC");
+
+ /* KEY_AES_256 / MODE_ECB doesn't support padding on NSS */
+ /*crypto_block_cross(tc, pool, drivers, KEY_AES_128, MODE_ECB, 1, in, inlen, "KEY_AES_128/MODE_ECB");*/
+
+ apr_pool_destroy(pool);
+
+}
+
+/**
+ * Encrypt NSS, decrypt OpenSSL.
+ */
+static void test_crypto_block_nss_openssl_pad(abts_case *tc, void *data)
+{
+ apr_pool_t *pool = NULL;
+ const apr_crypto_driver_t *drivers[] = { NULL, NULL };
+
+ const unsigned char *in = (const unsigned char *) TEST_STRING;
+ apr_size_t inlen = sizeof(TEST_STRING);
+
+ apr_pool_create(&pool, NULL);
+ drivers[0] = get_nss_driver(tc, pool);
+ drivers[1] = get_openssl_driver(tc, pool);
+
+ crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_CBC, 1,
+ in, inlen, "KEY_3DES_192/MODE_CBC");
+
+ /* KEY_3DES_192 / MODE_ECB doesn't work on NSS */
+ /* crypto_block_cross(tc, pool, drivers, KEY_3DES_192, MODE_ECB, 1, in, inlen, "KEY_3DES_192/MODE_ECB"); */
+
+ crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_CBC, 1, in,
+ inlen, "KEY_AES_256/MODE_CBC");
+
+ /* KEY_AES_256 / MODE_ECB doesn't support padding on NSS */
+ /*crypto_block_cross(tc, pool, drivers, KEY_AES_256, MODE_ECB, 1, in, inlen, "KEY_AES_256/MODE_ECB");*/
+
+ /* all 4 of these tests fail to interoperate - a clue from the xml-security code is that
+ * NSS cannot distinguish between the 128 and 192 bit versions of AES. Will need to be
+ * investigated.
+ */
+ /*
+ crypto_block_cross(tc, pool, drivers, KEY_AES_192, MODE_CBC, 1, in, inlen, "KEY_AES_192/MODE_CBC");
+ crypto_block_cross(tc, pool, drivers, KEY_AES_192, MODE_ECB, 1, in, inlen, "KEY_AES_192/MODE_ECB");
+ crypto_block_cross(tc, pool, drivers, KEY_AES_128, MODE_CBC, 1, in, inlen, "KEY_AES_128/MODE_CBC");
+ crypto_block_cross(tc, pool, drivers, KEY_AES_128, MODE_ECB, 1, in, inlen, "KEY_AES_128/MODE_ECB");
+ */
+ apr_pool_destroy(pool);
+
+}
+
+/**
+ * Encrypt OpenSSL, decrypt NSS.
+ */
+static void test_crypto_block_openssl_nss_pad(abts_case *tc, void *data)
+{
+ apr_pool_t *pool = NULL;
+ const apr_crypto_driver_t *drivers[] = { NULL, NULL };
+
+ const unsigned char *in = (const unsigned char *) TEST_STRING;
+ apr_size_t inlen = sizeof(TEST_STRING);
+
+ apr_pool_create(&pool, NULL);
+ drivers[0] = get_openssl_driver(tc, pool);
+ drivers[1] = get_nss_driver(tc, pool);
+ crypto_block_cross(tc, pool, drivers, APR_KEY_3DES_192, APR_MODE_CBC, 1,
+ in, inlen, "KEY_3DES_192/MODE_CBC");
+
+ /* KEY_3DES_192 / MODE_ECB doesn't work on NSS */
+ /* crypto_block_cross(tc, pool, drivers, KEY_3DES_192, MODE_ECB, 1, in, inlen, "KEY_3DES_192/MODE_ECB"); */
+
+ crypto_block_cross(tc, pool, drivers, APR_KEY_AES_256, APR_MODE_CBC, 1, in,
+ inlen, "KEY_AES_256/MODE_CBC");
+
+ /* KEY_AES_256 / MODE_ECB doesn't support padding on NSS */
+ /*crypto_block_cross(tc, pool, drivers, KEY_AES_256, MODE_ECB, 1, in, inlen, "KEY_AES_256/MODE_ECB");*/
+
+ /* all 4 of these tests fail to interoperate - a clue from the xml-security code is that
+ * NSS cannot distinguish between the 128 and 192 bit versions of AES. Will need to be
+ * investigated.
+ */
+ /*
+ crypto_block_cross(tc, pool, drivers, KEY_AES_192, MODE_CBC, 1, in, inlen, "KEY_AES_192/MODE_CBC");
+ crypto_block_cross(tc, pool, drivers, KEY_AES_192, MODE_ECB, 1, in, inlen, "KEY_AES_192/MODE_ECB");
+ crypto_block_cross(tc, pool, drivers, KEY_AES_128, MODE_CBC, 1, in, inlen, "KEY_AES_128/MODE_CBC");
+ crypto_block_cross(tc, pool, drivers, KEY_AES_128, MODE_ECB, 1, in, inlen, "KEY_AES_128/MODE_ECB");
+ */
+ apr_pool_destroy(pool);
+
+}
+
+/**
+ * Get Types, OpenSSL.
+ */
+static void test_crypto_get_block_key_types_openssl(abts_case *tc, void *data)
+{
+ apr_pool_t *pool = NULL;
+ const apr_crypto_driver_t *driver;
+ apr_crypto_t *f;
+ apr_hash_t *types;
+ int *key_3des_192;
+ int *key_aes_128;
+ int *key_aes_192;
+ int *key_aes_256;
+
+ apr_pool_create(&pool, NULL);
+ driver = get_openssl_driver(tc, pool);
+ if (driver) {
+
+ f = make(tc, pool, driver);
+ apr_crypto_get_block_key_types(&types, f);
+
+ key_3des_192 = apr_hash_get(types, "3des192", APR_HASH_KEY_STRING);
+ ABTS_PTR_NOTNULL(tc, key_3des_192);
+ ABTS_INT_EQUAL(tc, *key_3des_192, APR_KEY_3DES_192);
+
+ key_aes_128 = apr_hash_get(types, "aes128", APR_HASH_KEY_STRING);
+ ABTS_PTR_NOTNULL(tc, key_aes_128);
+ ABTS_INT_EQUAL(tc, *key_aes_128, APR_KEY_AES_128);
+
+ key_aes_192 = apr_hash_get(types, "aes192", APR_HASH_KEY_STRING);
+ ABTS_PTR_NOTNULL(tc, key_aes_192);
+ ABTS_INT_EQUAL(tc, *key_aes_192, APR_KEY_AES_192);
+
+ key_aes_256 = apr_hash_get(types, "aes256", APR_HASH_KEY_STRING);
+ ABTS_PTR_NOTNULL(tc, key_aes_256);
+ ABTS_INT_EQUAL(tc, *key_aes_256, APR_KEY_AES_256);
+
+ }
+
+ apr_pool_destroy(pool);
+
+}
+
+/**
+ * Get Types, NSS.
+ */
+static void test_crypto_get_block_key_types_nss(abts_case *tc, void *data)
+{
+ apr_pool_t *pool = NULL;
+ const apr_crypto_driver_t *driver;
+ apr_crypto_t *f;
+ apr_hash_t *types;
+ int *key_3des_192;
+ int *key_aes_128;
+ int *key_aes_192;
+ int *key_aes_256;
+
+ apr_pool_create(&pool, NULL);
+ driver = get_nss_driver(tc, pool);
+ if (driver) {
+
+ f = make(tc, pool, driver);
+ apr_crypto_get_block_key_types(&types, f);
+
+ key_3des_192 = apr_hash_get(types, "3des192", APR_HASH_KEY_STRING);
+ ABTS_PTR_NOTNULL(tc, key_3des_192);
+ ABTS_INT_EQUAL(tc, *key_3des_192, APR_KEY_3DES_192);
+
+ key_aes_128 = apr_hash_get(types, "aes128", APR_HASH_KEY_STRING);
+ ABTS_PTR_NOTNULL(tc, key_aes_128);
+ ABTS_INT_EQUAL(tc, *key_aes_128, APR_KEY_AES_128);
+
+ key_aes_192 = apr_hash_get(types, "aes192", APR_HASH_KEY_STRING);
+ ABTS_PTR_NOTNULL(tc, key_aes_192);
+ ABTS_INT_EQUAL(tc, *key_aes_192, APR_KEY_AES_192);
+
+ key_aes_256 = apr_hash_get(types, "aes256", APR_HASH_KEY_STRING);
+ ABTS_PTR_NOTNULL(tc, key_aes_256);
+ ABTS_INT_EQUAL(tc, *key_aes_256, APR_KEY_AES_256);
+
+ }
+
+ apr_pool_destroy(pool);
+
+}
+
+/**
+ * Get Modes, OpenSSL.
+ */
+static void test_crypto_get_block_key_modes_openssl(abts_case *tc, void *data)
+{
+ apr_pool_t *pool = NULL;
+ const apr_crypto_driver_t *driver;
+ apr_crypto_t *f;
+ apr_hash_t *modes;
+ int *mode_ecb;
+ int *mode_cbc;
+
+ apr_pool_create(&pool, NULL);
+ driver = get_openssl_driver(tc, pool);
+ if (driver) {
+
+ f = make(tc, pool, driver);
+ apr_crypto_get_block_key_modes(&modes, f);
+
+ mode_ecb = apr_hash_get(modes, "ecb", APR_HASH_KEY_STRING);
+ ABTS_PTR_NOTNULL(tc, mode_ecb);
+ ABTS_INT_EQUAL(tc, *mode_ecb, APR_MODE_ECB);
+
+ mode_cbc = apr_hash_get(modes, "cbc", APR_HASH_KEY_STRING);
+ ABTS_PTR_NOTNULL(tc, mode_cbc);
+ ABTS_INT_EQUAL(tc, *mode_cbc, APR_MODE_CBC);
+
+ }
+
+ apr_pool_destroy(pool);
+
+}
+
+/**
+ * Get Modes, NSS.
+ */
+static void test_crypto_get_block_key_modes_nss(abts_case *tc, void *data)
+{
+ apr_pool_t *pool = NULL;
+ const apr_crypto_driver_t *driver;
+ apr_crypto_t *f;
+ apr_hash_t *modes;
+ int *mode_ecb;
+ int *mode_cbc;
+
+ apr_pool_create(&pool, NULL);
+ driver = get_nss_driver(tc, pool);
+ if (driver) {
+
+ f = make(tc, pool, driver);
+ apr_crypto_get_block_key_modes(&modes, f);
+
+ mode_ecb = apr_hash_get(modes, "ecb", APR_HASH_KEY_STRING);
+ ABTS_PTR_NOTNULL(tc, mode_ecb);
+ ABTS_INT_EQUAL(tc, *mode_ecb, APR_MODE_ECB);
+
+ mode_cbc = apr_hash_get(modes, "cbc", APR_HASH_KEY_STRING);
+ ABTS_PTR_NOTNULL(tc, mode_cbc);
+ ABTS_INT_EQUAL(tc, *mode_cbc, APR_MODE_CBC);
+
+ }
+
+ apr_pool_destroy(pool);
+
+}
+
+abts_suite *testcrypto(abts_suite *suite)
+{
+ suite = ADD_SUITE(suite);
+
+ /* test simple init and shutdown */
+ abts_run_test(suite, test_crypto_init, NULL);
+
+ /* test a simple encrypt / decrypt operation - openssl */
+ abts_run_test(suite, test_crypto_block_openssl, NULL);
+
+ /* test a padded encrypt / decrypt operation - openssl */
+ abts_run_test(suite, test_crypto_block_openssl_pad, NULL);
+
+ /* test a simple encrypt / decrypt operation - nss */
+ abts_run_test(suite, test_crypto_block_nss, NULL);
+
+ /* test a padded encrypt / decrypt operation - nss */
+ abts_run_test(suite, test_crypto_block_nss_pad, NULL);
+
+ /* test encrypt nss / decrypt openssl */
+ abts_run_test(suite, test_crypto_block_nss_openssl, NULL);
+
+ /* test padded encrypt nss / decrypt openssl */
+ abts_run_test(suite, test_crypto_block_nss_openssl_pad, NULL);
+
+ /* test encrypt openssl / decrypt nss */
+ abts_run_test(suite, test_crypto_block_openssl_nss, NULL);
+
+ /* test padded encrypt openssl / decrypt nss */
+ abts_run_test(suite, test_crypto_block_openssl_nss_pad, NULL);
+
+ /* test block key types openssl */
+ abts_run_test(suite, test_crypto_get_block_key_types_openssl, NULL);
+
+ /* test block key types nss */
+ abts_run_test(suite, test_crypto_get_block_key_types_nss, NULL);
+
+ /* test block key modes openssl */
+ abts_run_test(suite, test_crypto_get_block_key_modes_openssl, NULL);
+
+ /* test block key modes nss */
+ abts_run_test(suite, test_crypto_get_block_key_modes_nss, NULL);
+
+ return suite;
+}
+
+#else
+
+/**
+ * Dummy test suite when crypto is turned off.
+ */
+abts_suite *testcrypto(abts_suite *suite)
+{
+ return ADD_SUITE(suite);
+}
+
+#endif /* APU_HAVE_CRYPTO */
diff --git a/contrib/apr-util/test/testdate.c b/contrib/apr-util/test/testdate.c
new file mode 100644
index 000000000000..b4e2edf263ec
--- /dev/null
+++ b/contrib/apr-util/test/testdate.c
@@ -0,0 +1,202 @@
+/* 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 "abts.h"
+#include "testutil.h"
+#include "apr_date.h"
+#include "apr_general.h"
+
+#if APR_HAVE_TIME_H
+#include <time.h>
+#endif /* APR_HAVE_TIME_H */
+
+static struct datetest {
+ const char *input;
+ const char *output;
+} tests[] = {
+ { "Mon, 27 Feb 1995 20:49:44 -0800", "Tue, 28 Feb 1995 04:49:44 GMT" },
+ { "Fri, 1 Jul 2005 11:34:25 -0400", "Fri, 01 Jul 2005 15:34:25 GMT" },
+ { "Monday, 27-Feb-95 20:49:44 -0800", "Tue, 28 Feb 1995 04:49:44 GMT" },
+ { "Tue, 4 Mar 1997 12:43:52 +0200", "Tue, 04 Mar 1997 10:43:52 GMT" },
+ { "Mon, 27 Feb 95 20:49:44 -0800", "Tue, 28 Feb 1995 04:49:44 GMT" },
+ { "Tue, 4 Mar 97 12:43:52 +0200", "Tue, 04 Mar 1997 10:43:52 GMT" },
+ { "Tue, 4 Mar 97 12:43:52 +0200", "Tue, 04 Mar 1997 10:43:52 GMT" },
+ { "Mon, 27 Feb 95 20:49 GMT", "Mon, 27 Feb 1995 20:49:00 GMT" },
+ { "Tue, 4 Mar 97 12:43 GMT", "Tue, 04 Mar 1997 12:43:00 GMT" },
+ { NULL, NULL }
+};
+
+static const apr_time_t year2secs[] = {
+ APR_INT64_C(0), /* 1970 */
+ APR_INT64_C(31536000), /* 1971 */
+ APR_INT64_C(63072000), /* 1972 */
+ APR_INT64_C(94694400), /* 1973 */
+ APR_INT64_C(126230400), /* 1974 */
+ APR_INT64_C(157766400), /* 1975 */
+ APR_INT64_C(189302400), /* 1976 */
+ APR_INT64_C(220924800), /* 1977 */
+ APR_INT64_C(252460800), /* 1978 */
+ APR_INT64_C(283996800), /* 1979 */
+ APR_INT64_C(315532800), /* 1980 */
+ APR_INT64_C(347155200), /* 1981 */
+ APR_INT64_C(378691200), /* 1982 */
+ APR_INT64_C(410227200), /* 1983 */
+ APR_INT64_C(441763200), /* 1984 */
+ APR_INT64_C(473385600), /* 1985 */
+ APR_INT64_C(504921600), /* 1986 */
+ APR_INT64_C(536457600), /* 1987 */
+ APR_INT64_C(567993600), /* 1988 */
+ APR_INT64_C(599616000), /* 1989 */
+ APR_INT64_C(631152000), /* 1990 */
+ APR_INT64_C(662688000), /* 1991 */
+ APR_INT64_C(694224000), /* 1992 */
+ APR_INT64_C(725846400), /* 1993 */
+ APR_INT64_C(757382400), /* 1994 */
+ APR_INT64_C(788918400), /* 1995 */
+ APR_INT64_C(820454400), /* 1996 */
+ APR_INT64_C(852076800), /* 1997 */
+ APR_INT64_C(883612800), /* 1998 */
+ APR_INT64_C(915148800), /* 1999 */
+ APR_INT64_C(946684800), /* 2000 */
+ APR_INT64_C(978307200), /* 2001 */
+ APR_INT64_C(1009843200), /* 2002 */
+ APR_INT64_C(1041379200), /* 2003 */
+ APR_INT64_C(1072915200), /* 2004 */
+ APR_INT64_C(1104537600), /* 2005 */
+ APR_INT64_C(1136073600), /* 2006 */
+ APR_INT64_C(1167609600), /* 2007 */
+ APR_INT64_C(1199145600), /* 2008 */
+ APR_INT64_C(1230768000), /* 2009 */
+ APR_INT64_C(1262304000), /* 2010 */
+ APR_INT64_C(1293840000), /* 2011 */
+ APR_INT64_C(1325376000), /* 2012 */
+ APR_INT64_C(1356998400), /* 2013 */
+ APR_INT64_C(1388534400), /* 2014 */
+ APR_INT64_C(1420070400), /* 2015 */
+ APR_INT64_C(1451606400), /* 2016 */
+ APR_INT64_C(1483228800), /* 2017 */
+ APR_INT64_C(1514764800), /* 2018 */
+ APR_INT64_C(1546300800), /* 2019 */
+ APR_INT64_C(1577836800), /* 2020 */
+ APR_INT64_C(1609459200), /* 2021 */
+ APR_INT64_C(1640995200), /* 2022 */
+ APR_INT64_C(1672531200), /* 2023 */
+ APR_INT64_C(1704067200), /* 2024 */
+ APR_INT64_C(1735689600), /* 2025 */
+ APR_INT64_C(1767225600), /* 2026 */
+ APR_INT64_C(1798761600), /* 2027 */
+ APR_INT64_C(1830297600), /* 2028 */
+ APR_INT64_C(1861920000), /* 2029 */
+ APR_INT64_C(1893456000), /* 2030 */
+ APR_INT64_C(1924992000), /* 2031 */
+ APR_INT64_C(1956528000), /* 2032 */
+ APR_INT64_C(1988150400), /* 2033 */
+ APR_INT64_C(2019686400), /* 2034 */
+ APR_INT64_C(2051222400), /* 2035 */
+ APR_INT64_C(2082758400), /* 2036 */
+ APR_INT64_C(2114380800), /* 2037 */
+ APR_INT64_C(2145916800) /* 2038 */
+};
+
+const char month_snames[12][4] = {
+ "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"
+};
+
+/* XXX: non-portable */
+static void gm_timestr_822(char *ts, apr_time_t sec)
+{
+ static const char *const days[7]=
+ {"Sun","Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
+ struct tm *tms;
+ time_t ls = (time_t)sec;
+
+ tms = gmtime(&ls);
+
+ sprintf(ts, "%s, %.2d %s %d %.2d:%.2d:%.2d GMT", days[tms->tm_wday],
+ tms->tm_mday, month_snames[tms->tm_mon], tms->tm_year + 1900,
+ tms->tm_hour, tms->tm_min, tms->tm_sec);
+}
+
+/* Linear congruential generator */
+static apr_uint32_t lgc(apr_uint32_t a)
+{
+ apr_uint64_t z = a;
+ z *= 279470273;
+ z %= APR_UINT64_C(4294967291);
+ return (apr_uint32_t)z;
+}
+
+static void test_date_parse_http(abts_case *tc, void *data)
+{
+ int year, i;
+ apr_time_t guess;
+ apr_time_t offset = 0;
+ apr_time_t secstodate, newsecs;
+ char datestr[50];
+
+ for (year = 1970; year < 2038; ++year) {
+ secstodate = year2secs[year - 1970] + offset;
+ gm_timestr_822(datestr, secstodate);
+ secstodate *= APR_USEC_PER_SEC;
+ newsecs = apr_date_parse_http(datestr);
+ ABTS_TRUE(tc, secstodate == newsecs);
+ }
+
+#if APR_HAS_RANDOM
+ apr_generate_random_bytes((unsigned char *)&guess, sizeof(guess));
+#else
+ guess = apr_time_now() % APR_TIME_C(4294967291);
+#endif
+
+ for (i = 0; i < 10000; ++i) {
+ guess = (time_t)lgc((apr_uint32_t)guess);
+ if (guess < 0)
+ guess *= -1;
+ secstodate = guess + offset;
+ gm_timestr_822(datestr, secstodate);
+ secstodate *= APR_USEC_PER_SEC;
+ newsecs = apr_date_parse_http(datestr);
+ ABTS_TRUE(tc, secstodate == newsecs);
+ }
+}
+
+static void test_date_rfc(abts_case *tc, void *data)
+{
+ apr_time_t date;
+ int i = 0;
+
+ while (tests[i].input) {
+ char str_date[APR_RFC822_DATE_LEN] = { 0 };
+
+ date = apr_date_parse_rfc(tests[i].input);
+
+ apr_rfc822_date(str_date, date);
+
+ ABTS_STR_EQUAL(tc, str_date, tests[i].output);
+
+ i++;
+ }
+}
+
+abts_suite *testdate(abts_suite *suite)
+{
+ suite = ADD_SUITE(suite);
+
+ abts_run_test(suite, test_date_parse_http, NULL);
+ abts_run_test(suite, test_date_rfc, NULL);
+
+ return suite;
+}
diff --git a/contrib/apr-util/test/testdbd.c b/contrib/apr-util/test/testdbd.c
new file mode 100644
index 000000000000..b94c491b932f
--- /dev/null
+++ b/contrib/apr-util/test/testdbd.c
@@ -0,0 +1,245 @@
+/* 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 "testutil.h"
+#include "apr.h"
+#include "apu.h"
+#include "apr_pools.h"
+#include "apr_dbd.h"
+#include "apr_strings.h"
+
+static void test_dbd_init(abts_case *tc, void *data)
+{
+ apr_pool_t *pool = p;
+ apr_status_t rv;
+
+ rv = apr_dbd_init(pool);
+ ABTS_ASSERT(tc, "failed to init apr_dbd", rv == APR_SUCCESS);
+}
+
+#if APU_HAVE_SQLITE2 || APU_HAVE_SQLITE3
+static void test_statement(abts_case *tc, apr_dbd_t* handle,
+ const apr_dbd_driver_t* driver, const char* sql)
+{
+ int nrows;
+ apr_status_t rv;
+
+ rv = apr_dbd_query(driver, handle, &nrows, sql);
+
+ ABTS_ASSERT(tc, sql, rv == APR_SUCCESS);
+}
+
+static void create_table(abts_case *tc, apr_dbd_t* handle,
+ const apr_dbd_driver_t* driver)
+{
+ const char *sql = "CREATE TABLE apr_dbd_test ("
+ "col1 varchar(40) not null,"
+ "col2 varchar(40),"
+ "col3 integer)";
+
+ test_statement(tc, handle, driver, sql);
+}
+
+static void drop_table(abts_case *tc, apr_dbd_t* handle,
+ const apr_dbd_driver_t* driver)
+{
+ const char *sql = "DROP TABLE apr_dbd_test";
+ test_statement(tc, handle, driver, sql);
+}
+
+static void delete_rows(abts_case *tc, apr_dbd_t* handle,
+ const apr_dbd_driver_t* driver)
+{
+ const char *sql = "DELETE FROM apr_dbd_test";
+ test_statement(tc, handle, driver, sql);
+}
+
+
+static void insert_data(abts_case *tc, apr_dbd_t* handle,
+ const apr_dbd_driver_t* driver, int count)
+{
+ apr_pool_t* pool = p;
+ const char* sql = "INSERT INTO apr_dbd_test VALUES('%d', '%d', %d)";
+ char* sqf = NULL;
+ int i;
+ int nrows;
+ apr_status_t rv;
+
+ for (i=0; i<count; i++) {
+ sqf = apr_psprintf(pool, sql, i, i, i);
+ rv = apr_dbd_query(driver, handle, &nrows, sqf);
+ ABTS_ASSERT(tc, sqf, rv == APR_SUCCESS);
+ ABTS_ASSERT(tc, sqf, 1 == nrows);
+ }
+}
+
+static void select_rows(abts_case *tc, apr_dbd_t* handle,
+ const apr_dbd_driver_t* driver, int count)
+{
+ apr_status_t rv;
+ apr_pool_t* pool = p;
+ apr_pool_t* tpool;
+ const char* sql = "SELECT * FROM apr_dbd_test ORDER BY col1";
+ apr_dbd_results_t *res = NULL;
+ apr_dbd_row_t *row = NULL;
+ int i;
+
+ rv = apr_dbd_select(driver, pool, handle, &res, sql, 0);
+ ABTS_ASSERT(tc, sql, rv == APR_SUCCESS);
+ ABTS_PTR_NOTNULL(tc, res);
+
+ apr_pool_create(&tpool, pool);
+ i = count;
+ while (i > 0) {
+ row = NULL;
+ rv = apr_dbd_get_row(driver, pool, res, &row, -1);
+ ABTS_ASSERT(tc, sql, rv == APR_SUCCESS);
+ ABTS_PTR_NOTNULL(tc, row);
+ apr_pool_clear(tpool);
+ i--;
+ }
+ ABTS_ASSERT(tc, "Missing Rows!", i == 0);
+
+ res = NULL;
+ i = count;
+
+ rv = apr_dbd_select(driver, pool, handle, &res, sql, 1);
+ ABTS_ASSERT(tc, sql, rv == APR_SUCCESS);
+ ABTS_PTR_NOTNULL(tc, res);
+
+ rv = apr_dbd_num_tuples(driver, res);
+ ABTS_ASSERT(tc, "invalid row count", rv == count);
+
+ while (i > 0) {
+ row = NULL;
+ rv = apr_dbd_get_row(driver, pool, res, &row, i);
+ ABTS_ASSERT(tc, sql, rv == APR_SUCCESS);
+ ABTS_PTR_NOTNULL(tc, row);
+ apr_pool_clear(tpool);
+ i--;
+ }
+ ABTS_ASSERT(tc, "Missing Rows!", i == 0);
+ rv = apr_dbd_get_row(driver, pool, res, &row, count+100);
+ ABTS_ASSERT(tc, "If we overseek, get_row should return -1", rv == -1);
+}
+
+static void test_escape(abts_case *tc, apr_dbd_t *handle,
+ const apr_dbd_driver_t *driver)
+{
+ const char *escaped = apr_dbd_escape(driver, p, "foo'bar", handle);
+
+ ABTS_STR_EQUAL(tc, "foo''bar", escaped);
+}
+
+static void test_dbd_generic(abts_case *tc, apr_dbd_t* handle,
+ const apr_dbd_driver_t* driver)
+{
+ void* native;
+ apr_pool_t *pool = p;
+ apr_status_t rv;
+
+ native = apr_dbd_native_handle(driver, handle);
+ ABTS_PTR_NOTNULL(tc, native);
+
+ rv = apr_dbd_check_conn(driver, pool, handle);
+
+ create_table(tc, handle, driver);
+ select_rows(tc, handle, driver, 0);
+ insert_data(tc, handle, driver, 5);
+ select_rows(tc, handle, driver, 5);
+ delete_rows(tc, handle, driver);
+ select_rows(tc, handle, driver, 0);
+ drop_table(tc, handle, driver);
+
+ test_escape(tc, handle, driver);
+
+ rv = apr_dbd_close(driver, handle);
+ ABTS_ASSERT(tc, "failed to close database", rv == APR_SUCCESS);
+}
+#endif
+
+#if APU_HAVE_SQLITE2
+static void test_dbd_sqlite2(abts_case *tc, void *data)
+{
+ apr_pool_t *pool = p;
+ apr_status_t rv;
+ const apr_dbd_driver_t* driver = NULL;
+ apr_dbd_t* handle = NULL;
+
+ rv = apr_dbd_get_driver(pool, "sqlite2", &driver);
+ ABTS_ASSERT(tc, "failed to fetch sqlite2 driver", rv == APR_SUCCESS);
+ ABTS_PTR_NOTNULL(tc, driver);
+ if (!driver) {
+ return;
+ }
+
+ ABTS_STR_EQUAL(tc, "sqlite2", apr_dbd_name(driver));
+
+ rv = apr_dbd_open(driver, pool, "data/sqlite2.db:600", &handle);
+ ABTS_ASSERT(tc, "failed to open sqlite2 atabase", rv == APR_SUCCESS);
+ ABTS_PTR_NOTNULL(tc, handle);
+ if (!handle) {
+ return;
+ }
+
+ test_dbd_generic(tc, handle, driver);
+}
+#endif
+
+#if APU_HAVE_SQLITE3
+static void test_dbd_sqlite3(abts_case *tc, void *data)
+{
+ apr_pool_t *pool = p;
+ apr_status_t rv;
+ const apr_dbd_driver_t* driver = NULL;
+ apr_dbd_t* handle = NULL;
+
+ rv = apr_dbd_get_driver(pool, "sqlite3", &driver);
+ ABTS_ASSERT(tc, "failed to fetch sqlite3 driver", rv == APR_SUCCESS);
+ ABTS_PTR_NOTNULL(tc, driver);
+ if (!driver) {
+ return;
+ }
+
+ ABTS_STR_EQUAL(tc, "sqlite3", apr_dbd_name(driver));
+
+ rv = apr_dbd_open(driver, pool, "data/sqlite3.db", &handle);
+ ABTS_ASSERT(tc, "failed to open sqlite3 database", rv == APR_SUCCESS);
+ ABTS_PTR_NOTNULL(tc, handle);
+ if (!handle) {
+ return;
+ }
+
+ test_dbd_generic(tc, handle, driver);
+}
+#endif
+
+abts_suite *testdbd(abts_suite *suite)
+{
+ suite = ADD_SUITE(suite);
+
+
+ abts_run_test(suite, test_dbd_init, NULL);
+
+#if APU_HAVE_SQLITE2
+ abts_run_test(suite, test_dbd_sqlite2, NULL);
+#endif
+
+#if APU_HAVE_SQLITE3
+ abts_run_test(suite, test_dbd_sqlite3, NULL);
+#endif
+ return suite;
+}
diff --git a/contrib/apr-util/test/testdbm.c b/contrib/apr-util/test/testdbm.c
new file mode 100644
index 000000000000..89d8d2f90d0d
--- /dev/null
+++ b/contrib/apr-util/test/testdbm.c
@@ -0,0 +1,221 @@
+/* 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.h"
+#include "apr_general.h"
+#include "apr_pools.h"
+#include "apr_errno.h"
+#include "apr_dbm.h"
+#include "apr_uuid.h"
+#include "apr_strings.h"
+#include "abts.h"
+#include "testutil.h"
+
+#define NUM_TABLE_ROWS 1024
+
+typedef struct {
+ apr_datum_t key;
+ apr_datum_t val;
+ int deleted;
+ int visited;
+} dbm_table_t;
+
+static dbm_table_t *generate_table(void)
+{
+ unsigned int i;
+ apr_uuid_t uuid;
+ dbm_table_t *table = apr_pcalloc(p, sizeof(*table) * NUM_TABLE_ROWS);
+
+ for (i = 0; i < NUM_TABLE_ROWS/2; i++) {
+ apr_uuid_get(&uuid);
+ table[i].key.dptr = apr_pmemdup(p, uuid.data, sizeof(uuid.data));
+ table[i].key.dsize = sizeof(uuid.data);
+ table[i].val.dptr = apr_palloc(p, APR_UUID_FORMATTED_LENGTH);
+ table[i].val.dsize = APR_UUID_FORMATTED_LENGTH;
+ apr_uuid_format(table[i].val.dptr, &uuid);
+ }
+
+ for (; i < NUM_TABLE_ROWS; i++) {
+ apr_uuid_get(&uuid);
+ table[i].val.dptr = apr_pmemdup(p, uuid.data, sizeof(uuid.data));
+ table[i].val.dsize = sizeof(uuid.data);
+ table[i].key.dptr = apr_palloc(p, APR_UUID_FORMATTED_LENGTH);
+ table[i].key.dsize = APR_UUID_FORMATTED_LENGTH;
+ apr_uuid_format(table[i].key.dptr, &uuid);
+ }
+
+ return table;
+}
+
+static void test_dbm_store(abts_case *tc, apr_dbm_t *db, dbm_table_t *table)
+{
+ apr_status_t rv;
+ unsigned int i = NUM_TABLE_ROWS - 1;
+
+ for (; i >= NUM_TABLE_ROWS/2; i--) {
+ rv = apr_dbm_store(db, table[i].key, table[i].val);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+ table[i].deleted = FALSE;
+ }
+
+ for (i = 0; i < NUM_TABLE_ROWS/2; i++) {
+ rv = apr_dbm_store(db, table[i].key, table[i].val);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+ table[i].deleted = FALSE;
+ }
+}
+
+static void test_dbm_fetch(abts_case *tc, apr_dbm_t *db, dbm_table_t *table)
+{
+ apr_status_t rv;
+ unsigned int i;
+ apr_datum_t val;
+
+ for (i = 0; i < NUM_TABLE_ROWS; i++) {
+ memset(&val, 0, sizeof(val));
+ rv = apr_dbm_fetch(db, table[i].key, &val);
+ if (!table[i].deleted) {
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+ ABTS_INT_EQUAL(tc, table[i].val.dsize, val.dsize);
+ ABTS_INT_EQUAL(tc, 0, memcmp(table[i].val.dptr, val.dptr, val.dsize));
+ apr_dbm_freedatum(db, val);
+ } else {
+ ABTS_INT_EQUAL(tc, 0, val.dsize);
+ }
+ }
+}
+
+static void test_dbm_delete(abts_case *tc, apr_dbm_t *db, dbm_table_t *table)
+{
+ apr_status_t rv;
+ unsigned int i;
+
+ for (i = 0; i < NUM_TABLE_ROWS; i++) {
+ /* XXX: random */
+ if (i & 1)
+ continue;
+ rv = apr_dbm_delete(db, table[i].key);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+ table[i].deleted = TRUE;
+ }
+}
+
+static void test_dbm_exists(abts_case *tc, apr_dbm_t *db, dbm_table_t *table)
+{
+ unsigned int i;
+ int cond;
+
+ for (i = 0; i < NUM_TABLE_ROWS; i++) {
+ cond = apr_dbm_exists(db, table[i].key);
+ if (table[i].deleted) {
+ ABTS_TRUE(tc, cond == 0);
+ } else {
+ ABTS_TRUE(tc, cond != 0);
+ }
+ }
+}
+
+static void test_dbm_traversal(abts_case *tc, apr_dbm_t *db, dbm_table_t *table)
+{
+ apr_status_t rv;
+ unsigned int i;
+ apr_datum_t key;
+
+ rv = apr_dbm_firstkey(db, &key);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ do {
+ if (key.dptr == NULL || key.dsize == 0)
+ break;
+
+ for (i = 0; i < NUM_TABLE_ROWS; i++) {
+ if (table[i].key.dsize != key.dsize)
+ continue;
+ if (memcmp(table[i].key.dptr, key.dptr, key.dsize))
+ continue;
+ ABTS_INT_EQUAL(tc, 0, table[i].deleted);
+ ABTS_INT_EQUAL(tc, 0, table[i].visited);
+ table[i].visited++;
+ }
+
+ rv = apr_dbm_nextkey(db, &key);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+ } while (1);
+
+ for (i = 0; i < NUM_TABLE_ROWS; i++) {
+ if (table[i].deleted)
+ continue;
+ ABTS_INT_EQUAL(tc, 1, table[i].visited);
+ table[i].visited = 0;
+ }
+}
+
+static void test_dbm(abts_case *tc, void *data)
+{
+ apr_dbm_t *db;
+ apr_status_t rv;
+ dbm_table_t *table;
+ const char *type = data;
+ const char *file = apr_pstrcat(p, "data/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);
+
+ if (rv != APR_SUCCESS)
+ return;
+
+ table = generate_table();
+
+ test_dbm_store(tc, db, table);
+ test_dbm_fetch(tc, db, table);
+ test_dbm_delete(tc, db, table);
+ test_dbm_exists(tc, db, table);
+ test_dbm_traversal(tc, db, table);
+
+ apr_dbm_close(db);
+
+ rv = apr_dbm_open_ex(&db, type, file, APR_DBM_READONLY, APR_OS_DEFAULT, p);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ if (rv != APR_SUCCESS)
+ return;
+
+ test_dbm_exists(tc, db, table);
+ test_dbm_traversal(tc, db, table);
+ test_dbm_fetch(tc, db, table);
+
+ apr_dbm_close(db);
+}
+
+abts_suite *testdbm(abts_suite *suite)
+{
+ suite = ADD_SUITE(suite);
+
+#if APU_HAVE_GDBM
+ abts_run_test(suite, test_dbm, "gdbm");
+#endif
+#if APU_HAVE_NDBM
+ abts_run_test(suite, test_dbm, "ndbm");
+#endif
+#if APU_HAVE_SDBM
+ abts_run_test(suite, test_dbm, "sdbm");
+#endif
+#if APU_HAVE_DB
+ abts_run_test(suite, test_dbm, "db");
+#endif
+
+ return suite;
+}
diff --git a/contrib/apr-util/test/testldap.c b/contrib/apr-util/test/testldap.c
new file mode 100644
index 000000000000..4f4fef907bcd
--- /dev/null
+++ b/contrib/apr-util/test/testldap.c
@@ -0,0 +1,250 @@
+/* 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.
+ */
+
+ /* Setup:
+ * - Create or edit the file data/host.data and add an
+ * ldap server DN. Multiple DNs may be listed on
+ * a single line.
+ * - Copy the server certificates to the data/ directory.
+ * All DER type certificates must have the .der extention.
+ * All BASE64 or PEM certificates must have the .b64
+ * extension. All certificate files copied to the /data
+ * directory will be added to the ldap certificate store.
+ */
+
+ /* This test covers the following three types of connections:
+ * - Unsecure ldap://
+ * - Secure ldaps://
+ * - Secure ldap://+Start_TLS
+ *
+ * - (TBD) Mutual authentication
+ *
+ * There are other variations that should be tested:
+ * - All of the above with multiple redundant LDAP servers
+ * This can be done by listing more than one server DN
+ * in the host.data file. The DNs should all be listed
+ * on one line separated by a space.
+ * - All of the above with multiple certificates
+ * If more than one certificate is found in the data/
+ * directory, each certificate found will be added
+ * to the certificate store.
+ * - All of the above on alternate ports
+ * An alternate port can be specified as part of the
+ * host in the host.data file. The ":port" should
+ * follow each DN listed. Default is 389 and 636.
+ * - Secure connections with mutual authentication
+ */
+
+#include "testutil.h"
+
+#include "apr.h"
+#include "apr_general.h"
+#include "apr_ldap.h"
+#include "apr_file_io.h"
+#include "apr_file_info.h"
+#include "apr_strings.h"
+#if APR_HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#define APR_WANT_STDIO
+#define APR_WANT_STRFUNC
+#include "apr_want.h"
+
+#define DIRNAME "data"
+#define FILENAME DIRNAME "/host.data"
+#define CERTFILEDER DIRNAME "/*.der"
+#define CERTFILEB64 DIRNAME "/*.b64"
+
+#if APR_HAS_LDAP
+
+static char ldap_host[256];
+
+static int get_ldap_host(void)
+{
+ apr_status_t rv;
+ apr_file_t *thefile = NULL;
+ char *ptr;
+
+ ldap_host[0] = '\0';
+ rv = apr_file_open(&thefile, FILENAME,
+ APR_FOPEN_READ,
+ APR_UREAD | APR_UWRITE | APR_GREAD, p);
+ if (rv != APR_SUCCESS) {
+ return 0;
+ }
+
+ rv = apr_file_gets(ldap_host, sizeof(ldap_host), thefile);
+ if (rv != APR_SUCCESS) {
+ return 0;
+ }
+
+ ptr = strstr (ldap_host, "\r\n");
+ if (ptr) {
+ *ptr = '\0';
+ }
+ apr_file_close(thefile);
+
+ return 1;
+
+}
+
+static int add_ldap_certs(abts_case *tc)
+{
+ apr_status_t status;
+ apr_dir_t *thedir;
+ apr_finfo_t dirent;
+ apr_ldap_err_t *result = NULL;
+
+ if ((status = apr_dir_open(&thedir, DIRNAME, p)) == APR_SUCCESS) {
+ apr_ldap_opt_tls_cert_t *cert = (apr_ldap_opt_tls_cert_t *)apr_pcalloc(p, sizeof(apr_ldap_opt_tls_cert_t));
+
+ do {
+ status = apr_dir_read(&dirent, APR_FINFO_MIN | APR_FINFO_NAME, thedir);
+ if (APR_STATUS_IS_INCOMPLETE(status)) {
+ continue; /* ignore un-stat()able files */
+ }
+ else if (status != APR_SUCCESS) {
+ break;
+ }
+
+ if (strstr(dirent.name, ".der")) {
+ cert->type = APR_LDAP_CA_TYPE_DER;
+ cert->path = apr_pstrcat (p, DIRNAME, "/", dirent.name, NULL);
+ apr_ldap_set_option(p, NULL, APR_LDAP_OPT_TLS_CERT, (void *)cert, &result);
+ ABTS_TRUE(tc, result->rc == LDAP_SUCCESS);
+ }
+ if (strstr(dirent.name, ".b64")) {
+ cert->type = APR_LDAP_CA_TYPE_BASE64;
+ cert->path = apr_pstrcat (p, DIRNAME, "/", dirent.name, NULL);
+ apr_ldap_set_option(p, NULL, APR_LDAP_OPT_TLS_CERT, (void *)cert, &result);
+ ABTS_TRUE(tc, result->rc == LDAP_SUCCESS);
+ }
+
+ } while (1);
+
+ apr_dir_close(thedir);
+ }
+ return 0;
+}
+
+static void test_ldap_connection(abts_case *tc, LDAP *ldap)
+{
+ int version = LDAP_VERSION3;
+ int failures, result;
+
+ /* always default to LDAP V3 */
+ ldap_set_option(ldap, LDAP_OPT_PROTOCOL_VERSION, &version);
+
+ for (failures=0; failures<10; failures++)
+ {
+ result = ldap_simple_bind_s(ldap,
+ (char *)NULL,
+ (char *)NULL);
+ if (LDAP_SERVER_DOWN != result)
+ break;
+ }
+
+ ABTS_TRUE(tc, result == LDAP_SUCCESS);
+ if (result != LDAP_SUCCESS) {
+ abts_log_message("%s\n", ldap_err2string(result));
+ }
+
+ ldap_unbind_s(ldap);
+
+ return;
+}
+
+static void test_ldap(abts_case *tc, void *data)
+{
+ apr_pool_t *pool = p;
+ LDAP *ldap;
+ apr_ldap_err_t *result = NULL;
+
+
+ ABTS_ASSERT(tc, "failed to get host", ldap_host[0] != '\0');
+
+ apr_ldap_init(pool, &ldap,
+ ldap_host, LDAP_PORT,
+ APR_LDAP_NONE, &(result));
+
+ ABTS_TRUE(tc, ldap != NULL);
+ ABTS_PTR_NOTNULL(tc, result);
+
+ if (result->rc == LDAP_SUCCESS) {
+ test_ldap_connection(tc, ldap);
+ }
+}
+
+static void test_ldaps(abts_case *tc, void *data)
+{
+ apr_pool_t *pool = p;
+ LDAP *ldap;
+ apr_ldap_err_t *result = NULL;
+
+ apr_ldap_init(pool, &ldap,
+ ldap_host, LDAPS_PORT,
+ APR_LDAP_SSL, &(result));
+
+ ABTS_TRUE(tc, ldap != NULL);
+ ABTS_PTR_NOTNULL(tc, result);
+
+ if (result->rc == LDAP_SUCCESS) {
+ add_ldap_certs(tc);
+
+ test_ldap_connection(tc, ldap);
+ }
+}
+
+static void test_ldap_tls(abts_case *tc, void *data)
+{
+ apr_pool_t *pool = p;
+ LDAP *ldap;
+ apr_ldap_err_t *result = NULL;
+
+ apr_ldap_init(pool, &ldap,
+ ldap_host, LDAP_PORT,
+ APR_LDAP_STARTTLS, &(result));
+
+ ABTS_TRUE(tc, ldap != NULL);
+ ABTS_PTR_NOTNULL(tc, result);
+
+ if (result->rc == LDAP_SUCCESS) {
+ add_ldap_certs(tc);
+
+ test_ldap_connection(tc, ldap);
+ }
+}
+
+#endif /* APR_HAS_LDAP */
+
+abts_suite *testldap(abts_suite *suite)
+{
+#if APR_HAS_LDAP
+ apr_ldap_err_t *result = NULL;
+ suite = ADD_SUITE(suite);
+
+ apr_ldap_ssl_init(p, NULL, 0, &result);
+
+ if (get_ldap_host()) {
+ abts_run_test(suite, test_ldap, NULL);
+ abts_run_test(suite, test_ldaps, NULL);
+ abts_run_test(suite, test_ldap_tls, NULL);
+ }
+#endif /* APR_HAS_LDAP */
+
+ return suite;
+}
+
diff --git a/contrib/apr-util/test/testmd4.c b/contrib/apr-util/test/testmd4.c
new file mode 100644
index 000000000000..53a336149e6d
--- /dev/null
+++ b/contrib/apr-util/test/testmd4.c
@@ -0,0 +1,119 @@
+/* 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.
+ */
+/* This is derived from material copyright RSA Data Security, Inc.
+ * Their notice is reproduced below in its entirety.
+ *
+ * Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All
+ * rights reserved.
+ *
+ * RSA Data Security, Inc. makes no representations concerning either
+ * the merchantability of this software or the suitability of this
+ * software for any particular purpose. It is provided "as is"
+ * without express or implied warranty of any kind.
+ *
+ * These notices must be retained in any copies of any part of this
+ * documentation and/or software.
+ */
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "apr_errno.h"
+#include "apr_md4.h"
+#include "apr_file_io.h"
+
+#include "abts.h"
+#include "testutil.h"
+
+static struct {
+ const char *string;
+ const char *md4sum;
+} md4sums[] =
+{
+/*
+* Taken from the old md4 test suite.
+* MD4 ("") = 31d6cfe0d16ae931b73c59d7e0c089c0
+* MD4 ("a") = bde52cb31de33e46245e05fbdbd6fb24
+* MD4 ("abc") = a448017aaf21d8525fc10ae87aa6729d
+* MD4 ("message digest") = d9130a8164549fe818874806e1c7014b
+* MD4 ("abcdefghijklmnopqrstuvwxyz") = d79e1c308aa5bbcdeea8ed63df412da9
+* MD4 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")
+* MD4 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = e33b4ddc9c38f2199c3e7b164fcc0536
+*
+*/
+ {"",
+ "\x31\xd6\xcf\xe0\xd1\x6a\xe9\x31\xb7\x3c\x59\xd7\xe0\xc0\x89\xc0"},
+ {"a",
+ "\xbd\xe5\x2c\xb3\x1d\xe3\x3e\x46\x24\x5e\x05\xfb\xdb\xd6\xfb\x24"},
+ {"abc",
+ "\xa4\x48\x01\x7a\xaf\x21\xd8\x52\x5f\xc1\x0a\xe8\x7a\xa6\x72\x9d"},
+ {"message digest",
+ "\xd9\x13\x0a\x81\x64\x54\x9f\xe8\x18\x87\x48\x06\xe1\xc7\x01\x4b"},
+ {"abcdefghijklmnopqrstuvwxyz",
+ "\xd7\x9e\x1c\x30\x8a\xa5\xbb\xcd\xee\xa8\xed\x63\xdf\x41\x2d\xa9"},
+ {"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
+ "\x04\x3f\x85\x82\xf2\x41\xdb\x35\x1c\xe6\x27\xe1\x53\xe7\xf0\xe4"},
+ {"12345678901234567890123456789012345678901234567890123456789012345678901234567890",
+ "\xe3\x3b\x4d\xdc\x9c\x38\xf2\x19\x9c\x3e\x7b\x16\x4f\xcc\x05\x36"}
+};
+
+static int num_sums = sizeof(md4sums) / sizeof(md4sums[0]);
+static int count;
+
+#if 0
+static int MDStringComp(const void *string, const void *sum)
+{
+ apr_md4_ctx_t context;
+ unsigned char digest[APR_MD4_DIGESTSIZE];
+ unsigned int len = strlen(string);
+
+ apr_md4_init(&context);
+ apr_md4_update(&context, (unsigned char *)string, len);
+ apr_md4_final(digest, &context);
+ return (memcmp(digest, sum, APR_MD4_DIGESTSIZE));
+
+}
+#endif
+
+static void test_md4sum(abts_case *tc, void *data)
+{
+ apr_md4_ctx_t context;
+ unsigned char digest[APR_MD4_DIGESTSIZE];
+ const void *string = md4sums[count].string;
+ const void *sum = md4sums[count].md4sum;
+ unsigned int len = strlen(string);
+
+ ABTS_ASSERT(tc, "apr_md4_init", (apr_md4_init(&context) == 0));
+ ABTS_ASSERT(tc, "apr_md4_update",
+ (apr_md4_update(&context,
+ (unsigned char *)string, len) == 0));
+
+ ABTS_ASSERT(tc, "apr_md4_final", (apr_md4_final(digest, &context) ==0));
+ ABTS_ASSERT(tc, "check for correct md4 digest",
+ (memcmp(digest, sum, APR_MD4_DIGESTSIZE) == 0));
+}
+
+abts_suite *testmd4(abts_suite *suite)
+{
+ suite = ADD_SUITE(suite);
+
+ for (count=0; count < num_sums; count++) {
+ abts_run_test(suite, test_md4sum, NULL);
+ }
+
+ return suite;
+}
diff --git a/contrib/apr-util/test/testmd5.c b/contrib/apr-util/test/testmd5.c
new file mode 100644
index 000000000000..4e13da2371a8
--- /dev/null
+++ b/contrib/apr-util/test/testmd5.c
@@ -0,0 +1,103 @@
+/* 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 <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "apr_md5.h"
+#include "apr_xlate.h"
+#include "apr_general.h"
+
+#include "abts.h"
+#include "testutil.h"
+
+static struct {
+ const char *string;
+ const char *digest;
+} md5sums[] =
+{
+ {"Jeff was here!",
+ "\xa5\x25\x8a\x89\x11\xb2\x9d\x1f\x81\x75\x96\x3b\x60\x94\x49\xc0"},
+ {"01234567890aBcDeFASDFGHJKLPOIUYTR"
+ "POIUYTREWQZXCVBN LLLLLLLLLLLLLLL",
+ "\xd4\x1a\x06\x2c\xc5\xfd\x6f\x24\x67\x68\x56\x7c\x40\x8a\xd5\x69"},
+ {"111111118888888888888888*******%%%%%%%%%%#####"
+ "142134u8097289720432098409289nkjlfkjlmn,m.. ",
+ "\xb6\xea\x5b\xe8\xca\x45\x8a\x33\xf0\xf1\x84\x6f\xf9\x65\xa8\xe1"},
+ {"01234567890aBcDeFASDFGHJKLPOIUYTR"
+ "POIUYTREWQZXCVBN LLLLLLLLLLLLLLL"
+ "01234567890aBcDeFASDFGHJKLPOIUYTR"
+ "POIUYTREWQZXCVBN LLLLLLLLLLLLLLL"
+ "1",
+ "\xd1\xa1\xc0\x97\x8a\x60\xbb\xfb\x2a\x25\x46\x9d\xa5\xae\xd0\xb0"}
+};
+
+static int num_sums = sizeof(md5sums) / sizeof(md5sums[0]);
+static int count;
+
+static void test_md5sum(abts_case *tc, void *data)
+{
+ apr_md5_ctx_t context;
+ unsigned char digest[APR_MD5_DIGESTSIZE];
+ const void *string = md5sums[count].string;
+ const void *sum = md5sums[count].digest;
+ unsigned int len = strlen(string);
+
+ ABTS_ASSERT(tc, "apr_md5_init", (apr_md5_init(&context) == 0));
+ ABTS_ASSERT(tc, "apr_md5_update",
+ (apr_md5_update(&context, string, len) == 0));
+ ABTS_ASSERT(tc, "apr_md5_final", (apr_md5_final(digest, &context)
+ == 0));
+ ABTS_ASSERT(tc, "check for correct md5 digest",
+ (memcmp(digest, sum, APR_MD5_DIGESTSIZE) == 0));
+}
+
+static void test_md5sum_unaligned(abts_case *tc, void *data)
+{
+ apr_md5_ctx_t context;
+ const char *string = "abcdefghijklmnopqrstuvwxyz01234"
+ "abcdefghijklmnopqrstuvwxyz01234"
+ "abcdefghijklmnopqrstuvwxyz01234"
+ "abcdefghijklmnopqrstuvwxyz01234_";
+ const char *sum =
+ "\x93\x17\x22\x78\xee\x30\x82\xb3\xeb\x95\x33\xec\xea\x78\xb7\x89";
+ unsigned char digest[APR_MD5_DIGESTSIZE];
+ unsigned int i;
+
+ ABTS_ASSERT(tc, "apr_md5_init", (apr_md5_init(&context) == 0));
+ for (i = 0; i < 10; i++) {
+ ABTS_ASSERT(tc, "apr_md5_update",
+ (apr_md5_update(&context, string, strlen(string)) == 0));
+ string++;
+ }
+ ABTS_ASSERT(tc, "apr_md5_final", (apr_md5_final(digest, &context)
+ == 0));
+ ABTS_ASSERT(tc, "check for correct md5 digest of unaligned data",
+ (memcmp(digest, sum, APR_MD5_DIGESTSIZE) == 0));
+}
+
+abts_suite *testmd5(abts_suite *suite)
+{
+ suite = ADD_SUITE(suite);
+
+ for (count=0; count < num_sums; count++) {
+ abts_run_test(suite, test_md5sum, NULL);
+ }
+ abts_run_test(suite, test_md5sum_unaligned, NULL);
+
+ return suite;
+}
diff --git a/contrib/apr-util/test/testmemcache.c b/contrib/apr-util/test/testmemcache.c
new file mode 100644
index 000000000000..958afa66131d
--- /dev/null
+++ b/contrib/apr-util/test/testmemcache.c
@@ -0,0 +1,626 @@
+/* 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 "testutil.h"
+#include "apr.h"
+#include "apu.h"
+#include "apr_general.h"
+#include "apr_strings.h"
+#include "apr_hash.h"
+#include "apr_memcache.h"
+#include "apr_network_io.h"
+
+#if APR_HAVE_STDLIB_H
+#include <stdlib.h> /* for exit() */
+#endif
+
+#define HOST "localhost"
+#define PORT 11211
+
+/* the total number of items to use for set/get testing */
+#define TDATA_SIZE 3000
+
+/* some smaller subset of TDATA_SIZE used for multiget testing */
+#define TDATA_SET 100
+
+/* our custom hash function just returns this all the time */
+#define HASH_FUNC_RESULT 510
+
+/* all keys will be prefixed with this */
+const char prefix[] = "testmemcache";
+
+/* text for values we store */
+const char txt[] =
+"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis at"
+"lacus in ligula hendrerit consectetuer. Vestibulum tristique odio"
+"iaculis leo. In massa arcu, ultricies a, laoreet nec, hendrerit non,"
+"neque. Nulla sagittis sapien ac risus. Morbi ligula dolor, vestibulum"
+"nec, viverra id, placerat dapibus, arcu. Curabitur egestas feugiat"
+"tellus. Donec dignissim. Nunc ante. Curabitur id lorem. In mollis"
+"tortor sit amet eros auctor dapibus. Proin nulla sem, tristique in,"
+"convallis id, iaculis feugiat cras amet.";
+
+/*
+ * this datatype is for our custom server determination function. this might
+ * be useful if you don't want to rely on simply hashing keys to determine
+ * where a key belongs, but instead want to write something fancy, or use some
+ * other kind of configuration data, i.e. a hash plus some data about a
+ * namespace, or whatever. see my_server_func, and test_memcache_user_funcs
+ * for the examples.
+ */
+typedef struct {
+ const char *someval;
+ apr_uint32_t which_server;
+} my_hash_server_baton;
+
+
+/* this could do something fancy and return some hash result.
+ * for simplicity, just return the same value, so we can test it later on.
+ * if you wanted to use some external hashing library or functions for
+ * consistent hashing, for example, this would be a good place to do it.
+ */
+static apr_uint32_t my_hash_func(void *baton, const char *data,
+ apr_size_t data_len)
+{
+
+ return HASH_FUNC_RESULT;
+}
+
+/*
+ * a fancy function to determine which server to use given some kind of data
+ * and a hash value. this example actually ignores the hash value itself
+ * and pulls some number from the *baton, which is a struct that has some
+ * kind of meaningful stuff in it.
+ */
+static apr_memcache_server_t *my_server_func(void *baton,
+ apr_memcache_t *mc,
+ const apr_uint32_t hash)
+{
+ apr_memcache_server_t *ms = NULL;
+ my_hash_server_baton *mhsb = (my_hash_server_baton *)baton;
+
+ if(mc->ntotal == 0) {
+ return NULL;
+ }
+
+ if(mc->ntotal < mhsb->which_server) {
+ return NULL;
+ }
+
+ ms = mc->live_servers[mhsb->which_server - 1];
+
+ return ms;
+}
+
+apr_uint16_t firsttime = 0;
+static int randval(apr_uint32_t high)
+{
+ apr_uint32_t i = 0;
+ double d = 0;
+
+ if (firsttime == 0) {
+ srand((unsigned) (getpid()));
+ firsttime = 1;
+ }
+
+ d = (double) rand() / ((double) RAND_MAX + 1);
+ i = (int) (d * (high - 0 + 1));
+
+ return i > 0 ? i : 1;
+}
+
+/*
+ * general test to make sure we can create the memcache struct and add
+ * some servers, but not more than we tell it we can add
+ */
+
+static void test_memcache_create(abts_case * tc, void *data)
+{
+ apr_pool_t *pool = p;
+ apr_status_t rv;
+ apr_memcache_t *memcache;
+ apr_memcache_server_t *server, *s;
+ apr_uint32_t max_servers = 10;
+ apr_uint32_t i;
+ apr_uint32_t hash;
+
+ rv = apr_memcache_create(pool, max_servers, 0, &memcache);
+ ABTS_ASSERT(tc, "memcache create failed", rv == APR_SUCCESS);
+
+ for (i = 1; i <= max_servers; i++) {
+ apr_port_t port;
+
+ port = PORT + i;
+ rv =
+ apr_memcache_server_create(pool, HOST, PORT + i, 0, 1, 1, 60, &server);
+ ABTS_ASSERT(tc, "server create failed", rv == APR_SUCCESS);
+
+ rv = apr_memcache_add_server(memcache, server);
+ ABTS_ASSERT(tc, "server add failed", rv == APR_SUCCESS);
+
+ s = apr_memcache_find_server(memcache, HOST, port);
+ ABTS_PTR_EQUAL(tc, server, s);
+
+ rv = apr_memcache_disable_server(memcache, s);
+ ABTS_ASSERT(tc, "server disable failed", rv == APR_SUCCESS);
+
+ rv = apr_memcache_enable_server(memcache, s);
+ ABTS_ASSERT(tc, "server enable failed", rv == APR_SUCCESS);
+
+ hash = apr_memcache_hash(memcache, prefix, strlen(prefix));
+ ABTS_ASSERT(tc, "hash failed", hash > 0);
+
+ s = apr_memcache_find_server_hash(memcache, hash);
+ ABTS_PTR_NOTNULL(tc, s);
+ }
+
+ rv = apr_memcache_server_create(pool, HOST, PORT, 0, 1, 1, 60, &server);
+ ABTS_ASSERT(tc, "server create failed", rv == APR_SUCCESS);
+
+ rv = apr_memcache_add_server(memcache, server);
+ ABTS_ASSERT(tc, "server add should have failed", rv != APR_SUCCESS);
+
+}
+
+/* install our own custom hashing and server selection routines. */
+
+static int create_test_hash(apr_pool_t *p, apr_hash_t *h)
+{
+ int i;
+
+ for (i = 0; i < TDATA_SIZE; i++) {
+ char *k, *v;
+
+ k = apr_pstrcat(p, prefix, apr_itoa(p, i), NULL);
+ v = apr_pstrndup(p, txt, randval((apr_uint32_t)strlen(txt)));
+
+ apr_hash_set(h, k, APR_HASH_KEY_STRING, v);
+ }
+
+ return i;
+}
+
+static void test_memcache_user_funcs(abts_case * tc, void *data)
+{
+ apr_pool_t *pool = p;
+ apr_status_t rv;
+ apr_memcache_t *memcache;
+ apr_memcache_server_t *found;
+ apr_uint32_t max_servers = 10;
+ apr_uint32_t hres;
+ apr_uint32_t i;
+ my_hash_server_baton *baton =
+ apr_pcalloc(pool, sizeof(my_hash_server_baton));
+
+ rv = apr_memcache_create(pool, max_servers, 0, &memcache);
+ ABTS_ASSERT(tc, "memcache create failed", rv == APR_SUCCESS);
+
+ /* as noted above, install our custom hash function, and call
+ * apr_memcache_hash. the return value should be our predefined number,
+ * and our function just ignores the other args, for simplicity.
+ */
+ memcache->hash_func = my_hash_func;
+
+ hres = apr_memcache_hash(memcache, "whatever", sizeof("whatever") - 1);
+ ABTS_INT_EQUAL(tc, HASH_FUNC_RESULT, hres);
+
+ /* add some servers */
+ for(i = 1; i <= 10; i++) {
+ apr_memcache_server_t *ms;
+
+ rv = apr_memcache_server_create(pool, HOST, i, 0, 1, 1, 60, &ms);
+ ABTS_ASSERT(tc, "server create failed", rv == APR_SUCCESS);
+
+ rv = apr_memcache_add_server(memcache, ms);
+ ABTS_ASSERT(tc, "server add failed", rv == APR_SUCCESS);
+ }
+
+ /*
+ * set 'which_server' in our server_baton to find the third server
+ * which should have the same port.
+ */
+ baton->which_server = 3;
+ memcache->server_func = my_server_func;
+ memcache->server_baton = baton;
+ found = apr_memcache_find_server_hash(memcache, 0);
+ ABTS_ASSERT(tc, "wrong server found", found->port == baton->which_server);
+}
+
+/* test non data related commands like stats and version */
+static void test_memcache_meta(abts_case * tc, void *data)
+{
+ apr_pool_t *pool = p;
+ apr_memcache_t *memcache;
+ apr_memcache_server_t *server;
+ apr_memcache_stats_t *stats;
+ char *result;
+ apr_status_t rv;
+
+ rv = apr_memcache_create(pool, 1, 0, &memcache);
+ ABTS_ASSERT(tc, "memcache create failed", rv == APR_SUCCESS);
+
+ rv = apr_memcache_server_create(pool, HOST, PORT, 0, 1, 1, 60, &server);
+ ABTS_ASSERT(tc, "server create failed", rv == APR_SUCCESS);
+
+ rv = apr_memcache_add_server(memcache, server);
+ ABTS_ASSERT(tc, "server add failed", rv == APR_SUCCESS);
+
+ rv = apr_memcache_version(server, pool, &result);
+ ABTS_PTR_NOTNULL(tc, result);
+
+ rv = apr_memcache_stats(server, p, &stats);
+ ABTS_PTR_NOTNULL(tc, stats);
+
+ ABTS_STR_NEQUAL(tc, stats->version, result, 5);
+
+ /*
+ * no way to know exactly what will be in most of these, so
+ * just make sure there is something.
+ */
+
+ ABTS_ASSERT(tc, "pid", stats->pid >= 0);
+ ABTS_ASSERT(tc, "time", stats->time >= 0);
+ /* ABTS_ASSERT(tc, "pointer_size", stats->pointer_size >= 0); */
+ ABTS_ASSERT(tc, "rusage_user", stats->rusage_user >= 0);
+ ABTS_ASSERT(tc, "rusage_system", stats->rusage_system >= 0);
+
+ ABTS_ASSERT(tc, "curr_items", stats->curr_items >= 0);
+ ABTS_ASSERT(tc, "total_items", stats->total_items >= 0);
+ ABTS_ASSERT(tc, "bytes", stats->bytes >= 0);
+
+ ABTS_ASSERT(tc, "curr_connections", stats->curr_connections >= 0);
+ ABTS_ASSERT(tc, "total_connections", stats->total_connections >= 0);
+ ABTS_ASSERT(tc, "connection_structures",
+ stats->connection_structures >= 0);
+
+ ABTS_ASSERT(tc, "cmd_get", stats->cmd_get >= 0);
+ ABTS_ASSERT(tc, "cmd_set", stats->cmd_set >= 0);
+ ABTS_ASSERT(tc, "get_hits", stats->get_hits >= 0);
+ ABTS_ASSERT(tc, "get_misses", stats->get_misses >= 0);
+
+ /* ABTS_ASSERT(tc, "evictions", stats->evictions >= 0); */
+
+ ABTS_ASSERT(tc, "bytes_read", stats->bytes_read >= 0);
+ ABTS_ASSERT(tc, "bytes_written", stats->bytes_written >= 0);
+ ABTS_ASSERT(tc, "limit_maxbytes", stats->limit_maxbytes >= 0);
+
+ /* ABTS_ASSERT(tc, "threads", stats->threads >= 0); */
+}
+
+/* test add and replace calls */
+
+static void test_memcache_addreplace(abts_case * tc, void *data)
+{
+ apr_pool_t *pool = p;
+ apr_status_t rv;
+ apr_memcache_t *memcache;
+ apr_memcache_server_t *server;
+ apr_hash_t *tdata;
+ apr_hash_index_t *hi;
+ char *result;
+ apr_size_t len;
+
+ rv = apr_memcache_create(pool, 1, 0, &memcache);
+ ABTS_ASSERT(tc, "memcache create failed", rv == APR_SUCCESS);
+
+ rv = apr_memcache_server_create(pool, HOST, PORT, 0, 1, 1, 60, &server);
+ ABTS_ASSERT(tc, "server create failed", rv == APR_SUCCESS);
+
+ rv = apr_memcache_add_server(memcache, server);
+ ABTS_ASSERT(tc, "server add failed", rv == APR_SUCCESS);
+
+ tdata = apr_hash_make(p);
+ create_test_hash(pool, tdata);
+
+ for (hi = apr_hash_first(p, tdata); hi; hi = apr_hash_next(hi)) {
+ const void *k;
+ void *v;
+ const char *key;
+
+ apr_hash_this(hi, &k, NULL, &v);
+ key = k;
+
+ /* doesn't exist yet, fail */
+ rv = apr_memcache_replace(memcache, key, v, strlen(v) - 1, 0, 27);
+ ABTS_ASSERT(tc, "replace should have failed", rv != APR_SUCCESS);
+
+ /* doesn't exist yet, succeed */
+ rv = apr_memcache_add(memcache, key, v, strlen(v), 0, 27);
+ ABTS_ASSERT(tc, "add failed", rv == APR_SUCCESS);
+
+ /* exists now, succeed */
+ rv = apr_memcache_replace(memcache, key, "new", sizeof("new") - 1, 0, 27);
+ ABTS_ASSERT(tc, "replace failed", rv == APR_SUCCESS);
+
+ /* make sure its different */
+ rv = apr_memcache_getp(memcache, pool, key, &result, &len, NULL);
+ ABTS_ASSERT(tc, "get failed", rv == APR_SUCCESS);
+ ABTS_STR_NEQUAL(tc, result, "new", 3);
+
+ /* exists now, fail */
+ rv = apr_memcache_add(memcache, key, v, strlen(v), 0, 27);
+ ABTS_ASSERT(tc, "add should have failed", rv != APR_SUCCESS);
+
+ /* clean up */
+ rv = apr_memcache_delete(memcache, key, 0);
+ ABTS_ASSERT(tc, "delete failed", rv == APR_SUCCESS);
+ }
+}
+
+/* basic tests of the increment and decrement commands */
+static void test_memcache_incrdecr(abts_case * tc, void *data)
+{
+ apr_pool_t *pool = p;
+ apr_status_t rv;
+ apr_memcache_t *memcache;
+ apr_memcache_server_t *server;
+ apr_uint32_t new;
+ char *result;
+ apr_size_t len;
+ apr_uint32_t i;
+
+ rv = apr_memcache_create(pool, 1, 0, &memcache);
+ ABTS_ASSERT(tc, "memcache create failed", rv == APR_SUCCESS);
+
+ rv = apr_memcache_server_create(pool, HOST, PORT, 0, 1, 1, 60, &server);
+ ABTS_ASSERT(tc, "server create failed", rv == APR_SUCCESS);
+
+ rv = apr_memcache_add_server(memcache, server);
+ ABTS_ASSERT(tc, "server add failed", rv == APR_SUCCESS);
+
+ rv = apr_memcache_set(memcache, prefix, "271", sizeof("271") - 1, 0, 27);
+ ABTS_ASSERT(tc, "set failed", rv == APR_SUCCESS);
+
+ for( i = 1; i <= TDATA_SIZE; i++) {
+ apr_uint32_t expect;
+
+ rv = apr_memcache_getp(memcache, pool, prefix, &result, &len, NULL);
+ ABTS_ASSERT(tc, "get failed", rv == APR_SUCCESS);
+
+ expect = i + atoi(result);
+
+ rv = apr_memcache_incr(memcache, prefix, i, &new);
+ ABTS_ASSERT(tc, "incr failed", rv == APR_SUCCESS);
+
+ ABTS_INT_EQUAL(tc, expect, new);
+
+ rv = apr_memcache_decr(memcache, prefix, i, &new);
+ ABTS_ASSERT(tc, "decr failed", rv == APR_SUCCESS);
+ ABTS_INT_EQUAL(tc, atoi(result), new);
+
+ }
+
+ rv = apr_memcache_getp(memcache, pool, prefix, &result, &len, NULL);
+ ABTS_ASSERT(tc, "get failed", rv == APR_SUCCESS);
+
+ ABTS_INT_EQUAL(tc, 271, atoi(result));
+
+ rv = apr_memcache_delete(memcache, prefix, 0);
+ ABTS_ASSERT(tc, "delete failed", rv == APR_SUCCESS);
+}
+
+/* test the multiget functionality */
+static void test_memcache_multiget(abts_case * tc, void *data)
+{
+ apr_pool_t *pool = p;
+ apr_pool_t *tmppool;
+ apr_status_t rv;
+ apr_memcache_t *memcache;
+ apr_memcache_server_t *server;
+ apr_hash_t *tdata, *values;
+ apr_hash_index_t *hi;
+ apr_uint32_t i;
+
+ rv = apr_memcache_create(pool, 1, 0, &memcache);
+ ABTS_ASSERT(tc, "memcache create failed", rv == APR_SUCCESS);
+
+ rv = apr_memcache_server_create(pool, HOST, PORT, 0, 1, 1, 60, &server);
+ ABTS_ASSERT(tc, "server create failed", rv == APR_SUCCESS);
+
+ rv = apr_memcache_add_server(memcache, server);
+ ABTS_ASSERT(tc, "server add failed", rv == APR_SUCCESS);
+
+ values = apr_hash_make(p);
+ tdata = apr_hash_make(p);
+
+ create_test_hash(pool, tdata);
+
+ for (hi = apr_hash_first(p, tdata); hi; hi = apr_hash_next(hi)) {
+ const void *k;
+ void *v;
+ const char *key;
+
+ apr_hash_this(hi, &k, NULL, &v);
+ key = k;
+
+ rv = apr_memcache_set(memcache, key, v, strlen(v), 0, 27);
+ ABTS_ASSERT(tc, "set failed", rv == APR_SUCCESS);
+ }
+
+ rv = apr_pool_create(&tmppool, pool);
+ for (i = 0; i < TDATA_SET; i++)
+ apr_memcache_add_multget_key(pool,
+ apr_pstrcat(pool, prefix,
+ apr_itoa(pool, i), NULL),
+ &values);
+
+ rv = apr_memcache_multgetp(memcache,
+ tmppool,
+ pool,
+ values);
+
+ ABTS_ASSERT(tc, "multgetp failed", rv == APR_SUCCESS);
+ ABTS_ASSERT(tc, "multgetp returned too few results",
+ apr_hash_count(values) == TDATA_SET);
+
+ for (hi = apr_hash_first(p, tdata); hi; hi = apr_hash_next(hi)) {
+ const void *k;
+ const char *key;
+
+ apr_hash_this(hi, &k, NULL, NULL);
+ key = k;
+
+ rv = apr_memcache_delete(memcache, key, 0);
+ ABTS_ASSERT(tc, "delete failed", rv == APR_SUCCESS);
+ }
+
+}
+
+/* test setting and getting */
+
+static void test_memcache_setget(abts_case * tc, void *data)
+{
+ apr_pool_t *pool = p;
+ apr_status_t rv;
+ apr_memcache_t *memcache;
+ apr_memcache_server_t *server;
+ apr_hash_t *tdata;
+ apr_hash_index_t *hi;
+ char *result;
+ apr_size_t len;
+
+ rv = apr_memcache_create(pool, 1, 0, &memcache);
+ ABTS_ASSERT(tc, "memcache create failed", rv == APR_SUCCESS);
+
+ rv = apr_memcache_server_create(pool, HOST, PORT, 0, 1, 1, 60, &server);
+ ABTS_ASSERT(tc, "server create failed", rv == APR_SUCCESS);
+
+ rv = apr_memcache_add_server(memcache, server);
+ ABTS_ASSERT(tc, "server add failed", rv == APR_SUCCESS);
+
+ tdata = apr_hash_make(pool);
+
+ create_test_hash(pool, tdata);
+
+ for (hi = apr_hash_first(p, tdata); hi; hi = apr_hash_next(hi)) {
+ const void *k;
+ void *v;
+ const char *key;
+
+ apr_hash_this(hi, &k, NULL, &v);
+ key = k;
+
+ rv = apr_memcache_set(memcache, key, v, strlen(v), 0, 27);
+ ABTS_ASSERT(tc, "set failed", rv == APR_SUCCESS);
+ rv = apr_memcache_getp(memcache, pool, key, &result, &len, NULL);
+ ABTS_ASSERT(tc, "get failed", rv == APR_SUCCESS);
+ }
+
+ rv = apr_memcache_getp(memcache, pool, "nothere3423", &result, &len, NULL);
+
+ ABTS_ASSERT(tc, "get should have failed", rv != APR_SUCCESS);
+
+ for (hi = apr_hash_first(p, tdata); hi; hi = apr_hash_next(hi)) {
+ const void *k;
+ const char *key;
+
+ apr_hash_this(hi, &k, NULL, NULL);
+ key = k;
+
+ rv = apr_memcache_delete(memcache, key, 0);
+ ABTS_ASSERT(tc, "delete failed", rv == APR_SUCCESS);
+ }
+}
+
+/* use apr_socket stuff to see if there is in fact a memcached server
+ * running on PORT.
+ */
+static apr_status_t check_mc(void)
+{
+ apr_pool_t *pool = p;
+ apr_status_t rv;
+ apr_socket_t *sock = NULL;
+ apr_sockaddr_t *sa;
+ struct iovec vec[2];
+ apr_size_t written;
+ char buf[128];
+ apr_size_t len;
+
+ rv = apr_socket_create(&sock, APR_INET, SOCK_STREAM, 0, pool);
+ if(rv != APR_SUCCESS) {
+ return rv;
+ }
+
+ rv = apr_sockaddr_info_get(&sa, HOST, APR_INET, PORT, 0, pool);
+ if(rv != APR_SUCCESS) {
+ return rv;
+ }
+
+ rv = apr_socket_timeout_set(sock, 1 * APR_USEC_PER_SEC);
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+
+ rv = apr_socket_connect(sock, sa);
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+
+ rv = apr_socket_timeout_set(sock, -1);
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+
+ vec[0].iov_base = "version";
+ vec[0].iov_len = sizeof("version") - 1;
+
+ vec[1].iov_base = "\r\n";
+ vec[1].iov_len = sizeof("\r\n") -1;
+
+ rv = apr_socket_sendv(sock, vec, 2, &written);
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+
+ len = sizeof(buf);
+ rv = apr_socket_recv(sock, buf, &len);
+ if(rv != APR_SUCCESS) {
+ return rv;
+ }
+
+ if(strncmp(buf, "VERSION", sizeof("VERSION")-1) != 0) {
+ rv = APR_EGENERAL;
+ }
+
+ apr_socket_close(sock);
+ return rv;
+}
+
+abts_suite *testmemcache(abts_suite * suite)
+{
+ apr_status_t rv;
+ suite = ADD_SUITE(suite);
+ /* check for a running memcached on the typical port before
+ * trying to run the tests. succeed if we don't find one.
+ */
+ rv = check_mc();
+ if (rv == APR_SUCCESS) {
+ abts_run_test(suite, test_memcache_create, NULL);
+ abts_run_test(suite, test_memcache_user_funcs, NULL);
+ abts_run_test(suite, test_memcache_meta, NULL);
+ abts_run_test(suite, test_memcache_setget, NULL);
+ abts_run_test(suite, test_memcache_multiget, NULL);
+ abts_run_test(suite, test_memcache_addreplace, NULL);
+ abts_run_test(suite, test_memcache_incrdecr, NULL);
+ }
+ else {
+ abts_log_message("Error %d occurred attempting to reach memcached "
+ "on %s:%d. Skipping apr_memcache tests...",
+ rv, HOST, PORT);
+ }
+
+ return suite;
+}
diff --git a/contrib/apr-util/test/testpass.c b/contrib/apr-util/test/testpass.c
new file mode 100644
index 000000000000..2a27a8fbd77f
--- /dev/null
+++ b/contrib/apr-util/test/testpass.c
@@ -0,0 +1,217 @@
+/* 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 <stdio.h>
+#include <stdlib.h>
+
+#include "apr_errno.h"
+#include "apr_strings.h"
+#include "apr_file_io.h"
+#include "apr_thread_pool.h"
+#include "apr_md5.h"
+#include "apr_sha1.h"
+
+#include "abts.h"
+#include "testutil.h"
+
+#if defined(WIN32) || defined(BEOS) || defined(NETWARE)
+#define CRYPT_ALGO_SUPPORTED 0
+#else
+#define CRYPT_ALGO_SUPPORTED 1
+#endif
+
+#if defined __GLIBC_PREREQ
+#if __GLIBC_PREREQ(2,7)
+#define GLIBCSHA_ALGO_SUPPORTED
+#endif
+#endif
+
+#if CRYPT_ALGO_SUPPORTED
+
+static struct {
+ const char *password;
+ const char *hash;
+} passwords[] =
+{
+/*
+ passwords and hashes created with Apache's htpasswd utility like this:
+
+ htpasswd -c -b passwords pass1 pass1
+ htpasswd -b passwords pass2 pass2
+ htpasswd -b passwords pass3 pass3
+ htpasswd -b passwords pass4 pass4
+ htpasswd -b passwords pass5 pass5
+ htpasswd -b passwords pass6 pass6
+ htpasswd -b passwords pass7 pass7
+ htpasswd -b passwords pass8 pass8
+ (insert Perl one-liner to convert to initializer :) )
+ */
+ {"pass1", "1fWDc9QWYCWrQ"},
+ {"pass2", "1fiGx3u7QoXaM"},
+ {"pass3", "1fzijMylTiwCs"},
+ {"pass4", "nHUYc8U2UOP7s"},
+ {"pass5", "nHpETGLGPwAmA"},
+ {"pass6", "nHbsbWmJ3uyhc"},
+ {"pass7", "nHQ3BbF0Y9vpI"},
+ {"pass8", "nHZA1rViSldQk"}
+};
+static int num_passwords = sizeof(passwords) / sizeof(passwords[0]);
+
+static void test_crypt(abts_case *tc, void *data)
+{
+ int i;
+
+ for (i = 0; i < num_passwords; i++) {
+ apr_assert_success(tc, "check for valid password",
+ apr_password_validate(passwords[i].password,
+ passwords[i].hash));
+ }
+}
+
+#if APR_HAS_THREADS
+
+static void * APR_THREAD_FUNC testing_thread(apr_thread_t *thd,
+ void *data)
+{
+ abts_case *tc = data;
+ int i;
+
+ for (i = 0; i < 100; i++) {
+ test_crypt(tc, NULL);
+ }
+
+ return APR_SUCCESS;
+}
+
+#define NUM_THR 20
+
+/* test for threadsafe crypt() */
+static void test_threadsafe(abts_case *tc, void *data)
+{
+ int i;
+ apr_status_t rv;
+ apr_thread_pool_t *thrp;
+
+ rv = apr_thread_pool_create(&thrp, NUM_THR/2, NUM_THR, p);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ for (i = 0; i < NUM_THR; i++) {
+ rv = apr_thread_pool_push(thrp, testing_thread, tc, 0, NULL);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+ }
+
+ apr_thread_pool_destroy(thrp);
+}
+#endif
+
+#endif /* CRYPT_ALGO_SUPPORTED */
+
+static void test_shapass(abts_case *tc, void *data)
+{
+ const char *pass = "hellojed";
+ const char *pass2 = "hellojed2";
+ char hash[100];
+
+ apr_sha1_base64(pass, strlen(pass), hash);
+
+ apr_assert_success(tc, "SHA1 password validated",
+ apr_password_validate(pass, hash));
+ APR_ASSERT_FAILURE(tc, "wrong SHA1 password should not validate",
+ apr_password_validate(pass2, hash));
+}
+
+static void test_md5pass(abts_case *tc, void *data)
+{
+ const char *pass = "hellojed", *salt = "sardine";
+ const char *pass2 = "hellojed2";
+ char hash[100];
+
+ apr_md5_encode(pass, salt, hash, sizeof hash);
+
+ apr_assert_success(tc, "MD5 password validated",
+ apr_password_validate(pass, hash));
+ APR_ASSERT_FAILURE(tc, "wrong MD5 password should not validate",
+ apr_password_validate(pass2, hash));
+}
+
+#ifdef GLIBCSHA_ALGO_SUPPORTED
+
+static struct {
+ const char *password;
+ const char *hash;
+} glibc_sha_pws[] = {
+ /* SHA256 */
+ { "secret1", "$5$0123456789abcdef$SFX.CooXBS8oXsbAPgU/UyiCodhrLQ19sBgvcA3Zh1D" },
+ { "secret2", "$5$rounds=100000$0123456789abcdef$dLXfO5m4d.xv8G66kpz2LyL0.Mi5wjLlH0m7rtgyhyB" },
+ /* SHA512 */
+ { "secret3", "$6$0123456789abcdef$idOsOfoWwnCQkJm9hd2hxS4NnEs9nBA9poOFXsvtrYSoSHaOToCfyUoZwKe.ZCZnq7D95tGVoi2jxZZMyVwTL1" },
+ { "secret4", "$6$rounds=100000$0123456789abcdef$ZiAMjbeA.iIGTWxq2oks9Bvz9sfxaoGPgAtpwimPEwFwkSNMTK7lLwABzzldds/n4UgCQ16HqawPrCrePr4YX1" },
+ { NULL, NULL }
+};
+
+static void test_glibc_shapass(abts_case *tc, void *data)
+{
+ int i = 0;
+ while (glibc_sha_pws[i].password) {
+ apr_assert_success(tc, "check for valid glibc crypt-sha password",
+ apr_password_validate(glibc_sha_pws[i].password,
+ glibc_sha_pws[i].hash));
+ i++;
+ }
+}
+#endif
+
+static void test_bcryptpass(abts_case *tc, void *data)
+{
+ const char *pass = "hellojed";
+ const char *pass2 = "hellojed2";
+ unsigned char salt[] = "sardine_sardine";
+ char hash[100];
+ const char *hash2 = "$2a$08$qipUJiI9fySUN38hcbz.lucXvAmtgowKOWYtB9y3CXyl6lTknruou";
+ const char *pass3 = "foobar";
+
+ apr_assert_success(tc, "bcrypt encode password",
+ apr_bcrypt_encode(pass, 5, salt, sizeof(salt), hash,
+ sizeof(hash)));
+
+ apr_assert_success(tc, "bcrypt password validated",
+ apr_password_validate(pass, hash));
+ APR_ASSERT_FAILURE(tc, "wrong bcrypt password should not validate",
+ apr_password_validate(pass2, hash));
+ apr_assert_success(tc, "bcrypt password validated",
+ apr_password_validate(pass3, hash2));
+}
+
+
+abts_suite *testpass(abts_suite *suite)
+{
+ suite = ADD_SUITE(suite);
+
+#if CRYPT_ALGO_SUPPORTED
+ abts_run_test(suite, test_crypt, NULL);
+#if APR_HAS_THREADS
+ abts_run_test(suite, test_threadsafe, NULL);
+#endif
+#endif /* CRYPT_ALGO_SUPPORTED */
+ abts_run_test(suite, test_shapass, NULL);
+ abts_run_test(suite, test_md5pass, NULL);
+ abts_run_test(suite, test_bcryptpass, NULL);
+#ifdef GLIBCSHA_ALGO_SUPPORTED
+ abts_run_test(suite, test_glibc_shapass, NULL);
+#endif
+
+ return suite;
+}
diff --git a/contrib/apr-util/test/testqueue.c b/contrib/apr-util/test/testqueue.c
new file mode 100644
index 000000000000..8f71775fda2b
--- /dev/null
+++ b/contrib/apr-util/test/testqueue.c
@@ -0,0 +1,135 @@
+/* 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 "apu.h"
+#include "apr_queue.h"
+#include "apr_thread_pool.h"
+#include "apr_time.h"
+#include "abts.h"
+#include "testutil.h"
+
+#if APR_HAS_THREADS
+
+#define NUMBER_CONSUMERS 3
+#define CONSUMER_ACTIVITY 4
+#define NUMBER_PRODUCERS 4
+#define PRODUCER_ACTIVITY 5
+#define QUEUE_SIZE 100
+
+static apr_queue_t *queue;
+
+static void * APR_THREAD_FUNC consumer(apr_thread_t *thd, void *data)
+{
+ long sleeprate;
+ abts_case *tc = data;
+ apr_status_t rv;
+ void *v;
+
+ sleeprate = 1000000/CONSUMER_ACTIVITY;
+ apr_sleep((rand() % 4) * 1000000); /* sleep random seconds */
+
+ while (1)
+ {
+ rv = apr_queue_pop(queue, &v);
+
+ if (rv == APR_EINTR)
+ continue;
+
+ if (rv == APR_EOF)
+ break;
+
+ ABTS_TRUE(tc, v == NULL);
+ ABTS_TRUE(tc, rv == APR_SUCCESS);
+
+ apr_sleep(sleeprate); /* sleep this long to acheive our rate */
+ }
+
+ return NULL;
+}
+
+static void * APR_THREAD_FUNC producer(apr_thread_t *thd, void *data)
+{
+ long sleeprate;
+ abts_case *tc = data;
+ apr_status_t rv;
+
+ sleeprate = 1000000/PRODUCER_ACTIVITY;
+ apr_sleep((rand() % 4) * 1000000); /* sleep random seconds */
+
+ while (1)
+ {
+ rv = apr_queue_push(queue, NULL);
+
+ if (rv == APR_EINTR)
+ continue;
+
+ if (rv == APR_EOF)
+ break;
+
+ ABTS_TRUE(tc, rv == APR_SUCCESS);
+
+ apr_sleep(sleeprate); /* sleep this long to acheive our rate */
+ }
+
+ return NULL;
+}
+
+static void test_queue_producer_consumer(abts_case *tc, void *data)
+{
+ unsigned int i;
+ apr_status_t rv;
+ apr_thread_pool_t *thrp;
+
+ /* XXX: non-portable */
+ srand((unsigned int)apr_time_now());
+
+ rv = apr_queue_create(&queue, QUEUE_SIZE, p);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ rv = apr_thread_pool_create(&thrp, 0, NUMBER_CONSUMERS + NUMBER_PRODUCERS, p);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ for (i = 0; i < NUMBER_CONSUMERS; i++) {
+ rv = apr_thread_pool_push(thrp, consumer, tc, 0, NULL);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+ }
+
+ for (i = 0; i < NUMBER_PRODUCERS; i++) {
+ rv = apr_thread_pool_push(thrp, producer, tc, 0, NULL);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+ }
+
+ apr_sleep(5000000); /* sleep 5 seconds */
+
+ rv = apr_queue_term(queue);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ rv = apr_thread_pool_destroy(thrp);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+}
+
+#endif /* APR_HAS_THREADS */
+
+abts_suite *testqueue(abts_suite *suite)
+{
+ suite = ADD_SUITE(suite);
+
+#if APR_HAS_THREADS
+ abts_run_test(suite, test_queue_producer_consumer, NULL);
+#endif /* APR_HAS_THREADS */
+
+ return suite;
+}
diff --git a/contrib/apr-util/test/testreslist.c b/contrib/apr-util/test/testreslist.c
new file mode 100644
index 000000000000..36333a1533e7
--- /dev/null
+++ b/contrib/apr-util/test/testreslist.c
@@ -0,0 +1,272 @@
+/* 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 <stdio.h>
+#include <stdlib.h>
+
+#include "apr_general.h"
+#include "apu.h"
+#include "apr_reslist.h"
+#include "apr_thread_pool.h"
+
+#if APR_HAVE_TIME_H
+#include <time.h>
+#endif /* APR_HAVE_TIME_H */
+
+#include "abts.h"
+#include "testutil.h"
+
+#if APR_HAS_THREADS
+
+#define RESLIST_MIN 3
+#define RESLIST_SMAX 10
+#define RESLIST_HMAX 20
+#define RESLIST_TTL APR_TIME_C(35000) /* 35 ms */
+#define CONSUMER_THREADS 25
+#define CONSUMER_ITERATIONS 250
+#define CONSTRUCT_SLEEP_TIME APR_TIME_C(25000) /* 25 ms */
+#define DESTRUCT_SLEEP_TIME APR_TIME_C(10000) /* 10 ms */
+#define WORK_DELAY_SLEEP_TIME APR_TIME_C(15000) /* 15 ms */
+
+typedef struct {
+ apr_interval_time_t sleep_upon_construct;
+ apr_interval_time_t sleep_upon_destruct;
+ int c_count;
+ int d_count;
+} my_parameters_t;
+
+typedef struct {
+ int id;
+} my_resource_t;
+
+/* Linear congruential generator */
+static apr_uint32_t lgc(apr_uint32_t a)
+{
+ apr_uint64_t z = a;
+ z *= 279470273;
+ z %= APR_UINT64_C(4294967291);
+ return (apr_uint32_t)z;
+}
+
+static apr_status_t my_constructor(void **resource, void *params,
+ apr_pool_t *pool)
+{
+ my_resource_t *res;
+ my_parameters_t *my_params = params;
+
+ /* Create some resource */
+ res = apr_palloc(pool, sizeof(*res));
+ res->id = my_params->c_count++;
+
+ /* Sleep for awhile, to simulate construction overhead. */
+ apr_sleep(my_params->sleep_upon_construct);
+
+ /* Set the resource so it can be managed by the reslist */
+ *resource = res;
+ return APR_SUCCESS;
+}
+
+static apr_status_t my_destructor(void *resource, void *params,
+ apr_pool_t *pool)
+{
+ my_resource_t *res = resource;
+ my_parameters_t *my_params = params;
+ res->id = my_params->d_count++;
+
+ apr_sleep(my_params->sleep_upon_destruct);
+
+ return APR_SUCCESS;
+}
+
+typedef struct {
+ int tid;
+ abts_case *tc;
+ apr_reslist_t *reslist;
+ apr_interval_time_t work_delay_sleep;
+} my_thread_info_t;
+
+/* MAX_UINT * .95 = 2**32 * .95 = 4080218931u */
+#define PERCENT95th 4080218931u
+
+static void * APR_THREAD_FUNC resource_consuming_thread(apr_thread_t *thd,
+ void *data)
+{
+ int i;
+ apr_uint32_t chance;
+ void *vp;
+ apr_status_t rv;
+ my_resource_t *res;
+ my_thread_info_t *thread_info = data;
+ apr_reslist_t *rl = thread_info->reslist;
+
+#if APR_HAS_RANDOM
+ apr_generate_random_bytes((void*)&chance, sizeof(chance));
+#else
+ chance = (apr_uint32_t)(apr_time_now() % APR_TIME_C(4294967291));
+#endif
+
+ for (i = 0; i < CONSUMER_ITERATIONS; i++) {
+ rv = apr_reslist_acquire(rl, &vp);
+ ABTS_INT_EQUAL(thread_info->tc, APR_SUCCESS, rv);
+ res = vp;
+ apr_sleep(thread_info->work_delay_sleep);
+
+ /* simulate a 5% chance of the resource being bad */
+ chance = lgc(chance);
+ if ( chance < PERCENT95th ) {
+ rv = apr_reslist_release(rl, res);
+ ABTS_INT_EQUAL(thread_info->tc, APR_SUCCESS, rv);
+ } else {
+ rv = apr_reslist_invalidate(rl, res);
+ ABTS_INT_EQUAL(thread_info->tc, APR_SUCCESS, rv);
+ }
+ }
+
+ return APR_SUCCESS;
+}
+
+static void test_timeout(abts_case *tc, apr_reslist_t *rl)
+{
+ apr_status_t rv;
+ my_resource_t *resources[RESLIST_HMAX];
+ void *vp;
+ int i;
+
+ apr_reslist_timeout_set(rl, 1000);
+
+ /* deplete all possible resources from the resource list
+ * so that the next call will block until timeout is reached
+ * (since there are no other threads to make a resource
+ * available)
+ */
+
+ for (i = 0; i < RESLIST_HMAX; i++) {
+ rv = apr_reslist_acquire(rl, (void**)&resources[i]);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+ }
+
+ /* next call will block until timeout is reached */
+ rv = apr_reslist_acquire(rl, &vp);
+ ABTS_TRUE(tc, APR_STATUS_IS_TIMEUP(rv));
+
+ /* release the resources; otherwise the destroy operation
+ * will blow
+ */
+ for (i = 0; i < RESLIST_HMAX; i++) {
+ rv = apr_reslist_release(rl, resources[i]);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+ }
+}
+
+static void test_shrinking(abts_case *tc, apr_reslist_t *rl)
+{
+ apr_status_t rv;
+ my_resource_t *resources[RESLIST_HMAX];
+ my_resource_t *res;
+ void *vp;
+ int i;
+ int sleep_time = RESLIST_TTL / RESLIST_HMAX;
+
+ /* deplete all possible resources from the resource list */
+ for (i = 0; i < RESLIST_HMAX; i++) {
+ rv = apr_reslist_acquire(rl, (void**)&resources[i]);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+ }
+
+ /* Free all resources above RESLIST_SMAX - 1 */
+ for (i = RESLIST_SMAX - 1; i < RESLIST_HMAX; i++) {
+ rv = apr_reslist_release(rl, resources[i]);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+ }
+
+ for (i = 0; i < RESLIST_HMAX; i++) {
+ rv = apr_reslist_acquire(rl, &vp);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+ res = vp;
+ apr_sleep(sleep_time);
+ rv = apr_reslist_release(rl, res);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+ }
+ apr_sleep(sleep_time);
+
+ /*
+ * Now free the remaining elements. This should trigger the shrinking of
+ * the list
+ */
+ for (i = 0; i < RESLIST_SMAX - 1; i++) {
+ rv = apr_reslist_release(rl, resources[i]);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+ }
+}
+
+static void test_reslist(abts_case *tc, void *data)
+{
+ int i;
+ apr_status_t rv;
+ apr_reslist_t *rl;
+ my_parameters_t *params;
+ apr_thread_pool_t *thrp;
+ my_thread_info_t thread_info[CONSUMER_THREADS];
+
+ rv = apr_thread_pool_create(&thrp, CONSUMER_THREADS/2, CONSUMER_THREADS, p);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ /* Create some parameters that will be passed into each
+ * constructor and destructor call. */
+ params = apr_pcalloc(p, sizeof(*params));
+ params->sleep_upon_construct = CONSTRUCT_SLEEP_TIME;
+ params->sleep_upon_destruct = DESTRUCT_SLEEP_TIME;
+
+ /* We're going to want 10 blocks of data from our target rmm. */
+ rv = apr_reslist_create(&rl, RESLIST_MIN, RESLIST_SMAX, RESLIST_HMAX,
+ RESLIST_TTL, my_constructor, my_destructor,
+ params, p);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ for (i = 0; i < CONSUMER_THREADS; i++) {
+ thread_info[i].tid = i;
+ thread_info[i].tc = tc;
+ thread_info[i].reslist = rl;
+ thread_info[i].work_delay_sleep = WORK_DELAY_SLEEP_TIME;
+ rv = apr_thread_pool_push(thrp, resource_consuming_thread,
+ &thread_info[i], 0, NULL);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+ }
+
+ rv = apr_thread_pool_destroy(thrp);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ test_timeout(tc, rl);
+
+ test_shrinking(tc, rl);
+ ABTS_INT_EQUAL(tc, RESLIST_SMAX, params->c_count - params->d_count);
+
+ rv = apr_reslist_destroy(rl);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+}
+
+#endif /* APR_HAS_THREADS */
+
+abts_suite *testreslist(abts_suite *suite)
+{
+ suite = ADD_SUITE(suite);
+
+#if APR_HAS_THREADS
+ abts_run_test(suite, test_reslist, NULL);
+#endif
+
+ return suite;
+}
diff --git a/contrib/apr-util/test/testrmm.c b/contrib/apr-util/test/testrmm.c
new file mode 100644
index 000000000000..4f8fb5ec2c31
--- /dev/null
+++ b/contrib/apr-util/test/testrmm.c
@@ -0,0 +1,191 @@
+/* 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_shm.h"
+#include "apr_rmm.h"
+#include "apr_errno.h"
+#include "apr_general.h"
+#include "apr_lib.h"
+#include "apr_strings.h"
+#include "apr_time.h"
+#include "abts.h"
+#include "testutil.h"
+
+#if APR_HAS_SHARED_MEMORY
+
+#define FRAG_SIZE 80
+#define FRAG_COUNT 10
+#define SHARED_SIZE (apr_size_t)(FRAG_SIZE * FRAG_COUNT * sizeof(char*))
+
+static void test_rmm(abts_case *tc, void *data)
+{
+ apr_status_t rv;
+ apr_pool_t *pool;
+ apr_shm_t *shm;
+ apr_rmm_t *rmm;
+ apr_size_t size, fragsize;
+ apr_rmm_off_t *off, off2;
+ int i;
+ void *entity;
+
+ rv = apr_pool_create(&pool, p);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ /* We're going to want 10 blocks of data from our target rmm. */
+ size = SHARED_SIZE + apr_rmm_overhead_get(FRAG_COUNT + 1);
+ rv = apr_shm_create(&shm, size, NULL, pool);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ if (rv != APR_SUCCESS)
+ return;
+
+ rv = apr_rmm_init(&rmm, NULL, apr_shm_baseaddr_get(shm), size, pool);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ if (rv != APR_SUCCESS)
+ return;
+
+ /* Creating each fragment of size fragsize */
+ fragsize = SHARED_SIZE / FRAG_COUNT;
+ off = apr_palloc(pool, FRAG_COUNT * sizeof(apr_rmm_off_t));
+ for (i = 0; i < FRAG_COUNT; i++) {
+ off[i] = apr_rmm_malloc(rmm, fragsize);
+ }
+
+ /* Checking for out of memory allocation */
+ off2 = apr_rmm_malloc(rmm, FRAG_SIZE * FRAG_COUNT);
+ ABTS_TRUE(tc, !off2);
+
+ /* Checking each fragment for address alignment */
+ for (i = 0; i < FRAG_COUNT; i++) {
+ char *c = apr_rmm_addr_get(rmm, off[i]);
+ apr_size_t sc = (apr_size_t)c;
+
+ ABTS_TRUE(tc, !!off[i]);
+ ABTS_TRUE(tc, !(sc & 7));
+ }
+
+ /* Setting each fragment to a unique value */
+ for (i = 0; i < FRAG_COUNT; i++) {
+ int j;
+ char **c = apr_rmm_addr_get(rmm, off[i]);
+ for (j = 0; j < FRAG_SIZE; j++, c++) {
+ *c = apr_itoa(pool, i + j);
+ }
+ }
+
+ /* Checking each fragment for its unique value */
+ for (i = 0; i < FRAG_COUNT; i++) {
+ int j;
+ char **c = apr_rmm_addr_get(rmm, off[i]);
+ for (j = 0; j < FRAG_SIZE; j++, c++) {
+ char *d = apr_itoa(pool, i + j);
+ ABTS_STR_EQUAL(tc, d, *c);
+ }
+ }
+
+ /* Freeing each fragment */
+ for (i = 0; i < FRAG_COUNT; i++) {
+ rv = apr_rmm_free(rmm, off[i]);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+ }
+
+ /* Creating one large segment */
+ off[0] = apr_rmm_calloc(rmm, SHARED_SIZE);
+
+ /* Setting large segment */
+ for (i = 0; i < FRAG_COUNT * FRAG_SIZE; i++) {
+ char **c = apr_rmm_addr_get(rmm, off[0]);
+ c[i] = apr_itoa(pool, i);
+ }
+
+ /* Freeing large segment */
+ rv = apr_rmm_free(rmm, off[0]);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ /* Creating each fragment of size fragsize */
+ for (i = 0; i < FRAG_COUNT; i++) {
+ off[i] = apr_rmm_malloc(rmm, fragsize);
+ }
+
+ /* Freeing each fragment backwards */
+ for (i = FRAG_COUNT - 1; i >= 0; i--) {
+ rv = apr_rmm_free(rmm, off[i]);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+ }
+
+ /* Creating one large segment (again) */
+ off[0] = apr_rmm_calloc(rmm, SHARED_SIZE);
+
+ /* Freeing large segment */
+ rv = apr_rmm_free(rmm, off[0]);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ /* Checking realloc */
+ off[0] = apr_rmm_calloc(rmm, SHARED_SIZE - 100);
+ off[1] = apr_rmm_calloc(rmm, 100);
+ ABTS_TRUE(tc, !!off[0]);
+ ABTS_TRUE(tc, !!off[1]);
+
+ entity = apr_rmm_addr_get(rmm, off[1]);
+ rv = apr_rmm_free(rmm, off[0]);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ {
+ unsigned char *c = entity;
+
+ /* Fill in the region; the first half with zereos, which will
+ * likely catch the apr_rmm_realloc offset calculation bug by
+ * making it think the old region was zero length. */
+ for (i = 0; i < 100; i++) {
+ c[i] = (i < 50) ? 0 : i;
+ }
+ }
+
+ /* now we can realloc off[1] and get many more bytes */
+ off[0] = apr_rmm_realloc(rmm, entity, SHARED_SIZE - 100);
+ ABTS_TRUE(tc, !!off[0]);
+
+ {
+ unsigned char *c = apr_rmm_addr_get(rmm, off[0]);
+
+ /* fill in the region */
+ for (i = 0; i < 100; i++) {
+ ABTS_TRUE(tc, c[i] == (i < 50 ? 0 : i));
+ }
+ }
+
+ rv = apr_rmm_destroy(rmm);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ rv = apr_shm_destroy(shm);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ apr_pool_destroy(pool);
+}
+
+#endif /* APR_HAS_SHARED_MEMORY */
+
+abts_suite *testrmm(abts_suite *suite)
+{
+ suite = ADD_SUITE(suite);
+
+#if APR_HAS_SHARED_MEMORY
+ abts_run_test(suite, test_rmm, NULL);
+#endif
+
+ return suite;
+}
diff --git a/contrib/apr-util/test/teststrmatch.c b/contrib/apr-util/test/teststrmatch.c
new file mode 100644
index 000000000000..b6a4a12267f5
--- /dev/null
+++ b/contrib/apr-util/test/teststrmatch.c
@@ -0,0 +1,92 @@
+/* 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 "testutil.h"
+
+#include "apr.h"
+#include "apr_general.h"
+#include "apr_strmatch.h"
+#if APR_HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#define APR_WANT_STDIO
+#define APR_WANT_STRFUNC
+#include "apr_want.h"
+
+static void test_str(abts_case *tc, void *data)
+{
+ apr_pool_t *pool = p;
+ const apr_strmatch_pattern *pattern;
+ const apr_strmatch_pattern *pattern_nocase;
+ const apr_strmatch_pattern *pattern_onechar;
+ const apr_strmatch_pattern *pattern_zero;
+ const char *match = NULL;
+ const char *input1 = "string that contains a patterN...";
+ const char *input2 = "string that contains a pattern...";
+ const char *input3 = "pattern at the start of a string";
+ const char *input4 = "string that ends with a pattern";
+ const char *input5 = "patter\200n not found, negative chars in input";
+ const char *input6 = "patter\200n, negative chars, contains pattern...";
+
+ pattern = apr_strmatch_precompile(pool, "pattern", 1);
+ ABTS_PTR_NOTNULL(tc, pattern);
+
+ pattern_nocase = apr_strmatch_precompile(pool, "pattern", 0);
+ ABTS_PTR_NOTNULL(tc, pattern_nocase);
+
+ pattern_onechar = apr_strmatch_precompile(pool, "g", 0);
+ ABTS_PTR_NOTNULL(tc, pattern_onechar);
+
+ pattern_zero = apr_strmatch_precompile(pool, "", 0);
+ ABTS_PTR_NOTNULL(tc, pattern_zero);
+
+ match = apr_strmatch(pattern, input1, strlen(input1));
+ ABTS_PTR_EQUAL(tc, NULL, match);
+
+ match = apr_strmatch(pattern, input2, strlen(input2));
+ ABTS_PTR_EQUAL(tc, input2 + 23, match);
+
+ match = apr_strmatch(pattern_onechar, input1, strlen(input1));
+ ABTS_PTR_EQUAL(tc, input1 + 5, match);
+
+ match = apr_strmatch(pattern_zero, input1, strlen(input1));
+ ABTS_PTR_EQUAL(tc, input1, match);
+
+ match = apr_strmatch(pattern_nocase, input1, strlen(input1));
+ ABTS_PTR_EQUAL(tc, input1 + 23, match);
+
+ match = apr_strmatch(pattern, input3, strlen(input3));
+ ABTS_PTR_EQUAL(tc, input3, match);
+
+ match = apr_strmatch(pattern, input4, strlen(input4));
+ ABTS_PTR_EQUAL(tc, input4 + 24, match);
+
+ match = apr_strmatch(pattern, input5, strlen(input5));
+ ABTS_PTR_EQUAL(tc, NULL, match);
+
+ match = apr_strmatch(pattern, input6, strlen(input6));
+ ABTS_PTR_EQUAL(tc, input6 + 35, match);
+}
+
+abts_suite *teststrmatch(abts_suite *suite)
+{
+ suite = ADD_SUITE(suite);
+
+ abts_run_test(suite, test_str, NULL);
+
+ return suite;
+}
+
diff --git a/contrib/apr-util/test/testuri.c b/contrib/apr-util/test/testuri.c
new file mode 100644
index 000000000000..d0b51e16cfbe
--- /dev/null
+++ b/contrib/apr-util/test/testuri.c
@@ -0,0 +1,331 @@
+/* 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 <stdio.h>
+#include <stdlib.h>
+
+#include "testutil.h"
+#include "apr_general.h"
+#include "apr_strings.h"
+#include "apr_uri.h"
+
+struct aup_test {
+ const char *uri;
+ apr_status_t rv;
+ const char *scheme;
+ const char *hostinfo;
+ const char *user;
+ const char *password;
+ const char *hostname;
+ const char *port_str;
+ const char *path;
+ const char *query;
+ const char *fragment;
+ apr_port_t port;
+};
+
+struct aup_test aup_tests[] =
+{
+ { "http://[/::1]/index.html", APR_EGENERAL },
+ { "http://[", APR_EGENERAL },
+ { "http://[?::1]/index.html", APR_EGENERAL },
+
+ {
+ "http://127.0.0.1:9999/asdf.html",
+ 0, "http", "127.0.0.1:9999", NULL, NULL, "127.0.0.1", "9999", "/asdf.html", NULL, NULL, 9999
+ },
+ {
+ "http://127.0.0.1:9999a/asdf.html",
+ APR_EGENERAL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0
+ },
+ {
+ "http://[::127.0.0.1]:9999/asdf.html",
+ 0, "http", "[::127.0.0.1]:9999", NULL, NULL, "::127.0.0.1", "9999", "/asdf.html", NULL, NULL, 9999
+ },
+ {
+ "http://[::127.0.0.1]:9999a/asdf.html",
+ APR_EGENERAL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0
+ },
+ {
+ "/error/include/top.html",
+ 0, NULL, NULL, NULL, NULL, NULL, NULL, "/error/include/top.html", NULL, NULL, 0
+ },
+ {
+ "/error/include/../contact.html.var",
+ 0, NULL, NULL, NULL, NULL, NULL, NULL, "/error/include/../contact.html.var", NULL, NULL, 0
+ },
+ {
+ "/",
+ 0, NULL, NULL, NULL, NULL, NULL, NULL, "/", NULL, NULL, 0
+ },
+ {
+ "/manual/",
+ 0, NULL, NULL, NULL, NULL, NULL, NULL, "/manual/", NULL, NULL, 0
+ },
+ {
+ "/cocoon/developing/graphics/Using%20Databases-label_over.jpg",
+ 0, NULL, NULL, NULL, NULL, NULL, NULL, "/cocoon/developing/graphics/Using%20Databases-label_over.jpg", NULL, NULL, 0
+ },
+ {
+ "http://sonyamt:garbage@127.0.0.1/filespace/",
+ 0, "http", "sonyamt:garbage@127.0.0.1", "sonyamt", "garbage", "127.0.0.1", NULL, "/filespace/", NULL, NULL, 0
+ },
+ {
+ "http://sonyamt:garbage@[fe80::1]/filespace/",
+ 0, "http", "sonyamt:garbage@[fe80::1]", "sonyamt", "garbage", "fe80::1", NULL, "/filespace/", NULL, NULL, 0
+ },
+ {
+ "http://sonyamt@[fe80::1]/filespace/?arg1=store",
+ 0, "http", "sonyamt@[fe80::1]", "sonyamt", NULL, "fe80::1", NULL, "/filespace/", "arg1=store", NULL, 0
+ },
+ {
+ "http://localhost",
+ 0, "http", "localhost", NULL, NULL, "localhost", NULL, NULL, NULL, NULL, 0
+ },
+ {
+ "//www.apache.org/",
+ 0, NULL, "www.apache.org", NULL, NULL, "www.apache.org", NULL, "/", NULL, NULL, 0
+ },
+ {
+ "file:image.jpg",
+ 0, "file", NULL, NULL, NULL, NULL, NULL, "image.jpg", NULL, NULL, 0
+ },
+ {
+ "file:/image.jpg",
+ 0, "file", NULL, NULL, NULL, NULL, NULL, "/image.jpg", NULL, NULL, 0
+ },
+ {
+ "file:///image.jpg",
+ 0, "file", "", NULL, NULL, "", NULL, "/image.jpg", NULL, NULL, 0
+ },
+ {
+ "file:///tmp/photos/image.jpg",
+ 0, "file", "", NULL, NULL, "", NULL, "/tmp/photos/image.jpg", NULL, NULL, 0
+ },
+ {
+ "file:./image.jpg",
+ 0, "file", NULL, NULL, NULL, NULL, NULL, "./image.jpg", NULL, NULL, 0
+ },
+ {
+ "file:../photos/image.jpg",
+ 0, "file", NULL, NULL, NULL, NULL, NULL, "../photos/image.jpg", NULL, NULL, 0
+ },
+ {
+ "file+ssh-2:../photos/image.jpg",
+ 0, "file+ssh-2", NULL, NULL, NULL, NULL, NULL, "../photos/image.jpg", NULL, NULL, 0
+ },
+ {
+ "script/foo.js",
+ 0, NULL, NULL, NULL, NULL, NULL, NULL, "script/foo.js", NULL, NULL, 0
+ },
+ {
+ "../foo2.js",
+ 0, NULL, NULL, NULL, NULL, NULL, NULL, "../foo2.js", NULL, NULL, 0
+ },
+ {
+ "foo3.js",
+ 0, NULL, NULL, NULL, NULL, NULL, NULL, "foo3.js", NULL, NULL, 0
+ },
+ {
+ "_foo/bar",
+ 0, NULL, NULL, NULL, NULL, NULL, NULL, "_foo/bar", NULL, NULL, 0
+ },
+ {
+ "_foo:/bar",
+ APR_EGENERAL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0
+ },
+ {
+ "2foo:/bar",
+ APR_EGENERAL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0
+ },
+ {
+ ".foo:/bar",
+ APR_EGENERAL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0
+ },
+ {
+ "-foo:/bar",
+ APR_EGENERAL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0
+ },
+ {
+ "+foo:/bar",
+ APR_EGENERAL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0
+ },
+ {
+ "::/bar",
+ APR_EGENERAL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0
+ },
+ {
+ ":/bar",
+ APR_EGENERAL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0
+ },
+ {
+ ":foo",
+ APR_EGENERAL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0
+ },
+ {
+ ":",
+ APR_EGENERAL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0
+ },
+ {
+ "@localhost::8080",
+ APR_EGENERAL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0
+ },
+};
+
+struct uph_test {
+ const char *hostinfo;
+ apr_status_t rv;
+ const char *hostname;
+ const char *port_str;
+ apr_port_t port;
+};
+
+struct uph_test uph_tests[] =
+{
+ {
+ "www.ibm.com:443",
+ 0, "www.ibm.com", "443", 443
+ },
+ {
+ "[fe80::1]:443",
+ 0, "fe80::1", "443", 443
+ },
+ {
+ "127.0.0.1:443",
+ 0, "127.0.0.1", "443", 443
+ },
+ {
+ "127.0.0.1",
+ APR_EGENERAL, NULL, NULL, 0
+ },
+ {
+ "[fe80:80",
+ APR_EGENERAL, NULL, NULL, 0
+ },
+ {
+ "fe80::80]:443",
+ APR_EGENERAL, NULL, NULL, 0
+ }
+};
+
+#if 0
+static void show_info(apr_status_t rv, apr_status_t expected, const apr_uri_t *info)
+{
+ if (rv != expected) {
+ fprintf(stderr, " actual rv: %d expected rv: %d\n", rv, expected);
+ }
+ else {
+ fprintf(stderr,
+ " scheme: %s\n"
+ " hostinfo: %s\n"
+ " user: %s\n"
+ " password: %s\n"
+ " hostname: %s\n"
+ " port_str: %s\n"
+ " path: %s\n"
+ " query: %s\n"
+ " fragment: %s\n"
+ " hostent: %p\n"
+ " port: %u\n"
+ " is_initialized: %u\n"
+ " dns_looked_up: %u\n"
+ " dns_resolved: %u\n",
+ info->scheme, info->hostinfo, info->user, info->password,
+ info->hostname, info->port_str, info->path, info->query,
+ info->fragment, info->hostent, info->port, info->is_initialized,
+ info->dns_looked_up, info->dns_resolved);
+ }
+}
+#endif
+
+static void test_aup(abts_case *tc, void *data)
+{
+ int i;
+ apr_status_t rv;
+ apr_uri_t info;
+ struct aup_test *t;
+ const char *s = NULL;
+
+ for (i = 0; i < sizeof(aup_tests) / sizeof(aup_tests[0]); i++) {
+ char msg[256];
+
+ memset(&info, 0, sizeof(info));
+ t = &aup_tests[i];
+ rv = apr_uri_parse(p, t->uri, &info);
+ apr_snprintf(msg, sizeof msg, "uri '%s': rv=%d not %d", t->uri,
+ rv, t->rv);
+ ABTS_ASSERT(tc, msg, rv == t->rv);
+ if (t->rv == APR_SUCCESS) {
+ ABTS_STR_EQUAL(tc, t->scheme, info.scheme);
+ ABTS_STR_EQUAL(tc, t->hostinfo, info.hostinfo);
+ ABTS_STR_EQUAL(tc, t->user, info.user);
+ ABTS_STR_EQUAL(tc, t->password, info.password);
+ ABTS_STR_EQUAL(tc, t->hostname, info.hostname);
+ ABTS_STR_EQUAL(tc, t->port_str, info.port_str);
+ ABTS_STR_EQUAL(tc, t->path, info.path);
+ ABTS_STR_EQUAL(tc, t->query, info.query);
+ ABTS_STR_EQUAL(tc, t->user, info.user);
+ ABTS_INT_EQUAL(tc, t->port, info.port);
+
+ s = apr_uri_unparse(p, &info, APR_URI_UNP_REVEALPASSWORD);
+ ABTS_STR_EQUAL(tc, t->uri, s);
+
+ s = apr_uri_unparse(p, &info, APR_URI_UNP_OMITSITEPART);
+ rv = apr_uri_parse(p, s, &info);
+ ABTS_STR_EQUAL(tc, info.scheme, NULL);
+ ABTS_STR_EQUAL(tc, info.hostinfo, NULL);
+ ABTS_STR_EQUAL(tc, info.user, NULL);
+ ABTS_STR_EQUAL(tc, info.password, NULL);
+ ABTS_STR_EQUAL(tc, info.hostname, NULL);
+ ABTS_STR_EQUAL(tc, info.port_str, NULL);
+ ABTS_STR_EQUAL(tc, info.path, t->path);
+ ABTS_STR_EQUAL(tc, info.query, t->query);
+ ABTS_STR_EQUAL(tc, info.user, NULL);
+ ABTS_INT_EQUAL(tc, info.port, 0);
+ }
+ }
+}
+
+static void test_uph(abts_case *tc, void *data)
+{
+ int i;
+ apr_status_t rv;
+ apr_uri_t info;
+ struct uph_test *t;
+
+ for (i = 0; i < sizeof(uph_tests) / sizeof(uph_tests[0]); i++) {
+ memset(&info, 0, sizeof(info));
+ t = &uph_tests[i];
+ rv = apr_uri_parse_hostinfo(p, t->hostinfo, &info);
+ ABTS_INT_EQUAL(tc, t->rv, rv);
+ if (t->rv == APR_SUCCESS) {
+ ABTS_STR_EQUAL(tc, t->hostname, info.hostname);
+ ABTS_STR_EQUAL(tc, t->port_str, info.port_str);
+ ABTS_INT_EQUAL(tc, t->port, info.port);
+ }
+ }
+}
+
+abts_suite *testuri(abts_suite *suite)
+{
+ suite = ADD_SUITE(suite);
+
+ abts_run_test(suite, test_aup, NULL);
+ abts_run_test(suite, test_uph, NULL);
+
+ return suite;
+}
+
diff --git a/contrib/apr-util/test/testutil.c b/contrib/apr-util/test/testutil.c
new file mode 100644
index 000000000000..e5f8460023bc
--- /dev/null
+++ b/contrib/apr-util/test/testutil.c
@@ -0,0 +1,60 @@
+/* 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 <stdio.h>
+#include <stdlib.h>
+
+#include "abts.h"
+#include "testutil.h"
+#include "apr_pools.h"
+
+apr_pool_t *p;
+
+void apr_assert_success(abts_case* tc, const char* context, apr_status_t rv)
+{
+ if (rv == APR_ENOTIMPL) {
+ ABTS_NOT_IMPL(tc, context);
+ }
+
+ if (rv != APR_SUCCESS) {
+ char buf[STRING_MAX], ebuf[128];
+ sprintf(buf, "%s (%d): %s\n", context, rv,
+ apr_strerror(rv, ebuf, sizeof ebuf));
+ ABTS_FAIL(tc, buf);
+ }
+}
+
+void apr_assert_failure(abts_case* tc, const char* context, apr_status_t rv,
+ int lineno)
+{
+ if (rv == APR_ENOTIMPL) {
+ abts_not_impl(tc, context, lineno);
+ } else if (rv == APR_SUCCESS) {
+ char buf[STRING_MAX];
+ sprintf(buf, "%s (%d): expected failure, got success\n", context, rv);
+ abts_fail(tc, buf, lineno);
+ }
+}
+
+void initialize(void) {
+ if (apr_initialize() != APR_SUCCESS) {
+ abort();
+ }
+ atexit(apr_terminate);
+
+ apr_pool_create(&p, NULL);
+ apr_pool_tag(p, "apr-util global test pool");
+}
diff --git a/contrib/apr-util/test/testutil.h b/contrib/apr-util/test/testutil.h
new file mode 100644
index 000000000000..c471af40a4a6
--- /dev/null
+++ b/contrib/apr-util/test/testutil.h
@@ -0,0 +1,71 @@
+/* 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_pools.h"
+#include "abts.h"
+
+#ifndef APR_TEST_UTIL
+#define APR_TEST_UTIL
+
+/* XXX FIXME */
+#ifdef WIN32
+#define EXTENSION ".exe"
+#elif NETWARE
+#define EXTENSION ".nlm"
+#else
+#define EXTENSION
+#endif
+
+#define STRING_MAX 8096
+
+/* Some simple functions to make the test apps easier to write and
+ * a bit more consistent...
+ */
+
+extern apr_pool_t *p;
+
+/* Assert that RV is an APR_SUCCESS value; else fail giving strerror
+ * for RV and CONTEXT message. */
+void apr_assert_success(abts_case* tc, const char *context, apr_status_t rv);
+
+void apr_assert_failure(abts_case* tc, const char *context,
+ apr_status_t rv, int lineno);
+#define APR_ASSERT_FAILURE(tc, ctxt, rv) \
+ apr_assert_failure(tc, ctxt, rv, __LINE__)
+
+
+void initialize(void);
+
+abts_suite *teststrmatch(abts_suite *suite);
+abts_suite *testuri(abts_suite *suite);
+abts_suite *testuuid(abts_suite *suite);
+abts_suite *testbuckets(abts_suite *suite);
+abts_suite *testpass(abts_suite *suite);
+abts_suite *testmd4(abts_suite *suite);
+abts_suite *testmd5(abts_suite *suite);
+abts_suite *testcrypto(abts_suite *suite);
+abts_suite *testldap(abts_suite *suite);
+abts_suite *testdbd(abts_suite *suite);
+abts_suite *testdate(abts_suite *suite);
+abts_suite *testmemcache(abts_suite *suite);
+abts_suite *testreslist(abts_suite *suite);
+abts_suite *testqueue(abts_suite *suite);
+abts_suite *testxml(abts_suite *suite);
+abts_suite *testxlate(abts_suite *suite);
+abts_suite *testrmm(abts_suite *suite);
+abts_suite *testdbm(abts_suite *suite);
+
+#endif /* APR_TEST_INCLUDES */
diff --git a/contrib/apr-util/test/testuuid.c b/contrib/apr-util/test/testuuid.c
new file mode 100644
index 000000000000..f33adde11f54
--- /dev/null
+++ b/contrib/apr-util/test/testuuid.c
@@ -0,0 +1,56 @@
+/* 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 "testutil.h"
+#include "apr_general.h"
+#include "apr_uuid.h"
+
+static void test_uuid_parse(abts_case *tc, void *data)
+{
+ apr_uuid_t uuid;
+ apr_uuid_t uuid2;
+ char buf[APR_UUID_FORMATTED_LENGTH + 1];
+
+ apr_uuid_get(&uuid);
+ apr_uuid_format(buf, &uuid);
+
+ apr_uuid_parse(&uuid2, buf);
+ ABTS_ASSERT(tc, "parse produced a different UUID",
+ memcmp(&uuid, &uuid2, sizeof(uuid)) == 0);
+}
+
+static void test_gen2(abts_case *tc, void *data)
+{
+ apr_uuid_t uuid;
+ apr_uuid_t uuid2;
+
+ /* generate two of them quickly */
+ apr_uuid_get(&uuid);
+ apr_uuid_get(&uuid2);
+
+ ABTS_ASSERT(tc, "generated the same UUID twice",
+ memcmp(&uuid, &uuid2, sizeof(uuid)) != 0);
+}
+
+abts_suite *testuuid(abts_suite *suite)
+{
+ suite = ADD_SUITE(suite);
+
+ abts_run_test(suite, test_uuid_parse, NULL);
+ abts_run_test(suite, test_gen2, NULL);
+
+ return suite;
+}
diff --git a/contrib/apr-util/test/testxlate.c b/contrib/apr-util/test/testxlate.c
new file mode 100644
index 000000000000..6981eff6bfd7
--- /dev/null
+++ b/contrib/apr-util/test/testxlate.c
@@ -0,0 +1,134 @@
+/* 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.h"
+#include "apr_errno.h"
+#include "apr_general.h"
+#include "apr_strings.h"
+#include "apr_xlate.h"
+#include "abts.h"
+#include "testutil.h"
+
+#if APR_HAS_XLATE
+
+static const char test_utf8[] = "Edelwei\xc3\x9f";
+static const char test_utf7[] = "Edelwei+AN8-";
+static const char test_latin1[] = "Edelwei\xdf";
+static const char test_latin2[] = "Edelwei\xdf";
+
+static void test_conversion(abts_case *tc, apr_xlate_t *convset,
+ const char *inbuf, const char *expected)
+{
+ static char buf[1024];
+ apr_size_t inbytes_left = strlen(inbuf);
+ apr_size_t outbytes_left = sizeof(buf) - 1;
+ apr_status_t rv;
+
+ rv = apr_xlate_conv_buffer(convset, inbuf, &inbytes_left, buf, &outbytes_left);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ if (rv != APR_SUCCESS)
+ return;
+
+ rv = apr_xlate_conv_buffer(convset, NULL, NULL, buf + sizeof(buf) -
+ outbytes_left - 1, &outbytes_left);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ buf[sizeof(buf) - outbytes_left - 1] = '\0';
+
+ ABTS_STR_EQUAL(tc, expected, buf);
+}
+
+static void one_test(abts_case *tc, const char *cs1, const char *cs2,
+ const char *str1, const char *str2,
+ apr_pool_t *pool)
+{
+ apr_status_t rv;
+ apr_xlate_t *convset;
+
+ rv = apr_xlate_open(&convset, cs2, cs1, pool);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ if (rv != APR_SUCCESS)
+ return;
+
+ test_conversion(tc, convset, str1, str2);
+
+ rv = apr_xlate_close(convset);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+}
+
+#if APU_HAVE_APR_ICONV
+/* it is a bug if iconv_open() fails */
+static int is_transform_supported(abts_case *tc, const char *cs1,
+ const char *cs2, apr_pool_t *pool) {
+ return 1;
+}
+#else
+/* some iconv implementations don't support all tested transforms;
+ * example: 8859-1 <-> 8859-2 using native Solaris iconv
+ */
+static int is_transform_supported(abts_case *tc, const char *cs1,
+ const char *cs2, apr_pool_t *pool) {
+ apr_status_t rv;
+ apr_xlate_t *convset;
+
+ rv = apr_xlate_open(&convset, cs2, cs1, pool);
+ if (rv != APR_SUCCESS) {
+ return 0;
+ }
+
+ rv = apr_xlate_close(convset);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ return 1;
+}
+#endif
+
+static void test_transformation(abts_case *tc, void *data)
+{
+ /* 1. Identity transformation: UTF-8 -> UTF-8 */
+ one_test(tc, "UTF-8", "UTF-8", test_utf8, test_utf8, p);
+
+ /* 2. UTF-8 <-> ISO-8859-1 */
+ one_test(tc, "UTF-8", "ISO-8859-1", test_utf8, test_latin1, p);
+ one_test(tc, "ISO-8859-1", "UTF-8", test_latin1, test_utf8, p);
+
+ /* 3. ISO-8859-1 <-> ISO-8859-2, identity */
+ if (is_transform_supported(tc, "ISO-8859-1", "ISO-8859-2", p)) {
+ one_test(tc, "ISO-8859-1", "ISO-8859-2", test_latin1, test_latin2, p);
+ }
+ if (is_transform_supported(tc, "ISO-8859-2", "ISO-8859-1", p)) {
+ one_test(tc, "ISO-8859-2", "ISO-8859-1", test_latin2, test_latin1, p);
+ }
+
+ /* 4. Transformation using charset aliases */
+ one_test(tc, "UTF-8", "UTF-7", test_utf8, test_utf7, p);
+ one_test(tc, "UTF-7", "UTF-8", test_utf7, test_utf8, p);
+}
+
+#endif /* APR_HAS_XLATE */
+
+abts_suite *testxlate(abts_suite *suite)
+{
+ suite = ADD_SUITE(suite);
+
+#if APR_HAS_XLATE
+ abts_run_test(suite, test_transformation, NULL);
+#endif
+
+ return suite;
+}
diff --git a/contrib/apr-util/test/testxml.c b/contrib/apr-util/test/testxml.c
new file mode 100644
index 000000000000..eed10672ea72
--- /dev/null
+++ b/contrib/apr-util/test/testxml.c
@@ -0,0 +1,205 @@
+/* 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.h"
+#include "apr_general.h"
+#include "apr_xml.h"
+#include "abts.h"
+#include "testutil.h"
+
+static apr_status_t create_dummy_file_error(abts_case *tc, apr_pool_t *p,
+ apr_file_t **fd)
+{
+ int i;
+ apr_status_t rv;
+ apr_off_t off = 0L;
+ char template[] = "data/testxmldummyerrorXXXXXX";
+
+ rv = apr_file_mktemp(fd, template, APR_FOPEN_CREATE | APR_FOPEN_TRUNCATE | APR_FOPEN_DELONCLOSE |
+ APR_FOPEN_READ | APR_FOPEN_WRITE | APR_FOPEN_EXCL, p);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ if (rv != APR_SUCCESS)
+ return rv;
+
+ rv = apr_file_puts("<?xml version=\"1.0\" ?>\n<maryx>"
+ "<had a=\"little\"/><lamb/>\n", *fd);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ for (i = 0; i < 5000; i++) {
+ rv = apr_file_puts("<hmm roast=\"lamb\" "
+ "for=\"dinner\">yummy</hmm>\n", *fd);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+ }
+
+ rv = apr_file_puts("</mary>\n", *fd);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ rv = apr_file_seek(*fd, APR_SET, &off);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ return rv;
+}
+
+static apr_status_t create_dummy_file(abts_case *tc, apr_pool_t *p,
+ apr_file_t **fd)
+{
+ int i;
+ apr_status_t rv;
+ apr_off_t off = 0L;
+ char template[] = "data/testxmldummyXXXXXX";
+
+ rv = apr_file_mktemp(fd, template, APR_FOPEN_CREATE | APR_FOPEN_TRUNCATE | APR_FOPEN_DELONCLOSE |
+ APR_FOPEN_READ | APR_FOPEN_WRITE | APR_FOPEN_EXCL, p);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ if (rv != APR_SUCCESS)
+ return rv;
+
+ rv = apr_file_puts("<?xml version=\"1.0\" ?>\n<mary>\n", *fd);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ for (i = 0; i < 5000; i++) {
+ rv = apr_file_puts("<hmm roast=\"lamb\" "
+ "for=\"dinner &lt;&gt;&#x3D;\">yummy</hmm>\n", *fd);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+ }
+
+ rv = apr_file_puts("</mary>\n", *fd);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ rv = apr_file_seek(*fd, APR_SET, &off);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ return rv;
+}
+
+static void dump_xml(abts_case *tc, apr_xml_elem *e, int level)
+{
+ apr_xml_attr *a;
+ apr_xml_elem *ec;
+
+ if (level == 0) {
+ ABTS_STR_EQUAL(tc, "mary", e->name);
+ } else {
+ ABTS_STR_EQUAL(tc, "hmm", e->name);
+ }
+
+ if (e->attr) {
+ a = e->attr;
+ ABTS_PTR_NOTNULL(tc, a);
+ ABTS_STR_EQUAL(tc, "for", a->name);
+ ABTS_STR_EQUAL(tc, "dinner <>=", a->value);
+ a = a->next;
+ ABTS_PTR_NOTNULL(tc, a);
+ ABTS_STR_EQUAL(tc, "roast", a->name);
+ ABTS_STR_EQUAL(tc, "lamb", a->value);
+ }
+ if (e->first_child) {
+ ec = e->first_child;
+ while (ec) {
+ dump_xml(tc, ec, level + 1);
+ ec = ec->next;
+ }
+ }
+}
+
+static void test_xml_parser(abts_case *tc, void *data)
+{
+ apr_file_t *fd;
+ apr_xml_parser *parser;
+ apr_xml_doc *doc;
+ apr_status_t rv;
+
+ rv = create_dummy_file(tc, p, &fd);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ if (rv != APR_SUCCESS)
+ return;
+
+ rv = apr_xml_parse_file(p, &parser, &doc, fd, 2000);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ dump_xml(tc, doc->root, 0);
+
+ rv = apr_file_close(fd);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ rv = create_dummy_file_error(tc, p, &fd);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ if (rv != APR_SUCCESS)
+ return;
+
+ rv = apr_xml_parse_file(p, &parser, &doc, fd, 2000);
+ ABTS_TRUE(tc, rv != APR_SUCCESS);
+}
+
+static void test_billion_laughs(abts_case *tc, void *data)
+{
+ apr_file_t *fd;
+ apr_xml_parser *parser;
+ apr_xml_doc *doc;
+ apr_status_t rv;
+
+ rv = apr_file_open(&fd, "data/billion-laughs.xml",
+ APR_FOPEN_READ, 0, p);
+ apr_assert_success(tc, "open billion-laughs.xml", rv);
+
+ /* Don't test for return value; if it returns, chances are the bug
+ * is fixed or the machine has insane amounts of RAM. */
+ apr_xml_parse_file(p, &parser, &doc, fd, 2000);
+
+ apr_file_close(fd);
+}
+
+static void test_CVE_2009_3720_alpha(abts_case *tc, void *data)
+{
+ apr_xml_parser *xp;
+ apr_xml_doc *doc;
+ apr_status_t rv;
+
+ xp = apr_xml_parser_create(p);
+
+ rv = apr_xml_parser_feed(xp, "\0\r\n", 3);
+ if (rv == APR_SUCCESS)
+ apr_xml_parser_done(xp, &doc);
+}
+
+static void test_CVE_2009_3720_beta(abts_case *tc, void *data)
+{
+ apr_xml_parser *xp;
+ apr_xml_doc *doc;
+ apr_status_t rv;
+
+ xp = apr_xml_parser_create(p);
+
+ rv = apr_xml_parser_feed(xp, "<?xml version\xc2\x85='1.0'?>\r\n", 25);
+ if (rv == APR_SUCCESS)
+ apr_xml_parser_done(xp, &doc);
+}
+
+abts_suite *testxml(abts_suite *suite)
+{
+ suite = ADD_SUITE(suite);
+
+ abts_run_test(suite, test_xml_parser, NULL);
+ abts_run_test(suite, test_billion_laughs, NULL);
+ abts_run_test(suite, test_CVE_2009_3720_alpha, NULL);
+ abts_run_test(suite, test_CVE_2009_3720_beta, NULL);
+
+ return suite;
+}
diff --git a/contrib/apr-util/uri/apr_uri.c b/contrib/apr-util/uri/apr_uri.c
new file mode 100644
index 000000000000..ca5c49d5df8b
--- /dev/null
+++ b/contrib/apr-util/uri/apr_uri.c
@@ -0,0 +1,962 @@
+/* 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.
+ */
+
+/*
+ * apr_uri.c: URI related utility things
+ *
+ */
+
+#include <stdlib.h>
+
+#include "apu.h"
+#include "apr.h"
+#include "apr_general.h"
+#include "apr_strings.h"
+
+#define APR_WANT_STRFUNC
+#include "apr_want.h"
+
+#include "apr_uri.h"
+
+typedef struct schemes_t schemes_t;
+
+/** Structure to store various schemes and their default ports */
+struct schemes_t {
+ /** The name of the scheme */
+ const char *name;
+ /** The default port for the scheme */
+ apr_port_t default_port;
+};
+
+/* Some WWW schemes and their default ports; this is basically /etc/services */
+/* This will become global when the protocol abstraction comes */
+/* As the schemes are searched by a linear search, */
+/* they are sorted by their expected frequency */
+static schemes_t schemes[] =
+{
+ {"http", APR_URI_HTTP_DEFAULT_PORT},
+ {"ftp", APR_URI_FTP_DEFAULT_PORT},
+ {"https", APR_URI_HTTPS_DEFAULT_PORT},
+ {"gopher", APR_URI_GOPHER_DEFAULT_PORT},
+ {"ldap", APR_URI_LDAP_DEFAULT_PORT},
+ {"nntp", APR_URI_NNTP_DEFAULT_PORT},
+ {"snews", APR_URI_SNEWS_DEFAULT_PORT},
+ {"imap", APR_URI_IMAP_DEFAULT_PORT},
+ {"pop", APR_URI_POP_DEFAULT_PORT},
+ {"sip", APR_URI_SIP_DEFAULT_PORT},
+ {"rtsp", APR_URI_RTSP_DEFAULT_PORT},
+ {"wais", APR_URI_WAIS_DEFAULT_PORT},
+ {"z39.50r", APR_URI_WAIS_DEFAULT_PORT},
+ {"z39.50s", APR_URI_WAIS_DEFAULT_PORT},
+ {"prospero", APR_URI_PROSPERO_DEFAULT_PORT},
+ {"nfs", APR_URI_NFS_DEFAULT_PORT},
+ {"tip", APR_URI_TIP_DEFAULT_PORT},
+ {"acap", APR_URI_ACAP_DEFAULT_PORT},
+ {"telnet", APR_URI_TELNET_DEFAULT_PORT},
+ {"ssh", APR_URI_SSH_DEFAULT_PORT},
+ { NULL, 0xFFFF } /* unknown port */
+};
+
+APU_DECLARE(apr_port_t) apr_uri_port_of_scheme(const char *scheme_str)
+{
+ schemes_t *scheme;
+
+ if (scheme_str) {
+ for (scheme = schemes; scheme->name != NULL; ++scheme) {
+ if (strcasecmp(scheme_str, scheme->name) == 0) {
+ return scheme->default_port;
+ }
+ }
+ }
+ return 0;
+}
+
+/* Unparse a apr_uri_t structure to an URI string.
+ * Optionally suppress the password for security reasons.
+ */
+APU_DECLARE(char *) apr_uri_unparse(apr_pool_t *p,
+ const apr_uri_t *uptr,
+ unsigned flags)
+{
+ char *ret = "";
+
+ /* If suppressing the site part, omit both user name & scheme://hostname */
+ if (!(flags & APR_URI_UNP_OMITSITEPART)) {
+
+ /* Construct a "user:password@" string, honoring the passed
+ * APR_URI_UNP_ flags: */
+ if (uptr->user || uptr->password) {
+ ret = apr_pstrcat(p,
+ (uptr->user && !(flags & APR_URI_UNP_OMITUSER))
+ ? uptr->user : "",
+ (uptr->password && !(flags & APR_URI_UNP_OMITPASSWORD))
+ ? ":" : "",
+ (uptr->password && !(flags & APR_URI_UNP_OMITPASSWORD))
+ ? ((flags & APR_URI_UNP_REVEALPASSWORD)
+ ? uptr->password : "XXXXXXXX")
+ : "",
+ ((uptr->user && !(flags & APR_URI_UNP_OMITUSER)) ||
+ (uptr->password && !(flags & APR_URI_UNP_OMITPASSWORD)))
+ ? "@" : "",
+ NULL);
+ }
+
+ /* Construct scheme://site string */
+ if (uptr->hostname) {
+ int is_default_port;
+ const char *lbrk = "", *rbrk = "";
+
+ if (strchr(uptr->hostname, ':')) { /* v6 literal */
+ lbrk = "[";
+ rbrk = "]";
+ }
+
+ is_default_port =
+ (uptr->port_str == NULL ||
+ uptr->port == 0 ||
+ uptr->port == apr_uri_port_of_scheme(uptr->scheme));
+
+ ret = apr_pstrcat(p, "//", ret, lbrk, uptr->hostname, rbrk,
+ is_default_port ? "" : ":",
+ is_default_port ? "" : uptr->port_str,
+ NULL);
+ }
+ if (uptr->scheme) {
+ ret = apr_pstrcat(p, uptr->scheme, ":", ret, NULL);
+ }
+ }
+
+ /* Should we suppress all path info? */
+ if (!(flags & APR_URI_UNP_OMITPATHINFO)) {
+ /* Append path, query and fragment strings: */
+ ret = apr_pstrcat(p,
+ ret,
+ (uptr->path)
+ ? uptr->path : "",
+ (uptr->query && !(flags & APR_URI_UNP_OMITQUERY))
+ ? "?" : "",
+ (uptr->query && !(flags & APR_URI_UNP_OMITQUERY))
+ ? uptr->query : "",
+ (uptr->fragment && !(flags & APR_URI_UNP_OMITQUERY))
+ ? "#" : NULL,
+ (uptr->fragment && !(flags & APR_URI_UNP_OMITQUERY))
+ ? uptr->fragment : NULL,
+ NULL);
+ }
+ return ret;
+}
+
+/* Here is the hand-optimized parse_uri_components(). There are some wild
+ * tricks we could pull in assembly language that we don't pull here... like we
+ * can do word-at-time scans for delimiter characters using the same technique
+ * that fast memchr()s use. But that would be way non-portable. -djg
+ */
+
+/* We have a apr_table_t that we can index by character and it tells us if the
+ * character is one of the interesting delimiters. Note that we even get
+ * compares for NUL for free -- it's just another delimiter.
+ */
+
+#define T_SLASH 0x01 /* '/' */
+#define T_QUESTION 0x02 /* '?' */
+#define T_HASH 0x04 /* '#' */
+#define T_ALPHA 0x08 /* 'A' ... 'Z', 'a' ... 'z' */
+#define T_SCHEME 0x10 /* '0' ... '9', '-', '+', '.'
+ * (allowed in scheme except first char)
+ */
+#define T_NUL 0x80 /* '\0' */
+
+#if APR_CHARSET_EBCDIC
+/* Delimiter table for the EBCDIC character set */
+static const unsigned char uri_delims[256] = {
+ T_NUL, /* 0x00 */
+ 0, /* 0x01 */
+ 0, /* 0x02 */
+ 0, /* 0x03 */
+ 0, /* 0x04 */
+ 0, /* 0x05 */
+ 0, /* 0x06 */
+ 0, /* 0x07 */
+ 0, /* 0x08 */
+ 0, /* 0x09 */
+ 0, /* 0x0a */
+ 0, /* 0x0b */
+ 0, /* 0x0c */
+ 0, /* 0x0d */
+ 0, /* 0x0e */
+ 0, /* 0x0f */
+ 0, /* 0x10 */
+ 0, /* 0x11 */
+ 0, /* 0x12 */
+ 0, /* 0x13 */
+ 0, /* 0x14 */
+ 0, /* 0x15 */
+ 0, /* 0x16 */
+ 0, /* 0x17 */
+ 0, /* 0x18 */
+ 0, /* 0x19 */
+ 0, /* 0x1a */
+ 0, /* 0x1b */
+ 0, /* 0x1c */
+ 0, /* 0x1d */
+ 0, /* 0x1e */
+ 0, /* 0x1f */
+ 0, /* 0x20 */
+ 0, /* 0x21 */
+ 0, /* 0x22 */
+ 0, /* 0x23 */
+ 0, /* 0x24 */
+ 0, /* 0x25 */
+ 0, /* 0x26 */
+ 0, /* 0x27 */
+ 0, /* 0x28 */
+ 0, /* 0x29 */
+ 0, /* 0x2a */
+ 0, /* 0x2b */
+ 0, /* 0x2c */
+ 0, /* 0x2d */
+ 0, /* 0x2e */
+ 0, /* 0x2f */
+ 0, /* 0x30 */
+ 0, /* 0x31 */
+ 0, /* 0x32 */
+ 0, /* 0x33 */
+ 0, /* 0x34 */
+ 0, /* 0x35 */
+ 0, /* 0x36 */
+ 0, /* 0x37 */
+ 0, /* 0x38 */
+ 0, /* 0x39 */
+ 0, /* 0x3a */
+ 0, /* 0x3b */
+ 0, /* 0x3c */
+ 0, /* 0x3d */
+ 0, /* 0x3e */
+ 0, /* 0x3f */
+ 0, /* 0x40 ' ' */
+ 0, /* 0x41 */
+ 0, /* 0x42 */
+ 0, /* 0x43 */
+ 0, /* 0x44 */
+ 0, /* 0x45 */
+ 0, /* 0x46 */
+ 0, /* 0x47 */
+ 0, /* 0x48 */
+ 0, /* 0x49 */
+ 0, /* 0x4a '[' */
+ T_SCHEME, /* 0x4b '.' */
+ 0, /* 0x4c '<' */
+ 0, /* 0x4d '(' */
+ T_SCHEME, /* 0x4e '+' */
+ 0, /* 0x4f '!' */
+ 0, /* 0x50 '&' */
+ 0, /* 0x51 */
+ 0, /* 0x52 */
+ 0, /* 0x53 */
+ 0, /* 0x54 */
+ 0, /* 0x55 */
+ 0, /* 0x56 */
+ 0, /* 0x57 */
+ 0, /* 0x58 */
+ 0, /* 0x59 */
+ 0, /* 0x5a ']' */
+ 0, /* 0x5b '$' */
+ 0, /* 0x5c '*' */
+ 0, /* 0x5d ')' */
+ 0, /* 0x5e ';' */
+ 0, /* 0x5f '^' */
+ T_SCHEME, /* 0x60 '-' */
+ T_SLASH, /* 0x61 '/' */
+ 0, /* 0x62 */
+ 0, /* 0x63 */
+ 0, /* 0x64 */
+ 0, /* 0x65 */
+ 0, /* 0x66 */
+ 0, /* 0x67 */
+ 0, /* 0x68 */
+ 0, /* 0x69 */
+ 0, /* 0x6a '|' */
+ 0, /* 0x6b ',' */
+ 0, /* 0x6c '%' */
+ 0, /* 0x6d '_' */
+ 0, /* 0x6e '>' */
+ T_QUESTION, /* 0x6f '?' */
+ 0, /* 0x70 */
+ 0, /* 0x71 */
+ 0, /* 0x72 */
+ 0, /* 0x73 */
+ 0, /* 0x74 */
+ 0, /* 0x75 */
+ 0, /* 0x76 */
+ 0, /* 0x77 */
+ 0, /* 0x78 */
+ 0, /* 0x79 '`' */
+ 0, /* 0x7a ':' */
+ T_HASH, /* 0x7b '#' */
+ 0, /* 0x7c '@' */
+ 0, /* 0x7d ''' */
+ 0, /* 0x7e '=' */
+ 0, /* 0x7f '"' */
+ 0, /* 0x80 */
+ T_ALPHA, /* 0x81 'a' */
+ T_ALPHA, /* 0x82 'b' */
+ T_ALPHA, /* 0x83 'c' */
+ T_ALPHA, /* 0x84 'd' */
+ T_ALPHA, /* 0x85 'e' */
+ T_ALPHA, /* 0x86 'f' */
+ T_ALPHA, /* 0x87 'g' */
+ T_ALPHA, /* 0x88 'h' */
+ T_ALPHA, /* 0x89 'i' */
+ 0, /* 0x8a */
+ 0, /* 0x8b */
+ 0, /* 0x8c */
+ 0, /* 0x8d */
+ 0, /* 0x8e */
+ 0, /* 0x8f */
+ 0, /* 0x90 */
+ T_ALPHA, /* 0x91 'j' */
+ T_ALPHA, /* 0x92 'k' */
+ T_ALPHA, /* 0x93 'l' */
+ T_ALPHA, /* 0x94 'm' */
+ T_ALPHA, /* 0x95 'n' */
+ T_ALPHA, /* 0x96 'o' */
+ T_ALPHA, /* 0x97 'p' */
+ T_ALPHA, /* 0x98 'q' */
+ T_ALPHA, /* 0x99 'r' */
+ 0, /* 0x9a */
+ 0, /* 0x9b */
+ 0, /* 0x9c */
+ 0, /* 0x9d */
+ 0, /* 0x9e */
+ 0, /* 0x9f */
+ 0, /* 0xa0 */
+ 0, /* 0xa1 '~' */
+ T_ALPHA, /* 0xa2 's' */
+ T_ALPHA, /* 0xa3 't' */
+ T_ALPHA, /* 0xa4 'u' */
+ T_ALPHA, /* 0xa5 'v' */
+ T_ALPHA, /* 0xa6 'w' */
+ T_ALPHA, /* 0xa7 'x' */
+ T_ALPHA, /* 0xa8 'y' */
+ T_ALPHA, /* 0xa9 'z' */
+ 0, /* 0xaa */
+ 0, /* 0xab */
+ 0, /* 0xac */
+ 0, /* 0xad */
+ 0, /* 0xae */
+ 0, /* 0xaf */
+ 0, /* 0xb0 */
+ 0, /* 0xb1 */
+ 0, /* 0xb2 */
+ 0, /* 0xb3 */
+ 0, /* 0xb4 */
+ 0, /* 0xb5 */
+ 0, /* 0xb6 */
+ 0, /* 0xb7 */
+ 0, /* 0xb8 */
+ 0, /* 0xb9 */
+ 0, /* 0xba */
+ 0, /* 0xbb */
+ 0, /* 0xbc */
+ 0, /* 0xbd */
+ 0, /* 0xbe */
+ 0, /* 0xbf */
+ 0, /* 0xc0 '{' */
+ T_ALPHA, /* 0xc1 'A' */
+ T_ALPHA, /* 0xc2 'B' */
+ T_ALPHA, /* 0xc3 'C' */
+ T_ALPHA, /* 0xc4 'D' */
+ T_ALPHA, /* 0xc5 'E' */
+ T_ALPHA, /* 0xc6 'F' */
+ T_ALPHA, /* 0xc7 'G' */
+ T_ALPHA, /* 0xc8 'H' */
+ T_ALPHA, /* 0xc9 'I' */
+ 0, /* 0xca */
+ 0, /* 0xcb */
+ 0, /* 0xcc */
+ 0, /* 0xcd */
+ 0, /* 0xce */
+ 0, /* 0xcf */
+ 0, /* 0xd0 '}' */
+ T_ALPHA, /* 0xd1 'J' */
+ T_ALPHA, /* 0xd2 'K' */
+ T_ALPHA, /* 0xd3 'L' */
+ T_ALPHA, /* 0xd4 'M' */
+ T_ALPHA, /* 0xd5 'N' */
+ T_ALPHA, /* 0xd6 'O' */
+ T_ALPHA, /* 0xd7 'P' */
+ T_ALPHA, /* 0xd8 'Q' */
+ T_ALPHA, /* 0xd9 'R' */
+ 0, /* 0xda */
+ 0, /* 0xdb */
+ 0, /* 0xdc */
+ 0, /* 0xdd */
+ 0, /* 0xde */
+ 0, /* 0xdf */
+ 0, /* 0xe0 '\' */
+ 0, /* 0xe1 */
+ T_ALPHA, /* 0xe2 'S' */
+ T_ALPHA, /* 0xe3 'T' */
+ T_ALPHA, /* 0xe4 'U' */
+ T_ALPHA, /* 0xe5 'V' */
+ T_ALPHA, /* 0xe6 'W' */
+ T_ALPHA, /* 0xe7 'X' */
+ T_ALPHA, /* 0xe8 'Y' */
+ T_ALPHA, /* 0xe9 'Z' */
+ 0, /* 0xea */
+ 0, /* 0xeb */
+ 0, /* 0xec */
+ 0, /* 0xed */
+ 0, /* 0xee */
+ 0, /* 0xef */
+ T_SCHEME, /* 0xf0 '0' */
+ T_SCHEME, /* 0xf1 '1' */
+ T_SCHEME, /* 0xf2 '2' */
+ T_SCHEME, /* 0xf3 '3' */
+ T_SCHEME, /* 0xf4 '4' */
+ T_SCHEME, /* 0xf5 '5' */
+ T_SCHEME, /* 0xf6 '6' */
+ T_SCHEME, /* 0xf7 '7' */
+ T_SCHEME, /* 0xf8 '8' */
+ T_SCHEME, /* 0xf9 '9' */
+ 0, /* 0xfa */
+ 0, /* 0xfb */
+ 0, /* 0xfc */
+ 0, /* 0xfd */
+ 0, /* 0xfe */
+ 0 /* 0xff */
+};
+#else
+/* Delimiter table for the ASCII character set */
+static const unsigned char uri_delims[256] = {
+ T_NUL, /* 0x00 */
+ 0, /* 0x01 */
+ 0, /* 0x02 */
+ 0, /* 0x03 */
+ 0, /* 0x04 */
+ 0, /* 0x05 */
+ 0, /* 0x06 */
+ 0, /* 0x07 */
+ 0, /* 0x08 */
+ 0, /* 0x09 */
+ 0, /* 0x0a */
+ 0, /* 0x0b */
+ 0, /* 0x0c */
+ 0, /* 0x0d */
+ 0, /* 0x0e */
+ 0, /* 0x0f */
+ 0, /* 0x10 */
+ 0, /* 0x11 */
+ 0, /* 0x12 */
+ 0, /* 0x13 */
+ 0, /* 0x14 */
+ 0, /* 0x15 */
+ 0, /* 0x16 */
+ 0, /* 0x17 */
+ 0, /* 0x18 */
+ 0, /* 0x19 */
+ 0, /* 0x1a */
+ 0, /* 0x1b */
+ 0, /* 0x1c */
+ 0, /* 0x1d */
+ 0, /* 0x1e */
+ 0, /* 0x1f */
+ 0, /* 0x20 ' ' */
+ 0, /* 0x21 '!' */
+ 0, /* 0x22 '"' */
+ T_HASH, /* 0x23 '#' */
+ 0, /* 0x24 '$' */
+ 0, /* 0x25 '%' */
+ 0, /* 0x26 '&' */
+ 0, /* 0x27 ''' */
+ 0, /* 0x28 '(' */
+ 0, /* 0x29 ')' */
+ 0, /* 0x2a '*' */
+ T_SCHEME, /* 0x2b '+' */
+ 0, /* 0x2c ',' */
+ T_SCHEME, /* 0x2d '-' */
+ T_SCHEME, /* 0x2e '.' */
+ T_SLASH, /* 0x2f '/' */
+ T_SCHEME, /* 0x30 '0' */
+ T_SCHEME, /* 0x31 '1' */
+ T_SCHEME, /* 0x32 '2' */
+ T_SCHEME, /* 0x33 '3' */
+ T_SCHEME, /* 0x34 '4' */
+ T_SCHEME, /* 0x35 '5' */
+ T_SCHEME, /* 0x36 '6' */
+ T_SCHEME, /* 0x37 '7' */
+ T_SCHEME, /* 0x38 '8' */
+ T_SCHEME, /* 0x39 '9' */
+ 0, /* 0x3a ':' */
+ 0, /* 0x3b ';' */
+ 0, /* 0x3c '<' */
+ 0, /* 0x3d '=' */
+ 0, /* 0x3e '>' */
+ T_QUESTION, /* 0x3f '?' */
+ 0, /* 0x40 '@' */
+ T_ALPHA, /* 0x41 'A' */
+ T_ALPHA, /* 0x42 'B' */
+ T_ALPHA, /* 0x43 'C' */
+ T_ALPHA, /* 0x44 'D' */
+ T_ALPHA, /* 0x45 'E' */
+ T_ALPHA, /* 0x46 'F' */
+ T_ALPHA, /* 0x47 'G' */
+ T_ALPHA, /* 0x48 'H' */
+ T_ALPHA, /* 0x49 'I' */
+ T_ALPHA, /* 0x4a 'J' */
+ T_ALPHA, /* 0x4b 'K' */
+ T_ALPHA, /* 0x4c 'L' */
+ T_ALPHA, /* 0x4d 'M' */
+ T_ALPHA, /* 0x4e 'N' */
+ T_ALPHA, /* 0x4f 'O' */
+ T_ALPHA, /* 0x50 'P' */
+ T_ALPHA, /* 0x51 'Q' */
+ T_ALPHA, /* 0x52 'R' */
+ T_ALPHA, /* 0x53 'S' */
+ T_ALPHA, /* 0x54 'T' */
+ T_ALPHA, /* 0x55 'U' */
+ T_ALPHA, /* 0x56 'V' */
+ T_ALPHA, /* 0x57 'W' */
+ T_ALPHA, /* 0x58 'X' */
+ T_ALPHA, /* 0x59 'Y' */
+ T_ALPHA, /* 0x5a 'Z' */
+ 0, /* 0x5b '[' */
+ 0, /* 0x5c '\' */
+ 0, /* 0x5d ']' */
+ 0, /* 0x5e '^' */
+ 0, /* 0x5f '_' */
+ 0, /* 0x60 '`' */
+ T_ALPHA, /* 0x61 'a' */
+ T_ALPHA, /* 0x62 'b' */
+ T_ALPHA, /* 0x63 'c' */
+ T_ALPHA, /* 0x64 'd' */
+ T_ALPHA, /* 0x65 'e' */
+ T_ALPHA, /* 0x66 'f' */
+ T_ALPHA, /* 0x67 'g' */
+ T_ALPHA, /* 0x68 'h' */
+ T_ALPHA, /* 0x69 'i' */
+ T_ALPHA, /* 0x6a 'j' */
+ T_ALPHA, /* 0x6b 'k' */
+ T_ALPHA, /* 0x6c 'l' */
+ T_ALPHA, /* 0x6d 'm' */
+ T_ALPHA, /* 0x6e 'n' */
+ T_ALPHA, /* 0x6f 'o' */
+ T_ALPHA, /* 0x70 'p' */
+ T_ALPHA, /* 0x71 'q' */
+ T_ALPHA, /* 0x72 'r' */
+ T_ALPHA, /* 0x73 's' */
+ T_ALPHA, /* 0x74 't' */
+ T_ALPHA, /* 0x75 'u' */
+ T_ALPHA, /* 0x76 'v' */
+ T_ALPHA, /* 0x77 'w' */
+ T_ALPHA, /* 0x78 'x' */
+ T_ALPHA, /* 0x79 'y' */
+ T_ALPHA, /* 0x7a 'z' */
+ 0, /* 0x7b '{' */
+ 0, /* 0x7c '|' */
+ 0, /* 0x7d '}' */
+ 0, /* 0x7e '~' */
+ 0, /* 0x7f */
+ 0, /* 0x80 */
+ 0, /* 0x81 */
+ 0, /* 0x82 */
+ 0, /* 0x83 */
+ 0, /* 0x84 */
+ 0, /* 0x85 */
+ 0, /* 0x86 */
+ 0, /* 0x87 */
+ 0, /* 0x88 */
+ 0, /* 0x89 */
+ 0, /* 0x8a */
+ 0, /* 0x8b */
+ 0, /* 0x8c */
+ 0, /* 0x8d */
+ 0, /* 0x8e */
+ 0, /* 0x8f */
+ 0, /* 0x90 */
+ 0, /* 0x91 */
+ 0, /* 0x92 */
+ 0, /* 0x93 */
+ 0, /* 0x94 */
+ 0, /* 0x95 */
+ 0, /* 0x96 */
+ 0, /* 0x97 */
+ 0, /* 0x98 */
+ 0, /* 0x99 */
+ 0, /* 0x9a */
+ 0, /* 0x9b */
+ 0, /* 0x9c */
+ 0, /* 0x9d */
+ 0, /* 0x9e */
+ 0, /* 0x9f */
+ 0, /* 0xa0 */
+ 0, /* 0xa1 */
+ 0, /* 0xa2 */
+ 0, /* 0xa3 */
+ 0, /* 0xa4 */
+ 0, /* 0xa5 */
+ 0, /* 0xa6 */
+ 0, /* 0xa7 */
+ 0, /* 0xa8 */
+ 0, /* 0xa9 */
+ 0, /* 0xaa */
+ 0, /* 0xab */
+ 0, /* 0xac */
+ 0, /* 0xad */
+ 0, /* 0xae */
+ 0, /* 0xaf */
+ 0, /* 0xb0 */
+ 0, /* 0xb1 */
+ 0, /* 0xb2 */
+ 0, /* 0xb3 */
+ 0, /* 0xb4 */
+ 0, /* 0xb5 */
+ 0, /* 0xb6 */
+ 0, /* 0xb7 */
+ 0, /* 0xb8 */
+ 0, /* 0xb9 */
+ 0, /* 0xba */
+ 0, /* 0xbb */
+ 0, /* 0xbc */
+ 0, /* 0xbd */
+ 0, /* 0xbe */
+ 0, /* 0xbf */
+ 0, /* 0xc0 */
+ 0, /* 0xc1 */
+ 0, /* 0xc2 */
+ 0, /* 0xc3 */
+ 0, /* 0xc4 */
+ 0, /* 0xc5 */
+ 0, /* 0xc6 */
+ 0, /* 0xc7 */
+ 0, /* 0xc8 */
+ 0, /* 0xc9 */
+ 0, /* 0xca */
+ 0, /* 0xcb */
+ 0, /* 0xcc */
+ 0, /* 0xcd */
+ 0, /* 0xce */
+ 0, /* 0xcf */
+ 0, /* 0xd0 */
+ 0, /* 0xd1 */
+ 0, /* 0xd2 */
+ 0, /* 0xd3 */
+ 0, /* 0xd4 */
+ 0, /* 0xd5 */
+ 0, /* 0xd6 */
+ 0, /* 0xd7 */
+ 0, /* 0xd8 */
+ 0, /* 0xd9 */
+ 0, /* 0xda */
+ 0, /* 0xdb */
+ 0, /* 0xdc */
+ 0, /* 0xdd */
+ 0, /* 0xde */
+ 0, /* 0xdf */
+ 0, /* 0xe0 */
+ 0, /* 0xe1 */
+ 0, /* 0xe2 */
+ 0, /* 0xe3 */
+ 0, /* 0xe4 */
+ 0, /* 0xe5 */
+ 0, /* 0xe6 */
+ 0, /* 0xe7 */
+ 0, /* 0xe8 */
+ 0, /* 0xe9 */
+ 0, /* 0xea */
+ 0, /* 0xeb */
+ 0, /* 0xec */
+ 0, /* 0xed */
+ 0, /* 0xee */
+ 0, /* 0xef */
+ 0, /* 0xf0 */
+ 0, /* 0xf1 */
+ 0, /* 0xf2 */
+ 0, /* 0xf3 */
+ 0, /* 0xf4 */
+ 0, /* 0xf5 */
+ 0, /* 0xf6 */
+ 0, /* 0xf7 */
+ 0, /* 0xf8 */
+ 0, /* 0xf9 */
+ 0, /* 0xfa */
+ 0, /* 0xfb */
+ 0, /* 0xfc */
+ 0, /* 0xfd */
+ 0, /* 0xfe */
+ 0 /* 0xff */
+};
+#endif
+
+
+/* it works like this:
+ if (uri_delims[ch] & NOTEND_foobar) {
+ then we're not at a delimiter for foobar
+ }
+*/
+
+#define NOTEND_HOSTINFO (T_SLASH | T_QUESTION | T_HASH | T_NUL)
+#define NOTEND_PATH (T_QUESTION | T_HASH | T_NUL)
+
+/* parse_uri_components():
+ * Parse a given URI, fill in all supplied fields of a uri_components
+ * structure. This eliminates the necessity of extracting host, port,
+ * path, query info repeatedly in the modules.
+ * Side effects:
+ * - fills in fields of uri_components *uptr
+ * - none on any of the r->* fields
+ */
+APU_DECLARE(apr_status_t) apr_uri_parse(apr_pool_t *p, const char *uri,
+ apr_uri_t *uptr)
+{
+ const char *s;
+ const char *s1;
+ const char *hostinfo;
+ char *endstr;
+ int port;
+ int v6_offset1 = 0, v6_offset2 = 0;
+
+ /* Initialize the structure. parse_uri() and parse_uri_components()
+ * can be called more than once per request.
+ */
+ memset (uptr, '\0', sizeof(*uptr));
+ uptr->is_initialized = 1;
+
+ /* We assume the processor has a branch predictor like most --
+ * it assumes forward branches are untaken and backwards are taken. That's
+ * the reason for the gotos. -djg
+ */
+ if (uri[0] == '/') {
+ /* RFC2396 #4.3 says that two leading slashes mean we have an
+ * authority component, not a path! Fixing this looks scary
+ * with the gotos here. But if the existing logic is valid,
+ * then presumably a goto pointing to deal_with_authority works.
+ *
+ * RFC2396 describes this as resolving an ambiguity. In the
+ * case of three or more slashes there would seem to be no
+ * ambiguity, so it is a path after all.
+ */
+ if (uri[1] == '/' && uri[2] != '/') {
+ s = uri + 2 ;
+ goto deal_with_authority ;
+ }
+
+deal_with_path:
+ /* we expect uri to point to first character of path ... remember
+ * that the path could be empty -- http://foobar?query for example
+ */
+ s = uri;
+ while ((uri_delims[*(unsigned char *)s] & NOTEND_PATH) == 0) {
+ ++s;
+ }
+ if (s != uri) {
+ uptr->path = apr_pstrmemdup(p, uri, s - uri);
+ }
+ if (*s == 0) {
+ return APR_SUCCESS;
+ }
+ if (*s == '?') {
+ ++s;
+ s1 = strchr(s, '#');
+ if (s1) {
+ uptr->fragment = apr_pstrdup(p, s1 + 1);
+ uptr->query = apr_pstrmemdup(p, s, s1 - s);
+ }
+ else {
+ uptr->query = apr_pstrdup(p, s);
+ }
+ return APR_SUCCESS;
+ }
+ /* otherwise it's a fragment */
+ uptr->fragment = apr_pstrdup(p, s + 1);
+ return APR_SUCCESS;
+ }
+
+ /* find the scheme: */
+ s = uri;
+ /* first char must be letter */
+ if (uri_delims[*(unsigned char *)s] & T_ALPHA) {
+ ++s;
+ while ((uri_delims[*(unsigned char *)s] & (T_ALPHA|T_SCHEME)))
+ ++s;
+ }
+ /* scheme must be non-empty and followed by : */
+ if (s != uri && s[0] == ':') {
+ uptr->scheme = apr_pstrmemdup(p, uri, s - uri);
+ s++;
+ }
+ else {
+ /* No valid scheme, restart from the beginning */
+ s = uri;
+ }
+
+ if (s[0] != '/' || s[1] != '/') {
+ if (uri == s) {
+ /*
+ * RFC 3986 3.3: If we have no scheme and no authority,
+ * the leading segment of a relative path must not contain a ':'.
+ */
+ char *first_slash = strchr(uri, '/');
+ if (first_slash) {
+ while (s < first_slash) {
+ if (s[0] == ':')
+ return APR_EGENERAL;
+ ++s;
+ }
+ /* no scheme but relative path, e.g. '../image.jpg' */
+ }
+ else {
+ if (strchr(uri, ':') != NULL)
+ return APR_EGENERAL;
+ /* no scheme, no slash, but relative path, e.g. 'image.jpg' */
+ }
+ goto deal_with_path;
+ }
+ /* scheme and relative path */
+ uri = s;
+ goto deal_with_path;
+ }
+
+ s += 2;
+
+deal_with_authority:
+ hostinfo = s;
+ while ((uri_delims[*(unsigned char *)s] & NOTEND_HOSTINFO) == 0) {
+ ++s;
+ }
+ uri = s; /* whatever follows hostinfo is start of uri */
+ uptr->hostinfo = apr_pstrmemdup(p, hostinfo, uri - hostinfo);
+
+ /* If there's a username:password@host:port, the @ we want is the last @...
+ * too bad there's no memrchr()... For the C purists, note that hostinfo
+ * is definitely not the first character of the original uri so therefore
+ * &hostinfo[-1] < &hostinfo[0] ... and this loop is valid C.
+ */
+ do {
+ --s;
+ } while (s >= hostinfo && *s != '@');
+ if (s < hostinfo) {
+ /* again we want the common case to be fall through */
+deal_with_host:
+ /* We expect hostinfo to point to the first character of
+ * the hostname. If there's a port it is the first colon,
+ * except with IPv6.
+ */
+ if (*hostinfo == '[') {
+ v6_offset1 = 1;
+ v6_offset2 = 2;
+ s = memchr(hostinfo, ']', uri - hostinfo);
+ if (s == NULL) {
+ return APR_EGENERAL;
+ }
+ if (*++s != ':') {
+ s = NULL; /* no port */
+ }
+ }
+ else {
+ s = memchr(hostinfo, ':', uri - hostinfo);
+ }
+ if (s == NULL) {
+ /* we expect the common case to have no port */
+ uptr->hostname = apr_pstrmemdup(p,
+ hostinfo + v6_offset1,
+ uri - hostinfo - v6_offset2);
+ goto deal_with_path;
+ }
+ uptr->hostname = apr_pstrmemdup(p,
+ hostinfo + v6_offset1,
+ s - hostinfo - v6_offset2);
+ ++s;
+ uptr->port_str = apr_pstrmemdup(p, s, uri - s);
+ if (uri != s) {
+ port = strtol(uptr->port_str, &endstr, 10);
+ uptr->port = port;
+ if (*endstr == '\0') {
+ goto deal_with_path;
+ }
+ /* Invalid characters after ':' found */
+ return APR_EGENERAL;
+ }
+ uptr->port = apr_uri_port_of_scheme(uptr->scheme);
+ goto deal_with_path;
+ }
+
+ /* first colon delimits username:password */
+ s1 = memchr(hostinfo, ':', s - hostinfo);
+ if (s1) {
+ uptr->user = apr_pstrmemdup(p, hostinfo, s1 - hostinfo);
+ ++s1;
+ uptr->password = apr_pstrmemdup(p, s1, s - s1);
+ }
+ else {
+ uptr->user = apr_pstrmemdup(p, hostinfo, s - hostinfo);
+ }
+ hostinfo = s + 1;
+ goto deal_with_host;
+}
+
+/* Special case for CONNECT parsing: it comes with the hostinfo part only */
+/* See the INTERNET-DRAFT document "Tunneling SSL Through a WWW Proxy"
+ * currently at http://www.mcom.com/newsref/std/tunneling_ssl.html
+ * for the format of the "CONNECT host:port HTTP/1.0" request
+ */
+APU_DECLARE(apr_status_t) apr_uri_parse_hostinfo(apr_pool_t *p,
+ const char *hostinfo,
+ apr_uri_t *uptr)
+{
+ const char *s;
+ char *endstr;
+ const char *rsb;
+ int v6_offset1 = 0;
+
+ /* Initialize the structure. parse_uri() and parse_uri_components()
+ * can be called more than once per request.
+ */
+ memset(uptr, '\0', sizeof(*uptr));
+ uptr->is_initialized = 1;
+ uptr->hostinfo = apr_pstrdup(p, hostinfo);
+
+ /* We expect hostinfo to point to the first character of
+ * the hostname. There must be a port, separated by a colon
+ */
+ if (*hostinfo == '[') {
+ if ((rsb = strchr(hostinfo, ']')) == NULL ||
+ *(rsb + 1) != ':') {
+ return APR_EGENERAL;
+ }
+ /* literal IPv6 address */
+ s = rsb + 1;
+ ++hostinfo;
+ v6_offset1 = 1;
+ }
+ else {
+ s = strchr(hostinfo, ':');
+ }
+ if (s == NULL) {
+ return APR_EGENERAL;
+ }
+ uptr->hostname = apr_pstrndup(p, hostinfo, s - hostinfo - v6_offset1);
+ ++s;
+ uptr->port_str = apr_pstrdup(p, s);
+ if (*s != '\0') {
+ uptr->port = (unsigned short) strtol(uptr->port_str, &endstr, 10);
+ if (*endstr == '\0') {
+ return APR_SUCCESS;
+ }
+ /* Invalid characters after ':' found */
+ }
+ return APR_EGENERAL;
+}
diff --git a/contrib/apr-util/xlate/xlate.c b/contrib/apr-util/xlate/xlate.c
new file mode 100644
index 000000000000..1ea840e9bf12
--- /dev/null
+++ b/contrib/apr-util/xlate/xlate.c
@@ -0,0 +1,458 @@
+/* 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 "apu.h"
+#include "apu_config.h"
+#include "apr_lib.h"
+#include "apr_strings.h"
+#include "apr_portable.h"
+#include "apr_xlate.h"
+
+/* If no implementation is available, don't generate code here since
+ * apr_xlate.h emitted macros which return APR_ENOTIMPL.
+ */
+
+#if APR_HAS_XLATE
+
+#ifdef HAVE_STDDEF_H
+#include <stddef.h> /* for NULL */
+#endif
+#if APR_HAVE_STRING_H
+#include <string.h>
+#endif
+#if APR_HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#ifdef HAVE_ICONV_H
+#include <iconv.h>
+#endif
+#if APU_HAVE_APR_ICONV
+#include <apr_iconv.h>
+#endif
+
+#if defined(APU_ICONV_INBUF_CONST) || APU_HAVE_APR_ICONV
+#define ICONV_INBUF_TYPE const char **
+#else
+#define ICONV_INBUF_TYPE char **
+#endif
+
+#ifndef min
+#define min(x,y) ((x) <= (y) ? (x) : (y))
+#endif
+
+struct apr_xlate_t {
+ apr_pool_t *pool;
+ char *frompage;
+ char *topage;
+ char *sbcs_table;
+#if APU_HAVE_ICONV
+ iconv_t ich;
+#elif APU_HAVE_APR_ICONV
+ apr_iconv_t ich;
+#endif
+};
+
+
+static const char *handle_special_names(const char *page, apr_pool_t *pool)
+{
+ if (page == APR_DEFAULT_CHARSET) {
+ return apr_os_default_encoding(pool);
+ }
+ else if (page == APR_LOCALE_CHARSET) {
+ return apr_os_locale_encoding(pool);
+ }
+ else {
+ return page;
+ }
+}
+
+static apr_status_t apr_xlate_cleanup(void *convset)
+{
+ apr_xlate_t *old = convset;
+
+#if APU_HAVE_APR_ICONV
+ if (old->ich != (apr_iconv_t)-1) {
+ return apr_iconv_close(old->ich, old->pool);
+ }
+
+#elif APU_HAVE_ICONV
+ if (old->ich != (iconv_t)-1) {
+ if (iconv_close(old->ich)) {
+ int rv = errno;
+
+ /* Sometimes, iconv is not good about setting errno. */
+ return rv ? rv : APR_EINVAL;
+ }
+ }
+#endif
+
+ return APR_SUCCESS;
+}
+
+#if APU_HAVE_ICONV
+static void check_sbcs(apr_xlate_t *convset)
+{
+ char inbuf[256], outbuf[256];
+ char *inbufptr = inbuf;
+ char *outbufptr = outbuf;
+ apr_size_t inbytes_left, outbytes_left;
+ int i;
+ apr_size_t translated;
+
+ for (i = 0; i < sizeof(inbuf); i++) {
+ inbuf[i] = i;
+ }
+
+ inbytes_left = outbytes_left = sizeof(inbuf);
+ translated = iconv(convset->ich, (ICONV_INBUF_TYPE)&inbufptr,
+ &inbytes_left, &outbufptr, &outbytes_left);
+
+ if (translated != (apr_size_t)-1
+ && inbytes_left == 0
+ && outbytes_left == 0) {
+ /* hurray... this is simple translation; save the table,
+ * close the iconv descriptor
+ */
+
+ convset->sbcs_table = apr_palloc(convset->pool, sizeof(outbuf));
+ memcpy(convset->sbcs_table, outbuf, sizeof(outbuf));
+ iconv_close(convset->ich);
+ convset->ich = (iconv_t)-1;
+
+ /* TODO: add the table to the cache */
+ }
+ else {
+ /* reset the iconv descriptor, since it's now in an undefined
+ * state. */
+ iconv_close(convset->ich);
+ convset->ich = iconv_open(convset->topage, convset->frompage);
+ }
+}
+#elif APU_HAVE_APR_ICONV
+static void check_sbcs(apr_xlate_t *convset)
+{
+ char inbuf[256], outbuf[256];
+ char *inbufptr = inbuf;
+ char *outbufptr = outbuf;
+ apr_size_t inbytes_left, outbytes_left;
+ int i;
+ apr_size_t translated;
+ apr_status_t rv;
+
+ for (i = 0; i < sizeof(inbuf); i++) {
+ inbuf[i] = i;
+ }
+
+ inbytes_left = outbytes_left = sizeof(inbuf);
+ rv = apr_iconv(convset->ich, (ICONV_INBUF_TYPE)&inbufptr,
+ &inbytes_left, &outbufptr, &outbytes_left,
+ &translated);
+
+ if ((rv == APR_SUCCESS)
+ && (translated != (apr_size_t)-1)
+ && inbytes_left == 0
+ && outbytes_left == 0) {
+ /* hurray... this is simple translation; save the table,
+ * close the iconv descriptor
+ */
+
+ convset->sbcs_table = apr_palloc(convset->pool, sizeof(outbuf));
+ memcpy(convset->sbcs_table, outbuf, sizeof(outbuf));
+ apr_iconv_close(convset->ich, convset->pool);
+ convset->ich = (apr_iconv_t)-1;
+
+ /* TODO: add the table to the cache */
+ }
+ else {
+ /* reset the iconv descriptor, since it's now in an undefined
+ * state. */
+ apr_iconv_close(convset->ich, convset->pool);
+ rv = apr_iconv_open(convset->topage, convset->frompage,
+ convset->pool, &convset->ich);
+ }
+}
+#endif /* APU_HAVE_APR_ICONV */
+
+static void make_identity_table(apr_xlate_t *convset)
+{
+ int i;
+
+ convset->sbcs_table = apr_palloc(convset->pool, 256);
+ for (i = 0; i < 256; i++)
+ convset->sbcs_table[i] = i;
+}
+
+APU_DECLARE(apr_status_t) apr_xlate_open(apr_xlate_t **convset,
+ const char *topage,
+ const char *frompage,
+ apr_pool_t *pool)
+{
+ apr_status_t rv;
+ apr_xlate_t *new;
+ int found = 0;
+
+ *convset = NULL;
+
+ topage = handle_special_names(topage, pool);
+ frompage = handle_special_names(frompage, pool);
+
+ new = (apr_xlate_t *)apr_pcalloc(pool, sizeof(apr_xlate_t));
+ if (!new) {
+ return APR_ENOMEM;
+ }
+
+ new->pool = pool;
+ new->topage = apr_pstrdup(pool, topage);
+ new->frompage = apr_pstrdup(pool, frompage);
+ if (!new->topage || !new->frompage) {
+ return APR_ENOMEM;
+ }
+
+#ifdef TODO
+ /* search cache of codepage pairs; we may be able to avoid the
+ * expensive iconv_open()
+ */
+
+ set found to non-zero if found in the cache
+#endif
+
+ if ((! found) && (strcmp(topage, frompage) == 0)) {
+ /* to and from are the same */
+ found = 1;
+ make_identity_table(new);
+ }
+
+#if APU_HAVE_APR_ICONV
+ if (!found) {
+ rv = apr_iconv_open(topage, frompage, pool, &new->ich);
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+ found = 1;
+ check_sbcs(new);
+ } else
+ new->ich = (apr_iconv_t)-1;
+
+#elif APU_HAVE_ICONV
+ if (!found) {
+ new->ich = iconv_open(topage, frompage);
+ if (new->ich == (iconv_t)-1) {
+ int rv = errno;
+ /* Sometimes, iconv is not good about setting errno. */
+ return rv ? rv : APR_EINVAL;
+ }
+ found = 1;
+ check_sbcs(new);
+ } else
+ new->ich = (iconv_t)-1;
+#endif /* APU_HAVE_ICONV */
+
+ if (found) {
+ *convset = new;
+ apr_pool_cleanup_register(pool, (void *)new, apr_xlate_cleanup,
+ apr_pool_cleanup_null);
+ rv = APR_SUCCESS;
+ }
+ else {
+ rv = APR_EINVAL; /* iconv() would return EINVAL if it
+ couldn't handle the pair */
+ }
+
+ return rv;
+}
+
+APU_DECLARE(apr_status_t) apr_xlate_sb_get(apr_xlate_t *convset, int *onoff)
+{
+ *onoff = convset->sbcs_table != NULL;
+ return APR_SUCCESS;
+}
+
+APU_DECLARE(apr_status_t) apr_xlate_conv_buffer(apr_xlate_t *convset,
+ const char *inbuf,
+ apr_size_t *inbytes_left,
+ char *outbuf,
+ apr_size_t *outbytes_left)
+{
+ apr_status_t status = APR_SUCCESS;
+
+#if APU_HAVE_APR_ICONV
+ if (convset->ich != (apr_iconv_t)-1) {
+ const char *inbufptr = inbuf;
+ apr_size_t translated;
+ char *outbufptr = outbuf;
+ status = apr_iconv(convset->ich, &inbufptr, inbytes_left,
+ &outbufptr, outbytes_left, &translated);
+
+ /* If everything went fine but we ran out of buffer, don't
+ * report it as an error. Caller needs to look at the two
+ * bytes-left values anyway.
+ *
+ * There are three expected cases where rc is -1. In each of
+ * these cases, *inbytes_left != 0.
+ * a) the non-error condition where we ran out of output
+ * buffer
+ * b) the non-error condition where we ran out of input (i.e.,
+ * the last input character is incomplete)
+ * c) the error condition where the input is invalid
+ */
+ switch (status) {
+
+ case APR_BADARG: /* out of space on output */
+ status = 0; /* change table lookup code below if you
+ make this an error */
+ break;
+
+ case APR_EINVAL: /* input character not complete (yet) */
+ status = APR_INCOMPLETE;
+ break;
+
+ case APR_BADCH: /* bad input byte */
+ status = APR_EINVAL;
+ break;
+
+ /* Sometimes, iconv is not good about setting errno. */
+ case 0:
+ if (inbytes_left && *inbytes_left)
+ status = APR_INCOMPLETE;
+ break;
+
+ default:
+ break;
+ }
+ }
+ else
+
+#elif APU_HAVE_ICONV
+ if (convset->ich != (iconv_t)-1) {
+ const char *inbufptr = inbuf;
+ char *outbufptr = outbuf;
+ apr_size_t translated;
+ translated = iconv(convset->ich, (ICONV_INBUF_TYPE)&inbufptr,
+ inbytes_left, &outbufptr, outbytes_left);
+
+ /* If everything went fine but we ran out of buffer, don't
+ * report it as an error. Caller needs to look at the two
+ * bytes-left values anyway.
+ *
+ * There are three expected cases where rc is -1. In each of
+ * these cases, *inbytes_left != 0.
+ * a) the non-error condition where we ran out of output
+ * buffer
+ * b) the non-error condition where we ran out of input (i.e.,
+ * the last input character is incomplete)
+ * c) the error condition where the input is invalid
+ */
+ if (translated == (apr_size_t)-1) {
+ int rv = errno;
+ switch (rv) {
+
+ case E2BIG: /* out of space on output */
+ status = 0; /* change table lookup code below if you
+ make this an error */
+ break;
+
+ case EINVAL: /* input character not complete (yet) */
+ status = APR_INCOMPLETE;
+ break;
+
+ case EILSEQ: /* bad input byte */
+ status = APR_EINVAL;
+ break;
+
+ /* Sometimes, iconv is not good about setting errno. */
+ case 0:
+ status = APR_INCOMPLETE;
+ break;
+
+ default:
+ status = rv;
+ break;
+ }
+ }
+ }
+ else
+#endif
+
+ if (inbuf) {
+ apr_size_t to_convert = min(*inbytes_left, *outbytes_left);
+ apr_size_t converted = to_convert;
+ char *table = convset->sbcs_table;
+
+ while (to_convert) {
+ *outbuf = table[(unsigned char)*inbuf];
+ ++outbuf;
+ ++inbuf;
+ --to_convert;
+ }
+ *inbytes_left -= converted;
+ *outbytes_left -= converted;
+ }
+
+ return status;
+}
+
+APU_DECLARE(apr_int32_t) apr_xlate_conv_byte(apr_xlate_t *convset,
+ unsigned char inchar)
+{
+ if (convset->sbcs_table) {
+ return convset->sbcs_table[inchar];
+ }
+ else {
+ return -1;
+ }
+}
+
+APU_DECLARE(apr_status_t) apr_xlate_close(apr_xlate_t *convset)
+{
+ return apr_pool_cleanup_run(convset->pool, convset, apr_xlate_cleanup);
+}
+
+#else /* !APR_HAS_XLATE */
+
+APU_DECLARE(apr_status_t) apr_xlate_open(apr_xlate_t **convset,
+ const char *topage,
+ const char *frompage,
+ apr_pool_t *pool)
+{
+ return APR_ENOTIMPL;
+}
+
+APU_DECLARE(apr_status_t) apr_xlate_sb_get(apr_xlate_t *convset, int *onoff)
+{
+ return APR_ENOTIMPL;
+}
+
+APU_DECLARE(apr_int32_t) apr_xlate_conv_byte(apr_xlate_t *convset,
+ unsigned char inchar)
+{
+ return (-1);
+}
+
+APU_DECLARE(apr_status_t) apr_xlate_conv_buffer(apr_xlate_t *convset,
+ const char *inbuf,
+ apr_size_t *inbytes_left,
+ char *outbuf,
+ apr_size_t *outbytes_left)
+{
+ return APR_ENOTIMPL;
+}
+
+APU_DECLARE(apr_status_t) apr_xlate_close(apr_xlate_t *convset)
+{
+ return APR_ENOTIMPL;
+}
+
+#endif /* APR_HAS_XLATE */
diff --git a/contrib/apr-util/xml/NWGNUmakefile b/contrib/apr-util/xml/NWGNUmakefile
new file mode 100644
index 000000000000..cc01646799d1
--- /dev/null
+++ b/contrib/apr-util/xml/NWGNUmakefile
@@ -0,0 +1,259 @@
+#
+# Declare the sub-directories to be built here
+#
+
+SUBDIRS = \
+ $(EOLIST)
+
+#
+# Get the 'head' of the build environment. This includes default targets and
+# paths to tools
+#
+
+include $(APR_WORK)/build/NWGNUhead.inc
+
+#
+# build this level's files
+
+#
+# Make sure all needed macro's are defined
+#
+
+#
+# These directories will be at the beginning of the include list, followed by
+# INCDIRS
+#
+XINCDIRS += \
+ $(APR)/include \
+ $(APR)/include/arch/NetWare \
+ $(APU)/include \
+ $(APU)/uri \
+ $(APU)/dbm/sdbm \
+ $(APU)/include/private \
+ $(APUXML)/expat/lib \
+ $(EOLIST)
+
+#
+# These flags will come after CFLAGS
+#
+XCFLAGS += \
+ -DHAVE_EXPAT_CONFIG_H \
+ $(EOLIST)
+
+#
+# These defines will come after DEFINES
+#
+XDEFINES += \
+ $(EOLIST)
+
+#
+# These flags will be added to the link.opt file
+#
+XLFLAGS += \
+ $(EOLIST)
+
+#
+# These values will be appended to the correct variables based on the value of
+# RELEASE
+#
+ifeq "$(RELEASE)" "debug"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "noopt"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "release"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+#
+# These are used by the link target if an NLM is being generated
+# This is used by the link 'name' directive to name the nlm. If left blank
+# TARGET_nlm (see below) will be used.
+#
+NLM_NAME =
+
+#
+# This is used by the link '-desc ' directive.
+# If left blank, NLM_NAME will be used.
+#
+NLM_DESCRIPTION =
+
+#
+# This is used by the '-threadname' directive. If left blank,
+# NLM_NAME Thread will be used.
+#
+NLM_THREAD_NAME =
+#
+# If this is specified, it will override VERSION value in
+# $(APR_WORK)/build/NWGNUenvironment.inc
+#
+NLM_VERSION =
+
+#
+# If this is specified, it will override the default of 64K
+#
+NLM_STACK_SIZE =
+
+#
+# If this is specified it will be used by the link '-entry' directive
+#
+NLM_ENTRY_SYM =
+
+#
+# If this is specified it will be used by the link '-exit' directive
+#
+NLM_EXIT_SYM =
+
+#
+# If this is specified it will be used by the link '-check' directive
+#
+NLM_CHECK_SYM =
+
+#
+# If this is specified it will be used by the link '-flags' directive
+#
+NLM_FLAGS =
+
+#
+# If this is specified it will be linked in with the XDCData option in the def
+# file instead of the default of $(APR)/misc/netware/apache.xdc. XDCData can
+# be disabled by setting APACHE_UNIPROC in the environment
+#
+XDCDATA =
+
+#
+# Declare all target files (you must add your files here)
+#
+
+#
+# If there is an NLM target, put it here
+#
+TARGET_nlm = \
+ $(EOLIST)
+
+#
+# If there is an LIB target, put it here
+#
+TARGET_lib = \
+ $(OBJDIR)/apuxml.lib \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the NLM target above.
+# Paths must all use the '/' character
+#
+FILES_nlm_objs = \
+ $(EOLIST)
+
+#
+# These are the LIB files needed to create the NLM target above.
+# These will be added as a library command in the link.opt file.
+#
+FILES_nlm_libs = \
+ $(EOLIST)
+
+#
+# These are the modules that the above NLM target depends on to load.
+# These will be added as a module command in the link.opt file.
+#
+FILES_nlm_modules = \
+ $(EOLIST)
+
+#
+# If the nlm has a msg file, put it's path here
+#
+FILE_nlm_msg =
+
+#
+# If the nlm has a hlp file put it's path here
+#
+FILE_nlm_hlp =
+
+#
+# If this is specified, it will override the default copyright.
+#
+FILE_nlm_copyright =
+
+#
+# Any additional imports go here
+#
+FILES_nlm_Ximports = \
+ $(EOLIST)
+
+#
+# Any symbols exported to here
+#
+FILES_nlm_exports = \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the LIB target above.
+# Paths must all use the '/' character
+#
+FILES_lib_objs = \
+ $(OBJDIR)/apr_xml.o \
+ $(OBJDIR)/xmlparse.o \
+ $(OBJDIR)/xmlrole.o \
+ $(OBJDIR)/xmltok.o \
+ $(EOLIST)
+
+#
+# implement targets and dependancies (leave this section alone)
+#
+
+libs :: $(OBJDIR) $(TARGET_lib)
+
+nlms :: libs $(TARGET_nlm)
+
+#
+# Updated this target to create necessary directories and copy files to the
+# correct place. (See $(APR_WORK)/build/NWGNUhead.inc for examples)
+#
+install :: nlms FORCE
+
+#
+# Any specialized rules here
+#
+
+vpath %.c expat/lib
+
+#
+# Include the 'tail' makefile that has targets that depend on variables defined
+# in this makefile
+#
+
+include $(APRBUILD)/NWGNUtail.inc
+
diff --git a/contrib/apr-util/xml/apr_xml.c b/contrib/apr-util/xml/apr_xml.c
new file mode 100644
index 000000000000..b3ec875781e2
--- /dev/null
+++ b/contrib/apr-util/xml/apr_xml.c
@@ -0,0 +1,1015 @@
+/* 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.h"
+#include "apr_strings.h"
+
+#define APR_WANT_STDIO /* for sprintf() */
+#define APR_WANT_STRFUNC
+#include "apr_want.h"
+
+#include "apr_xml.h"
+
+#include "apu_config.h"
+
+#if defined(HAVE_XMLPARSE_XMLPARSE_H)
+#include <xmlparse/xmlparse.h>
+#elif defined(HAVE_XMLTOK_XMLPARSE_H)
+#include <xmltok/xmlparse.h>
+#elif defined(HAVE_XML_XMLPARSE_H)
+#include <xml/xmlparse.h>
+#else
+#include <expat.h>
+#endif
+
+#define DEBUG_CR "\r\n"
+
+static const char APR_KW_xmlns[] = { 0x78, 0x6D, 0x6C, 0x6E, 0x73, '\0' };
+static const char APR_KW_xmlns_lang[] = { 0x78, 0x6D, 0x6C, 0x3A, 0x6C, 0x61, 0x6E, 0x67, '\0' };
+static const char APR_KW_DAV[] = { 0x44, 0x41, 0x56, 0x3A, '\0' };
+
+/* errors related to namespace processing */
+#define APR_XML_NS_ERROR_UNKNOWN_PREFIX (-1000)
+#define APR_XML_NS_ERROR_INVALID_DECL (-1001)
+
+/* test for a namespace prefix that begins with [Xx][Mm][Ll] */
+#define APR_XML_NS_IS_RESERVED(name) \
+ ( (name[0] == 0x58 || name[0] == 0x78) && \
+ (name[1] == 0x4D || name[1] == 0x6D) && \
+ (name[2] == 0x4C || name[2] == 0x6C) )
+
+
+/* the real (internal) definition of the parser context */
+struct apr_xml_parser {
+ apr_xml_doc *doc; /* the doc we're parsing */
+ apr_pool_t *p; /* the pool we allocate from */
+ apr_xml_elem *cur_elem; /* current element */
+
+ int error; /* an error has occurred */
+#define APR_XML_ERROR_EXPAT 1
+#define APR_XML_ERROR_PARSE_DONE 2
+/* also: public APR_XML_NS_ERROR_* values (if any) */
+
+ XML_Parser xp; /* the actual (Expat) XML parser */
+ enum XML_Error xp_err; /* stored Expat error code */
+};
+
+/* struct for scoping namespace declarations */
+typedef struct apr_xml_ns_scope {
+ const char *prefix; /* prefix used for this ns */
+ int ns; /* index into namespace table */
+ int emptyURI; /* the namespace URI is the empty string */
+ struct apr_xml_ns_scope *next; /* next scoped namespace */
+} apr_xml_ns_scope;
+
+
+/* return namespace table index for a given prefix */
+static int find_prefix(apr_xml_parser *parser, const char *prefix)
+{
+ apr_xml_elem *elem = parser->cur_elem;
+
+ /*
+ ** Walk up the tree, looking for a namespace scope that defines this
+ ** prefix.
+ */
+ for (; elem; elem = elem->parent) {
+ apr_xml_ns_scope *ns_scope = elem->ns_scope;
+
+ for (ns_scope = elem->ns_scope; ns_scope; ns_scope = ns_scope->next) {
+ if (strcmp(prefix, ns_scope->prefix) == 0) {
+ if (ns_scope->emptyURI) {
+ /*
+ ** It is possible to set the default namespace to an
+ ** empty URI string; this resets the default namespace
+ ** to mean "no namespace." We just found the prefix
+ ** refers to an empty URI, so return "no namespace."
+ */
+ return APR_XML_NS_NONE;
+ }
+
+ return ns_scope->ns;
+ }
+ }
+ }
+
+ /*
+ * If the prefix is empty (""), this means that a prefix was not
+ * specified in the element/attribute. The search that was performed
+ * just above did not locate a default namespace URI (which is stored
+ * into ns_scope with an empty prefix). This means the element/attribute
+ * has "no namespace". We have a reserved value for this.
+ */
+ if (*prefix == '\0') {
+ return APR_XML_NS_NONE;
+ }
+
+ /* not found */
+ return APR_XML_NS_ERROR_UNKNOWN_PREFIX;
+}
+
+static void start_handler(void *userdata, const char *name, const char **attrs)
+{
+ apr_xml_parser *parser = userdata;
+ apr_xml_elem *elem;
+ apr_xml_attr *attr;
+ apr_xml_attr *prev;
+ char *colon;
+ const char *quoted;
+ char *elem_name;
+
+ /* punt once we find an error */
+ if (parser->error)
+ return;
+
+ elem = apr_pcalloc(parser->p, sizeof(*elem));
+
+ /* prep the element */
+ elem->name = elem_name = apr_pstrdup(parser->p, name);
+
+ /* fill in the attributes (note: ends up in reverse order) */
+ while (*attrs) {
+ attr = apr_palloc(parser->p, sizeof(*attr));
+ attr->name = apr_pstrdup(parser->p, *attrs++);
+ attr->value = apr_pstrdup(parser->p, *attrs++);
+ attr->next = elem->attr;
+ elem->attr = attr;
+ }
+
+ /* hook the element into the tree */
+ if (parser->cur_elem == NULL) {
+ /* no current element; this also becomes the root */
+ parser->cur_elem = parser->doc->root = elem;
+ }
+ else {
+ /* this element appeared within the current elem */
+ elem->parent = parser->cur_elem;
+
+ /* set up the child/sibling links */
+ if (elem->parent->last_child == NULL) {
+ /* no first child either */
+ elem->parent->first_child = elem->parent->last_child = elem;
+ }
+ else {
+ /* hook onto the end of the parent's children */
+ elem->parent->last_child->next = elem;
+ elem->parent->last_child = elem;
+ }
+
+ /* this element is now the current element */
+ parser->cur_elem = elem;
+ }
+
+ /* scan the attributes for namespace declarations */
+ for (prev = NULL, attr = elem->attr;
+ attr;
+ attr = attr->next) {
+ if (strncmp(attr->name, APR_KW_xmlns, 5) == 0) {
+ const char *prefix = &attr->name[5];
+ apr_xml_ns_scope *ns_scope;
+
+ /* test for xmlns:foo= form and xmlns= form */
+ if (*prefix == 0x3A) {
+ /* a namespace prefix declaration must have a
+ non-empty value. */
+ if (attr->value[0] == '\0') {
+ parser->error = APR_XML_NS_ERROR_INVALID_DECL;
+ return;
+ }
+ ++prefix;
+ }
+ else if (*prefix != '\0') {
+ /* advance "prev" since "attr" is still present */
+ prev = attr;
+ continue;
+ }
+
+ /* quote the URI before we ever start working with it */
+ quoted = apr_xml_quote_string(parser->p, attr->value, 1);
+
+ /* build and insert the new scope */
+ ns_scope = apr_pcalloc(parser->p, sizeof(*ns_scope));
+ ns_scope->prefix = prefix;
+ ns_scope->ns = apr_xml_insert_uri(parser->doc->namespaces, quoted);
+ ns_scope->emptyURI = *quoted == '\0';
+ ns_scope->next = elem->ns_scope;
+ elem->ns_scope = ns_scope;
+
+ /* remove this attribute from the element */
+ if (prev == NULL)
+ elem->attr = attr->next;
+ else
+ prev->next = attr->next;
+
+ /* Note: prev will not be advanced since we just removed "attr" */
+ }
+ else if (strcmp(attr->name, APR_KW_xmlns_lang) == 0) {
+ /* save away the language (in quoted form) */
+ elem->lang = apr_xml_quote_string(parser->p, attr->value, 1);
+
+ /* remove this attribute from the element */
+ if (prev == NULL)
+ elem->attr = attr->next;
+ else
+ prev->next = attr->next;
+
+ /* Note: prev will not be advanced since we just removed "attr" */
+ }
+ else {
+ /* advance "prev" since "attr" is still present */
+ prev = attr;
+ }
+ }
+
+ /*
+ ** If an xml:lang attribute didn't exist (lang==NULL), then copy the
+ ** language from the parent element (if present).
+ **
+ ** NOTE: elem_size() *depends* upon this pointer equality.
+ */
+ if (elem->lang == NULL && elem->parent != NULL)
+ elem->lang = elem->parent->lang;
+
+ /* adjust the element's namespace */
+ colon = strchr(elem_name, 0x3A);
+ if (colon == NULL) {
+ /*
+ * The element is using the default namespace, which will always
+ * be found. Either it will be "no namespace", or a default
+ * namespace URI has been specified at some point.
+ */
+ elem->ns = find_prefix(parser, "");
+ }
+ else if (APR_XML_NS_IS_RESERVED(elem->name)) {
+ elem->ns = APR_XML_NS_NONE;
+ }
+ else {
+ *colon = '\0';
+ elem->ns = find_prefix(parser, elem->name);
+ elem->name = colon + 1;
+
+ if (APR_XML_NS_IS_ERROR(elem->ns)) {
+ parser->error = elem->ns;
+ return;
+ }
+ }
+
+ /* adjust all remaining attributes' namespaces */
+ for (attr = elem->attr; attr; attr = attr->next) {
+ /*
+ * apr_xml_attr defines this as "const" but we dup'd it, so we
+ * know that we can change it. a bit hacky, but the existing
+ * structure def is best.
+ */
+ char *attr_name = (char *)attr->name;
+
+ colon = strchr(attr_name, 0x3A);
+ if (colon == NULL) {
+ /*
+ * Attributes do NOT use the default namespace. Therefore,
+ * we place them into the "no namespace" category.
+ */
+ attr->ns = APR_XML_NS_NONE;
+ }
+ else if (APR_XML_NS_IS_RESERVED(attr->name)) {
+ attr->ns = APR_XML_NS_NONE;
+ }
+ else {
+ *colon = '\0';
+ attr->ns = find_prefix(parser, attr->name);
+ attr->name = colon + 1;
+
+ if (APR_XML_NS_IS_ERROR(attr->ns)) {
+ parser->error = attr->ns;
+ return;
+ }
+ }
+ }
+}
+
+static void end_handler(void *userdata, const char *name)
+{
+ apr_xml_parser *parser = userdata;
+
+ /* punt once we find an error */
+ if (parser->error)
+ return;
+
+ /* pop up one level */
+ parser->cur_elem = parser->cur_elem->parent;
+}
+
+static void cdata_handler(void *userdata, const char *data, int len)
+{
+ apr_xml_parser *parser = userdata;
+ apr_xml_elem *elem;
+ apr_text_header *hdr;
+ const char *s;
+
+ /* punt once we find an error */
+ if (parser->error)
+ return;
+
+ elem = parser->cur_elem;
+ s = apr_pstrndup(parser->p, data, len);
+
+ if (elem->last_child == NULL) {
+ /* no children yet. this cdata follows the start tag */
+ hdr = &elem->first_cdata;
+ }
+ else {
+ /* child elements exist. this cdata follows the last child. */
+ hdr = &elem->last_child->following_cdata;
+ }
+
+ apr_text_append(parser->p, hdr, s);
+}
+
+static apr_status_t cleanup_parser(void *ctx)
+{
+ apr_xml_parser *parser = ctx;
+
+ XML_ParserFree(parser->xp);
+ parser->xp = NULL;
+
+ return APR_SUCCESS;
+}
+
+#if XML_MAJOR_VERSION > 1
+/* Stop the parser if an entity declaration is hit. */
+static void entity_declaration(void *userData, const XML_Char *entityName,
+ int is_parameter_entity, const XML_Char *value,
+ int value_length, const XML_Char *base,
+ const XML_Char *systemId, const XML_Char *publicId,
+ const XML_Char *notationName)
+{
+ apr_xml_parser *parser = userData;
+
+ XML_StopParser(parser->xp, XML_FALSE);
+}
+#else
+/* A noop default_handler. */
+static void default_handler(void *userData, const XML_Char *s, int len)
+{
+}
+#endif
+
+APU_DECLARE(apr_xml_parser *) apr_xml_parser_create(apr_pool_t *pool)
+{
+ apr_xml_parser *parser = apr_pcalloc(pool, sizeof(*parser));
+
+ parser->p = pool;
+ parser->doc = apr_pcalloc(pool, sizeof(*parser->doc));
+
+ parser->doc->namespaces = apr_array_make(pool, 5, sizeof(const char *));
+
+ /* ### is there a way to avoid hard-coding this? */
+ apr_xml_insert_uri(parser->doc->namespaces, APR_KW_DAV);
+
+ parser->xp = XML_ParserCreate(NULL);
+ if (parser->xp == NULL) {
+ (*apr_pool_abort_get(pool))(APR_ENOMEM);
+ return NULL;
+ }
+
+ apr_pool_cleanup_register(pool, parser, cleanup_parser,
+ apr_pool_cleanup_null);
+
+ XML_SetUserData(parser->xp, parser);
+ XML_SetElementHandler(parser->xp, start_handler, end_handler);
+ XML_SetCharacterDataHandler(parser->xp, cdata_handler);
+
+ /* Prevent the "billion laughs" attack against expat by disabling
+ * internal entity expansion. With 2.x, forcibly stop the parser
+ * if an entity is declared - this is safer and a more obvious
+ * failure mode. With older versions, installing a noop
+ * DefaultHandler means that internal entities will be expanded as
+ * the empty string, which is also sufficient to prevent the
+ * attack. */
+#if XML_MAJOR_VERSION > 1
+ XML_SetEntityDeclHandler(parser->xp, entity_declaration);
+#else
+ XML_SetDefaultHandler(parser->xp, default_handler);
+#endif
+
+ return parser;
+}
+
+static apr_status_t do_parse(apr_xml_parser *parser,
+ const char *data, apr_size_t len,
+ int is_final)
+{
+ if (parser->xp == NULL) {
+ parser->error = APR_XML_ERROR_PARSE_DONE;
+ }
+ else {
+ int rv = XML_Parse(parser->xp, data, (int)len, is_final);
+
+ if (rv == 0) {
+ parser->error = APR_XML_ERROR_EXPAT;
+ parser->xp_err = XML_GetErrorCode(parser->xp);
+ }
+ }
+
+ /* ### better error code? */
+ return parser->error ? APR_EGENERAL : APR_SUCCESS;
+}
+
+APU_DECLARE(apr_status_t) apr_xml_parser_feed(apr_xml_parser *parser,
+ const char *data,
+ apr_size_t len)
+{
+ return do_parse(parser, data, len, 0 /* is_final */);
+}
+
+APU_DECLARE(apr_status_t) apr_xml_parser_done(apr_xml_parser *parser,
+ apr_xml_doc **pdoc)
+{
+ char end;
+ apr_status_t status = do_parse(parser, &end, 0, 1 /* is_final */);
+
+ /* get rid of the parser */
+ (void) apr_pool_cleanup_run(parser->p, parser, cleanup_parser);
+
+ if (status)
+ return status;
+
+ if (pdoc != NULL)
+ *pdoc = parser->doc;
+ return APR_SUCCESS;
+}
+
+APU_DECLARE(char *) apr_xml_parser_geterror(apr_xml_parser *parser,
+ char *errbuf,
+ apr_size_t errbufsize)
+{
+ int error = parser->error;
+ const char *msg;
+
+ /* clear our record of an error */
+ parser->error = 0;
+
+ switch (error) {
+ case 0:
+ msg = "No error.";
+ break;
+
+ case APR_XML_NS_ERROR_UNKNOWN_PREFIX:
+ msg = "An undefined namespace prefix was used.";
+ break;
+
+ case APR_XML_NS_ERROR_INVALID_DECL:
+ msg = "A namespace prefix was defined with an empty URI.";
+ break;
+
+ case APR_XML_ERROR_EXPAT:
+ (void) apr_snprintf(errbuf, errbufsize,
+ "XML parser error code: %s (%d)",
+ XML_ErrorString(parser->xp_err), parser->xp_err);
+ return errbuf;
+
+ case APR_XML_ERROR_PARSE_DONE:
+ msg = "The parser is not active.";
+ break;
+
+ default:
+ msg = "There was an unknown error within the XML body.";
+ break;
+ }
+
+ (void) apr_cpystrn(errbuf, msg, errbufsize);
+ return errbuf;
+}
+
+APU_DECLARE(apr_status_t) apr_xml_parse_file(apr_pool_t *p,
+ apr_xml_parser **parser,
+ apr_xml_doc **ppdoc,
+ apr_file_t *xmlfd,
+ apr_size_t buffer_length)
+{
+ apr_status_t rv;
+ char *buffer;
+ apr_size_t length;
+
+ *parser = apr_xml_parser_create(p);
+ if (*parser == NULL) {
+ /* FIXME: returning an error code would be nice,
+ * but we dont get one ;( */
+ return APR_EGENERAL;
+ }
+ buffer = apr_palloc(p, buffer_length);
+ length = buffer_length;
+
+ rv = apr_file_read(xmlfd, buffer, &length);
+
+ while (rv == APR_SUCCESS) {
+ rv = apr_xml_parser_feed(*parser, buffer, length);
+ if (rv != APR_SUCCESS) {
+ return rv;
+ }
+
+ length = buffer_length;
+ rv = apr_file_read(xmlfd, buffer, &length);
+ }
+ if (rv != APR_EOF) {
+ return rv;
+ }
+ rv = apr_xml_parser_done(*parser, ppdoc);
+ *parser = NULL;
+ return rv;
+}
+
+APU_DECLARE(void) apr_text_append(apr_pool_t * p, apr_text_header *hdr,
+ const char *text)
+{
+ apr_text *t = apr_palloc(p, sizeof(*t));
+
+ t->text = text;
+ t->next = NULL;
+
+ if (hdr->first == NULL) {
+ /* no text elements yet */
+ hdr->first = hdr->last = t;
+ }
+ else {
+ /* append to the last text element */
+ hdr->last->next = t;
+ hdr->last = t;
+ }
+}
+
+
+/* ---------------------------------------------------------------
+**
+** XML UTILITY FUNCTIONS
+*/
+
+/*
+** apr_xml_quote_string: quote an XML string
+**
+** Replace '<', '>', and '&' with '&lt;', '&gt;', and '&amp;'.
+** If quotes is true, then replace '"' with '&quot;'.
+**
+** quotes is typically set to true for XML strings that will occur within
+** double quotes -- attribute values.
+*/
+APU_DECLARE(const char *) apr_xml_quote_string(apr_pool_t *p, const char *s,
+ int quotes)
+{
+ const char *scan;
+ apr_size_t len = 0;
+ apr_size_t extra = 0;
+ char *qstr;
+ char *qscan;
+ char c;
+
+ for (scan = s; (c = *scan) != '\0'; ++scan, ++len) {
+ if (c == '<' || c == '>')
+ extra += 3; /* &lt; or &gt; */
+ else if (c == '&')
+ extra += 4; /* &amp; */
+ else if (quotes && c == '"')
+ extra += 5; /* &quot; */
+ }
+
+ /* nothing to do? */
+ if (extra == 0)
+ return s;
+
+ qstr = apr_palloc(p, len + extra + 1);
+ for (scan = s, qscan = qstr; (c = *scan) != '\0'; ++scan) {
+ if (c == '<') {
+ *qscan++ = '&';
+ *qscan++ = 'l';
+ *qscan++ = 't';
+ *qscan++ = ';';
+ }
+ else if (c == '>') {
+ *qscan++ = '&';
+ *qscan++ = 'g';
+ *qscan++ = 't';
+ *qscan++ = ';';
+ }
+ else if (c == '&') {
+ *qscan++ = '&';
+ *qscan++ = 'a';
+ *qscan++ = 'm';
+ *qscan++ = 'p';
+ *qscan++ = ';';
+ }
+ else if (quotes && c == '"') {
+ *qscan++ = '&';
+ *qscan++ = 'q';
+ *qscan++ = 'u';
+ *qscan++ = 'o';
+ *qscan++ = 't';
+ *qscan++ = ';';
+ }
+ else {
+ *qscan++ = c;
+ }
+ }
+
+ *qscan = '\0';
+ return qstr;
+}
+
+/* how many characters for the given integer? */
+#define APR_XML_NS_LEN(ns) ((ns) < 10 ? 1 : (ns) < 100 ? 2 : (ns) < 1000 ? 3 : \
+ (ns) < 10000 ? 4 : (ns) < 100000 ? 5 : \
+ (ns) < 1000000 ? 6 : (ns) < 10000000 ? 7 : \
+ (ns) < 100000000 ? 8 : (ns) < 1000000000 ? 9 : 10)
+
+static apr_size_t text_size(const apr_text *t)
+{
+ apr_size_t size = 0;
+
+ for (; t; t = t->next)
+ size += strlen(t->text);
+ return size;
+}
+
+static apr_size_t elem_size(const apr_xml_elem *elem, int style,
+ apr_array_header_t *namespaces, int *ns_map)
+{
+ apr_size_t size;
+
+ if (style == APR_XML_X2T_FULL || style == APR_XML_X2T_FULL_NS_LANG) {
+ const apr_xml_attr *attr;
+
+ size = 0;
+
+ if (style == APR_XML_X2T_FULL_NS_LANG) {
+ int i;
+
+ /*
+ ** The outer element will contain xmlns:ns%d="%s" attributes
+ ** and an xml:lang attribute, if applicable.
+ */
+
+ for (i = namespaces->nelts; i--;) {
+ /* compute size of: ' xmlns:ns%d="%s"' */
+ size += (9 + APR_XML_NS_LEN(i) + 2 +
+ strlen(APR_XML_GET_URI_ITEM(namespaces, i)) + 1);
+ }
+
+ if (elem->lang != NULL) {
+ /* compute size of: ' xml:lang="%s"' */
+ size += 11 + strlen(elem->lang) + 1;
+ }
+ }
+
+ if (elem->ns == APR_XML_NS_NONE) {
+ /* compute size of: <%s> */
+ size += 1 + strlen(elem->name) + 1;
+ }
+ else {
+ int ns = ns_map ? ns_map[elem->ns] : elem->ns;
+
+ /* compute size of: <ns%d:%s> */
+ size += 3 + APR_XML_NS_LEN(ns) + 1 + strlen(elem->name) + 1;
+ }
+
+ if (APR_XML_ELEM_IS_EMPTY(elem)) {
+ /* insert a closing "/" */
+ size += 1;
+ }
+ else {
+ /*
+ * two of above plus "/":
+ * <ns%d:%s> ... </ns%d:%s>
+ * OR <%s> ... </%s>
+ */
+ size = 2 * size + 1;
+ }
+
+ for (attr = elem->attr; attr; attr = attr->next) {
+ if (attr->ns == APR_XML_NS_NONE) {
+ /* compute size of: ' %s="%s"' */
+ size += 1 + strlen(attr->name) + 2 + strlen(attr->value) + 1;
+ }
+ else {
+ /* compute size of: ' ns%d:%s="%s"' */
+ int ns = ns_map ? ns_map[attr->ns] : attr->ns;
+ size += 3 + APR_XML_NS_LEN(ns) + 1 + strlen(attr->name) + 2 + strlen(attr->value) + 1;
+ }
+ }
+
+ /*
+ ** If the element has an xml:lang value that is *different* from
+ ** its parent, then add the thing in: ' xml:lang="%s"'.
+ **
+ ** NOTE: we take advantage of the pointer equality established by
+ ** the parsing for "inheriting" the xml:lang values from parents.
+ */
+ if (elem->lang != NULL &&
+ (elem->parent == NULL || elem->lang != elem->parent->lang)) {
+ size += 11 + strlen(elem->lang) + 1;
+ }
+ }
+ else if (style == APR_XML_X2T_LANG_INNER) {
+ /*
+ * This style prepends the xml:lang value plus a null terminator.
+ * If a lang value is not present, then we insert a null term.
+ */
+ size = elem->lang ? strlen(elem->lang) + 1 : 1;
+ }
+ else
+ size = 0;
+
+ size += text_size(elem->first_cdata.first);
+
+ for (elem = elem->first_child; elem; elem = elem->next) {
+ /* the size of the child element plus the CDATA that follows it */
+ size += (elem_size(elem, APR_XML_X2T_FULL, NULL, ns_map) +
+ text_size(elem->following_cdata.first));
+ }
+
+ return size;
+}
+
+static char *write_text(char *s, const apr_text *t)
+{
+ for (; t; t = t->next) {
+ apr_size_t len = strlen(t->text);
+ memcpy(s, t->text, len);
+ s += len;
+ }
+ return s;
+}
+
+static char *write_elem(char *s, const apr_xml_elem *elem, int style,
+ apr_array_header_t *namespaces, int *ns_map)
+{
+ const apr_xml_elem *child;
+ apr_size_t len;
+ int ns;
+
+ if (style == APR_XML_X2T_FULL || style == APR_XML_X2T_FULL_NS_LANG) {
+ int empty = APR_XML_ELEM_IS_EMPTY(elem);
+ const apr_xml_attr *attr;
+
+ if (elem->ns == APR_XML_NS_NONE) {
+ len = sprintf(s, "<%s", elem->name);
+ }
+ else {
+ ns = ns_map ? ns_map[elem->ns] : elem->ns;
+ len = sprintf(s, "<ns%d:%s", ns, elem->name);
+ }
+ s += len;
+
+ for (attr = elem->attr; attr; attr = attr->next) {
+ if (attr->ns == APR_XML_NS_NONE)
+ len = sprintf(s, " %s=\"%s\"", attr->name, attr->value);
+ else {
+ ns = ns_map ? ns_map[attr->ns] : attr->ns;
+ len = sprintf(s, " ns%d:%s=\"%s\"", ns, attr->name, attr->value);
+ }
+ s += len;
+ }
+
+ /* add the xml:lang value if necessary */
+ if (elem->lang != NULL &&
+ (style == APR_XML_X2T_FULL_NS_LANG ||
+ elem->parent == NULL ||
+ elem->lang != elem->parent->lang)) {
+ len = sprintf(s, " xml:lang=\"%s\"", elem->lang);
+ s += len;
+ }
+
+ /* add namespace definitions, if required */
+ if (style == APR_XML_X2T_FULL_NS_LANG) {
+ int i;
+
+ for (i = namespaces->nelts; i--;) {
+ len = sprintf(s, " xmlns:ns%d=\"%s\"", i,
+ APR_XML_GET_URI_ITEM(namespaces, i));
+ s += len;
+ }
+ }
+
+ /* no more to do. close it up and go. */
+ if (empty) {
+ *s++ = '/';
+ *s++ = '>';
+ return s;
+ }
+
+ /* just close it */
+ *s++ = '>';
+ }
+ else if (style == APR_XML_X2T_LANG_INNER) {
+ /* prepend the xml:lang value */
+ if (elem->lang != NULL) {
+ len = strlen(elem->lang);
+ memcpy(s, elem->lang, len);
+ s += len;
+ }
+ *s++ = '\0';
+ }
+
+ s = write_text(s, elem->first_cdata.first);
+
+ for (child = elem->first_child; child; child = child->next) {
+ s = write_elem(s, child, APR_XML_X2T_FULL, NULL, ns_map);
+ s = write_text(s, child->following_cdata.first);
+ }
+
+ if (style == APR_XML_X2T_FULL || style == APR_XML_X2T_FULL_NS_LANG) {
+ if (elem->ns == APR_XML_NS_NONE) {
+ len = sprintf(s, "</%s>", elem->name);
+ }
+ else {
+ ns = ns_map ? ns_map[elem->ns] : elem->ns;
+ len = sprintf(s, "</ns%d:%s>", ns, elem->name);
+ }
+ s += len;
+ }
+
+ return s;
+}
+
+APU_DECLARE(void) apr_xml_quote_elem(apr_pool_t *p, apr_xml_elem *elem)
+{
+ apr_text *scan_txt;
+ apr_xml_attr *scan_attr;
+ apr_xml_elem *scan_elem;
+
+ /* convert the element's text */
+ for (scan_txt = elem->first_cdata.first;
+ scan_txt != NULL;
+ scan_txt = scan_txt->next) {
+ scan_txt->text = apr_xml_quote_string(p, scan_txt->text, 0);
+ }
+ for (scan_txt = elem->following_cdata.first;
+ scan_txt != NULL;
+ scan_txt = scan_txt->next) {
+ scan_txt->text = apr_xml_quote_string(p, scan_txt->text, 0);
+ }
+
+ /* convert the attribute values */
+ for (scan_attr = elem->attr;
+ scan_attr != NULL;
+ scan_attr = scan_attr->next) {
+ scan_attr->value = apr_xml_quote_string(p, scan_attr->value, 1);
+ }
+
+ /* convert the child elements */
+ for (scan_elem = elem->first_child;
+ scan_elem != NULL;
+ scan_elem = scan_elem->next) {
+ apr_xml_quote_elem(p, scan_elem);
+ }
+}
+
+/* convert an element to a text string */
+APU_DECLARE(void) apr_xml_to_text(apr_pool_t * p, const apr_xml_elem *elem,
+ int style, apr_array_header_t *namespaces,
+ int *ns_map, const char **pbuf,
+ apr_size_t *psize)
+{
+ /* get the exact size, plus a null terminator */
+ apr_size_t size = elem_size(elem, style, namespaces, ns_map) + 1;
+ char *s = apr_palloc(p, size);
+
+ (void) write_elem(s, elem, style, namespaces, ns_map);
+ s[size - 1] = '\0';
+
+ *pbuf = s;
+ if (psize)
+ *psize = size;
+}
+
+APU_DECLARE(const char *) apr_xml_empty_elem(apr_pool_t * p,
+ const apr_xml_elem *elem)
+{
+ if (elem->ns == APR_XML_NS_NONE) {
+ /*
+ * The prefix (xml...) is already within the prop name, or
+ * the element simply has no prefix.
+ */
+ return apr_psprintf(p, "<%s/>" DEBUG_CR, elem->name);
+ }
+
+ return apr_psprintf(p, "<ns%d:%s/>" DEBUG_CR, elem->ns, elem->name);
+}
+
+/* return the URI's (existing) index, or insert it and return a new index */
+APU_DECLARE(int) apr_xml_insert_uri(apr_array_header_t *uri_array,
+ const char *uri)
+{
+ int i;
+ const char **pelt;
+
+ /* never insert an empty URI; this index is always APR_XML_NS_NONE */
+ if (*uri == '\0')
+ return APR_XML_NS_NONE;
+
+ for (i = uri_array->nelts; i--;) {
+ if (strcmp(uri, APR_XML_GET_URI_ITEM(uri_array, i)) == 0)
+ return i;
+ }
+
+ pelt = apr_array_push(uri_array);
+ *pelt = uri; /* assume uri is const or in a pool */
+ return uri_array->nelts - 1;
+}
+
+/* convert the element to EBCDIC */
+#if APR_CHARSET_EBCDIC
+static apr_status_t apr_xml_parser_convert_elem(apr_xml_elem *e,
+ apr_xlate_t *convset)
+{
+ apr_xml_attr *a;
+ apr_xml_elem *ec;
+ apr_text *t;
+ apr_size_t inbytes_left, outbytes_left;
+ apr_status_t status;
+
+ inbytes_left = outbytes_left = strlen(e->name);
+ status = apr_xlate_conv_buffer(convset, e->name, &inbytes_left, (char *) e->name, &outbytes_left);
+ if (status) {
+ return status;
+ }
+
+ for (t = e->first_cdata.first; t != NULL; t = t->next) {
+ inbytes_left = outbytes_left = strlen(t->text);
+ status = apr_xlate_conv_buffer(convset, t->text, &inbytes_left, (char *) t->text, &outbytes_left);
+ if (status) {
+ return status;
+ }
+ }
+
+ for (t = e->following_cdata.first; t != NULL; t = t->next) {
+ inbytes_left = outbytes_left = strlen(t->text);
+ status = apr_xlate_conv_buffer(convset, t->text, &inbytes_left, (char *) t->text, &outbytes_left);
+ if (status) {
+ return status;
+ }
+ }
+
+ for (a = e->attr; a != NULL; a = a->next) {
+ inbytes_left = outbytes_left = strlen(a->name);
+ status = apr_xlate_conv_buffer(convset, a->name, &inbytes_left, (char *) a->name, &outbytes_left);
+ if (status) {
+ return status;
+ }
+ inbytes_left = outbytes_left = strlen(a->value);
+ status = apr_xlate_conv_buffer(convset, a->value, &inbytes_left, (char *) a->value, &outbytes_left);
+ if (status) {
+ return status;
+ }
+ }
+
+ for (ec = e->first_child; ec != NULL; ec = ec->next) {
+ status = apr_xml_parser_convert_elem(ec, convset);
+ if (status) {
+ return status;
+ }
+ }
+ return APR_SUCCESS;
+}
+
+/* convert the whole document to EBCDIC */
+APU_DECLARE(apr_status_t) apr_xml_parser_convert_doc(apr_pool_t *pool,
+ apr_xml_doc *pdoc,
+ apr_xlate_t *convset)
+{
+ apr_status_t status;
+ /* Don't convert the namespaces: they are constant! */
+ if (pdoc->namespaces != NULL) {
+ int i;
+ apr_array_header_t *namespaces;
+ namespaces = apr_array_make(pool, pdoc->namespaces->nelts, sizeof(const char *));
+ if (namespaces == NULL)
+ return APR_ENOMEM;
+ for (i = 0; i < pdoc->namespaces->nelts; i++) {
+ apr_size_t inbytes_left, outbytes_left;
+ char *ptr = (char *) APR_XML_GET_URI_ITEM(pdoc->namespaces, i);
+ ptr = apr_pstrdup(pool, ptr);
+ if ( ptr == NULL)
+ return APR_ENOMEM;
+ inbytes_left = outbytes_left = strlen(ptr);
+ status = apr_xlate_conv_buffer(convset, ptr, &inbytes_left, ptr, &outbytes_left);
+ if (status) {
+ return status;
+ }
+ apr_xml_insert_uri(namespaces, ptr);
+ }
+ pdoc->namespaces = namespaces;
+ }
+ return apr_xml_parser_convert_elem(pdoc->root, convset);
+}
+#endif