Changes with APR-util 0.9.5

  *) If available, use 'readlink -f' to resolve symlinks in apu-config.
     [Justin Erenkrantz]

  *) Fix corrupt output from the apr_xlate_* interfaces on AIX 4.x.
     [Joe Orton]

  *) Change the order in which ldap.h and lber.h are defined, to fix
     a compile bug in Solaris v2.8 which requires lber.h then ldap.h.
     PR 27379.  [Andrew Connors <andy.connors idea.com>]
 
  *) Restore support for SHA1 passwords in apr_validate_password.
     PR 17343.  [Paul Querna <chip force-elite.com>]

  *) Fix DESTDIR install for bundled expat library.  PR 14076
     [David S. Madole <david madole.net>]

  *) Fix occasional crash in apr_rmm_realloc().  PR 22915.
     [Jay Shrauner <shrauner inktomi.com>]

  *) Fix apr_dbm_exists() for sdbm when sizeof(int) != sizeof(size_t). 
     [Joe Orton]

  *) The whole codebase was relicensed and is now available under
     the Apache License, Version 2.0 (http://www.apache.org/licenses).
     [Apache Software Foundation]

  *) Fix xlate.c compile failure on AIX 5.2.  PR 25701.  [Jeff Trawick]

  *) Fixed a bug in apr_rmm that would cause it to mishandle blocks of
     a size close to the one requested from the allocator.
     [Kevin Wang <xwang_tech yahoo.com>]

Changes with APR-util 0.9.4

  *) Changed apr_bucket_alloc_create() so that it uses the allocator
     from the pool that was passed in rather than creating its own.
     Also, the bucket_allocator is now allocated from the apr_allocator_t
     rather than using apr_palloc().  Added apr_bucket_alloc_create_ex()
     which takes an apr_allocator_t* directly rather than an apr_pool_t*.
     [Cliff Woolley, Jean-Jacques Clar]

  *) Added debugging consistency checks to the buckets code.  Add
     -DAPR_BUCKET_DEBUG to the build flags to enable.
     [Cliff Woolley]

  *) Make the version of the db library APU built against visible.
     [Thom May]

  *) Fix a problem with VPATH builds copying the APR rules.mk into the
     source directory rather than the build directory.  [Justin Erenkrantz]

  *) SECURITY [httpd incident CAN-2003-0189] Address a thread safety
     issue with apr_password_validate() on AIX, Linux, Mac OS X, and
     possibly other platforms.  [Jeff Trawick, Justin Erenkrantz]

  *) Fix a problem with LDAP configuration which caused subsequent
     configure tests to fail since LIBS contained LDAP libraries for
     subsequent tests but LDFLAGS no longer included the path to such 
     LDAP libraries.  [Jeff Trawick]

  *) Fix a problem preventing the use of the bundled Expat when APR-util
     is built stand-alone.  [Jeff Trawick]

  *) Use the same compiler and preprocessor for the APR-util config tests
     which were used by APR.  The user can override this via CC and CPP.
     This was done all along for the actual build, but not necessarily
     for the config tests.  [Jeff Trawick]

  *) Fix apr_uuid_parse() on EBCDIC machines.  [Jeff Trawick]

  *) Fix alignment problem when allocating memory using apr_rmm. The problem
     showed up while trying to write a double in the memory allocated.
     [Madhusudan Mathihalli]

Changes with APR-util 0.9.3

  *) Allow apr_date_parse_rfc to parse 'Sun, 06-Nov-1994 08:49:37 GMT' as a
     valid date.  [Dmitri Tikhonov <dmitri@netilla.com>]

  *) Fix error in apu-config when symlinks are involved.
     [Garrett Rooney <rooneg@electricjellyfish.net>]

