                                                     
-*- coding: utf-8 -*-
Changes with APR 0.9.21

  *) configure: Fix detection of O_NONBLOCK inheritance on busy
     systems.  [Rainer Jung]

  *) apr_time_exp_*() on Windows: Fix error in the tm_yday field of
     apr_time_exp_t for times within leap years.  PR 53175.
     [Jeff Trawick]

  *) Improve platform detection by updating config.guess and config.sub.
     [Rainer Jung]

  *) Flush write buffer before truncate call on a file.
     [Mladen Turk]

  *) Security: oCERT-2011-003
     Randomise hashes by providing a seed.
     [Bojan Smojver, Branko Čibej, Ruediger Pluem et al.]

Changes with APR 0.9.20

  *) Security: CVE-2011-0419
     Reimplement apr_fnmatch() from scratch using a non-recursive
     algorithm; now has improved compliance with the fnmatch() spec.
     [William Rowe]

  *) Updated config.guess and config.sub.  [Rainer Jung]

  *) Fix flag character '#' in combination with format character 'x' in
     apr snprintf implementations.  [Rainer Jung]

Changes with APR 0.9.19

  *) SECURITY: CVE-2009-2412 (cve.mitre.org)
     Fix overflow in pools and rmm, where size alignment was taking place.
     [Matt Lewis <mattlewis@google.com>, Sander Striker, William Rowe]

  *) Improve platform detection by updating config.guess and config.sub.
     [Rainer Jung]

Changes with APR 0.9.18

  *) z/OS: return standard apr_status_t codes from apr_dso_load()
     and apr_dso_sym().  [David Jones <oscaremma gmail.com>]

  *) Fix apr_tokenize_to_argv parsing.  PR 46128
     [Edward Rudd <eddie omegaware.com>]

Changes with APR 0.9.17

  *) Fix DSO-related crash on z/OS caused by incorrect memory
     allocation.  [David Jones <oscaremma gmail.com>]

  *) Define apr_ino_t in such a way that it doesn't change definition
     based on the library consumer's -D'efines to the filesystem.
     [Lucian Adrian Grijincu <lucian.grijincu gmail.com>]

  *) Cause apr_file_dup2() on Win32 to update the MSVCRT psuedo-stdio
     handles for fd-based and FILE * based I/O.  [William Rowe]

  *) Revert Win32 to the 0.9.14 behavior of apr_proc_create() for any 
     of the three stdio streams which are not initialized, through either
     apr_procattr_io_set() or apr_procattr_child_XXX_set(), when given a
     procattr_t with one or two streams which were initialized through
     apr_procattr_child_XXX_set().  Once again, these do not inherit the 
     parent process stdio stream to WIN32 child processes (passing 
     INVALID_HANDLE_VALUE instead) as on Unix.  Note APR 1.3.0 adopts 
     the Unix behavior of inheriting any uninitialized streams as the 
     parent's corresponding stdio stream, in such cases.  [William Rowe]

Changes with APR 0.9.16

  *) Win32 apr_file_read: Correctly handle completion-based read-to-EOF.
     [Steven Naim <steven.naim googlemail.com>]

  *) Fixed Win32 regression of StdOutput inheritance in apr_proc_create.
     [William Rowe]

Changes with APR 0.9.15

  *) Solve WinNT inherited pipe leaks by mutexing apr_proc_create calls,
     on WinNT (not WinCE, nor 9x) so that we toggle the inherited state 
     of the stdin/out/err pipes.  All other file handles are treated as
     not-inherited until apr_file_dup2'ed a std handle of this process, 
     or while they are used by apr_proc_create.  [William Rowe]

  *) Define the Mac OS/X filesystem_encoding as utf-8 (in previous
     releases the interpretation would vary).  [Branko Čibej]

  *) Fix day of year (tm_day) calculation for July. The bug only affects
     Windows builds.  PR 42953.  [Davi Arnaut]

Changes with APR 0.9.14

  *) Register a cleanup only if APR_FILE_NOCLEANUP was not flagged in
     apr_file_mktemp. [Brian J. France <list firehawksystems.com>]

  *) Numerous build fixes for non-GCC builds and GCC builds on Win32,
     as well as WinCE builds.  [Davi Arnaut <davi haxent.com.br>,
     Curt Arnold <carnold apache.org>, John Mark Vandenberg, 
     Kouhei Sutou <kou cozmixng.org>, William Rowe]

  *) Discard file buffers when running cleanups for exec.
     PR 41119.  [Davi Arnaut <davi haxent.com.br>, Bojan Smojver]

  *) Improve thread safety of assorted file_io functions.
     PR 42400.  [Davi Arnaut <davi haxent.com.br>]

  *) Fix file pointer position calculation in apr_file_writev() on
     buffered file.  PR 40963.  [Davi Arnaut <davi haxent.com.br>]

Changes with APR 0.9.13

  *) Fix detection of pthread cross-process robust mutexes.
     PR 39833.  [Tsuyoshi SASAMOTO <nazonazo miobox.jp>]

  *) Correctly retrieve 'empty' environment values with apr_env_get
     on Win32 (e.g. "VAR="), and added validation to testall suite.  
     PR 40764.  [Issac Goldstand <margol beamartyr.net>]

  *) Portably check for EEXIST in mktemp code.  PR 40818
     [Kenneth Golomb <KGolomb TradeCard.com>]

  *) Fix apr_atomic_cas on platforms with 64 bit longs.
     [Philip Martin <philip codematters.co.uk>]

  *) Provide folding in autogenerated .manifest files for Win32 builders
     using VisualStudio 2005  [William Rowe]

Changes with APR 0.9.12

  *) Netware - add missing apu_version.c parsing for apu_version_string()
     to the Netware specific builds.  Unix platforms supporte this API 
     since 0.9.1.  [Brad Nicholes]

Changes with APR 0.9.11

  *) Synced get-version.sh to trunk to correctly retrieve 2 digit subversion,
     which broke the 0.9.10 candidate.  [William Rowe]

  *) Fixed 'make check' target to avoid invoking sub-programs of testshm,
     testshmconsumer and testshmproducer.  [William Rowe]

  *) Permit Win32 to seek to the point 2^32-1, by checking that result
     against the actual error and continuing on success.  [William Rowe]

Changes with APR 0.9.10

  *) Minor bug fixes to address various platform build and run time issues.

  *) Permit 'make check' binaries to run on Darwin by omitting -no-install
     flag [William Rowe, Joe Orton]

Changes with APR 0.9.9

  *) Prevent detection of robust mutex support with glibc 2.4,
     fixing APR_LOCK_PROC_PTHREAD locks.  PR 38442.  [Joe Orton]

  *) Fix apr_strerror() with glibc 2.4.  [Joe Orton]

  *) Install mkdir.sh, make_exports.awk, make_var_export.awk to the APR
     installbuilddir, and provide working accessor variables in
     apr_rules.mk.
     [Max Bowsher]

  *) Fix seeks with files opened in xthread mode for append on win32.
     [M Joonas Pihlaja <jpihlaja cc.helsinki.fi>, Garrett Rooney]

  *) Keep testpipe.c from hanging on win32. [Garrett Rooney]

  *) Cause apr_file_write_full on win32 to consider the timeout value set by 
     apr_file_pipe_timeout_set.  PR 30182
     [<eholyat olf.com>]

  *) Fix assertion from double close of a handle with a rwlock on win32.
     [Evgueni Brevnov <evgueni.brevnov gmail.com>]

  *) Fix EOF handling for unbuffered reads on win32.
     [Konstantin Sharenkov <Konstantin.Sharenkov enterra-inc.com>]

  *) Documented that apr_stat and apr_dir_read can return APR_INCOMPLETE,
     and how to determine which parts of the resulting apr_finfo_t can be
     used in such a case.
     [Garrett Rooney]

  *) Fix passing "" as an argument to the program started by apr_proc_create
     on Win32.
     [Philip Martin <philip codematters.co.uk>

  *) Fix warning when compiling on FreeBSD by correcting the type of
     the final argument passed to sysctlbyname. [Garrett Rooney]

Changes with APR 0.9.7

  *) Fix crash in apr_dir_make_recursive() for relative path
     when the working directory has been deleted.  [Joe Orton]

  *) Win32: fix apr_proc_mutex_trylock() to handle WAIT_TIMEOUT,
     returning APR_EBUSY.  [Ronen Mizrahi <ronen@tversity.com>]

  *) Fix apr_file_read() to catch write failures when flushing pending
     writes for a buffered file.  [Joe Orton]

  *) Fix apr_file_write() infinite loop on write failure for buffered
     files.  [Erik Huelsmann <ehuels gmail.com>]

  *) Fix error handling where apr_uid_* and apr_gid_* could segfault
     or return APR_SUCCESS in failure cases.  PR 34053.  [Joe Orton,
     Paul Querna]

  *) Refactor Win32 condition variables code to address bugs 27654, 34336.
     [Henry Jen <henryjen ztune.net>, E Holyat <eholyat yahoo.com>]

  *) Support APR_SO_SNDBUF and APR_SO_RCVBUF on Windows.  PR 32177.
     [Sim <sgobbi datamanagement.it>, Jeff Trawick]

  *) Fix detection of rwlocks on Mac OS X. [Aaron Bannert]

  *) Fix issue with poll() followed by net I/O yielding EAGAIN on
     Mac OS 10.4 (Darwin 8). [Wilfredo Sanchez]

Changes with APR 0.9.6

  *) Add apr_threadattr_stacksize_set() for overriding the default
     stack size for threads created by apr_thread_create().
     [Jeff Trawick]

  *) Add an RPM spec file. [Graham Leggett]

  *) Add a build script to create a solaris package. [Graham Leggett]

