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]