Changes with APR-util 0.9.2

  *) Fix the APR_BUCKET_IS_foo() macros so they parenthesize their parameter.
     This fixes compile problems with some types of parameters.
     [Jim Carlson <jcarlson@jnous.com>]

  *) Queue overwrite, we now return the item pushed, not a reference to it. 
     [Paul Marquis <PMarquis@pobox.com, Jacob Lewallen <jlwalle@cs.ucr.edu>]

  *) Remove include/apr_ldap.h on distclean.  PR 15592.  [Justin Erenkrantz]

  *) Fix race conditions in apr_queue.
     [Jacob Lewallen <jlwalle@cs.ucr.edu>]

  *) Stop buildconf copying rules.mk, copy it at configure time. 
     [Thom May]

  *) Make buildconf copy rules.mk as well. 
     [Garrett Rooney <rooneg@electricjellyfish.net>]

  *) Add --includedir flag to apu-config.  [Justin Erenkrantz]

  *) Fix brokenness in sdbm when sizeof(int) != sizeof(size_t)
     (e.g., 64-bit AIX, 64-bit Solaris).  PR 14861.  [Jeff Trawick]

  *) Have buildconf copy required files from apr so that apr-util can build
     on its own.  [Craig Rodrigues <rodrigc@attbi.com>]

  *) Detect OpenLDAP when used with Solaris 9. PR 13427.
     [Gary Algier <gaa@ulticom.com>]

  *) Detect Berkeley DB 4.1 when compiled with --with-uniquenames
     [Thom May]

  *) Allow apu-config to work in symlinked install directories when
     'realpath' is available.  [Justin Erenkrantz]

  *) Fix bug in apr_strmatch when used with case-insensitive patterns.
     [Justin Erenkrantz]

  *) Allow apr_queue to have greater than int number of elements.
     [Justin Erenkrantz]

  *) Detect Berkeley DB 4.0 compiled with --with-uniquenames.
     [Philip Martin <philip@codematters.co.uk>]

  *) Allocate brigades from a bucket allocator rather than a pool. [Brian Pane]

  *) Update with the latest APR renames [Thom May]

  *) Update doxygen tags.  [Justin Erenkrantz]

  *) Add apr_ldap.hw for Windows build.
     [Andre Schild <A.Schild@aarboard.ch>]

  *) Add IPv6 literal address support to apr_uri_parse(), apr_uri_unparse(), 
     and apr_uri_parse_hostinfo().  PR 11887  [Jeff Trawick]

  *) Add apr_brigade_writev()  [Brian Pane]

  *) Add support for Berkeley DB 4.1.  [Justin Erenkrantz]

  *) Add --bindir option to apu-config.  [Justin Erenkrantz]