Changes with APR 0.9.5

  *) Prevent unbounded memory use during repeated operations on a hash table.
     [Julian Foad <julianfoad btopenworld.com>

  *) fix apr_file_dup and apr_file_dup2 win32 implementations
     to create a mutex [Steve Hay <steve.hay uk.radan.com>]

  *) Makes the threads to behave like on posix. If the thread is created
     without APR_DETACH expect that the thread_join will be called, so don't
     close the handle in advance, if the thread has already finished.
     [Mladen Turk]
 
   *) The apr/test/Makefile.win is missing a target to build a
     readchild.exe that test is depending on but is never built.
     [Mladen Turk]
 
  *) Fix build issues in paths containing symlinks.  PR 8867.
     [Joe Orton]

  *) Update config.{guess,sub} for DragonFly BSD.  PR 29858.
     [Joe Orton]

  *) Win32: Fix bug in apr_socket_sendfile that interferred with
     Win32 LSPs. Bug is described in Apache 2.0 bugzilla report 
     23982 [Jan Bilek, Bill Stoddard]

  *) apr_proc_create() on Unix: Remove unnecessary check for read 
     access to the working directory of the child process.
     PR 30137.  [Jeremy Chadwick <apache jdc.parodius.com>]

  *) Win32: Fix bug tracking the file pointer on a file opened for 
     overlapped/APR_XTHREAD io. [Bill Stoddard]

  *) Fix FreeBSD atomics.  [Paul Querna <chip force-elite.com>]

  *) Fix apr_snprintf() to respect precision for small floating point
     numbers.  PR 29621.  [Artur Zaprzala <zybi talex.pl>]

  *) Add command type APR_SHELLCMD_ENV for creating a process
     which is started by the shell and which inherits the parent's
     environment variables.  [Jeff Trawick]

  *) Change default inter-process locking mechanisms: POSIX semaphores
     and pthread cross-process mutexes are not used by default; on 
     Solaris, fcntl locks are used by default.  [Joe Orton]

  *) Don't try to enable run-time linking on AIX < 4.2, as this
     results in invalid linker options being used.  PR 29170.  
     [Jeff Trawick]

  *) Remove apr_file_copy()'s 2Gb file size limit on some platforms.
     [Joe Orton]

  *) Don't assume getnameinfo() can handle IPv4-mapped IPv6 addresses
     on any platforms.
     [Jeff Trawick, Joe Orton, Colm MacCárthaigh <colm stdlib.net>]

  *) Support setuid, setgid and sticky file permissions bits on Unix.
     [André Malo]

  *) Fix sign error in apr_file_seek(APR_END).
     [Greg Hudson <ghudson MIT.EDU>]

  *) Provide workaround for socklen_t declaration problem with 64-bit
     build on HP-UX.  Stop setting a PA-RISC-specific compile option
     on ia64.  Look for -mt thread option, which is used with HP-UX
     vendor compiler on ia64.  [Jeff Trawick, based on idea from
     Madhusudan Mathihalli]

  *) Return an error instead of silently failing when apr_poll() is
     used with file descriptors >= FD_SETSIZE.  (Unix systems with
     no native poll())  [Jeff Trawick, Brad Nicholes]

  *) Fix handling of negative numbers in apr_strtoi64() on platforms
     without strtoll.  [Joe Orton]

  *) Fix printing apr_int64_t values smaller than LONG_MIN on 32-bit
     platforms in apr_vformatter.  [Joe Orton]

  *) Fix apr_socket_opt_set with APR_IPV6_V6ONLY flag.  Fixes httpd
     Listen IPv6 socket behavior on FreeBSD 5.x, OpenBSD, NetBSD.
     [Justin Erenkrantz]

  *) Fix apr_time_exp_get() for dates in 2038.  
     [Philip Martin <philip codematters.co.uk>]

  *) Add APR_LARGEFILE flag to allow opening files with the
     O_LARGEFILE flag; not recommended for general use, see
     include/apr_file_io.h.  [Joe Orton]

  *) Various build fixes: thread_rwlock.c on some Solaris platforms
     (PR 22990); filestat.c on ReliantUnix (PR 22990); config.status
     on IRIX (PR 19251).  [Various]

  *) Use NI_NAMEREQD instead of NI_NUMERICHOST in
     APR_CHECK_GETNAMEINFO_IPV4_MAPPED.  PR 24469.  [Justin Erenkrantz]

  *) Ensure that apr_sockaddr_info_get() does not return anything
     other than AF_INET and AF_INET6 addresses.  [Joe Orton]

  *) Clarify that apr_dir_read() does not guarantee order of returned
     entries as previously claimed.  [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]

  *) Define apr_off_t as long rather than as off_t on platforms with a
     32-bit off_t to prevent incompatibility with packages such as
     Perl which redefine the size of off_t via _FILE_OFFSET_BITS on
     some platforms.  [Ben Reser <ben reser.org>]

  *) apr_socket_connect(): allow app to make subsequent call on 
     non-blocking socket.  [Jeff Trawick]
 
  *) Add apr_os_pipe_put_ex(), which allows the caller to tell APR
     to establish a cleanup on the pipe.  [Jeff Trawick, Brad Nicholes]

  *) Fix make_exports.awk to work with apr-iconv.  [Justin Erenkrantz]

Changes with APR 0.9.4

  *) win32: fix apr_file_dup() and apr_file_dup2() to dup the
     ungetchar member [Stas Bekman]

  *) Preserve leading '../' segments as when merging to an empty and
     unrooted path - fixes a bug observed in SVN with Win32/Netware/OS2.
     [Mike Pilato <cmpilato@collab.net>, William Rowe]

  *) Work around a bug in Darwin when calling getnameinfo() on IPv4-mapped
     IPv6-addresses.  [Colm MacCárthaigh <colm@stdlib.net>, Jeff Trawick,
     Justin Erenkrantz]

  *) Add apr_temp_dir_get() for getting the most suitable temp directory
     [Mike Pilato <cmpilato@collab.net>, Thom May]

  *) Modify apr_sockaddr_info_get to call the resolver when we
     do not have a hostname.  Also, fix bugs in the getaddrinfo()
     implementation.
     [Colm MacCárthaigh <colm@stdlib.net>, Justin Erenkrantz]

  *) Change the behavior of unix process 'trylock's to return
     APR_ENOTIMPL instead of segfaulting, consistent with the
     other lock implementations.  [William Rowe]

  *) Fix a subtle race where the ownership of a unix nested
     thread lock could be corrupted when the prior owner released
     the lock with another thread waiting on the same lock.
     [William Rowe]

  *) apr_socket_data_set(): allow the same key to be used for
     multiple sockets in the same pool.  [Jeff Trawick]

  *) Add new table function apr_table_compress() and replace
     red-black trees with mergesort in apr_table_overlap()
     [Joe Schaefer <joe+gmane@sunstarsys.com>, Brian Pane]

  *) Win32: Adopt Brian Havard's OS/2 rwlock implementation for
     Windows [Marc Adkins, Bill Stoddard]

  *) Add apr_proc_mutex_lockfile() for retrieving the name of the
     file associated with a mutex.  [Jeff Trawick]

  *) Don't require the lock file name to be passed into 
     apr_proc_mutex_child_init() or apr_global_mutex_child_init().
     This allows child init to work when the lock file was a temp
     file created by APR.  (The problem only occurred with flock-
     based mutexes.)  [Jeff Trawick]

  *) When using a temporary file for flock- and fcntl-based mutexes, 
     don't let the file be deleted on close.  For flock-based mutexes,
     this corrects a fatal problem, since the file would disappear 
     when a program was spawned and cleanup-for-exec was performed, 
     and a subsequent attempt to perform child process mutex 
     initialization would fail.  For fcntl-based mutexes, this was a 
     very minor issue that resulted in a failing unlink() when the 
     file was closed, since fcntl lock initialization always removes 
     the file immediately.  [Jeff Trawick]

  *) When writing to pipes with a timeout set, handle the situation
     where the kernel says the pipe is writable but an attempt to
     write <= PIPE_BUF bytes gets EAGAIN.  APR will now write whatever
     data will fit.  APR applications that relied on the atomic nature
     of relatively small pipe write requests may be affected.
     PR 20295  [Mark Street <mark@faime.demon.co.uk>, Jeff Trawick]

  *) Define _THREAD_SAFE for all compilations on AIX.  Previously
     those of us who used the vendor compiler had it defined
     implicitly and others did not.  The difference became obvious
     with the recent thread safety fixes to apr_password_validate().
     PR 20420  [Jeff Trawick]

  *) For apr_proc_detach(APR_PROC_DETACH_FOREGROUND), don't treat
     a setsid() failure as fatal, as the usual cause is that the
     caller is already a process group leader.  PR 18519
     [Jeff Trawick]

  *) Fix some problems with non-blocking socket handling on unix
     that resulted in infinite timeouts being used for non-blocking
     sockets with apr_socket_connect() and some read/write calls.
     [Jeff Trawick]

  *) Fix a bug in socket timeout handling on unix that left the
     socket non-blocking after disabling the timeout.
     [Jacob Craig Lewallen <jlewalle@cs.ucr.edu>]

  *) Added flag APR_FILE_ATTR_HIDDEN for manipulating the "hidden"
     file attribute on Windows and OS/2.  [Branko Čibej]

  *) SECURITY [CAN-2003-0245]: Fixed a bug that could be triggered
     remotely through mod_dav and possibly other mechanisms, causing
     an Apache child process to crash.  The crash was first reported
     by David Endler <DEndler@iDefense.com> and was researched and
     fixed by Joe Orton <jorton@redhat.com>.  Details will be released
     on 30 May 2003.

  *) apr_proc_wait(): Handle interrupted waitpid(2) calls by calling
     it repeatedly until it succeeds or fails with errno other than
     EINTR.  This hides this UNIX-specific behavior from APR clients.

  *) Removed the solaris-specific atomic code, due to licence
     concerns (it was MPL 1.0, and the author could not be contacted)
     [Ian Holsman]

  *) apr_file_gets(): Return APR_SUCCESS if any characters are
     returned.  Any I/O errors or EOF will be reported on the
     next call.  Callers that are coded to expect returned 
     data + APR_EOF when there is no final newline are affected 
     by this change.  [Jeff Trawick]

  *) apr_proc_create() on Unix: Make the APR_SHELLCMD mode work
     when there is more than one program argument passed in.
     [Jeff Trawick]

  *) Add --cc and --cpp flags to apr-config.  [Jeff Trawick]

  *) Don't segfault trying to close a file in error paths of flock
     and fcntl mutex creation.  PR 19036  [Jeff Trawick]

  *) Add %pT support to apr_snprintf() for printing an apr_os_thread_t.
     [Jeff Trawick]

  *) Add APR_TCP_NODELAY_INHERITED & APR_O_NONBLOCK_INHERITED to apr.hw
     [Allan Edwards]

  *) Add APR_UINT64_T_HEX_FMT.  [Jeff Trawick]

  *) Add parameter to APR_SUBDIR_CONFIG to drop options passed to configure
     before the subdir's configure is invoked.
     [Jeff Trawick, Justin Erenkrantz]

  *) Implement APR_SO_RCVBUF socket option on Unix.  
     [Adam Sussman <myddryn@vishnu.vidya.com>]

  *) Don't add the math library (-lm) if the modf() function
     is already available via libc.  [Roy Fielding]

  *) Solaris cc: Don't use the -mt option for threaded builds.  That
     is for non-Posix threading, and the use of it prevented us from
     linking with -lpthread, which in turn caused weird problems for
     APR applications.  [Kristofer Spinka <kspinka@style.net>]

  *) OS/2: apr_stat() fixes - When a character device is stat'ed, 
     fill in finfo.name if it was asked for.  Return APR_INCOMPLETE 
     when appropriate.  Addresses httpd incident [CAN-2003-0134].
     [Brian Havard]

Changes with APR 0.9.3

  *) Don't enable posixsem, at build time, on systems where sem_t *
     won't "fit" into an int (sizeof-wise). Also, better error handling
     when we fail to create a posixsem. PR 17186 [Scott Herod
     <sherod@pillardata.com>, Jim Jagielski]

  *) Default hpux 10.x to disable threading, since if it exists at all
     the pthread implementation should not be trusted, while hpux 10 
     had its own threads implementation that is no longer supported.
     PR 9457 [William Rowe]

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

Changes with APR 0.9.2

  *) Numerous bug fixes for file and socket inheritence by child
     processes on Unix, correcting bugs that affected the correct 
     behavior of apr_[file|socket]_inherit_[un]set() API.
     [Bjoern A. Zeeb <bz@zabbadoz.net>, William Rowe, Joe Orton]

  *) Define APR_UINT64_T_FMT and APR_UINT64_T_FMT_LEN.
     Define APR_INT64_T_FMT_LEN on Windows and Netware.  [Branko Čibej]

  *) Correct apr_file_gets() on OS2 and Win32 so that '\r's are no longer
     eaten, and apr_file_gets() -> apr_file_puts() moves the contents
     uncorrupted.  [William Rowe]

  *) Alter Win32's handling of the apr_proc_t hproc member, so that we
     close that system handle wherever an apr function would invoke the
     final waitpid() against a zombie process on Unix.  [William Rowe]

  *) APR_MAX_SECONDS_TO_LINGER and APR_FNM_* #defines replace their
     old undecorated names (missing APR_ prefix).  The old names will
     disappear with APR 1.0.0.
     [Craig Rodrigues <rodrigc@attbi.com>, William Rowe]


  *) When generating a semaphore name for posixsem locking, try to
     be a little more robust (and unique). [Jim Jagielski]

  *) Add functions apr_env_get, apr_env_set and apr_env_delete for
     manipulating the environment.  [Branko Čibej]

  *) Fix APR_LAYOUT to work with layout files with no preceding blank lines
     and emit errors when layout is not found.  PR 15679.
     [Justin Erenkrantz]

  *) Add functions apr_filepath_list_split and apr_filepath_list_merge
     for managing search paths.  [Branko Čibej]

  *) Introduce Release mode debugging symbols for Win32 builds of apr.
     All library builds gain /Zi for debug symbols (which are discarded
     at link time if some flavor of the /debug flag isn't passed to link)
     and .dll builds gain .pdb symbols.  [Allen Edwards, William Rowe]

  *) Add two new proc attributes to improve diagnostics for 
     apr_proc_create() failures on platforms where fork()+exec() is used.
     See the doc for apr_procattr_child_errfn_set() and
     apr_procattr_error_check_set().  [Jeff Trawick]

  *) Rename rules.mk to apr_rules.mk and make apr_rules.mk be installed.
     [Thom May]
     
  *) Fix a bug in apr_proc_create() that could cause a new child process
     to run the parent's code if setrlimit() fails.  [Jeff Trawick]

  *) Disable apr_socket_sendfile() on 64-bit AIX to avoid an apparent
     system problem.  PR 11408.  [Jeff Trawick]

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

  *) Only include sys/syslimits.h if we don't have limits.h
     [Craig Rodrigues <rodrigc@attbi.com>, Garrett Rooney 
     <rooneg@electricjellyfish.net>, Thom May]

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

  *) Namespace protect the header files in include/arch
     [Thom May]

  *) Add function apr_filepath_encoding and associated constants.
     [Branko Čibej]

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

  *) Allow generation of dependencies by non-GCC compilers.
     [Justin Erenkrantz]

  *) Prevent obscenely large values of precision in apr_vformatter
     from clobbering a buffer. [Sander Striker, Jim Jagielski]

  *) limit the renames performed in apr_rename.pl to the most recent renames.
     [Thom May]

  *) Changed apr_mmap_dup() and friends so that there's no longer any
     is_owner concept on the mmaped region, but rather something more
     along the lines of a reference count.  This allows the old apr_mmap_t
     to still be used safely when the new apr_mmap_t is in a disjoint pool.
     [Cliff Woolley, Sander Striker]

  *) Fix a bug in apr_hash_merge() which caused the last entry in the
     overlay hash to be lost.  PR 10522  [Jeff Trawick]

  *) Add DougM's apr_rename.pl script into helpers, and update for the new 
     batch of updates [Thom May]

  *) Renames done (deprecated functions wrapped):
     apr_filename_of_pathname -> apr_filepath_name_get
     apr_get_groupid -> apr_gid_get
     apr_get_groupname -> apr_gid_name_get
     apr_compare_groups -> apr_gid_compare
     apr_parse_addr_port -> apr_port_addr_parse
     apr_shutdown -> apr_socket_shutdown
     apr_bind -> apr_socket_bind
     apr_listen -> apr_socket_listen
     apr_accept -> apr_socket_accept
     apr_connect -> apr_socket_connect
     apr_send -> apr_socket_send
     apr_sendv -> apr_socket_sendv
     apr_sendto -> apr_socket_sendto
     apr_implode_gmt -> apr_time_exp_gmt_get
     apr_get_home_directory -> apr_uid_homepath_get
     apr_get_userid -> apr_uid_get
     apr_current_userid -> apr_uid_current
     apr_compare_users -> apr_uid_compare
     apr_get_username -> apr_uid_name_get
     apr_recvfrom -> apr_socket_recvfrom
     apr_sendfile -> apr_socket_sendfile
     apr_recv -> apr_socket_recv 
     [Thom May]

  *) Add APR_IPV6_V6ONLY socket option.  [Jeff Trawick]

  *) Update timeout algorithm in free_proc_chain. If a subprocess
     did not exit immediately, the thread would sleep for 3 seconds
     before checking the subprocess exit status again. In a very
     common case when the subprocess was an HTTP server CGI script,
     the CGI script actually exited a fraction of a second into the 3
     second sleep, which effectively limited the server to serving one 
     CGI request every 3 seconds across a persistent connection.
     [Bill Stoddard, Kai.Risku@arrak.fi]

  *) Update doxygen tags.  [Justin Erenkrantz]

  *) NetWare: implemented a file IO path context scheme to directly
     reference directory paths and files in the file system rather
     than having to traverse the file system on every stat() or
     open() call. (Performance enhancement) [Brad Nicholes]
     
  *) ReliantUnix: recognize that dlsym() is in libdl and dlopen() is in
     libc.  The check is generic so maybe this fixes some other system.
     PR 14189  [Jeff Trawick]

  *) Win32: Fix APR_APPEND file i/o. [Bill Stoddard]

  *) Fix a problem retrieving the remote socket address for sockets
     created via apr_os_sock_put() or apr_os_sock_make().  [Jeff Trawick]

  *) Add recognition of and socket API support for the SCTP protocol.
     [Randall Stewart <randall@stewart.chicago.il.us>]

  *) Win32: apr_shutdown was not honoring apr_shutdown_how_e and
     always shutting down the socket for read. This could result
     in Apache HTTPD 2.0 clients getting early connection closures
     because lingering_close() was broken. [Bill Stoddard, Allan Edwards]

  *) Add apr_atomic_casptr() to support atomic compare-and-swap
     of pointers  [Brian Pane]

  *) Add apr_socket_create_ex() to allow protocol to be specified for the
     socket.  With APR 1.0, this function will be removed and apr_socket_create()
     will have the additional parameter.
     [Randall Stewart <randall@stewart.chicago.il.us>]

  *) Fix the detection of INT64_C() when defined in <stdint.h>.
     [Joe Orton <joe@manyfish.co.uk>]

  *) Don't use whitespace before preprocessor directives in the configure
     logic.  Such whitespace breaks with some older preprocessors; a 
     particularly nasty break occurs on Tru64 4.0f where APR_CHECK_DEFINE 
     will always succeed.  [Joe Orton <joe@manyfish.co.uk>]

  *) Add APR_IPV4_ADDR_OK flag to apr_sockaddr_info_get() to allow
     apps to avoid lookup of IPv6 address if IPv4 address is sufficient.
     (New APR_IPV6_ADDR_OK flag is similar.)  [Jeff Trawick]

  *) Disable IPv6 support on Darwin.  The current IPv6 support has a
     problem in getnameinfo() which breaks certain applications.
     [Sander Temme <sctemme@covalent.net>, Jeff Trawick]

  *) Support for SCO OpenServer Release 5 [Kean Johnston <jkj@caldera.com>]

  *) Faster (inline and mutex-free) implementations of all apr_atomic
     operations for Linux/x86 (requires a 486 or later; to enable,
     configure APR with --enable-nonportable-atomics=yes )   [Brian Pane]

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

  *) Begin to rehash the test suite.  There is now a new test program called
     testall.  This program currently runs testtime and teststr with the
     CuTest framework.  The stand-alone programs for testtime and teststr
     can be built, but only if a special flag is specified when building.
     [Ryan Bloom]

  *) Fix a broken check for a failure to read from the random device file.
     PR 12615  [tenthumbs@cybernex.net]

  *) Print informative link errors on Darwin.  [Justin Erenkrantz]

Changes with APR 0.9.1

  *) Fixed usage of alloca in apr_poll() on Tru64
     [Dave Hill <ddhill@zk3.dec.com>]

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

  *) Add apr_array_pop().  [Justin Erenkrantz]

  *) Fixed the native SPARC v8plus version of apr_atomic_dec
     to match the semantics of the default C version [Brian Pane]