Changes with APR-util 0.9.1

  *) Add versioning infrastructure.
     [Justin Erenkrantz]

  *) Running "make check" in the toplevel directory or the test/ directory
     will build and run all test programs.  [Aaron Bannert]

  *) Bug #9789 : NDBM support 
     [Toomas Soome <tsoome@muhv.pri.ee>, Ian Holsman]

  *) Added a Thread safe FIFO bounded buffer (apr_queue) [Ian Holsman]

  *) Changed file_bucket_setaside() to use apr_file_setaside() instead
     of turning the file bucket into an mmap bucket.  [Brian Pane]

  *) Install libaprutil support libraries before installing libaprutil
     itself, since on some platforms libaprutil is relinked during
     make install and the support libraries need to exist already.
     [Jeff Trawick]

  *) Added a Resource List API for threadsafe access to persistent
     and dynamically created user-defined resources.  [Aaron Bannert]

  *) Adopted apr-util/xlate from apr/i18n for inclusion of apr-iconv
     as required by missing libiconv.  [William Rowe]

  *) Adopted apr-util/crypto/ uuid and md5 from apr.  [William Rowe]

  *) Look for expat in lib64 directories.  [Peter Poeml <poeml@suse.de>]

  *) Faster implementation of apr_brigade_puts()  [Brian Pane]

  *) Fixed a segfault in apr_date_parse_rfc() for some date formats
     where it was trying to overlay a potentially static input
     string even though it didn't really need to.
     [Cliff Woolley, Doug MacEachern]

  *) Ensure that apu-config does not print libtool libraries when
     using --libs.  [Justin Erenkrantz]

  *) Added apr_bucket_file_enable_mmap() function to the bucket
     API to let an application control whether a file bucket may
     be turned into an mmap bucket upon read.  (The default remains
     to do the mmap, but this function lets the app prevent the
     mmap in contexts where mmap would be a bad idea.  Examples
     include multiprocessors where mmap doesn't scale well and
     NFS-mounted filesystems where a bus error can result if
     a memory-mapped file is removed or truncated.) [Brian Pane]

  *) Added string-matching API (apr_strmatch.h)  [Brian Pane]

  *) Rearrange INCLUDES so that APRUTIL_PRIV_INCLUDES is always
     first.  [Garrett Rooney <rooneg@electricjellyfish.net>]

  *) Add --old-expat option to apu-config to allow users of apr-util to
     determine what expat it should expect to be installed.  If the
     flag is set to yes, it should include xmlparse.h.  If it is set to
     no, it should include expat.h.  [Justin Erenkrantz]

  *) Fix exporting of includes in apu-config.  [Justin Erenkrantz]

  *) Change bucket brigades API to allow a "bucket allocator" to be
     passed in at certain points.  This allows us to implement freelists
     so that we can stop using malloc/free so frequently.
     [Cliff Woolley, Brian Pane]

  *) add apr_rmm_realloc() function
     [Madhusudan Mathihalli <madhusudan_mathihalli@hp.com>]

  *) renames: apr_ansi_time_to_apr_time becomes apr_time_ansi_put
     ap_exploded_time_t becomes apr_time_exp_t
     [Thom May <thom@planetarytramp.net>]

  *) Add detection support for FreeBSD's expat and expat2 ports.
     [Justin Erenkrantz]

  *) Deprecate check_brigade_flush(), which had several nasty bugs, and
     which was causing apr_brigade_write()'s logic to be less than obvious.
     Everything is now done in a slightly rearranged apr_brigade_write().
     [Cliff Woolley]

  *) Don't add /usr/include to the INCLUDES variable on expat's account.
     [Joe Orton <joe@manyfish.co.uk>]

  *) Remove the autoconf 2.5x cache directory in buildconf.
     [Joe Orton <joe@manyfish.co.uk>]

  *) BerkleyDB should NULL out the key if it is @EOF in vt_db_nextkey
     [Ian Holsman]

  *) Add ability to natively fetch and split brigades based on LF lines.
     [Justin Erenkrantz]

  *) add --with-berkeley-db=DIR & --with-gdbm  configure flags
     [Ian Holsman/Justin Erenkrantz]

  *) Fix expat detection to recognize installed versions.
     [Eric Gillespie, Jr. <epg@pretzelnet.org>]

  *) Add find_apu.m4 to allow third-party programs that use APR-util
     to have a standard m4 macro for detection.  [Justin Erenkrantz]

  *) Add apu-config - a shell script to allow third-party programs
     easy access to APR configuration parameters.  [Justin Erenkrantz]

  *) Add GMT offset calculation to apr_date_parse_rfc().  
     [Justin Erenkrantz]

  *) Introduce the apr_rmm api, to allow relocatable memory management
     of address-independent data stores, such as shared memory.
     [William Rowe]

  *) Rework and fix VPATH-build support.  [Justin Erenkrantz]

  *) Add support for Berkeley DB4.  [Justin Erenkrantz]

  *) Improve testdbm help.  [Justin Erenkrantz]

  *) Improve autoconf detection of DBMs.  [Justin Erenkrantz]

  *) BerkeleyDBM v2 now checks minor level for cursor ops [Ian Holsman]

  *) Reading a file bucket bigger than APR_MMAP_LIMIT (4MB) now yields
     a string of 4MB mmap buckets, rather than a string of 8KB heap buckets
     plus a 4MB mmap bucket.  To accomodate this, the mmap bucket destroy
     function explicitly deletes the apr_mmap_t after last reference
     to avoid having too much of a large file mapped at once if possible.
     [Cliff Woolley]

  *) Multi-DBM support (via apr_dbm_open_ex).  [Ian Holsman]

  *) Use apr_mmap_dup in mmap_setaside().  [Brian Pane <bpane@pacbell.net>]

  *) Dropped the "w" parameter from apr_bucket_heap_create() and
     apr_bucket_heap_make().  That parameter was originally intended
     to return the amount of data copied into the bucket, but it
     ended up being unnecessary because that amount is invariant from
     the size of the data and is available as b->length in the
     resulting bucket anyway.  [Cliff Woolley]

  *) Fix Makefile conversion for BSD/OS.  [Cliff Woolley]

  *) Use APR_XtOffsetOf instead of offsetof() in the ring macros for
     portability.  [Cliff Woolley]

  *) We now create exports.c and export_vars.h, which in turn create
     exports.c.  From this we generate two more files with different
     purposes: aprutil.exp - list of exported symbols; and exports.lo
     (exports.o) - an object file that can be linked with an executable
     to force resolution of all apr-util symbols.   [Aaron Bannert]

  *) Fix Berkley DBM support [Ian Holsman <ianh@apache.org>]

  *) Fix apr_brigade_vprintf so that it can handle more than
     4k of data at one time.  [Cody Sherr <csherr@covalent.net>]

  *) prefix UNP_* flags with APR_URI_

     rename:
     apr_uri_components                  -> apr_uri_t
     apr_uri_unparse_components          -> apr_uri_unparse
     apr_uri_parse_components            -> apr_uri_parse
     apr_uri_parse_hostinfo_components   -> apr_uri_parse_hostinfo

     s/APU_URI_/APR_URI_/g
     [Perl]

  *) Landed the link-to-LDAP to the build process, and the LDAP v2/v3
     compatibility functions.
     [Dave Carrigan <dave@rudedog.org>, Graham Leggett]

  *) Fix URI unparse function to handle the case where it would place a @
     when both the username and password were present but omitted.
     [Jon Travis <jtravis@covalent.net]

  *) Added apr_xml_parse_file() routine and a testxml program.
     [Ian Holsman <ianh@cnet.com>]

  *) Extend apr_bucket struct to add a pointer to a function used
     to free the bucket. This change enables custom buckets to
     completely specify how they are to be allocated and freed.
     Before this change, custom buckets were required to use the 
     same memory allocation scheme as the standard APR buckets.
     [Saeid Sakhitab, Bill Stoddard, Cliff Woolley, Roy Fielding]

  *) Install Expat when installing APR-util.  [Justin Erenkrantz]

  *) Make APR-util configure script rely on APR.  This removes the locally
     generated copy of libtool and uses the one in APR.  Fix up how we
     call the expat configure script.  Generate config.nice file.
     [Justin Erenkrantz]

  *) The apr_bucket lengths are now consistently apr_size_t, while any
     apr_brigade lengths (short of a read) are consistently apr_off_t.
     This is required for APR_HAS_LARGE_FILES handling.  [William Rowe]

  *) apr_bucket_file_create() and apr_bucket_file_make() now take a pool
     parameter which is the pool into which any needed data structures
     should be created during file_read().  This is used for MMAPing the
     file and reopening the file if the original apr_file_t is in XTHREAD
     mode.  [Cliff Woolley]

  *) apr_brigade_partition() now returns an apr_status_t. [Cliff Woolley]

  *) Add MD4 implementation in crypto.  [Sander Striker, Justin Erenkrantz]

  *) Moved httpd 2.0.18's util_date to apr_date and enhanced its parsing
     capabilities.  [Justin Erenkrantz]

  *) Moved httpd 2.0.18's util_uri to apr_uri and name-protected its
     symbols and functions.  [Justin Erenkrantz, Roy Fielding]

  *) Rename field "private" in struct apr_xml_elem to "priv" for C++
     compatibility.  PR #7727  [Joshua MacDonald <jmacd@cs.berkeley.edu>]

  *) Make APR_IMPLEMENT_EXTERNAL_HOOK_BASE generate a 
     ${namespace}_hook_get_${hookname} function to fetch the
     list of registered hooks [Doug MacEachern]

  *) Allow LTFLAGS to be overridden by the configure command-line
     (default="--silent") and introduce LT_LDFLAGS.  [Roy Fielding]

  *) Add APR_SHARELOCK support to apr_sdbm_open(), locking read operations
     with a shared lock and all write ops with an excl lock.  [Will Rowe]

  *) Namespace protect apr_sdbm, and normalize the return values (including
     the apr_sdbm_fetch, apr_sdbm_firstkey and apr_sdbm_nextkey functions).
     Normalized the get/clear error function names, and stores the actual 
     apr error for apr_sdbm_error_get. [Will Rowe]

  *) Introduce an apr_fileperms_t argument to apr_dbm_open(). [Will Rowe]

  *) Removed apr_bucket_do_create() macro, which was causing warnings
     about unreachable code in some compilers (notably MSVC).  What
     used to be done by this macro is now done inline in the various
     apr_bucket_foo_create() functions.  [Cliff Woolley]

  *) Make clean, distclean, and extraclean consistently according to the
     Gnu makefile guidelines.  [Justin Erenkrantz <jerenkrantz@ebuilt.com>]

  *) Migrate the --disable-libtool changes from APR to APR-util.
     This cleans things up, and allows more flexibility when building
     programs.  [Ryan Bloom]

  *) Allow APR-util to be compiled without libtool.  The default is
     to use libtool, but it can turned off with --disable-libtool
     on the configure command.  [Ryan Bloom]

  *) Repair calling convention for apr_register_optional_fn to
     eliminate GP fault on Win32.  [William Rowe]

  *) Substantial changes to correct linkage and declarations for
     generic hooks on dso architectures.  [Ben Laurie, Will Rowe]

  *) apr_bucket_shared_destroy() now returns a boolean value.
     [Cliff Woolley]

  *) We have to initialize the heap buckets to the correct length.
     we were seeing heap buckets with 17 chars in them reporting
     a length of 9017, because they were initialized to the amount
     of memory allocated, instead of the amount of memory used.
     This was only an issue for heap buckets created by the
     apr_brigade_* functions.   [Ryan Bloom]

  *) apr_bucket_init_types() and apr_bucket_insert_type() have been
     removed... they're not needed anymore. [Cliff Woolley]

  *) The apr_bucket_shared and apr_bucket_simple structures have been
     removed as an API simplification/optimization.  This should be
     transparent outside APR-util except to callers who attempt to
     directly manipulate the buckets' internal structure (which is
     not recommended anyway) and to callers who create their own
     bucket types. [Cliff Woolley]

  *) apr_bucket_simple_split() and apr_bucket_simple_copy() are now
     exported functions, which could be helpful in implementing
     external bucket types. [Cliff Woolley]

  *) The third parameter to apr_bucket_shared_make() is now
     'apr_off_t length' rather than 'apr_off_t end', since the
     end usually had to be computed by the caller and all we
     really want is the length anyway. [Cliff Woolley]