Changes with APR 0.9.0

  *) If the length argument to apr_snprintf is 0, then we should return the
     length that the string would be if we actually were going to fill it out.
     However, if the length argument is 0, we can also accept a NULL string.
     Also, added a test case for this.  [Ryan Bloom]

  *) Printing a string with apr_snprintf can seg fault, if a precision is
     specified for the string, and the string being printed doesn't have a
     trailing '\0'.  Fix that seg fault by not calling strlen if a precision
     is specified when printing a string.  Also add a test to the test suite
     for this case.
     [R Samuel Klatchko <rsk@brightmail.com>]

  *) handle leak related to threads on Windows2000/XP 
     [INOUE Seiichiro <inoue@ariel-networks.com>]

  *) Includes moved to INCLUDEDIR/apr-{major} (e.g. /usr/include/apr-0)
     [Greg Stein]

  *) libtool versioning is used to give the library sonames a real
     value. The libraries will be libapr-{major}.so.0.{minor}.{patch}
     [Greg Stein]

  *) Fix apr_tokenize_to_argv() to remove the escape character
     (backslash) from the argument tokens. PR 11793 [Paul J. Reder]

  *) Add APR_PARSE_ARGUMENTS and APR_LAYOUT macros for better layout
     support. [Thom May]

  *) Add parallel-apr layout which utilizes the major version number in
     directories and library names.  [Justin Erenkrantz]

  *) Add a version number to the library name (e.g. libapr-1.so) so
     that apps can do things like: -lapr-1 or -lapr-2, depending on
     which version they want to use and link against. [Greg Stein]

  *) Add --version to apr-config so that apps can retrieve the version
     information of the (installed) APR. [Greg Stein]

  *) Remove the APRVARS system; apps should use apr-config. [Greg Stein]

  *) EBCDIC: fix compile failure in strings/apr_strings.c in
     httpd-2.0.40 with the following error message:
     CANNOT COMPILE apr_strtoi64(), only ASCII and EBCDIC supported
     
  *) In apr_signal_thread() remove synchronous signals from the mask
     passed to sigwait().  It is never valid for them to be there.
     Some platforms silently ignore them, some return EINVAL, some
     don't process it as desired.  [Jeff Trawick]

  *) Change config.nice generation to always expand variables.
     [Justin Erenkrantz]

  *) Renamed apr_strtoll()/apr_atoll() to follow int64 convention,
     so these new helpers are apr_strtoi64/apr_atoi64(), since
     'll' (long long) is a nonportable and aspecific construct.
     Used ac/m4 tests to choose the appropriate fn behind strtoi64.
     [William Rowe]

  *) don't perform a strlen on that name value without checking for NULL 
     first (in getopt)
     [David Waite <mass@akuma.org>, Ian Holsman]

  *) Added apr_strtoll() and apr_atoll() to strings lib.
     [Shantonu Sen <ssen@apple.com>, Wilfredo Sanchez]

  *) Added a lightweight internal index to apr_table_t to speed up
     table lookup operations  [Brian Pane]

  *) initalize handle members to invalid before calling createprocess
     on win32 [Rob Saccoccio <robs@fastcgi.com>]

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

  *) Removed apr/md5 and apr/uuid into apr-util/crypto.  [William Rowe]

  *) Add APR_BUFFERED support to apr_os_file_put().  [Justin Erenkrantz]

  *) Fix misinterpretation of timeout for select() on Win32/Netware.
     Identified by [TANAKA Koichi <tanaka@ariel-networks.com>]

  *) Re-write apr_poll() on Unix.  This improves the performance by
     giving the user back control over the memory in the pollset.
     [Ryan Bloom]

  *) Added APR_LIMIT_NOFILE option to apr_procattr_limit_set() to
     control the file descriptor limit on platforms that support
     RLIMIT_NOFILE.  [Brian Pane]

  *) FreeBSD: change apr_sendfile to accomodate a 4.6 kernel patch.
     [Greg Ames]

  *) Faster code for the apr_table get/set functions  [Brian Pane]

  *) Fix the userid functions on Irix to handle the way that Irix 
     reports a failure from getpwnam_r().  PR 10095.
     [Robert I. Cowles <ric@cs.uregina.ca>, Jeff Trawick]

  *) apr_table_do() and apr_table_vdo() now return an int rather than
     void to indicate whether or not any of its iterations returned 0.
     [Cliff Woolley]

  *) Fix the definition of union semun so that it is valid on systems
     where sizeof(long) != sizeof(int).  This resolves a hang on
     HP-UX/Itanium.  
     [Madhusudan Mathihalli <madhusudan_mathihalli@hp.com>]

  *) Correct shared library support on Darwin to not fatally error out
     when a shared library does not exist.  [Justin Erenkrantz]

  *) Added optimized atomic CAS support for Linux/x86 (available only
     when APR is configured with --enable-nonportable-atomics=yes)
     [Brian Pane]

  *) Fix a compile error in the EGD support in rand.c on older Solaris
     versions.  PR 9976  [Jim Morris <jmorris@sunflower.com>]

  *) Fixed apr_file_seek() to unset the eof_hit flag.  [Stas Bekman]

  *) Removed --disable-atomics flag and added --enable-nonportable-atomics,
     thereby defaulting to portable binaries on those systems that could
     be optimized at the expense of portability. PR: 9507  [Aaron Bannert]

  *) Added 2 additional lock functions: apr_proc_mutex_name and
     apr_proc_mutex_defname which returns the type name of the mutex
     (eg: "sysvsem") as well as the default mutex type (APR_LOCK_DEFAULT).
     Mostly useful under Unix were the locktypes are selectable.
     [Jim Jagielski]

  *) Fixed apr_generate_random_bytes() for Win32 on Win NT or 9x by
     dropping the 0x40 bit (CRYPT_SILENT) for earlier OS'es.
     PR 9286  [William Rowe]

  *) Added --with-devrandom=[DEV] configure flag which allows a particular
     "/dev/random"-compatible device to be specified, overriding the
     default search path (/dev/random then /dev/arandom then /dev/urandom).
     Also, if --with-egd=<path> is specified, it now implies
     --without-devrandom.  [Cliff Woolley]

  *) Darwin/Mac OS X: Don't leave zombie processes when the app calls
     apr_signal(SIGCHLD, SIG_IGN).  This fixes a problem with Apache's
     mod_cgid.  PR 9168.  [Jeff Trawick]

  *) Win32: Fix bug where apr_sendfile() was incorrectly returning
     APR_SUCCESS on a TransmitFile call that was interrupted by
     the client closing its end of the connection. Always call 
     GetOverlappedResults() to get results of async TransmitFile()
     completion notification. [Bill Stoddard] 

  *) Renamed APR_XtOffset -> APR_OFFSET and APR_XtOffsetOf -> APR_OFFSETOF.
     [Cliff Woolley]

  *) Cygwin: the unix version of apr_file_open() must respect the
     APR_BINARY flag if the underlying platform requires it (in
     which case we assume O_BINARY is defined).  PR 9185.
     [Cliff Woolley]

  *) Linux, AIX: Use crypt_r() instead of crypt() because the native
     crypt() is not thread-safe.  The misuse of crypt() led to   
     intermittent failures with Apache basic authentication when crypt 
     passwords were being used.  [Jeff Trawick]

  *) AIX: Global mutexes don't need an intraprocess mutex when SysV
     sems are used for the crossprocess mutex.
     Darwin: The same optimization was applied for Posix sems.
     [Jeff Trawick]

  *) Fix a problem with global mutexes on OS/390 when something other
     than the default mechanism (SysV sem) was used.  The mutexes didn't
     necessarily block out other threads in the same process.
     [Jeff Trawick]

  *) Fixed apr_strfsize formatting of values over 1 gig
     [Matsuzaki Yoshinobu <maz@iij.ad.jp>]

  *) Renamed --disable-atomics as --disable-optimized-atomics,
     since it doesn't really disable the atomics.  [Aaron Bannert]

  *) Converted apr_pcalloc to a macro  [Brian Pane]

  *) Fixed APR_STATUS_IS_ETIMEDOUT macro.
     [Dagfinn Aarvaag <dagfinn.aarvaag@beepscience.com>]

  *) Add --disable-atomics switch to override our handcoded assembly
     optimizations.  Note that this has no effect if your operating
     system has a userspace atomic interface.  [Justin Erenkrantz]

  *) Remove Linux atomic support since it does not have a usable
     userspace atomic interface.  [Justin Erenkrantz]

  *) Don't require that the DNS can map 127.0.0.1 when checking for
     the presence/usability of getnameinfo().  PR 7642.  [Jeff Trawick]

  *) Remove APR_WANT_SIGNAL from apr_want.h because code must include
     apr_signal.h in order to get consistent definitions. [Roy Fielding]

  *) Don't try to use /dev/zero and mmap on platforms that don't
     support that (such as HP-UX).  PR 8537.  [Justin Erenkrantz]

  *) Reduce the number of apr_sendfile calls on AIX and OS/390 by
     remembering when the kernel tells us the next one will block.
     [Jeff Trawick]

  *) Reduce the number of apr_sendfile calls on FreeBSD by remembering
     when the kernel tells us the next one will block.  [Greg Ames]

  *) To support modules like PHP, which implement their own
     loaded extensions, Darwin needs to place their public
     symbols in the global table. [Marko Karppinen <markonen@php.net>,
     Jim Jagielski]

  *) Rename apr_get_groupname to apr_group_name_get.
     [Thom May <thom@planetarytramp.net>]
     
  *) Allow VPATH builds to properly build dependencies and switch to
     a .deps dependency model to mimic httpd-2.0.  [Justin Erenkrantz]

  *) Tru64: Stop leaving zombies in APR apps like mod_cgid which
     tell APR to ignore SIGCHLD.  
     [Dave Hill <David.D.Hill@Compaq.com>]

  *) Ensure that the ATOMIC_HASH can not be negative.
     [Joe Orton <jorton@redhat.com>]

  *) Fix a problem with eof reporting with Unix file I/O on 
     unbuffered files.  [Stas Bekman <stas@stason.org>]

  *) Rename apr_explode_time to apr_time_exp_tz.
     [Thom May <thom@planetarytramp.net>]

  *) Rename apr_explode_localtime to apr_time_exp_lt.
     [Thom May <thom@planetarytramp.net>]

  *) Set precompiler for Solaris atomics when using GNU binutils.
     PR 7876.  [solomon@conceptshopping.com (Marvin Solomon)]

  *) AIX: Fix breakage with 64-bit builds on versions of AIX prior
     to 5L.  PR 7957  [Jeff Trawick]

  *) On socket write functions (apr_sendfile, apr_send, apr_sendv),
     added a select to wait for writability on the socket if the
     previous write was incomplete.  [Jeff Trawick, Brian Pane]

  *) Deprecated the apr_lock.h API. Please see the following files
     for the improved thread and process locking and signaling:
     apr_proc_mutex.h, apr_thread_mutex.h, apr_thread_rwlock.h,
     apr_thread_cond.h, and apr_global_mutex.h.  [Aaron Bannert]

  *) Fix some daylight savings time breakage on (at least) AIX, 
     Solaris, and HP-UX.  [Jeff Trawick]

  *) Added support for Posix semaphores (sem_open, et.al.) for mutex
     locking. We use named semaphores in this implementation. The
     default priority is between pthread and sysvsem.
     [Jim Jagielski]

  *) Get flock-based mutexes to work in apps like Apache.  Use the
     same permissions on flock- and fcntl-based mutexes as Apache
     1.3.  [Jeff Trawick]

  *) Fix apr-config so that it will not attempt to cd to a non-existent
     directory.  [Justin Erenkrantz]

  *) Change the ordering of the apr_lock implementation method to
     better match what's done in Apache 1.3. The ordering is
     now (highest to lowest): pthread -> sysvsem -> fcntl -> flock.
     [Jim Jagielski]

  *) Improve detection of the INT64_C macro to prevent problems
     with HP-UX's ANSI C compiler.  PR 8932.  [Justin Erenkrantz]

  *) Make sure gethostbyname() can handle 255.255.255.255 if we
     are to trust it to handle numeric address strings in
     apr_sockaddr_info_get().  This fixes a problem on HP-UX
     which led to an assertion failure at Apache startup when
     using vhosts.  [Jeff Trawick]

  *) Don't mask SIGUSR2 [Jin Hong <jinh@cnet.com>]  

  *) Load libraries if they not MH_BUNDLE, but if they are not, it 
     just attempts to link them as shared libs.
     [Pier Fumagalli <pier@betaversion.org>]

  *) apr_atomic_dec now returns a zero value if the value of 
     the atomic is zero, non-zero otherwise [Ian Holsman]

  *) When opening a file, only create an internal thread mutex
     if APR_XTHREAD is set.  [Brian Pane]

  *) Move the kill_conditions enum in apr_thread_proc.h into the
     APR namespace. kill_after_timeout et al have been renamed
     appropriately (e.g., APR_KILL_AFTER_TIMEOUT).  [Jeff Trawick]

  *) Fix a segfault in apr_thread_rwlock_destroy() on Win32.
     [INOUE Seiichiro <inoue@ariel-networks.com>]
  
  *) configure now checks to see if we can change DNS timeout values
     [Ian Holsman]

  *) Fix a bug in apr_file_seek() on Unix when using buffered
     files.  PR 10003 [Jeff Trawick]

  *) Small table performance optimization: eliminate the
     zero-fill of newly allocated elements when expanding
     a table's size. [Brian Pane]

  *) Allow APR to install its generated libtool(s) via the 
     --with-installbuilddir option (defaults to ${datadir}/build).
     [Justin Erenkrantz]

  *) 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 the APR_FILE_NOCLEANUP flag to apr_file_open().
     Adding the flag will prevent the file from being closed 
     when the pool passed in on apr_file_open() is destroyed.
     This feature is useful when using apr_os_file_get|put()
     to manage the apr_os_file_t in apr_file_t (ie, file handle
     caching in the HTTP server) [Bill Stoddard]

  *) Win32: Fix APR_XTHREAD problems in apr_file_read()
     and apr_file_write(). Multiple threads were using the
     same overlapped structure and io event handle created
     in the open call, which could cause unpredictable
     file i/o results. [Bill Stoddard]

  *) Win32: apr_proc_mutex_trylock and apr_proc_mutex_lock were 
     incorrectly returning APR_BUSY if the lock was previously
     held by a thread that exited before releasing the lock 
     (ie, if the process holding the lock segfaults). The MSDN
     doc says when WaitForSingleObject returns WAIT_ABANDONED,
     the calling thread takes ownership of the mutex, so these
     two routines should return APR_SUCCESS in this case, not
     APR_BUSY. [Bill Stoddard]

  *) Added a new m4 function APR_EXPAND_VAR that will iteratively
     interpolate the contents of a variable, such as $sysconfdir,
     for use in a borne script.  [Aaron Bannert]

  *) apr-atomic support for old-sparc's and gas on solaris
     [Dale Ghent <daleg@elemental.org>,  jean-frederic clere, Ian Holsman]

  *) Change apr_proc_detach to take a parameter that can enable/disable
     automatic forking (aka, to "daemonize").
     [Jos Backus <josb@cncdsl.com>, Aaron Bannert]

  *) Implement apr_global_lock_foo() on Win32
     [Bill Stoddard]

  *) Fix select() argument call when waiting for IO.  PR 9674.
     [David MacKenzie <djm@pix.net>]

  *) Add a new lock API (apr_global_mutex_t) to provide guaranteed
     cross-process AND cross-thread mutual exclusion.  [Aaron Bannert]

  *) Note: We are in the process of deprecating the apr_lock.h API.
     The new and improved lock/synchronization APIs now reside
     in apr_thread_mutex.h, apr_proc_mutex.h, apr_thread_rwlock.h,
     and apr_thread_cond.h.  [Aaron Bannert]

  *) Enable autoconf 2.52{f,g} build support.
     [Blair Zajac <blair@orcaware.com>]

  *) Added new functions for atomic operations. These are experimental
     at the moment, so use in apps is discouraged [Ian Holsman]

  *) Correct serious problems with the Win32 apr_file_dup2 
     and apr_file_open_stdxxx() fns.  [William Rowe]

  *) Begin implementation of the WinCE port.
     [Mladen Turk <mturk@mappingsoft.com>]

  *) Disable SHMEM_MMAP_ZERO on HPUX 11.x where it is not supported.
     Use SHMEM_SHMGET_ANON instead.  [Aaron Bannert]

  *) Fix a few attempts to add to a void * ptr in the Unix shared
     memory support code.  PR #9710  Per Ekman [pek@pdc.kth.se]

  *) In the Linux apr_sendfile(), fix the types of some parameters 
     to apr_send() and apr_recv().  Breakage was seen in 64-bit mode
     on s/390.  PR #9712  [Neale.Ferguson@SoftwareAG-usa.coom]

  *) added APR_PROGRAM_ENV and APR_PROGRAM_PATH options for starting
     processes via apr_proc_create() [Greg Stein]

  *) Deprecated apr_pool_free_blocks_num_bytes() [Sander Striker]

  *) Add --enable-pool-debug to make it easier for people to
     enable pool debug mode.  Removed the APR_POOL_DEBUG_VERBOSE
     define that was previously being used. [Sander Striker]
     
  *) Changed the apr_file_dup2() function prototype. It can only
     take and reuse an apr_file_t*, and will no longer create one
     if *new_file == NULL (use apr_file_dup() for that).  [Aaron Bannert]

  *) Implemented name-based shared memory on Unix.  [Aaron Bannert]

  *) Fix spelling mistakes in APRDesign.  
     [Blair Zajac <blair@orcaware.com>]

  *) Ensure that apr_file_mktemp creates the temp file if it isn't there.
     [John Sterling <sterling@covalent.net>]

  *) Make sure to pre-mark anon SysV shared memory segments as
     removed. [Jim Jagielski]

  *) Add --with-efence to allow usage of Electric Fence.
     [Justin Erenkrantz]

  *) Updated the pools debug code.  Check if a pool is still
     valid on the most common apr_pool_xxx functions.
     Fix the way APR_POOL_DEBUG_VERBOSE was using stderr.
     Make the output somewhat nicer in this debug mode. [Sander Striker]

  *) Add new define APR_POOL_DEBUG_VERBOSE which spits out info
     about pool creation/destruction [Ian Holsman]

  *) Fix GMT offset adjustments for platforms that do not have native
     GMT offset adjustments.  [Jon Travis <jtravis@covalent.net>]

  *) Add new apr_shm_t API and remove old apr_shmem_t API. The new
     API handles both anonymous and name-based shared memory. Anonymous
     shared memory segments are only usable on systems with process
     inheritance, and so the new API with name-based segments is
     usable on platforms like Win32.  [Aaron Bannert and William Rowe
     with much help from Justin Erenkrantz and Sander Striker]

  *) Add --with-egd to support EGD-compatible entropy gatherers for 
     those platforms without native support.  [Justin Erenkrantz]

  *) apr_lock_create() and apr_proc_mutex_create() now have an
     additional parameter for specifying the lock mechanism.  
     apr_lock_create_np() and apr_proc_mutex_create_np() have been
     removed.  [Jeff Trawick]

  *) Change the prototype of apr_thread_exit() so that the apr_status_t
     is no longer a pointer. It was difficult and sometimes hazardous
     to return a apr_status_t* at times, and this allows us to return
     the APR_* error codes directly.  [Aaron Bannert]

  *) Add apr_sockaddr_equal() for comparing APR sockaddrs.
     [Jeff Trawick]

  *) Win32: apr_sendfile() should return APR_ENOTIMPL if
     oslevel < WINNT. [Bill Stoddard]

  *) Put new pools code in place which allows applications to
     switch off locking on pools operations in case a pool is
     guaranteed to never being used in more than one thread
     at the same time.  We've seen a significant performance
     improvement over the old code. [Sander Striker]

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

  *) Add find_apr.m4 to allow third-party programs that use APR to
     have a standard m4 macro for detection.  [Greg Stein]

  *) SEGV in apr_table_overlap [Brian Pane]

  *) apr_array_copy speedup by removing the zero-fill [Brian Pane]

  *) Fix build breakage on systems with getaddrinfo() but not 
     gai_strerror() (e.g., RedHat 5.2).  [Jeff Trawick]

  *) Fix a problem in Unix apr_file_dup() which caused 0 to be returned
     by the first read.  [Stas Bekman <stas@stason.org>]

  *) Fix a buglet that caused APR_FILE_BASED_SHM to be set inadvertently 
     on some platforms (e.g., Linux, AIX).  [Jeff Trawick]

  *) Speed up apr_table operations by using a cache/checksum and a
     red-black tree in the overlay.
     [Brian Pane <bpane@pacbell.net>, Cliff Woolley]

  *) Speed up apr_pool_userdata_set[n] by letting hash_set figure out
     the strings length.  [Brian Pane <bpane@pacbell.net>]

  *) New function apr_mmap_dup. This is called in the mmap_setaside.
     [Brian Pane <bpane@pacbell.net>]

  *) Speed up the apr_hash_t implementation's handling of APR_HASH_KEY_STRING.
     [Brian Pane <bpane@pacbell.net>]

  *) Tweak apr_gethostname() so that it detects truncation of the
     name and returns an error.  [Jeff Trawick]

  *) Fix bug in Darwin DSO code.  [Sander Temme]

  *) Fix apr_setup_signal_thread() to grab the right error code from
     a sigprocmask() failure.  This only affects platforms that use
     sigprocmask() in lieu of pthread_sigmask().  [Jeff Trawick]

  *) Fix the Unix HAVE_POLL flavor of apr_poll_socket_mask() so that
     it doesn't segfault.  Avoid some wasted storage in a poll-related
     APR structure.  [INOUE Seiichiro <inoue@ariel-networks.com>]

  *) Fix apr_setup_signal_thread() so that threads don't block
     synchronous signals (e.g., SIGSEGV).  It is a programming error
     to do so, and some platforms (e.g., Solaris, AIX) don't call any
     registered signal handler when such signals are blocked.
     [Jeff Trawick]

  *) Change the apr_table_elts macro so that it provides access via
     a const pointer instead of a non-const pointer.
     [Brian Pane <bpane@pacbell.net>]

  *) Use strerror_r() where available, since strerror() isn't always
     thread-safe.  Example systems where strerror() isn't thread-safe:
     Linux+glibc, AIX  [Jeff Trawick]

  *) Fix some file cleanup problems in apr_proc_create() which could
     result in the pipes for stdin/stdout/stderr being closed
     immediately.  [Jeff Trawick]

  *) New functions apr_hash_[merge|copy], change to overlay fn
     so that it calls merge, which does a inline iteration instead
     of calling the iterator function. [Brian Pane <bpane@pacbell.net>]

  *) Introduce the apr_pool_userdata_setn() variant that doesn't 
     strdup the key.  Allows both the _setn() and _set() variant to 
     accept NULL for the cleanup.  [Brian Pane <bpane@pacbell.net>]

  *) Re-vamp the apr_proc_wait and apr_proc_wait_all functions.  We
     now return the exit code from the program and a reason that the
     program died, either normal exit or signalled.
     [Jeff Trawick and Ryan Bloom]

  *) Implement portable accessors for proc mutex. These are equivalent
     to apr_os_lock_get/set, but they work for apr_proc_mutex_t types
     instead.   [Aaron Bannert]

  *) Added a new parameter to apr_thread_mutex_init(). Now, by default,
     thread mutexes are not nested (sometimes called "recursive"). To
     enable nested mutexes, a flag must be passed to the init script.
     Non-nested mutexes are much faster than nested ones.
     [Aaron Bannert]

  *) read_with_timeout in apr/file_io/win32/readwrite.c incorrectly 
     returned APR_SUCCESS instead of APR_EOF when PeekNamedPipe failed
     and the result from GetLastError() was ERROR_BROKEN_PIPE. Because 
     of this, the pipe wasn't closed as soon as it could be.
     [Tim Costello <tim.costello@zcmgroup.com.au>]

  *) Fix a problem in the Win32 pipe creation code called by 
     apr_proc_create():  It didn't register cleanups for either the 
     read or the write ends of the pipe, so file handles (and event 
     handles for pipes with asynchronous I/O mode set) are never 
     closed.  [Tim Costello <tim.costello@zcmgroup.com.au>]

  *) Add support for QNX 6.  [J.T. Conklin <jtc@acorntoolworks.com>]

  *) 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: apr.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 symbols.   [Aaron Bannert]

  *) Add the apr_thread_cond_timedwait function to the condition
     variable API.   [Aaron Bannert]

  *) Fixed apr_file_mktemp on systems without mkstemp (Win32, etc).
     [Mladen Turk, Cliff Woolley]

  *) Fix a segfault in apr_poll_clear on Unix.   Also fix the logic 
     for the case where there are multiple events ORed together in 
     the events list.   [Jamshid Mahdavi <mahdavi@volera.com>]

  *) Files opened on Unix with the flag APR_DELONCLOSE are now
     not unlinked until they are actually closed, rather than as
     soon as they're opened.  The old approach worked but made
     handling temp files harder.  [Cliff Woolley]

  *) Fix potential segfault when closing a file on Unix.  If
     apr_file_close() was called and it failed, it would not
     deregister the file cleanup.  Therefore the cleanup would
     be run again later on a now-invalid descriptor.  [Cliff Woolley]

  *) Introduce apr_pool_lock for debugging, in combination with
     ALLOC_USE_MALLOC + DEBUG_WITH_MPROTECT.  Only implemented
     on Win32 today, very effective for debugging pool constness.
     [William Rowe]

  *) Optimize apr_pstrcat by caching lengths of first 6 strings
     [Brian Pane <bpane@pacbell.net>]

  *) Add pool accessors to the apr_thread_mutex_t datatype.
     [Aaron Bannert <aaron@clove.org>]

  *) Add the apr_file_mktemp function.  This creates and opens a 
     temporary file, for use by the program.  This file is created
     delete_on_close.  The initial implementation only works on
     Unix, but Windows is coming soon.  [Ryan Bloom]

  *) Make the unix version of apr_proc_wait_all_procs a simple wrapper 
     around apr_proc_wait, and which extracts the exit code from the 
     status returned by waitpid.  
     [Kevin Pilch-Bisson <kevin@pilch-bisson.net>]

  *) Add process locking API to APR. [Aaron Bannert <aaron@clove.org>]

  *) Add condition variables for Windows.  [Ryan Bloom]

  *) Add condition variables to the APR set of locking functions.
     This does Unix, and provides stubs for all other platforms.
     [Aaron Bannert <aaron@clove.org>]

  *) Don't search for IPv6 names in apr_sockaddr_info_get() if the 
     application doesn't specify the family (i.e., the application
     passes in AF_UNSPEC) and APR isn't built with IPv6 support.  
     [Jeff Trawick]

  *) Fix the API for the apr_proc_create() call on Win32.  Several
     bad assumptions are gone, including a mismatch between unix and
     win32, where win32 was defaulting to create detached.  Also fixes
     the apr_proc_t's pid member to a real pid (identity that works
     across processes) instead of the handle (which is a new hproc
     member value.)  [William Rowe]

  *) Modify the external apr_filepath_get() fn to take a flags arg,
     currently only for APR_FILEPATH_NATIVE.  This returns c:\foo
     format on Win32, and should do the same on OS2, or sys\vol:\foo
     on Netware.  Primarily for internals, but possibly useful to
     others (and it mirrors some of the other apr_filepath_*() calls.)
     [William Rowe]

  *) Add the new thread read/write lock API to APR.
     [Aaron Bannert <aaron@clove.org>]

  *) Add the new thread mutex lock API to APR.
     [Aaron Bannert <aaron@clove.org>]
  
  *) Cache GMT offset on platforms that don't store it in the tm struct.
     This offset is normalized to be independent of daylight savings
     time.  [Brian Pane <bpane@pacbell.net>]

  *) Initial support for cygwin.  [Stipe Tolj <tolj@wapme-systems.de>]

  *) Fix a problem with buffered files on Unix.  [Brian Havard]

  *) Fix the bungling of getaddrinfo() error codes.  [Jeff Trawick]

  *) Add an apr_thread_once function to APR.  This allows a
     program to ensure that a function is only called once.
     [Ryan Bloom]

  *) APR Documentation is now in Doxygen format.
     [Ian Holsman]

  *) Get apr_ungetc() to work with buffered files on Unix.
     [Jeff Trawick]

  *) Fixed apr_filepath_root on Unix [William Rowe, Cliff Woolley].

  *) Rename XtOffset to APR_XtOffset.  This namespace protection
     is important to keep from conflicting with other packages.
     [Perl]

  *) Introduce a new --disable-ipv6 option to disable IPv6 support.
     [Sterling Hughes <sterling@designmultimedia.com>, Jeff
     Trawick]

  *) Fix the new shared memory code.  We need to pass a pointer to
     an apr_file_t to apr_file_open.  Also, apr_os_file_get returns
     a status value, not the OS file descriptor.  [Ryan Bloom]

  *) Fix the new shared memory configure script.  The APR_DECIDE
     macros go in order, so the last set of dependancies that are
     met are the ones used.  That means that when using those macros,
     options should be listed with the least desirable option first,
     and the most desirable last.  The new shared memory routines did
     the opposite, so we chose the wrong shared memory option on Linux.
     [Ryan Bloom]

  *) Move the necessary shared memory code from MM into APR and remove
     our dependency upon MM.  [Justin Erenkrantz]

  *) Get apr_lock_file and apr_unlock_file working on Windows 9x.
     [Mladen Turk, Bill Stoddard]

  *) Make all APR pools be allocated out of the permanent pool.
     This brings APR pools back to a tree structure.  There are
     no longer any way to create a pool that is not a decendant
     of the permanent_pool.  [Ryan Bloom]

  *) Wrap all functions in APR_DECLARE macro. 
     [Sterling Hughes <sterling@designmultimedia.com>]

  *) Non-blocking connects shouldn't be calling connect a second
     time.  According to Single Unix, a non-blocking connect has
     succeeded when the select pops successfully.  It has failed
     if the select failed.  The second connect was causing 502's
     in the httpd-proxy.  [John Barbee barbee@veribox.net]

  *) Fix apr_dir_rewind() for Win32 to avoid returning a bogus error.
     [Jeff Trawick, William Rowe]

  *) Detect required libraries first.  This minimizes the libraries
     needed in apr_hints.m4.  [Justin Erenkrantz]

  *) Support the AIX, glibc2, and Solaris variants of gethostby{name|addr}_r.
     Use gethostbyaddr_r function when available.
     [Sterling Hughes <sterling@designmultimedia.com>]

  *) Add new socket option, APR_INCOMPLETE_READ, that should be
     set when you expect the first non-blocking read to fail with
     EAGAIN. Setting APR_INCOMPLETE_READ prior to calling apr_read
     will cause select() to be called first to wait for bytes
     to read. [Brian Pane, Dean Gaudet]

  *) Better installation.  This makes us install the APRVARS file,
     as well as MM.  [Ryan Bloom]

  *) Provide new number conversion functions apr_itoa, apr_ltoa, and 
     apr_off_t_toa, and inline code in inet_ntop4, to reduce CPU
     consumption. [Brian Pane]

  *) Updated APR to pass the thread worker_function prototype 
     (apr_thread_start_t) two parameters, the apr private data 
     (apr_thread_t*) and the application private data (void*).  
     Applications' worker_thread() routines may use apr_thread_pool_get
     to access the pool (implemented using APR_POOL_*_ACCESSOR() macros.)
     [Aaron Bannert <aaron@ebuilt.com>]

  *) Add Solaris 8's sendfilev() support.  This requires the following 
     patches from Sun: 111297 (Sparc), 111298 (x86).  You'll need the
     other patches listed in the patch description.  [Justin Erenkrantz]

  *) Close file descriptor when we are done with fcntl or flock-based
     cross-process lock.  Otherwise, we leak descriptors.
     [Justin Erenkrantz]
 
  *) Fix a possible data corruption problem with the use of getpwnam_r() on 
     all platforms where that function is used.
     Use getpwnam_r() and getgrgid_r() instead of getpwnam() and getgrgid()
     with threaded builds on glibc (2.1, at least) to avoid thread safety
     issues.  [Jeff Trawick]

  *) Added apr_lock_tryacquire.  It will attempt to acquire the lock, but 
     will not block if it can not acquire the lock.  Returns APR_EBUSY if 
     acquistion can not happen.  [Justin Erenkrantz]

  *) Added an inherit flag to apr_socket_create and other socket creation
     functions.  This allows APR programs to specify that a socket should
     be passed to any child processes that are created.  The inherit flag
     is only meaningful if programs use apr_process_create().  This
     also adds a couple of macros that allow APR types to set and unset
     the inherit flag.  [Ryan Bloom]

  *) apr_connect()on Windows: Handle timeouts and returning the proper
     status code when a connect is in progress. [Bill Stoddard]

  *) apr_connect() on Unix: Handle EINTR during connect().  Handle timeouts.
     [Jeff Trawick]

  *) Handle the weird case where getpwnam() returns NULL but errno is zero.
     [Jeff Trawick]

  *) Add apr_file_flags_get() which returns the flags that were originally
     passed in to apr_file_open().  [Cliff Woolley]

  *) Added APR_HAS_XTHREAD_FILES macro that indicates whether or not the
     platform handles files opened in APR_XTHREAD mode natively.  Currently
     only Win32 has such native support.  [Cliff Woolley]

  *) Fix gmt offset handling on Solaris.  Apache log messages now show
     local time again. PR #7902 [Taketo Kabe <kabe@sra-tohoku.co.jp>]

  *) apr_pstrcat() optimizations [Doug MacEachern, Jeff Trawick]

  *) Make the apr_pool_is_ancestor logic public.  This is required for 
     some new logic that is going into HTTPD.  I have left the join logic
     in that function debug only.  [Ryan Bloom]

  *) Clean up Win32 locks when the pool goes away.
     [Justin Erenkrantz, Jeff Trawick]

  *) Implement apr_get_home_directory for Win32.  [William Rowe]

  *) Complete the implementation of LARGEFILE support on Win32, although
     the mmap semantics still need a touch of work.  [William Rowe]

  *) Fix the APR_XTHREAD support, and apr_sendfile mechanics, so we can
     handle cross-threaded file handles on Win32.  [William Rowe]

  *) Implement APR_READWRITE locks on Unix with POSIX rwlocks.
     Introduce new apr_lock_acquire_rw() function which takes in 
     APR_READER or APR_WRITER.  [Justin Erenkrantz]

  *) Add apr_open_stdin.  This mirrors apr_open_stderr, except it works
     on stdin.  [Aaron Bannert <abannert@ebuilt.com>]

  *) Add apr_strtok(), a thread-safe flavor of strtok() which has the
     same interface as strtok_r().  [Jeff Trawick]
     
  *) Add other child support to Win32 [Bill Stoddard]

  *) Other-child registrations are automatically removed when the
     associated pool is destroyed.  This avoids garbage in the list
     of registrations when a pool with a registration is freed.
     [Jeff Trawick]

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

  *) Add memory code kindly donated to APR by  
       Elrond  <elrond@samba-tng.org> 
       Luke Kenneth Casson Leighton <lkcl@samba-tng.org>
       Sander Striker <striker@samba-tng.org>
     [David Reid]

  *) Fix a problem with the FreeBSD flavor of apr_sendfile() where we 
     could return APR_EAGAIN+bytes_sent.  [Jeff Trawick]

  *) Fix a problem on unixware where clearing h_errno wouldn't work.
     Use set_h_errno() instead.  PR #7651  [Jeff Trawick]

  *) Add the test and build directories (when present) to the recursive
     make process, being sure that they are run last.  test is only done
     recursively for make *clean targets.  [Roy Fielding]

  *) Make the apr_mmap_create() function use the native_flags variable.
     This allows us to actually create WRITEABLE MMAPs.
     [Ed Korthof <ed@apache.org>]

  *) Completely revamp configure so that it preserves the standard make
     variables CPPFLAGS, CFLAGS, CXXFLAGS, LDFLAGS and LIBS by moving
     the configure additions to EXTRA_* variables.  Also, allow the user
     to specify NOTEST_* values for all of the above, which eliminates the
     need for THREAD_CPPFLAGS, THREAD_CFLAGS, and OPTIM.  Fix the setting
     of INCLUDES and EXTRA_INCLUDES.  Check flags as they are added to
     avoid pointless duplications.  Fix the order in which flags are given
     on the compile and link lines.  [Roy Fielding]
 
  *) Fix DSO code on HP/UX.  We have to use == not =, and it makes more
     sense to actually return errno, so that the return code means 
     something.  [Ryan Bloom]

  *) Clean up conditionals in unix DSO code so that we decide based on
     the dynamic loading implementation, which we noticed at configure
     time, instead of by operating system.
     [Wilfredo Sanchez]

  *) Add DSO support for dyld platforms (Darwin/Mac OS and OpenStep).
     [Wilfredo Sanchez]

  *) Amend the time code to better deal with time zones.
     [David Reid]

  *) Carefully select an appropriate native type for apr_int64_t and
     define its format as APR_INT64_T_FMT and literal using APR_INT64_C().
     [Justin Erenkrantz, William Rowe]

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

  *) Initial implementation of of apr_filepath (get/set/parse_root and 
     merge) for Windows.  [William Rowe]

  *) Cleaned up implementation of of apr_filepath (get/set/parse_root
     and merge) for Unix.  [Greg Stein, William Rowe]

  *) Fixup the --enable-libtool option.  This allows the test directory
     to compile again.  The test directory still doesn't work when
     APR is configured without libtool.  [Ryan Bloom]

  *) If we don't have sigwait() in the system, see if sigsuspend() is
     available, and use that instead. [Wilfredo Sanchez]

  *) Make libtool optional at configure time.  This is done with 
     --disable-libtool.  [Ryan Bloom]

  *) Recognize systems where the TCP_NODELAY setting is inherited from
     the listening socket, and optimize apr_setsockopt(APR_TCP_NODELAY)
     accordingly.  [Jeff Trawick]

  *) Recognize the presence of getnameinfo() on Tru64.  [David Reid]

  *) Allow APR to be installed. [Ryan Bloom]

  *) Generate config.nice for easy re-run of configure. [Roy Fielding]

  *) Define preprocessor flags in CPPFLAGS instead of CFLAGS and
     bring some sanity to the compiler command-lines. [Roy Fielding]

  *) Use the dso/aix subdirectory for older versions of AIX and fix 
     a number of bugs in the dso code in that directory.
     [Victor Orlikowski]

  *) Allow libtool 1.3b to be used.  [Victor Orlikowski]

  *) Misc. Win32 fixes: Set the pool pointer in apr_sockaddr_t 
     structures created with the apr_socket_t to prevent segfault 
     in certain apps.  Flush unwritten buffered data when the file 
     is closed.  [Jeff Trawick]

  *) Win32: Get APR to compile with MSVC 5.0 (a.k.a. VC97).
     PR #7489  [Jeff Trawick]

  *) First draft implementation of apr_filepath (get/set/parse_root
     and merge) for Unix.  [William Rowe]

  *) Add apr_ipsubnet_create() and apr_ipsubnet_test() for testing
     whether or not an address is within a subnet.  [Jeff Trawick]

  *) Add apr_sendto and apr_recvfrom for Unix.  Start of adding UDP
     support.  [David Reid]

  *) Add a method to get the password from the system for a given
     user.  [John Barbee <jbarbee@covalent.net>]

  *) Change the include path order, so that we look for included files
     in the APR paths first, and the system paths second.
     [jean-frederic clere <jfrederic.clere@fujitsu-siemens.com>]

  *) Add a with-sendfile option, so that people on platforms without a
     sendfile implementation for APR can easily disable it from the 
     configure line.  [Ryan Bloom]

  *) Change the check for netinet/tcp.h to work around an issue with
     that header file on IRIX 6.5 which prevented it from being
     detected.  PR #6459  [Jeff Trawick]

  *) Introduce apr_get_userid to return a named user's apr_uid_t and
     apr_gid_t across platforms [Cliff Woolley, William Rowe]

  *) In apr_shm_init(), check the retcode from mm_malloc().  Previously,
     we segfaulted here if mm_malloc() failed to get a lock.  An example
     error scenario is when the lock file lives on a filesystem which
     doesn't support locking.  [Jeff Trawick]

  *) Name protected the autoconf macros defined by APR.  Moved the
     REENTRANCY_FLAGS settings into apr_hints.m4. Inlined the
     APR_PREPARE_MM_DIR macro because it could only be used once.
     Removed the unused macros MY_TRY_RUN, MY_TRY_RUN_NATIVE, and
     AC_USE_FUNCTION.  Added some macro comments.  [Roy Fielding]

  *) Cope with BSDi installations where the default make has been
     replaced with GNU make.  [Joe Orton <joe@manyfish.co.uk>]

  *) Changed apr/helpers to apr/build to be consistent with other Apache
     source trees.  Added make variables to rules.mk.in that point to the
     builders directory and its scripts.  Updated buildconf, configure.in,
     and Makefile.in files to create and use the new scripts.  Moved scandoc
     to scandoc.pl and its default.pl template to scandoc_template.pl.
     [Roy Fielding]

  *) Updated config.guess and config.sub to GNU libtool 1.3.5 features,
     with the Apache additions for OS/390 and OS/2 emx.  [Roy Fielding]

  *) Moved hints.m4, apr_common.m4, and helpers/apr-conf.m4 into the
     new build directory as apr_hints.m4, apr_common.m4, apr_network.m4,
     and apr_threads.m4.  [Roy Fielding]

  *) Get apr_sendfile() working on HP-UX.  This gets APR to build on
     HP-UX without having to turn off APR_HAS_SENDFILE.  [Jeff Trawick]

  *) Force FreeBSD to compile without threads by default.  To enable
     threads, use --enable-threads on the configure line.
     [Ryan Bloom]

  *) Purge system password buffer before returning from apr_password_get.
     No longer abuses bufsize argument on return.  [William Rowe]

  *) Moved the prototypes for apr_snprintf and apr_vsnprintf to the
     apr_strings.h header, from apr_lib.h.  This location makes more
     sense.  [Ryan Bloom]

  *) Added the APR_TRY_COMPILE_NO_WARNING configure macro for testing a
     compile with -Werror as well as the APR_CHECK_ICONV_INBUF macro to
     test for annoying iconv prototype differences.
     [Jeff Trawick, Roy Fielding]

  *) Fix a problem with configure on NetBSD.  We must include sys/types.h
     for some platforms.  [jun-ichiro hagino <itojun@kame.net>]

  *) Some fixes in the Win32 time support.
     (IsLeapYear): New macro for quickly figgerin' out if a given year is a 
     leap year. (SystemTimeToAprExpTime): Perform the calculation of
     tm_yday.  Also, negate the sign of the tm_gmtoff field to be
     consistent with Unix platforms and APR header file comments.
     [Mike Pilato]

  *) Implement WinNT Unix'ish permissions. [William Rowe]

  *) Corrected an OS2'ism of apr_get_home_directory.  OS2 now returns the
     proper directory, including the user's name.

  *) Removed private os2errno.h and integrated the OS2 network error codes
     into apr_errno.h for optimized error tests (APR_STATUS_IS_EFOO(rv)).
     [William Rowe]

  *) Moved inclusion of <os2.h> header from multiple modules into apr.h
     [William Rowe]

  *) Added apr_compare_users() and apr_compare_groups() for more complex
     apr_uid_t and apr_gid_t structures.  Enabled both .user and .group
     results from WinNT/2000 stat/getfileinfo, but expect to find that 
     .group is 'None' in most cases.  [William Rowe]

  *) Replace configure --with-optim option by using the environment
     variable OPTIM instead.  This is needed because configure options
     do not support multiple flags separated by spaces.  [Roy Fielding]

  *) Eliminate the APR_SIG* aliases for standard signal names,
     since they serve no useful purpose.  [Roy Fielding]

  *) Abstracted apr_get_username and apr_get_groupname for unix and win32.
     Modified Win32 apr_uid_t and apr_gid_t to use PSIDs, and elimintated
     the uid_t and gid_t definitions.  [William Rowe]

  *) Radically refactored apr_stat/lstat/getfileinfo/dir_read for Win32
     to assure we are retrieving what we expect to retrieve, and reporting
     the correct result (APR_SUCCESS or APR_INCOMPLETE).  The potential
     for a bit more optimization still remains.  [William Rowe]

  *) While we have the future opportunity to cache the apr_stat'ed file
     handle for a very fast open (dup handle) on Win32, patched to close
     that file after a stat always.  Needs a new semantic before we leave
     handles dangling when the user intends to rm.  [William Rowe]

  *) Correct Win32 apr_stat/lstat/getfileinfo/dir_read to all zero out
     the finfo buffer on success (or incomplete success).  [William Rowe]

  *) Fix Win32/Unix apr_lstat to throw the .valid bit APR_FINFO_LINK to
     indicate we attempted to open the link.  Only the .filetype APR_LNK
     reflects if the file found was, in fact, a link.   [William Rowe]

  *) Fixed apr_open and apr_rename to function on Win9x.
     [Mike Pilato <cmpilato@collab.net>] 
  
  *) Add apr_open_stdout.  This mirrors apr_open_stderr, except it works
     on stdout.  [Mike Pilato <cmpilato@collab.net>]

  *) Fix bug in file_io/unix/dir.c.  There is no such thing as a dirent,
     it must be a struct dirent.  
     [Kevin Pilch-Bisson <kevin@pilch-bisson.net>]

  *) Fix the configure script so that we can build from a different
     directory.  [Kevin Pilch-Bisson <kevin@pilch-bisson.net>]

  *) Introduce the wanted flag argument to the apr_stat/lstat/getfileinfo
     family of functions.  This change allows the user to determine what
     platform-specific file information is retrieved, to optimize both
     portability and performance.  [William Rowe]

  *) Fix make depend.  [Ryan Bloom]

  *) All dso implementations now register a cleanup to unload the DSO
     when it is loaded.  If the pool is removed, we really do need to
     remove the DSO.  In the past, different platforms behaved differently
     it this respect.  [Ryan Bloom]

  *) Add linkage declarations to the DSO code.
     [Gregory Nicholls <gnicholls@level8.com>]

  *) Some adjustment of hints.m4 setting flags (used to check if null
     first) and added some verbosity. [Jim Jagielski]

  *) Specify APR_DECLARE to some of the APR functions.  This helps linking
     on some operating systems.  [Gregory Nicholls <gnicholls@level8.com>]

  *) Libtool'ized APR and converted all the makefiles to share rules
     from helpers/rules.mk. [Greg Stein]

  *) Remove a warning on FreeBSD.  FreeBSD defines TCP_NO_PUSH, but we
     don't actually use it.  This causes os_cork to be defined but not
     used.  This patch keeps us from defining os_cork and os_uncork on
     FreeBSD.  [Ryan Bloom]

  *) Keep apr_terminate from seg faulting on terminate.  This is
     happening on systems that do not NULL out locks when they are
     destroyed.  To keep this from happening, we set the locks to
     NULL after destroying them in apr_terminate, and we have to 
     check for NULL in free_blocks.  
     [Allan Edwards and Gregory Nicholls <gnicholls@level8.com>]

  *) Remove the ability to allocate memory out of a NULL pool.
     [Ryan Bloom]

  *) Add an APR_GET_POOL macro to get a pool from any APR type that has
     a pool.  This requires that ALL apr types put the pool as the first
     field in their structure. [Ryan Bloom]

  *) Begin to remove the ability to allocate out of NULL pools.  The first
     problem to solve, is that we need an apr_lock in order to allocate
     pools, so that we can lock things out when allocating.  So, how do we
     allocate locks without a pool to allocate from?  The answer is to create
     a global_apr_pool, which is a bootstrapping pool.  There should NEVER
     be a sub-pool off this pool, and it is static to an APR file.  This is
     only used to allow us to allocate the locks cleanly, without using the
     NULL pool hack.  [Ryan Bloom]

  *) Fix a logic error in the poll code when implemented using select.
     [Nick Caruso <ncaruso@gamesville.com>]

  *) FreeBSD does not support sendfile() in combination with threads
     before version 4.2.  We no longer even try to support it.
     [Ryan Bloom]

  *) On FreeBSD, it is possible for the first call to sendfile to
     get EAGAIN, but still send some data.  This means that we cannot
     call sendfile and then check for EAGAIN, and then wait and call
     sendfile again.  If we do that, then we are likely to send the
     first chunk of data twice, once in the first call and once in the
     second.  If we are using a timed write, then we check to make sure
     we can send data before trying to send it. [Ryan Bloom]

  *) Cleanup to help Apache support programs build cleanly.
     [Cliff Woolley <cliffwoolley@yahoo.com>]

  *) Cleanup some compiler warnings on Solaris
     [Dale Ghent <daleg@elemental.org>]

  *) apr_getaddrinfo() can now return multiple addresses for a host
     via the next field in apr_sockaddr_t.  [Jeff Trawick]

  *) Tighten up the check for getaddrinfo().  If it can't figure out
     the appropriate address family for 127.0.0.1, it fails.  
     Unfortunately, Tru64 fails this test so we won't do IPv6 on
     Tru64.  [Jeff Trawick]

  *) Rename apr_opendir to apr_dir_open.  [Ryan Bloom]

  *) apr_snprintf()'s %pI format string now takes apr_sockaddr_t *
     instead of sockaddr_in *.  [Jeff Trawick]

  *) Fix a bug in apr_accept() for Win32 and Unix where the local 
     apr_sockaddr_t in the new connected socket was not initialized
     properly.  This could result in a bad string for apr_get_ipaddr(),
     among other things.  [Jeff Trawick]

  *) Add apr_getnameinfo(), a replacement for apr_get_hostname() which
     supports IPv6 and will be friendlier for use with eventual 
     SOCK_DGRAM support.  apr_get_hostname() is gone.  [Jeff Trawick]


Changes with APR a9

  *) Removed the iconv implementation from the i18n/unix/iconv branch.
     This now resides in the apr-iconv repository, and will be ported
     over time to use native apr types (e.g. apr_dso) for portability.

  *) Only support IPv6 if we have sockaddr_in and a working 
     getaddrinfo().  [Jeff Trawick]

  *) Add apr_parse_addr_port() for parsing the hostname:port portion
     of URLs and similar strings.  [Jeff Trawick]

  *) Add Win32 MMAP support [William Rowe]

  *) Allow the APR programmer to specify if the MMAP is read-only or
     write-able.
     [Ryan Bloom and Will Rowe]

  *) Check more carefully for getaddrinfo().  Accept those that
     require <netdb.h> to be included (e.g., Tru64).  Reject those that 
     fail a very basic operational test (e.g., AIX).  [Jeff Trawick]

  *) Add apr_make_os_sock() for constructing a fully-capable APR
     socket.  [Jeff Trawick]

  *) Make APR's shared memory routines always allocate enough memory
     for the requested segment, the MM internal types, and the APR
     internal types.
     [Ryan Bloom]

  *) Add APR_SIZE_T_FMT.  Get the other APR_xx_T_FMT variables
     defined properly on AIX.  [Jeff Trawick]

  *) network API changes: get rid of apr_get_socket_inaddr(), 
     apr_get_remote_name(), and apr_get_local_name()  [Jeff Trawick]

  *) Add a step at configure time to create a file at the top-level,
     apr.exports, which lists every function exported by APR.  The
     file is generated by a script in helpers, that reads each header
     file.
     [Ryan Bloom]

  *) Lock config changes: Detect SysV sem capability by the presence of
     sempaphore functions, not by the presence of union semun.  New
     config variable apr_lock_method can override autodetection of the 
     apr_lock implementation method.  For now, hints.m4 uses it to select 
     SysV semaphores for OS/390.  New config variable 
     apr_process_lock_is_global specifies that the selected inter-process
     lock method is sufficient for APR_LOCKALL (i.e., it blocks all
     threads and processes).  For now, hints.m4 turns on this flag for
     OS/390.  [Jeff Trawick]
     
  *) Get APR_OFF_T_FMT defined properly on Solaris Sparc.
     [Jeff Trawick]


Changes with APR a8

  *) Change the name of the sa_len field in apr_sockaddr_t to salen.
     Some platforms have a macro named sa_len.
     [Tony Finch]

  *) apr_set_port(), apr_get_port(), apr_set_ipaddr(), and apr_get_ipaddr()
     now take apr_sockaddr_t as a parameter instead of apr_socket_t +
     apr_interface_e.  This will allow the same routines to be used with
     datagram APIs to be added later.  Note that code which calls 
     apr_set_ipaddr() should probably be changed to call apr_getaddrinfo()
     for protocol independence.  [Jeff Trawick]

  *) apr_create_tcp_socket() has been removed.  Use apr_create_socket()
     instead.  [Jeff Trawick]

  *) Source was moved from the apache-2.0 repository.  For all CHANGES
     prior to this time, please see the apache-2.0 repository
