[core] remove apr-util from tree
This commit is contained in:
parent
c1a9e98e83
commit
9468ff746a
19
Makefile.am
19
Makefile.am
|
@ -15,16 +15,6 @@ AM_LIBAPR_CPPFLAGS := $(shell ./libs/apr/apr-1-config --cppflags --includes)
|
||||||
AM_LIBAPR_LDFLAGS := $(shell ./libs/apr/apr-1-config --ldflags)
|
AM_LIBAPR_LDFLAGS := $(shell ./libs/apr/apr-1-config --ldflags)
|
||||||
AM_LIBAPR_LIBS := $(subst $(switch_builddir)/,,$(shell ./libs/apr/apr-1-config \--libs))
|
AM_LIBAPR_LIBS := $(subst $(switch_builddir)/,,$(shell ./libs/apr/apr-1-config \--libs))
|
||||||
endif
|
endif
|
||||||
if SYSTEM_APRUTIL
|
|
||||||
AM_LIBAPU_CPPFLAGS := $(shell apu-1-config --includes)
|
|
||||||
AM_LIBAPU_LDFLAGS := $(shell apu-1-config --ldflags)
|
|
||||||
AM_LIBAPU_LIBS := $(shell apu-1-config \--libs)
|
|
||||||
AM_LIBAPU_LINKLIBTOOL := $(shell apu-1-config \--link-libtool)
|
|
||||||
else
|
|
||||||
AM_LIBAPU_CPPFLAGS := $(shell ./libs/apr-util/apu-1-config --includes)
|
|
||||||
AM_LIBAPU_LDFLAGS := $(shell ./libs/apr-util/apu-1-config --ldflags)
|
|
||||||
AM_LIBAPU_LIBS := $(subst $(switch_builddir)/,,$(shell ./libs/apr-util/apu-1-config \--libs))
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
AM_CFLAGS = $(SWITCH_AM_CFLAGS) $(SWITCH_ANSI_CFLAGS)
|
AM_CFLAGS = $(SWITCH_AM_CFLAGS) $(SWITCH_ANSI_CFLAGS)
|
||||||
|
@ -141,11 +131,6 @@ CORE_LIBS=
|
||||||
if ENABLE_LIBVPX
|
if ENABLE_LIBVPX
|
||||||
CORE_LIBS += libs/libvpx/libvpx.a
|
CORE_LIBS += libs/libvpx/libvpx.a
|
||||||
endif
|
endif
|
||||||
if SYSTEM_APRUTIL
|
|
||||||
CORE_LIBS += $(AM_LIBAPU_LINKLIBTOOL)
|
|
||||||
else
|
|
||||||
CORE_LIBS += libs/apr-util/libaprutil-1.la
|
|
||||||
endif
|
|
||||||
if SYSTEM_APR
|
if SYSTEM_APR
|
||||||
CORE_LIBS += $(AM_LIBAPR_LINKLIBTOOL)
|
CORE_LIBS += $(AM_LIBAPR_LINKLIBTOOL)
|
||||||
else
|
else
|
||||||
|
@ -340,6 +325,7 @@ nodist_libfreeswitch_la_SOURCES = \
|
||||||
|
|
||||||
libfreeswitch_la_SOURCES = \
|
libfreeswitch_la_SOURCES = \
|
||||||
src/switch_apr.c \
|
src/switch_apr.c \
|
||||||
|
src/switch_apr_queue.c \
|
||||||
src/switch_buffer.c \
|
src/switch_buffer.c \
|
||||||
src/switch_caller.c \
|
src/switch_caller.c \
|
||||||
src/switch_channel.c \
|
src/switch_channel.c \
|
||||||
|
@ -600,9 +586,6 @@ libs/apr/Makefile: libs/apr/Makefile.in libs/apr/config.status libs/apr libs/apr
|
||||||
libs/apr/libapr-1.la: libs/apr/Makefile libs/apr/.update
|
libs/apr/libapr-1.la: libs/apr/Makefile libs/apr/.update
|
||||||
@if [ $(MAKELEVEL) = 0 -o -z "`echo "$(MAKEARGS)" | grep "j"`" ] ; then touch $(switch_srcdir)/src/include/switch.h; cd libs/apr && $(MAKE) $(MFLAGS) && touch libapr-1.la; fi
|
@if [ $(MAKELEVEL) = 0 -o -z "`echo "$(MAKEARGS)" | grep "j"`" ] ; then touch $(switch_srcdir)/src/include/switch.h; cd libs/apr && $(MAKE) $(MFLAGS) && touch libapr-1.la; fi
|
||||||
|
|
||||||
libs/apr-util/libaprutil-1.la: libs/apr/libapr-1.la libs/apr-util libs/apr-util/.update
|
|
||||||
@if [ $(MAKELEVEL) = 0 -o -z "`echo "$(MAKEARGS)" | grep "j"`" ] ; then touch $(switch_srcdir)/src/include/switch.h; cd libs/apr-util && $(MAKE) $(MFLAGS) && touch libaprutil-1.la; fi
|
|
||||||
|
|
||||||
SRTP_SRC = libs/srtp/srtp/srtp.c libs/srtp/crypto/cipher/cipher.c libs/srtp/crypto/cipher/null_cipher.c \
|
SRTP_SRC = libs/srtp/srtp/srtp.c libs/srtp/crypto/cipher/cipher.c libs/srtp/crypto/cipher/null_cipher.c \
|
||||||
libs/srtp/crypto/cipher/aes.c libs/srtp/crypto/cipher/aes_icm.c \
|
libs/srtp/crypto/cipher/aes.c libs/srtp/crypto/cipher/aes_icm.c \
|
||||||
libs/srtp/crypto/hash/null_auth.c libs/srtp/crypto/hash/sha1.c \
|
libs/srtp/crypto/hash/null_auth.c libs/srtp/crypto/hash/sha1.c \
|
||||||
|
|
|
@ -170,9 +170,6 @@ bootstrap_apr() {
|
||||||
# Remove autoconf 2.5x's cache directory
|
# Remove autoconf 2.5x's cache directory
|
||||||
rm -rf autom4te*.cache
|
rm -rf autom4te*.cache
|
||||||
|
|
||||||
echo "Entering directory ${LIBDIR}/apr-util"
|
|
||||||
cd ${LIBDIR}/apr-util
|
|
||||||
./buildconf
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bootstrap_libzrtp() {
|
bootstrap_libzrtp() {
|
||||||
|
|
|
@ -1,49 +0,0 @@
|
||||||
# Locate APR-Util include paths and libraries
|
|
||||||
|
|
||||||
# This module defines
|
|
||||||
# APRUTIL_INCLUDES, where to find apr.h, etc.
|
|
||||||
# APRUTIL_LIBS, the libraries to link against to use APR.
|
|
||||||
# APRUTIL_FOUND, set to yes if found
|
|
||||||
|
|
||||||
find_program(APRUTIL_CONFIG_EXECUTABLE
|
|
||||||
apu-1-config
|
|
||||||
/usr/local/apr-util/1.2.12/bin
|
|
||||||
/usr/local/bin
|
|
||||||
/usr/bin
|
|
||||||
C:/Progra~1/apr/bin
|
|
||||||
)
|
|
||||||
|
|
||||||
mark_as_advanced(APRUTIL_CONFIG_EXECUTABLE)
|
|
||||||
|
|
||||||
macro(_apu_invoke _varname _regexp)
|
|
||||||
execute_process(
|
|
||||||
COMMAND ${APRUTIL_CONFIG_EXECUTABLE} ${ARGN}
|
|
||||||
OUTPUT_VARIABLE _apr_output
|
|
||||||
RESULT_VARIABLE _apr_failed
|
|
||||||
)
|
|
||||||
|
|
||||||
if(_apr_failed)
|
|
||||||
message(FATAL_ERROR "apu-1-config ${ARGN} failed")
|
|
||||||
else(_apr_failed)
|
|
||||||
string(REGEX REPLACE "[\r\n]" "" _apr_output "${_apr_output}")
|
|
||||||
string(REGEX REPLACE " +$" "" _apr_output "${_apr_output}")
|
|
||||||
|
|
||||||
if(NOT ${_regexp} STREQUAL "")
|
|
||||||
string(REGEX REPLACE "${_regexp}" " " _apr_output "${_apr_output}")
|
|
||||||
endif(NOT ${_regexp} STREQUAL "")
|
|
||||||
|
|
||||||
separate_arguments(_apr_output)
|
|
||||||
|
|
||||||
set(${_varname} "${_apr_output}")
|
|
||||||
endif(_apr_failed)
|
|
||||||
endmacro(_apu_invoke)
|
|
||||||
|
|
||||||
_apu_invoke(APRUTIL_INCLUDES "(^| )-I" --includes)
|
|
||||||
_apu_invoke(APRUTIL_LIBS "" --link-ld)
|
|
||||||
|
|
||||||
if(APRUTIL_LIBS AND APRUTIL_INCLUDES)
|
|
||||||
set(APRUTIL_FOUND "YES")
|
|
||||||
set(APRUTIL_DEFINITIONS "")
|
|
||||||
message (STATUS "apr-util found: YES ${APRUTIL_LIBS}")
|
|
||||||
endif(APRUTIL_LIBS AND APRUTIL_INCLUDES)
|
|
||||||
|
|
|
@ -844,8 +844,6 @@ PKG_CHECK_MODULES([STIRSHAKEN], [stirshaken],[
|
||||||
|
|
||||||
AC_CHECK_LIB(apr-1, apr_pool_mutex_set, use_system_apr=yes, use_system_apr=no)
|
AC_CHECK_LIB(apr-1, apr_pool_mutex_set, use_system_apr=yes, use_system_apr=no)
|
||||||
AM_CONDITIONAL([SYSTEM_APR],[test "${use_system_apr}" = "yes"])
|
AM_CONDITIONAL([SYSTEM_APR],[test "${use_system_apr}" = "yes"])
|
||||||
AC_CHECK_LIB(aprutil-1, apr_queue_pop_timeout, use_system_aprutil=yes, use_system_aprutil=no)
|
|
||||||
AM_CONDITIONAL([SYSTEM_APRUTIL],[test "${use_system_aprutil}" = "yes"])
|
|
||||||
|
|
||||||
save_LIBS="$LIBS"
|
save_LIBS="$LIBS"
|
||||||
LIBS=
|
LIBS=
|
||||||
|
@ -2333,12 +2331,9 @@ AC_CONFIG_SUBDIRS([libs/srtp])
|
||||||
if test "$use_system_apr" != "yes"; then
|
if test "$use_system_apr" != "yes"; then
|
||||||
AC_CONFIG_SUBDIRS([libs/apr])
|
AC_CONFIG_SUBDIRS([libs/apr])
|
||||||
fi
|
fi
|
||||||
if test "$use_system_aprutil" != "yes"; then
|
|
||||||
AC_CONFIG_SUBDIRS([libs/apr-util])
|
|
||||||
fi
|
|
||||||
AC_CONFIG_SUBDIRS([libs/iksemel])
|
AC_CONFIG_SUBDIRS([libs/iksemel])
|
||||||
AC_CONFIG_SUBDIRS([libs/libdingaling])
|
#AC_CONFIG_SUBDIRS([libs/libdingaling])
|
||||||
AC_CONFIG_SUBDIRS([libs/unimrcp])
|
#AC_CONFIG_SUBDIRS([libs/unimrcp])
|
||||||
if test "x${enable_zrtp}" = "xyes"; then
|
if test "x${enable_zrtp}" = "xyes"; then
|
||||||
AC_CONFIG_SUBDIRS([libs/libzrtp])
|
AC_CONFIG_SUBDIRS([libs/libzrtp])
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -41,33 +41,6 @@ opal
|
||||||
/apr/Makefile
|
/apr/Makefile
|
||||||
/apr/test/internal/Makefile
|
/apr/test/internal/Makefile
|
||||||
/apr/test/Makefile
|
/apr/test/Makefile
|
||||||
/apr-util/aprutil.exp
|
|
||||||
/apr-util/apu-1-config
|
|
||||||
/apr-util/build/apr_common.m4
|
|
||||||
/apr-util/build/find_apr.m4
|
|
||||||
/apr-util/build/get-version.sh
|
|
||||||
/apr-util/build/install.sh
|
|
||||||
/apr-util/build/pkg/pkginfo
|
|
||||||
/apr-util/build/rules.mk
|
|
||||||
/apr-util/exports.c
|
|
||||||
/apr-util/export_vars.c
|
|
||||||
/apr-util/export_vars.sh
|
|
||||||
/apr-util/include/apr_ldap.h
|
|
||||||
/apr-util/include/apu_config.h
|
|
||||||
/apr-util/include/apu.h
|
|
||||||
/apr-util/include/apu_select_dbm.h
|
|
||||||
/apr-util/include/apu_want.h
|
|
||||||
/apr-util/include/private/apu_config.h
|
|
||||||
/apr-util/include/private/apu_config.h.in
|
|
||||||
/apr-util/include/private/apu_select_dbm.h
|
|
||||||
/apr-util/.make.dirs
|
|
||||||
/apr-util/Makefile
|
|
||||||
/apr-util/test/Makefile
|
|
||||||
/apr-util/xml/expat/config.h
|
|
||||||
/apr-util/xml/expat/lib/config.h
|
|
||||||
/apr-util/xml/expat/lib/expat.h
|
|
||||||
/apr-util/xml/expat/lib/Makefile
|
|
||||||
/apr-util/xml/expat/Makefile
|
|
||||||
/broadvoice/config-h.in
|
/broadvoice/config-h.in
|
||||||
/broadvoice/doc/Makefile
|
/broadvoice/doc/Makefile
|
||||||
/broadvoice/doc/Makefile.in
|
/broadvoice/doc/Makefile.in
|
||||||
|
@ -728,10 +701,6 @@ opal
|
||||||
/v8-*.zip
|
/v8-*.zip
|
||||||
|
|
||||||
# build products we should remove
|
# build products we should remove
|
||||||
!/apr-util/xml/expat/conftools/config.guess
|
|
||||||
!/apr-util/xml/expat/conftools/config.sub
|
|
||||||
!/apr-util/xml/expat/conftools/install-sh
|
|
||||||
!/apr-util/xml/expat/conftools/missing
|
|
||||||
!/iksemel/ltmain.sh
|
!/iksemel/ltmain.sh
|
||||||
!/libdingaling/config.guess
|
!/libdingaling/config.guess
|
||||||
!/libdingaling/config.sub
|
!/libdingaling/config.sub
|
||||||
|
@ -759,8 +728,6 @@ unimrcp/build/compile
|
||||||
/ldns/
|
/ldns/
|
||||||
/portaudio/
|
/portaudio/
|
||||||
portaudio.*.log
|
portaudio.*.log
|
||||||
apr-util/configure
|
|
||||||
apr-util/xml/expat/configure
|
|
||||||
apr/configure
|
apr/configure
|
||||||
iksemel/configure
|
iksemel/configure
|
||||||
libdingaling/configure
|
libdingaling/configure
|
||||||
|
@ -794,4 +761,4 @@ mariadb-connector-c-*
|
||||||
/spandsp*/
|
/spandsp*/
|
||||||
/spandsp*
|
/spandsp*
|
||||||
win32/spandsp/spandsp.h
|
win32/spandsp/spandsp.h
|
||||||
win32/spandsp/win32
|
win32/spandsp/win32
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
Thu 18 Nov 2010 20:56:38 EST
|
|
|
@ -1,619 +0,0 @@
|
||||||
Changes with APR-util 1.2.8
|
|
||||||
|
|
||||||
*) Add support for Berkeley DB 4.5 to the configure scripts.
|
|
||||||
[Garrett Rooney]
|
|
||||||
|
|
||||||
*) Allow apr_queue.h to be included before other APR headers.
|
|
||||||
PR 40891 [Henry Jen <henryjen ztune.net>]
|
|
||||||
|
|
||||||
*) Provide folding in autogenerated .manifest files for Win32 builders
|
|
||||||
using VisualStudio 2005 [William Rowe]
|
|
||||||
|
|
||||||
*) Implement prepared statement support in SQLite3 DBD driver
|
|
||||||
[Bojan Smojver]
|
|
||||||
|
|
||||||
*) Fix to ensure that "deprecated" LDAP interfaces are still
|
|
||||||
exposed if using OpenLDAP 2.3. [Joe Orton]
|
|
||||||
|
|
||||||
*) Fix incorrect byte order and incorrect timestamp type
|
|
||||||
in the fallback UUID generator used when no external UUID
|
|
||||||
generator is detected by APR. PR 37342. [Max Bowsher]
|
|
||||||
|
|
||||||
Changes with APR-util 1.2.7
|
|
||||||
|
|
||||||
*) Fix apr_dbd_init to be safe to call multiple times
|
|
||||||
[Bojan Smojver <bojan rexursive com>, Nick Kew]
|
|
||||||
|
|
||||||
*) Win32 / Netware - add missing apu_version.c for apu_version_string()
|
|
||||||
to the Windows and Netware specific builds. Unix platforms supported
|
|
||||||
this API since 0.9.1. [William Rowe, Brad Nicholes].
|
|
||||||
|
|
||||||
Changes with APR-util 1.2.6
|
|
||||||
|
|
||||||
*) Stop trying to link against Berkeley DB by default. To enable use
|
|
||||||
of Berkeley DB users must now explicitly pass --with-berkeley-db to
|
|
||||||
configure, since Berkeley DB is released under a viral license that
|
|
||||||
requires distribution of source code for any program that uses it.
|
|
||||||
[Garrett Rooney]
|
|
||||||
|
|
||||||
*) Stop trying to link against GDBM by default. To enable use of GDBM
|
|
||||||
users must now explicitly pass --with-gdbm to configure, since GDBM
|
|
||||||
is licensed under the GPL.
|
|
||||||
[Garrett Rooney]
|
|
||||||
|
|
||||||
*) Fix VPATH builds, and symlink builds where apr and apr-util
|
|
||||||
reside in parallel as symlinks to directories with more explicit
|
|
||||||
names, e.g. apr-1.x and apr-util-1.x. This solves various breakage
|
|
||||||
on Solaris in particular with ./buildconf and ./configure. Also
|
|
||||||
eliminated the nested ../apr-iconv/buildconf, given that apr-util
|
|
||||||
didn't bother with ../apr/buildconf, and this was inconsistant.
|
|
||||||
[William Rowe]
|
|
||||||
|
|
||||||
*) Fix the escape implementations for the sqlite2 and sqlite3 dbd
|
|
||||||
back ends.
|
|
||||||
[Ronen Mizrahi <ronen tversity.com>, Garrett Rooney]
|
|
||||||
|
|
||||||
*) Add support for Berkeley DB 4.4 to the configure scripts.
|
|
||||||
[Garrett Rooney]
|
|
||||||
|
|
||||||
*) Fix bug in test suite that cause testbuckets to write 8GB file
|
|
||||||
on Mac OS X. [Justin Erenkrantz]
|
|
||||||
|
|
||||||
Changes with APR-util 1.2.2
|
|
||||||
|
|
||||||
*) Teach configure how to find the Novell LDAP SDK. [Graham Leggett]
|
|
||||||
|
|
||||||
*) Fix usage of ldapssl_init/ldap_sslinit on platforms that support
|
|
||||||
these API's including Win32. Support APR_HAS_LDAP_START_TLS_S
|
|
||||||
flag in the Win32 LDAP API, to drop usage of ldap_start_ssl_s
|
|
||||||
and ldap_stop_ssl_s on Win32 by default (change the flag in apr_ldap.hw
|
|
||||||
to enable if supported on a given OS level). [William Rowe]
|
|
||||||
|
|
||||||
Changes with APR-util 1.2.1
|
|
||||||
|
|
||||||
*) Fix apr_rmm_realloc() offset calculation bug. [Keith Kelleman
|
|
||||||
<keith.kelleman oracle.com>]
|
|
||||||
|
|
||||||
*) Add sqlite3 support to APR DBD. [Rick Keiner <rick_keiner yahoo.com>]
|
|
||||||
|
|
||||||
*) Fix build failure with non-threaded APR on AIX. PR 34655.
|
|
||||||
[Ryan Murray <rmurray+apache cyberhqz.com>]
|
|
||||||
|
|
||||||
*) Add sqlite2 support to APR DBD. [Ryan Phillips <ryan trolocsis.com>]
|
|
||||||
|
|
||||||
*) Introduction of APR DBD layer. [Nick Kew]
|
|
||||||
|
|
||||||
Changes with APR-util 1.1.2
|
|
||||||
|
|
||||||
*) Fix libaprutil.rc for Win32 builds [William Rowe, Justin Erenkrantz]
|
|
||||||
|
|
||||||
Changes with APR-util 1.1.1
|
|
||||||
|
|
||||||
*) Fix memory leak in buckets when using APR_POOL_DEBUG mode. [Joe Schaefer]
|
|
||||||
|
|
||||||
*) find_apu.m4: Try installed APR-util before bundled copy if --with-apr-util
|
|
||||||
not passed to configure. [Justin Erenkrantz]
|
|
||||||
|
|
||||||
Changes with APR-util 1.1.0
|
|
||||||
|
|
||||||
*) LDAP: Move all certificate initialisation, and the creation of SSL
|
|
||||||
and TLS connections into the apr_ldap_set_option() API. Add support
|
|
||||||
for client certificates. [Graham Leggett]
|
|
||||||
|
|
||||||
*) Emit the run-time link path option in apu-config after installation
|
|
||||||
if the user is linking with libtool. [Justin Erenkrantz]
|
|
||||||
|
|
||||||
*) Port testmd4 and testmd5 to the new test suite. [Thom May]
|
|
||||||
|
|
||||||
*) Allow passing NULL inbuf/inbytes_left parameters to
|
|
||||||
apr_xlate_conv_buffer(), required to correctly terminate the
|
|
||||||
output buffer for some stateful character set encodings.
|
|
||||||
[Joe Orton]
|
|
||||||
|
|
||||||
*) Link libaprutil against the libraries on which it depends.
|
|
||||||
PR 11122. [Joe Orton]
|
|
||||||
|
|
||||||
*) Add apr_brigade_insert_file() function, to safely insert a file
|
|
||||||
into a brigade, regardless of size. [Joe Orton]
|
|
||||||
|
|
||||||
Changes with APR-util 1.0.2
|
|
||||||
|
|
||||||
*) Teach apr_ldap_init() how to handle STARTTLS in addition to the existing
|
|
||||||
SSL support. Add apr_ldap_option API. [Graham Leggett]
|
|
||||||
|
|
||||||
*) Rework the LDAP toolkit detection to be more accurate than "OpenLDAP
|
|
||||||
detected regardless", while remaining backwards compatible with v1.0.
|
|
||||||
[Graham Leggett]
|
|
||||||
|
|
||||||
*) Added the apr_ldap_ssl_add_cert() API to allow multiple certificates
|
|
||||||
to be stored and used when establishing an SSL connection to different
|
|
||||||
LDAP servers. [Brad Nicholes]
|
|
||||||
|
|
||||||
*) Fix the detection of ldap.h on Solaris - it needs lber.h to be
|
|
||||||
defined first. [Graham Leggett]
|
|
||||||
|
|
||||||
*) Add a build script to create a solaris package. [Graham Leggett]
|
|
||||||
|
|
||||||
Changes with APR-util 1.0.1
|
|
||||||
|
|
||||||
*) Add support for Berkeley DB 4.3. [Jani Averbach <jaa jaa.iki.fi>]
|
|
||||||
|
|
||||||
*) SECURITY: CAN-2004-0786 (cve.mitre.org)
|
|
||||||
Fix input validation in apr_uri_parse() to avoid passing negative
|
|
||||||
length to memcpy for malformed IPv6 literal addresses.
|
|
||||||
[Joe Orton]
|
|
||||||
|
|
||||||
Changes with APR-util 1.0
|
|
||||||
|
|
||||||
*) Only install apu-$MAJOR-config and add appropriate detection code to
|
|
||||||
find_apu.m4 (APU_FIND_APU). [Max Bowsher <maxb ukf.net>]
|
|
||||||
|
|
||||||
*) Overhaul support for LDAP URL parsing. Instead of using incompatible
|
|
||||||
URL parsers and memory that needs freeing, apr-util provides a parser
|
|
||||||
which parses the URL and allocates memory from a pool. [Graham Leggett]
|
|
||||||
|
|
||||||
*) Remove support for LDAP v2.0 SDK toolkits. This will be added
|
|
||||||
back properly later assuming there is demand for it. In the mean
|
|
||||||
time, please use an LDAP v3.0 SDK toolkit. [Graham Leggett]
|
|
||||||
|
|
||||||
*) Add an apr_ldap_err_t structure to handle the return of LDAP
|
|
||||||
specific error codes. [Graham Leggett, Brad Nicholes]
|
|
||||||
|
|
||||||
*) Add APR functions to do the job of ldap_init(), hiding toolkit
|
|
||||||
specific SSL/TLS handling. Code derived from httpd util_ldap.
|
|
||||||
[Graham Leggett]
|
|
||||||
|
|
||||||
*) Add an RPM spec file derived from Fedora Core.
|
|
||||||
[Graham Leggett, 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]
|
|
||||||
|
|
||||||
*) A new function, apr_reslist_invalidate, was added so that invalid
|
|
||||||
resources can be removed from a reslist instead of being returned
|
|
||||||
to the reslist in a broken state. [Nick Kew <nick webthing.com>]
|
|
||||||
|
|
||||||
*) Switch to a single, top-level make. [Greg Stein]
|
|
||||||
|
|
||||||
*) Add timeout feature to apr_reslist_acquire().
|
|
||||||
[Mladen Turk <mturk apache.org>]
|
|
||||||
|
|
||||||
*) Pass error codes returned from constructors all the way back to
|
|
||||||
the reslist consumer. Also fix a minor reslist memory leak that could
|
|
||||||
happen when a constructor returns an error code. PR 23492.
|
|
||||||
[Snke Tesch <st@kino-fahrplan.de>, Aaron Bannert]
|
|
||||||
|
|
||||||
*) The following header files have been removed:
|
|
||||||
|
|
||||||
apu_compat.h
|
|
||||||
|
|
||||||
Changes with APR-util 0.9.5
|
|
||||||
|
|
||||||
*) Fix corrupt output from the apr_xlate_* interfaces on AIX 4.x.
|
|
||||||
[Joe Orton]
|
|
||||||
|
|
||||||
*) Change the order in which ldap.h and lber.h are defined, to fix
|
|
||||||
a compile bug in Solaris v2.8 which requires lber.h then ldap.h.
|
|
||||||
PR 27379. [Andrew Connors <andy.connors idea.com>]
|
|
||||||
|
|
||||||
*) Restore support for SHA1 passwords in apr_validate_password.
|
|
||||||
PR 17343. [Paul Querna <chip force-elite.com>]
|
|
||||||
|
|
||||||
*) Fix DESTDIR install for bundled expat library. PR 14076
|
|
||||||
[David S. Madole <david madole.net>]
|
|
||||||
|
|
||||||
*) Fix occasional crash in apr_rmm_realloc(). PR 22915.
|
|
||||||
[Jay Shrauner <shrauner inktomi.com>]
|
|
||||||
|
|
||||||
*) Fix apr_dbm_exists() for sdbm when sizeof(int) != sizeof(size_t).
|
|
||||||
[Joe Orton]
|
|
||||||
|
|
||||||
*) The whole codebase was relicensed and is now available under
|
|
||||||
the Apache License, Version 2.0 (http://www.apache.org/licenses).
|
|
||||||
[Apache Software Foundation]
|
|
||||||
|
|
||||||
*) Fix xlate.c compile failure on AIX 5.2. PR 25701. [Jeff Trawick]
|
|
||||||
|
|
||||||
*) Fixed a bug in apr_rmm that would cause it to mishandle blocks of
|
|
||||||
a size close to the one requested from the allocator.
|
|
||||||
[Kevin Wang <xwang_tech yahoo.com>]
|
|
||||||
|
|
||||||
Changes with APR-util 0.9.4
|
|
||||||
|
|
||||||
*) Changed apr_bucket_alloc_create() so that it uses the allocator
|
|
||||||
from the pool that was passed in rather than creating its own.
|
|
||||||
Also, the bucket_allocator is now allocated from the apr_allocator_t
|
|
||||||
rather than using apr_palloc(). Added apr_bucket_alloc_create_ex()
|
|
||||||
which takes an apr_allocator_t* directly rather than an apr_pool_t*.
|
|
||||||
[Cliff Woolley, Jean-Jacques Clar]
|
|
||||||
|
|
||||||
*) Added debugging consistency checks to the buckets code. Add
|
|
||||||
-DAPR_BUCKET_DEBUG to the build flags to enable.
|
|
||||||
[Cliff Woolley]
|
|
||||||
|
|
||||||
*) Make the version of the db library APU built against visible.
|
|
||||||
[Thom May]
|
|
||||||
|
|
||||||
*) Fix a problem with VPATH builds copying the APR rules.mk into the
|
|
||||||
source directory rather than the build directory. [Justin Erenkrantz]
|
|
||||||
|
|
||||||
*) SECURITY [httpd incident CAN-2003-0189] Address a thread safety
|
|
||||||
issue with apr_password_validate() on AIX, Linux, Mac OS X, and
|
|
||||||
possibly other platforms. [Jeff Trawick, Justin Erenkrantz]
|
|
||||||
|
|
||||||
*) Fix a problem with LDAP configuration which caused subsequent
|
|
||||||
configure tests to fail since LIBS contained LDAP libraries for
|
|
||||||
subsequent tests but LDFLAGS no longer included the path to such
|
|
||||||
LDAP libraries. [Jeff Trawick]
|
|
||||||
|
|
||||||
*) Fix a problem preventing the use of the bundled Expat when APR-util
|
|
||||||
is built stand-alone. [Jeff Trawick]
|
|
||||||
|
|
||||||
*) Use the same compiler and preprocessor for the APR-util config tests
|
|
||||||
which were used by APR. The user can override this via CC and CPP.
|
|
||||||
This was done all along for the actual build, but not necessarily
|
|
||||||
for the config tests. [Jeff Trawick]
|
|
||||||
|
|
||||||
*) Fix apr_uuid_parse() on EBCDIC machines. [Jeff Trawick]
|
|
||||||
|
|
||||||
*) Fix alignment problem when allocating memory using apr_rmm. The problem
|
|
||||||
showed up while trying to write a double in the memory allocated.
|
|
||||||
[Madhusudan Mathihalli]
|
|
||||||
|
|
||||||
Changes with APR-util 0.9.3
|
|
||||||
|
|
||||||
*) Allow apr_date_parse_rfc to parse 'Sun, 06-Nov-1994 08:49:37 GMT' as a
|
|
||||||
valid date. [Dmitri Tikhonov <dmitri@netilla.com>]
|
|
||||||
|
|
||||||
*) Fix error in apu-config when symlinks are involved.
|
|
||||||
[Garrett Rooney <rooneg@electricjellyfish.net>]
|
|
||||||
|
|
||||||
Changes with APR-util 0.9.2
|
|
||||||
|
|
||||||
*) Fix the APR_BUCKET_IS_foo() macros so they parenthesize their parameter.
|
|
||||||
This fixes compile problems with some types of parameters.
|
|
||||||
[Jim Carlson <jcarlson@jnous.com>]
|
|
||||||
|
|
||||||
*) Queue overwrite, we now return the item pushed, not a reference to it.
|
|
||||||
[Paul Marquis <PMarquis@pobox.com, Jacob Lewallen <jlwalle@cs.ucr.edu>]
|
|
||||||
|
|
||||||
*) Remove include/apr_ldap.h on distclean. PR 15592. [Justin Erenkrantz]
|
|
||||||
|
|
||||||
*) Fix race conditions in apr_queue.
|
|
||||||
[Jacob Lewallen <jlwalle@cs.ucr.edu>]
|
|
||||||
|
|
||||||
*) Stop buildconf copying rules.mk, copy it at configure time.
|
|
||||||
[Thom May]
|
|
||||||
|
|
||||||
*) Make buildconf copy rules.mk as well.
|
|
||||||
[Garrett Rooney <rooneg@electricjellyfish.net>]
|
|
||||||
|
|
||||||
*) Add --includedir flag to apu-config. [Justin Erenkrantz]
|
|
||||||
|
|
||||||
*) Fix brokenness in sdbm when sizeof(int) != sizeof(size_t)
|
|
||||||
(e.g., 64-bit AIX, 64-bit Solaris). PR 14861. [Jeff Trawick]
|
|
||||||
|
|
||||||
*) Have buildconf copy required files from apr so that apr-util can build
|
|
||||||
on its own. [Craig Rodrigues <rodrigc@attbi.com>]
|
|
||||||
|
|
||||||
*) Detect OpenLDAP when used with Solaris 9. PR 13427.
|
|
||||||
[Gary Algier <gaa@ulticom.com>]
|
|
||||||
|
|
||||||
*) Detect Berkeley DB 4.1 when compiled with --with-uniquenames
|
|
||||||
[Thom May]
|
|
||||||
|
|
||||||
*) Allow apu-config to work in symlinked install directories when
|
|
||||||
'realpath' is available. [Justin Erenkrantz]
|
|
||||||
|
|
||||||
*) Fix bug in apr_strmatch when used with case-insensitive patterns.
|
|
||||||
[Justin Erenkrantz]
|
|
||||||
|
|
||||||
*) Allow apr_queue to have greater than int number of elements.
|
|
||||||
[Justin Erenkrantz]
|
|
||||||
|
|
||||||
*) Detect Berkeley DB 4.0 compiled with --with-uniquenames.
|
|
||||||
[Philip Martin <philip@codematters.co.uk>]
|
|
||||||
|
|
||||||
*) Allocate brigades from a bucket allocator rather than a pool. [Brian Pane]
|
|
||||||
|
|
||||||
*) Update with the latest APR renames [Thom May]
|
|
||||||
|
|
||||||
*) Update doxygen tags. [Justin Erenkrantz]
|
|
||||||
|
|
||||||
*) Add apr_ldap.hw for Windows build.
|
|
||||||
[Andre Schild <A.Schild@aarboard.ch>]
|
|
||||||
|
|
||||||
*) Add IPv6 literal address support to apr_uri_parse(), apr_uri_unparse(),
|
|
||||||
and apr_uri_parse_hostinfo(). PR 11887 [Jeff Trawick]
|
|
||||||
|
|
||||||
*) Add apr_brigade_writev() [Brian Pane]
|
|
||||||
|
|
||||||
*) Add support for Berkeley DB 4.1. [Justin Erenkrantz]
|
|
||||||
|
|
||||||
*) Add --bindir option to apu-config. [Justin Erenkrantz]
|
|
||||||
|
|
||||||
Changes with APR-util 0.9.1
|
|
||||||
|
|
||||||
*) Add versioning infrastructure.
|
|
||||||
[Justin Erenkrantz]
|
|
||||||
|
|
||||||
*) Running "make check" in the toplevel directory or the test/ directory
|
|
||||||
will build and run all test programs. [Aaron Bannert]
|
|
||||||
|
|
||||||
*) Bug #9789 : NDBM support
|
|
||||||
[Toomas Soome <tsoome@muhv.pri.ee>, Ian Holsman]
|
|
||||||
|
|
||||||
*) Added a Thread safe FIFO bounded buffer (apr_queue) [Ian Holsman]
|
|
||||||
|
|
||||||
*) Changed file_bucket_setaside() to use apr_file_setaside() instead
|
|
||||||
of turning the file bucket into an mmap bucket. [Brian Pane]
|
|
||||||
|
|
||||||
*) Install libaprutil support libraries before installing libaprutil
|
|
||||||
itself, since on some platforms libaprutil is relinked during
|
|
||||||
make install and the support libraries need to exist already.
|
|
||||||
[Jeff Trawick]
|
|
||||||
|
|
||||||
*) Added a Resource List API for threadsafe access to persistent
|
|
||||||
and dynamically created user-defined resources. [Aaron Bannert]
|
|
||||||
|
|
||||||
*) Adopted apr-util/xlate from apr/i18n for inclusion of apr-iconv
|
|
||||||
as required by missing libiconv. [William Rowe]
|
|
||||||
|
|
||||||
*) Adopted apr-util/crypto/ uuid and md5 from apr. [William Rowe]
|
|
||||||
|
|
||||||
*) Look for expat in lib64 directories. [Peter Poeml <poeml@suse.de>]
|
|
||||||
|
|
||||||
*) Faster implementation of apr_brigade_puts() [Brian Pane]
|
|
||||||
|
|
||||||
*) Fixed a segfault in apr_date_parse_rfc() for some date formats
|
|
||||||
where it was trying to overlay a potentially static input
|
|
||||||
string even though it didn't really need to.
|
|
||||||
[Cliff Woolley, Doug MacEachern]
|
|
||||||
|
|
||||||
*) Ensure that apu-config does not print libtool libraries when
|
|
||||||
using --libs. [Justin Erenkrantz]
|
|
||||||
|
|
||||||
*) Added apr_bucket_file_enable_mmap() function to the bucket
|
|
||||||
API to let an application control whether a file bucket may
|
|
||||||
be turned into an mmap bucket upon read. (The default remains
|
|
||||||
to do the mmap, but this function lets the app prevent the
|
|
||||||
mmap in contexts where mmap would be a bad idea. Examples
|
|
||||||
include multiprocessors where mmap doesn't scale well and
|
|
||||||
NFS-mounted filesystems where a bus error can result if
|
|
||||||
a memory-mapped file is removed or truncated.) [Brian Pane]
|
|
||||||
|
|
||||||
*) Added string-matching API (apr_strmatch.h) [Brian Pane]
|
|
||||||
|
|
||||||
*) Rearrange INCLUDES so that APRUTIL_PRIV_INCLUDES is always
|
|
||||||
first. [Garrett Rooney <rooneg@electricjellyfish.net>]
|
|
||||||
|
|
||||||
*) Add --old-expat option to apu-config to allow users of apr-util to
|
|
||||||
determine what expat it should expect to be installed. If the
|
|
||||||
flag is set to yes, it should include xmlparse.h. If it is set to
|
|
||||||
no, it should include expat.h. [Justin Erenkrantz]
|
|
||||||
|
|
||||||
*) Fix exporting of includes in apu-config. [Justin Erenkrantz]
|
|
||||||
|
|
||||||
*) Change bucket brigades API to allow a "bucket allocator" to be
|
|
||||||
passed in at certain points. This allows us to implement freelists
|
|
||||||
so that we can stop using malloc/free so frequently.
|
|
||||||
[Cliff Woolley, Brian Pane]
|
|
||||||
|
|
||||||
*) add apr_rmm_realloc() function
|
|
||||||
[Madhusudan Mathihalli <madhusudan_mathihalli@hp.com>]
|
|
||||||
|
|
||||||
*) renames: apr_ansi_time_to_apr_time becomes apr_time_ansi_put
|
|
||||||
ap_exploded_time_t becomes apr_time_exp_t
|
|
||||||
[Thom May <thom@planetarytramp.net>]
|
|
||||||
|
|
||||||
*) Add detection support for FreeBSD's expat and expat2 ports.
|
|
||||||
[Justin Erenkrantz]
|
|
||||||
|
|
||||||
*) Deprecate check_brigade_flush(), which had several nasty bugs, and
|
|
||||||
which was causing apr_brigade_write()'s logic to be less than obvious.
|
|
||||||
Everything is now done in a slightly rearranged apr_brigade_write().
|
|
||||||
[Cliff Woolley]
|
|
||||||
|
|
||||||
*) Don't add /usr/include to the INCLUDES variable on expat's account.
|
|
||||||
[Joe Orton <joe@manyfish.co.uk>]
|
|
||||||
|
|
||||||
*) Remove the autoconf 2.5x cache directory in buildconf.
|
|
||||||
[Joe Orton <joe@manyfish.co.uk>]
|
|
||||||
|
|
||||||
*) BerkleyDB should NULL out the key if it is @EOF in vt_db_nextkey
|
|
||||||
[Ian Holsman]
|
|
||||||
|
|
||||||
*) Add ability to natively fetch and split brigades based on LF lines.
|
|
||||||
[Justin Erenkrantz]
|
|
||||||
|
|
||||||
*) add --with-berkeley-db=DIR & --with-gdbm configure flags
|
|
||||||
[Ian Holsman/Justin Erenkrantz]
|
|
||||||
|
|
||||||
*) Fix expat detection to recognize installed versions.
|
|
||||||
[Eric Gillespie, Jr. <epg@pretzelnet.org>]
|
|
||||||
|
|
||||||
*) Add find_apu.m4 to allow third-party programs that use APR-util
|
|
||||||
to have a standard m4 macro for detection. [Justin Erenkrantz]
|
|
||||||
|
|
||||||
*) Add apu-config - a shell script to allow third-party programs
|
|
||||||
easy access to APR configuration parameters. [Justin Erenkrantz]
|
|
||||||
|
|
||||||
*) Add GMT offset calculation to apr_date_parse_rfc().
|
|
||||||
[Justin Erenkrantz]
|
|
||||||
|
|
||||||
*) Introduce the apr_rmm api, to allow relocatable memory management
|
|
||||||
of address-independent data stores, such as shared memory.
|
|
||||||
[William Rowe]
|
|
||||||
|
|
||||||
*) Rework and fix VPATH-build support. [Justin Erenkrantz]
|
|
||||||
|
|
||||||
*) Add support for Berkeley DB4. [Justin Erenkrantz]
|
|
||||||
|
|
||||||
*) Improve testdbm help. [Justin Erenkrantz]
|
|
||||||
|
|
||||||
*) Improve autoconf detection of DBMs. [Justin Erenkrantz]
|
|
||||||
|
|
||||||
*) BerkeleyDBM v2 now checks minor level for cursor ops [Ian Holsman]
|
|
||||||
|
|
||||||
*) Reading a file bucket bigger than APR_MMAP_LIMIT (4MB) now yields
|
|
||||||
a string of 4MB mmap buckets, rather than a string of 8KB heap buckets
|
|
||||||
plus a 4MB mmap bucket. To accomodate this, the mmap bucket destroy
|
|
||||||
function explicitly deletes the apr_mmap_t after last reference
|
|
||||||
to avoid having too much of a large file mapped at once if possible.
|
|
||||||
[Cliff Woolley]
|
|
||||||
|
|
||||||
*) Multi-DBM support (via apr_dbm_open_ex). [Ian Holsman]
|
|
||||||
|
|
||||||
*) Use apr_mmap_dup in mmap_setaside(). [Brian Pane <bpane@pacbell.net>]
|
|
||||||
|
|
||||||
*) Dropped the "w" parameter from apr_bucket_heap_create() and
|
|
||||||
apr_bucket_heap_make(). That parameter was originally intended
|
|
||||||
to return the amount of data copied into the bucket, but it
|
|
||||||
ended up being unnecessary because that amount is invariant from
|
|
||||||
the size of the data and is available as b->length in the
|
|
||||||
resulting bucket anyway. [Cliff Woolley]
|
|
||||||
|
|
||||||
*) Fix Makefile conversion for BSD/OS. [Cliff Woolley]
|
|
||||||
|
|
||||||
*) Use APR_XtOffsetOf instead of offsetof() in the ring macros for
|
|
||||||
portability. [Cliff Woolley]
|
|
||||||
|
|
||||||
*) We now create exports.c and export_vars.h, which in turn create
|
|
||||||
exports.c. From this we generate two more files with different
|
|
||||||
purposes: aprutil.exp - list of exported symbols; and exports.lo
|
|
||||||
(exports.o) - an object file that can be linked with an executable
|
|
||||||
to force resolution of all apr-util symbols. [Aaron Bannert]
|
|
||||||
|
|
||||||
*) Fix Berkley DBM support [Ian Holsman <ianh@apache.org>]
|
|
||||||
|
|
||||||
*) Fix apr_brigade_vprintf so that it can handle more than
|
|
||||||
4k of data at one time. [Cody Sherr <csherr@covalent.net>]
|
|
||||||
|
|
||||||
*) prefix UNP_* flags with APR_URI_
|
|
||||||
|
|
||||||
rename:
|
|
||||||
apr_uri_components -> apr_uri_t
|
|
||||||
apr_uri_unparse_components -> apr_uri_unparse
|
|
||||||
apr_uri_parse_components -> apr_uri_parse
|
|
||||||
apr_uri_parse_hostinfo_components -> apr_uri_parse_hostinfo
|
|
||||||
|
|
||||||
s/APU_URI_/APR_URI_/g
|
|
||||||
[Perl]
|
|
||||||
|
|
||||||
*) Landed the link-to-LDAP to the build process, and the LDAP v2/v3
|
|
||||||
compatibility functions.
|
|
||||||
[Dave Carrigan <dave@rudedog.org>, Graham Leggett]
|
|
||||||
|
|
||||||
*) Fix URI unparse function to handle the case where it would place a @
|
|
||||||
when both the username and password were present but omitted.
|
|
||||||
[Jon Travis <jtravis@covalent.net]
|
|
||||||
|
|
||||||
*) Added apr_xml_parse_file() routine and a testxml program.
|
|
||||||
[Ian Holsman <ianh@cnet.com>]
|
|
||||||
|
|
||||||
*) Extend apr_bucket struct to add a pointer to a function used
|
|
||||||
to free the bucket. This change enables custom buckets to
|
|
||||||
completely specify how they are to be allocated and freed.
|
|
||||||
Before this change, custom buckets were required to use the
|
|
||||||
same memory allocation scheme as the standard APR buckets.
|
|
||||||
[Saeid Sakhitab, Bill Stoddard, Cliff Woolley, Roy Fielding]
|
|
||||||
|
|
||||||
*) Install Expat when installing APR-util. [Justin Erenkrantz]
|
|
||||||
|
|
||||||
*) Make APR-util configure script rely on APR. This removes the locally
|
|
||||||
generated copy of libtool and uses the one in APR. Fix up how we
|
|
||||||
call the expat configure script. Generate config.nice file.
|
|
||||||
[Justin Erenkrantz]
|
|
||||||
|
|
||||||
*) The apr_bucket lengths are now consistently apr_size_t, while any
|
|
||||||
apr_brigade lengths (short of a read) are consistently apr_off_t.
|
|
||||||
This is required for APR_HAS_LARGE_FILES handling. [William Rowe]
|
|
||||||
|
|
||||||
*) apr_bucket_file_create() and apr_bucket_file_make() now take a pool
|
|
||||||
parameter which is the pool into which any needed data structures
|
|
||||||
should be created during file_read(). This is used for MMAPing the
|
|
||||||
file and reopening the file if the original apr_file_t is in XTHREAD
|
|
||||||
mode. [Cliff Woolley]
|
|
||||||
|
|
||||||
*) apr_brigade_partition() now returns an apr_status_t. [Cliff Woolley]
|
|
||||||
|
|
||||||
*) Add MD4 implementation in crypto. [Sander Striker, Justin Erenkrantz]
|
|
||||||
|
|
||||||
*) Moved httpd 2.0.18's util_date to apr_date and enhanced its parsing
|
|
||||||
capabilities. [Justin Erenkrantz]
|
|
||||||
|
|
||||||
*) Moved httpd 2.0.18's util_uri to apr_uri and name-protected its
|
|
||||||
symbols and functions. [Justin Erenkrantz, Roy Fielding]
|
|
||||||
|
|
||||||
*) Rename field "private" in struct apr_xml_elem to "priv" for C++
|
|
||||||
compatibility. PR #7727 [Joshua MacDonald <jmacd@cs.berkeley.edu>]
|
|
||||||
|
|
||||||
*) Make APR_IMPLEMENT_EXTERNAL_HOOK_BASE generate a
|
|
||||||
${namespace}_hook_get_${hookname} function to fetch the
|
|
||||||
list of registered hooks [Doug MacEachern]
|
|
||||||
|
|
||||||
*) Allow LTFLAGS to be overridden by the configure command-line
|
|
||||||
(default="--silent") and introduce LT_LDFLAGS. [Roy Fielding]
|
|
||||||
|
|
||||||
*) Add APR_SHARELOCK support to apr_sdbm_open(), locking read operations
|
|
||||||
with a shared lock and all write ops with an excl lock. [Will Rowe]
|
|
||||||
|
|
||||||
*) Namespace protect apr_sdbm, and normalize the return values (including
|
|
||||||
the apr_sdbm_fetch, apr_sdbm_firstkey and apr_sdbm_nextkey functions).
|
|
||||||
Normalized the get/clear error function names, and stores the actual
|
|
||||||
apr error for apr_sdbm_error_get. [Will Rowe]
|
|
||||||
|
|
||||||
*) Introduce an apr_fileperms_t argument to apr_dbm_open(). [Will Rowe]
|
|
||||||
|
|
||||||
*) Removed apr_bucket_do_create() macro, which was causing warnings
|
|
||||||
about unreachable code in some compilers (notably MSVC). What
|
|
||||||
used to be done by this macro is now done inline in the various
|
|
||||||
apr_bucket_foo_create() functions. [Cliff Woolley]
|
|
||||||
|
|
||||||
*) Make clean, distclean, and extraclean consistently according to the
|
|
||||||
Gnu makefile guidelines. [Justin Erenkrantz <jerenkrantz@ebuilt.com>]
|
|
||||||
|
|
||||||
*) Migrate the --disable-libtool changes from APR to APR-util.
|
|
||||||
This cleans things up, and allows more flexibility when building
|
|
||||||
programs. [Ryan Bloom]
|
|
||||||
|
|
||||||
*) Allow APR-util to be compiled without libtool. The default is
|
|
||||||
to use libtool, but it can turned off with --disable-libtool
|
|
||||||
on the configure command. [Ryan Bloom]
|
|
||||||
|
|
||||||
*) Repair calling convention for apr_register_optional_fn to
|
|
||||||
eliminate GP fault on Win32. [William Rowe]
|
|
||||||
|
|
||||||
*) Substantial changes to correct linkage and declarations for
|
|
||||||
generic hooks on dso architectures. [Ben Laurie, Will Rowe]
|
|
||||||
|
|
||||||
*) apr_bucket_shared_destroy() now returns a boolean value.
|
|
||||||
[Cliff Woolley]
|
|
||||||
|
|
||||||
*) We have to initialize the heap buckets to the correct length.
|
|
||||||
we were seeing heap buckets with 17 chars in them reporting
|
|
||||||
a length of 9017, because they were initialized to the amount
|
|
||||||
of memory allocated, instead of the amount of memory used.
|
|
||||||
This was only an issue for heap buckets created by the
|
|
||||||
apr_brigade_* functions. [Ryan Bloom]
|
|
||||||
|
|
||||||
*) apr_bucket_init_types() and apr_bucket_insert_type() have been
|
|
||||||
removed... they're not needed anymore. [Cliff Woolley]
|
|
||||||
|
|
||||||
*) The apr_bucket_shared and apr_bucket_simple structures have been
|
|
||||||
removed as an API simplification/optimization. This should be
|
|
||||||
transparent outside APR-util except to callers who attempt to
|
|
||||||
directly manipulate the buckets' internal structure (which is
|
|
||||||
not recommended anyway) and to callers who create their own
|
|
||||||
bucket types. [Cliff Woolley]
|
|
||||||
|
|
||||||
*) apr_bucket_simple_split() and apr_bucket_simple_copy() are now
|
|
||||||
exported functions, which could be helpful in implementing
|
|
||||||
external bucket types. [Cliff Woolley]
|
|
||||||
|
|
||||||
*) The third parameter to apr_bucket_shared_make() is now
|
|
||||||
'apr_off_t length' rather than 'apr_off_t end', since the
|
|
||||||
end usually had to be computed by the caller and all we
|
|
||||||
really want is the length anyway. [Cliff Woolley]
|
|
||||||
|
|
|
@ -1,36 +0,0 @@
|
||||||
cmake_minimum_required(VERSION 2.6)
|
|
||||||
|
|
||||||
INCLUDE_DIRECTORIES(include/)
|
|
||||||
|
|
||||||
add_definitions(-DHAVE_CONFIG_H -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK)
|
|
||||||
INCLUDE_DIRECTORIES(BEFORE ${CMAKE_SOURCE_DIR}/libs/apr-util/include ${CMAKE_SOURCE_DIR}/libs/apr-util/include/private ${CMAKE_SOURCE_DIR}/libs/apr/include)
|
|
||||||
|
|
||||||
|
|
||||||
SET (apr-util_SRCS
|
|
||||||
crypto/apr_md5.c
|
|
||||||
crypto/uuid.c
|
|
||||||
crypto/apr_sha1.c
|
|
||||||
crypto/getuuid.c
|
|
||||||
crypto/apr_md4.c
|
|
||||||
encoding/apr_base64.c
|
|
||||||
hooks/apr_hooks.c
|
|
||||||
misc/apr_reslist.c
|
|
||||||
misc/apr_rmm.c
|
|
||||||
misc/apr_date.c
|
|
||||||
misc/apu_version.c
|
|
||||||
misc/apr_queue.c
|
|
||||||
uri/apr_uri.c
|
|
||||||
strmatch/apr_strmatch.c
|
|
||||||
xlate/xlate.c
|
|
||||||
)
|
|
||||||
|
|
||||||
LINK_LIBRARIES ("-liconv -ldl -lpthread")
|
|
||||||
|
|
||||||
ADD_LIBRARY(apr-util STATIC ${apr-util_SRCS})
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,14 +0,0 @@
|
||||||
The MySQL driver is not distributed from apache.org due to licensing issues.
|
|
||||||
|
|
||||||
If you wish to build the driver, download apr_dbd_mysql.c from
|
|
||||||
http://apache.webthing.com/database/
|
|
||||||
and copy it into the dbd directory.
|
|
||||||
Now run buildconf, followed by configure.
|
|
||||||
|
|
||||||
It is distributed under the GPL to conform with MySQL License terms
|
|
||||||
This means it cannot be distributed from apache.org, as that would
|
|
||||||
violate ASF policy.
|
|
||||||
|
|
||||||
Using the driver with APR and Apache is of course allowed,
|
|
||||||
and there is no problem with a third party bundling the driver,
|
|
||||||
provided you respect both the ASF and GPL licenses.
|
|
|
@ -1,404 +0,0 @@
|
||||||
Apache License
|
|
||||||
Version 2.0, January 2004
|
|
||||||
http://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction,
|
|
||||||
and distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by
|
|
||||||
the copyright owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all
|
|
||||||
other entities that control, are controlled by, or are under common
|
|
||||||
control with that entity. For the purposes of this definition,
|
|
||||||
"control" means (i) the power, direct or indirect, to cause the
|
|
||||||
direction or management of such entity, whether by contract or
|
|
||||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
exercising permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation
|
|
||||||
source, and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical
|
|
||||||
transformation or translation of a Source form, including but
|
|
||||||
not limited to compiled object code, generated documentation,
|
|
||||||
and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or
|
|
||||||
Object form, made available under the License, as indicated by a
|
|
||||||
copyright notice that is included in or attached to the work
|
|
||||||
(an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
form, that is based on (or derived from) the Work and for which the
|
|
||||||
editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
of this License, Derivative Works shall not include works that remain
|
|
||||||
separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including
|
|
||||||
the original version of the Work and any modifications or additions
|
|
||||||
to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
means any form of electronic, verbal, or written communication sent
|
|
||||||
to the Licensor or its representatives, including but not limited to
|
|
||||||
communication on electronic mailing lists, source code control systems,
|
|
||||||
and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
excluding communication that is conspicuously marked or otherwise
|
|
||||||
designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
Work and such Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
(except as stated in this section) patent license to make, have made,
|
|
||||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
||||||
where such license applies only to those patent claims licensable
|
|
||||||
by such Contributor that are necessarily infringed by their
|
|
||||||
Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
institute patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
or a Contribution incorporated within the Work constitutes direct
|
|
||||||
or contributory patent infringement, then any patent licenses
|
|
||||||
granted to You under this License for that Work shall terminate
|
|
||||||
as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
Work or Derivative Works thereof in any medium, with or without
|
|
||||||
modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
(a) You must give any other recipients of the Work or
|
|
||||||
Derivative Works a copy of this License; and
|
|
||||||
|
|
||||||
(b) You must cause any modified files to carry prominent notices
|
|
||||||
stating that You changed the files; and
|
|
||||||
|
|
||||||
(c) You must retain, in the Source form of any Derivative Works
|
|
||||||
that You distribute, all copyright, patent, trademark, and
|
|
||||||
attribution notices from the Source form of the Work,
|
|
||||||
excluding those notices that do not pertain to any part of
|
|
||||||
the Derivative Works; and
|
|
||||||
|
|
||||||
(d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
distribution, then any Derivative Works that You distribute must
|
|
||||||
include a readable copy of the attribution notices contained
|
|
||||||
within such NOTICE file, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works, in at least one
|
|
||||||
of the following places: within a NOTICE text file distributed
|
|
||||||
as part of the Derivative Works; within the Source form or
|
|
||||||
documentation, if provided along with the Derivative Works; or,
|
|
||||||
within a display generated by the Derivative Works, if and
|
|
||||||
wherever such third-party notices normally appear. The contents
|
|
||||||
of the NOTICE file are for informational purposes only and
|
|
||||||
do not modify the License. You may add Your own attribution
|
|
||||||
notices within Derivative Works that You distribute, alongside
|
|
||||||
or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
that such additional attribution notices cannot be construed
|
|
||||||
as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and
|
|
||||||
may provide additional or different license terms and conditions
|
|
||||||
for use, reproduction, or distribution of Your modifications, or
|
|
||||||
for any such Derivative Works as a whole, provided Your use,
|
|
||||||
reproduction, and distribution of the Work otherwise complies with
|
|
||||||
the conditions stated in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
by You to the Licensor shall be under the terms and conditions of
|
|
||||||
this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
the terms of any separate license agreement you may have executed
|
|
||||||
with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
except as required for reasonable and customary use in describing the
|
|
||||||
origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
agreed to in writing, Licensor provides the Work (and each
|
|
||||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
implied, including, without limitation, any warranties or conditions
|
|
||||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
appropriateness of using or redistributing the Work and assume any
|
|
||||||
risks associated with Your exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
whether in tort (including negligence), contract, or otherwise,
|
|
||||||
unless required by applicable law (such as deliberate and grossly
|
|
||||||
negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
liable to You for damages, including any direct, indirect, special,
|
|
||||||
incidental, or consequential damages of any character arising as a
|
|
||||||
result of this License or out of the use or inability to use the
|
|
||||||
Work (including but not limited to damages for loss of goodwill,
|
|
||||||
work stoppage, computer failure or malfunction, or any and all
|
|
||||||
other commercial damages or losses), even if such Contributor
|
|
||||||
has been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
or other liability obligations and/or rights consistent with this
|
|
||||||
License. However, in accepting such obligations, You may act only
|
|
||||||
on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
of any other Contributor, and only if You agree to indemnify,
|
|
||||||
defend, and hold each Contributor harmless for any liability
|
|
||||||
incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
of your accepting any such warranty or additional liability.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
APPENDIX: How to apply the Apache License to your work.
|
|
||||||
|
|
||||||
To apply the Apache License to your work, attach the following
|
|
||||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
||||||
replaced with your own identifying information. (Don't include
|
|
||||||
the brackets!) The text should be enclosed in the appropriate
|
|
||||||
comment syntax for the file format. We also recommend that a
|
|
||||||
file or class name and description of purpose be included on the
|
|
||||||
same "printed page" as the copyright notice for easier
|
|
||||||
identification within third-party archives.
|
|
||||||
|
|
||||||
Copyright [yyyy] [name of copyright owner]
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
APACHE PORTABLE RUNTIME SUBCOMPONENTS:
|
|
||||||
|
|
||||||
The Apache Portable Runtime includes a number of subcomponents with
|
|
||||||
separate copyright notices and license terms. Your use of the source
|
|
||||||
code for the these subcomponents is subject to the terms and
|
|
||||||
conditions of the following licenses.
|
|
||||||
|
|
||||||
For the include\apr_md5.h component:
|
|
||||||
/*
|
|
||||||
* This is work is derived from material Copyright RSA Data Security, Inc.
|
|
||||||
*
|
|
||||||
* The RSA copyright statement and Licence for that original material is
|
|
||||||
* included below. This is followed by the Apache copyright statement and
|
|
||||||
* licence for the modifications made to that material.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
|
|
||||||
rights reserved.
|
|
||||||
|
|
||||||
License to copy and use this software is granted provided that it
|
|
||||||
is identified as the "RSA Data Security, Inc. MD5 Message-Digest
|
|
||||||
Algorithm" in all material mentioning or referencing this software
|
|
||||||
or this function.
|
|
||||||
|
|
||||||
License is also granted to make and use derivative works provided
|
|
||||||
that such works are identified as "derived from the RSA Data
|
|
||||||
Security, Inc. MD5 Message-Digest Algorithm" in all material
|
|
||||||
mentioning or referencing the derived work.
|
|
||||||
|
|
||||||
RSA Data Security, Inc. makes no representations concerning either
|
|
||||||
the merchantability of this software or the suitability of this
|
|
||||||
software for any particular purpose. It is provided "as is"
|
|
||||||
without express or implied warranty of any kind.
|
|
||||||
|
|
||||||
These notices must be retained in any copies of any part of this
|
|
||||||
documentation and/or software.
|
|
||||||
*/
|
|
||||||
|
|
||||||
For the passwd\apr_md5.c component:
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This is work is derived from material Copyright RSA Data Security, Inc.
|
|
||||||
*
|
|
||||||
* The RSA copyright statement and Licence for that original material is
|
|
||||||
* included below. This is followed by the Apache copyright statement and
|
|
||||||
* licence for the modifications made to that material.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
|
|
||||||
rights reserved.
|
|
||||||
|
|
||||||
License to copy and use this software is granted provided that it
|
|
||||||
is identified as the "RSA Data Security, Inc. MD5 Message-Digest
|
|
||||||
Algorithm" in all material mentioning or referencing this software
|
|
||||||
or this function.
|
|
||||||
|
|
||||||
License is also granted to make and use derivative works provided
|
|
||||||
that such works are identified as "derived from the RSA Data
|
|
||||||
Security, Inc. MD5 Message-Digest Algorithm" in all material
|
|
||||||
mentioning or referencing the derived work.
|
|
||||||
|
|
||||||
RSA Data Security, Inc. makes no representations concerning either
|
|
||||||
the merchantability of this software or the suitability of this
|
|
||||||
software for any particular purpose. It is provided "as is"
|
|
||||||
without express or implied warranty of any kind.
|
|
||||||
|
|
||||||
These notices must be retained in any copies of any part of this
|
|
||||||
documentation and/or software.
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* The apr_md5_encode() routine uses much code obtained from the FreeBSD 3.0
|
|
||||||
* MD5 crypt() function, which is licenced as follows:
|
|
||||||
* ----------------------------------------------------------------------------
|
|
||||||
* "THE BEER-WARE LICENSE" (Revision 42):
|
|
||||||
* <phk@login.dknet.dk> wrote this file. As long as you retain this notice you
|
|
||||||
* can do whatever you want with this stuff. If we meet some day, and you think
|
|
||||||
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
|
|
||||||
* ----------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
For the crypto\apr_md4.c component:
|
|
||||||
|
|
||||||
* This is derived from material copyright RSA Data Security, Inc.
|
|
||||||
* Their notice is reproduced below in its entirety.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
|
|
||||||
* rights reserved.
|
|
||||||
*
|
|
||||||
* License to copy and use this software is granted provided that it
|
|
||||||
* is identified as the "RSA Data Security, Inc. MD4 Message-Digest
|
|
||||||
* Algorithm" in all material mentioning or referencing this software
|
|
||||||
* or this function.
|
|
||||||
*
|
|
||||||
* License is also granted to make and use derivative works provided
|
|
||||||
* that such works are identified as "derived from the RSA Data
|
|
||||||
* Security, Inc. MD4 Message-Digest Algorithm" in all material
|
|
||||||
* mentioning or referencing the derived work.
|
|
||||||
*
|
|
||||||
* RSA Data Security, Inc. makes no representations concerning either
|
|
||||||
* the merchantability of this software or the suitability of this
|
|
||||||
* software for any particular purpose. It is provided "as is"
|
|
||||||
* without express or implied warranty of any kind.
|
|
||||||
*
|
|
||||||
* These notices must be retained in any copies of any part of this
|
|
||||||
* documentation and/or software.
|
|
||||||
*/
|
|
||||||
|
|
||||||
For the include\apr_md4.h component:
|
|
||||||
|
|
||||||
*
|
|
||||||
* This is derived from material copyright RSA Data Security, Inc.
|
|
||||||
* Their notice is reproduced below in its entirety.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
|
|
||||||
* rights reserved.
|
|
||||||
*
|
|
||||||
* License to copy and use this software is granted provided that it
|
|
||||||
* is identified as the "RSA Data Security, Inc. MD4 Message-Digest
|
|
||||||
* Algorithm" in all material mentioning or referencing this software
|
|
||||||
* or this function.
|
|
||||||
*
|
|
||||||
* License is also granted to make and use derivative works provided
|
|
||||||
* that such works are identified as "derived from the RSA Data
|
|
||||||
* Security, Inc. MD4 Message-Digest Algorithm" in all material
|
|
||||||
* mentioning or referencing the derived work.
|
|
||||||
*
|
|
||||||
* RSA Data Security, Inc. makes no representations concerning either
|
|
||||||
* the merchantability of this software or the suitability of this
|
|
||||||
* software for any particular purpose. It is provided "as is"
|
|
||||||
* without express or implied warranty of any kind.
|
|
||||||
*
|
|
||||||
* These notices must be retained in any copies of any part of this
|
|
||||||
* documentation and/or software.
|
|
||||||
*/
|
|
||||||
|
|
||||||
For the test\testmd4.c component:
|
|
||||||
|
|
||||||
*
|
|
||||||
* This is derived from material copyright RSA Data Security, Inc.
|
|
||||||
* Their notice is reproduced below in its entirety.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All
|
|
||||||
* rights reserved.
|
|
||||||
*
|
|
||||||
* RSA Data Security, Inc. makes no representations concerning either
|
|
||||||
* the merchantability of this software or the suitability of this
|
|
||||||
* software for any particular purpose. It is provided "as is"
|
|
||||||
* without express or implied warranty of any kind.
|
|
||||||
*
|
|
||||||
* These notices must be retained in any copies of any part of this
|
|
||||||
* documentation and/or software.
|
|
||||||
*/
|
|
||||||
|
|
||||||
For the xml\expat\conftools\install-sh component:
|
|
||||||
|
|
||||||
#
|
|
||||||
# install - install a program, script, or datafile
|
|
||||||
# This comes from X11R5 (mit/util/scripts/install.sh).
|
|
||||||
#
|
|
||||||
# Copyright 1991 by the Massachusetts Institute of Technology
|
|
||||||
#
|
|
||||||
# Permission to use, copy, modify, distribute, and sell this software and its
|
|
||||||
# documentation for any purpose is hereby granted without fee, provided that
|
|
||||||
# the above copyright notice appear in all copies and that both that
|
|
||||||
# copyright notice and this permission notice appear in supporting
|
|
||||||
# documentation, and that the name of M.I.T. not be used in advertising or
|
|
||||||
# publicity pertaining to distribution of the software without specific,
|
|
||||||
# written prior permission. M.I.T. makes no representations about the
|
|
||||||
# suitability of this software for any purpose. It is provided "as is"
|
|
||||||
# without express or implied warranty.
|
|
||||||
#
|
|
||||||
|
|
||||||
For the expat xml parser component:
|
|
||||||
|
|
||||||
Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
|
|
||||||
and Clark Cooper
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
"Software"), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included
|
|
||||||
in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
||||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
||||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
||||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
====================================================================
|
|
|
@ -1,91 +0,0 @@
|
||||||
#
|
|
||||||
# Top-level Makefile for APRUTIL
|
|
||||||
#
|
|
||||||
CPP = @CPP@
|
|
||||||
|
|
||||||
# gets substituted into some targets
|
|
||||||
APRUTIL_MAJOR_VERSION=@APRUTIL_MAJOR_VERSION@
|
|
||||||
APRUTIL_DOTTED_VERSION=@APRUTIL_DOTTED_VERSION@
|
|
||||||
|
|
||||||
srcdir = @srcdir@
|
|
||||||
VPATH = @srcdir@
|
|
||||||
|
|
||||||
INCLUDES = @APRUTIL_PRIV_INCLUDES@ @APR_INCLUDES@ @APRUTIL_INCLUDES@
|
|
||||||
APRUTIL_LDFLAGS = @APRUTIL_LDFLAGS@
|
|
||||||
APRUTIL_LIBS = @APRUTIL_LIBS@
|
|
||||||
|
|
||||||
TARGET_LIB = lib@APRUTIL_LIBNAME@.la
|
|
||||||
INSTALL_SUBDIRS = @APR_ICONV_DIR@ @APR_XML_DIR@
|
|
||||||
EXTRA_SOURCE_DIRS = @APR_ICONV_DIR@ @APR_XML_DIR@
|
|
||||||
APRUTIL_PCFILE = apr-util-$(APRUTIL_MAJOR_VERSION).pc
|
|
||||||
APU_CONFIG = apu-$(APRUTIL_MAJOR_VERSION)-config
|
|
||||||
INSTALL = @INSTALL@
|
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
|
||||||
|
|
||||||
TARGETS = $(TARGET_LIB) aprutil.exp
|
|
||||||
|
|
||||||
# bring in rules.mk for standard functionality
|
|
||||||
@INCLUDE_RULES@
|
|
||||||
@INCLUDE_OUTPUTS@
|
|
||||||
|
|
||||||
CLEAN_SUBDIRS = test @APR_ICONV_DIR@
|
|
||||||
|
|
||||||
CLEAN_TARGETS = exports.c export_vars.c aprutil.exp .make.dirs apu-config.out
|
|
||||||
DISTCLEAN_TARGETS = config.cache config.log config.status libtool \
|
|
||||||
include/private/apu_config.h include/private/apu_private.h \
|
|
||||||
include/private/apu_select_dbm.h include/apr_ldap.h include/apu.h \
|
|
||||||
export_vars.sh $(APU_CONFIG) build/rules.mk include/apu_want.h \
|
|
||||||
apr-util.pc build/pkg/pkginfo
|
|
||||||
EXTRACLEAN_TARGETS = configure aclocal.m4 include/private/apu_config.h.in \
|
|
||||||
exports.c build-outputs.mk \
|
|
||||||
build/apr_common.m4 build/find_apr.m4 build/install.sh \
|
|
||||||
build/config.guess build/config.sub
|
|
||||||
|
|
||||||
prefix=@prefix@
|
|
||||||
exec_prefix=@exec_prefix@
|
|
||||||
bindir=@bindir@
|
|
||||||
libdir=@libdir@
|
|
||||||
includedir=@includedir@
|
|
||||||
top_srcdir=@abs_srcdir@
|
|
||||||
top_blddir=@abs_builddir@
|
|
||||||
|
|
||||||
# Create apu-config script suitable for the install tree
|
|
||||||
apu-config.out: $(APU_CONFIG)
|
|
||||||
sed 's,^\(location=\).*$$,\1installed,' < $(APU_CONFIG) > $@
|
|
||||||
|
|
||||||
install: $(TARGET_LIB) apu-config.out
|
|
||||||
$(APR_MKDIR) $(DESTDIR)$(includedir) $(DESTDIR)$(libdir)/pkgconfig \
|
|
||||||
$(DESTDIR)$(libdir) $(DESTDIR)$(bindir)
|
|
||||||
for f in $(top_srcdir)/include/*.h $(top_blddir)/include/*.h; do \
|
|
||||||
$(INSTALL_DATA) $${f} $(DESTDIR)$(includedir); \
|
|
||||||
done
|
|
||||||
$(INSTALL_DATA) apr-util.pc $(DESTDIR)$(libdir)/pkgconfig/$(APRUTIL_PCFILE)
|
|
||||||
list='$(INSTALL_SUBDIRS)'; for i in $$list; do \
|
|
||||||
( cd $$i ; $(MAKE) DESTDIR=$(DESTDIR) install ); \
|
|
||||||
done
|
|
||||||
$(LIBTOOL) --mode=install $(INSTALL) -m 755 $(TARGET_LIB) $(DESTDIR)$(libdir)
|
|
||||||
$(INSTALL_DATA) aprutil.exp $(DESTDIR)$(libdir)
|
|
||||||
$(INSTALL) -m 755 apu-config.out $(DESTDIR)$(bindir)/$(APU_CONFIG)
|
|
||||||
|
|
||||||
$(TARGET_LIB): $(OBJECTS)
|
|
||||||
$(LINK) @lib_target@ $(ALL_LIBS) $(APRUTIL_LDFLAGS) $(APRUTIL_LIBS)
|
|
||||||
|
|
||||||
exports.c: $(HEADERS)
|
|
||||||
$(APR_MKEXPORT) $(HEADERS) > $@
|
|
||||||
|
|
||||||
export_vars.c: $(HEADERS)
|
|
||||||
$(APR_MKVAREXPORT) $(HEADERS) > $@
|
|
||||||
|
|
||||||
aprutil.exp: exports.c export_vars.c
|
|
||||||
@echo "#! lib@APRUTIL_LIBNAME@.so" > $@
|
|
||||||
@echo "* This file was AUTOGENERATED at build time." >> $@
|
|
||||||
@echo "* Please do not edit by hand." >> $@
|
|
||||||
$(CPP) $(ALL_CPPFLAGS) $(ALL_INCLUDES) exports.c | grep "ap_hack_" | sed -e 's/^.*[)]\(.*\);$$/\1/' >> $@
|
|
||||||
$(CPP) $(ALL_CPPFLAGS) $(ALL_INCLUDES) export_vars.c | sed -e 's/^\#[^!]*//' | sed -e '/^$$/d' >> $@
|
|
||||||
|
|
||||||
dox:
|
|
||||||
doxygen $(top_srcdir)/docs/doxygen.conf
|
|
||||||
|
|
||||||
test: check
|
|
||||||
check: $(TARGET_LIB)
|
|
||||||
cd test && $(MAKE) check
|
|
|
@ -1,11 +0,0 @@
|
||||||
This product includes software developed by
|
|
||||||
The Apache Software Foundation (http://www.apache.org/).
|
|
||||||
|
|
||||||
Portions of this software were developed at the National Center
|
|
||||||
for Supercomputing Applications (NCSA) at the University of
|
|
||||||
Illinois at Urbana-Champaign.
|
|
||||||
|
|
||||||
This software contains code derived from the RSA Data Security
|
|
||||||
Inc. MD5 Message-Digest Algorithm, including various
|
|
||||||
modifications by Spyglass Inc., Carnegie Mellon University, and
|
|
||||||
Bell Communications Research, Inc (Bellcore).
|
|
|
@ -1,292 +0,0 @@
|
||||||
#
|
|
||||||
# Declare the sub-directories to be built here
|
|
||||||
#
|
|
||||||
|
|
||||||
SUBDIRS = \
|
|
||||||
ldap \
|
|
||||||
xml \
|
|
||||||
$(EOLIST)
|
|
||||||
|
|
||||||
#
|
|
||||||
# Get the 'head' of the build environment. This includes default targets and
|
|
||||||
# paths to tools
|
|
||||||
#
|
|
||||||
|
|
||||||
include $(APR_WORK)\build\NWGNUhead.inc
|
|
||||||
|
|
||||||
#
|
|
||||||
# Make sure all needed macro's are defined
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# These directories will be at the beginning of the include list, followed by
|
|
||||||
# INCDIRS
|
|
||||||
#
|
|
||||||
XINCDIRS += \
|
|
||||||
$(APR)/include \
|
|
||||||
$(APR)/include/arch/NetWare \
|
|
||||||
$(APRUTIL)/include \
|
|
||||||
$(APRUTIL)/uri \
|
|
||||||
$(APRUTIL)/dbm/sdbm \
|
|
||||||
$(APRUTIL)/include/private \
|
|
||||||
$(APRUTIL)/xml/expat/lib \
|
|
||||||
$(LDAPSDK)/inc \
|
|
||||||
$(EOLIST)
|
|
||||||
|
|
||||||
#
|
|
||||||
# These flags will come after CFLAGS
|
|
||||||
#
|
|
||||||
XCFLAGS += \
|
|
||||||
$(EOLIST)
|
|
||||||
|
|
||||||
#
|
|
||||||
# These defines will come after DEFINES
|
|
||||||
#
|
|
||||||
XDEFINES += \
|
|
||||||
$(EOLIST)
|
|
||||||
|
|
||||||
#
|
|
||||||
# These flags will be added to the link.opt file
|
|
||||||
#
|
|
||||||
XLFLAGS += \
|
|
||||||
$(EOLIST)
|
|
||||||
|
|
||||||
#
|
|
||||||
# These values will be appended to the correct variables based on the value of
|
|
||||||
# RELEASE
|
|
||||||
#
|
|
||||||
ifeq "$(RELEASE)" "debug"
|
|
||||||
XINCDIRS += \
|
|
||||||
$(EOLIST)
|
|
||||||
|
|
||||||
XCFLAGS += \
|
|
||||||
$(EOLIST)
|
|
||||||
|
|
||||||
XDEFINES += \
|
|
||||||
$(EOLIST)
|
|
||||||
|
|
||||||
XLFLAGS += \
|
|
||||||
$(EOLIST)
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq "$(RELEASE)" "noopt"
|
|
||||||
XINCDIRS += \
|
|
||||||
$(EOLIST)
|
|
||||||
|
|
||||||
XCFLAGS += \
|
|
||||||
$(EOLIST)
|
|
||||||
|
|
||||||
XDEFINES += \
|
|
||||||
$(EOLIST)
|
|
||||||
|
|
||||||
XLFLAGS += \
|
|
||||||
$(EOLIST)
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq "$(RELEASE)" "release"
|
|
||||||
XINCDIRS += \
|
|
||||||
$(EOLIST)
|
|
||||||
|
|
||||||
XCFLAGS += \
|
|
||||||
$(EOLIST)
|
|
||||||
|
|
||||||
XDEFINES += \
|
|
||||||
$(EOLIST)
|
|
||||||
|
|
||||||
XLFLAGS += \
|
|
||||||
$(EOLIST)
|
|
||||||
endif
|
|
||||||
|
|
||||||
#
|
|
||||||
# These are used by the link target if an NLM is being generated
|
|
||||||
# This is used by the link 'name' directive to name the nlm. If left blank
|
|
||||||
# TARGET_nlm (see below) will be used.
|
|
||||||
#
|
|
||||||
NLM_NAME =
|
|
||||||
|
|
||||||
#
|
|
||||||
# This is used by the link '-desc ' directive.
|
|
||||||
# If left blank, NLM_NAME will be used.
|
|
||||||
#
|
|
||||||
NLM_DESCRIPTION =
|
|
||||||
|
|
||||||
#
|
|
||||||
# This is used by the '-threadname' directive. If left blank,
|
|
||||||
# NLM_NAME Thread will be used.
|
|
||||||
#
|
|
||||||
NLM_THREAD_NAME =
|
|
||||||
#
|
|
||||||
# If this is specified, it will override VERSION value in
|
|
||||||
# $(APR_WORK)\build\NWGNUenvironment.inc
|
|
||||||
#
|
|
||||||
NLM_VERSION =
|
|
||||||
|
|
||||||
#
|
|
||||||
# If this is specified, it will override the default of 64K
|
|
||||||
#
|
|
||||||
NLM_STACK_SIZE =
|
|
||||||
|
|
||||||
#
|
|
||||||
# If this is specified it will be used by the link '-entry' directive
|
|
||||||
#
|
|
||||||
NLM_ENTRY_SYM =
|
|
||||||
|
|
||||||
#
|
|
||||||
# If this is specified it will be used by the link '-exit' directive
|
|
||||||
#
|
|
||||||
NLM_EXIT_SYM =
|
|
||||||
|
|
||||||
#
|
|
||||||
# If this is specified it will be used by the link '-check' directive
|
|
||||||
#
|
|
||||||
NLM_CHECK_SYM =
|
|
||||||
|
|
||||||
#
|
|
||||||
# If this is specified it will be used by the link '-flags' directive
|
|
||||||
#
|
|
||||||
NLM_FLAGS =
|
|
||||||
|
|
||||||
#
|
|
||||||
# If this is specified it will be linked in with the XDCData option in the def
|
|
||||||
# file instead of the default of $(APR)/misc/netware/apache.xdc. XDCData can
|
|
||||||
# be disabled by setting APACHE_UNIPROC in the environment
|
|
||||||
#
|
|
||||||
XDCDATA =
|
|
||||||
|
|
||||||
#
|
|
||||||
# Declare all target files (you must add your files here)
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# If there is an NLM target, put it here
|
|
||||||
#
|
|
||||||
TARGET_nlm = \
|
|
||||||
$(EOLIST)
|
|
||||||
|
|
||||||
#
|
|
||||||
# If there is an LIB target, put it here
|
|
||||||
#
|
|
||||||
TARGET_lib = \
|
|
||||||
$(OBJDIR)/aprutil.lib \
|
|
||||||
$(EOLIST)
|
|
||||||
|
|
||||||
#
|
|
||||||
# These are the OBJ files needed to create the NLM target above.
|
|
||||||
# Paths must all use the '/' character
|
|
||||||
#
|
|
||||||
FILES_nlm_objs = \
|
|
||||||
$(EOLIST)
|
|
||||||
|
|
||||||
#
|
|
||||||
# These are the LIB files needed to create the NLM target above.
|
|
||||||
# These will be added as a library command in the link.opt file.
|
|
||||||
#
|
|
||||||
FILES_nlm_libs = \
|
|
||||||
$(EOLIST)
|
|
||||||
|
|
||||||
#
|
|
||||||
# These are the modules that the above NLM target depends on to load.
|
|
||||||
# These will be added as a module command in the link.opt file.
|
|
||||||
#
|
|
||||||
FILES_nlm_modules = \
|
|
||||||
$(EOLIST)
|
|
||||||
|
|
||||||
#
|
|
||||||
# If the nlm has a msg file, put it's path here
|
|
||||||
#
|
|
||||||
FILE_nlm_msg =
|
|
||||||
|
|
||||||
#
|
|
||||||
# If the nlm has a hlp file put it's path here
|
|
||||||
#
|
|
||||||
FILE_nlm_hlp =
|
|
||||||
|
|
||||||
#
|
|
||||||
# If this is specified, it will override $(NWOS)\copyright.txt.
|
|
||||||
#
|
|
||||||
FILE_nlm_copyright =
|
|
||||||
|
|
||||||
#
|
|
||||||
# Any additional imports go here
|
|
||||||
#
|
|
||||||
FILES_nlm_Ximports = \
|
|
||||||
$(EOLIST)
|
|
||||||
|
|
||||||
#
|
|
||||||
# Any symbols exported to here
|
|
||||||
#
|
|
||||||
FILES_nlm_exports = \
|
|
||||||
$(EOLIST)
|
|
||||||
|
|
||||||
#
|
|
||||||
# These are the OBJ files needed to create the LIB target above.
|
|
||||||
# Paths must all use the '/' character
|
|
||||||
#
|
|
||||||
FILES_lib_objs = \
|
|
||||||
$(OBJDIR)/apr_base64.o \
|
|
||||||
$(OBJDIR)/apr_brigade.o \
|
|
||||||
$(OBJDIR)/apr_buckets.o \
|
|
||||||
$(OBJDIR)/apr_buckets_alloc.o \
|
|
||||||
$(OBJDIR)/apr_buckets_eos.o \
|
|
||||||
$(OBJDIR)/apr_buckets_file.o \
|
|
||||||
$(OBJDIR)/apr_buckets_flush.o \
|
|
||||||
$(OBJDIR)/apr_buckets_heap.o \
|
|
||||||
$(OBJDIR)/apr_buckets_mmap.o \
|
|
||||||
$(OBJDIR)/apr_buckets_pipe.o \
|
|
||||||
$(OBJDIR)/apr_buckets_pool.o \
|
|
||||||
$(OBJDIR)/apr_buckets_refcount.o \
|
|
||||||
$(OBJDIR)/apr_buckets_simple.o \
|
|
||||||
$(OBJDIR)/apr_buckets_socket.o \
|
|
||||||
$(OBJDIR)/apr_date.o \
|
|
||||||
$(OBJDIR)/apr_dbm.o \
|
|
||||||
$(OBJDIR)/apr_dbd.o \
|
|
||||||
$(OBJDIR)/apr_dbd_pgsql.o \
|
|
||||||
$(OBJDIR)/apr_dbm_berkeleydb.o \
|
|
||||||
$(OBJDIR)/apr_dbm_sdbm.o \
|
|
||||||
$(OBJDIR)/apr_hooks.o \
|
|
||||||
$(OBJDIR)/apr_md4.o \
|
|
||||||
$(OBJDIR)/apr_md5.o \
|
|
||||||
$(OBJDIR)/apr_queue.o \
|
|
||||||
$(OBJDIR)/apr_reslist.o \
|
|
||||||
$(OBJDIR)/apr_rmm.o \
|
|
||||||
$(OBJDIR)/apr_sha1.o \
|
|
||||||
$(OBJDIR)/apu_version.o \
|
|
||||||
$(OBJDIR)/getuuid.o \
|
|
||||||
$(OBJDIR)/uuid.o \
|
|
||||||
$(OBJDIR)/apr_strmatch.o \
|
|
||||||
$(OBJDIR)/apr_uri.o \
|
|
||||||
$(OBJDIR)/sdbm.o \
|
|
||||||
$(OBJDIR)/sdbm_hash.o \
|
|
||||||
$(OBJDIR)/sdbm_lock.o \
|
|
||||||
$(OBJDIR)/sdbm_pair.o \
|
|
||||||
$(OBJDIR)/xlate.o \
|
|
||||||
$(EOLIST)
|
|
||||||
|
|
||||||
#
|
|
||||||
# implement targets and dependancies (leave this section alone)
|
|
||||||
#
|
|
||||||
|
|
||||||
libs :: $(OBJDIR) $(TARGET_lib)
|
|
||||||
|
|
||||||
nlms :: libs $(TARGET_nlm)
|
|
||||||
|
|
||||||
#
|
|
||||||
# Updated this target to create necessary directories and copy files to the
|
|
||||||
# correct place. (See $(APR_WORK)\build\NWGNUhead.inc for examples)
|
|
||||||
#
|
|
||||||
install :: nlms FORCE
|
|
||||||
|
|
||||||
#
|
|
||||||
# Any specialized rules here
|
|
||||||
#
|
|
||||||
|
|
||||||
vpath %.c buckets:crypto:dbd:dbm:dbm/sdbm:encoding:hooks:ldap:misc:strmatch:uri:xlate:xml
|
|
||||||
|
|
||||||
#
|
|
||||||
# Include the 'tail' makefile that has targets that depend on variables defined
|
|
||||||
# in this makefile
|
|
||||||
#
|
|
||||||
|
|
||||||
include $(APR_WORK)\build\NWGNUtail.inc
|
|
||||||
|
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
prefix=@prefix@
|
|
||||||
exec_prefix=@exec_prefix@
|
|
||||||
libdir=@libdir@
|
|
||||||
APRUTIL_MAJOR_VERSION=@APRUTIL_MAJOR_VERSION@
|
|
||||||
includedir=@includedir@
|
|
||||||
|
|
||||||
Name: APR Utils
|
|
||||||
Description: Companion library for APR
|
|
||||||
Version: @APRUTIL_DOTTED_VERSION@
|
|
||||||
# assume that apr-util requires libapr of same major version
|
|
||||||
Requires: apr-@APRUTIL_MAJOR_VERSION@
|
|
||||||
Libs: -L${libdir} -l@APRUTIL_LIBNAME@ @APRUTIL_EXPORT_LIBS@
|
|
||||||
Cflags: -I${includedir}
|
|
|
@ -1,89 +0,0 @@
|
||||||
|
|
||||||
%define apuver 1
|
|
||||||
|
|
||||||
Summary: Apache Portable Runtime Utility library
|
|
||||||
Name: apr-util
|
|
||||||
Version: 1.2.8
|
|
||||||
Release: 1
|
|
||||||
License: Apache Software License
|
|
||||||
Group: System Environment/Libraries
|
|
||||||
URL: http://apr.apache.org/
|
|
||||||
Source0: %{name}-%{version}.tar.gz
|
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot
|
|
||||||
BuildPrereq: autoconf, libtool, doxygen, apr-devel >= 0:{version}-{release}
|
|
||||||
BuildPrereq: openldap-devel, db4-devel, expat-devel
|
|
||||||
Conflicts: subversion < 0.20.1-2
|
|
||||||
|
|
||||||
%description
|
|
||||||
The mission of the Apache Portable Runtime (APR) is to provide a
|
|
||||||
free library of C data structures and routines. This library
|
|
||||||
contains additional utility interfaces for APR; including support
|
|
||||||
for XML, LDAP, database interfaces, URI parsing and more.
|
|
||||||
|
|
||||||
%package devel
|
|
||||||
Group: Development/Libraries
|
|
||||||
Summary: APR utility library development kit
|
|
||||||
Requires: apr-util = %{version}-%{release}, apr-devel
|
|
||||||
Requires: openldap-devel, db4-devel, expat-devel
|
|
||||||
Conflicts: subversion-devel < 0.20.1-2
|
|
||||||
|
|
||||||
%description devel
|
|
||||||
This package provides the support files which can be used to
|
|
||||||
build applications using the APR utility library. The mission
|
|
||||||
of the Apache Portable Runtime (APR) is to provide a free
|
|
||||||
library of C data structures and routines.
|
|
||||||
|
|
||||||
%prep
|
|
||||||
%setup -q
|
|
||||||
|
|
||||||
%build
|
|
||||||
%configure --with-apr=%{_prefix} \
|
|
||||||
--includedir=%{_includedir}/apr-%{apuver} \
|
|
||||||
--with-ldap --without-gdbm
|
|
||||||
make %{?_smp_mflags} && make dox
|
|
||||||
|
|
||||||
%check
|
|
||||||
# Run non-interactive tests
|
|
||||||
pushd test
|
|
||||||
make %{?_smp_mflags} testall CFLAGS=-fno-strict-aliasing
|
|
||||||
./testall -v || exit 1
|
|
||||||
popd
|
|
||||||
|
|
||||||
%install
|
|
||||||
rm -rf $RPM_BUILD_ROOT
|
|
||||||
make install DESTDIR=$RPM_BUILD_ROOT
|
|
||||||
|
|
||||||
# Documentation
|
|
||||||
mv docs/dox/html html
|
|
||||||
|
|
||||||
# Unpackaged files
|
|
||||||
rm -f $RPM_BUILD_ROOT%{_libdir}/aprutil.exp
|
|
||||||
|
|
||||||
%clean
|
|
||||||
rm -rf $RPM_BUILD_ROOT
|
|
||||||
|
|
||||||
%post -p /sbin/ldconfig
|
|
||||||
|
|
||||||
%postun -p /sbin/ldconfig
|
|
||||||
|
|
||||||
%files
|
|
||||||
%defattr(-,root,root,-)
|
|
||||||
%doc CHANGES LICENSE NOTICE
|
|
||||||
%{_libdir}/libaprutil-%{apuver}.so.*
|
|
||||||
|
|
||||||
%files devel
|
|
||||||
%defattr(-,root,root,-)
|
|
||||||
%{_bindir}/apu-%{apuver}-config
|
|
||||||
%{_libdir}/libaprutil-%{apuver}.*a
|
|
||||||
%{_libdir}/libaprutil-%{apuver}.so
|
|
||||||
%{_libdir}/pkgconfig/apr-util-%{apuver}.pc
|
|
||||||
%{_includedir}/apr-%{apuver}/*.h
|
|
||||||
%doc --parents html
|
|
||||||
|
|
||||||
%changelog
|
|
||||||
* Tue Jun 22 2004 Graham Leggett <minfrin@sharp.fm> 1.0.0-1
|
|
||||||
- update to support v1.0.0 of APR
|
|
||||||
|
|
||||||
* Tue Jun 22 2004 Graham Leggett <minfrin@sharp.fm> 1.0.0-1
|
|
||||||
- derived from Fedora Core apr.spec
|
|
||||||
|
|
|
@ -1,587 +0,0 @@
|
||||||
# Microsoft Developer Studio Project File - Name="aprutil" - Package Owner=<4>
|
|
||||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
|
||||||
# ** DO NOT EDIT **
|
|
||||||
|
|
||||||
# TARGTYPE "Win32 (x86) Static Library" 0x0104
|
|
||||||
|
|
||||||
CFG=aprutil - Win32 Debug
|
|
||||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
|
||||||
!MESSAGE use the Export Makefile command and run
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "aprutil.mak".
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE You can specify a configuration when running NMAKE
|
|
||||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "aprutil.mak" CFG="aprutil - Win32 Debug"
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE Possible choices for configuration are:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE "aprutil - Win32 Release" (based on "Win32 (x86) Static Library")
|
|
||||||
!MESSAGE "aprutil - Win32 Debug" (based on "Win32 (x86) Static Library")
|
|
||||||
!MESSAGE
|
|
||||||
|
|
||||||
# Begin Project
|
|
||||||
# PROP AllowPerConfigDependencies 0
|
|
||||||
# PROP Scc_ProjName ""
|
|
||||||
# PROP Scc_LocalPath ""
|
|
||||||
CPP=cl.exe
|
|
||||||
RSC=rc.exe
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "aprutil - Win32 Release"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 0
|
|
||||||
# PROP BASE Output_Dir "LibR"
|
|
||||||
# PROP BASE Intermediate_Dir "LibR"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 0
|
|
||||||
# PROP Output_Dir "LibR"
|
|
||||||
# PROP Intermediate_Dir "LibR"
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
|
|
||||||
# ADD CPP /nologo /MD /W3 /O2 /Oy- /Zi /I "./include" /I "../apr/include" /I "./include/private" /I "../apr-iconv/include" /I "./dbm/sdbm" /I "./xml/expat/lib" /D "NDEBUG" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /D "API_DECLARE_STATIC" /D "APU_USE_SDBM" /D "XML_STATIC" /D "WIN32" /D "_WINDOWS" /Fd"LibR\aprutil_src" /FD /c
|
|
||||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
|
||||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LIB32=link.exe -lib
|
|
||||||
# ADD BASE LIB32 /nologo
|
|
||||||
# ADD LIB32 /nologo /out:"LibR\aprutil-1.lib"
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "aprutil - Win32 Debug"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 1
|
|
||||||
# PROP BASE Output_Dir "LibD"
|
|
||||||
# PROP BASE Intermediate_Dir "LibD"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 1
|
|
||||||
# PROP Output_Dir "LibD"
|
|
||||||
# PROP Intermediate_Dir "LibD"
|
|
||||||
# PROP Ignore_Export_Lib 0
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c
|
|
||||||
# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "./include" /I "../apr/include" /I "./include/private" /I "../apr-iconv/include" /I "./dbm/sdbm" /I "./xml/expat/lib" /D "_DEBUG" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /D "API_DECLARE_STATIC" /D "APU_USE_SDBM" /D "XML_STATIC" /D "WIN32" /D "_WINDOWS" /Fd"LibD\aprutil_src" /FD /c
|
|
||||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
|
||||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LIB32=link.exe -lib
|
|
||||||
# ADD BASE LIB32 /nologo
|
|
||||||
# ADD LIB32 /nologo /out:"LibD\aprutil-1.lib"
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
# Begin Target
|
|
||||||
|
|
||||||
# Name "aprutil - Win32 Release"
|
|
||||||
# Name "aprutil - Win32 Debug"
|
|
||||||
# Begin Group "Source Files"
|
|
||||||
|
|
||||||
# PROP Default_Filter ""
|
|
||||||
# Begin Group "buckets"
|
|
||||||
|
|
||||||
# PROP Default_Filter ""
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\buckets\apr_brigade.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\buckets\apr_buckets.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\buckets\apr_buckets_alloc.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\buckets\apr_buckets_eos.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\buckets\apr_buckets_file.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\buckets\apr_buckets_flush.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\buckets\apr_buckets_heap.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\buckets\apr_buckets_mmap.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\buckets\apr_buckets_pipe.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\buckets\apr_buckets_pool.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\buckets\apr_buckets_refcount.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\buckets\apr_buckets_simple.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\buckets\apr_buckets_socket.c
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# Begin Group "crypto"
|
|
||||||
|
|
||||||
# PROP Default_Filter ""
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\crypto\apr_md4.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\crypto\apr_md5.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\crypto\apr_sha1.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\crypto\getuuid.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\crypto\uuid.c
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# Begin Group "dbd"
|
|
||||||
# PROP Default_Filter ""
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\dbd\apr_dbd.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\dbd\apr_dbd_pgsql.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\dbd\apr_dbd_sqlite2.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\dbd\apr_dbd_sqlite3.c
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# Begin Group "dbm"
|
|
||||||
|
|
||||||
# PROP Default_Filter ""
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\dbm\apr_dbm.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\dbm\apr_dbm_berkeleydb.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\dbm\apr_dbm_gdbm.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\dbm\apr_dbm_sdbm.c
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# Begin Group "encoding"
|
|
||||||
|
|
||||||
# PROP Default_Filter ""
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\encoding\apr_base64.c
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# Begin Group "hooks"
|
|
||||||
|
|
||||||
# PROP Default_Filter ""
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\hooks\apr_hooks.c
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# Begin Group "ldap"
|
|
||||||
|
|
||||||
# PROP Default_Filter ""
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\ldap\apr_ldap_init.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\ldap\apr_ldap_url.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\ldap\apr_ldap_option.c
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# Begin Group "misc"
|
|
||||||
|
|
||||||
# PROP Default_Filter ""
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\misc\apr_date.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\misc\apr_queue.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\misc\apr_reslist.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\misc\apr_rmm.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\misc\apu_version.c
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# Begin Group "sdbm"
|
|
||||||
|
|
||||||
# PROP Default_Filter ""
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\dbm\sdbm\sdbm.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\dbm\sdbm\sdbm_hash.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\dbm\sdbm\sdbm_lock.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\dbm\sdbm\sdbm_pair.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\dbm\sdbm\sdbm_pair.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\dbm\sdbm\sdbm_private.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\dbm\sdbm\sdbm_tune.h
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# Begin Group "strmatch"
|
|
||||||
|
|
||||||
# PROP Default_Filter ""
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\strmatch\apr_strmatch.c
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# Begin Group "uri"
|
|
||||||
|
|
||||||
# PROP Default_Filter ""
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\uri\apr_uri.c
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# Begin Group "xlate"
|
|
||||||
|
|
||||||
# PROP Default_Filter ""
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\xlate\xlate.c
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# Begin Group "xml"
|
|
||||||
|
|
||||||
# PROP Default_Filter ""
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\xml\apr_xml.c
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# End Group
|
|
||||||
# Begin Group "Generated Files"
|
|
||||||
|
|
||||||
# PROP Default_Filter ""
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\apr_ldap.h.in
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\apr_ldap.hnw
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\apr_ldap.hw
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "aprutil - Win32 Release"
|
|
||||||
|
|
||||||
# Begin Custom Build - Creating apr_ldap.h from apr_ldap.hw
|
|
||||||
InputPath=.\include\apr_ldap.hw
|
|
||||||
|
|
||||||
".\include\apr_ldap.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
|
||||||
type .\include\apr_ldap.hw > .\include\apr_ldap.h
|
|
||||||
|
|
||||||
# End Custom Build
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "aprutil - Win32 Debug"
|
|
||||||
|
|
||||||
# Begin Custom Build - Creating apr_ldap.h from apr_ldap.hw
|
|
||||||
InputPath=.\include\apr_ldap.hw
|
|
||||||
|
|
||||||
".\include\apr_ldap.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
|
||||||
type .\include\apr_ldap.hw > .\include\apr_ldap.h
|
|
||||||
|
|
||||||
# End Custom Build
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\apu.h.in
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\apu.hnw
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\apu.hw
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "aprutil - Win32 Release"
|
|
||||||
|
|
||||||
# Begin Custom Build - Creating apu.h from apu.hw
|
|
||||||
InputPath=.\include\apu.hw
|
|
||||||
|
|
||||||
".\include\apu.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
|
||||||
type .\include\apu.hw > .\include\apu.h
|
|
||||||
|
|
||||||
# End Custom Build
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "aprutil - Win32 Debug"
|
|
||||||
|
|
||||||
# Begin Custom Build - Creating apu.h from apu.hw
|
|
||||||
InputPath=.\include\apu.hw
|
|
||||||
|
|
||||||
".\include\apu.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
|
||||||
type .\include\apu.hw > .\include\apu.h
|
|
||||||
|
|
||||||
# End Custom Build
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\private\apu_config.h.in
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\private\apu_config.hw
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "aprutil - Win32 Release"
|
|
||||||
|
|
||||||
# Begin Custom Build - Creating apu_config.h from apu_config.hw
|
|
||||||
InputPath=.\include\private\apu_config.hw
|
|
||||||
|
|
||||||
".\include\private\apu_config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
|
||||||
type .\include\private\apu_config.hw > .\include\private\apu_config.h
|
|
||||||
|
|
||||||
# End Custom Build
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "aprutil - Win32 Debug"
|
|
||||||
|
|
||||||
# Begin Custom Build - Creating apu_config.h from apu_config.hw
|
|
||||||
InputPath=.\include\private\apu_config.hw
|
|
||||||
|
|
||||||
".\include\private\apu_config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
|
||||||
type .\include\private\apu_config.hw > .\include\private\apu_config.h
|
|
||||||
|
|
||||||
# End Custom Build
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\private\apu_select_dbm.h.in
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\private\apu_select_dbm.hw
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "aprutil - Win32 Release"
|
|
||||||
|
|
||||||
# Begin Custom Build - Creating apu_select_dbm.h from apu_select_dbm.hw
|
|
||||||
InputPath=.\include\private\apu_select_dbm.hw
|
|
||||||
|
|
||||||
".\include\private\apu_select_dbm.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
|
||||||
type .\include\private\apu_select_dbm.hw > .\include\private\apu_select_dbm.h
|
|
||||||
|
|
||||||
# End Custom Build
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "aprutil - Win32 Debug"
|
|
||||||
|
|
||||||
# Begin Custom Build - Creating apu_select_dbm.h from apu_select_dbm.hw
|
|
||||||
InputPath=.\include\private\apu_select_dbm.hw
|
|
||||||
|
|
||||||
".\include\private\apu_select_dbm.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
|
||||||
type .\include\private\apu_select_dbm.hw > .\include\private\apu_select_dbm.h
|
|
||||||
|
|
||||||
# End Custom Build
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\apu_want.h.in
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\apu_want.hnw
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\apu_want.hw
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "aprutil - Win32 Release"
|
|
||||||
|
|
||||||
# Begin Custom Build - Creating apu_want.h from apu_want.hw
|
|
||||||
InputPath=.\include\apu_want.hw
|
|
||||||
|
|
||||||
".\include\apu_want.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
|
||||||
type .\include\apu_want.hw > .\include\apu_want.h
|
|
||||||
|
|
||||||
# End Custom Build
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "aprutil - Win32 Debug"
|
|
||||||
|
|
||||||
# Begin Custom Build - Creating apu_want.h from apu_want.hw
|
|
||||||
InputPath=.\include\apu_want.hw
|
|
||||||
|
|
||||||
".\include\apu_want.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
|
||||||
type .\include\apu_want.hw > .\include\apu_want.h
|
|
||||||
|
|
||||||
# End Custom Build
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# Begin Group "Public Header Files"
|
|
||||||
|
|
||||||
# PROP Default_Filter ""
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\apr_anylock.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\apr_base64.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\apr_buckets.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\apr_date.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\apr_dbm.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\apr_hooks.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\apr_ldap_url.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\apr_md4.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\apr_md5.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\apr_optional.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\apr_optional_hooks.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\apr_queue.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\apr_reslist.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\apr_rmm.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\apr_sdbm.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\apr_sha1.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\apr_strmatch.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\apr_uri.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\apr_uuid.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\apr_xlate.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\include\apr_xml.h
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# End Target
|
|
||||||
# End Project
|
|
|
@ -1,161 +0,0 @@
|
||||||
Microsoft Developer Studio Workspace File, Format Version 6.00
|
|
||||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Project: "apr"="..\apr\apr.dsp" - Package Owner=<4>
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Package=<4>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Project: "apriconv"="..\apr-iconv\apriconv.dsp" - Package Owner=<4>
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Package=<4>
|
|
||||||
{{{
|
|
||||||
Begin Project Dependency
|
|
||||||
Project_Dep_Name apr
|
|
||||||
End Project Dependency
|
|
||||||
}}}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Project: "aprutil"=".\aprutil.dsp" - Package Owner=<4>
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Package=<4>
|
|
||||||
{{{
|
|
||||||
Begin Project Dependency
|
|
||||||
Project_Dep_Name apr
|
|
||||||
End Project Dependency
|
|
||||||
Begin Project Dependency
|
|
||||||
Project_Dep_Name xml
|
|
||||||
End Project Dependency
|
|
||||||
Begin Project Dependency
|
|
||||||
Project_Dep_Name apriconv
|
|
||||||
End Project Dependency
|
|
||||||
}}}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Project: "libapr"="..\apr\libapr.dsp" - Package Owner=<4>
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Package=<4>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Project: "libapriconv"="..\apr-iconv\libapriconv.dsp" - Package Owner=<4>
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Package=<4>
|
|
||||||
{{{
|
|
||||||
Begin Project Dependency
|
|
||||||
Project_Dep_Name libapr
|
|
||||||
End Project Dependency
|
|
||||||
}}}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Project: "libapriconv_ccs_modules"="..\apr-iconv\ccs\libapriconv_ccs_modules.dsp" - Package Owner=<4>
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Package=<4>
|
|
||||||
{{{
|
|
||||||
Begin Project Dependency
|
|
||||||
Project_Dep_Name libapr
|
|
||||||
End Project Dependency
|
|
||||||
Begin Project Dependency
|
|
||||||
Project_Dep_Name libapriconv
|
|
||||||
End Project Dependency
|
|
||||||
}}}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Project: "libapriconv_ces_modules"="..\apr-iconv\ces\libapriconv_ces_modules.dsp" - Package Owner=<4>
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Package=<4>
|
|
||||||
{{{
|
|
||||||
Begin Project Dependency
|
|
||||||
Project_Dep_Name libapr
|
|
||||||
End Project Dependency
|
|
||||||
Begin Project Dependency
|
|
||||||
Project_Dep_Name libapriconv
|
|
||||||
End Project Dependency
|
|
||||||
}}}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Project: "libaprutil"=".\libaprutil.dsp" - Package Owner=<4>
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Package=<4>
|
|
||||||
{{{
|
|
||||||
Begin Project Dependency
|
|
||||||
Project_Dep_Name libapr
|
|
||||||
End Project Dependency
|
|
||||||
Begin Project Dependency
|
|
||||||
Project_Dep_Name xml
|
|
||||||
End Project Dependency
|
|
||||||
Begin Project Dependency
|
|
||||||
Project_Dep_Name libapriconv
|
|
||||||
End Project Dependency
|
|
||||||
}}}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Project: "xml"=".\xml\expat\lib\xml.dsp" - Package Owner=<4>
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Package=<4>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Global:
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Package=<3>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
|
@ -1,207 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
# Copyright 2001-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
# applicable.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
#
|
|
||||||
|
|
||||||
# APR-util script designed to allow easy command line access to APR-util
|
|
||||||
# configuration parameters.
|
|
||||||
|
|
||||||
APRUTIL_MAJOR_VERSION="@APRUTIL_MAJOR_VERSION@"
|
|
||||||
APRUTIL_DOTTED_VERSION="@APRUTIL_DOTTED_VERSION@"
|
|
||||||
|
|
||||||
prefix="@prefix@"
|
|
||||||
exec_prefix="@exec_prefix@"
|
|
||||||
bindir="@bindir@"
|
|
||||||
libdir="@libdir@"
|
|
||||||
includedir="@includedir@"
|
|
||||||
|
|
||||||
LIBS="@APRUTIL_EXPORT_LIBS@"
|
|
||||||
INCLUDES="@APRUTIL_INCLUDES@"
|
|
||||||
LDFLAGS="@APRUTIL_LDFLAGS@"
|
|
||||||
|
|
||||||
APRUTIL_LIBNAME="@APRUTIL_LIBNAME@"
|
|
||||||
|
|
||||||
APU_SOURCE_DIR="@abs_srcdir@"
|
|
||||||
APU_BUILD_DIR="@abs_builddir@"
|
|
||||||
APR_XML_EXPAT_OLD="@APR_XML_EXPAT_OLD@"
|
|
||||||
APU_DB_VERSION="@apu_db_version@"
|
|
||||||
|
|
||||||
# NOTE: the following line is modified during 'make install': alter with care!
|
|
||||||
location=@APU_CONFIG_LOCATION@
|
|
||||||
|
|
||||||
show_usage()
|
|
||||||
{
|
|
||||||
cat << EOF
|
|
||||||
Usage: apu-$APRUTIL_MAJOR_VERSION-config [OPTION]
|
|
||||||
|
|
||||||
Known values for OPTION are:
|
|
||||||
--prefix[=DIR] change prefix to DIR
|
|
||||||
--bindir print location where binaries are installed
|
|
||||||
--includes print include information
|
|
||||||
--includedir print location where headers are installed
|
|
||||||
--ldflags print linker flags
|
|
||||||
--libs print library information
|
|
||||||
--srcdir print APR-util source directory
|
|
||||||
--link-ld print link switch(es) for linking to APR-util
|
|
||||||
--link-libtool print the libtool inputs for linking to APR-util
|
|
||||||
--apu-la-file print the path to the .la file, if available
|
|
||||||
--old-expat indicate if APR-util was built against an old expat
|
|
||||||
--db-version print the DB version
|
|
||||||
--version print APR-util's version as a dotted triple
|
|
||||||
--help print this help
|
|
||||||
|
|
||||||
When linking with libtool, an application should do something like:
|
|
||||||
APU_LIBS="\`apu-$APRUTIL_MAJOR_VERSION-config --link-libtool --libs\`"
|
|
||||||
or when linking directly:
|
|
||||||
APU_LIBS="\`apu-$APRUTIL_MAJOR_VERSION-config --link-ld --libs\`"
|
|
||||||
|
|
||||||
An application should use the results of --includes, and --ldflags in
|
|
||||||
their build process.
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
|
|
||||||
if test $# -eq 0; then
|
|
||||||
show_usage
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$location" = "installed"; then
|
|
||||||
LA_FILE="$libdir/lib${APRUTIL_LIBNAME}.la"
|
|
||||||
|
|
||||||
LIBS=`echo "$LIBS" | sed -e "s $APU_BUILD_DIR/xml/expat $prefix g" -e "s $prefix/lib/libexpat.la -lexpat g"`
|
|
||||||
LDFLAGS=`echo "$LDFLAGS" | sed -e "s $APU_BUILD_DIR/xml/expat $prefix g"`
|
|
||||||
INCLUDES=`echo "$INCLUDES" | sed -e "s $APU_BUILD_DIR/xml/expat $prefix g" -e "s -I$prefix/lib g"`
|
|
||||||
else
|
|
||||||
LA_FILE="$APU_BUILD_DIR/lib${APRUTIL_LIBNAME}.la"
|
|
||||||
fi
|
|
||||||
|
|
||||||
flags=""
|
|
||||||
|
|
||||||
while test $# -gt 0; do
|
|
||||||
# Normalize the prefix.
|
|
||||||
case "$1" in
|
|
||||||
-*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
|
|
||||||
*) optarg= ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
case "$1" in
|
|
||||||
# It is possible for the user to override our prefix.
|
|
||||||
--prefix=*)
|
|
||||||
prefix=$optarg
|
|
||||||
;;
|
|
||||||
--prefix)
|
|
||||||
echo $prefix
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
--bindir)
|
|
||||||
echo $bindir
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
--libs)
|
|
||||||
flags="$flags $LIBS"
|
|
||||||
;;
|
|
||||||
--includedir)
|
|
||||||
if test "$location" = "installed"; then
|
|
||||||
flags="$includedir"
|
|
||||||
elif test "$location" = "source"; then
|
|
||||||
flags="$APU_SOURCE_DIR/include"
|
|
||||||
else
|
|
||||||
# this is for VPATH builds
|
|
||||||
flags="$APU_BUILD_DIR/include $APU_SOURCE_DIR/include"
|
|
||||||
fi
|
|
||||||
echo $flags
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
--includes)
|
|
||||||
if test "$location" = "installed"; then
|
|
||||||
flags="$flags -I$includedir $INCLUDES"
|
|
||||||
elif test "$location" = "source"; then
|
|
||||||
flags="$flags -I$APU_SOURCE_DIR/include $INCLUDES"
|
|
||||||
else
|
|
||||||
# this is for VPATH builds
|
|
||||||
flags="$flags -I$APU_BUILD_DIR/include -I$APU_SOURCE_DIR/include $INCLUDES"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
--ldflags)
|
|
||||||
flags="$flags $LDFLAGS"
|
|
||||||
;;
|
|
||||||
--srcdir)
|
|
||||||
echo $APU_SOURCE_DIR
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
--version)
|
|
||||||
echo $APRUTIL_DOTTED_VERSION
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
--link-ld)
|
|
||||||
if test "$location" = "installed"; then
|
|
||||||
### avoid using -L if libdir is a "standard" location like /usr/lib
|
|
||||||
flags="$flags -L$libdir -l$APRUTIL_LIBNAME"
|
|
||||||
else
|
|
||||||
flags="$flags -L$APU_BUILD_DIR -l$APRUTIL_LIBNAME"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
--link-libtool)
|
|
||||||
# If the LA_FILE exists where we think it should be, use it. If we're
|
|
||||||
# installed and the LA_FILE does not exist, assume to use -L/-l
|
|
||||||
# (the LA_FILE may not have been installed). If we're building ourselves,
|
|
||||||
# we'll assume that at some point the .la file be created.
|
|
||||||
if test -f "$LA_FILE"; then
|
|
||||||
flags="$flags $LA_FILE"
|
|
||||||
elif test "$location" = "installed"; then
|
|
||||||
### avoid using -L if libdir is a "standard" location like /usr/lib
|
|
||||||
# Since the user is specifying they are linking with libtool, we
|
|
||||||
# *know* that -R will be recognized by libtool.
|
|
||||||
flags="$flags -L$libdir -R$libdir -l$APRUTIL_LIBNAME"
|
|
||||||
else
|
|
||||||
flags="$flags $LA_FILE"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
--apu-la-file)
|
|
||||||
if test -f "$LA_FILE"; then
|
|
||||||
flags="$flags $LA_FILE"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
--old-expat)
|
|
||||||
if test ! -n "$APR_XML_EXPAT_OLD"; then
|
|
||||||
echo "no"
|
|
||||||
else
|
|
||||||
echo "$APR_XML_EXPAT_OLD"
|
|
||||||
fi
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
--db-version)
|
|
||||||
echo $APU_DB_VERSION
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
--help)
|
|
||||||
show_usage
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
show_usage
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# Next please.
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
if test -n "$flags"; then
|
|
||||||
echo "$flags"
|
|
||||||
fi
|
|
||||||
|
|
||||||
exit 0
|
|
|
@ -1,702 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apr.h"
|
|
||||||
#include "apr_lib.h"
|
|
||||||
#include "apr_strings.h"
|
|
||||||
#include "apr_pools.h"
|
|
||||||
#include "apr_tables.h"
|
|
||||||
#include "apr_buckets.h"
|
|
||||||
#include "apr_errno.h"
|
|
||||||
#define APR_WANT_MEMFUNC
|
|
||||||
#define APR_WANT_STRFUNC
|
|
||||||
#include "apr_want.h"
|
|
||||||
|
|
||||||
#if APR_HAVE_SYS_UIO_H
|
|
||||||
#include <sys/uio.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static apr_status_t brigade_cleanup(void *data)
|
|
||||||
{
|
|
||||||
return apr_brigade_cleanup(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_brigade_cleanup(void *data)
|
|
||||||
{
|
|
||||||
apr_bucket_brigade *b = data;
|
|
||||||
apr_bucket *e;
|
|
||||||
|
|
||||||
while (!APR_BRIGADE_EMPTY(b)) {
|
|
||||||
e = APR_BRIGADE_FIRST(b);
|
|
||||||
apr_bucket_delete(e);
|
|
||||||
}
|
|
||||||
/* We don't need to free(bb) because it's allocated from a pool. */
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_brigade_destroy(apr_bucket_brigade *b)
|
|
||||||
{
|
|
||||||
apr_pool_cleanup_kill(b->p, b, brigade_cleanup);
|
|
||||||
return apr_brigade_cleanup(b);
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_bucket_brigade *) apr_brigade_create(apr_pool_t *p,
|
|
||||||
apr_bucket_alloc_t *list)
|
|
||||||
{
|
|
||||||
apr_bucket_brigade *b;
|
|
||||||
|
|
||||||
b = apr_palloc(p, sizeof(*b));
|
|
||||||
b->p = p;
|
|
||||||
b->bucket_alloc = list;
|
|
||||||
|
|
||||||
APR_RING_INIT(&b->list, apr_bucket, link);
|
|
||||||
|
|
||||||
apr_pool_cleanup_register(b->p, b, brigade_cleanup, apr_pool_cleanup_null);
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_bucket_brigade *) apr_brigade_split(apr_bucket_brigade *b,
|
|
||||||
apr_bucket *e)
|
|
||||||
{
|
|
||||||
apr_bucket_brigade *a;
|
|
||||||
apr_bucket *f;
|
|
||||||
|
|
||||||
a = apr_brigade_create(b->p, b->bucket_alloc);
|
|
||||||
/* Return an empty brigade if there is nothing left in
|
|
||||||
* the first brigade to split off
|
|
||||||
*/
|
|
||||||
if (e != APR_BRIGADE_SENTINEL(b)) {
|
|
||||||
f = APR_RING_LAST(&b->list);
|
|
||||||
APR_RING_UNSPLICE(e, f, link);
|
|
||||||
APR_RING_SPLICE_HEAD(&a->list, e, f, apr_bucket, link);
|
|
||||||
}
|
|
||||||
|
|
||||||
APR_BRIGADE_CHECK_CONSISTENCY(a);
|
|
||||||
APR_BRIGADE_CHECK_CONSISTENCY(b);
|
|
||||||
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_brigade_partition(apr_bucket_brigade *b,
|
|
||||||
apr_off_t point,
|
|
||||||
apr_bucket **after_point)
|
|
||||||
{
|
|
||||||
apr_bucket *e;
|
|
||||||
const char *s;
|
|
||||||
apr_size_t len;
|
|
||||||
apr_status_t rv;
|
|
||||||
|
|
||||||
if (point < 0) {
|
|
||||||
/* this could cause weird (not necessarily SEGV) things to happen */
|
|
||||||
return APR_EINVAL;
|
|
||||||
}
|
|
||||||
if (point == 0) {
|
|
||||||
*after_point = APR_BRIGADE_FIRST(b);
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
APR_BRIGADE_CHECK_CONSISTENCY(b);
|
|
||||||
|
|
||||||
for (e = APR_BRIGADE_FIRST(b);
|
|
||||||
e != APR_BRIGADE_SENTINEL(b);
|
|
||||||
e = APR_BUCKET_NEXT(e))
|
|
||||||
{
|
|
||||||
if ((e->length == (apr_size_t)(-1)) && (point > (apr_size_t)(-1))) {
|
|
||||||
/* point is too far out to simply split this bucket,
|
|
||||||
* we must fix this bucket's size and keep going... */
|
|
||||||
rv = apr_bucket_read(e, &s, &len, APR_BLOCK_READ);
|
|
||||||
if (rv != APR_SUCCESS) {
|
|
||||||
*after_point = e;
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ((point < e->length) || (e->length == (apr_size_t)(-1))) {
|
|
||||||
/* We already checked e->length -1 above, so we now
|
|
||||||
* trust e->length < MAX_APR_SIZE_T.
|
|
||||||
* First try to split the bucket natively... */
|
|
||||||
if ((rv = apr_bucket_split(e, (apr_size_t)point))
|
|
||||||
!= APR_ENOTIMPL) {
|
|
||||||
*after_point = APR_BUCKET_NEXT(e);
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if the bucket cannot be split, we must read from it,
|
|
||||||
* changing its type to one that can be split */
|
|
||||||
rv = apr_bucket_read(e, &s, &len, APR_BLOCK_READ);
|
|
||||||
if (rv != APR_SUCCESS) {
|
|
||||||
*after_point = e;
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* this assumes that len == e->length, which is okay because e
|
|
||||||
* might have been morphed by the apr_bucket_read() above, but
|
|
||||||
* if it was, the length would have been adjusted appropriately */
|
|
||||||
if (point < e->length) {
|
|
||||||
rv = apr_bucket_split(e, (apr_size_t)point);
|
|
||||||
*after_point = APR_BUCKET_NEXT(e);
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (point == e->length) {
|
|
||||||
*after_point = APR_BUCKET_NEXT(e);
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
point -= e->length;
|
|
||||||
}
|
|
||||||
*after_point = APR_BRIGADE_SENTINEL(b);
|
|
||||||
return APR_INCOMPLETE;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_brigade_length(apr_bucket_brigade *bb,
|
|
||||||
int read_all, apr_off_t *length)
|
|
||||||
{
|
|
||||||
apr_off_t total = 0;
|
|
||||||
apr_bucket *bkt;
|
|
||||||
|
|
||||||
for (bkt = APR_BRIGADE_FIRST(bb);
|
|
||||||
bkt != APR_BRIGADE_SENTINEL(bb);
|
|
||||||
bkt = APR_BUCKET_NEXT(bkt))
|
|
||||||
{
|
|
||||||
if (bkt->length == (apr_size_t)(-1)) {
|
|
||||||
const char *ignore;
|
|
||||||
apr_size_t len;
|
|
||||||
apr_status_t status;
|
|
||||||
|
|
||||||
if (!read_all) {
|
|
||||||
*length = -1;
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((status = apr_bucket_read(bkt, &ignore, &len,
|
|
||||||
APR_BLOCK_READ)) != APR_SUCCESS) {
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
total += bkt->length;
|
|
||||||
}
|
|
||||||
|
|
||||||
*length = total;
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_brigade_flatten(apr_bucket_brigade *bb,
|
|
||||||
char *c, apr_size_t *len)
|
|
||||||
{
|
|
||||||
apr_size_t actual = 0;
|
|
||||||
apr_bucket *b;
|
|
||||||
|
|
||||||
for (b = APR_BRIGADE_FIRST(bb);
|
|
||||||
b != APR_BRIGADE_SENTINEL(bb);
|
|
||||||
b = APR_BUCKET_NEXT(b))
|
|
||||||
{
|
|
||||||
const char *str;
|
|
||||||
apr_size_t str_len;
|
|
||||||
apr_status_t status;
|
|
||||||
|
|
||||||
status = apr_bucket_read(b, &str, &str_len, APR_BLOCK_READ);
|
|
||||||
if (status != APR_SUCCESS) {
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If we would overflow. */
|
|
||||||
if (str_len + actual > *len) {
|
|
||||||
str_len = *len - actual;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* XXX: It appears that overflow of the final bucket
|
|
||||||
* is DISCARDED without any warning to the caller.
|
|
||||||
*
|
|
||||||
* No, we only copy the data up to their requested size. -- jre
|
|
||||||
*/
|
|
||||||
memcpy(c, str, str_len);
|
|
||||||
|
|
||||||
c += str_len;
|
|
||||||
actual += str_len;
|
|
||||||
|
|
||||||
/* This could probably be actual == *len, but be safe from stray
|
|
||||||
* photons. */
|
|
||||||
if (actual >= *len) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*len = actual;
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_brigade_pflatten(apr_bucket_brigade *bb,
|
|
||||||
char **c,
|
|
||||||
apr_size_t *len,
|
|
||||||
apr_pool_t *pool)
|
|
||||||
{
|
|
||||||
apr_off_t actual;
|
|
||||||
apr_size_t total;
|
|
||||||
apr_status_t rv;
|
|
||||||
|
|
||||||
apr_brigade_length(bb, 1, &actual);
|
|
||||||
|
|
||||||
/* XXX: This is dangerous beyond belief. At least in the
|
|
||||||
* apr_brigade_flatten case, the user explicitly stated their
|
|
||||||
* buffer length - so we don't up and palloc 4GB for a single
|
|
||||||
* file bucket. This API must grow a useful max boundry,
|
|
||||||
* either compiled-in or preset via the *len value.
|
|
||||||
*
|
|
||||||
* Shouldn't both fn's grow an additional return value for
|
|
||||||
* the case that the brigade couldn't be flattened into the
|
|
||||||
* provided or allocated buffer (such as APR_EMOREDATA?)
|
|
||||||
* Not a failure, simply an advisory result.
|
|
||||||
*/
|
|
||||||
total = (apr_size_t)actual;
|
|
||||||
|
|
||||||
*c = apr_palloc(pool, total);
|
|
||||||
|
|
||||||
rv = apr_brigade_flatten(bb, *c, &total);
|
|
||||||
|
|
||||||
if (rv != APR_SUCCESS) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
*len = total;
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_brigade_split_line(apr_bucket_brigade *bbOut,
|
|
||||||
apr_bucket_brigade *bbIn,
|
|
||||||
apr_read_type_e block,
|
|
||||||
apr_off_t maxbytes)
|
|
||||||
{
|
|
||||||
apr_off_t readbytes = 0;
|
|
||||||
|
|
||||||
while (!APR_BRIGADE_EMPTY(bbIn)) {
|
|
||||||
const char *pos;
|
|
||||||
const char *str;
|
|
||||||
apr_size_t len;
|
|
||||||
apr_status_t rv;
|
|
||||||
apr_bucket *e;
|
|
||||||
|
|
||||||
e = APR_BRIGADE_FIRST(bbIn);
|
|
||||||
rv = apr_bucket_read(e, &str, &len, block);
|
|
||||||
|
|
||||||
if (rv != APR_SUCCESS) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
pos = memchr(str, APR_ASCII_LF, len);
|
|
||||||
/* We found a match. */
|
|
||||||
if (pos != NULL) {
|
|
||||||
apr_bucket_split(e, pos - str + 1);
|
|
||||||
APR_BUCKET_REMOVE(e);
|
|
||||||
APR_BRIGADE_INSERT_TAIL(bbOut, e);
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
APR_BUCKET_REMOVE(e);
|
|
||||||
APR_BRIGADE_INSERT_TAIL(bbOut, e);
|
|
||||||
readbytes += len;
|
|
||||||
/* We didn't find an APR_ASCII_LF within the maximum line length. */
|
|
||||||
if (readbytes >= maxbytes) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_brigade_to_iovec(apr_bucket_brigade *b,
|
|
||||||
struct iovec *vec, int *nvec)
|
|
||||||
{
|
|
||||||
int left = *nvec;
|
|
||||||
apr_bucket *e;
|
|
||||||
struct iovec *orig;
|
|
||||||
apr_size_t iov_len;
|
|
||||||
apr_status_t rv;
|
|
||||||
|
|
||||||
orig = vec;
|
|
||||||
|
|
||||||
for (e = APR_BRIGADE_FIRST(b);
|
|
||||||
e != APR_BRIGADE_SENTINEL(b);
|
|
||||||
e = APR_BUCKET_NEXT(e))
|
|
||||||
{
|
|
||||||
if (left-- == 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
rv = apr_bucket_read(e, (const char **)&vec->iov_base, &iov_len,
|
|
||||||
APR_NONBLOCK_READ);
|
|
||||||
if (rv != APR_SUCCESS)
|
|
||||||
return rv;
|
|
||||||
vec->iov_len = iov_len; /* set indirectly in case size differs */
|
|
||||||
++vec;
|
|
||||||
}
|
|
||||||
|
|
||||||
*nvec = vec - orig;
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_brigade_vputstrs(apr_bucket_brigade *b,
|
|
||||||
apr_brigade_flush flush,
|
|
||||||
void *ctx,
|
|
||||||
va_list va)
|
|
||||||
{
|
|
||||||
for (;;) {
|
|
||||||
const char *str = va_arg(va, const char *);
|
|
||||||
apr_status_t rv;
|
|
||||||
|
|
||||||
if (str == NULL)
|
|
||||||
break;
|
|
||||||
|
|
||||||
rv = apr_brigade_write(b, flush, ctx, str, strlen(str));
|
|
||||||
if (rv != APR_SUCCESS)
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_brigade_putc(apr_bucket_brigade *b,
|
|
||||||
apr_brigade_flush flush, void *ctx,
|
|
||||||
const char c)
|
|
||||||
{
|
|
||||||
return apr_brigade_write(b, flush, ctx, &c, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_brigade_write(apr_bucket_brigade *b,
|
|
||||||
apr_brigade_flush flush,
|
|
||||||
void *ctx,
|
|
||||||
const char *str, apr_size_t nbyte)
|
|
||||||
{
|
|
||||||
apr_bucket *e = APR_BRIGADE_LAST(b);
|
|
||||||
apr_size_t remaining = APR_BUCKET_BUFF_SIZE;
|
|
||||||
char *buf = NULL;
|
|
||||||
|
|
||||||
if (!APR_BRIGADE_EMPTY(b) && APR_BUCKET_IS_HEAP(e)) {
|
|
||||||
apr_bucket_heap *h = e->data;
|
|
||||||
|
|
||||||
/* HEAP bucket start offsets are always in-memory, safe to cast */
|
|
||||||
remaining = h->alloc_len - (e->length + (apr_size_t)e->start);
|
|
||||||
buf = h->base + e->start + e->length;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nbyte > remaining) {
|
|
||||||
/* either a buffer bucket exists but is full,
|
|
||||||
* or no buffer bucket exists and the data is too big
|
|
||||||
* to buffer. In either case, we should flush. */
|
|
||||||
if (flush) {
|
|
||||||
e = apr_bucket_transient_create(str, nbyte, b->bucket_alloc);
|
|
||||||
APR_BRIGADE_INSERT_TAIL(b, e);
|
|
||||||
return flush(b, ctx);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
e = apr_bucket_heap_create(str, nbyte, NULL, b->bucket_alloc);
|
|
||||||
APR_BRIGADE_INSERT_TAIL(b, e);
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (!buf) {
|
|
||||||
/* we don't have a buffer, but the data is small enough
|
|
||||||
* that we don't mind making a new buffer */
|
|
||||||
buf = apr_bucket_alloc(APR_BUCKET_BUFF_SIZE, b->bucket_alloc);
|
|
||||||
e = apr_bucket_heap_create(buf, APR_BUCKET_BUFF_SIZE,
|
|
||||||
apr_bucket_free, b->bucket_alloc);
|
|
||||||
APR_BRIGADE_INSERT_TAIL(b, e);
|
|
||||||
e->length = 0; /* We are writing into the brigade, and
|
|
||||||
* allocating more memory than we need. This
|
|
||||||
* ensures that the bucket thinks it is empty just
|
|
||||||
* after we create it. We'll fix the length
|
|
||||||
* once we put data in it below.
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
/* there is a sufficiently big buffer bucket available now */
|
|
||||||
memcpy(buf, str, nbyte);
|
|
||||||
e->length += nbyte;
|
|
||||||
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_brigade_writev(apr_bucket_brigade *b,
|
|
||||||
apr_brigade_flush flush,
|
|
||||||
void *ctx,
|
|
||||||
const struct iovec *vec,
|
|
||||||
apr_size_t nvec)
|
|
||||||
{
|
|
||||||
apr_bucket *e;
|
|
||||||
apr_size_t total_len;
|
|
||||||
apr_size_t i;
|
|
||||||
char *buf;
|
|
||||||
|
|
||||||
/* Compute the total length of the data to be written.
|
|
||||||
*/
|
|
||||||
total_len = 0;
|
|
||||||
for (i = 0; i < nvec; i++) {
|
|
||||||
total_len += vec[i].iov_len;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the data to be written is very large, try to convert
|
|
||||||
* the iovec to transient buckets rather than copying.
|
|
||||||
*/
|
|
||||||
if (total_len > APR_BUCKET_BUFF_SIZE) {
|
|
||||||
if (flush) {
|
|
||||||
for (i = 0; i < nvec; i++) {
|
|
||||||
e = apr_bucket_transient_create(vec[i].iov_base,
|
|
||||||
vec[i].iov_len,
|
|
||||||
b->bucket_alloc);
|
|
||||||
APR_BRIGADE_INSERT_TAIL(b, e);
|
|
||||||
}
|
|
||||||
return flush(b, ctx);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
for (i = 0; i < nvec; i++) {
|
|
||||||
e = apr_bucket_heap_create((const char *) vec[i].iov_base,
|
|
||||||
vec[i].iov_len, NULL,
|
|
||||||
b->bucket_alloc);
|
|
||||||
APR_BRIGADE_INSERT_TAIL(b, e);
|
|
||||||
}
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
i = 0;
|
|
||||||
|
|
||||||
/* If there is a heap bucket at the end of the brigade
|
|
||||||
* already, copy into the existing bucket.
|
|
||||||
*/
|
|
||||||
e = APR_BRIGADE_LAST(b);
|
|
||||||
if (!APR_BRIGADE_EMPTY(b) && APR_BUCKET_IS_HEAP(e)) {
|
|
||||||
apr_bucket_heap *h = e->data;
|
|
||||||
apr_size_t remaining = h->alloc_len -
|
|
||||||
(e->length + (apr_size_t)e->start);
|
|
||||||
buf = h->base + e->start + e->length;
|
|
||||||
|
|
||||||
if (remaining >= total_len) {
|
|
||||||
/* Simple case: all the data will fit in the
|
|
||||||
* existing heap bucket
|
|
||||||
*/
|
|
||||||
for (; i < nvec; i++) {
|
|
||||||
apr_size_t len = vec[i].iov_len;
|
|
||||||
memcpy(buf, (const void *) vec[i].iov_base, len);
|
|
||||||
buf += len;
|
|
||||||
}
|
|
||||||
e->length += total_len;
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* More complicated case: not all of the data
|
|
||||||
* will fit in the existing heap bucket. The
|
|
||||||
* total data size is <= APR_BUCKET_BUFF_SIZE,
|
|
||||||
* so we'll need only one additional bucket.
|
|
||||||
*/
|
|
||||||
const char *start_buf = buf;
|
|
||||||
for (; i < nvec; i++) {
|
|
||||||
apr_size_t len = vec[i].iov_len;
|
|
||||||
if (len > remaining) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
memcpy(buf, (const void *) vec[i].iov_base, len);
|
|
||||||
buf += len;
|
|
||||||
remaining -= len;
|
|
||||||
}
|
|
||||||
e->length += (buf - start_buf);
|
|
||||||
total_len -= (buf - start_buf);
|
|
||||||
|
|
||||||
if (flush) {
|
|
||||||
apr_status_t rv = flush(b, ctx);
|
|
||||||
if (rv != APR_SUCCESS) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Now fall through into the case below to
|
|
||||||
* allocate another heap bucket and copy the
|
|
||||||
* rest of the array. (Note that i is not
|
|
||||||
* reset to zero here; it holds the index
|
|
||||||
* of the first vector element to be
|
|
||||||
* written to the new bucket.)
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Allocate a new heap bucket, and copy the data into it.
|
|
||||||
* The checks above ensure that the amount of data to be
|
|
||||||
* written here is no larger than APR_BUCKET_BUFF_SIZE.
|
|
||||||
*/
|
|
||||||
buf = apr_bucket_alloc(APR_BUCKET_BUFF_SIZE, b->bucket_alloc);
|
|
||||||
e = apr_bucket_heap_create(buf, APR_BUCKET_BUFF_SIZE,
|
|
||||||
apr_bucket_free, b->bucket_alloc);
|
|
||||||
for (; i < nvec; i++) {
|
|
||||||
apr_size_t len = vec[i].iov_len;
|
|
||||||
memcpy(buf, (const void *) vec[i].iov_base, len);
|
|
||||||
buf += len;
|
|
||||||
}
|
|
||||||
e->length = total_len;
|
|
||||||
APR_BRIGADE_INSERT_TAIL(b, e);
|
|
||||||
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_brigade_puts(apr_bucket_brigade *bb,
|
|
||||||
apr_brigade_flush flush, void *ctx,
|
|
||||||
const char *str)
|
|
||||||
{
|
|
||||||
apr_size_t len = strlen(str);
|
|
||||||
apr_bucket *bkt = APR_BRIGADE_LAST(bb);
|
|
||||||
if (!APR_BRIGADE_EMPTY(bb) && APR_BUCKET_IS_HEAP(bkt)) {
|
|
||||||
/* If there is enough space available in a heap bucket
|
|
||||||
* at the end of the brigade, copy the string directly
|
|
||||||
* into the heap bucket
|
|
||||||
*/
|
|
||||||
apr_bucket_heap *h = bkt->data;
|
|
||||||
apr_size_t bytes_avail = h->alloc_len - bkt->length;
|
|
||||||
|
|
||||||
if (bytes_avail >= len) {
|
|
||||||
char *buf = h->base + bkt->start + bkt->length;
|
|
||||||
memcpy(buf, str, len);
|
|
||||||
bkt->length += len;
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the string could not be copied into an existing heap
|
|
||||||
* bucket, delegate the work to apr_brigade_write(), which
|
|
||||||
* knows how to grow the brigade
|
|
||||||
*/
|
|
||||||
return apr_brigade_write(bb, flush, ctx, str, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE_NONSTD(apr_status_t) apr_brigade_putstrs(apr_bucket_brigade *b,
|
|
||||||
apr_brigade_flush flush,
|
|
||||||
void *ctx, ...)
|
|
||||||
{
|
|
||||||
va_list va;
|
|
||||||
apr_status_t rv;
|
|
||||||
|
|
||||||
va_start(va, ctx);
|
|
||||||
rv = apr_brigade_vputstrs(b, flush, ctx, va);
|
|
||||||
va_end(va);
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE_NONSTD(apr_status_t) apr_brigade_printf(apr_bucket_brigade *b,
|
|
||||||
apr_brigade_flush flush,
|
|
||||||
void *ctx,
|
|
||||||
const char *fmt, ...)
|
|
||||||
{
|
|
||||||
va_list ap;
|
|
||||||
apr_status_t rv;
|
|
||||||
|
|
||||||
va_start(ap, fmt);
|
|
||||||
rv = apr_brigade_vprintf(b, flush, ctx, fmt, ap);
|
|
||||||
va_end(ap);
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct brigade_vprintf_data_t {
|
|
||||||
apr_vformatter_buff_t vbuff;
|
|
||||||
|
|
||||||
apr_bucket_brigade *b; /* associated brigade */
|
|
||||||
apr_brigade_flush *flusher; /* flushing function */
|
|
||||||
void *ctx;
|
|
||||||
|
|
||||||
char *cbuff; /* buffer to flush from */
|
|
||||||
};
|
|
||||||
|
|
||||||
static apr_status_t brigade_flush(apr_vformatter_buff_t *buff)
|
|
||||||
{
|
|
||||||
/* callback function passed to ap_vformatter to be
|
|
||||||
* called when vformatter needs to buff and
|
|
||||||
* buff.curpos > buff.endpos
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* "downcast," have really passed a brigade_vprintf_data_t* */
|
|
||||||
struct brigade_vprintf_data_t *vd = (struct brigade_vprintf_data_t*)buff;
|
|
||||||
apr_status_t res = APR_SUCCESS;
|
|
||||||
|
|
||||||
res = apr_brigade_write(vd->b, *vd->flusher, vd->ctx, vd->cbuff,
|
|
||||||
APR_BUCKET_BUFF_SIZE);
|
|
||||||
|
|
||||||
if(res != APR_SUCCESS) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
vd->vbuff.curpos = vd->cbuff;
|
|
||||||
vd->vbuff.endpos = vd->cbuff + APR_BUCKET_BUFF_SIZE;
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_brigade_vprintf(apr_bucket_brigade *b,
|
|
||||||
apr_brigade_flush flush,
|
|
||||||
void *ctx,
|
|
||||||
const char *fmt, va_list va)
|
|
||||||
{
|
|
||||||
/* the cast, in order of appearance */
|
|
||||||
struct brigade_vprintf_data_t vd;
|
|
||||||
char buf[APR_BUCKET_BUFF_SIZE];
|
|
||||||
apr_size_t written;
|
|
||||||
|
|
||||||
vd.vbuff.curpos = buf;
|
|
||||||
vd.vbuff.endpos = buf + APR_BUCKET_BUFF_SIZE;
|
|
||||||
vd.b = b;
|
|
||||||
vd.flusher = &flush;
|
|
||||||
vd.ctx = ctx;
|
|
||||||
vd.cbuff = buf;
|
|
||||||
|
|
||||||
written = apr_vformatter(brigade_flush, &vd.vbuff, fmt, va);
|
|
||||||
|
|
||||||
if (written == -1) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* tack on null terminator to remaining string */
|
|
||||||
*(vd.vbuff.curpos) = '\0';
|
|
||||||
|
|
||||||
/* write out what remains in the buffer */
|
|
||||||
return apr_brigade_write(b, flush, ctx, buf, vd.vbuff.curpos - buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* A "safe" maximum bucket size, 1Gb */
|
|
||||||
#define MAX_BUCKET_SIZE (0x40000000)
|
|
||||||
|
|
||||||
APU_DECLARE(apr_bucket *) apr_brigade_insert_file(apr_bucket_brigade *bb,
|
|
||||||
apr_file_t *f,
|
|
||||||
apr_off_t start,
|
|
||||||
apr_off_t length,
|
|
||||||
apr_pool_t *p)
|
|
||||||
{
|
|
||||||
apr_bucket *e;
|
|
||||||
|
|
||||||
if (sizeof(apr_off_t) == sizeof(apr_size_t) || length < MAX_BUCKET_SIZE) {
|
|
||||||
e = apr_bucket_file_create(f, start, (apr_size_t)length, p,
|
|
||||||
bb->bucket_alloc);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* Several buckets are needed. */
|
|
||||||
e = apr_bucket_file_create(f, start, MAX_BUCKET_SIZE, p,
|
|
||||||
bb->bucket_alloc);
|
|
||||||
|
|
||||||
while (length > MAX_BUCKET_SIZE) {
|
|
||||||
apr_bucket *ce;
|
|
||||||
apr_bucket_copy(e, &ce);
|
|
||||||
APR_BRIGADE_INSERT_TAIL(bb, ce);
|
|
||||||
e->start += MAX_BUCKET_SIZE;
|
|
||||||
length -= MAX_BUCKET_SIZE;
|
|
||||||
}
|
|
||||||
e->length = (apr_size_t)length; /* Resize just the last bucket */
|
|
||||||
}
|
|
||||||
|
|
||||||
APR_BRIGADE_INSERT_TAIL(bb, e);
|
|
||||||
return e;
|
|
||||||
}
|
|
|
@ -1,46 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apr_buckets.h"
|
|
||||||
|
|
||||||
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_setaside_noop(apr_bucket *data,
|
|
||||||
apr_pool_t *pool)
|
|
||||||
{
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_setaside_notimpl(apr_bucket *data,
|
|
||||||
apr_pool_t *pool)
|
|
||||||
{
|
|
||||||
return APR_ENOTIMPL;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_split_notimpl(apr_bucket *data,
|
|
||||||
apr_size_t point)
|
|
||||||
{
|
|
||||||
return APR_ENOTIMPL;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_copy_notimpl(apr_bucket *e,
|
|
||||||
apr_bucket **c)
|
|
||||||
{
|
|
||||||
return APR_ENOTIMPL;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE_NONSTD(void) apr_bucket_destroy_noop(void *data)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
|
@ -1,184 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include "apr_buckets.h"
|
|
||||||
#include "apr_allocator.h"
|
|
||||||
|
|
||||||
#define ALLOC_AMT (8192 - APR_MEMNODE_T_SIZE)
|
|
||||||
|
|
||||||
typedef struct node_header_t {
|
|
||||||
apr_size_t size;
|
|
||||||
apr_bucket_alloc_t *alloc;
|
|
||||||
apr_memnode_t *memnode;
|
|
||||||
struct node_header_t *next;
|
|
||||||
} node_header_t;
|
|
||||||
|
|
||||||
#define SIZEOF_NODE_HEADER_T APR_ALIGN_DEFAULT(sizeof(node_header_t))
|
|
||||||
#define SMALL_NODE_SIZE (APR_BUCKET_ALLOC_SIZE + SIZEOF_NODE_HEADER_T)
|
|
||||||
|
|
||||||
/** A list of free memory from which new buckets or private bucket
|
|
||||||
* structures can be allocated.
|
|
||||||
*/
|
|
||||||
struct apr_bucket_alloc_t {
|
|
||||||
apr_pool_t *pool;
|
|
||||||
apr_allocator_t *allocator;
|
|
||||||
node_header_t *freelist;
|
|
||||||
apr_memnode_t *blocks;
|
|
||||||
};
|
|
||||||
|
|
||||||
static apr_status_t alloc_cleanup(void *data)
|
|
||||||
{
|
|
||||||
apr_bucket_alloc_t *list = data;
|
|
||||||
|
|
||||||
apr_allocator_free(list->allocator, list->blocks);
|
|
||||||
|
|
||||||
#if APR_POOL_DEBUG
|
|
||||||
if (list->pool && list->allocator != apr_pool_allocator_get(list->pool)) {
|
|
||||||
apr_allocator_destroy(list->allocator);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE_NONSTD(apr_bucket_alloc_t *) apr_bucket_alloc_create(apr_pool_t *p)
|
|
||||||
{
|
|
||||||
apr_allocator_t *allocator = apr_pool_allocator_get(p);
|
|
||||||
apr_bucket_alloc_t *list;
|
|
||||||
|
|
||||||
#if APR_POOL_DEBUG
|
|
||||||
/* may be NULL for debug mode. */
|
|
||||||
if (allocator == NULL) {
|
|
||||||
if (apr_allocator_create(&allocator) != APR_SUCCESS) {
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
list = apr_bucket_alloc_create_ex(allocator);
|
|
||||||
list->pool = p;
|
|
||||||
apr_pool_cleanup_register(list->pool, list, alloc_cleanup,
|
|
||||||
apr_pool_cleanup_null);
|
|
||||||
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE_NONSTD(apr_bucket_alloc_t *) apr_bucket_alloc_create_ex(
|
|
||||||
apr_allocator_t *allocator)
|
|
||||||
{
|
|
||||||
apr_bucket_alloc_t *list;
|
|
||||||
apr_memnode_t *block;
|
|
||||||
|
|
||||||
block = apr_allocator_alloc(allocator, ALLOC_AMT);
|
|
||||||
list = (apr_bucket_alloc_t *)block->first_avail;
|
|
||||||
list->pool = NULL;
|
|
||||||
list->allocator = allocator;
|
|
||||||
list->freelist = NULL;
|
|
||||||
list->blocks = block;
|
|
||||||
block->first_avail += APR_ALIGN_DEFAULT(sizeof(*list));
|
|
||||||
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE_NONSTD(void) apr_bucket_alloc_destroy(apr_bucket_alloc_t *list)
|
|
||||||
{
|
|
||||||
if (list->pool) {
|
|
||||||
apr_pool_cleanup_kill(list->pool, list, alloc_cleanup);
|
|
||||||
}
|
|
||||||
|
|
||||||
apr_allocator_free(list->allocator, list->blocks);
|
|
||||||
|
|
||||||
#if APR_POOL_DEBUG
|
|
||||||
if (list->pool && list->allocator != apr_pool_allocator_get(list->pool)) {
|
|
||||||
apr_allocator_destroy(list->allocator);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE_NONSTD(void *) apr_bucket_alloc(apr_size_t size,
|
|
||||||
apr_bucket_alloc_t *list)
|
|
||||||
{
|
|
||||||
node_header_t *node;
|
|
||||||
apr_memnode_t *active = list->blocks;
|
|
||||||
char *endp;
|
|
||||||
|
|
||||||
size += SIZEOF_NODE_HEADER_T;
|
|
||||||
if (size <= SMALL_NODE_SIZE) {
|
|
||||||
if (list->freelist) {
|
|
||||||
node = list->freelist;
|
|
||||||
list->freelist = node->next;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
endp = active->first_avail + SMALL_NODE_SIZE;
|
|
||||||
if (endp >= active->endp) {
|
|
||||||
list->blocks = apr_allocator_alloc(list->allocator, ALLOC_AMT);
|
|
||||||
list->blocks->next = active;
|
|
||||||
active = list->blocks;
|
|
||||||
endp = active->first_avail + SMALL_NODE_SIZE;
|
|
||||||
}
|
|
||||||
node = (node_header_t *)active->first_avail;
|
|
||||||
node->alloc = list;
|
|
||||||
node->memnode = active;
|
|
||||||
node->size = SMALL_NODE_SIZE;
|
|
||||||
active->first_avail = endp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
apr_memnode_t *memnode = apr_allocator_alloc(list->allocator, size);
|
|
||||||
node = (node_header_t *)memnode->first_avail;
|
|
||||||
node->alloc = list;
|
|
||||||
node->memnode = memnode;
|
|
||||||
node->size = size;
|
|
||||||
}
|
|
||||||
return ((char *)node) + SIZEOF_NODE_HEADER_T;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef APR_BUCKET_DEBUG
|
|
||||||
#if APR_HAVE_STDLIB_H
|
|
||||||
#include <stdlib.h>
|
|
||||||
#endif
|
|
||||||
static void check_not_already_free(node_header_t *node)
|
|
||||||
{
|
|
||||||
apr_bucket_alloc_t *list = node->alloc;
|
|
||||||
node_header_t *curr = list->freelist;
|
|
||||||
|
|
||||||
while (curr) {
|
|
||||||
if (node == curr) {
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
curr = curr->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
#define check_not_already_free(node)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
APU_DECLARE_NONSTD(void) apr_bucket_free(void *mem)
|
|
||||||
{
|
|
||||||
node_header_t *node = (node_header_t *)((char *)mem - SIZEOF_NODE_HEADER_T);
|
|
||||||
apr_bucket_alloc_t *list = node->alloc;
|
|
||||||
|
|
||||||
if (node->size == SMALL_NODE_SIZE) {
|
|
||||||
check_not_already_free(node);
|
|
||||||
node->next = list->freelist;
|
|
||||||
list->freelist = node;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
apr_allocator_free(list->allocator, node->memnode);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,54 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apr_buckets.h"
|
|
||||||
|
|
||||||
static apr_status_t eos_bucket_read(apr_bucket *b, const char **str,
|
|
||||||
apr_size_t *len, apr_read_type_e block)
|
|
||||||
{
|
|
||||||
*str = NULL;
|
|
||||||
*len = 0;
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_bucket *) apr_bucket_eos_make(apr_bucket *b)
|
|
||||||
{
|
|
||||||
b->length = 0;
|
|
||||||
b->start = 0;
|
|
||||||
b->data = NULL;
|
|
||||||
b->type = &apr_bucket_type_eos;
|
|
||||||
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_bucket *) apr_bucket_eos_create(apr_bucket_alloc_t *list)
|
|
||||||
{
|
|
||||||
apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
|
|
||||||
|
|
||||||
APR_BUCKET_INIT(b);
|
|
||||||
b->free = apr_bucket_free;
|
|
||||||
b->list = list;
|
|
||||||
return apr_bucket_eos_make(b);
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_eos = {
|
|
||||||
"EOS", 5, APR_BUCKET_METADATA,
|
|
||||||
apr_bucket_destroy_noop,
|
|
||||||
eos_bucket_read,
|
|
||||||
apr_bucket_setaside_noop,
|
|
||||||
apr_bucket_split_notimpl,
|
|
||||||
apr_bucket_simple_copy
|
|
||||||
};
|
|
|
@ -1,228 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apr.h"
|
|
||||||
#include "apr_general.h"
|
|
||||||
#include "apr_file_io.h"
|
|
||||||
#include "apr_buckets.h"
|
|
||||||
|
|
||||||
#if APR_HAS_MMAP
|
|
||||||
#include "apr_mmap.h"
|
|
||||||
|
|
||||||
/* mmap support for static files based on ideas from John Heidemann's
|
|
||||||
* patch against 1.0.5. See
|
|
||||||
* <http://www.isi.edu/~johnh/SOFTWARE/APACHE/index.html>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif /* APR_HAS_MMAP */
|
|
||||||
|
|
||||||
static void file_bucket_destroy(void *data)
|
|
||||||
{
|
|
||||||
apr_bucket_file *f = data;
|
|
||||||
|
|
||||||
if (apr_bucket_shared_destroy(f)) {
|
|
||||||
/* no need to close the file here; it will get
|
|
||||||
* done automatically when the pool gets cleaned up */
|
|
||||||
apr_bucket_free(f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#if APR_HAS_MMAP
|
|
||||||
static int file_make_mmap(apr_bucket *e, apr_size_t filelength,
|
|
||||||
apr_off_t fileoffset, apr_pool_t *p)
|
|
||||||
{
|
|
||||||
apr_bucket_file *a = e->data;
|
|
||||||
apr_mmap_t *mm;
|
|
||||||
|
|
||||||
if (!a->can_mmap) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (filelength > APR_MMAP_LIMIT) {
|
|
||||||
if (apr_mmap_create(&mm, a->fd, fileoffset, APR_MMAP_LIMIT,
|
|
||||||
APR_MMAP_READ, p) != APR_SUCCESS)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
apr_bucket_split(e, APR_MMAP_LIMIT);
|
|
||||||
filelength = APR_MMAP_LIMIT;
|
|
||||||
}
|
|
||||||
else if ((filelength < APR_MMAP_THRESHOLD) ||
|
|
||||||
(apr_mmap_create(&mm, a->fd, fileoffset, filelength,
|
|
||||||
APR_MMAP_READ, p) != APR_SUCCESS))
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
apr_bucket_mmap_make(e, mm, 0, filelength);
|
|
||||||
file_bucket_destroy(a);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static apr_status_t file_bucket_read(apr_bucket *e, const char **str,
|
|
||||||
apr_size_t *len, apr_read_type_e block)
|
|
||||||
{
|
|
||||||
apr_bucket_file *a = e->data;
|
|
||||||
apr_file_t *f = a->fd;
|
|
||||||
apr_bucket *b = NULL;
|
|
||||||
char *buf;
|
|
||||||
apr_status_t rv;
|
|
||||||
apr_size_t filelength = e->length; /* bytes remaining in file past offset */
|
|
||||||
apr_off_t fileoffset = e->start;
|
|
||||||
#if APR_HAS_THREADS && !APR_HAS_XTHREAD_FILES
|
|
||||||
apr_int32_t flags;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if APR_HAS_MMAP
|
|
||||||
if (file_make_mmap(e, filelength, fileoffset, a->readpool)) {
|
|
||||||
return apr_bucket_read(e, str, len, block);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if APR_HAS_THREADS && !APR_HAS_XTHREAD_FILES
|
|
||||||
if ((flags = apr_file_flags_get(f)) & APR_XTHREAD) {
|
|
||||||
/* this file descriptor is shared across multiple threads and
|
|
||||||
* this OS doesn't support that natively, so as a workaround
|
|
||||||
* we must reopen the file into a->readpool */
|
|
||||||
const char *fname;
|
|
||||||
apr_file_name_get(&fname, f);
|
|
||||||
|
|
||||||
rv = apr_file_open(&f, fname, (flags & ~APR_XTHREAD), 0, a->readpool);
|
|
||||||
if (rv != APR_SUCCESS)
|
|
||||||
return rv;
|
|
||||||
|
|
||||||
a->fd = f;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
*len = (filelength > APR_BUCKET_BUFF_SIZE)
|
|
||||||
? APR_BUCKET_BUFF_SIZE
|
|
||||||
: filelength;
|
|
||||||
*str = NULL; /* in case we die prematurely */
|
|
||||||
buf = apr_bucket_alloc(*len, e->list);
|
|
||||||
|
|
||||||
/* Handle offset ... */
|
|
||||||
rv = apr_file_seek(f, APR_SET, &fileoffset);
|
|
||||||
if (rv != APR_SUCCESS) {
|
|
||||||
apr_bucket_free(buf);
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
rv = apr_file_read(f, buf, len);
|
|
||||||
if (rv != APR_SUCCESS && rv != APR_EOF) {
|
|
||||||
apr_bucket_free(buf);
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
filelength -= *len;
|
|
||||||
/*
|
|
||||||
* Change the current bucket to refer to what we read,
|
|
||||||
* even if we read nothing because we hit EOF.
|
|
||||||
*/
|
|
||||||
apr_bucket_heap_make(e, buf, *len, apr_bucket_free);
|
|
||||||
|
|
||||||
/* If we have more to read from the file, then create another bucket */
|
|
||||||
if (filelength > 0 && rv != APR_EOF) {
|
|
||||||
/* for efficiency, we can just build a new apr_bucket struct
|
|
||||||
* to wrap around the existing file bucket */
|
|
||||||
b = apr_bucket_alloc(sizeof(*b), e->list);
|
|
||||||
b->start = fileoffset + (*len);
|
|
||||||
b->length = filelength;
|
|
||||||
b->data = a;
|
|
||||||
b->type = &apr_bucket_type_file;
|
|
||||||
b->free = apr_bucket_free;
|
|
||||||
b->list = e->list;
|
|
||||||
APR_BUCKET_INSERT_AFTER(e, b);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
file_bucket_destroy(a);
|
|
||||||
}
|
|
||||||
|
|
||||||
*str = buf;
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_bucket *) apr_bucket_file_make(apr_bucket *b, apr_file_t *fd,
|
|
||||||
apr_off_t offset,
|
|
||||||
apr_size_t len, apr_pool_t *p)
|
|
||||||
{
|
|
||||||
apr_bucket_file *f;
|
|
||||||
|
|
||||||
f = apr_bucket_alloc(sizeof(*f), b->list);
|
|
||||||
f->fd = fd;
|
|
||||||
f->readpool = p;
|
|
||||||
#if APR_HAS_MMAP
|
|
||||||
f->can_mmap = 1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
b = apr_bucket_shared_make(b, f, offset, len);
|
|
||||||
b->type = &apr_bucket_type_file;
|
|
||||||
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_bucket *) apr_bucket_file_create(apr_file_t *fd,
|
|
||||||
apr_off_t offset,
|
|
||||||
apr_size_t len, apr_pool_t *p,
|
|
||||||
apr_bucket_alloc_t *list)
|
|
||||||
{
|
|
||||||
apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
|
|
||||||
|
|
||||||
APR_BUCKET_INIT(b);
|
|
||||||
b->free = apr_bucket_free;
|
|
||||||
b->list = list;
|
|
||||||
return apr_bucket_file_make(b, fd, offset, len, p);
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_bucket_file_enable_mmap(apr_bucket *e,
|
|
||||||
int enabled)
|
|
||||||
{
|
|
||||||
#if APR_HAS_MMAP
|
|
||||||
apr_bucket_file *a = e->data;
|
|
||||||
a->can_mmap = enabled;
|
|
||||||
return APR_SUCCESS;
|
|
||||||
#else
|
|
||||||
return APR_ENOTIMPL;
|
|
||||||
#endif /* APR_HAS_MMAP */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static apr_status_t file_bucket_setaside(apr_bucket *data, apr_pool_t *reqpool)
|
|
||||||
{
|
|
||||||
apr_bucket_file *a = data->data;
|
|
||||||
apr_file_t *fd = NULL;
|
|
||||||
apr_file_t *f = a->fd;
|
|
||||||
apr_pool_t *curpool = apr_file_pool_get(f);
|
|
||||||
|
|
||||||
if (apr_pool_is_ancestor(curpool, reqpool)) {
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!apr_pool_is_ancestor(a->readpool, reqpool)) {
|
|
||||||
a->readpool = reqpool;
|
|
||||||
}
|
|
||||||
|
|
||||||
apr_file_setaside(&fd, f, reqpool);
|
|
||||||
a->fd = fd;
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_file = {
|
|
||||||
"FILE", 5, APR_BUCKET_DATA,
|
|
||||||
file_bucket_destroy,
|
|
||||||
file_bucket_read,
|
|
||||||
file_bucket_setaside,
|
|
||||||
apr_bucket_shared_split,
|
|
||||||
apr_bucket_shared_copy
|
|
||||||
};
|
|
|
@ -1,54 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apr_buckets.h"
|
|
||||||
|
|
||||||
static apr_status_t flush_bucket_read(apr_bucket *b, const char **str,
|
|
||||||
apr_size_t *len, apr_read_type_e block)
|
|
||||||
{
|
|
||||||
*str = NULL;
|
|
||||||
*len = 0;
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_bucket *) apr_bucket_flush_make(apr_bucket *b)
|
|
||||||
{
|
|
||||||
b->length = 0;
|
|
||||||
b->start = 0;
|
|
||||||
b->data = NULL;
|
|
||||||
b->type = &apr_bucket_type_flush;
|
|
||||||
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_bucket *) apr_bucket_flush_create(apr_bucket_alloc_t *list)
|
|
||||||
{
|
|
||||||
apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
|
|
||||||
|
|
||||||
APR_BUCKET_INIT(b);
|
|
||||||
b->free = apr_bucket_free;
|
|
||||||
b->list = list;
|
|
||||||
return apr_bucket_flush_make(b);
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_flush = {
|
|
||||||
"FLUSH", 5, APR_BUCKET_METADATA,
|
|
||||||
apr_bucket_destroy_noop,
|
|
||||||
flush_bucket_read,
|
|
||||||
apr_bucket_setaside_noop,
|
|
||||||
apr_bucket_split_notimpl,
|
|
||||||
apr_bucket_simple_copy
|
|
||||||
};
|
|
|
@ -1,96 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apr_buckets.h"
|
|
||||||
#define APR_WANT_MEMFUNC
|
|
||||||
#include "apr_want.h"
|
|
||||||
|
|
||||||
static apr_status_t heap_bucket_read(apr_bucket *b, const char **str,
|
|
||||||
apr_size_t *len, apr_read_type_e block)
|
|
||||||
{
|
|
||||||
apr_bucket_heap *h = b->data;
|
|
||||||
|
|
||||||
*str = h->base + b->start;
|
|
||||||
*len = b->length;
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void heap_bucket_destroy(void *data)
|
|
||||||
{
|
|
||||||
apr_bucket_heap *h = data;
|
|
||||||
|
|
||||||
if (apr_bucket_shared_destroy(h)) {
|
|
||||||
(*h->free_func)(h->base);
|
|
||||||
apr_bucket_free(h);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Warning: if you change this function, be sure to
|
|
||||||
* change apr_bucket_pool_make() too! */
|
|
||||||
APU_DECLARE(apr_bucket *) apr_bucket_heap_make(apr_bucket *b, const char *buf,
|
|
||||||
apr_size_t length,
|
|
||||||
void (*free_func)(void *data))
|
|
||||||
{
|
|
||||||
apr_bucket_heap *h;
|
|
||||||
|
|
||||||
h = apr_bucket_alloc(sizeof(*h), b->list);
|
|
||||||
|
|
||||||
if (!free_func) {
|
|
||||||
h->alloc_len = length;
|
|
||||||
h->base = apr_bucket_alloc(h->alloc_len, b->list);
|
|
||||||
if (h->base == NULL) {
|
|
||||||
apr_bucket_free(h);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
h->free_func = apr_bucket_free;
|
|
||||||
memcpy(h->base, buf, length);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* XXX: we lose the const qualifier here which indicates
|
|
||||||
* there's something screwy with the API...
|
|
||||||
*/
|
|
||||||
h->base = (char *) buf;
|
|
||||||
h->alloc_len = length;
|
|
||||||
h->free_func = free_func;
|
|
||||||
}
|
|
||||||
|
|
||||||
b = apr_bucket_shared_make(b, h, 0, length);
|
|
||||||
b->type = &apr_bucket_type_heap;
|
|
||||||
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_bucket *) apr_bucket_heap_create(const char *buf,
|
|
||||||
apr_size_t length,
|
|
||||||
void (*free_func)(void *data),
|
|
||||||
apr_bucket_alloc_t *list)
|
|
||||||
{
|
|
||||||
apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
|
|
||||||
|
|
||||||
APR_BUCKET_INIT(b);
|
|
||||||
b->free = apr_bucket_free;
|
|
||||||
b->list = list;
|
|
||||||
return apr_bucket_heap_make(b, buf, length, free_func);
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_heap = {
|
|
||||||
"HEAP", 5, APR_BUCKET_DATA,
|
|
||||||
heap_bucket_destroy,
|
|
||||||
heap_bucket_read,
|
|
||||||
apr_bucket_setaside_noop,
|
|
||||||
apr_bucket_shared_split,
|
|
||||||
apr_bucket_shared_copy
|
|
||||||
};
|
|
|
@ -1,144 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apr_buckets.h"
|
|
||||||
|
|
||||||
#if APR_HAS_MMAP
|
|
||||||
|
|
||||||
static apr_status_t mmap_bucket_read(apr_bucket *b, const char **str,
|
|
||||||
apr_size_t *length, apr_read_type_e block)
|
|
||||||
{
|
|
||||||
apr_bucket_mmap *m = b->data;
|
|
||||||
apr_status_t ok;
|
|
||||||
void *addr;
|
|
||||||
|
|
||||||
if (!m->mmap) {
|
|
||||||
/* the apr_mmap_t was already cleaned up out from under us */
|
|
||||||
return APR_EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ok = apr_mmap_offset(&addr, m->mmap, b->start);
|
|
||||||
if (ok != APR_SUCCESS) {
|
|
||||||
return ok;
|
|
||||||
}
|
|
||||||
*str = addr;
|
|
||||||
*length = b->length;
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t mmap_bucket_cleanup(void *data)
|
|
||||||
{
|
|
||||||
/* the apr_mmap_t is about to disappear out from under us, so we
|
|
||||||
* have no choice but to pretend it doesn't exist anymore. the
|
|
||||||
* refcount is now useless because there's nothing to refer to
|
|
||||||
* anymore. so the only valid action on any remaining referrer
|
|
||||||
* is to delete it. no more reads, no more anything. */
|
|
||||||
apr_bucket_mmap *m = data;
|
|
||||||
|
|
||||||
m->mmap = NULL;
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void mmap_bucket_destroy(void *data)
|
|
||||||
{
|
|
||||||
apr_bucket_mmap *m = data;
|
|
||||||
|
|
||||||
if (apr_bucket_shared_destroy(m)) {
|
|
||||||
if (m->mmap) {
|
|
||||||
apr_pool_cleanup_kill(m->mmap->cntxt, m, mmap_bucket_cleanup);
|
|
||||||
apr_mmap_delete(m->mmap);
|
|
||||||
}
|
|
||||||
apr_bucket_free(m);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* XXX: are the start and length arguments useful?
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_bucket *) apr_bucket_mmap_make(apr_bucket *b, apr_mmap_t *mm,
|
|
||||||
apr_off_t start,
|
|
||||||
apr_size_t length)
|
|
||||||
{
|
|
||||||
apr_bucket_mmap *m;
|
|
||||||
|
|
||||||
m = apr_bucket_alloc(sizeof(*m), b->list);
|
|
||||||
m->mmap = mm;
|
|
||||||
|
|
||||||
apr_pool_cleanup_register(mm->cntxt, m, mmap_bucket_cleanup,
|
|
||||||
apr_pool_cleanup_null);
|
|
||||||
|
|
||||||
b = apr_bucket_shared_make(b, m, start, length);
|
|
||||||
b->type = &apr_bucket_type_mmap;
|
|
||||||
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
APU_DECLARE(apr_bucket *) apr_bucket_mmap_create(apr_mmap_t *mm,
|
|
||||||
apr_off_t start,
|
|
||||||
apr_size_t length,
|
|
||||||
apr_bucket_alloc_t *list)
|
|
||||||
{
|
|
||||||
apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
|
|
||||||
|
|
||||||
APR_BUCKET_INIT(b);
|
|
||||||
b->free = apr_bucket_free;
|
|
||||||
b->list = list;
|
|
||||||
return apr_bucket_mmap_make(b, mm, start, length);
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t mmap_bucket_setaside(apr_bucket *b, apr_pool_t *p)
|
|
||||||
{
|
|
||||||
apr_bucket_mmap *m = b->data;
|
|
||||||
apr_mmap_t *mm = m->mmap;
|
|
||||||
apr_mmap_t *new_mm;
|
|
||||||
apr_status_t ok;
|
|
||||||
|
|
||||||
if (!mm) {
|
|
||||||
/* the apr_mmap_t was already cleaned up out from under us */
|
|
||||||
return APR_EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* shortcut if possible */
|
|
||||||
if (apr_pool_is_ancestor(mm->cntxt, p)) {
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* duplicate apr_mmap_t into new pool */
|
|
||||||
ok = apr_mmap_dup(&new_mm, mm, p);
|
|
||||||
if (ok != APR_SUCCESS) {
|
|
||||||
return ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* decrement refcount on old apr_bucket_mmap */
|
|
||||||
mmap_bucket_destroy(m);
|
|
||||||
|
|
||||||
/* create new apr_bucket_mmap pointing to new apr_mmap_t */
|
|
||||||
apr_bucket_mmap_make(b, new_mm, b->start, b->length);
|
|
||||||
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_mmap = {
|
|
||||||
"MMAP", 5, APR_BUCKET_DATA,
|
|
||||||
mmap_bucket_destroy,
|
|
||||||
mmap_bucket_read,
|
|
||||||
mmap_bucket_setaside,
|
|
||||||
apr_bucket_shared_split,
|
|
||||||
apr_bucket_shared_copy
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,119 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apr_buckets.h"
|
|
||||||
|
|
||||||
static apr_status_t pipe_bucket_read(apr_bucket *a, const char **str,
|
|
||||||
apr_size_t *len, apr_read_type_e block)
|
|
||||||
{
|
|
||||||
apr_file_t *p = a->data;
|
|
||||||
char *buf;
|
|
||||||
apr_status_t rv;
|
|
||||||
apr_interval_time_t timeout;
|
|
||||||
|
|
||||||
if (block == APR_NONBLOCK_READ) {
|
|
||||||
apr_file_pipe_timeout_get(p, &timeout);
|
|
||||||
apr_file_pipe_timeout_set(p, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
*str = NULL;
|
|
||||||
*len = APR_BUCKET_BUFF_SIZE;
|
|
||||||
buf = apr_bucket_alloc(*len, a->list); /* XXX: check for failure? */
|
|
||||||
|
|
||||||
rv = apr_file_read(p, buf, len);
|
|
||||||
|
|
||||||
if (block == APR_NONBLOCK_READ) {
|
|
||||||
apr_file_pipe_timeout_set(p, timeout);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rv != APR_SUCCESS && rv != APR_EOF) {
|
|
||||||
apr_bucket_free(buf);
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* If there's more to read we have to keep the rest of the pipe
|
|
||||||
* for later. Otherwise, we'll close the pipe.
|
|
||||||
* XXX: Note that more complicated bucket types that
|
|
||||||
* refer to data not in memory and must therefore have a read()
|
|
||||||
* function similar to this one should be wary of copying this
|
|
||||||
* code because if they have a destroy function they probably
|
|
||||||
* want to migrate the bucket's subordinate structure from the
|
|
||||||
* old bucket to a raw new one and adjust it as appropriate,
|
|
||||||
* rather than destroying the old one and creating a completely
|
|
||||||
* new bucket.
|
|
||||||
*/
|
|
||||||
if (*len > 0) {
|
|
||||||
apr_bucket_heap *h;
|
|
||||||
/* Change the current bucket to refer to what we read */
|
|
||||||
a = apr_bucket_heap_make(a, buf, *len, apr_bucket_free);
|
|
||||||
h = a->data;
|
|
||||||
h->alloc_len = APR_BUCKET_BUFF_SIZE; /* note the real buffer size */
|
|
||||||
*str = buf;
|
|
||||||
APR_BUCKET_INSERT_AFTER(a, apr_bucket_pipe_create(p, a->list));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
apr_bucket_free(buf);
|
|
||||||
a = apr_bucket_immortal_make(a, "", 0);
|
|
||||||
*str = a->data;
|
|
||||||
if (rv == APR_EOF) {
|
|
||||||
apr_file_close(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_bucket *) apr_bucket_pipe_make(apr_bucket *b, apr_file_t *p)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* A pipe is closed when the end is reached in pipe_bucket_read(). If
|
|
||||||
* the pipe isn't read to the end (e.g., error path), the pipe will be
|
|
||||||
* closed when its pool goes away.
|
|
||||||
*
|
|
||||||
* Note that typically the pipe is allocated from the request pool
|
|
||||||
* so it will disappear when the request is finished. However the
|
|
||||||
* core filter may decide to set aside the tail end of a CGI
|
|
||||||
* response if the connection is pipelined. This turns out not to
|
|
||||||
* be a problem because the core will have read to the end of the
|
|
||||||
* stream so the bucket(s) that it sets aside will be the heap
|
|
||||||
* buckets created by pipe_bucket_read() above.
|
|
||||||
*/
|
|
||||||
b->type = &apr_bucket_type_pipe;
|
|
||||||
b->length = (apr_size_t)(-1);
|
|
||||||
b->start = -1;
|
|
||||||
b->data = p;
|
|
||||||
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_bucket *) apr_bucket_pipe_create(apr_file_t *p,
|
|
||||||
apr_bucket_alloc_t *list)
|
|
||||||
{
|
|
||||||
apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
|
|
||||||
|
|
||||||
APR_BUCKET_INIT(b);
|
|
||||||
b->free = apr_bucket_free;
|
|
||||||
b->list = list;
|
|
||||||
return apr_bucket_pipe_make(b, p);
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_pipe = {
|
|
||||||
"PIPE", 5, APR_BUCKET_DATA,
|
|
||||||
apr_bucket_destroy_noop,
|
|
||||||
pipe_bucket_read,
|
|
||||||
apr_bucket_setaside_notimpl,
|
|
||||||
apr_bucket_split_notimpl,
|
|
||||||
apr_bucket_copy_notimpl
|
|
||||||
};
|
|
|
@ -1,142 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apr_buckets.h"
|
|
||||||
#define APR_WANT_MEMFUNC
|
|
||||||
#include "apr_want.h"
|
|
||||||
|
|
||||||
static apr_status_t pool_bucket_cleanup(void *data)
|
|
||||||
{
|
|
||||||
apr_bucket_pool *p = data;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If the pool gets cleaned up, we have to copy the data out
|
|
||||||
* of the pool and onto the heap. But the apr_buckets out there
|
|
||||||
* that point to this pool bucket need to be notified such that
|
|
||||||
* they can morph themselves into a regular heap bucket the next
|
|
||||||
* time they try to read. To avoid having to manipulate
|
|
||||||
* reference counts and b->data pointers, the apr_bucket_pool
|
|
||||||
* actually _contains_ an apr_bucket_heap as its first element,
|
|
||||||
* so the two share their apr_bucket_refcount member, and you
|
|
||||||
* can typecast a pool bucket struct to make it look like a
|
|
||||||
* regular old heap bucket struct.
|
|
||||||
*/
|
|
||||||
p->heap.base = apr_bucket_alloc(p->heap.alloc_len, p->list);
|
|
||||||
memcpy(p->heap.base, p->base, p->heap.alloc_len);
|
|
||||||
p->base = NULL;
|
|
||||||
p->pool = NULL;
|
|
||||||
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t pool_bucket_read(apr_bucket *b, const char **str,
|
|
||||||
apr_size_t *len, apr_read_type_e block)
|
|
||||||
{
|
|
||||||
apr_bucket_pool *p = b->data;
|
|
||||||
const char *base = p->base;
|
|
||||||
|
|
||||||
if (p->pool == NULL) {
|
|
||||||
/*
|
|
||||||
* pool has been cleaned up... masquerade as a heap bucket from now
|
|
||||||
* on. subsequent bucket operations will use the heap bucket code.
|
|
||||||
*/
|
|
||||||
b->type = &apr_bucket_type_heap;
|
|
||||||
base = p->heap.base;
|
|
||||||
}
|
|
||||||
*str = base + b->start;
|
|
||||||
*len = b->length;
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void pool_bucket_destroy(void *data)
|
|
||||||
{
|
|
||||||
apr_bucket_pool *p = data;
|
|
||||||
|
|
||||||
/* If the pool is cleaned up before the last reference goes
|
|
||||||
* away, the data is really now on the heap; heap_destroy() takes
|
|
||||||
* over. free() in heap_destroy() thinks it's freeing
|
|
||||||
* an apr_bucket_heap, when in reality it's freeing the whole
|
|
||||||
* apr_bucket_pool for us.
|
|
||||||
*/
|
|
||||||
if (p->pool) {
|
|
||||||
/* the shared resource is still in the pool
|
|
||||||
* because the pool has not been cleaned up yet
|
|
||||||
*/
|
|
||||||
if (apr_bucket_shared_destroy(p)) {
|
|
||||||
apr_pool_cleanup_kill(p->pool, p, pool_bucket_cleanup);
|
|
||||||
apr_bucket_free(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* the shared resource is no longer in the pool, it's
|
|
||||||
* on the heap, but this reference still thinks it's a pool
|
|
||||||
* bucket. we should just go ahead and pass control to
|
|
||||||
* heap_destroy() for it since it doesn't know any better.
|
|
||||||
*/
|
|
||||||
apr_bucket_type_heap.destroy(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_bucket *) apr_bucket_pool_make(apr_bucket *b,
|
|
||||||
const char *buf, apr_size_t length, apr_pool_t *pool)
|
|
||||||
{
|
|
||||||
apr_bucket_pool *p;
|
|
||||||
|
|
||||||
p = apr_bucket_alloc(sizeof(*p), b->list);
|
|
||||||
|
|
||||||
/* XXX: we lose the const qualifier here which indicates
|
|
||||||
* there's something screwy with the API...
|
|
||||||
*/
|
|
||||||
/* XXX: why is this? buf is const, p->base is const... what's
|
|
||||||
* the problem? --jcw */
|
|
||||||
p->base = (char *) buf;
|
|
||||||
p->pool = pool;
|
|
||||||
p->list = b->list;
|
|
||||||
|
|
||||||
b = apr_bucket_shared_make(b, p, 0, length);
|
|
||||||
b->type = &apr_bucket_type_pool;
|
|
||||||
|
|
||||||
/* pre-initialize heap bucket member */
|
|
||||||
p->heap.alloc_len = length;
|
|
||||||
p->heap.base = NULL;
|
|
||||||
p->heap.free_func = apr_bucket_free;
|
|
||||||
|
|
||||||
apr_pool_cleanup_register(p->pool, p, pool_bucket_cleanup,
|
|
||||||
apr_pool_cleanup_null);
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_bucket *) apr_bucket_pool_create(const char *buf,
|
|
||||||
apr_size_t length,
|
|
||||||
apr_pool_t *pool,
|
|
||||||
apr_bucket_alloc_t *list)
|
|
||||||
{
|
|
||||||
apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
|
|
||||||
|
|
||||||
APR_BUCKET_INIT(b);
|
|
||||||
b->free = apr_bucket_free;
|
|
||||||
b->list = list;
|
|
||||||
return apr_bucket_pool_make(b, buf, length, pool);
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_pool = {
|
|
||||||
"POOL", 5, APR_BUCKET_DATA,
|
|
||||||
pool_bucket_destroy,
|
|
||||||
pool_bucket_read,
|
|
||||||
apr_bucket_setaside_noop, /* don't need to setaside thanks to the cleanup*/
|
|
||||||
apr_bucket_shared_split,
|
|
||||||
apr_bucket_shared_copy
|
|
||||||
};
|
|
|
@ -1,64 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apr_buckets.h"
|
|
||||||
|
|
||||||
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_shared_split(apr_bucket *a,
|
|
||||||
apr_size_t point)
|
|
||||||
{
|
|
||||||
apr_bucket_refcount *r = a->data;
|
|
||||||
apr_status_t rv;
|
|
||||||
|
|
||||||
if ((rv = apr_bucket_simple_split(a, point)) != APR_SUCCESS) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
r->refcount++;
|
|
||||||
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_shared_copy(apr_bucket *a,
|
|
||||||
apr_bucket **b)
|
|
||||||
{
|
|
||||||
apr_bucket_refcount *r = a->data;
|
|
||||||
|
|
||||||
apr_bucket_simple_copy(a, b);
|
|
||||||
r->refcount++;
|
|
||||||
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(int) apr_bucket_shared_destroy(void *data)
|
|
||||||
{
|
|
||||||
apr_bucket_refcount *r = data;
|
|
||||||
r->refcount--;
|
|
||||||
return (r->refcount == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_bucket *) apr_bucket_shared_make(apr_bucket *b, void *data,
|
|
||||||
apr_off_t start,
|
|
||||||
apr_size_t length)
|
|
||||||
{
|
|
||||||
apr_bucket_refcount *r = data;
|
|
||||||
|
|
||||||
b->data = r;
|
|
||||||
b->start = start;
|
|
||||||
b->length = length;
|
|
||||||
/* caller initializes the type field */
|
|
||||||
r->refcount = 1;
|
|
||||||
|
|
||||||
return b;
|
|
||||||
}
|
|
|
@ -1,137 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apr_buckets.h"
|
|
||||||
|
|
||||||
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_simple_copy(apr_bucket *a,
|
|
||||||
apr_bucket **b)
|
|
||||||
{
|
|
||||||
*b = apr_bucket_alloc(sizeof(**b), a->list); /* XXX: check for failure? */
|
|
||||||
**b = *a;
|
|
||||||
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_simple_split(apr_bucket *a,
|
|
||||||
apr_size_t point)
|
|
||||||
{
|
|
||||||
apr_bucket *b;
|
|
||||||
|
|
||||||
if (point > a->length) {
|
|
||||||
return APR_EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
apr_bucket_simple_copy(a, &b);
|
|
||||||
|
|
||||||
a->length = point;
|
|
||||||
b->length -= point;
|
|
||||||
b->start += point;
|
|
||||||
|
|
||||||
APR_BUCKET_INSERT_AFTER(a, b);
|
|
||||||
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t simple_bucket_read(apr_bucket *b, const char **str,
|
|
||||||
apr_size_t *len, apr_read_type_e block)
|
|
||||||
{
|
|
||||||
*str = (char *)b->data + b->start;
|
|
||||||
*len = b->length;
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_bucket *) apr_bucket_immortal_make(apr_bucket *b,
|
|
||||||
const char *buf,
|
|
||||||
apr_size_t length)
|
|
||||||
{
|
|
||||||
b->data = (char *)buf;
|
|
||||||
b->length = length;
|
|
||||||
b->start = 0;
|
|
||||||
b->type = &apr_bucket_type_immortal;
|
|
||||||
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_bucket *) apr_bucket_immortal_create(const char *buf,
|
|
||||||
apr_size_t length,
|
|
||||||
apr_bucket_alloc_t *list)
|
|
||||||
{
|
|
||||||
apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
|
|
||||||
|
|
||||||
APR_BUCKET_INIT(b);
|
|
||||||
b->free = apr_bucket_free;
|
|
||||||
b->list = list;
|
|
||||||
return apr_bucket_immortal_make(b, buf, length);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* XXX: This function could do with some tweaking to reduce memory
|
|
||||||
* usage in various cases, e.g. share buffers in the heap between all
|
|
||||||
* the buckets that are set aside, or even spool set-aside data to
|
|
||||||
* disk if it gets too voluminous (but if it does then that's probably
|
|
||||||
* a bug elsewhere). There should probably be a apr_brigade_setaside()
|
|
||||||
* function that co-ordinates the action of all the bucket setaside
|
|
||||||
* functions to improve memory efficiency.
|
|
||||||
*/
|
|
||||||
static apr_status_t transient_bucket_setaside(apr_bucket *b, apr_pool_t *pool)
|
|
||||||
{
|
|
||||||
b = apr_bucket_heap_make(b, (char *)b->data + b->start, b->length, NULL);
|
|
||||||
if (b == NULL) {
|
|
||||||
return APR_ENOMEM;
|
|
||||||
}
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_bucket *) apr_bucket_transient_make(apr_bucket *b,
|
|
||||||
const char *buf,
|
|
||||||
apr_size_t length)
|
|
||||||
{
|
|
||||||
b->data = (char *)buf;
|
|
||||||
b->length = length;
|
|
||||||
b->start = 0;
|
|
||||||
b->type = &apr_bucket_type_transient;
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_bucket *) apr_bucket_transient_create(const char *buf,
|
|
||||||
apr_size_t length,
|
|
||||||
apr_bucket_alloc_t *list)
|
|
||||||
{
|
|
||||||
apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
|
|
||||||
|
|
||||||
APR_BUCKET_INIT(b);
|
|
||||||
b->free = apr_bucket_free;
|
|
||||||
b->list = list;
|
|
||||||
return apr_bucket_transient_make(b, buf, length);
|
|
||||||
}
|
|
||||||
|
|
||||||
const apr_bucket_type_t apr_bucket_type_immortal = {
|
|
||||||
"IMMORTAL", 5, APR_BUCKET_DATA,
|
|
||||||
apr_bucket_destroy_noop,
|
|
||||||
simple_bucket_read,
|
|
||||||
apr_bucket_setaside_noop,
|
|
||||||
apr_bucket_simple_split,
|
|
||||||
apr_bucket_simple_copy
|
|
||||||
};
|
|
||||||
|
|
||||||
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_transient = {
|
|
||||||
"TRANSIENT", 5, APR_BUCKET_DATA,
|
|
||||||
apr_bucket_destroy_noop,
|
|
||||||
simple_bucket_read,
|
|
||||||
transient_bucket_setaside,
|
|
||||||
apr_bucket_simple_split,
|
|
||||||
apr_bucket_simple_copy
|
|
||||||
};
|
|
|
@ -1,114 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apr_buckets.h"
|
|
||||||
|
|
||||||
static apr_status_t socket_bucket_read(apr_bucket *a, const char **str,
|
|
||||||
apr_size_t *len, apr_read_type_e block)
|
|
||||||
{
|
|
||||||
apr_socket_t *p = a->data;
|
|
||||||
char *buf;
|
|
||||||
apr_status_t rv;
|
|
||||||
apr_interval_time_t timeout;
|
|
||||||
|
|
||||||
if (block == APR_NONBLOCK_READ) {
|
|
||||||
apr_socket_timeout_get(p, &timeout);
|
|
||||||
apr_socket_timeout_set(p, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
*str = NULL;
|
|
||||||
*len = APR_BUCKET_BUFF_SIZE;
|
|
||||||
buf = apr_bucket_alloc(*len, a->list); /* XXX: check for failure? */
|
|
||||||
|
|
||||||
rv = apr_socket_recv(p, buf, len);
|
|
||||||
|
|
||||||
if (block == APR_NONBLOCK_READ) {
|
|
||||||
apr_socket_timeout_set(p, timeout);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rv != APR_SUCCESS && rv != APR_EOF) {
|
|
||||||
apr_bucket_free(buf);
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* If there's more to read we have to keep the rest of the socket
|
|
||||||
* for later. XXX: Note that more complicated bucket types that
|
|
||||||
* refer to data not in memory and must therefore have a read()
|
|
||||||
* function similar to this one should be wary of copying this
|
|
||||||
* code because if they have a destroy function they probably
|
|
||||||
* want to migrate the bucket's subordinate structure from the
|
|
||||||
* old bucket to a raw new one and adjust it as appropriate,
|
|
||||||
* rather than destroying the old one and creating a completely
|
|
||||||
* new bucket.
|
|
||||||
*
|
|
||||||
* Even if there is nothing more to read, don't close the socket here
|
|
||||||
* as we have to use it to send any response :) We could shut it
|
|
||||||
* down for reading, but there is no benefit to doing so.
|
|
||||||
*/
|
|
||||||
if (*len > 0) {
|
|
||||||
apr_bucket_heap *h;
|
|
||||||
/* Change the current bucket to refer to what we read */
|
|
||||||
a = apr_bucket_heap_make(a, buf, *len, apr_bucket_free);
|
|
||||||
h = a->data;
|
|
||||||
h->alloc_len = APR_BUCKET_BUFF_SIZE; /* note the real buffer size */
|
|
||||||
*str = buf;
|
|
||||||
APR_BUCKET_INSERT_AFTER(a, apr_bucket_socket_create(p, a->list));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
apr_bucket_free(buf);
|
|
||||||
a = apr_bucket_immortal_make(a, "", 0);
|
|
||||||
*str = a->data;
|
|
||||||
}
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_bucket *) apr_bucket_socket_make(apr_bucket *b, apr_socket_t *p)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* XXX: We rely on a cleanup on some pool or other to actually
|
|
||||||
* destroy the socket. We should probably explicitly call apr to
|
|
||||||
* destroy it instead.
|
|
||||||
*
|
|
||||||
* Note that typically the socket is allocated from the connection pool
|
|
||||||
* so it will disappear when the connection is finished.
|
|
||||||
*/
|
|
||||||
b->type = &apr_bucket_type_socket;
|
|
||||||
b->length = (apr_size_t)(-1);
|
|
||||||
b->start = -1;
|
|
||||||
b->data = p;
|
|
||||||
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_bucket *) apr_bucket_socket_create(apr_socket_t *p,
|
|
||||||
apr_bucket_alloc_t *list)
|
|
||||||
{
|
|
||||||
apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
|
|
||||||
|
|
||||||
APR_BUCKET_INIT(b);
|
|
||||||
b->free = apr_bucket_free;
|
|
||||||
b->list = list;
|
|
||||||
return apr_bucket_socket_make(b, p);
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_socket = {
|
|
||||||
"SOCKET", 5, APR_BUCKET_DATA,
|
|
||||||
apr_bucket_destroy_noop,
|
|
||||||
socket_bucket_read,
|
|
||||||
apr_bucket_setaside_notimpl,
|
|
||||||
apr_bucket_split_notimpl,
|
|
||||||
apr_bucket_copy_notimpl
|
|
||||||
};
|
|
|
@ -1,40 +0,0 @@
|
||||||
# DO NOT EDIT. AUTOMATICALLY GENERATED.
|
|
||||||
|
|
||||||
crypto/apr_md5.lo: crypto/apr_md5.c .make.dirs include/apr_xlate.h include/apr_md5.h include/apr_sha1.h
|
|
||||||
crypto/uuid.lo: crypto/uuid.c .make.dirs include/apr_uuid.h
|
|
||||||
crypto/apr_sha1.lo: crypto/apr_sha1.c .make.dirs include/apr_xlate.h include/apr_sha1.h include/apr_base64.h
|
|
||||||
crypto/getuuid.lo: crypto/getuuid.c .make.dirs include/apr_uuid.h include/apr_md5.h include/apr_xlate.h
|
|
||||||
crypto/apr_md4.lo: crypto/apr_md4.c .make.dirs include/apr_md4.h include/apr_xlate.h
|
|
||||||
encoding/apr_base64.lo: encoding/apr_base64.c .make.dirs include/apr_base64.h include/apr_xlate.h
|
|
||||||
hooks/apr_hooks.lo: hooks/apr_hooks.c .make.dirs include/apr_optional_hooks.h include/apr_optional.h include/apr_hooks.h
|
|
||||||
misc/apr_reslist.lo: misc/apr_reslist.c .make.dirs include/apr_reslist.h
|
|
||||||
misc/apr_rmm.lo: misc/apr_rmm.c .make.dirs include/apr_rmm.h include/apr_anylock.h
|
|
||||||
misc/apr_date.lo: misc/apr_date.c .make.dirs include/apr_date.h
|
|
||||||
misc/apu_version.lo: misc/apu_version.c .make.dirs include/apu_version.h
|
|
||||||
misc/apr_queue.lo: misc/apr_queue.c .make.dirs include/apr_queue.h
|
|
||||||
uri/apr_uri.lo: uri/apr_uri.c .make.dirs include/apr_uri.h
|
|
||||||
xml/apr_xml.lo: xml/apr_xml.c .make.dirs include/apr_xml.h include/apr_xlate.h
|
|
||||||
strmatch/apr_strmatch.lo: strmatch/apr_strmatch.c .make.dirs include/apr_strmatch.h
|
|
||||||
xlate/xlate.lo: xlate/xlate.c .make.dirs include/apr_xlate.h
|
|
||||||
|
|
||||||
OBJECTS_all = crypto/apr_md5.lo crypto/uuid.lo crypto/apr_sha1.lo crypto/getuuid.lo crypto/apr_md4.lo encoding/apr_base64.lo hooks/apr_hooks.lo misc/apr_reslist.lo misc/apr_rmm.lo misc/apr_date.lo misc/apu_version.lo misc/apr_queue.lo uri/apr_uri.lo xml/apr_xml.lo strmatch/apr_strmatch.lo xlate/xlate.lo
|
|
||||||
|
|
||||||
OBJECTS_unix = $(OBJECTS_all)
|
|
||||||
|
|
||||||
OBJECTS_aix = $(OBJECTS_all)
|
|
||||||
|
|
||||||
OBJECTS_beos = $(OBJECTS_all)
|
|
||||||
|
|
||||||
OBJECTS_os2 = $(OBJECTS_all)
|
|
||||||
|
|
||||||
OBJECTS_os390 = $(OBJECTS_all)
|
|
||||||
|
|
||||||
HEADERS = $(top_srcdir)/include/apr_optional.h $(top_srcdir)/include/apu_version.h $(top_srcdir)/include/apr_strmatch.h $(top_srcdir)/include/apr_optional_hooks.h $(top_srcdir)/include/apr_sdbm.h $(top_srcdir)/include/apr_md4.h $(top_srcdir)/include/apr_reslist.h $(top_srcdir)/include/apr_base64.h $(top_srcdir)/include/apr_xml.h $(top_srcdir)/include/apr_anylock.h $(top_srcdir)/include/apr_rmm.h $(top_srcdir)/include/apr_md5.h $(top_srcdir)/include/apr_date.h $(top_srcdir)/include/apr_hooks.h $(top_srcdir)/include/apr_xlate.h $(top_srcdir)/include/apr_queue.h $(top_srcdir)/include/apr_uri.h $(top_srcdir)/include/apr_uuid.h $(top_srcdir)/include/apr_sha1.h
|
|
||||||
|
|
||||||
SOURCE_DIRS = xml encoding hooks misc crypto uri strmatch xlate $(EXTRA_SOURCE_DIRS)
|
|
||||||
|
|
||||||
BUILD_DIRS = crypto encoding hooks misc strmatch uri xlate xml
|
|
||||||
|
|
||||||
.make.dirs: $(srcdir)/build-outputs.mk
|
|
||||||
@for d in $(BUILD_DIRS); do test -d $$d || mkdir $$d; done
|
|
||||||
@echo timestamp > $@
|
|
|
@ -1,32 +0,0 @@
|
||||||
#
|
|
||||||
# Configuration file for APRUTIL. Used by APR/build/gen-build.py
|
|
||||||
#
|
|
||||||
|
|
||||||
[options]
|
|
||||||
|
|
||||||
# the platform-independent .c files
|
|
||||||
paths =
|
|
||||||
buckets/*.c
|
|
||||||
crypto/*.c
|
|
||||||
dbm/*.c
|
|
||||||
dbm/sdbm/*.c
|
|
||||||
encoding/*.c
|
|
||||||
hooks/*.c
|
|
||||||
ldap/*.c
|
|
||||||
misc/*.c
|
|
||||||
uri/apr_uri.c
|
|
||||||
xml/*.c
|
|
||||||
strmatch/*.c
|
|
||||||
xlate/*.c
|
|
||||||
dbd/*.c
|
|
||||||
|
|
||||||
# we have no platform-specific subdirs
|
|
||||||
platform_dirs =
|
|
||||||
|
|
||||||
# the public headers
|
|
||||||
headers = include/*.h
|
|
||||||
|
|
||||||
# gen_uri_delim.c
|
|
||||||
|
|
||||||
# we have a recursive makefile for the test files (for now)
|
|
||||||
# test/*.c
|
|
|
@ -1,435 +0,0 @@
|
||||||
dnl -------------------------------------------------------- -*- autoconf -*-
|
|
||||||
dnl Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
dnl applicable.
|
|
||||||
dnl
|
|
||||||
dnl Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
dnl you may not use this file except in compliance with the License.
|
|
||||||
dnl You may obtain a copy of the License at
|
|
||||||
dnl
|
|
||||||
dnl http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
dnl
|
|
||||||
dnl Unless required by applicable law or agreed to in writing, software
|
|
||||||
dnl distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
dnl See the License for the specific language governing permissions and
|
|
||||||
dnl limitations under the License.
|
|
||||||
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl custom autoconf rules for APRUTIL
|
|
||||||
dnl
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl APU_FIND_APR: figure out where APR is located
|
|
||||||
dnl
|
|
||||||
AC_DEFUN([APU_FIND_APR], [
|
|
||||||
|
|
||||||
dnl use the find_apr.m4 script to locate APR. sets apr_found and apr_config
|
|
||||||
APR_FIND_APR(,,,[1])
|
|
||||||
if test "$apr_found" = "no"; then
|
|
||||||
AC_MSG_ERROR(APR could not be located. Please use the --with-apr option.)
|
|
||||||
fi
|
|
||||||
|
|
||||||
APR_BUILD_DIR="`$apr_config --installbuilddir`"
|
|
||||||
|
|
||||||
dnl make APR_BUILD_DIR an absolute directory (we'll need it in the
|
|
||||||
dnl sub-projects in some cases)
|
|
||||||
APR_BUILD_DIR="`cd $APR_BUILD_DIR && pwd`"
|
|
||||||
|
|
||||||
APR_INCLUDES="`$apr_config --includes`"
|
|
||||||
APR_LIBS="`$apr_config --link-libtool --libs`"
|
|
||||||
APR_SO_EXT="`$apr_config --apr-so-ext`"
|
|
||||||
APR_LIB_TARGET="`$apr_config --apr-lib-target`"
|
|
||||||
|
|
||||||
AC_SUBST(APR_INCLUDES)
|
|
||||||
AC_SUBST(APR_LIBS)
|
|
||||||
AC_SUBST(APR_BUILD_DIR)
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl APU_TEST_EXPAT(directory): test if Expat is located in the specified dir
|
|
||||||
dnl
|
|
||||||
dnl if present: sets expat_include_dir, expat_libs, possibly expat_old
|
|
||||||
dnl
|
|
||||||
AC_DEFUN([APU_TEST_EXPAT], [
|
|
||||||
AC_MSG_CHECKING(for Expat in ifelse($2,,$1,$2))
|
|
||||||
|
|
||||||
expat_libtool=""
|
|
||||||
|
|
||||||
if test -r "$1/lib/expat.h.in"; then
|
|
||||||
dnl Expat 1.95.* distribution
|
|
||||||
expat_include_dir="$1/lib"
|
|
||||||
expat_ldflags="-L$1/lib"
|
|
||||||
expat_libs="-lexpat"
|
|
||||||
expat_libtool="$1/lib/libexpat.la"
|
|
||||||
elif test -r "$1/include/expat.h" -a \
|
|
||||||
-r "$1/lib/libexpat.la"; then
|
|
||||||
dnl Expat 1.95.* installation (with libtool)
|
|
||||||
expat_include_dir="$1/include"
|
|
||||||
expat_ldflags="-L$1/lib"
|
|
||||||
expat_libs="-lexpat"
|
|
||||||
expat_libtool="$1/lib/libexpat.la"
|
|
||||||
elif test -r "$1/include/expat.h" -a \
|
|
||||||
-r "$1/lib64/libexpat.la"; then
|
|
||||||
dnl Expat 1.95.* installation on certain 64-bit platforms (with libtool)
|
|
||||||
expat_include_dir="$1/include"
|
|
||||||
expat_ldflags="-L$1/lib64"
|
|
||||||
expat_libs="-lexpat"
|
|
||||||
expat_libtool="$1/lib64/libexpat.la"
|
|
||||||
elif test -r "$1/include/expat.h" -a \
|
|
||||||
-r "$1/lib/libexpat.a"; then
|
|
||||||
dnl Expat 1.95.* installation (without libtool)
|
|
||||||
dnl FreeBSD textproc/expat2
|
|
||||||
expat_include_dir="$1/include"
|
|
||||||
expat_ldflags="-L$1/lib"
|
|
||||||
expat_libs="-lexpat"
|
|
||||||
elif test -r "$1/xmlparse.h"; then
|
|
||||||
dnl maybe an expat-lite. use this dir for both includes and libs
|
|
||||||
expat_include_dir="$1"
|
|
||||||
expat_ldflags="-L$1"
|
|
||||||
expat_libs="-lexpat"
|
|
||||||
expat_libtool="$1/libexpat.la"
|
|
||||||
expat_old=yes
|
|
||||||
elif test -r "$1/include/xmlparse.h" -a \
|
|
||||||
-r "$1/lib/libexpat.a"; then
|
|
||||||
dnl previously installed expat
|
|
||||||
expat_include_dir="$1/include"
|
|
||||||
expat_ldflags="-L$1/lib"
|
|
||||||
expat_libs="-lexpat"
|
|
||||||
expat_old=yes
|
|
||||||
elif test -r "$1/include/xml/xmlparse.h" -a \
|
|
||||||
-r "$1/lib/xml/libexpat.a"; then
|
|
||||||
dnl previously installed expat
|
|
||||||
expat_include_dir="$1/include/xml"
|
|
||||||
expat_ldflags="-L$1/lib"
|
|
||||||
expat_libs="-lexpat"
|
|
||||||
expat_old=yes
|
|
||||||
elif test -r "$1/include/xmltok/xmlparse.h"; then
|
|
||||||
dnl Debian distribution
|
|
||||||
expat_include_dir="$1/include/xmltok"
|
|
||||||
expat_ldflags="-L$1/lib"
|
|
||||||
expat_libs="-lxmlparse -lxmltok"
|
|
||||||
expat_old=yes
|
|
||||||
elif test -r "$1/include/xml/xmlparse.h" -a \
|
|
||||||
-r "$1/lib/libexpat.a"; then
|
|
||||||
dnl FreeBSD textproc/expat package
|
|
||||||
expat_include_dir="$1/include/xml"
|
|
||||||
expat_ldflags="-L$1/lib"
|
|
||||||
expat_libs="-lexpat"
|
|
||||||
expat_old=yes
|
|
||||||
elif test -r "$1/xmlparse/xmlparse.h"; then
|
|
||||||
dnl Expat 1.0 or 1.1 source directory
|
|
||||||
expat_include_dir="$1/xmlparse"
|
|
||||||
expat_ldflags="-L$1"
|
|
||||||
expat_libs="-lexpat"
|
|
||||||
expat_old=yes
|
|
||||||
fi
|
|
||||||
dnl ### test for installed Expat 1.95.* distros
|
|
||||||
|
|
||||||
if test -n "$expat_include_dir"; then
|
|
||||||
dnl ### more info about what we found there? version? using .la?
|
|
||||||
AC_MSG_RESULT(yes)
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT(no)
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl APU_FIND_EXPAT: figure out where EXPAT is located (or use bundled)
|
|
||||||
dnl
|
|
||||||
AC_DEFUN([APU_FIND_EXPAT], [
|
|
||||||
|
|
||||||
AC_ARG_WITH([expat],
|
|
||||||
[ --with-expat=DIR specify Expat location or 'builtin'], [
|
|
||||||
if test "$withval" = "yes"; then
|
|
||||||
AC_MSG_ERROR([a directory must be specified for --with-expat])
|
|
||||||
elif test "$withval" = "no"; then
|
|
||||||
AC_MSG_ERROR([Expat cannot be disabled (at this time)])
|
|
||||||
elif test "$withval" = "builtin"; then
|
|
||||||
abs_expatdir="`cd $srcdir/xml/expat && pwd`"
|
|
||||||
if test -d $abs_expatdir/. -a ! -d xml/expat/.; then
|
|
||||||
$mkdir_p xml/expat
|
|
||||||
fi
|
|
||||||
APU_TEST_EXPAT($abs_expatdir, xml/expat)
|
|
||||||
else
|
|
||||||
abs_expatdir="`cd $withval && pwd`"
|
|
||||||
APU_TEST_EXPAT($abs_expatdir, $withval)
|
|
||||||
if test -z "$expat_include_dir"; then
|
|
||||||
AC_MSG_ERROR([Expat was not found (or recognized) in \"$withval\"])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
if test -z "$expat_include_dir"; then
|
|
||||||
for d in /usr /usr/local xml/expat-cvs xml/expat $srcdir/xml/expat ; do
|
|
||||||
APU_TEST_EXPAT($d)
|
|
||||||
if test -n "$expat_include_dir"; then
|
|
||||||
dnl For /usr installs of expat, we can't specify -L/usr/lib
|
|
||||||
if test "$d" = "/usr"; then
|
|
||||||
expat_ldflags=""
|
|
||||||
fi
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
if test -z "$expat_include_dir"; then
|
|
||||||
AC_MSG_ERROR([could not locate Expat. use --with-expat])
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl If this expat doesn't use libtool natively, we'll mimic it for our
|
|
||||||
dnl dependency library generation.
|
|
||||||
if test -z "$expat_libtool"; then
|
|
||||||
expat_libtool="$expat_ldflags $expat_libs"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -n "$expat_old"; then
|
|
||||||
AC_DEFINE(APR_HAVE_OLD_EXPAT, 1, [define if Expat 1.0 or 1.1 was found])
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl special-case the bundled distribution (use absolute dirs)
|
|
||||||
if test "$expat_include_dir" = "xml/expat/lib" -o "$expat_include_dir" = "xml/expat-cvs/lib"; then
|
|
||||||
bundled_subdir="`echo $expat_include_dir | sed -e 's%/lib%%'`"
|
|
||||||
APR_SUBDIR_CONFIG($bundled_subdir, [--prefix=$prefix --exec-prefix=$exec_prefix --libdir=$libdir --includedir=$includedir --bindir=$bindir])
|
|
||||||
expat_include_dir=$top_builddir/$bundled_subdir/lib
|
|
||||||
expat_ldflags="-L$top_builddir/$bundled_subdir/lib"
|
|
||||||
expat_libs="-lexpat"
|
|
||||||
expat_libtool=$top_builddir/$bundled_subdir/lib/libexpat.la
|
|
||||||
APR_XML_SUBDIRS="`echo $bundled_subdir | sed -e 's%xml/%%'`"
|
|
||||||
APR_ADDTO(APRUTIL_EXPORT_LIBS, [$expat_libtool])
|
|
||||||
else
|
|
||||||
if test "$expat_include_dir" = "$abs_srcdir/xml/expat/include" -o "$expat_include_dir" = "$abs_srcdir/xml/expat/lib"; then
|
|
||||||
dnl This is a bit of a hack. This only works because we know that
|
|
||||||
dnl we are working with the bundled version of the software.
|
|
||||||
bundled_subdir="xml/expat"
|
|
||||||
APR_SUBDIR_CONFIG($bundled_subdir, [--prefix=$prefix --exec-prefix=$exec_prefix --libdir=$libdir --includedir=$includedir --bindir=$bindir])
|
|
||||||
expat_include_dir=$top_builddir/$bundled_subdir/lib
|
|
||||||
expat_ldflags="-L$top_builddir/$bundled_subdir/lib"
|
|
||||||
expat_libs="-lexpat"
|
|
||||||
expat_libtool=$top_builddir/$bundled_subdir/lib/libexpat.la
|
|
||||||
APR_XML_SUBDIRS="`echo $bundled_subdir | sed -e 's%xml/%%'`"
|
|
||||||
APR_ADDTO(APRUTIL_EXPORT_LIBS, [$expat_libtool])
|
|
||||||
else
|
|
||||||
APR_ADDTO(APRUTIL_EXPORT_LIBS, [$expat_libs])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
APR_XML_DIR=$bundled_subdir
|
|
||||||
APR_XML_EXPAT_OLD=$expat_old
|
|
||||||
AC_SUBST(APR_XML_SUBDIRS)
|
|
||||||
AC_SUBST(APR_XML_DIR)
|
|
||||||
AC_SUBST(APR_XML_EXPAT_OLD)
|
|
||||||
|
|
||||||
if test "$expat_include_dir" != "/usr/include"; then
|
|
||||||
APR_ADDTO(APRUTIL_INCLUDES, [-I$expat_include_dir])
|
|
||||||
fi
|
|
||||||
APR_ADDTO(APRUTIL_LDFLAGS, [$expat_ldflags])
|
|
||||||
APR_ADDTO(APRUTIL_LIBS, [$expat_libtool])
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl Find a particular LDAP library
|
|
||||||
dnl
|
|
||||||
AC_DEFUN([APU_FIND_LDAPLIB], [
|
|
||||||
if test ${apu_has_ldap} != "1"; then
|
|
||||||
ldaplib=$1
|
|
||||||
extralib=$2
|
|
||||||
unset ac_cv_lib_${ldaplib}_ldap_init
|
|
||||||
unset ac_cv_lib_${ldaplib}___ldap_init
|
|
||||||
AC_CHECK_LIB(${ldaplib}, ldap_init,
|
|
||||||
[
|
|
||||||
APR_ADDTO(APRUTIL_EXPORT_LIBS,[-l${ldaplib} ${extralib}])
|
|
||||||
APR_ADDTO(APRUTIL_LIBS,[-l${ldaplib} ${extralib}])
|
|
||||||
AC_CHECK_LIB(${ldaplib}, ldapssl_client_init, apu_has_ldapssl_client_init="1", , ${extralib})
|
|
||||||
AC_CHECK_LIB(${ldaplib}, ldapssl_client_deinit, apu_has_ldapssl_client_deinit="1", , ${extralib})
|
|
||||||
AC_CHECK_LIB(${ldaplib}, ldapssl_add_trusted_cert, apu_has_ldapssl_add_trusted_cert="1", , ${extralib})
|
|
||||||
AC_CHECK_LIB(${ldaplib}, ldap_start_tls_s, apu_has_ldap_start_tls_s="1", , ${extralib})
|
|
||||||
AC_CHECK_LIB(${ldaplib}, ldap_sslinit, apu_has_ldap_sslinit="1", , ${extralib})
|
|
||||||
AC_CHECK_LIB(${ldaplib}, ldapssl_init, apu_has_ldapssl_init="1", , ${extralib})
|
|
||||||
AC_CHECK_LIB(${ldaplib}, ldapssl_install_routines, apu_has_ldapssl_install_routines="1", , ${extralib})
|
|
||||||
apu_has_ldap="1";
|
|
||||||
], , ${extralib})
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl APU_FIND_LDAP: figure out where LDAP is located
|
|
||||||
dnl
|
|
||||||
AC_DEFUN([APU_FIND_LDAP], [
|
|
||||||
|
|
||||||
echo $ac_n "${nl}checking for ldap support..."
|
|
||||||
|
|
||||||
apu_has_ldap="0";
|
|
||||||
apu_has_ldapssl_client_init="0"
|
|
||||||
apu_has_ldapssl_client_deinit="0"
|
|
||||||
apu_has_ldapssl_add_trusted_cert="0"
|
|
||||||
apu_has_ldap_start_tls_s="0"
|
|
||||||
apu_has_ldapssl_init="0"
|
|
||||||
apu_has_ldap_sslinit="0"
|
|
||||||
apu_has_ldapssl_install_routines="0"
|
|
||||||
apu_has_ldap_openldap="0"
|
|
||||||
apu_has_ldap_solaris="0"
|
|
||||||
apu_has_ldap_novell="0"
|
|
||||||
apu_has_ldap_microsoft="0"
|
|
||||||
apu_has_ldap_netscape="0"
|
|
||||||
apu_has_ldap_mozilla="0"
|
|
||||||
apu_has_ldap_other="0"
|
|
||||||
|
|
||||||
AC_ARG_WITH(ldap-include,[ --with-ldap-include=path path to ldap include files with trailing slash])
|
|
||||||
AC_ARG_WITH(ldap-lib,[ --with-ldap-lib=path path to ldap lib file])
|
|
||||||
AC_ARG_WITH(ldap,[ --with-ldap=library ldap library to use],
|
|
||||||
[
|
|
||||||
save_cppflags="$CPPFLAGS"
|
|
||||||
save_ldflags="$LDFLAGS"
|
|
||||||
save_libs="$LIBS"
|
|
||||||
if test -n "$with_ldap_include"; then
|
|
||||||
CPPFLAGS="$CPPFLAGS -I$with_ldap_include"
|
|
||||||
APR_ADDTO(APRUTIL_INCLUDES, [-I$with_ldap_include])
|
|
||||||
fi
|
|
||||||
if test -n "$with_ldap_lib"; then
|
|
||||||
LDFLAGS="$LDFLAGS -L$with_ldap_lib"
|
|
||||||
APR_ADDTO(APRUTIL_LDFLAGS, [-L$with_ldap_lib])
|
|
||||||
fi
|
|
||||||
|
|
||||||
LIBLDAP="$withval"
|
|
||||||
if test "$LIBLDAP" = "yes"; then
|
|
||||||
dnl The iPlanet C SDK 5.0 is as yet untested...
|
|
||||||
APU_FIND_LDAPLIB("ldap50", "-lnspr4 -lplc4 -lplds4 -liutil50 -llber50 -lldif50 -lnss3 -lprldap50 -lssl3 -lssldap50")
|
|
||||||
APU_FIND_LDAPLIB("ldapssl41", "-lnspr3 -lplc3 -lplds3")
|
|
||||||
APU_FIND_LDAPLIB("ldapssl40")
|
|
||||||
APU_FIND_LDAPLIB("ldapssl30")
|
|
||||||
APU_FIND_LDAPLIB("ldapssl20")
|
|
||||||
APU_FIND_LDAPLIB("ldapsdk", "-lldapx -lldapssl -lldapgss -lgssapi_krb5")
|
|
||||||
APU_FIND_LDAPLIB("ldapsdk", "-lldapx -lldapssl -lldapgss -lgss -lresolv -lsocket")
|
|
||||||
APU_FIND_LDAPLIB("ldap", "-llber")
|
|
||||||
APU_FIND_LDAPLIB("ldap", "-llber -lresolv")
|
|
||||||
APU_FIND_LDAPLIB("ldap", "-llber -lresolv -lsocket -lnsl")
|
|
||||||
APU_FIND_LDAPLIB("ldap", "-ldl -lpthread")
|
|
||||||
else
|
|
||||||
APU_FIND_LDAPLIB($LIBLDAP)
|
|
||||||
APU_FIND_LDAPLIB($LIBLDAP, "-lresolv")
|
|
||||||
APU_FIND_LDAPLIB($LIBLDAP, "-lresolv -lsocket -lnsl")
|
|
||||||
APU_FIND_LDAPLIB($LIBLDAP, "-ldl -lpthread")
|
|
||||||
fi
|
|
||||||
|
|
||||||
test ${apu_has_ldap} != "1" && AC_MSG_ERROR(could not find an LDAP library)
|
|
||||||
AC_CHECK_LIB(lber, ber_init)
|
|
||||||
|
|
||||||
AC_CHECK_HEADERS(lber.h, lber_h=["#include <lber.h>"])
|
|
||||||
|
|
||||||
# Solaris has a problem in <ldap.h> which prevents it from
|
|
||||||
# being included by itself. Check for <ldap.h> manually,
|
|
||||||
# including lber.h first.
|
|
||||||
AC_CACHE_CHECK([for ldap.h], [apr_cv_hdr_ldap_h],
|
|
||||||
[AC_TRY_CPP(
|
|
||||||
[#ifdef HAVE_LBER_H
|
|
||||||
#include <lber.h>
|
|
||||||
#endif
|
|
||||||
#include <ldap.h>
|
|
||||||
], [apr_cv_hdr_ldap_h=yes], [apr_cv_hdr_ldap_h=no])])
|
|
||||||
if test "$apr_cv_hdr_ldap_h" = "yes"; then
|
|
||||||
ldap_h=["#include <ldap.h>"]
|
|
||||||
AC_DEFINE([HAVE_LDAP_H], 1, [Defined if ldap.h is present])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_CHECK_HEADERS(ldap_ssl.h, ldap_ssl_h=["#include <ldap_ssl.h>"])
|
|
||||||
|
|
||||||
if test "$apr_cv_hdr_ldap_h" = "yes"; then
|
|
||||||
AC_CACHE_CHECK([for LDAP toolkit],
|
|
||||||
[apr_cv_ldap_toolkit], [
|
|
||||||
if test "x$apr_cv_ldap_toolkit" = "x"; then
|
|
||||||
AC_EGREP_CPP([OpenLDAP], [$lber_h
|
|
||||||
$ldap_h
|
|
||||||
LDAP_VENDOR_NAME], [apu_has_ldap_openldap="1"
|
|
||||||
apr_cv_ldap_toolkit="OpenLDAP"])
|
|
||||||
fi
|
|
||||||
if test "x$apr_cv_ldap_toolkit" = "x"; then
|
|
||||||
AC_EGREP_CPP([Sun Microsystems Inc.], [$lber_h
|
|
||||||
$ldap_h
|
|
||||||
LDAP_VENDOR_NAME], [apu_has_ldap_solaris="1"
|
|
||||||
apr_cv_ldap_toolkit="Solaris"])
|
|
||||||
fi
|
|
||||||
if test "x$apr_cv_ldap_toolkit" = "x"; then
|
|
||||||
AC_EGREP_CPP([Novell], [$lber_h
|
|
||||||
$ldap_h
|
|
||||||
LDAP_VENDOR_NAME], [apu_has_ldap_novell="1"
|
|
||||||
apr_cv_ldap_toolkit="Novell"])
|
|
||||||
fi
|
|
||||||
if test "x$apr_cv_ldap_toolkit" = "x"; then
|
|
||||||
AC_EGREP_CPP([Microsoft Corporation.], [$lber_h
|
|
||||||
$ldap_h
|
|
||||||
LDAP_VENDOR_NAME], [apu_has_ldap_microsoft="1"
|
|
||||||
apr_cv_ldap_toolkit="Microsoft"])
|
|
||||||
fi
|
|
||||||
if test "x$apr_cv_ldap_toolkit" = "x"; then
|
|
||||||
AC_EGREP_CPP([Netscape Communications Corp.], [$lber_h
|
|
||||||
$ldap_h
|
|
||||||
LDAP_VENDOR_NAME], [apu_has_ldap_netscape="1"
|
|
||||||
apr_cv_ldap_toolkit="Netscape"])
|
|
||||||
fi
|
|
||||||
if test "x$apr_cv_ldap_toolkit" = "x"; then
|
|
||||||
AC_EGREP_CPP([mozilla.org], [$lber_h
|
|
||||||
$ldap_h
|
|
||||||
LDAP_VENDOR_NAME], [apu_has_ldap_mozilla="1"
|
|
||||||
apr_cv_ldap_toolkit="Mozilla"])
|
|
||||||
fi
|
|
||||||
if test "x$apr_cv_ldap_toolkit" = "x"; then
|
|
||||||
apu_has_ldap_other="1"
|
|
||||||
apr_cv_ldap_toolkit="unknown"
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
fi
|
|
||||||
|
|
||||||
CPPFLAGS=$save_cppflags
|
|
||||||
LDFLAGS=$save_ldflags
|
|
||||||
LIBS=$save_libs
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_SUBST(ldap_h)
|
|
||||||
AC_SUBST(lber_h)
|
|
||||||
AC_SUBST(ldap_ssl_h)
|
|
||||||
AC_SUBST(apu_has_ldapssl_client_init)
|
|
||||||
AC_SUBST(apu_has_ldapssl_client_deinit)
|
|
||||||
AC_SUBST(apu_has_ldapssl_add_trusted_cert)
|
|
||||||
AC_SUBST(apu_has_ldap_start_tls_s)
|
|
||||||
AC_SUBST(apu_has_ldapssl_init)
|
|
||||||
AC_SUBST(apu_has_ldap_sslinit)
|
|
||||||
AC_SUBST(apu_has_ldapssl_install_routines)
|
|
||||||
AC_SUBST(apu_has_ldap)
|
|
||||||
AC_SUBST(apu_has_ldap_openldap)
|
|
||||||
AC_SUBST(apu_has_ldap_solaris)
|
|
||||||
AC_SUBST(apu_has_ldap_novell)
|
|
||||||
AC_SUBST(apu_has_ldap_microsoft)
|
|
||||||
AC_SUBST(apu_has_ldap_netscape)
|
|
||||||
AC_SUBST(apu_has_ldap_mozilla)
|
|
||||||
AC_SUBST(apu_has_ldap_other)
|
|
||||||
|
|
||||||
])
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl APU_CHECK_CRYPT_R_STYLE
|
|
||||||
dnl
|
|
||||||
dnl Decide which of a couple of flavors of crypt_r() is necessary for
|
|
||||||
dnl this platform.
|
|
||||||
dnl
|
|
||||||
AC_DEFUN([APU_CHECK_CRYPT_R_STYLE], [
|
|
||||||
|
|
||||||
AC_CACHE_CHECK([style of crypt_r], apr_cv_crypt_r_style,
|
|
||||||
[AC_TRY_COMPILE([#include <crypt.h>],
|
|
||||||
[CRYPTD buffer;
|
|
||||||
crypt_r("passwd", "hash", &buffer);],
|
|
||||||
[apr_cv_crypt_r_style=cryptd],
|
|
||||||
[AC_TRY_COMPILE([#include <crypt.h>],
|
|
||||||
[struct crypt_data buffer;
|
|
||||||
crypt_r("passwd", "hash", &buffer);],
|
|
||||||
[apr_cv_crypt_r_style=struct_crypt_data],
|
|
||||||
[apr_cv_crypt_r_style=none])])])
|
|
||||||
|
|
||||||
if test "$apr_cv_crypt_r_style" = "cryptd"; then
|
|
||||||
AC_DEFINE(CRYPT_R_CRYPTD, 1, [Define if crypt_r has uses CRYPTD])
|
|
||||||
elif test "$apr_cv_crypt_r_style" = "struct_crypt_data"; then
|
|
||||||
AC_DEFINE(CRYPT_R_STRUCT_CRYPT_DATA, 1, [Define if crypt_r uses struct crypt_data])
|
|
||||||
fi
|
|
||||||
])
|
|
|
@ -1,61 +0,0 @@
|
||||||
dnl -------------------------------------------------------- -*- autoconf -*-
|
|
||||||
dnl Copyright 2003-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
dnl applicable.
|
|
||||||
dnl
|
|
||||||
dnl Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
dnl you may not use this file except in compliance with the License.
|
|
||||||
dnl You may obtain a copy of the License at
|
|
||||||
dnl
|
|
||||||
dnl http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
dnl
|
|
||||||
dnl Unless required by applicable law or agreed to in writing, software
|
|
||||||
dnl distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
dnl See the License for the specific language governing permissions and
|
|
||||||
dnl limitations under the License.
|
|
||||||
|
|
||||||
dnl -----------------------------------------------------------------
|
|
||||||
dnl apu-hints.m4: apr-util's autoconf macros for platform-specific hints
|
|
||||||
dnl
|
|
||||||
dnl We preload various configure settings depending
|
|
||||||
dnl on previously obtained platform knowledge.
|
|
||||||
dnl We allow all settings to be overridden from
|
|
||||||
dnl the command-line.
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl APU_PRELOAD
|
|
||||||
dnl
|
|
||||||
dnl Preload various build parameters based on outside knowledge.
|
|
||||||
dnl
|
|
||||||
AC_DEFUN([APU_PRELOAD], [
|
|
||||||
if test "x$apu_preload_done" != "xyes" ; then
|
|
||||||
apu_preload_done="yes"
|
|
||||||
|
|
||||||
echo "Applying apr-util hints file rules for $host"
|
|
||||||
|
|
||||||
case "$host" in
|
|
||||||
*-dec-osf*)
|
|
||||||
APR_SETIFNULL(apu_crypt_threadsafe, [1])
|
|
||||||
;;
|
|
||||||
*-hp-hpux11.*)
|
|
||||||
APR_SETIFNULL(apu_crypt_threadsafe, [1])
|
|
||||||
;;
|
|
||||||
*-ibm-aix4*|*-ibm-aix5.1*)
|
|
||||||
APR_SETIFNULL(apu_iconv_inbuf_const, [1])
|
|
||||||
;;
|
|
||||||
*-ibm-os390)
|
|
||||||
APR_SETIFNULL(apu_crypt_threadsafe, [1])
|
|
||||||
;;
|
|
||||||
*-solaris2*)
|
|
||||||
APR_SETIFNULL(apu_iconv_inbuf_const, [1])
|
|
||||||
APR_SETIFNULL(apu_crypt_threadsafe, [1])
|
|
||||||
;;
|
|
||||||
*-sco3.2v5*)
|
|
||||||
APR_SETIFNULL(apu_db_xtra_libs, [-lsocket])
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
|
@ -1,123 +0,0 @@
|
||||||
dnl -------------------------------------------------------- -*- autoconf -*-
|
|
||||||
dnl Copyright 2002-2005 The Apache Software Foundation, or its licensors, as
|
|
||||||
dnl applicable.
|
|
||||||
dnl
|
|
||||||
dnl Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
dnl you may not use this file except in compliance with the License.
|
|
||||||
dnl You may obtain a copy of the License at
|
|
||||||
dnl
|
|
||||||
dnl http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
dnl
|
|
||||||
dnl Unless required by applicable law or agreed to in writing, software
|
|
||||||
dnl distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
dnl See the License for the specific language governing permissions and
|
|
||||||
dnl limitations under the License.
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl APU_TRY_ICONV[ IF-SUCCESS, IF-FAILURE ]: try to compile for iconv.
|
|
||||||
dnl
|
|
||||||
AC_DEFUN([APU_TRY_ICONV], [
|
|
||||||
AC_TRY_LINK([
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <iconv.h>
|
|
||||||
],
|
|
||||||
[
|
|
||||||
iconv_t cd = iconv_open("", "");
|
|
||||||
iconv(cd, NULL, NULL, NULL, NULL);
|
|
||||||
], [$1], [$2])
|
|
||||||
])
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl APU_FIND_ICONV: find an iconv library
|
|
||||||
dnl
|
|
||||||
AC_DEFUN([APU_FIND_ICONV], [
|
|
||||||
|
|
||||||
apu_iconv_dir="unknown"
|
|
||||||
have_apr_iconv="0"
|
|
||||||
AC_ARG_WITH(iconv,[ --with-iconv[=DIR] path to iconv installation],
|
|
||||||
[ apu_iconv_dir="$withval"
|
|
||||||
if test "$apu_iconv_dir" != "yes"; then
|
|
||||||
APR_ADDTO(CPPFLAGS,[-I$apu_iconv_dir/include])
|
|
||||||
APR_ADDTO(LDFLAGS,[-L$apu_iconv_dir/lib])
|
|
||||||
fi
|
|
||||||
if test -f "$apu_iconv_dir/include/api_version.h"; then
|
|
||||||
have_apr_iconv="1"
|
|
||||||
have_iconv="0"
|
|
||||||
APR_REMOVEFROM(LIBS,[-lapriconv])
|
|
||||||
AC_MSG_RESULT("Using apr-iconv")
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
if test "$have_apr_iconv" != "1"; then
|
|
||||||
AC_CHECK_HEADER(iconv.h, [
|
|
||||||
APU_TRY_ICONV([ have_iconv="1" ], [
|
|
||||||
|
|
||||||
APR_ADDTO(LIBS,[-liconv])
|
|
||||||
|
|
||||||
APU_TRY_ICONV([
|
|
||||||
APR_ADDTO(APRUTIL_LIBS,[-liconv])
|
|
||||||
APR_ADDTO(APRUTIL_EXPORT_LIBS,[-liconv])
|
|
||||||
have_iconv="1" ],
|
|
||||||
[ have_iconv="0" ])
|
|
||||||
|
|
||||||
APR_REMOVEFROM(LIBS,[-liconv])
|
|
||||||
|
|
||||||
])
|
|
||||||
], [ have_iconv="0" ])
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$apu_iconv_dir" != "unknown"; then
|
|
||||||
if test "$have_iconv" != "1"; then
|
|
||||||
if test "$have_apr_iconv" != "1"; then
|
|
||||||
AC_MSG_ERROR([iconv support requested, but not found])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
APR_REMOVEFROM(CPPFLAGS,[-I$apu_iconv_dir/include])
|
|
||||||
APR_REMOVEFROM(LDFLAGS,[-L$apu_iconv_dir/lib])
|
|
||||||
APR_ADDTO(APRUTIL_INCLUDES,[-I$apu_iconv_dir/include])
|
|
||||||
APR_ADDTO(APRUTIL_LDFLAGS,[-L$apu_iconv_dir/lib])
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$have_iconv" = "1"; then
|
|
||||||
APU_CHECK_ICONV_INBUF
|
|
||||||
fi
|
|
||||||
|
|
||||||
APR_FLAG_HEADERS(iconv.h langinfo.h)
|
|
||||||
APR_FLAG_FUNCS(nl_langinfo)
|
|
||||||
APR_CHECK_DEFINE(CODESET, langinfo.h, [CODESET defined in langinfo.h])
|
|
||||||
|
|
||||||
AC_SUBST(have_iconv)
|
|
||||||
AC_SUBST(have_apr_iconv)
|
|
||||||
])dnl
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl APU_CHECK_ICONV_INBUF
|
|
||||||
dnl
|
|
||||||
dnl Decide whether or not the inbuf parameter to iconv() is const.
|
|
||||||
dnl
|
|
||||||
dnl We try to compile something without const. If it fails to
|
|
||||||
dnl compile, we assume that the system's iconv() has const.
|
|
||||||
dnl Unfortunately, we won't realize when there was a compile
|
|
||||||
dnl warning, so we allow a variable -- apu_iconv_inbuf_const -- to
|
|
||||||
dnl be set in hints.m4 to specify whether or not iconv() has const
|
|
||||||
dnl on this parameter.
|
|
||||||
dnl
|
|
||||||
AC_DEFUN([APU_CHECK_ICONV_INBUF], [
|
|
||||||
AC_MSG_CHECKING(for type of inbuf parameter to iconv)
|
|
||||||
if test "x$apu_iconv_inbuf_const" = "x"; then
|
|
||||||
APR_TRY_COMPILE_NO_WARNING([
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <iconv.h>
|
|
||||||
],[
|
|
||||||
iconv(0,(char **)0,(size_t *)0,(char **)0,(size_t *)0);
|
|
||||||
], apu_iconv_inbuf_const="0", apu_iconv_inbuf_const="1")
|
|
||||||
fi
|
|
||||||
if test "$apu_iconv_inbuf_const" = "1"; then
|
|
||||||
AC_DEFINE(APU_ICONV_INBUF_CONST, 1, [Define if the inbuf parm to iconv() is const char **])
|
|
||||||
msg="const char **"
|
|
||||||
else
|
|
||||||
msg="char **"
|
|
||||||
fi
|
|
||||||
AC_MSG_RESULT([$msg])
|
|
||||||
])dnl
|
|
|
@ -1,278 +0,0 @@
|
||||||
dnl -------------------------------------------------------- -*- autoconf -*-
|
|
||||||
dnl Copyright 2005 The Apache Software Foundation or its licensors, as
|
|
||||||
dnl applicable.
|
|
||||||
dnl
|
|
||||||
dnl Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
dnl you may not use this file except in compliance with the License.
|
|
||||||
dnl You may obtain a copy of the License at
|
|
||||||
dnl
|
|
||||||
dnl http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
dnl
|
|
||||||
dnl Unless required by applicable law or agreed to in writing, software
|
|
||||||
dnl distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
dnl See the License for the specific language governing permissions and
|
|
||||||
dnl limitations under the License.
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl DBD module
|
|
||||||
dnl
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl APU_CHECK_DBD: compile backends for apr_dbd.
|
|
||||||
dnl
|
|
||||||
AC_DEFUN([APU_CHECK_DBD], [
|
|
||||||
apu_have_pgsql=0
|
|
||||||
|
|
||||||
AC_ARG_WITH([pgsql], [
|
|
||||||
--with-pgsql=DIR specify PostgreSQL location
|
|
||||||
], [
|
|
||||||
apu_have_pgsql=0
|
|
||||||
if test "$withval" = "yes"; then
|
|
||||||
AC_CHECK_HEADERS(libpq-fe.h, AC_CHECK_LIB(pq, PQsendQueryPrepared, [apu_have_pgsql=1]))
|
|
||||||
if test "$apu_have_pgsql" = "0"; then
|
|
||||||
AC_CHECK_HEADERS(postgresql/libpq-fe.h, AC_CHECK_LIB(pq, PQsendQueryPrepared, [apu_have_pgsql=1]))
|
|
||||||
fi
|
|
||||||
elif test "$withval" = "no"; then
|
|
||||||
apu_have_pgsql=0
|
|
||||||
else
|
|
||||||
old_cppflags="$CPPFLAGS"
|
|
||||||
old_ldflags="$LDFLAGS"
|
|
||||||
|
|
||||||
pgsql_CPPFLAGS="-I$withval/include"
|
|
||||||
pgsql_LDFLAGS="-L$withval/lib "
|
|
||||||
|
|
||||||
APR_ADDTO(CPPFLAGS, [$pgsql_CPPFLAGS])
|
|
||||||
APR_ADDTO(LDFLAGS, [$pgsql_LDFLAGS])
|
|
||||||
|
|
||||||
AC_MSG_NOTICE(checking for pgsql in $withval)
|
|
||||||
AC_CHECK_HEADERS(libpq-fe.h, AC_CHECK_LIB(pq, PQsendQueryPrepared, [apu_have_pgsql=1]))
|
|
||||||
if test "$apu_have_pgsql" != "0"; then
|
|
||||||
APR_ADDTO(APRUTIL_LDFLAGS, [-L$withval/lib])
|
|
||||||
APR_ADDTO(APRUTIL_INCLUDES, [-I$withval/include])
|
|
||||||
fi
|
|
||||||
if test "$apu_have_pgsql" != "1"; then
|
|
||||||
AC_CHECK_HEADERS(postgresql/libpq-fe.h, AC_CHECK_LIB(pq, PQsendQueryPrepared, [apu_have_pgsql=1]))
|
|
||||||
if test "$apu_have_pgsql" != "0"; then
|
|
||||||
APR_ADDTO(APRUTIL_INCLUDES, [-I$withval/include/postgresql])
|
|
||||||
APR_ADDTO(APRUTIL_LDFLAGS, [-L$withval/lib])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
CPPFLAGS="$old_cppflags"
|
|
||||||
LDFLAGS="$old_ldflags"
|
|
||||||
fi
|
|
||||||
], [
|
|
||||||
apu_have_pgsql=0
|
|
||||||
AC_CHECK_HEADERS(libpq-fe.h, AC_CHECK_LIB(pq, PQsendQueryPrepared, [apu_have_pgsql=1]))
|
|
||||||
])
|
|
||||||
AC_SUBST(apu_have_pgsql)
|
|
||||||
dnl Since we have already done the AC_CHECK_LIB tests, if we have it,
|
|
||||||
dnl we know the library is there.
|
|
||||||
if test "$apu_have_pgsql" = "1"; then
|
|
||||||
APR_ADDTO(APRUTIL_EXPORT_LIBS,[-lpq])
|
|
||||||
APR_ADDTO(APRUTIL_LIBS,[-lpq])
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
dnl
|
|
||||||
AC_DEFUN([APU_CHECK_DBD_MYSQL], [
|
|
||||||
apu_have_mysql=0
|
|
||||||
|
|
||||||
AC_CHECK_FILES([dbd/apr_dbd_mysql.c],[
|
|
||||||
AC_ARG_WITH([mysql], [
|
|
||||||
--with-mysql=DIR **** SEE INSTALL.MySQL ****
|
|
||||||
], [
|
|
||||||
apu_have_mysql=0
|
|
||||||
if test "$withval" = "yes"; then
|
|
||||||
old_cppflags="$CPPFLAGS"
|
|
||||||
old_ldflags="$LDFLAGS"
|
|
||||||
|
|
||||||
AC_PATH_PROG([MYSQL_CONFIG],[mysql_config])
|
|
||||||
if test "x$MYSQL_CONFIG" != 'x'; then
|
|
||||||
mysql_CPPFLAGS="`$MYSQL_CONFIG --include`"
|
|
||||||
mysql_LDFLAGS="`$MYSQL_CONFIG --libs_r`"
|
|
||||||
|
|
||||||
APR_ADDTO(CPPFLAGS, [$mysql_CPPFLAGS])
|
|
||||||
APR_ADDTO(LDFLAGS, [$mysql_LDFLAGS])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_CHECK_HEADERS(mysql.h, AC_CHECK_LIB(mysqlclient_r, mysql_init, [apu_have_mysql=1]))
|
|
||||||
if test "$apu_have_mysql" = "0"; then
|
|
||||||
AC_CHECK_HEADERS(mysql/mysql.h, AC_CHECK_LIB(mysqlclient_r, mysql_init, [apu_have_mysql=1]))
|
|
||||||
else
|
|
||||||
if test "x$MYSQL_CONFIG" != 'x'; then
|
|
||||||
APR_ADDTO(APRUTIL_INCLUDES, [$mysql_CPPFLAGS])
|
|
||||||
APR_ADDTO(APRUTIL_LDFLAGS, [$mysql_LDFLAGS])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
CPPFLAGS="$old_cppflags"
|
|
||||||
LDFLAGS="$old_ldflags"
|
|
||||||
elif test "$withval" = "no"; then
|
|
||||||
apu_have_mysql=0
|
|
||||||
else
|
|
||||||
old_cppflags="$CPPFLAGS"
|
|
||||||
old_ldflags="$LDFLAGS"
|
|
||||||
|
|
||||||
AC_PATH_PROG([MYSQL_CONFIG],[mysql_config],,[$withval/bin])
|
|
||||||
if test "x$MYSQL_CONFIG" != 'x'; then
|
|
||||||
mysql_CPPFLAGS="`$MYSQL_CONFIG --include`"
|
|
||||||
mysql_LDFLAGS="`$MYSQL_CONFIG --libs_r`"
|
|
||||||
else
|
|
||||||
mysql_CPPFLAGS="-I$withval/include"
|
|
||||||
mysql_LDFLAGS="-L$withval/lib "
|
|
||||||
fi
|
|
||||||
|
|
||||||
APR_ADDTO(CPPFLAGS, [$mysql_CPPFLAGS])
|
|
||||||
APR_ADDTO(LDFLAGS, [$mysql_LDFLAGS])
|
|
||||||
|
|
||||||
AC_MSG_NOTICE(checking for mysql in $withval)
|
|
||||||
AC_CHECK_HEADERS(mysql.h, AC_CHECK_LIB(mysqlclient_r, mysql_init, [apu_have_mysql=1]))
|
|
||||||
if test "$apu_have_mysql" != "0"; then
|
|
||||||
APR_ADDTO(APRUTIL_INCLUDES, [$mysql_CPPFLAGS])
|
|
||||||
APR_ADDTO(APRUTIL_LDFLAGS, [$mysql_LDFLAGS])
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$apu_have_mysql" != "1"; then
|
|
||||||
AC_CHECK_HEADERS(mysql/mysql.h, AC_CHECK_LIB(mysqlclient_r, mysql_init, [apu_have_mysql=1]))
|
|
||||||
if test "$apu_have_mysql" != "0"; then
|
|
||||||
APR_ADDTO(APRUTIL_INCLUDES, [-I$withval/include/mysql])
|
|
||||||
APR_ADDTO(APRUTIL_LDFLAGS, [-L$withval/lib])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
CPPFLAGS="$old_cppflags"
|
|
||||||
LDFLAGS="$old_ldflags"
|
|
||||||
fi
|
|
||||||
], [
|
|
||||||
apu_have_mysql=0
|
|
||||||
|
|
||||||
old_cppflags="$CPPFLAGS"
|
|
||||||
old_ldflags="$LDFLAGS"
|
|
||||||
|
|
||||||
AC_PATH_PROG([MYSQL_CONFIG],[mysql_config])
|
|
||||||
if test "x$MYSQL_CONFIG" != 'x'; then
|
|
||||||
mysql_CPPFLAGS="`$MYSQL_CONFIG --include`"
|
|
||||||
mysql_LDFLAGS="`$MYSQL_CONFIG --libs_r`"
|
|
||||||
|
|
||||||
APR_ADDTO(CPPFLAGS, [$mysql_CPPFLAGS])
|
|
||||||
APR_ADDTO(LDFLAGS, [$mysql_LDFLAGS])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_CHECK_HEADERS(mysql.h, AC_CHECK_LIB(mysqlclient_r, mysql_init, [apu_have_mysql=1]))
|
|
||||||
|
|
||||||
if test "$apu_have_mysql" != "0"; then
|
|
||||||
if test "x$MYSQL_CONFIG" != 'x'; then
|
|
||||||
APR_ADDTO(APRUTIL_INCLUDES, [$mysql_CPPFLAGS])
|
|
||||||
APR_ADDTO(APRUTIL_LDFLAGS, [$mysql_LDFLAGS])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
CPPFLAGS="$old_cppflags"
|
|
||||||
LDFLAGS="$old_ldflags"
|
|
||||||
])
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_SUBST(apu_have_mysql)
|
|
||||||
|
|
||||||
dnl Since we have already done the AC_CHECK_LIB tests, if we have it,
|
|
||||||
dnl we know the library is there.
|
|
||||||
if test "$apu_have_mysql" = "1"; then
|
|
||||||
APR_ADDTO(APRUTIL_EXPORT_LIBS,[-lmysqlclient_r])
|
|
||||||
APR_ADDTO(APRUTIL_LIBS,[-lmysqlclient_r])
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
dnl
|
|
||||||
AC_DEFUN([APU_CHECK_DBD_SQLITE3], [
|
|
||||||
apu_have_sqlite3=0
|
|
||||||
|
|
||||||
AC_ARG_WITH([sqlite3], [
|
|
||||||
--with-sqlite3=DIR
|
|
||||||
], [
|
|
||||||
apu_have_sqlite3=0
|
|
||||||
if test "$withval" = "yes"; then
|
|
||||||
AC_CHECK_HEADERS(sqlite3.h, AC_CHECK_LIB(sqlite3, sqlite3_open, [apu_have_sqlite3=1]))
|
|
||||||
elif test "$withval" = "no"; then
|
|
||||||
apu_have_sqlite3=0
|
|
||||||
else
|
|
||||||
old_cppflags="$CPPFLAGS"
|
|
||||||
old_ldflags="$LDFLAGS"
|
|
||||||
|
|
||||||
sqlite3_CPPFLAGS="-I$withval/include"
|
|
||||||
sqlite3_LDFLAGS="-L$withval/lib "
|
|
||||||
|
|
||||||
APR_ADDTO(CPPFLAGS, [$sqlite3_CPPFLAGS])
|
|
||||||
APR_ADDTO(LDFLAGS, [$sqlite3_LDFLAGS])
|
|
||||||
|
|
||||||
AC_MSG_NOTICE(checking for sqlite3 in $withval)
|
|
||||||
AC_CHECK_HEADERS(sqlite3.h, AC_CHECK_LIB(sqlite3, sqlite3_open, [apu_have_sqlite3=1]))
|
|
||||||
if test "$apu_have_sqlite3" != "0"; then
|
|
||||||
APR_ADDTO(APRUTIL_LDFLAGS, [-L$withval/lib])
|
|
||||||
APR_ADDTO(APRUTIL_INCLUDES, [-I$withval/include])
|
|
||||||
fi
|
|
||||||
|
|
||||||
CPPFLAGS="$old_cppflags"
|
|
||||||
LDFLAGS="$old_ldflags"
|
|
||||||
fi
|
|
||||||
], [
|
|
||||||
apu_have_sqlite3=0
|
|
||||||
AC_CHECK_HEADERS(sqlite3.h, AC_CHECK_LIB(sqlite3, sqlite3_open, [apu_have_sqlite3=1]))
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_SUBST(apu_have_sqlite3)
|
|
||||||
|
|
||||||
dnl Since we have already done the AC_CHECK_LIB tests, if we have it,
|
|
||||||
dnl we know the library is there.
|
|
||||||
if test "$apu_have_sqlite3" = "1"; then
|
|
||||||
APR_ADDTO(APRUTIL_EXPORT_LIBS,[-lsqlite3])
|
|
||||||
APR_ADDTO(APRUTIL_LIBS,[-lsqlite3])
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
dnl
|
|
||||||
AC_DEFUN([APU_CHECK_DBD_SQLITE2], [
|
|
||||||
apu_have_sqlite2=0
|
|
||||||
|
|
||||||
AC_ARG_WITH([sqlite2], [
|
|
||||||
--with-sqlite2=DIR
|
|
||||||
], [
|
|
||||||
apu_have_sqlite2=0
|
|
||||||
if test "$withval" = "yes"; then
|
|
||||||
AC_CHECK_HEADERS(sqlite.h, AC_CHECK_LIB(sqlite, sqlite_open, [apu_have_sqlite2=1]))
|
|
||||||
elif test "$withval" = "no"; then
|
|
||||||
apu_have_sqlite2=0
|
|
||||||
else
|
|
||||||
old_cppflags="$CPPFLAGS"
|
|
||||||
old_ldflags="$LDFLAGS"
|
|
||||||
|
|
||||||
sqlite2_CPPFLAGS="-I$withval/include"
|
|
||||||
sqlite2_LDFLAGS="-L$withval/lib "
|
|
||||||
|
|
||||||
APR_ADDTO(CPPFLAGS, [$sqlite2_CPPFLAGS])
|
|
||||||
APR_ADDTO(LDFLAGS, [$sqlite2_LDFLAGS])
|
|
||||||
|
|
||||||
AC_MSG_NOTICE(checking for sqlite2 in $withval)
|
|
||||||
AC_CHECK_HEADERS(sqlite.h, AC_CHECK_LIB(sqlite, sqlite_open, [apu_have_sqlite2=1]))
|
|
||||||
if test "$apu_have_sqlite2" != "0"; then
|
|
||||||
APR_ADDTO(APRUTIL_LDFLAGS, [-L$withval/lib])
|
|
||||||
APR_ADDTO(APRUTIL_INCLUDES, [-I$withval/include])
|
|
||||||
fi
|
|
||||||
|
|
||||||
CPPFLAGS="$old_cppflags"
|
|
||||||
LDFLAGS="$old_ldflags"
|
|
||||||
fi
|
|
||||||
], [
|
|
||||||
apu_have_sqlite2=0
|
|
||||||
AC_CHECK_HEADERS(sqlite.h, AC_CHECK_LIB(sqlite, sqlite_open, [apu_have_sqlite2=1]))
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_SUBST(apu_have_sqlite2)
|
|
||||||
|
|
||||||
dnl Since we have already done the AC_CHECK_LIB tests, if we have it,
|
|
||||||
dnl we know the library is there.
|
|
||||||
if test "$apu_have_sqlite2" = "1"; then
|
|
||||||
APR_ADDTO(APRUTIL_EXPORT_LIBS,[-lsqlite])
|
|
||||||
APR_ADDTO(APRUTIL_LIBS,[-lsqlite])
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
dnl
|
|
||||||
|
|
|
@ -1,870 +0,0 @@
|
||||||
dnl -------------------------------------------------------- -*- autoconf -*-
|
|
||||||
dnl Copyright 2002-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
dnl applicable.
|
|
||||||
dnl
|
|
||||||
dnl Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
dnl you may not use this file except in compliance with the License.
|
|
||||||
dnl You may obtain a copy of the License at
|
|
||||||
dnl
|
|
||||||
dnl http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
dnl
|
|
||||||
dnl Unless required by applicable law or agreed to in writing, software
|
|
||||||
dnl distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
dnl See the License for the specific language governing permissions and
|
|
||||||
dnl limitations under the License.
|
|
||||||
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl DBM module
|
|
||||||
dnl
|
|
||||||
|
|
||||||
dnl APU_LIB_BERKELEY_DB(major, minor, patch, places, headers, libnames)
|
|
||||||
dnl
|
|
||||||
dnl Search for a useable version of Berkeley DB in a number of
|
|
||||||
dnl common places. The installed DB must be no older than the
|
|
||||||
dnl version given by MAJOR, MINOR, and PATCH. All of these
|
|
||||||
dnl arguments are allowed to be '-1', indicating we don't care.
|
|
||||||
dnl PLACES is a list of places to search for a Berkeley DB
|
|
||||||
dnl installation. HEADERS is a list of headers to try. LIBNAMES
|
|
||||||
dnl is a list of names of the library to attempt to link against,
|
|
||||||
dnl typically 'db' and 'db4'.
|
|
||||||
dnl
|
|
||||||
dnl If we find a useable version, set CPPFLAGS and LIBS as
|
|
||||||
dnl appropriate, and set the shell variable `apu_have_db' to
|
|
||||||
dnl `1', and apu_db_lib to the matching lib name, and apu_db_header
|
|
||||||
dnl to the header to use. Otherwise, set `apu_have_db' to `0'.
|
|
||||||
dnl
|
|
||||||
dnl This macro also checks for the `--with-berkeley-db=PATH' flag;
|
|
||||||
dnl if given, the macro will use the PATH specified, and the
|
|
||||||
dnl configuration script will die if it can't find the library. If
|
|
||||||
dnl the user gives the `--without-berkeley-db' flag, the entire
|
|
||||||
dnl search is skipped.
|
|
||||||
dnl
|
|
||||||
dnl We cache the results of individual searches under particular
|
|
||||||
dnl prefixes, not the overall result of whether we found Berkeley
|
|
||||||
dnl DB. That way, the user can re-run the configure script with
|
|
||||||
dnl different --with-berkeley-db switch values, without interference
|
|
||||||
dnl from the cache.
|
|
||||||
|
|
||||||
|
|
||||||
AC_DEFUN([APU_CHECK_BERKELEY_DB], [
|
|
||||||
bdb_version=$1
|
|
||||||
if test "$2" != "-1"; then
|
|
||||||
bdb_version="$bdb_version.$2"
|
|
||||||
if test "$3" != "-1"; then
|
|
||||||
bdb_version="$bdb_version.$3"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
bdb_places=$4
|
|
||||||
bdb_default_search_headers=$5
|
|
||||||
bdb_default_search_lib_names=$6
|
|
||||||
|
|
||||||
apu_have_db=0
|
|
||||||
|
|
||||||
# Save the original values of the flags we tweak.
|
|
||||||
apu_check_lib_save_libs="$LIBS"
|
|
||||||
apu_check_lib_save_ldflags="$LDFLAGS"
|
|
||||||
apu_check_lib_save_cppflags="$CPPFLAGS"
|
|
||||||
|
|
||||||
# The variable `found' is the prefix under which we've found
|
|
||||||
# Berkeley DB, or `not' if we haven't found it anywhere yet.
|
|
||||||
found=not
|
|
||||||
for bdb_place in $bdb_places; do
|
|
||||||
|
|
||||||
LDFLAGS="$apu_check_lib_save_ldflags"
|
|
||||||
CPPFLAGS="$apu_check_lib_save_cppflags"
|
|
||||||
case "$bdb_place" in
|
|
||||||
"std" )
|
|
||||||
description="the standard places"
|
|
||||||
;;
|
|
||||||
*":"* )
|
|
||||||
header="`echo $bdb_place | sed -e 's/:.*$//'`"
|
|
||||||
lib="`echo $bdb_place | sed -e 's/^.*://'`"
|
|
||||||
CPPFLAGS="$CPPFLAGS -I$header"
|
|
||||||
LDFLAGS="$LDFLAGS -L$lib"
|
|
||||||
description="$header and $lib"
|
|
||||||
;;
|
|
||||||
* )
|
|
||||||
if test -d $bdb_place; then
|
|
||||||
LDFLAGS="$LDFLAGS -L$bdb_place/lib"
|
|
||||||
CPPFLAGS="$CPPFLAGS -I$bdb_place/include"
|
|
||||||
else
|
|
||||||
AC_MSG_CHECKING([for Berkeley DB $bdb_version in $bdb_place])
|
|
||||||
AC_MSG_RESULT([directory not found])
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
description="$bdb_place"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# Since there is no AC_MSG_NOTICE in autoconf 2.13, we use this
|
|
||||||
# trick to display a message instead.
|
|
||||||
AC_MSG_CHECKING([for Berkeley DB $bdb_version in $description])
|
|
||||||
AC_MSG_RESULT()
|
|
||||||
|
|
||||||
for bdb_libname in $bdb_default_search_lib_names; do
|
|
||||||
for bdb_header in $bdb_default_search_headers; do
|
|
||||||
# Clear the header cache variable for each location
|
|
||||||
changequote(,)
|
|
||||||
cache_id="`echo ac_cv_header_${bdb_header} \
|
|
||||||
| sed -e 's/[^a-zA-Z0-9_]/_/g'`"
|
|
||||||
changequote([,])
|
|
||||||
unset $cache_id
|
|
||||||
AC_CHECK_HEADER([$bdb_header], [
|
|
||||||
if test "$1" = "3" -o "$1" = "4"; then
|
|
||||||
# We generate a separate cache variable for each prefix and libname
|
|
||||||
# we search under. That way, we avoid caching information that
|
|
||||||
# changes if the user runs `configure' with a different set of
|
|
||||||
# switches.
|
|
||||||
changequote(,)
|
|
||||||
cache_id="`echo apu_cv_check_berkeley_db_$1_$2_$3_${bdb_header}_${bdb_libname}_in_${bdb_place} \
|
|
||||||
| sed -e 's/[^a-zA-Z0-9_]/_/g'`"
|
|
||||||
changequote([,])
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([for -l$bdb_libname])
|
|
||||||
dnl We can't use AC_CACHE_CHECK here, because that won't print out
|
|
||||||
dnl the value of the computed cache variable properly.
|
|
||||||
AC_CACHE_VAL($cache_id,
|
|
||||||
[
|
|
||||||
APU_TRY_BERKELEY_DB($1, $2, $3, $bdb_header, $bdb_libname)
|
|
||||||
eval "$cache_id=$apu_try_berkeley_db"
|
|
||||||
])
|
|
||||||
result="`eval echo '$'$cache_id`"
|
|
||||||
AC_MSG_RESULT($result)
|
|
||||||
elif test "$1" = "1"; then
|
|
||||||
AC_CHECK_LIB($bdb_libname,
|
|
||||||
dbopen,
|
|
||||||
[result=yes],
|
|
||||||
[result=no]
|
|
||||||
)
|
|
||||||
elif test "$1" = "2"; then
|
|
||||||
AC_CHECK_LIB($bdb_libname,
|
|
||||||
db_open,
|
|
||||||
[result=yes],
|
|
||||||
[result=no]
|
|
||||||
)
|
|
||||||
fi
|
|
||||||
], [result="no"])
|
|
||||||
|
|
||||||
# If we found it, no need to search any more.
|
|
||||||
if test "$result" = "yes"; then
|
|
||||||
found="$bdb_place"
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
test "$found" != "not" && break
|
|
||||||
done
|
|
||||||
test "$found" != "not" && break
|
|
||||||
done
|
|
||||||
|
|
||||||
# Restore the original values of the flags we tweak.
|
|
||||||
LDFLAGS="$apu_check_lib_save_ldflags"
|
|
||||||
CPPFLAGS="$apu_check_lib_save_cppflags"
|
|
||||||
|
|
||||||
case "$found" in
|
|
||||||
"not")
|
|
||||||
apu_have_db=0
|
|
||||||
;;
|
|
||||||
"std")
|
|
||||||
apu_db_header=$bdb_header
|
|
||||||
apu_db_lib=$bdb_libname
|
|
||||||
apu_have_db=1
|
|
||||||
;;
|
|
||||||
*":"*)
|
|
||||||
header="`echo $found | sed -e 's/:.*$//'`"
|
|
||||||
lib="`echo $found | sed -e 's/^.*://'`"
|
|
||||||
|
|
||||||
APR_ADDTO(APRUTIL_INCLUDES, [-I$header])
|
|
||||||
APR_ADDTO(APRUTIL_LDFLAGS, [-L$lib])
|
|
||||||
apu_db_header=$bdb_header
|
|
||||||
apu_db_lib=$bdb_libname
|
|
||||||
apu_have_db=1
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
APR_ADDTO(APRUTIL_INCLUDES, [-I$found/include])
|
|
||||||
APR_ADDTO(APRUTIL_LDFLAGS, [-L$found/lib])
|
|
||||||
apu_db_header=$bdb_header
|
|
||||||
apu_db_lib=$bdb_libname
|
|
||||||
apu_have_db=1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
dnl APU_TRY_BERKELEY_DB(major, minor, patch, header, libname)
|
|
||||||
dnl
|
|
||||||
dnl A subroutine of APU_CHECK_BERKELEY_DB.
|
|
||||||
dnl
|
|
||||||
dnl Check that a new-enough version of Berkeley DB is installed.
|
|
||||||
dnl "New enough" means no older than the version given by MAJOR,
|
|
||||||
dnl MINOR, and PATCH. The result of the test is not cached; no
|
|
||||||
dnl messages are printed. Use HEADER as the header file to include.
|
|
||||||
dnl Use LIBNAME as the library to link against.
|
|
||||||
dnl (e.g. LIBNAME should usually be "db" or "db4".)
|
|
||||||
dnl
|
|
||||||
dnl Set the shell variable `apu_try_berkeley_db' to `yes' if we found
|
|
||||||
dnl an appropriate version installed, or `no' otherwise.
|
|
||||||
dnl
|
|
||||||
dnl This macro uses the Berkeley DB library function `db_version' to
|
|
||||||
dnl find the version. If the library installed doesn't have this
|
|
||||||
dnl function, then this macro assumes it is too old.
|
|
||||||
|
|
||||||
dnl NOTE: This is pretty messed up. It seems that the FreeBSD port of
|
|
||||||
dnl Berkeley DB 4 puts the header file in /usr/local/include/db4, but the
|
|
||||||
dnl database library in /usr/local/lib, as libdb4.[a|so]. There is no
|
|
||||||
dnl /usr/local/include/db.h. So if you check for /usr/local first, you'll
|
|
||||||
dnl get the old header file from /usr/include, and the new library from
|
|
||||||
dnl /usr/local/lib. Disaster. Thus this test compares the version constants
|
|
||||||
dnl in the db.h header with the ones returned by db_version().
|
|
||||||
|
|
||||||
|
|
||||||
AC_DEFUN([APU_TRY_BERKELEY_DB],
|
|
||||||
[
|
|
||||||
apu_try_berkeley_db_save_libs="$LIBS"
|
|
||||||
|
|
||||||
apu_check_berkeley_db_major=$1
|
|
||||||
apu_check_berkeley_db_minor=$2
|
|
||||||
apu_check_berkeley_db_patch=$3
|
|
||||||
apu_try_berkeley_db_header=$4
|
|
||||||
apu_try_berkeley_db_libname=$5
|
|
||||||
|
|
||||||
LIBS="$LIBS -l$apu_try_berkeley_db_libname"
|
|
||||||
AC_TRY_RUN(
|
|
||||||
[
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <$apu_try_berkeley_db_header>
|
|
||||||
main ()
|
|
||||||
{
|
|
||||||
int major, minor, patch;
|
|
||||||
|
|
||||||
db_version(&major, &minor, &patch);
|
|
||||||
|
|
||||||
/* Sanity check: ensure that db.h constants actually match the db library */
|
|
||||||
if (major != DB_VERSION_MAJOR
|
|
||||||
|| minor != DB_VERSION_MINOR
|
|
||||||
|| patch != DB_VERSION_PATCH)
|
|
||||||
exit (1);
|
|
||||||
|
|
||||||
/* Run-time check: ensure the library claims to be the correct version. */
|
|
||||||
|
|
||||||
if ($apu_check_berkeley_db_major != -1) {
|
|
||||||
if (major < $apu_check_berkeley_db_major)
|
|
||||||
exit (1);
|
|
||||||
if (major > $apu_check_berkeley_db_major)
|
|
||||||
exit (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($apu_check_berkeley_db_minor != -1) {
|
|
||||||
if (minor < $apu_check_berkeley_db_minor)
|
|
||||||
exit (1);
|
|
||||||
if (minor > $apu_check_berkeley_db_minor)
|
|
||||||
exit (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($apu_check_berkeley_db_patch == -1
|
|
||||||
|| patch >= $apu_check_berkeley_db_patch)
|
|
||||||
exit (0);
|
|
||||||
else
|
|
||||||
exit (1);
|
|
||||||
}
|
|
||||||
],
|
|
||||||
[apu_try_berkeley_db=yes],
|
|
||||||
[apu_try_berkeley_db=no],
|
|
||||||
[apu_try_berkeley_db=yes]
|
|
||||||
)
|
|
||||||
|
|
||||||
LIBS="$apu_try_berkeley_db_save_libs"
|
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl APU_CHECK_DB1: is DB1 present?
|
|
||||||
dnl
|
|
||||||
dnl if present: sets apu_db_header, apu_db_lib, and apu_db_version
|
|
||||||
dnl
|
|
||||||
AC_DEFUN([APU_CHECK_DB1], [
|
|
||||||
places=$1
|
|
||||||
if test -z "$places"; then
|
|
||||||
places="std"
|
|
||||||
fi
|
|
||||||
APU_CHECK_BERKELEY_DB(1, 0, 0,
|
|
||||||
"$places",
|
|
||||||
"db1/db.h db.h",
|
|
||||||
"db1"
|
|
||||||
)
|
|
||||||
if test "$apu_have_db" = "1"; then
|
|
||||||
apu_db_version=1
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl APU_CHECK_DB185: is DB1.85 present?
|
|
||||||
dnl
|
|
||||||
dnl if present: sets apu_db_header, apu_db_lib, and apu_db_version
|
|
||||||
dnl
|
|
||||||
dnl NB: BerkelyDB v2 and above can be compiled in 1.85 mode
|
|
||||||
dnl which has a libdb not libdb1 or libdb185
|
|
||||||
AC_DEFUN([APU_CHECK_DB185], [
|
|
||||||
places=$1
|
|
||||||
if test -z "$places"; then
|
|
||||||
places="std"
|
|
||||||
fi
|
|
||||||
APU_CHECK_BERKELEY_DB(1, -1, -1,
|
|
||||||
"$places",
|
|
||||||
"db_185.h",
|
|
||||||
"db"
|
|
||||||
)
|
|
||||||
if test "$apu_have_db" = "1"; then
|
|
||||||
apu_db_version=185
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl APU_CHECK_DB2: is DB2 present?
|
|
||||||
dnl
|
|
||||||
dnl if present: sets apu_db_header, apu_db_lib, and apu_db_version
|
|
||||||
dnl
|
|
||||||
AC_DEFUN([APU_CHECK_DB2], [
|
|
||||||
places=$1
|
|
||||||
if test -z "$places"; then
|
|
||||||
places="std"
|
|
||||||
fi
|
|
||||||
APU_CHECK_BERKELEY_DB(2, -1, -1,
|
|
||||||
"$places",
|
|
||||||
"db2/db.h db.h",
|
|
||||||
"db2 db"
|
|
||||||
)
|
|
||||||
if test "$apu_have_db" = "1"; then
|
|
||||||
apu_db_version=2
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl APU_CHECK_DB3: is DB3 present?
|
|
||||||
dnl
|
|
||||||
dnl if present: sets apu_db_header, apu_db_lib, and apu_db_version
|
|
||||||
dnl
|
|
||||||
AC_DEFUN([APU_CHECK_DB3], [
|
|
||||||
places=$1
|
|
||||||
if test -z "$places"; then
|
|
||||||
places="std"
|
|
||||||
fi
|
|
||||||
APU_CHECK_BERKELEY_DB(3, -1, -1,
|
|
||||||
"$places",
|
|
||||||
"db3/db.h db.h",
|
|
||||||
"db3 db"
|
|
||||||
)
|
|
||||||
if test "$apu_have_db" = "1"; then
|
|
||||||
apu_db_version=3
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl APU_CHECK_DB4: is DB4 present?
|
|
||||||
dnl
|
|
||||||
dnl if present: sets apu_db_header, apu_db_lib, and apu_db_version
|
|
||||||
dnl
|
|
||||||
AC_DEFUN([APU_CHECK_DB4], [
|
|
||||||
places=$1
|
|
||||||
if test -z "$places"; then
|
|
||||||
places="std /usr/local /usr/local/BerkeleyDB.4.0 /boot/home/config"
|
|
||||||
fi
|
|
||||||
APU_CHECK_BERKELEY_DB("4", "0", "-1",
|
|
||||||
"$places",
|
|
||||||
"db4/db.h db.h",
|
|
||||||
"db-4.0 db4 db"
|
|
||||||
)
|
|
||||||
if test "$apu_have_db" = "1"; then
|
|
||||||
apu_db_version=4
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl APU_CHECK_DB41: is DB4.1 present?
|
|
||||||
dnl
|
|
||||||
dnl if present: sets apu_db_header, apu_db_lib, and apu_db_version
|
|
||||||
dnl
|
|
||||||
AC_DEFUN([APU_CHECK_DB41], [
|
|
||||||
places=$1
|
|
||||||
if test -z "$places"; then
|
|
||||||
places="std /usr/local /usr/local/BerkeleyDB.4.1 /boot/home/config"
|
|
||||||
fi
|
|
||||||
APU_CHECK_BERKELEY_DB("4", "1", "-1",
|
|
||||||
"$places",
|
|
||||||
"db41/db.h db4/db.h db.h",
|
|
||||||
"db-4.1 db41 db4 db"
|
|
||||||
)
|
|
||||||
if test "$apu_have_db" = "1"; then
|
|
||||||
apu_db_version=4
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl APU_CHECK_DB42: is DB4.2 present?
|
|
||||||
dnl
|
|
||||||
dnl if present: sets apu_db_header, apu_db_lib, and apu_db_version
|
|
||||||
dnl
|
|
||||||
AC_DEFUN([APU_CHECK_DB42], [
|
|
||||||
places=$1
|
|
||||||
if test -z "$places"; then
|
|
||||||
places="std /usr/local /usr/local/BerkeleyDB.4.2 /boot/home/config"
|
|
||||||
fi
|
|
||||||
APU_CHECK_BERKELEY_DB("4", "2", "-1",
|
|
||||||
"$places",
|
|
||||||
"db42/db.h db4/db.h db.h",
|
|
||||||
"db-4.2 db42 db4 db"
|
|
||||||
)
|
|
||||||
if test "$apu_have_db" = "1"; then
|
|
||||||
apu_db_version=4
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
dnl
|
|
||||||
dnl APU_CHECK_DB43: is DB4.3 present?
|
|
||||||
dnl
|
|
||||||
dnl if present: sets apu_db_header, apu_db_lib, and apu_db_version
|
|
||||||
dnl
|
|
||||||
AC_DEFUN([APU_CHECK_DB43], [
|
|
||||||
places=$1
|
|
||||||
if test -z "$places"; then
|
|
||||||
places="std /usr/local/BerkeleyDB.4.3 /boot/home/config"
|
|
||||||
fi
|
|
||||||
APU_CHECK_BERKELEY_DB("4", "3", "-1",
|
|
||||||
"$places",
|
|
||||||
"db43/db.h db4/db.h db.h",
|
|
||||||
"db-4.3 db4-4.3 db43 db4 db"
|
|
||||||
)
|
|
||||||
if test "$apu_have_db" = "1"; then
|
|
||||||
apu_db_version=4
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
dnl
|
|
||||||
dnl APU_CHECK_DB44: is DB4.4 present?
|
|
||||||
dnl
|
|
||||||
dnl if present: sets apu_db_header, apu_db_lib, and apu_db_version
|
|
||||||
dnl
|
|
||||||
AC_DEFUN([APU_CHECK_DB44], [
|
|
||||||
places=$1
|
|
||||||
if test -z "$places"; then
|
|
||||||
places="std /usr/local/BerkeleyDB.4.4 /boot/home/config"
|
|
||||||
fi
|
|
||||||
APU_CHECK_BERKELEY_DB("4", "4", "-1",
|
|
||||||
"$places",
|
|
||||||
"db44/db.h db4/db.h db.h",
|
|
||||||
"db-4.4 db4-4.4 db44 db4 db"
|
|
||||||
)
|
|
||||||
if test "$apu_have_db" = "1"; then
|
|
||||||
apu_db_version=4
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
dnl
|
|
||||||
dnl APU_CHECK_DB45: is DB4.5 present?
|
|
||||||
dnl
|
|
||||||
dnl if present: sets apu_db_header, apu_db_lib, and apu_db_version
|
|
||||||
dnl
|
|
||||||
AC_DEFUN([APU_CHECK_DB45], [
|
|
||||||
places=$1
|
|
||||||
if test -z "$places"; then
|
|
||||||
places="std /usr/local/BerkeleyDB.4.5 /boot/home/config"
|
|
||||||
fi
|
|
||||||
APU_CHECK_BERKELEY_DB("4", "5", "-1",
|
|
||||||
"$places",
|
|
||||||
"db45/db.h db4/db.h db.h",
|
|
||||||
"db-4.5 db4-4.5 db45 db4 db"
|
|
||||||
)
|
|
||||||
if test "$apu_have_db" = "1"; then
|
|
||||||
apu_db_version=4
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_DEFUN([APU_CHECK_DB], [
|
|
||||||
requested=$1
|
|
||||||
check_places=$2
|
|
||||||
|
|
||||||
case "$requested" in
|
|
||||||
db)
|
|
||||||
APU_CHECK_DB_ALL("$check_places")
|
|
||||||
if test "$apu_have_db" = "0"; then
|
|
||||||
AC_MSG_ERROR(Berkeley db requested, but not found)
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
db1)
|
|
||||||
APU_CHECK_DB1("$check_places")
|
|
||||||
if test "$apu_db_version" != "1"; then
|
|
||||||
AC_MSG_ERROR(Berkeley db1 not found)
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
db185)
|
|
||||||
APU_CHECK_DB185("$check_places")
|
|
||||||
if test "$apu_db_version" != "185"; then
|
|
||||||
AC_MSG_ERROR(Berkeley db185 not found)
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
db2)
|
|
||||||
APU_CHECK_DB2("$check_places")
|
|
||||||
if test "$apu_db_version" != "2"; then
|
|
||||||
AC_MSG_ERROR(Berkeley db2 not found)
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
db3)
|
|
||||||
APU_CHECK_DB3("$check_places")
|
|
||||||
if test "$apu_db_version" != "3"; then
|
|
||||||
AC_MSG_ERROR(Berkeley db3 not found)
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
db4)
|
|
||||||
APU_CHECK_DB4("$check_places")
|
|
||||||
if test "$apu_db_version" != "4"; then
|
|
||||||
AC_MSG_ERROR(Berkeley db4 not found)
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
db41)
|
|
||||||
APU_CHECK_DB41("$check_places")
|
|
||||||
if test "$apu_db_version" != "4"; then
|
|
||||||
AC_MSG_ERROR(Berkeley db4 not found)
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
db42)
|
|
||||||
APU_CHECK_DB42("$check_places")
|
|
||||||
if test "$apu_db_version" != "4"; then
|
|
||||||
AC_MSG_ERROR(Berkeley db4 not found)
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
db43)
|
|
||||||
APU_CHECK_DB43("$check_places")
|
|
||||||
if test "$apu_db_version" != "4"; then
|
|
||||||
AC_MSG_ERROR(Berkeley db4 not found)
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
db44)
|
|
||||||
APU_CHECK_DB44("$check_places")
|
|
||||||
if test "$apu_db_version" != "4"; then
|
|
||||||
AC_MSG_ERROR(Berkeley db4 not found)
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
db45)
|
|
||||||
APU_CHECK_DB44("$check_places")
|
|
||||||
if test "$apu_db_version" != "4"; then
|
|
||||||
AC_MSG_ERROR(Berkeley db4 not found)
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
default)
|
|
||||||
APU_CHECK_DB_ALL("$check_places")
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
])
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl APU_CHECK_DB_ALL: Try all Berkeley DB versions, from 4.3 to 1.
|
|
||||||
dnl
|
|
||||||
AC_DEFUN([APU_CHECK_DB_ALL], [
|
|
||||||
all_places=$1
|
|
||||||
|
|
||||||
APU_CHECK_DB45("$all_places")
|
|
||||||
if test "$apu_db_version" != "4"; then
|
|
||||||
APU_CHECK_DB44("$all_places")
|
|
||||||
if test "$apu_db_version" != "4"; then
|
|
||||||
APU_CHECK_DB43("$all_places")
|
|
||||||
if test "$apu_db_version" != "4"; then
|
|
||||||
APU_CHECK_DB42("$all_places")
|
|
||||||
if test "$apu_db_version" != "4"; then
|
|
||||||
APU_CHECK_DB41("$all_places")
|
|
||||||
if test "$apu_db_version" != "4"; then
|
|
||||||
APU_CHECK_DB4("$all_places")
|
|
||||||
if test "$apu_db_version" != "4"; then
|
|
||||||
APU_CHECK_DB3("$all_places")
|
|
||||||
if test "$apu_db_version" != "3"; then
|
|
||||||
APU_CHECK_DB2("$all_places")
|
|
||||||
if test "$apu_db_version" != "2"; then
|
|
||||||
APU_CHECK_DB1("$all_places")
|
|
||||||
if test "$apu_db_version" != "1"; then
|
|
||||||
APU_CHECK_DB185("$all_places")
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
AC_MSG_CHECKING(for Berkeley DB)
|
|
||||||
if test "$apu_have_db" = "1"; then
|
|
||||||
AC_MSG_RESULT(found db$apu_db_version)
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT(not found)
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl APU_CHECK_DBM: see what kind of DBM backend to use for apr_dbm.
|
|
||||||
dnl
|
|
||||||
AC_DEFUN([APU_CHECK_DBM], [
|
|
||||||
apu_use_sdbm=0
|
|
||||||
apu_use_ndbm=0
|
|
||||||
apu_use_gdbm=0
|
|
||||||
apu_use_db=0
|
|
||||||
dnl it's in our codebase
|
|
||||||
apu_have_sdbm=1
|
|
||||||
apu_have_gdbm=0
|
|
||||||
apu_have_ndbm=0
|
|
||||||
apu_have_db=0
|
|
||||||
|
|
||||||
apu_db_header=db.h # default so apu_select_dbm.h is syntactically correct
|
|
||||||
apu_db_version=0
|
|
||||||
|
|
||||||
AC_ARG_WITH(dbm, [
|
|
||||||
--with-dbm=DBM choose the DBM type to use.
|
|
||||||
DBM={sdbm,gdbm,ndbm,db,db1,db185,db2,db3,db4,db41,db42,db43,db44,db45}
|
|
||||||
], [
|
|
||||||
if test "$withval" = "yes"; then
|
|
||||||
AC_MSG_ERROR([--with-dbm needs to specify a DBM type to use.
|
|
||||||
One of: sdbm, gdbm, ndbm, db, db1, db185, db2, db3, db4, db41, db42, db43, db44, db45])
|
|
||||||
fi
|
|
||||||
requested="$withval"
|
|
||||||
], [
|
|
||||||
requested=default
|
|
||||||
])
|
|
||||||
|
|
||||||
dnl We don't pull in GDBM unless the user asks for it, since it's GPL
|
|
||||||
AC_ARG_WITH([gdbm], [
|
|
||||||
--with-gdbm=DIR specify GDBM location
|
|
||||||
], [
|
|
||||||
apu_have_gdbm=0
|
|
||||||
if test "$withval" = "yes"; then
|
|
||||||
AC_CHECK_HEADER(gdbm.h, AC_CHECK_LIB(gdbm, gdbm_open, [apu_have_gdbm=1]))
|
|
||||||
elif test "$withval" = "no"; then
|
|
||||||
apu_have_gdbm=0
|
|
||||||
else
|
|
||||||
CPPFLAGS="-I$withval/include"
|
|
||||||
LIBS="-L$withval/lib "
|
|
||||||
|
|
||||||
AC_MSG_CHECKING(checking for gdbm in $withval)
|
|
||||||
AC_CHECK_HEADER(gdbm.h, AC_CHECK_LIB(gdbm, gdbm_open, [apu_have_gdbm=1]))
|
|
||||||
if test "$apu_have_gdbm" != "0"; then
|
|
||||||
APR_ADDTO(APRUTIL_LDFLAGS, [-L$withval/lib])
|
|
||||||
APR_ADDTO(APRUTIL_INCLUDES, [-I$withval/include])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_ARG_WITH([ndbm], [
|
|
||||||
--with-ndbm=PATH
|
|
||||||
Find the NDBM header and library in \`PATH/include' and
|
|
||||||
\`PATH/lib'. If PATH is of the form \`HEADER:LIB', then search
|
|
||||||
for header files in HEADER, and the library in LIB. If you omit
|
|
||||||
the \`=PATH' part completely, the configure script will search
|
|
||||||
for NDBM in a number of standard places.
|
|
||||||
], [
|
|
||||||
apu_have_ndbm=0
|
|
||||||
if test "$withval" = "yes"; then
|
|
||||||
AC_MSG_CHECKING(checking for ndbm in the usual places)
|
|
||||||
apu_want_ndbm=1
|
|
||||||
NDBM_INC=""
|
|
||||||
NDBM_LDFLAGS=""
|
|
||||||
elif test "$withval" = "no"; then
|
|
||||||
apu_want_ndbm=0
|
|
||||||
else
|
|
||||||
apu_want_ndbm=1
|
|
||||||
case "$withval" in
|
|
||||||
*":"*)
|
|
||||||
NDBM_INC="-I`echo $withval |sed -e 's/:.*$//'`"
|
|
||||||
NDBM_LDFLAGS="-L`echo $withval |sed -e 's/^.*://'`"
|
|
||||||
AC_MSG_CHECKING(checking for ndbm includes with $NDBM_INC libs with $NDBM_LDFLAGS )
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
NDBM_INC="-I$withval/include"
|
|
||||||
NDBM_LDFLAGS="-L$withval/lib"
|
|
||||||
AC_MSG_CHECKING(checking for ndbm includes in $withval)
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
save_cppflags="$CPPFLAGS"
|
|
||||||
save_ldflags="$LDFLAGS"
|
|
||||||
CPPFLAGS="$CPPFLAGS $NDBM_INC"
|
|
||||||
LDFLAGS="$LDFLAGS $NDBM_LDFLAGS"
|
|
||||||
dnl db_ndbm_open is what sleepcat's compatibility library actually has in it's lib
|
|
||||||
if test "$apu_want_ndbm" != "0"; then
|
|
||||||
AC_CHECK_HEADER(ndbm.h,
|
|
||||||
AC_CHECK_LIB(c, dbm_open, [apu_have_ndbm=1;apu_ndbm_lib=c],
|
|
||||||
AC_CHECK_LIB(dbm, dbm_open, [apu_have_ndbm=1;apu_ndbm_lib=dbm],
|
|
||||||
AC_CHECK_LIB(db, dbm_open, [apu_have_ndbm=1;apu_ndbm_lib=db],
|
|
||||||
AC_CHECK_LIB(db, __db_ndbm_open, [apu_have_ndbm=1;apu_ndbm_lib=db])
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
if test "$apu_have_ndbm" != "0"; then
|
|
||||||
if test "$withval" != "yes"; then
|
|
||||||
APR_ADDTO(APRUTIL_INCLUDES, [$NDBM_INC])
|
|
||||||
APR_ADDTO(APRUTIL_LDFLAGS, [$NDBM_LDFLAGS])
|
|
||||||
fi
|
|
||||||
elif test "$withval" != "yes"; then
|
|
||||||
AC_ERROR( NDBM not found in the specified directory)
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
CPPFLAGS="$save_cppflags"
|
|
||||||
LDFLAGS="$save_ldflags"
|
|
||||||
], [
|
|
||||||
dnl don't check it no one has asked us for it
|
|
||||||
apu_have_ndbm=0
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
if test -n "$apu_db_xtra_libs"; then
|
|
||||||
saveddbxtralibs="$LIBS"
|
|
||||||
LIBS="$apu_db_xtra_libs $LIBS"
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl We're going to try to find the highest version of Berkeley DB supported.
|
|
||||||
dnl
|
|
||||||
dnl Note that we only do this if the user requested it, since the Sleepycat
|
|
||||||
dnl license is viral and requires distribution of source along with programs
|
|
||||||
dnl that use it.
|
|
||||||
AC_ARG_WITH([berkeley-db], [
|
|
||||||
--with-berkeley-db=PATH
|
|
||||||
Find the Berkeley DB header and library in \`PATH/include' and
|
|
||||||
\`PATH/lib'. If PATH is of the form \`HEADER:LIB', then search
|
|
||||||
for header files in HEADER, and the library in LIB. If you omit
|
|
||||||
the \`=PATH' part completely, the configure script will search
|
|
||||||
for Berkeley DB in a number of standard places.
|
|
||||||
], [
|
|
||||||
if test "$withval" = "yes"; then
|
|
||||||
apu_want_db=1
|
|
||||||
user_places=""
|
|
||||||
elif test "$withval" = "no"; then
|
|
||||||
apu_want_db=0
|
|
||||||
else
|
|
||||||
apu_want_db=1
|
|
||||||
user_places="$withval"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$apu_want_db" != "0"; then
|
|
||||||
APU_CHECK_DB($requested, $user_places)
|
|
||||||
if test "$apu_have_db" = "0"; then
|
|
||||||
AC_ERROR(Berkeley DB not found.)
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
if test -n "$apu_db_xtra_libs"; then
|
|
||||||
LIBS="$saveddbxtralibs"
|
|
||||||
fi
|
|
||||||
|
|
||||||
case "$requested" in
|
|
||||||
sdbm)
|
|
||||||
apu_use_sdbm=1
|
|
||||||
apu_default_dbm=sdbm
|
|
||||||
;;
|
|
||||||
gdbm)
|
|
||||||
apu_use_gdbm=1
|
|
||||||
apu_default_dbm=gdbm
|
|
||||||
;;
|
|
||||||
ndbm)
|
|
||||||
apu_use_ndbm=1
|
|
||||||
apu_default_dbm=ndbm
|
|
||||||
;;
|
|
||||||
db)
|
|
||||||
apu_use_db=1
|
|
||||||
apu_default_dbm=db
|
|
||||||
;;
|
|
||||||
db1)
|
|
||||||
apu_use_db=1
|
|
||||||
apu_default_dbm=db1
|
|
||||||
;;
|
|
||||||
db185)
|
|
||||||
apu_use_db=1
|
|
||||||
apu_default_dbm=db185
|
|
||||||
;;
|
|
||||||
db2)
|
|
||||||
apu_use_db=1
|
|
||||||
apu_default_dbm=db2
|
|
||||||
;;
|
|
||||||
db3)
|
|
||||||
apu_use_db=1
|
|
||||||
apu_default_dbm=db3
|
|
||||||
;;
|
|
||||||
db4)
|
|
||||||
apu_use_db=1
|
|
||||||
apu_default_dbm=db4
|
|
||||||
;;
|
|
||||||
db41)
|
|
||||||
apu_use_db=1
|
|
||||||
apu_default_dbm=db4
|
|
||||||
;;
|
|
||||||
db42)
|
|
||||||
apu_use_db=1
|
|
||||||
apu_default_dbm=db4
|
|
||||||
;;
|
|
||||||
db43)
|
|
||||||
apu_use_db=1
|
|
||||||
apu_default_dbm=db4
|
|
||||||
;;
|
|
||||||
db44)
|
|
||||||
apu_use_db=1
|
|
||||||
apu_default_dbm=db4
|
|
||||||
;;
|
|
||||||
db45)
|
|
||||||
apu_use_db=1
|
|
||||||
apu_default_dbm=db4
|
|
||||||
;;
|
|
||||||
default)
|
|
||||||
dnl ### use more sophisticated DBMs for the default?
|
|
||||||
apu_default_dbm="sdbm (default)"
|
|
||||||
apu_use_sdbm=1
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
AC_MSG_ERROR([--with-dbm=$look_for is an unknown DBM type.
|
|
||||||
Use one of: sdbm, gdbm, ndbm, db, db1, db185, db2, db3, db4, db41, db42, db43, db44 db45])
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
dnl Yes, it'd be nice if we could collate the output in an order
|
|
||||||
dnl so that the AC_MSG_CHECKING would be output before the actual
|
|
||||||
dnl checks, but it isn't happening now.
|
|
||||||
AC_MSG_CHECKING(for default DBM)
|
|
||||||
AC_MSG_RESULT($apu_default_dbm)
|
|
||||||
|
|
||||||
AC_SUBST(apu_use_sdbm)
|
|
||||||
AC_SUBST(apu_use_gdbm)
|
|
||||||
AC_SUBST(apu_use_ndbm)
|
|
||||||
AC_SUBST(apu_use_db)
|
|
||||||
|
|
||||||
AC_SUBST(apu_have_sdbm)
|
|
||||||
AC_SUBST(apu_have_gdbm)
|
|
||||||
AC_SUBST(apu_have_ndbm)
|
|
||||||
AC_SUBST(apu_have_db)
|
|
||||||
AC_SUBST(apu_db_header)
|
|
||||||
AC_SUBST(apu_db_version)
|
|
||||||
|
|
||||||
dnl Since we have already done the AC_CHECK_LIB tests, if we have it,
|
|
||||||
dnl we know the library is there.
|
|
||||||
if test "$apu_have_gdbm" = "1"; then
|
|
||||||
APR_ADDTO(APRUTIL_EXPORT_LIBS,[-lgdbm])
|
|
||||||
APR_ADDTO(APRUTIL_LIBS,[-lgdbm])
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$apu_have_ndbm" = "1"; then
|
|
||||||
APR_ADDTO(APRUTIL_EXPORT_LIBS,[-l$apu_ndbm_lib])
|
|
||||||
APR_ADDTO(APRUTIL_LIBS,[-l$apu_ndbm_lib])
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$apu_have_db" = "1"; then
|
|
||||||
APR_ADDTO(APRUTIL_EXPORT_LIBS,[-l$apu_db_lib])
|
|
||||||
APR_ADDTO(APRUTIL_LIBS,[-l$apu_db_lib])
|
|
||||||
if test -n "apu_db_xtra_libs"; then
|
|
||||||
APR_ADDTO(APRUTIL_EXPORT_LIBS,[$apu_db_xtra_libs])
|
|
||||||
APR_ADDTO(APRUTIL_LIBS,[$apu_db_xtra_libs])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
|
@ -1,176 +0,0 @@
|
||||||
dnl -------------------------------------------------------- -*- autoconf -*-
|
|
||||||
dnl Copyright 2002-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
dnl applicable.
|
|
||||||
dnl
|
|
||||||
dnl Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
dnl you may not use this file except in compliance with the License.
|
|
||||||
dnl You may obtain a copy of the License at
|
|
||||||
dnl
|
|
||||||
dnl http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
dnl
|
|
||||||
dnl Unless required by applicable law or agreed to in writing, software
|
|
||||||
dnl distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
dnl See the License for the specific language governing permissions and
|
|
||||||
dnl limitations under the License.
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl find_apu.m4 : locate the APR-util (APU) include files and libraries
|
|
||||||
dnl
|
|
||||||
dnl This macro file can be used by applications to find and use the APU
|
|
||||||
dnl library. It provides a standardized mechanism for using APU. It supports
|
|
||||||
dnl embedding APU into the application source, or locating an installed
|
|
||||||
dnl copy of APU.
|
|
||||||
dnl
|
|
||||||
dnl APR_FIND_APU(srcdir, builddir, implicit-install-check, acceptable-majors)
|
|
||||||
dnl
|
|
||||||
dnl where srcdir is the location of the bundled APU source directory, or
|
|
||||||
dnl empty if source is not bundled.
|
|
||||||
dnl
|
|
||||||
dnl where builddir is the location where the bundled APU will be built,
|
|
||||||
dnl or empty if the build will occur in the srcdir.
|
|
||||||
dnl
|
|
||||||
dnl where implicit-install-check set to 1 indicates if there is no
|
|
||||||
dnl --with-apr-util option specified, we will look for installed copies.
|
|
||||||
dnl
|
|
||||||
dnl where acceptable-majors is a space separated list of acceptable major
|
|
||||||
dnl version numbers. Often only a single major version will be acceptable.
|
|
||||||
dnl If multiple versions are specified, and --with-apr-util=PREFIX or the
|
|
||||||
dnl implicit installed search are used, then the first (leftmost) version
|
|
||||||
dnl in the list that is found will be used. Currently defaults to [0 1].
|
|
||||||
dnl
|
|
||||||
dnl Sets the following variables on exit:
|
|
||||||
dnl
|
|
||||||
dnl apu_found : "yes", "no", "reconfig"
|
|
||||||
dnl
|
|
||||||
dnl apu_config : If the apu-config tool exists, this refers to it. If
|
|
||||||
dnl apu_found is "reconfig", then the bundled directory
|
|
||||||
dnl should be reconfigured *before* using apu_config.
|
|
||||||
dnl
|
|
||||||
dnl Note: this macro file assumes that apr-config has been installed; it
|
|
||||||
dnl is normally considered a required part of an APR installation.
|
|
||||||
dnl
|
|
||||||
dnl Note: At this time, we cannot find *both* a source dir and a build dir.
|
|
||||||
dnl If both are available, the build directory should be passed to
|
|
||||||
dnl the --with-apr-util switch.
|
|
||||||
dnl
|
|
||||||
dnl Note: the installation layout is presumed to follow the standard
|
|
||||||
dnl PREFIX/lib and PREFIX/include pattern. If the APU config file
|
|
||||||
dnl is available (and can be found), then non-standard layouts are
|
|
||||||
dnl possible, since it will be described in the config file.
|
|
||||||
dnl
|
|
||||||
dnl If a bundled source directory is available and needs to be (re)configured,
|
|
||||||
dnl then apu_found is set to "reconfig". The caller should reconfigure the
|
|
||||||
dnl (passed-in) source directory, placing the result in the build directory,
|
|
||||||
dnl as appropriate.
|
|
||||||
dnl
|
|
||||||
dnl If apu_found is "yes" or "reconfig", then the caller should use the
|
|
||||||
dnl value of apu_config to fetch any necessary build/link information.
|
|
||||||
dnl
|
|
||||||
|
|
||||||
AC_DEFUN([APR_FIND_APU], [
|
|
||||||
apu_found="no"
|
|
||||||
|
|
||||||
if test "$target_os" = "os2-emx"; then
|
|
||||||
# Scripts don't pass test -x on OS/2
|
|
||||||
TEST_X="test -f"
|
|
||||||
else
|
|
||||||
TEST_X="test -x"
|
|
||||||
fi
|
|
||||||
|
|
||||||
ifelse([$4], [],
|
|
||||||
[
|
|
||||||
ifdef(AC_WARNING,([$0: missing argument 4 (acceptable-majors): Defaulting to APU 0.x then APU 1.x]))
|
|
||||||
acceptable_majors="0 1"
|
|
||||||
], [acceptable_majors="$4"])
|
|
||||||
|
|
||||||
apu_temp_acceptable_apu_config=""
|
|
||||||
for apu_temp_major in $acceptable_majors
|
|
||||||
do
|
|
||||||
case $apu_temp_major in
|
|
||||||
0)
|
|
||||||
apu_temp_acceptable_apu_config="$apu_temp_acceptable_apu_config apu-config"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
apu_temp_acceptable_apu_config="$apu_temp_acceptable_apu_config apu-$apu_temp_major-config"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
AC_MSG_CHECKING(for APR-util)
|
|
||||||
AC_ARG_WITH(apr-util,
|
|
||||||
[ --with-apr-util=PATH prefix for installed APU, path to APU build tree,
|
|
||||||
or the full path to apu-config],
|
|
||||||
[
|
|
||||||
if test "$withval" = "no" || test "$withval" = "yes"; then
|
|
||||||
AC_MSG_ERROR([--with-apr-util requires a directory or file to be provided])
|
|
||||||
fi
|
|
||||||
|
|
||||||
for apu_temp_apu_config_file in $apu_temp_acceptable_apu_config
|
|
||||||
do
|
|
||||||
for lookdir in "$withval/bin" "$withval"
|
|
||||||
do
|
|
||||||
if $TEST_X "$lookdir/$apu_temp_apu_config_file"; then
|
|
||||||
apu_found="yes"
|
|
||||||
apu_config="$lookdir/$apu_temp_apu_config_file"
|
|
||||||
break 2
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
done
|
|
||||||
|
|
||||||
if test "$apu_found" != "yes" && $TEST_X "$withval" && $withval --help > /dev/null 2>&1 ; then
|
|
||||||
apu_found="yes"
|
|
||||||
apu_config="$withval"
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl if --with-apr-util is used, it is a fatal error for its argument
|
|
||||||
dnl to be invalid
|
|
||||||
if test "$apu_found" != "yes"; then
|
|
||||||
AC_MSG_ERROR([the --with-apr-util parameter is incorrect. It must specify an install prefix, a build directory, or an apu-config file.])
|
|
||||||
fi
|
|
||||||
],[
|
|
||||||
if test -n "$3" && test "$3" = "1"; then
|
|
||||||
for apu_temp_apu_config_file in $apu_temp_acceptable_apu_config
|
|
||||||
do
|
|
||||||
if $apu_temp_apu_config_file --help > /dev/null 2>&1 ; then
|
|
||||||
apu_found="yes"
|
|
||||||
apu_config="$apu_temp_apu_config_file"
|
|
||||||
break
|
|
||||||
else
|
|
||||||
dnl look in some standard places (apparently not in builtin/default)
|
|
||||||
for lookdir in /usr /usr/local /usr/local/apr /opt/apr /usr/local/apache2 ; do
|
|
||||||
if $TEST_X "$lookdir/bin/$apu_temp_apu_config_file"; then
|
|
||||||
apu_found="yes"
|
|
||||||
apu_config="$lookdir/bin/$apu_temp_apu_config_file"
|
|
||||||
break 2
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
dnl if we have not found anything yet and have bundled source, use that
|
|
||||||
if test "$apu_found" = "no" && test -d "$1"; then
|
|
||||||
apu_temp_abs_srcdir="`cd $1 && pwd`"
|
|
||||||
apu_found="reconfig"
|
|
||||||
apu_bundled_major="`sed -n '/#define.*APU_MAJOR_VERSION/s/^[^0-9]*\([0-9]*\).*$/\1/p' \"$1/include/apu_version.h\"`"
|
|
||||||
case $apu_bundled_major in
|
|
||||||
"")
|
|
||||||
AC_MSG_ERROR([failed to find major version of bundled APU])
|
|
||||||
;;
|
|
||||||
0)
|
|
||||||
apu_temp_apu_config_file="apu-config"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
apu_temp_apu_config_file="apu-$apu_bundled_major-config"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
if test -n "$2"; then
|
|
||||||
apu_config="$2/$apu_temp_apu_config_file"
|
|
||||||
else
|
|
||||||
apu_config="$1/$apu_temp_apu_config_file"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_MSG_RESULT($apu_found)
|
|
||||||
])
|
|
|
@ -1,37 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
##
|
|
||||||
## mkdir.sh -- make directory hierarchy
|
|
||||||
##
|
|
||||||
## Based on `mkinstalldirs' from Noah Friedman <friedman@prep.ai.mit.edu>
|
|
||||||
## as of 1994-03-25, which was placed in the Public Domain.
|
|
||||||
## Cleaned up for Apache's Autoconf-style Interface (APACI)
|
|
||||||
## by Ralf S. Engelschall <rse@apache.org>
|
|
||||||
##
|
|
||||||
#
|
|
||||||
# This script falls under the Apache License.
|
|
||||||
# See http://www.apache.org/docs/LICENSE
|
|
||||||
|
|
||||||
|
|
||||||
umask 022
|
|
||||||
errstatus=0
|
|
||||||
for file in ${1+"$@"} ; do
|
|
||||||
set fnord `echo ":$file" |\
|
|
||||||
sed -e 's/^:\//%/' -e 's/^://' -e 's/\// /g' -e 's/^%/\//'`
|
|
||||||
shift
|
|
||||||
pathcomp=
|
|
||||||
for d in ${1+"$@"}; do
|
|
||||||
pathcomp="$pathcomp$d"
|
|
||||||
case "$pathcomp" in
|
|
||||||
-* ) pathcomp=./$pathcomp ;;
|
|
||||||
?: ) pathcomp="$pathcomp/"
|
|
||||||
continue ;;
|
|
||||||
esac
|
|
||||||
if test ! -d "$pathcomp"; then
|
|
||||||
echo "mkdir $pathcomp" 1>&2
|
|
||||||
mkdir "$pathcomp" || errstatus=$?
|
|
||||||
fi
|
|
||||||
pathcomp="$pathcomp/"
|
|
||||||
done
|
|
||||||
done
|
|
||||||
exit $errstatus
|
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
The script in this directory will attempt to build a Solaris package
|
|
||||||
out of a source tree for APR-util.
|
|
||||||
|
|
||||||
To build a package, make sure you are in the root of the source tree,
|
|
||||||
and run:
|
|
||||||
|
|
||||||
build/pkg/buildpkg.sh
|
|
||||||
|
|
||||||
A Solaris package called apr-util-<version>-<architecture>-local.gz will be
|
|
||||||
created in the root of the source tree.
|
|
||||||
|
|
||||||
By default, if you attempt to build packages for apr-util, it will
|
|
||||||
search for the sources for apr in:
|
|
||||||
|
|
||||||
../apr
|
|
||||||
|
|
||||||
You may override the location of apr like so:
|
|
||||||
|
|
||||||
build/pkg/buildpkg.sh --with-apr=some/other/path
|
|
||||||
|
|
|
@ -1,99 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
# Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
# applicable.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
|
|
||||||
# buildpkg.sh: This script builds a Solaris PKG from the source tree
|
|
||||||
# provided.
|
|
||||||
|
|
||||||
PREFIX=/usr/local
|
|
||||||
TEMPDIR=/var/tmp/$USER/apr-util-root
|
|
||||||
rm -rf $TEMPDIR
|
|
||||||
|
|
||||||
apr_util_src_dir=.
|
|
||||||
apr_src_dir=../apr
|
|
||||||
expat_dir=/usr
|
|
||||||
|
|
||||||
while test $# -gt 0
|
|
||||||
do
|
|
||||||
# Normalize
|
|
||||||
case "$1" in
|
|
||||||
-*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
|
|
||||||
*) optarg= ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
case "$1" in
|
|
||||||
--with-apr=*)
|
|
||||||
apr_src_dir=$optarg
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
case "$1" in
|
|
||||||
--with-apr-util=*)
|
|
||||||
apr_util_src_dir=$optarg
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
case "$1" in
|
|
||||||
--with-expat=*)
|
|
||||||
expat_dir=$optarg
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ -f "$apr_util_src_dir/configure.ac" ]; then
|
|
||||||
cd $apr_util_src_dir
|
|
||||||
else
|
|
||||||
echo "The apr-util source could not be found within $apr_util_src_dir"
|
|
||||||
echo "Usage: buildpkg [--with-apr=dir] [--with-apr-util=dir] [--with-expat=dir]"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -f "$apr_src_dir/configure.ac" ]; then
|
|
||||||
echo "The apr source could not be found within $apr_src_dir"
|
|
||||||
echo "Usage: buildpkg [--with-apr=dir] [--with-apr-util=dir] [--with-expat=dir]"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -d "$expat_dir" ]; then
|
|
||||||
echo "The expat directory could not be found within $expat_dir"
|
|
||||||
echo "Usage: buildpkg [--with-apr=dir] [--with-apr-util=dir] [--with-expat=dir]"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
./configure --prefix=$PREFIX --with-apr=$apr_src_dir \
|
|
||||||
--with-ldap --with-expat=$expat_dir
|
|
||||||
make
|
|
||||||
make install DESTDIR=$TEMPDIR
|
|
||||||
rm $TEMPDIR$PREFIX/lib/aprutil.exp
|
|
||||||
. build/pkg/pkginfo
|
|
||||||
cp build/pkg/pkginfo $TEMPDIR$PREFIX
|
|
||||||
|
|
||||||
current=`pwd`
|
|
||||||
cd $TEMPDIR$PREFIX
|
|
||||||
echo "i pkginfo=./pkginfo" > prototype
|
|
||||||
find . -print | grep -v ./prototype | grep -v ./pkginfo | pkgproto | awk '{print $1" "$2" "$3" "$4" root bin"}' >> prototype
|
|
||||||
mkdir $TEMPDIR/pkg
|
|
||||||
pkgmk -r $TEMPDIR$PREFIX -d $TEMPDIR/pkg
|
|
||||||
|
|
||||||
cd $current
|
|
||||||
pkgtrans -s $TEMPDIR/pkg $current/$NAME-$VERSION-$ARCH-local
|
|
||||||
gzip $current/$NAME-$VERSION-$ARCH-local
|
|
||||||
|
|
||||||
rm -rf $TEMPDIR
|
|
||||||
|
|
|
@ -1,11 +0,0 @@
|
||||||
PKG="ASFapu-1"
|
|
||||||
NAME="apr-util"
|
|
||||||
ARCH="@target_cpu@"
|
|
||||||
VERSION="@APRUTIL_DOTTED_VERSION@"
|
|
||||||
CATEGORY="application"
|
|
||||||
VENDOR="Apache Software Foundation"
|
|
||||||
EMAIL="dev@apr.apache.org"
|
|
||||||
PSTAMP="dev@apr.apache.org"
|
|
||||||
BASEDIR="@prefix@"
|
|
||||||
CLASSES="none"
|
|
||||||
|
|
|
@ -1,89 +0,0 @@
|
||||||
|
|
||||||
%define apuver 1
|
|
||||||
|
|
||||||
Summary: Apache Portable Runtime Utility library
|
|
||||||
Name: apr-util
|
|
||||||
Version: APU_VERSION
|
|
||||||
Release: APU_RELEASE
|
|
||||||
License: Apache Software License
|
|
||||||
Group: System Environment/Libraries
|
|
||||||
URL: http://apr.apache.org/
|
|
||||||
Source0: %{name}-%{version}.tar.gz
|
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot
|
|
||||||
BuildPrereq: autoconf, libtool, doxygen, apr-devel >= 0:{version}-{release}
|
|
||||||
BuildPrereq: openldap-devel, db4-devel, expat-devel
|
|
||||||
Conflicts: subversion < 0.20.1-2
|
|
||||||
|
|
||||||
%description
|
|
||||||
The mission of the Apache Portable Runtime (APR) is to provide a
|
|
||||||
free library of C data structures and routines. This library
|
|
||||||
contains additional utility interfaces for APR; including support
|
|
||||||
for XML, LDAP, database interfaces, URI parsing and more.
|
|
||||||
|
|
||||||
%package devel
|
|
||||||
Group: Development/Libraries
|
|
||||||
Summary: APR utility library development kit
|
|
||||||
Requires: apr-util = %{version}-%{release}, apr-devel
|
|
||||||
Requires: openldap-devel, db4-devel, expat-devel
|
|
||||||
Conflicts: subversion-devel < 0.20.1-2
|
|
||||||
|
|
||||||
%description devel
|
|
||||||
This package provides the support files which can be used to
|
|
||||||
build applications using the APR utility library. The mission
|
|
||||||
of the Apache Portable Runtime (APR) is to provide a free
|
|
||||||
library of C data structures and routines.
|
|
||||||
|
|
||||||
%prep
|
|
||||||
%setup -q
|
|
||||||
|
|
||||||
%build
|
|
||||||
%configure --with-apr=%{_prefix} \
|
|
||||||
--includedir=%{_includedir}/apr-%{apuver} \
|
|
||||||
--with-ldap --without-gdbm
|
|
||||||
make %{?_smp_mflags} && make dox
|
|
||||||
|
|
||||||
%check
|
|
||||||
# Run non-interactive tests
|
|
||||||
pushd test
|
|
||||||
make %{?_smp_mflags} testall CFLAGS=-fno-strict-aliasing
|
|
||||||
./testall -v || exit 1
|
|
||||||
popd
|
|
||||||
|
|
||||||
%install
|
|
||||||
rm -rf $RPM_BUILD_ROOT
|
|
||||||
make install DESTDIR=$RPM_BUILD_ROOT
|
|
||||||
|
|
||||||
# Documentation
|
|
||||||
mv docs/dox/html html
|
|
||||||
|
|
||||||
# Unpackaged files
|
|
||||||
rm -f $RPM_BUILD_ROOT%{_libdir}/aprutil.exp
|
|
||||||
|
|
||||||
%clean
|
|
||||||
rm -rf $RPM_BUILD_ROOT
|
|
||||||
|
|
||||||
%post -p /sbin/ldconfig
|
|
||||||
|
|
||||||
%postun -p /sbin/ldconfig
|
|
||||||
|
|
||||||
%files
|
|
||||||
%defattr(-,root,root,-)
|
|
||||||
%doc CHANGES LICENSE NOTICE
|
|
||||||
%{_libdir}/libaprutil-%{apuver}.so.*
|
|
||||||
|
|
||||||
%files devel
|
|
||||||
%defattr(-,root,root,-)
|
|
||||||
%{_bindir}/apu-%{apuver}-config
|
|
||||||
%{_libdir}/libaprutil-%{apuver}.*a
|
|
||||||
%{_libdir}/libaprutil-%{apuver}.so
|
|
||||||
%{_libdir}/pkgconfig/apr-util-%{apuver}.pc
|
|
||||||
%{_includedir}/apr-%{apuver}/*.h
|
|
||||||
%doc --parents html
|
|
||||||
|
|
||||||
%changelog
|
|
||||||
* Tue Jun 22 2004 Graham Leggett <minfrin@sharp.fm> 1.0.0-1
|
|
||||||
- update to support v1.0.0 of APR
|
|
||||||
|
|
||||||
* Tue Jun 22 2004 Graham Leggett <minfrin@sharp.fm> 1.0.0-1
|
|
||||||
- derived from Fedora Core apr.spec
|
|
||||||
|
|
|
@ -1,217 +0,0 @@
|
||||||
#! perl -w
|
|
||||||
#
|
|
||||||
# w32locatedb.pl -- Build apr-util with Berkeley DB on Win32
|
|
||||||
#
|
|
||||||
# Usage: perl w32locatedb.pl <type> <incdir> <libdir>
|
|
||||||
# type: Library type to link with ('lib' or 'dll')
|
|
||||||
# incdir: BDB includes directory (for db.h)
|
|
||||||
# libdir: Library directory (for libdbXY[s][d].lib)
|
|
||||||
#
|
|
||||||
# This script falls under the Apache License.
|
|
||||||
# See http://www.apache.org/docs/LICENSE
|
|
||||||
|
|
||||||
require 5.008;
|
|
||||||
use strict;
|
|
||||||
use File::Spec::Functions qw(canonpath rel2abs
|
|
||||||
splitpath catpath splitdir catdir);
|
|
||||||
|
|
||||||
########
|
|
||||||
# Subroutine prototypes
|
|
||||||
sub usage();
|
|
||||||
sub find_srcdir();
|
|
||||||
sub get_lib_name($$);
|
|
||||||
sub edit_header($$);
|
|
||||||
sub edit_project($$);
|
|
||||||
|
|
||||||
########
|
|
||||||
# Parse program arguments and set globals
|
|
||||||
die usage() unless scalar @ARGV >= 3;
|
|
||||||
|
|
||||||
my $type = lc($ARGV[0]);
|
|
||||||
die "Invalid library type '$type'\n"
|
|
||||||
unless $type eq 'lib' or $type eq 'dll';
|
|
||||||
|
|
||||||
my $incdir = $ARGV[1];
|
|
||||||
die "No 'db.h' in $incdir\n" unless -f "$incdir/db.h";
|
|
||||||
|
|
||||||
my $libdir = $ARGV[2];
|
|
||||||
die "$libdir: $!" unless -d $libdir;
|
|
||||||
|
|
||||||
my $libname = get_lib_name($type, $incdir);
|
|
||||||
die "No '$libname.lib' in $libdir" unless -f "$libdir/$libname.lib";
|
|
||||||
die "No '${libname}d.lib' in $libdir" unless -f "$libdir/${libname}d.lib";
|
|
||||||
|
|
||||||
my $srcdir = find_srcdir();
|
|
||||||
my $apu_hw = canonpath("$srcdir/include/apu.hw");
|
|
||||||
my $apu_want_hw = canonpath("$srcdir/include/apu_want.hw");
|
|
||||||
my $apu_select_dbm_hw = canonpath("$srcdir/include/private/apu_select_dbm.hw");
|
|
||||||
my $aprutil_dsp = canonpath("$srcdir/aprutil.dsp");
|
|
||||||
my $libaprutil_dsp = canonpath("$srcdir/libaprutil.dsp");
|
|
||||||
die "Can't find $apu_hw" unless -f $apu_hw;
|
|
||||||
die "Can't find $apu_want_hw" unless -f $apu_want_hw;
|
|
||||||
die "Can't find $apu_select_dbm_hw" unless -f $apu_select_dbm_hw;
|
|
||||||
die "Can't find $aprutil_dsp" unless -f $aprutil_dsp;
|
|
||||||
die "Can't find $libaprutil_dsp" unless -f $libaprutil_dsp;
|
|
||||||
|
|
||||||
|
|
||||||
########
|
|
||||||
# Edit the header file templates
|
|
||||||
my $db_h = rel2abs(canonpath("$incdir/db.h"));
|
|
||||||
$db_h =~ s/\\/\//g;
|
|
||||||
edit_header($apu_hw,
|
|
||||||
[['^\s*\#\s*define\s+APU_HAVE_DB\s+0\s*$',
|
|
||||||
'#define APU_HAVE_DB 1']]);
|
|
||||||
edit_header($apu_want_hw,
|
|
||||||
[['^\s*\#\s*include\s+\<db\.h\>\s*$',
|
|
||||||
"#include \"$db_h\""]]);
|
|
||||||
edit_header($apu_select_dbm_hw,
|
|
||||||
[['^\s*\#\s*define\s+APU_USE_DB\s+0\s*$',
|
|
||||||
'#define APU_USE_DB 1'],
|
|
||||||
['^\s*\#\s*include\s+\<db\.h\>\s*$',
|
|
||||||
"#include \"$db_h\""]]);
|
|
||||||
|
|
||||||
########
|
|
||||||
# Edit the .dsp files
|
|
||||||
my $libpath = rel2abs(canonpath("$libdir/$libname"));
|
|
||||||
edit_project($aprutil_dsp, $libpath);
|
|
||||||
edit_project($libaprutil_dsp, $libpath);
|
|
||||||
|
|
||||||
|
|
||||||
########
|
|
||||||
# Print usage
|
|
||||||
sub usage()
|
|
||||||
{
|
|
||||||
return ("Usage: perl w32locatedb.pl <type> <incdir> <libdir>\n"
|
|
||||||
. " type: Library type to link with ('lib' or 'dll')\n"
|
|
||||||
. " incdir: BDB includes directory (for db.h)\n"
|
|
||||||
. " libdir: Library directory (for libdbXY[s][d].lib)\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
########
|
|
||||||
# Calculate the (possibly relative) path to the top of the apr-util
|
|
||||||
# source dir.
|
|
||||||
sub find_srcdir()
|
|
||||||
{
|
|
||||||
my $srcdir = rel2abs(canonpath($0));
|
|
||||||
my ($vol, $dir, $file) = splitpath($srcdir);
|
|
||||||
my @dirs = splitdir($dir);
|
|
||||||
die if scalar @dirs < 1;
|
|
||||||
do { $_ = pop @dirs } while ($_ eq '');
|
|
||||||
return catpath($vol, catdir(@dirs), '');
|
|
||||||
}
|
|
||||||
|
|
||||||
########
|
|
||||||
# Construct the name of the BDB library, based on the type and
|
|
||||||
# version information in db.h
|
|
||||||
sub get_lib_name($$)
|
|
||||||
{
|
|
||||||
my ($type, $incdir) = @_;
|
|
||||||
my $major = undef;
|
|
||||||
my $minor = undef;
|
|
||||||
my $patch = undef;
|
|
||||||
|
|
||||||
open(DBH, "< $incdir/db.h")
|
|
||||||
or die "Can't open $incdir/db.h: $!";
|
|
||||||
while (<DBH>) {
|
|
||||||
chomp;
|
|
||||||
m/^\s*\#\s*define\s+DB_VERSION_(MAJOR|MINOR|PATCH)\s+(\d+)\s*$/;
|
|
||||||
next unless defined $1 and defined $2;
|
|
||||||
if ($1 eq 'MAJOR') { $major = $2; }
|
|
||||||
elsif ($1 eq 'MINOR') { $minor = $2; }
|
|
||||||
elsif ($1 eq 'PATCH') { $patch = $2; }
|
|
||||||
last if defined $major and defined $minor and defined $patch;
|
|
||||||
}
|
|
||||||
close(DBH);
|
|
||||||
die "Can't determine BDB version\n"
|
|
||||||
unless defined $major and defined $minor and defined $patch;
|
|
||||||
|
|
||||||
print "Using BDB version $major.$minor.$patch\n";
|
|
||||||
|
|
||||||
my $libname = "libdb$major$minor";
|
|
||||||
$libname .= 's' if $type eq 'lib';
|
|
||||||
return $libname;
|
|
||||||
}
|
|
||||||
|
|
||||||
########
|
|
||||||
# Replace a file, keeping a backup copy
|
|
||||||
sub maybe_rename_with_backup($$$)
|
|
||||||
{
|
|
||||||
my ($tmpfile, $file, $maybe) = @_;
|
|
||||||
if ($maybe) {
|
|
||||||
# Make the file writable by the owner. On Windows, this removes
|
|
||||||
# any read-only bits.
|
|
||||||
chmod((stat($file))[2] | 0600, $file);
|
|
||||||
rename($file, "${file}~");
|
|
||||||
rename($tmpfile, $file);
|
|
||||||
} else {
|
|
||||||
print "No changes in $file\n";
|
|
||||||
unlink($tmpfile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
########
|
|
||||||
# Edit a header template in-place.
|
|
||||||
sub edit_header($$)
|
|
||||||
{
|
|
||||||
my ($file, $pairs) = @_;
|
|
||||||
my $tmpfile = "$file.tmp";
|
|
||||||
my $substs = 0;
|
|
||||||
|
|
||||||
open(IN, "< $file") or die "Can't open $file: $!";
|
|
||||||
open(TMP, "> $tmpfile") or die "Can't open $tmpfile: $!";
|
|
||||||
while (<IN>) {
|
|
||||||
chomp;
|
|
||||||
foreach my $pair (@$pairs) {
|
|
||||||
$substs += s/${$pair}[0]/${$pair}[1]/;
|
|
||||||
}
|
|
||||||
print TMP $_, "\n";
|
|
||||||
}
|
|
||||||
close(IN);
|
|
||||||
close(TMP);
|
|
||||||
|
|
||||||
maybe_rename_with_backup($tmpfile, $file, $substs > 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
########
|
|
||||||
# Edit a project file in-place
|
|
||||||
sub edit_project($$)
|
|
||||||
{
|
|
||||||
my ($file, $libpath) = @_;
|
|
||||||
my $tmpfile = "$file.tmp";
|
|
||||||
my $substs = 0;
|
|
||||||
my ($prog, $debug) = (undef, undef);
|
|
||||||
|
|
||||||
my $libsearch = $libpath;
|
|
||||||
$libsearch =~ s/\\/\\\\/g;
|
|
||||||
|
|
||||||
open(IN, "< $file") or die "Can't open $file: $!";
|
|
||||||
open(TMP, "> $tmpfile") or die "Can't open $tmpfile: $!";
|
|
||||||
while (<IN>) {
|
|
||||||
chomp;
|
|
||||||
|
|
||||||
if (m/^\# TARGTYPE \"[^\"]+\" 0x([0-9A-Za-z]+)/
|
|
||||||
and defined $1) {
|
|
||||||
$prog = 'LINK32' if $1 eq '0102';
|
|
||||||
$prog = 'LIB32' if $1 eq '0104';
|
|
||||||
die "Unknown project type 0x$1" unless defined $prog;
|
|
||||||
} elsif (defined $prog
|
|
||||||
and m/^\# PROP Use_Debug_Libraries ([01])/
|
|
||||||
and defined $1) {
|
|
||||||
$debug = $1;
|
|
||||||
} elsif (defined $prog and defined $debug
|
|
||||||
and m/^\# ADD $prog (\"$libsearch)?/
|
|
||||||
and not defined $1) {
|
|
||||||
my $fullpath =
|
|
||||||
($debug eq '1' ? "${libpath}d.lib" : "$libpath.lib");
|
|
||||||
$substs += s/^\# ADD $prog /\# ADD $prog \"$fullpath\" /;
|
|
||||||
} elsif (m/^\# ADD CPP/) {
|
|
||||||
$substs += s/APU_USE_SDBM/APU_USE_DB/g;
|
|
||||||
}
|
|
||||||
|
|
||||||
print TMP $_, "\n";
|
|
||||||
}
|
|
||||||
close(IN);
|
|
||||||
close(TMP);
|
|
||||||
|
|
||||||
maybe_rename_with_backup($tmpfile, $file, $substs > 0);
|
|
||||||
}
|
|
|
@ -1,111 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
# Copyright 1999-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
# applicable.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
|
|
||||||
# Default place to look for apr source. Can be overridden with
|
|
||||||
# --with-apr=[directory]
|
|
||||||
apr_src_dir=../apr
|
|
||||||
|
|
||||||
while test $# -gt 0
|
|
||||||
do
|
|
||||||
# Normalize
|
|
||||||
case "$1" in
|
|
||||||
-*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
|
|
||||||
*) optarg= ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
case "$1" in
|
|
||||||
--with-apr=*)
|
|
||||||
apr_src_dir=$optarg
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ -f "$apr_src_dir/build/apr_common.m4" ]; then
|
|
||||||
apr_src_dir=`cd $apr_src_dir; pwd`
|
|
||||||
echo ""
|
|
||||||
echo "Looking for apr source in $apr_src_dir"
|
|
||||||
else
|
|
||||||
echo ""
|
|
||||||
echo "Problem finding apr source in $apr_src_dir."
|
|
||||||
echo "Use:"
|
|
||||||
echo " --with-apr=[directory]"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# Remove some files, then copy them from apr source tree
|
|
||||||
rm -f build/apr_common.m4 build/find_apr.m4 build/install.sh \
|
|
||||||
build/config.guess build/config.sub build/get-version.sh
|
|
||||||
cp -p $apr_src_dir/build/apr_common.m4 $apr_src_dir/build/find_apr.m4 \
|
|
||||||
$apr_src_dir/build/install.sh $apr_src_dir/build/config.guess \
|
|
||||||
$apr_src_dir/build/config.sub $apr_src_dir/build/get-version.sh \
|
|
||||||
build/
|
|
||||||
|
|
||||||
# Remove aclocal.m4 as it'll break some builds...
|
|
||||||
rm -rf aclocal.m4 autom4te*.cache
|
|
||||||
|
|
||||||
#
|
|
||||||
# Generate the autoconf header (include/apu_config.h) and ./configure
|
|
||||||
#
|
|
||||||
echo "Creating include/private/apu_config.h ..."
|
|
||||||
${AUTOHEADER:-autoheader}
|
|
||||||
|
|
||||||
echo "Creating configure ..."
|
|
||||||
### do some work to toss config.cache?
|
|
||||||
if ${AUTOCONF:-autoconf}; then
|
|
||||||
:
|
|
||||||
else
|
|
||||||
echo "autoconf failed"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
#
|
|
||||||
# Generate build-outputs.mk for the build systme
|
|
||||||
#
|
|
||||||
echo "Generating 'make' outputs ..."
|
|
||||||
#$apr_src_dir/build/gen-build.py make
|
|
||||||
|
|
||||||
#
|
|
||||||
# If Expat has been bundled, then go and configure the thing
|
|
||||||
#
|
|
||||||
if [ -f xml/expat/buildconf.sh ]; then
|
|
||||||
echo "Invoking xml/expat/buildconf.sh ..."
|
|
||||||
(cd xml/expat; ./buildconf.sh)
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Remove autoconf cache again
|
|
||||||
rm -rf autom4te*.cache
|
|
||||||
|
|
||||||
# Create RPM Spec file
|
|
||||||
if [ -f `which cut` ]; then
|
|
||||||
echo rebuilding rpm spec file
|
|
||||||
REVISION=`build/get-version.sh all include/apu_version.h APU`
|
|
||||||
VERSION=`echo $REVISION | cut -d- -s -f1`
|
|
||||||
RELEASE=`echo $REVISION | cut -d- -s -f2`
|
|
||||||
if [ "x$VERSION" = "x" ]; then
|
|
||||||
VERSION=$REVISION
|
|
||||||
RELEASE=1
|
|
||||||
fi
|
|
||||||
sed -e "s/APU_VERSION/$VERSION/" -e "s/APU_RELEASE/$RELEASE/" \
|
|
||||||
./build/rpm/apr-util.spec.in > apr-util.spec
|
|
||||||
fi
|
|
||||||
|
|
|
@ -1,232 +0,0 @@
|
||||||
##
|
|
||||||
## config.layout -- Pre-defined Installation Path Layouts
|
|
||||||
##
|
|
||||||
## Hints:
|
|
||||||
## - layouts can be loaded with configure's --enable-layout=ID option
|
|
||||||
## - when no --enable-layout option is given, the default layout is `apr'
|
|
||||||
## - a trailing plus character (`+') on paths is replaced with a
|
|
||||||
## `/<target>' suffix where <target> is currently hardcoded to 'apr'.
|
|
||||||
## (This may become a configurable parameter at some point.)
|
|
||||||
##
|
|
||||||
|
|
||||||
# Classical APR-util path layout designed for parallel installs.
|
|
||||||
<Layout apr-util>
|
|
||||||
prefix: /usr/local/apr
|
|
||||||
exec_prefix: ${prefix}
|
|
||||||
bindir: ${exec_prefix}/bin
|
|
||||||
sbindir: ${exec_prefix}/bin
|
|
||||||
libdir: ${exec_prefix}/lib
|
|
||||||
libexecdir: ${exec_prefix}/modules
|
|
||||||
mandir: ${prefix}/man
|
|
||||||
sysconfdir: ${prefix}/conf
|
|
||||||
datadir: ${prefix}
|
|
||||||
installbuilddir: ${datadir}/build
|
|
||||||
includedir: ${prefix}/include/apr-${APRUTIL_MAJOR_VERSION}
|
|
||||||
localstatedir: ${prefix}
|
|
||||||
libsuffix: -${APRUTIL_MAJOR_VERSION}
|
|
||||||
</Layout>
|
|
||||||
|
|
||||||
# Classical single-installation APR path layout.
|
|
||||||
<Layout classic>
|
|
||||||
prefix: /usr/local/apr
|
|
||||||
exec_prefix: ${prefix}
|
|
||||||
bindir: ${exec_prefix}/bin
|
|
||||||
sbindir: ${exec_prefix}/bin
|
|
||||||
libdir: ${exec_prefix}/lib
|
|
||||||
libexecdir: ${exec_prefix}/modules
|
|
||||||
mandir: ${prefix}/man
|
|
||||||
sysconfdir: ${prefix}/conf
|
|
||||||
datadir: ${prefix}
|
|
||||||
installbuilddir: ${datadir}/build
|
|
||||||
includedir: ${prefix}/include
|
|
||||||
localstatedir: ${prefix}
|
|
||||||
</Layout>
|
|
||||||
|
|
||||||
# GNU standards conforming path layout.
|
|
||||||
# See FSF's GNU project `make-stds' document for details.
|
|
||||||
<Layout GNU>
|
|
||||||
prefix: /usr/local
|
|
||||||
exec_prefix: ${prefix}
|
|
||||||
bindir: ${exec_prefix}/bin
|
|
||||||
sbindir: ${exec_prefix}/sbin
|
|
||||||
libdir: ${exec_prefix}/lib
|
|
||||||
libexecdir: ${exec_prefix}/libexec
|
|
||||||
mandir: ${prefix}/man
|
|
||||||
sysconfdir: ${prefix}/etc+
|
|
||||||
datadir: ${prefix}/share+
|
|
||||||
installbuilddir: ${datadir}/build
|
|
||||||
includedir: ${prefix}/include+
|
|
||||||
localstatedir: ${prefix}/var+
|
|
||||||
runtimedir: ${localstatedir}/run
|
|
||||||
</Layout>
|
|
||||||
|
|
||||||
# Mac OS X Server (Rhapsody)
|
|
||||||
<Layout Mac OS X Server>
|
|
||||||
prefix: /Local/Library/WebServer
|
|
||||||
exec_prefix: /usr
|
|
||||||
bindir: ${exec_prefix}/bin
|
|
||||||
sbindir: ${exec_prefix}/sbin
|
|
||||||
libdir: ${exec_prefix}/lib
|
|
||||||
libexecdir: /System/Library/apr/Modules
|
|
||||||
mandir: ${exec_prefix}/share/man
|
|
||||||
sysconfdir: ${prefix}/Configuration
|
|
||||||
datadir: ${prefix}
|
|
||||||
installbuilddir: /System/Library/apr/Build
|
|
||||||
includedir: /System/Library/Frameworks/apr.framework/Versions/2.0/Headers
|
|
||||||
localstatedir: /var
|
|
||||||
runtimedir: ${prefix}/Logs
|
|
||||||
</Layout>
|
|
||||||
|
|
||||||
# Darwin/Mac OS Layout
|
|
||||||
<Layout Darwin>
|
|
||||||
prefix: /usr
|
|
||||||
exec_prefix: ${prefix}
|
|
||||||
bindir: ${exec_prefix}/bin
|
|
||||||
sbindir: ${exec_prefix}/sbin
|
|
||||||
libdir: ${exec_prefix}/lib
|
|
||||||
libexecdir: ${exec_prefix}/libexec+
|
|
||||||
mandir: ${prefix}/share/man
|
|
||||||
datadir: /Library/WebServer
|
|
||||||
sysconfdir: /etc+
|
|
||||||
installbuilddir: ${prefix}/share/httpd/build
|
|
||||||
includedir: ${prefix}/include+
|
|
||||||
localstatedir: /var
|
|
||||||
runtimedir: ${localstatedir}/run
|
|
||||||
</Layout>
|
|
||||||
|
|
||||||
# Red Hat Linux 7.x layout
|
|
||||||
<Layout RedHat>
|
|
||||||
prefix: /usr
|
|
||||||
exec_prefix: ${prefix}
|
|
||||||
bindir: ${prefix}/bin
|
|
||||||
sbindir: ${prefix}/sbin
|
|
||||||
libdir: ${prefix}/lib
|
|
||||||
libexecdir: ${prefix}/lib/apr
|
|
||||||
mandir: ${prefix}/man
|
|
||||||
sysconfdir: /etc/httpd/conf
|
|
||||||
datadir: /var/www
|
|
||||||
installbuilddir: ${datadir}/build
|
|
||||||
includedir: ${prefix}/include/apr
|
|
||||||
localstatedir: /var
|
|
||||||
runtimedir: ${localstatedir}/run
|
|
||||||
</Layout>
|
|
||||||
|
|
||||||
# According to the /opt filesystem conventions
|
|
||||||
<Layout opt>
|
|
||||||
prefix: /opt/apr
|
|
||||||
exec_prefix: ${prefix}
|
|
||||||
bindir: ${exec_prefix}/bin
|
|
||||||
sbindir: ${exec_prefix}/sbin
|
|
||||||
libdir: ${exec_prefix}/lib
|
|
||||||
libexecdir: ${exec_prefix}/libexec
|
|
||||||
mandir: ${prefix}/man
|
|
||||||
sysconfdir: /etc${prefix}
|
|
||||||
datadir: ${prefix}/share
|
|
||||||
installbuilddir: ${datadir}/build
|
|
||||||
includedir: ${prefix}/include
|
|
||||||
localstatedir: /var${prefix}
|
|
||||||
runtimedir: ${localstatedir}/run
|
|
||||||
</Layout>
|
|
||||||
|
|
||||||
# BeOS layout...
|
|
||||||
<Layout beos>
|
|
||||||
prefix: /boot/home/apr
|
|
||||||
exec_prefix: ${prefix}
|
|
||||||
bindir: ${exec_prefix}/bin
|
|
||||||
sbindir: ${exec_prefix}/bin
|
|
||||||
libdir: ${exec_prefix}/lib
|
|
||||||
libexecdir: ${exec_prefix}/libexec
|
|
||||||
mandir: ${prefix}/man
|
|
||||||
sysconfdir: ${prefix}/conf
|
|
||||||
datadir: ${prefix}
|
|
||||||
installbuilddir: ${datadir}/build
|
|
||||||
includedir: ${prefix}/include
|
|
||||||
localstatedir: ${prefix}
|
|
||||||
runtimedir: ${localstatedir}/logs
|
|
||||||
</Layout>
|
|
||||||
|
|
||||||
# SuSE 6.x layout
|
|
||||||
<Layout SuSE>
|
|
||||||
prefix: /usr
|
|
||||||
exec_prefix: ${prefix}
|
|
||||||
bindir: ${prefix}/bin
|
|
||||||
sbindir: ${prefix}/sbin
|
|
||||||
libdir: ${prefix}/lib
|
|
||||||
libexecdir: ${prefix}/lib/apr
|
|
||||||
mandir: ${prefix}/share/man
|
|
||||||
sysconfdir: /etc/httpd
|
|
||||||
datadir: /usr/local/httpd
|
|
||||||
installbuilddir: ${datadir}/build
|
|
||||||
includedir: ${prefix}/include/apr
|
|
||||||
localstatedir: /var/lib/httpd
|
|
||||||
runtimedir: /var/run
|
|
||||||
</Layout>
|
|
||||||
|
|
||||||
# BSD/OS layout
|
|
||||||
<Layout BSDI>
|
|
||||||
prefix: /var/www
|
|
||||||
exec_prefix: /usr/contrib
|
|
||||||
bindir: ${exec_prefix}/bin
|
|
||||||
sbindir: ${exec_prefix}/bin
|
|
||||||
libdir: ${exec_prefix}/lib
|
|
||||||
libexecdir: ${exec_prefix}/libexec/apr
|
|
||||||
mandir: ${exec_prefix}/man
|
|
||||||
sysconfdir: ${prefix}/conf
|
|
||||||
datadir: ${prefix}
|
|
||||||
installbuilddir: ${datadir}/build
|
|
||||||
includedir: ${exec_prefix}/include/apr
|
|
||||||
localstatedir: /var
|
|
||||||
runtimedir: ${localstatedir}/run
|
|
||||||
</Layout>
|
|
||||||
|
|
||||||
# Solaris 8 Layout
|
|
||||||
<Layout Solaris>
|
|
||||||
prefix: /usr/apr
|
|
||||||
exec_prefix: ${prefix}
|
|
||||||
bindir: ${exec_prefix}/bin
|
|
||||||
sbindir: ${exec_prefix}/bin
|
|
||||||
libdir: ${exec_prefix}/lib
|
|
||||||
libexecdir: ${exec_prefix}/libexec
|
|
||||||
mandir: ${exec_prefix}/man
|
|
||||||
sysconfdir: /etc/apr
|
|
||||||
datadir: /var/apr
|
|
||||||
installbuilddir: ${datadir}/build
|
|
||||||
includedir: ${exec_prefix}/include
|
|
||||||
localstatedir: ${prefix}
|
|
||||||
runtimedir: /var/run
|
|
||||||
</Layout>
|
|
||||||
|
|
||||||
# OpenBSD Layout
|
|
||||||
<Layout OpenBSD>
|
|
||||||
prefix: /var/www
|
|
||||||
exec_prefix: /usr
|
|
||||||
bindir: ${exec_prefix}/bin
|
|
||||||
sbindir: ${exec_prefix}/sbin
|
|
||||||
libdir: ${exec_prefix}/lib
|
|
||||||
libexecdir: ${exec_prefix}/lib/apr/modules
|
|
||||||
mandir: ${exec_prefix}/share/man
|
|
||||||
sysconfdir: ${prefix}/conf
|
|
||||||
datadir: ${prefix}
|
|
||||||
installbuilddir: ${prefix}/build
|
|
||||||
includedir: ${exec_prefix}/lib/apr/include
|
|
||||||
localstatedir: ${prefix}
|
|
||||||
runtimedir: ${prefix}/logs
|
|
||||||
</Layout>
|
|
||||||
|
|
||||||
# Debian layout
|
|
||||||
<Layout Debian>
|
|
||||||
prefix:
|
|
||||||
exec_prefix: ${prefix}/usr
|
|
||||||
bindir: ${exec_prefix}/bin
|
|
||||||
sbindir: ${exec_prefix}/sbin
|
|
||||||
libdir: ${exec_prefix}/lib
|
|
||||||
libexecdir: ${exec_prefix}/lib/apr/modules
|
|
||||||
mandir: ${exec_prefix}/share/man
|
|
||||||
datadir: ${exec_prefix}/share/apr
|
|
||||||
includedir: ${exec_prefix}/include/apr-${APRUTIL_MAJOR_VERSION}
|
|
||||||
localstatedir: ${prefix}/var/run
|
|
||||||
runtimedir: ${prefix}/var/run
|
|
||||||
infodir: ${exec_prefix}/share/info
|
|
||||||
libsuffix: -${APRUTIL_MAJOR_VERSION}
|
|
||||||
installbuilddir: ${prefix}/usr/share/apache2/build
|
|
||||||
</Layout>
|
|
|
@ -1,216 +0,0 @@
|
||||||
dnl
|
|
||||||
dnl Process this file with autoconf to produce a configure script
|
|
||||||
dnl
|
|
||||||
|
|
||||||
AC_PREREQ(2.50)
|
|
||||||
AC_INIT(export_vars.sh.in)
|
|
||||||
|
|
||||||
AC_CONFIG_HEADERS(include/private/apu_config.h)
|
|
||||||
AC_CONFIG_AUX_DIR(build)
|
|
||||||
|
|
||||||
sinclude(build/apu-conf.m4)
|
|
||||||
sinclude(build/apu-iconv.m4)
|
|
||||||
sinclude(build/apu-hints.m4)
|
|
||||||
sinclude(build/apr_common.m4)
|
|
||||||
sinclude(build/find_apr.m4)
|
|
||||||
sinclude(build/dbm.m4)
|
|
||||||
sinclude(build/dbd.m4)
|
|
||||||
|
|
||||||
dnl Generate ./config.nice for reproducing runs of configure
|
|
||||||
dnl
|
|
||||||
APR_CONFIG_NICE(config.nice)
|
|
||||||
|
|
||||||
CFLAGS="$CFLAGS $CONFIGURE_CFLAGS"
|
|
||||||
CXXFLAGS="$CXXFLAGS $CONFIGURE_CXXFLAGS"
|
|
||||||
LDFLAGS="$LDFLAGS $CONFIGURE_LDFLAGS"
|
|
||||||
|
|
||||||
dnl # Some initial steps for configuration. We setup the default directory
|
|
||||||
dnl # and which files are to be configured.
|
|
||||||
|
|
||||||
dnl Absolute source/build directory
|
|
||||||
abs_srcdir=`(cd $srcdir && pwd)`
|
|
||||||
abs_builddir=`pwd`
|
|
||||||
|
|
||||||
if test "$abs_builddir" != "$abs_srcdir"; then
|
|
||||||
USE_VPATH=1
|
|
||||||
APU_CONFIG_LOCATION=build
|
|
||||||
else
|
|
||||||
APU_CONFIG_LOCATION=source
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_SUBST(APU_CONFIG_LOCATION)
|
|
||||||
|
|
||||||
AC_CANONICAL_SYSTEM
|
|
||||||
|
|
||||||
AC_PROG_INSTALL
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl compute the top directory of the build
|
|
||||||
dnl note: this is needed for LIBTOOL and exporting the bundled Expat
|
|
||||||
dnl
|
|
||||||
top_builddir="$abs_builddir"
|
|
||||||
AC_SUBST(top_builddir)
|
|
||||||
AC_SUBST(abs_srcdir)
|
|
||||||
AC_SUBST(abs_builddir)
|
|
||||||
|
|
||||||
dnl Initialize mkdir -p functionality.
|
|
||||||
APR_MKDIR_P_CHECK($abs_srcdir/build/mkdir.sh)
|
|
||||||
|
|
||||||
dnl get our version information
|
|
||||||
get_version="$abs_srcdir/build/get-version.sh"
|
|
||||||
version_hdr="$abs_srcdir/include/apu_version.h"
|
|
||||||
APRUTIL_MAJOR_VERSION="`$get_version major $version_hdr APU`"
|
|
||||||
APRUTIL_DOTTED_VERSION="`$get_version all $version_hdr APU`"
|
|
||||||
|
|
||||||
AC_SUBST(APRUTIL_DOTTED_VERSION)
|
|
||||||
AC_SUBST(APRUTIL_MAJOR_VERSION)
|
|
||||||
|
|
||||||
echo "APR-util Version: ${APRUTIL_DOTTED_VERSION}"
|
|
||||||
|
|
||||||
dnl Enable the layout handling code, then reparse the prefix-style
|
|
||||||
dnl arguments due to autoconf being a PITA.
|
|
||||||
APR_ENABLE_LAYOUT(apr-util)
|
|
||||||
APR_PARSE_ARGUMENTS
|
|
||||||
|
|
||||||
dnl load os-specific hints for apr-util
|
|
||||||
APU_PRELOAD
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl set up the compilation flags and stuff
|
|
||||||
dnl
|
|
||||||
|
|
||||||
APRUTIL_INCLUDES=""
|
|
||||||
APRUTIL_PRIV_INCLUDES="-I$top_builddir/include -I$top_builddir/include/private"
|
|
||||||
if test -n "$USE_VPATH"; then
|
|
||||||
APRUTIL_PRIV_INCLUDES="$APRUTIL_PRIV_INCLUDES -I$abs_srcdir/include/private -I$abs_srcdir/include"
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl Find the APR includes directory and (possibly) the source (base) dir.
|
|
||||||
dnl
|
|
||||||
APU_FIND_APR
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl even though we use apr_rules.mk for building apr-util, we need
|
|
||||||
dnl to grab CC and CPP ahead of time so that apr-util config tests
|
|
||||||
dnl use the same compiler as APR; we need the same compiler options
|
|
||||||
dnl and feature test macros as well
|
|
||||||
dnl
|
|
||||||
APR_SETIFNULL(CC, `$apr_config --cc`)
|
|
||||||
APR_SETIFNULL(CPP, `$apr_config --cpp`)
|
|
||||||
APR_ADDTO(CFLAGS, `$apr_config --cflags`)
|
|
||||||
APR_ADDTO(CPPFLAGS, `$apr_config --cppflags`)
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl Find the APR-ICONV directory.
|
|
||||||
dnl
|
|
||||||
if test -d ../apr-iconv; then
|
|
||||||
APR_SUBDIR_CONFIG(../apr-iconv,
|
|
||||||
[$apache_apr_flags --prefix=$prefix --exec-prefix=$exec_prefix --libdir=$libdir --includedir=$includedir --bindir=$bindir --datadir=$datadir --with-installbuilddir=$installbuilddir],
|
|
||||||
[--enable-layout=*|\'--enable-layout=*])
|
|
||||||
APRUTIL_EXPORT_LIBS="$abs_srcdir/../apr-iconv/lib/libapriconv.la $APRUTIL_EXPORT_LIBS"
|
|
||||||
APRUTIL_INCLUDES="-I$abs_srcdir/../apr-iconv/include $APRUTIL_INCLUDES"
|
|
||||||
APR_ICONV_DIR=../apr-iconv
|
|
||||||
else
|
|
||||||
APR_ICONV_DIR=""
|
|
||||||
fi
|
|
||||||
AC_SUBST(APR_ICONV_DIR)
|
|
||||||
|
|
||||||
dnl Find LDAP library
|
|
||||||
dnl Determine what DBM backend type to use.
|
|
||||||
dnl Find Expat
|
|
||||||
dnl Find an iconv library
|
|
||||||
APU_FIND_LDAP
|
|
||||||
APU_CHECK_DBM
|
|
||||||
APU_CHECK_DBD
|
|
||||||
APU_CHECK_DBD_MYSQL
|
|
||||||
APU_CHECK_DBD_SQLITE3
|
|
||||||
APU_CHECK_DBD_SQLITE2
|
|
||||||
APU_FIND_EXPAT
|
|
||||||
APU_FIND_ICONV
|
|
||||||
|
|
||||||
AC_SEARCH_LIBS(crypt, crypt ufc)
|
|
||||||
AC_MSG_CHECKING(if system crypt() function is threadsafe)
|
|
||||||
if test "x$apu_crypt_threadsafe" = "x1"; then
|
|
||||||
AC_DEFINE(APU_CRYPT_THREADSAFE, 1, [Define if the system crypt() function is threadsafe])
|
|
||||||
msg="yes"
|
|
||||||
else
|
|
||||||
msg="no"
|
|
||||||
fi
|
|
||||||
AC_MSG_RESULT([$msg])
|
|
||||||
|
|
||||||
AC_CHECK_FUNCS(crypt_r, [ crypt_r="1" ], [ crypt_r="0" ])
|
|
||||||
if test "$crypt_r" = "1"; then
|
|
||||||
APU_CHECK_CRYPT_R_STYLE
|
|
||||||
fi
|
|
||||||
|
|
||||||
so_ext=$APR_SO_EXT
|
|
||||||
lib_target=$APR_LIB_TARGET
|
|
||||||
AC_SUBST(so_ext)
|
|
||||||
AC_SUBST(lib_target)
|
|
||||||
|
|
||||||
APRUTIL_LIBNAME="aprutil${libsuffix}"
|
|
||||||
AC_SUBST(APRUTIL_LIBNAME)
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl Prep all the flags and stuff for compilation and export to other builds
|
|
||||||
dnl
|
|
||||||
APR_ADDTO(APRUTIL_LIBS, [$APR_LIBS])
|
|
||||||
|
|
||||||
AC_SUBST(APRUTIL_EXPORT_LIBS)
|
|
||||||
AC_SUBST(APRUTIL_PRIV_INCLUDES)
|
|
||||||
AC_SUBST(APRUTIL_INCLUDES)
|
|
||||||
AC_SUBST(APRUTIL_LDFLAGS)
|
|
||||||
AC_SUBST(APRUTIL_LIBS)
|
|
||||||
AC_SUBST(LDFLAGS)
|
|
||||||
|
|
||||||
dnl copy apr's rules.mk into our build directory.
|
|
||||||
if test ! -d ./build; then
|
|
||||||
$mkdir_p build
|
|
||||||
fi
|
|
||||||
cp $APR_BUILD_DIR/apr_rules.mk $abs_builddir/build/rules.mk
|
|
||||||
|
|
||||||
dnl
|
|
||||||
dnl BSD/OS (BSDi) needs to use a different include syntax in the Makefiles
|
|
||||||
dnl
|
|
||||||
case "$host_alias" in
|
|
||||||
*bsdi* | BSD/OS)
|
|
||||||
# Check whether they've installed GNU make
|
|
||||||
if make --version > /dev/null 2>&1; then
|
|
||||||
INCLUDE_RULES="include $abs_builddir/build/rules.mk"
|
|
||||||
INCLUDE_OUTPUTS="include $abs_srcdir/build-outputs.mk"
|
|
||||||
else
|
|
||||||
INCLUDE_RULES=".include \"$abs_builddir/build/rules.mk\""
|
|
||||||
INCLUDE_OUTPUTS=".include \"$abs_srcdir/build-outputs.mk\""
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
INCLUDE_RULES="include $abs_builddir/build/rules.mk"
|
|
||||||
INCLUDE_OUTPUTS="include $abs_srcdir/build-outputs.mk"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
AC_SUBST(INCLUDE_RULES)
|
|
||||||
AC_SUBST(INCLUDE_OUTPUTS)
|
|
||||||
|
|
||||||
for d in include include/private; do
|
|
||||||
test -d $top_builddir/$d || mkdir $top_builddir/$d
|
|
||||||
done
|
|
||||||
|
|
||||||
AC_CONFIG_FILES([Makefile export_vars.sh
|
|
||||||
build/pkg/pkginfo apr-util.pc
|
|
||||||
apu-$APRUTIL_MAJOR_VERSION-config:apu-config.in
|
|
||||||
include/private/apu_select_dbm.h
|
|
||||||
include/apr_ldap.h
|
|
||||||
include/apu.h include/apu_want.h])
|
|
||||||
|
|
||||||
AC_CONFIG_COMMANDS([default], [
|
|
||||||
chmod +x apu-$APRUTIL_MAJOR_VERSION-config
|
|
||||||
],[
|
|
||||||
APRUTIL_MAJOR_VERSION=$APRUTIL_MAJOR_VERSION
|
|
||||||
])
|
|
||||||
|
|
||||||
if test -d $srcdir/test; then
|
|
||||||
AC_CONFIG_FILES([test/Makefile])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_OUTPUT
|
|
|
@ -1,4 +0,0 @@
|
||||||
#! /bin/sh
|
|
||||||
srcpath=$(dirname $0 2>/dev/null ) || srcpath="."
|
|
||||||
$srcpath/configure "$@" --with-apr=../apr --disable-shared --with-pic --without-sqlite2 --without-sqlite3 --with-expat=builtin
|
|
||||||
|
|
|
@ -1,404 +0,0 @@
|
||||||
/* Copyright 2001-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*
|
|
||||||
* This is derived from material copyright RSA Data Security, Inc.
|
|
||||||
* Their notice is reproduced below in its entirety.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
|
|
||||||
* rights reserved.
|
|
||||||
*
|
|
||||||
* License to copy and use this software is granted provided that it
|
|
||||||
* is identified as the "RSA Data Security, Inc. MD4 Message-Digest
|
|
||||||
* Algorithm" in all material mentioning or referencing this software
|
|
||||||
* or this function.
|
|
||||||
*
|
|
||||||
* License is also granted to make and use derivative works provided
|
|
||||||
* that such works are identified as "derived from the RSA Data
|
|
||||||
* Security, Inc. MD4 Message-Digest Algorithm" in all material
|
|
||||||
* mentioning or referencing the derived work.
|
|
||||||
*
|
|
||||||
* RSA Data Security, Inc. makes no representations concerning either
|
|
||||||
* the merchantability of this software or the suitability of this
|
|
||||||
* software for any particular purpose. It is provided "as is"
|
|
||||||
* without express or implied warranty of any kind.
|
|
||||||
*
|
|
||||||
* These notices must be retained in any copies of any part of this
|
|
||||||
* documentation and/or software.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apr_strings.h"
|
|
||||||
#include "apr_md4.h"
|
|
||||||
#include "apr_lib.h"
|
|
||||||
|
|
||||||
#if APR_HAVE_STRING_H
|
|
||||||
#include <string.h>
|
|
||||||
#endif
|
|
||||||
#if APR_HAVE_UNISTD_H
|
|
||||||
#include <unistd.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Constants for MD4Transform routine.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define S11 3
|
|
||||||
#define S12 7
|
|
||||||
#define S13 11
|
|
||||||
#define S14 19
|
|
||||||
#define S21 3
|
|
||||||
#define S22 5
|
|
||||||
#define S23 9
|
|
||||||
#define S24 13
|
|
||||||
#define S31 3
|
|
||||||
#define S32 9
|
|
||||||
#define S33 11
|
|
||||||
#define S34 15
|
|
||||||
|
|
||||||
static void MD4Transform(apr_uint32_t state[4], const unsigned char block[64]);
|
|
||||||
static void Encode(unsigned char *output, const apr_uint32_t *input,
|
|
||||||
unsigned int len);
|
|
||||||
static void Decode(apr_uint32_t *output, const unsigned char *input,
|
|
||||||
unsigned int len);
|
|
||||||
|
|
||||||
static unsigned char PADDING[64] =
|
|
||||||
{
|
|
||||||
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
|
||||||
};
|
|
||||||
|
|
||||||
#if APR_CHARSET_EBCDIC
|
|
||||||
static apr_xlate_t *xlate_ebcdic_to_ascii; /* used in apr_md4_encode() */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* F, G and I are basic MD4 functions.
|
|
||||||
*/
|
|
||||||
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
|
|
||||||
#define G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z)))
|
|
||||||
#define H(x, y, z) ((x) ^ (y) ^ (z))
|
|
||||||
|
|
||||||
/* ROTATE_LEFT rotates x left n bits.
|
|
||||||
*/
|
|
||||||
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
|
|
||||||
|
|
||||||
/* FF, GG and HH are transformations for rounds 1, 2 and 3 */
|
|
||||||
/* Rotation is separate from addition to prevent recomputation */
|
|
||||||
|
|
||||||
#define FF(a, b, c, d, x, s) { \
|
|
||||||
(a) += F ((b), (c), (d)) + (x); \
|
|
||||||
(a) = ROTATE_LEFT ((a), (s)); \
|
|
||||||
}
|
|
||||||
#define GG(a, b, c, d, x, s) { \
|
|
||||||
(a) += G ((b), (c), (d)) + (x) + (apr_uint32_t)0x5a827999; \
|
|
||||||
(a) = ROTATE_LEFT ((a), (s)); \
|
|
||||||
}
|
|
||||||
#define HH(a, b, c, d, x, s) { \
|
|
||||||
(a) += H ((b), (c), (d)) + (x) + (apr_uint32_t)0x6ed9eba1; \
|
|
||||||
(a) = ROTATE_LEFT ((a), (s)); \
|
|
||||||
}
|
|
||||||
|
|
||||||
/* MD4 initialization. Begins an MD4 operation, writing a new context.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_md4_init(apr_md4_ctx_t *context)
|
|
||||||
{
|
|
||||||
context->count[0] = context->count[1] = 0;
|
|
||||||
|
|
||||||
/* Load magic initialization constants. */
|
|
||||||
context->state[0] = 0x67452301;
|
|
||||||
context->state[1] = 0xefcdab89;
|
|
||||||
context->state[2] = 0x98badcfe;
|
|
||||||
context->state[3] = 0x10325476;
|
|
||||||
|
|
||||||
#if APR_HAS_XLATE
|
|
||||||
context->xlate = NULL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if APR_HAS_XLATE
|
|
||||||
/* MD4 translation setup. Provides the APR translation handle
|
|
||||||
* to be used for translating the content before calculating the
|
|
||||||
* digest.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_md4_set_xlate(apr_md4_ctx_t *context,
|
|
||||||
apr_xlate_t *xlate)
|
|
||||||
{
|
|
||||||
apr_status_t rv;
|
|
||||||
int is_sb;
|
|
||||||
|
|
||||||
/* TODO: remove the single-byte-only restriction from this code
|
|
||||||
*/
|
|
||||||
rv = apr_xlate_sb_get(xlate, &is_sb);
|
|
||||||
if (rv != APR_SUCCESS) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
if (!is_sb) {
|
|
||||||
return APR_EINVAL;
|
|
||||||
}
|
|
||||||
context->xlate = xlate;
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
#endif /* APR_HAS_XLATE */
|
|
||||||
|
|
||||||
/* MD4 block update operation. Continues an MD4 message-digest
|
|
||||||
* operation, processing another message block, and updating the
|
|
||||||
* context.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_md4_update(apr_md4_ctx_t *context,
|
|
||||||
const unsigned char *input,
|
|
||||||
apr_size_t inputLen)
|
|
||||||
{
|
|
||||||
unsigned int i, idx, partLen;
|
|
||||||
#if APR_HAS_XLATE
|
|
||||||
apr_size_t inbytes_left, outbytes_left;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Compute number of bytes mod 64 */
|
|
||||||
idx = (unsigned int)((context->count[0] >> 3) & 0x3F);
|
|
||||||
|
|
||||||
/* Update number of bits */
|
|
||||||
if ((context->count[0] += ((apr_uint32_t)inputLen << 3))
|
|
||||||
< ((apr_uint32_t)inputLen << 3))
|
|
||||||
context->count[1]++;
|
|
||||||
context->count[1] += (apr_uint32_t)inputLen >> 29;
|
|
||||||
|
|
||||||
partLen = 64 - idx;
|
|
||||||
|
|
||||||
/* Transform as many times as possible. */
|
|
||||||
#if !APR_HAS_XLATE
|
|
||||||
if (inputLen >= partLen) {
|
|
||||||
memcpy(&context->buffer[idx], input, partLen);
|
|
||||||
MD4Transform(context->state, context->buffer);
|
|
||||||
|
|
||||||
for (i = partLen; i + 63 < inputLen; i += 64)
|
|
||||||
MD4Transform(context->state, &input[i]);
|
|
||||||
|
|
||||||
idx = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
i = 0;
|
|
||||||
|
|
||||||
/* Buffer remaining input */
|
|
||||||
memcpy(&context->buffer[idx], &input[i], inputLen - i);
|
|
||||||
#else /*APR_HAS_XLATE*/
|
|
||||||
if (inputLen >= partLen) {
|
|
||||||
if (context->xlate) {
|
|
||||||
inbytes_left = outbytes_left = partLen;
|
|
||||||
apr_xlate_conv_buffer(context->xlate, (const char *)input,
|
|
||||||
&inbytes_left,
|
|
||||||
(char *)&context->buffer[idx],
|
|
||||||
&outbytes_left);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
memcpy(&context->buffer[idx], input, partLen);
|
|
||||||
}
|
|
||||||
MD4Transform(context->state, context->buffer);
|
|
||||||
|
|
||||||
for (i = partLen; i + 63 < inputLen; i += 64) {
|
|
||||||
if (context->xlate) {
|
|
||||||
unsigned char inp_tmp[64];
|
|
||||||
inbytes_left = outbytes_left = 64;
|
|
||||||
apr_xlate_conv_buffer(context->xlate, (const char *)&input[i],
|
|
||||||
&inbytes_left,
|
|
||||||
(char *)inp_tmp, &outbytes_left);
|
|
||||||
MD4Transform(context->state, inp_tmp);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
MD4Transform(context->state, &input[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
idx = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
i = 0;
|
|
||||||
|
|
||||||
/* Buffer remaining input */
|
|
||||||
if (context->xlate) {
|
|
||||||
inbytes_left = outbytes_left = inputLen - i;
|
|
||||||
apr_xlate_conv_buffer(context->xlate, (const char *)&input[i],
|
|
||||||
&inbytes_left, (char *)&context->buffer[idx],
|
|
||||||
&outbytes_left);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
memcpy(&context->buffer[idx], &input[i], inputLen - i);
|
|
||||||
}
|
|
||||||
#endif /*APR_HAS_XLATE*/
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* MD4 finalization. Ends an MD4 message-digest operation, writing the
|
|
||||||
* the message digest and zeroizing the context.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_md4_final(
|
|
||||||
unsigned char digest[APR_MD4_DIGESTSIZE],
|
|
||||||
apr_md4_ctx_t *context)
|
|
||||||
{
|
|
||||||
unsigned char bits[8];
|
|
||||||
unsigned int idx, padLen;
|
|
||||||
|
|
||||||
/* Save number of bits */
|
|
||||||
Encode(bits, context->count, 8);
|
|
||||||
|
|
||||||
#if APR_HAS_XLATE
|
|
||||||
/* apr_md4_update() should not translate for this final round. */
|
|
||||||
context->xlate = NULL;
|
|
||||||
#endif /*APR_HAS_XLATE*/
|
|
||||||
|
|
||||||
/* Pad out to 56 mod 64. */
|
|
||||||
idx = (unsigned int) ((context->count[0] >> 3) & 0x3f);
|
|
||||||
padLen = (idx < 56) ? (56 - idx) : (120 - idx);
|
|
||||||
apr_md4_update(context, PADDING, padLen);
|
|
||||||
|
|
||||||
/* Append length (before padding) */
|
|
||||||
apr_md4_update(context, bits, 8);
|
|
||||||
|
|
||||||
/* Store state in digest */
|
|
||||||
Encode(digest, context->state, APR_MD4_DIGESTSIZE);
|
|
||||||
|
|
||||||
/* Zeroize sensitive information. */
|
|
||||||
memset(context, 0, sizeof(*context));
|
|
||||||
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* MD4 computation in one step (init, update, final)
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_md4(unsigned char digest[APR_MD4_DIGESTSIZE],
|
|
||||||
const unsigned char *input,
|
|
||||||
apr_size_t inputLen)
|
|
||||||
{
|
|
||||||
apr_md4_ctx_t ctx;
|
|
||||||
apr_status_t rv;
|
|
||||||
|
|
||||||
apr_md4_init(&ctx);
|
|
||||||
|
|
||||||
if ((rv = apr_md4_update(&ctx, input, inputLen)) != APR_SUCCESS)
|
|
||||||
return rv;
|
|
||||||
|
|
||||||
return apr_md4_final(digest, &ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* MD4 basic transformation. Transforms state based on block. */
|
|
||||||
static void MD4Transform(apr_uint32_t state[4], const unsigned char block[64])
|
|
||||||
{
|
|
||||||
apr_uint32_t a = state[0], b = state[1], c = state[2], d = state[3],
|
|
||||||
x[APR_MD4_DIGESTSIZE];
|
|
||||||
|
|
||||||
Decode(x, block, 64);
|
|
||||||
|
|
||||||
/* Round 1 */
|
|
||||||
FF (a, b, c, d, x[ 0], S11); /* 1 */
|
|
||||||
FF (d, a, b, c, x[ 1], S12); /* 2 */
|
|
||||||
FF (c, d, a, b, x[ 2], S13); /* 3 */
|
|
||||||
FF (b, c, d, a, x[ 3], S14); /* 4 */
|
|
||||||
FF (a, b, c, d, x[ 4], S11); /* 5 */
|
|
||||||
FF (d, a, b, c, x[ 5], S12); /* 6 */
|
|
||||||
FF (c, d, a, b, x[ 6], S13); /* 7 */
|
|
||||||
FF (b, c, d, a, x[ 7], S14); /* 8 */
|
|
||||||
FF (a, b, c, d, x[ 8], S11); /* 9 */
|
|
||||||
FF (d, a, b, c, x[ 9], S12); /* 10 */
|
|
||||||
FF (c, d, a, b, x[10], S13); /* 11 */
|
|
||||||
FF (b, c, d, a, x[11], S14); /* 12 */
|
|
||||||
FF (a, b, c, d, x[12], S11); /* 13 */
|
|
||||||
FF (d, a, b, c, x[13], S12); /* 14 */
|
|
||||||
FF (c, d, a, b, x[14], S13); /* 15 */
|
|
||||||
FF (b, c, d, a, x[15], S14); /* 16 */
|
|
||||||
|
|
||||||
/* Round 2 */
|
|
||||||
GG (a, b, c, d, x[ 0], S21); /* 17 */
|
|
||||||
GG (d, a, b, c, x[ 4], S22); /* 18 */
|
|
||||||
GG (c, d, a, b, x[ 8], S23); /* 19 */
|
|
||||||
GG (b, c, d, a, x[12], S24); /* 20 */
|
|
||||||
GG (a, b, c, d, x[ 1], S21); /* 21 */
|
|
||||||
GG (d, a, b, c, x[ 5], S22); /* 22 */
|
|
||||||
GG (c, d, a, b, x[ 9], S23); /* 23 */
|
|
||||||
GG (b, c, d, a, x[13], S24); /* 24 */
|
|
||||||
GG (a, b, c, d, x[ 2], S21); /* 25 */
|
|
||||||
GG (d, a, b, c, x[ 6], S22); /* 26 */
|
|
||||||
GG (c, d, a, b, x[10], S23); /* 27 */
|
|
||||||
GG (b, c, d, a, x[14], S24); /* 28 */
|
|
||||||
GG (a, b, c, d, x[ 3], S21); /* 29 */
|
|
||||||
GG (d, a, b, c, x[ 7], S22); /* 30 */
|
|
||||||
GG (c, d, a, b, x[11], S23); /* 31 */
|
|
||||||
GG (b, c, d, a, x[15], S24); /* 32 */
|
|
||||||
|
|
||||||
/* Round 3 */
|
|
||||||
HH (a, b, c, d, x[ 0], S31); /* 33 */
|
|
||||||
HH (d, a, b, c, x[ 8], S32); /* 34 */
|
|
||||||
HH (c, d, a, b, x[ 4], S33); /* 35 */
|
|
||||||
HH (b, c, d, a, x[12], S34); /* 36 */
|
|
||||||
HH (a, b, c, d, x[ 2], S31); /* 37 */
|
|
||||||
HH (d, a, b, c, x[10], S32); /* 38 */
|
|
||||||
HH (c, d, a, b, x[ 6], S33); /* 39 */
|
|
||||||
HH (b, c, d, a, x[14], S34); /* 40 */
|
|
||||||
HH (a, b, c, d, x[ 1], S31); /* 41 */
|
|
||||||
HH (d, a, b, c, x[ 9], S32); /* 42 */
|
|
||||||
HH (c, d, a, b, x[ 5], S33); /* 43 */
|
|
||||||
HH (b, c, d, a, x[13], S34); /* 44 */
|
|
||||||
HH (a, b, c, d, x[ 3], S31); /* 45 */
|
|
||||||
HH (d, a, b, c, x[11], S32); /* 46 */
|
|
||||||
HH (c, d, a, b, x[ 7], S33); /* 47 */
|
|
||||||
HH (b, c, d, a, x[15], S34); /* 48 */
|
|
||||||
|
|
||||||
state[0] += a;
|
|
||||||
state[1] += b;
|
|
||||||
state[2] += c;
|
|
||||||
state[3] += d;
|
|
||||||
|
|
||||||
/* Zeroize sensitive information. */
|
|
||||||
memset(x, 0, sizeof(x));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Encodes input (apr_uint32_t) into output (unsigned char). Assumes len is
|
|
||||||
* a multiple of 4.
|
|
||||||
*/
|
|
||||||
static void Encode(unsigned char *output, const apr_uint32_t *input,
|
|
||||||
unsigned int len)
|
|
||||||
{
|
|
||||||
unsigned int i, j;
|
|
||||||
apr_uint32_t k;
|
|
||||||
|
|
||||||
for (i = 0, j = 0; j < len; i++, j += 4) {
|
|
||||||
k = input[i];
|
|
||||||
output[j] = (unsigned char)(k & 0xff);
|
|
||||||
output[j + 1] = (unsigned char)((k >> 8) & 0xff);
|
|
||||||
output[j + 2] = (unsigned char)((k >> 16) & 0xff);
|
|
||||||
output[j + 3] = (unsigned char)((k >> 24) & 0xff);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Decodes input (unsigned char) into output (apr_uint32_t). Assumes len is
|
|
||||||
* a multiple of 4.
|
|
||||||
*/
|
|
||||||
static void Decode(apr_uint32_t *output, const unsigned char *input,
|
|
||||||
unsigned int len)
|
|
||||||
{
|
|
||||||
unsigned int i, j;
|
|
||||||
|
|
||||||
for (i = 0, j = 0; j < len; i++, j += 4)
|
|
||||||
output[i] = ((apr_uint32_t)input[j]) |
|
|
||||||
(((apr_uint32_t)input[j + 1]) << 8) |
|
|
||||||
(((apr_uint32_t)input[j + 2]) << 16) |
|
|
||||||
(((apr_uint32_t)input[j + 3]) << 24);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if APR_CHARSET_EBCDIC
|
|
||||||
APU_DECLARE(apr_status_t) apr_MD4InitEBCDIC(apr_xlate_t *xlate)
|
|
||||||
{
|
|
||||||
xlate_ebcdic_to_ascii = xlate;
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -1,733 +0,0 @@
|
||||||
/*
|
|
||||||
* This is work is derived from material Copyright RSA Data Security, Inc.
|
|
||||||
*
|
|
||||||
* The RSA copyright statement and Licence for that original material is
|
|
||||||
* included below. This is followed by the Apache copyright statement and
|
|
||||||
* licence for the modifications made to that material.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
|
|
||||||
rights reserved.
|
|
||||||
|
|
||||||
License to copy and use this software is granted provided that it
|
|
||||||
is identified as the "RSA Data Security, Inc. MD5 Message-Digest
|
|
||||||
Algorithm" in all material mentioning or referencing this software
|
|
||||||
or this function.
|
|
||||||
|
|
||||||
License is also granted to make and use derivative works provided
|
|
||||||
that such works are identified as "derived from the RSA Data
|
|
||||||
Security, Inc. MD5 Message-Digest Algorithm" in all material
|
|
||||||
mentioning or referencing the derived work.
|
|
||||||
|
|
||||||
RSA Data Security, Inc. makes no representations concerning either
|
|
||||||
the merchantability of this software or the suitability of this
|
|
||||||
software for any particular purpose. It is provided "as is"
|
|
||||||
without express or implied warranty of any kind.
|
|
||||||
|
|
||||||
These notices must be retained in any copies of any part of this
|
|
||||||
documentation and/or software.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The apr_md5_encode() routine uses much code obtained from the FreeBSD 3.0
|
|
||||||
* MD5 crypt() function, which is licenced as follows:
|
|
||||||
* ----------------------------------------------------------------------------
|
|
||||||
* "THE BEER-WARE LICENSE" (Revision 42):
|
|
||||||
* <phk@login.dknet.dk> wrote this file. As long as you retain this notice you
|
|
||||||
* can do whatever you want with this stuff. If we meet some day, and you think
|
|
||||||
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
|
|
||||||
* ----------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
#include "apr_strings.h"
|
|
||||||
#include "apr_md5.h"
|
|
||||||
#include "apr_lib.h"
|
|
||||||
#include "apu_config.h"
|
|
||||||
#include "apr_sha1.h"
|
|
||||||
|
|
||||||
#if APR_HAVE_STRING_H
|
|
||||||
#include <string.h>
|
|
||||||
#endif
|
|
||||||
#if APR_HAVE_CRYPT_H
|
|
||||||
#include <crypt.h>
|
|
||||||
#endif
|
|
||||||
#if APR_HAVE_UNISTD_H
|
|
||||||
#include <unistd.h>
|
|
||||||
#endif
|
|
||||||
#if APR_HAVE_PTHREAD_H
|
|
||||||
#include <pthread.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Constants for MD5Transform routine.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define S11 7
|
|
||||||
#define S12 12
|
|
||||||
#define S13 17
|
|
||||||
#define S14 22
|
|
||||||
#define S21 5
|
|
||||||
#define S22 9
|
|
||||||
#define S23 14
|
|
||||||
#define S24 20
|
|
||||||
#define S31 4
|
|
||||||
#define S32 11
|
|
||||||
#define S33 16
|
|
||||||
#define S34 23
|
|
||||||
#define S41 6
|
|
||||||
#define S42 10
|
|
||||||
#define S43 15
|
|
||||||
#define S44 21
|
|
||||||
|
|
||||||
static void MD5Transform(apr_uint32_t state[4], const unsigned char block[64]);
|
|
||||||
static void Encode(unsigned char *output, const apr_uint32_t *input,
|
|
||||||
unsigned int len);
|
|
||||||
static void Decode(apr_uint32_t *output, const unsigned char *input,
|
|
||||||
unsigned int len);
|
|
||||||
|
|
||||||
static unsigned char PADDING[64] =
|
|
||||||
{
|
|
||||||
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
|
||||||
};
|
|
||||||
|
|
||||||
#if APR_CHARSET_EBCDIC
|
|
||||||
static apr_xlate_t *xlate_ebcdic_to_ascii; /* used in apr_md5_encode() */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* F, G, H and I are basic MD5 functions.
|
|
||||||
*/
|
|
||||||
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
|
|
||||||
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
|
|
||||||
#define H(x, y, z) ((x) ^ (y) ^ (z))
|
|
||||||
#define I(x, y, z) ((y) ^ ((x) | (~z)))
|
|
||||||
|
|
||||||
/* ROTATE_LEFT rotates x left n bits.
|
|
||||||
*/
|
|
||||||
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
|
|
||||||
|
|
||||||
/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
|
|
||||||
* Rotation is separate from addition to prevent recomputation.
|
|
||||||
*/
|
|
||||||
#define FF(a, b, c, d, x, s, ac) { \
|
|
||||||
(a) += F ((b), (c), (d)) + (x) + (apr_uint32_t)(ac); \
|
|
||||||
(a) = ROTATE_LEFT ((a), (s)); \
|
|
||||||
(a) += (b); \
|
|
||||||
}
|
|
||||||
#define GG(a, b, c, d, x, s, ac) { \
|
|
||||||
(a) += G ((b), (c), (d)) + (x) + (apr_uint32_t)(ac); \
|
|
||||||
(a) = ROTATE_LEFT ((a), (s)); \
|
|
||||||
(a) += (b); \
|
|
||||||
}
|
|
||||||
#define HH(a, b, c, d, x, s, ac) { \
|
|
||||||
(a) += H ((b), (c), (d)) + (x) + (apr_uint32_t)(ac); \
|
|
||||||
(a) = ROTATE_LEFT ((a), (s)); \
|
|
||||||
(a) += (b); \
|
|
||||||
}
|
|
||||||
#define II(a, b, c, d, x, s, ac) { \
|
|
||||||
(a) += I ((b), (c), (d)) + (x) + (apr_uint32_t)(ac); \
|
|
||||||
(a) = ROTATE_LEFT ((a), (s)); \
|
|
||||||
(a) += (b); \
|
|
||||||
}
|
|
||||||
|
|
||||||
/* MD5 initialization. Begins an MD5 operation, writing a new context.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_md5_init(apr_md5_ctx_t *context)
|
|
||||||
{
|
|
||||||
context->count[0] = context->count[1] = 0;
|
|
||||||
|
|
||||||
/* Load magic initialization constants. */
|
|
||||||
context->state[0] = 0x67452301;
|
|
||||||
context->state[1] = 0xefcdab89;
|
|
||||||
context->state[2] = 0x98badcfe;
|
|
||||||
context->state[3] = 0x10325476;
|
|
||||||
context->xlate = NULL;
|
|
||||||
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* MD5 translation setup. Provides the APR translation handle
|
|
||||||
* to be used for translating the content before calculating the
|
|
||||||
* digest.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_md5_set_xlate(apr_md5_ctx_t *context,
|
|
||||||
apr_xlate_t *xlate)
|
|
||||||
{
|
|
||||||
#if APR_HAS_XLATE
|
|
||||||
apr_status_t rv;
|
|
||||||
int is_sb;
|
|
||||||
|
|
||||||
/* TODO: remove the single-byte-only restriction from this code
|
|
||||||
*/
|
|
||||||
rv = apr_xlate_sb_get(xlate, &is_sb);
|
|
||||||
if (rv != APR_SUCCESS) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
if (!is_sb) {
|
|
||||||
return APR_EINVAL;
|
|
||||||
}
|
|
||||||
context->xlate = xlate;
|
|
||||||
return APR_SUCCESS;
|
|
||||||
#else
|
|
||||||
return APR_ENOTIMPL;
|
|
||||||
#endif /* APR_HAS_XLATE */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* MD5 block update operation. Continues an MD5 message-digest
|
|
||||||
* operation, processing another message block, and updating the
|
|
||||||
* context.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_md5_update(apr_md5_ctx_t *context,
|
|
||||||
const void *_input,
|
|
||||||
apr_size_t inputLen)
|
|
||||||
{
|
|
||||||
const unsigned char *input = _input;
|
|
||||||
unsigned int i, idx, partLen;
|
|
||||||
#if APR_HAS_XLATE
|
|
||||||
apr_size_t inbytes_left, outbytes_left;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Compute number of bytes mod 64 */
|
|
||||||
idx = (unsigned int)((context->count[0] >> 3) & 0x3F);
|
|
||||||
|
|
||||||
/* Update number of bits */
|
|
||||||
if ((context->count[0] += ((apr_uint32_t)inputLen << 3))
|
|
||||||
< ((apr_uint32_t)inputLen << 3))
|
|
||||||
context->count[1]++;
|
|
||||||
context->count[1] += (apr_uint32_t)inputLen >> 29;
|
|
||||||
|
|
||||||
partLen = 64 - idx;
|
|
||||||
|
|
||||||
/* Transform as many times as possible. */
|
|
||||||
#if !APR_HAS_XLATE
|
|
||||||
if (inputLen >= partLen) {
|
|
||||||
memcpy(&context->buffer[idx], input, partLen);
|
|
||||||
MD5Transform(context->state, context->buffer);
|
|
||||||
|
|
||||||
for (i = partLen; i + 63 < inputLen; i += 64)
|
|
||||||
MD5Transform(context->state, &input[i]);
|
|
||||||
|
|
||||||
idx = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
i = 0;
|
|
||||||
|
|
||||||
/* Buffer remaining input */
|
|
||||||
memcpy(&context->buffer[idx], &input[i], inputLen - i);
|
|
||||||
#else /*APR_HAS_XLATE*/
|
|
||||||
if (inputLen >= partLen) {
|
|
||||||
if (context->xlate) {
|
|
||||||
inbytes_left = outbytes_left = partLen;
|
|
||||||
apr_xlate_conv_buffer(context->xlate, (const char *)input,
|
|
||||||
&inbytes_left,
|
|
||||||
(char *)&context->buffer[idx],
|
|
||||||
&outbytes_left);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
memcpy(&context->buffer[idx], input, partLen);
|
|
||||||
}
|
|
||||||
MD5Transform(context->state, context->buffer);
|
|
||||||
|
|
||||||
for (i = partLen; i + 63 < inputLen; i += 64) {
|
|
||||||
if (context->xlate) {
|
|
||||||
unsigned char inp_tmp[64];
|
|
||||||
inbytes_left = outbytes_left = 64;
|
|
||||||
apr_xlate_conv_buffer(context->xlate, (const char *)&input[i],
|
|
||||||
&inbytes_left, (char *)inp_tmp,
|
|
||||||
&outbytes_left);
|
|
||||||
MD5Transform(context->state, inp_tmp);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
MD5Transform(context->state, &input[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
idx = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
i = 0;
|
|
||||||
|
|
||||||
/* Buffer remaining input */
|
|
||||||
if (context->xlate) {
|
|
||||||
inbytes_left = outbytes_left = inputLen - i;
|
|
||||||
apr_xlate_conv_buffer(context->xlate, (const char *)&input[i],
|
|
||||||
&inbytes_left, (char *)&context->buffer[idx],
|
|
||||||
&outbytes_left);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
memcpy(&context->buffer[idx], &input[i], inputLen - i);
|
|
||||||
}
|
|
||||||
#endif /*APR_HAS_XLATE*/
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* MD5 finalization. Ends an MD5 message-digest operation, writing the
|
|
||||||
* the message digest and zeroizing the context.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_md5_final(unsigned char digest[APR_MD5_DIGESTSIZE],
|
|
||||||
apr_md5_ctx_t *context)
|
|
||||||
{
|
|
||||||
unsigned char bits[8];
|
|
||||||
unsigned int idx, padLen;
|
|
||||||
|
|
||||||
/* Save number of bits */
|
|
||||||
Encode(bits, context->count, 8);
|
|
||||||
|
|
||||||
#if APR_HAS_XLATE
|
|
||||||
/* apr_md5_update() should not translate for this final round. */
|
|
||||||
context->xlate = NULL;
|
|
||||||
#endif /*APR_HAS_XLATE*/
|
|
||||||
|
|
||||||
/* Pad out to 56 mod 64. */
|
|
||||||
idx = (unsigned int)((context->count[0] >> 3) & 0x3f);
|
|
||||||
padLen = (idx < 56) ? (56 - idx) : (120 - idx);
|
|
||||||
apr_md5_update(context, PADDING, padLen);
|
|
||||||
|
|
||||||
/* Append length (before padding) */
|
|
||||||
apr_md5_update(context, bits, 8);
|
|
||||||
|
|
||||||
/* Store state in digest */
|
|
||||||
Encode(digest, context->state, APR_MD5_DIGESTSIZE);
|
|
||||||
|
|
||||||
/* Zeroize sensitive information. */
|
|
||||||
memset(context, 0, sizeof(*context));
|
|
||||||
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* MD5 in one step (init, update, final)
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_md5(unsigned char digest[APR_MD5_DIGESTSIZE],
|
|
||||||
const void *_input,
|
|
||||||
apr_size_t inputLen)
|
|
||||||
{
|
|
||||||
const unsigned char *input = _input;
|
|
||||||
apr_md5_ctx_t ctx;
|
|
||||||
apr_status_t rv;
|
|
||||||
|
|
||||||
apr_md5_init(&ctx);
|
|
||||||
|
|
||||||
if ((rv = apr_md5_update(&ctx, input, inputLen)) != APR_SUCCESS)
|
|
||||||
return rv;
|
|
||||||
|
|
||||||
return apr_md5_final(digest, &ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* MD5 basic transformation. Transforms state based on block. */
|
|
||||||
static void MD5Transform(apr_uint32_t state[4], const unsigned char block[64])
|
|
||||||
{
|
|
||||||
apr_uint32_t a = state[0], b = state[1], c = state[2], d = state[3],
|
|
||||||
x[APR_MD5_DIGESTSIZE];
|
|
||||||
|
|
||||||
Decode(x, block, 64);
|
|
||||||
|
|
||||||
/* Round 1 */
|
|
||||||
FF(a, b, c, d, x[0], S11, 0xd76aa478); /* 1 */
|
|
||||||
FF(d, a, b, c, x[1], S12, 0xe8c7b756); /* 2 */
|
|
||||||
FF(c, d, a, b, x[2], S13, 0x242070db); /* 3 */
|
|
||||||
FF(b, c, d, a, x[3], S14, 0xc1bdceee); /* 4 */
|
|
||||||
FF(a, b, c, d, x[4], S11, 0xf57c0faf); /* 5 */
|
|
||||||
FF(d, a, b, c, x[5], S12, 0x4787c62a); /* 6 */
|
|
||||||
FF(c, d, a, b, x[6], S13, 0xa8304613); /* 7 */
|
|
||||||
FF(b, c, d, a, x[7], S14, 0xfd469501); /* 8 */
|
|
||||||
FF(a, b, c, d, x[8], S11, 0x698098d8); /* 9 */
|
|
||||||
FF(d, a, b, c, x[9], S12, 0x8b44f7af); /* 10 */
|
|
||||||
FF(c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
|
|
||||||
FF(b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
|
|
||||||
FF(a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
|
|
||||||
FF(d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
|
|
||||||
FF(c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
|
|
||||||
FF(b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
|
|
||||||
|
|
||||||
/* Round 2 */
|
|
||||||
GG(a, b, c, d, x[1], S21, 0xf61e2562); /* 17 */
|
|
||||||
GG(d, a, b, c, x[6], S22, 0xc040b340); /* 18 */
|
|
||||||
GG(c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
|
|
||||||
GG(b, c, d, a, x[0], S24, 0xe9b6c7aa); /* 20 */
|
|
||||||
GG(a, b, c, d, x[5], S21, 0xd62f105d); /* 21 */
|
|
||||||
GG(d, a, b, c, x[10], S22, 0x2441453); /* 22 */
|
|
||||||
GG(c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
|
|
||||||
GG(b, c, d, a, x[4], S24, 0xe7d3fbc8); /* 24 */
|
|
||||||
GG(a, b, c, d, x[9], S21, 0x21e1cde6); /* 25 */
|
|
||||||
GG(d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
|
|
||||||
GG(c, d, a, b, x[3], S23, 0xf4d50d87); /* 27 */
|
|
||||||
GG(b, c, d, a, x[8], S24, 0x455a14ed); /* 28 */
|
|
||||||
GG(a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
|
|
||||||
GG(d, a, b, c, x[2], S22, 0xfcefa3f8); /* 30 */
|
|
||||||
GG(c, d, a, b, x[7], S23, 0x676f02d9); /* 31 */
|
|
||||||
GG(b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
|
|
||||||
|
|
||||||
/* Round 3 */
|
|
||||||
HH(a, b, c, d, x[5], S31, 0xfffa3942); /* 33 */
|
|
||||||
HH(d, a, b, c, x[8], S32, 0x8771f681); /* 34 */
|
|
||||||
HH(c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
|
|
||||||
HH(b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
|
|
||||||
HH(a, b, c, d, x[1], S31, 0xa4beea44); /* 37 */
|
|
||||||
HH(d, a, b, c, x[4], S32, 0x4bdecfa9); /* 38 */
|
|
||||||
HH(c, d, a, b, x[7], S33, 0xf6bb4b60); /* 39 */
|
|
||||||
HH(b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
|
|
||||||
HH(a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
|
|
||||||
HH(d, a, b, c, x[0], S32, 0xeaa127fa); /* 42 */
|
|
||||||
HH(c, d, a, b, x[3], S33, 0xd4ef3085); /* 43 */
|
|
||||||
HH(b, c, d, a, x[6], S34, 0x4881d05); /* 44 */
|
|
||||||
HH(a, b, c, d, x[9], S31, 0xd9d4d039); /* 45 */
|
|
||||||
HH(d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
|
|
||||||
HH(c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
|
|
||||||
HH(b, c, d, a, x[2], S34, 0xc4ac5665); /* 48 */
|
|
||||||
|
|
||||||
/* Round 4 */
|
|
||||||
II(a, b, c, d, x[0], S41, 0xf4292244); /* 49 */
|
|
||||||
II(d, a, b, c, x[7], S42, 0x432aff97); /* 50 */
|
|
||||||
II(c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
|
|
||||||
II(b, c, d, a, x[5], S44, 0xfc93a039); /* 52 */
|
|
||||||
II(a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
|
|
||||||
II(d, a, b, c, x[3], S42, 0x8f0ccc92); /* 54 */
|
|
||||||
II(c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
|
|
||||||
II(b, c, d, a, x[1], S44, 0x85845dd1); /* 56 */
|
|
||||||
II(a, b, c, d, x[8], S41, 0x6fa87e4f); /* 57 */
|
|
||||||
II(d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
|
|
||||||
II(c, d, a, b, x[6], S43, 0xa3014314); /* 59 */
|
|
||||||
II(b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
|
|
||||||
II(a, b, c, d, x[4], S41, 0xf7537e82); /* 61 */
|
|
||||||
II(d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
|
|
||||||
II(c, d, a, b, x[2], S43, 0x2ad7d2bb); /* 63 */
|
|
||||||
II(b, c, d, a, x[9], S44, 0xeb86d391); /* 64 */
|
|
||||||
|
|
||||||
state[0] += a;
|
|
||||||
state[1] += b;
|
|
||||||
state[2] += c;
|
|
||||||
state[3] += d;
|
|
||||||
|
|
||||||
/* Zeroize sensitive information. */
|
|
||||||
memset(x, 0, sizeof(x));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Encodes input (apr_uint32_t) into output (unsigned char). Assumes len is
|
|
||||||
* a multiple of 4.
|
|
||||||
*/
|
|
||||||
static void Encode(unsigned char *output, const apr_uint32_t *input,
|
|
||||||
unsigned int len)
|
|
||||||
{
|
|
||||||
unsigned int i, j;
|
|
||||||
apr_uint32_t k;
|
|
||||||
|
|
||||||
for (i = 0, j = 0; j < len; i++, j += 4) {
|
|
||||||
k = input[i];
|
|
||||||
output[j] = (unsigned char)(k & 0xff);
|
|
||||||
output[j + 1] = (unsigned char)((k >> 8) & 0xff);
|
|
||||||
output[j + 2] = (unsigned char)((k >> 16) & 0xff);
|
|
||||||
output[j + 3] = (unsigned char)((k >> 24) & 0xff);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Decodes input (unsigned char) into output (apr_uint32_t). Assumes len is
|
|
||||||
* a multiple of 4.
|
|
||||||
*/
|
|
||||||
static void Decode(apr_uint32_t *output, const unsigned char *input,
|
|
||||||
unsigned int len)
|
|
||||||
{
|
|
||||||
unsigned int i, j;
|
|
||||||
|
|
||||||
for (i = 0, j = 0; j < len; i++, j += 4)
|
|
||||||
output[i] = ((apr_uint32_t)input[j]) |
|
|
||||||
(((apr_uint32_t)input[j + 1]) << 8) |
|
|
||||||
(((apr_uint32_t)input[j + 2]) << 16) |
|
|
||||||
(((apr_uint32_t)input[j + 3]) << 24);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if APR_CHARSET_EBCDIC
|
|
||||||
APU_DECLARE(apr_status_t) apr_MD5InitEBCDIC(apr_xlate_t *xlate)
|
|
||||||
{
|
|
||||||
xlate_ebcdic_to_ascii = xlate;
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Define the Magic String prefix that identifies a password as being
|
|
||||||
* hashed using our algorithm.
|
|
||||||
*/
|
|
||||||
static const char *apr1_id = "$apr1$";
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The following MD5 password encryption code was largely borrowed from
|
|
||||||
* the FreeBSD 3.0 /usr/src/lib/libcrypt/crypt.c file, which is
|
|
||||||
* licenced as stated at the top of this file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void to64(char *s, unsigned long v, int n)
|
|
||||||
{
|
|
||||||
static unsigned char itoa64[] = /* 0 ... 63 => ASCII - 64 */
|
|
||||||
"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
|
||||||
|
|
||||||
while (--n >= 0) {
|
|
||||||
*s++ = itoa64[v&0x3f];
|
|
||||||
v >>= 6;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_md5_encode(const char *pw, const char *salt,
|
|
||||||
char *result, apr_size_t nbytes)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Minimum size is 8 bytes for salt, plus 1 for the trailing NUL,
|
|
||||||
* plus 4 for the '$' separators, plus the password hash itself.
|
|
||||||
* Let's leave a goodly amount of leeway.
|
|
||||||
*/
|
|
||||||
|
|
||||||
char passwd[120], *p;
|
|
||||||
const char *sp, *ep;
|
|
||||||
unsigned char final[APR_MD5_DIGESTSIZE];
|
|
||||||
apr_ssize_t sl, pl, i;
|
|
||||||
apr_md5_ctx_t ctx, ctx1;
|
|
||||||
unsigned long l;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Refine the salt first. It's possible we were given an already-hashed
|
|
||||||
* string as the salt argument, so extract the actual salt value from it
|
|
||||||
* if so. Otherwise just use the string up to the first '$' as the salt.
|
|
||||||
*/
|
|
||||||
sp = salt;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If it starts with the magic string, then skip that.
|
|
||||||
*/
|
|
||||||
if (!strncmp(sp, apr1_id, strlen(apr1_id))) {
|
|
||||||
sp += strlen(apr1_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* It stops at the first '$' or 8 chars, whichever comes first
|
|
||||||
*/
|
|
||||||
for (ep = sp; (*ep != '\0') && (*ep != '$') && (ep < (sp + 8)); ep++) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the length of the true salt
|
|
||||||
*/
|
|
||||||
sl = ep - sp;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 'Time to make the doughnuts..'
|
|
||||||
*/
|
|
||||||
apr_md5_init(&ctx);
|
|
||||||
#if APR_CHARSET_EBCDIC
|
|
||||||
apr_md5_set_xlate(&ctx, xlate_ebcdic_to_ascii);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The password first, since that is what is most unknown
|
|
||||||
*/
|
|
||||||
apr_md5_update(&ctx, pw, strlen(pw));
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Then our magic string
|
|
||||||
*/
|
|
||||||
apr_md5_update(&ctx, apr1_id, strlen(apr1_id));
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Then the raw salt
|
|
||||||
*/
|
|
||||||
apr_md5_update(&ctx, sp, sl);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Then just as many characters of the MD5(pw, salt, pw)
|
|
||||||
*/
|
|
||||||
apr_md5_init(&ctx1);
|
|
||||||
apr_md5_update(&ctx1, pw, strlen(pw));
|
|
||||||
apr_md5_update(&ctx1, sp, sl);
|
|
||||||
apr_md5_update(&ctx1, pw, strlen(pw));
|
|
||||||
apr_md5_final(final, &ctx1);
|
|
||||||
for (pl = strlen(pw); pl > 0; pl -= APR_MD5_DIGESTSIZE) {
|
|
||||||
apr_md5_update(&ctx, final,
|
|
||||||
(pl > APR_MD5_DIGESTSIZE) ? APR_MD5_DIGESTSIZE : pl);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Don't leave anything around in vm they could use.
|
|
||||||
*/
|
|
||||||
memset(final, 0, sizeof(final));
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Then something really weird...
|
|
||||||
*/
|
|
||||||
for (i = strlen(pw); i != 0; i >>= 1) {
|
|
||||||
if (i & 1) {
|
|
||||||
apr_md5_update(&ctx, final, 1);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
apr_md5_update(&ctx, pw, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Now make the output string. We know our limitations, so we
|
|
||||||
* can use the string routines without bounds checking.
|
|
||||||
*/
|
|
||||||
strcpy(passwd, apr1_id);
|
|
||||||
strncat(passwd, sp, sl);
|
|
||||||
strcat(passwd, "$");
|
|
||||||
|
|
||||||
apr_md5_final(final, &ctx);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* And now, just to make sure things don't run too fast..
|
|
||||||
* On a 60 Mhz Pentium this takes 34 msec, so you would
|
|
||||||
* need 30 seconds to build a 1000 entry dictionary...
|
|
||||||
*/
|
|
||||||
for (i = 0; i < 1000; i++) {
|
|
||||||
apr_md5_init(&ctx1);
|
|
||||||
if (i & 1) {
|
|
||||||
apr_md5_update(&ctx1, pw, strlen(pw));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
apr_md5_update(&ctx1, final, APR_MD5_DIGESTSIZE);
|
|
||||||
}
|
|
||||||
if (i % 3) {
|
|
||||||
apr_md5_update(&ctx1, sp, sl);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i % 7) {
|
|
||||||
apr_md5_update(&ctx1, pw, strlen(pw));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i & 1) {
|
|
||||||
apr_md5_update(&ctx1, final, APR_MD5_DIGESTSIZE);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
apr_md5_update(&ctx1, pw, strlen(pw));
|
|
||||||
}
|
|
||||||
apr_md5_final(final,&ctx1);
|
|
||||||
}
|
|
||||||
|
|
||||||
p = passwd + strlen(passwd);
|
|
||||||
|
|
||||||
l = (final[ 0]<<16) | (final[ 6]<<8) | final[12]; to64(p, l, 4); p += 4;
|
|
||||||
l = (final[ 1]<<16) | (final[ 7]<<8) | final[13]; to64(p, l, 4); p += 4;
|
|
||||||
l = (final[ 2]<<16) | (final[ 8]<<8) | final[14]; to64(p, l, 4); p += 4;
|
|
||||||
l = (final[ 3]<<16) | (final[ 9]<<8) | final[15]; to64(p, l, 4); p += 4;
|
|
||||||
l = (final[ 4]<<16) | (final[10]<<8) | final[ 5]; to64(p, l, 4); p += 4;
|
|
||||||
l = final[11] ; to64(p, l, 2); p += 2;
|
|
||||||
*p = '\0';
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Don't leave anything around in vm they could use.
|
|
||||||
*/
|
|
||||||
memset(final, 0, sizeof(final));
|
|
||||||
|
|
||||||
apr_cpystrn(result, passwd, nbytes - 1);
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if !defined(WIN32) && !defined(BEOS) && !defined(NETWARE)
|
|
||||||
#if defined(APU_CRYPT_THREADSAFE) || !APR_HAS_THREADS || \
|
|
||||||
defined(CRYPT_R_CRYPTD) || defined(CRYPT_R_STRUCT_CRYPT_DATA)
|
|
||||||
|
|
||||||
#define crypt_mutex_lock()
|
|
||||||
#define crypt_mutex_unlock()
|
|
||||||
|
|
||||||
#elif APR_HAVE_PTHREAD_H && defined(PTHREAD_MUTEX_INITIALIZER)
|
|
||||||
|
|
||||||
static pthread_mutex_t crypt_mutex = PTHREAD_MUTEX_INITIALIZER;
|
|
||||||
static void crypt_mutex_lock(void)
|
|
||||||
{
|
|
||||||
pthread_mutex_lock(&crypt_mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void crypt_mutex_unlock(void)
|
|
||||||
{
|
|
||||||
pthread_mutex_unlock(&crypt_mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#error apr_password_validate() is not threadsafe. rebuild APR without thread support.
|
|
||||||
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Validate a plaintext password against a smashed one. Uses either
|
|
||||||
* crypt() (if available) or apr_md5_encode() or apr_sha1_base64(), depending
|
|
||||||
* upon the format of the smashed input password. Returns APR_SUCCESS if
|
|
||||||
* they match, or APR_EMISMATCH if they don't. If the platform doesn't
|
|
||||||
* support crypt, then the default check is against a clear text string.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_password_validate(const char *passwd,
|
|
||||||
const char *hash)
|
|
||||||
{
|
|
||||||
char sample[120];
|
|
||||||
#if !defined(WIN32) && !defined(BEOS) && !defined(NETWARE)
|
|
||||||
char *crypt_pw;
|
|
||||||
#endif
|
|
||||||
if (!strncmp(hash, apr1_id, strlen(apr1_id))) {
|
|
||||||
/*
|
|
||||||
* The hash was created using our custom algorithm.
|
|
||||||
*/
|
|
||||||
apr_md5_encode(passwd, hash, sample, sizeof(sample));
|
|
||||||
}
|
|
||||||
else if (!strncmp(hash, APR_SHA1PW_ID, APR_SHA1PW_IDLEN)) {
|
|
||||||
apr_sha1_base64(passwd, strlen(passwd), sample);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/*
|
|
||||||
* It's not our algorithm, so feed it to crypt() if possible.
|
|
||||||
*/
|
|
||||||
#if defined(WIN32) || defined(BEOS) || defined(NETWARE)
|
|
||||||
apr_cpystrn(sample, passwd, sizeof(sample) - 1);
|
|
||||||
#elif defined(CRYPT_R_CRYPTD)
|
|
||||||
CRYPTD buffer;
|
|
||||||
|
|
||||||
crypt_pw = crypt_r(passwd, hash, &buffer);
|
|
||||||
apr_cpystrn(sample, crypt_pw, sizeof(sample) - 1);
|
|
||||||
#elif defined(CRYPT_R_STRUCT_CRYPT_DATA)
|
|
||||||
struct crypt_data buffer;
|
|
||||||
|
|
||||||
/* having to clear this seems bogus... GNU doc is
|
|
||||||
* confusing... user report found from google says
|
|
||||||
* the crypt_data struct had to be cleared to get
|
|
||||||
* the same result as plain crypt()
|
|
||||||
*/
|
|
||||||
memset(&buffer, 0, sizeof(buffer));
|
|
||||||
crypt_pw = crypt_r(passwd, hash, &buffer);
|
|
||||||
apr_cpystrn(sample, crypt_pw, sizeof(sample) - 1);
|
|
||||||
#else
|
|
||||||
/* Do a bit of sanity checking since we know that crypt_r()
|
|
||||||
* should always be used for threaded builds on AIX, and
|
|
||||||
* problems in configure logic can result in the wrong
|
|
||||||
* choice being made.
|
|
||||||
*/
|
|
||||||
#if defined(_AIX) && APR_HAS_THREADS
|
|
||||||
#error Configuration error! crypt_r() should have been selected!
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Handle thread safety issues by holding a mutex around the
|
|
||||||
* call to crypt().
|
|
||||||
*/
|
|
||||||
crypt_mutex_lock();
|
|
||||||
crypt_pw = crypt(passwd, hash);
|
|
||||||
apr_cpystrn(sample, crypt_pw, sizeof(sample) - 1);
|
|
||||||
crypt_mutex_unlock();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
return (strcmp(sample, hash) == 0) ? APR_SUCCESS : APR_EMISMATCH;
|
|
||||||
}
|
|
|
@ -1,372 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The exported function:
|
|
||||||
*
|
|
||||||
* apr_sha1_base64(const char *clear, int len, char *out);
|
|
||||||
*
|
|
||||||
* provides a means to SHA1 crypt/encode a plaintext password in
|
|
||||||
* a way which makes password files compatible with those commonly
|
|
||||||
* used in netscape web and ldap installations. It was put together
|
|
||||||
* by Clinton Wong <clintdw@netcom.com>, who also notes that:
|
|
||||||
*
|
|
||||||
* Note: SHA1 support is useful for migration purposes, but is less
|
|
||||||
* secure than Apache's password format, since Apache's (MD5)
|
|
||||||
* password format uses a random eight character salt to generate
|
|
||||||
* one of many possible hashes for the same password. Netscape
|
|
||||||
* uses plain SHA1 without a salt, so the same password
|
|
||||||
* will always generate the same hash, making it easier
|
|
||||||
* to break since the search space is smaller.
|
|
||||||
*
|
|
||||||
* See also the documentation in support/SHA1 as to hints on how to
|
|
||||||
* migrate an existing netscape installation and other supplied utitlites.
|
|
||||||
*
|
|
||||||
* This software also makes use of the following component:
|
|
||||||
*
|
|
||||||
* NIST Secure Hash Algorithm
|
|
||||||
* heavily modified by Uwe Hollerbach uh@alumni.caltech edu
|
|
||||||
* from Peter C. Gutmann's implementation as found in
|
|
||||||
* Applied Cryptography by Bruce Schneier
|
|
||||||
* This code is hereby placed in the public domain
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apr_sha1.h"
|
|
||||||
#include "apr_base64.h"
|
|
||||||
#include "apr_strings.h"
|
|
||||||
#include "apr_lib.h"
|
|
||||||
#if APR_CHARSET_EBCDIC
|
|
||||||
#include "apr_xlate.h"
|
|
||||||
#endif /*APR_CHARSET_EBCDIC*/
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
/* a bit faster & bigger, if defined */
|
|
||||||
#define UNROLL_LOOPS
|
|
||||||
|
|
||||||
/* NIST's proposed modification to SHA, 7/11/94 */
|
|
||||||
#define USE_MODIFIED_SHA
|
|
||||||
|
|
||||||
/* SHA f()-functions */
|
|
||||||
#define f1(x,y,z) ((x & y) | (~x & z))
|
|
||||||
#define f2(x,y,z) (x ^ y ^ z)
|
|
||||||
#define f3(x,y,z) ((x & y) | (x & z) | (y & z))
|
|
||||||
#define f4(x,y,z) (x ^ y ^ z)
|
|
||||||
|
|
||||||
/* SHA constants */
|
|
||||||
#define CONST1 0x5a827999L
|
|
||||||
#define CONST2 0x6ed9eba1L
|
|
||||||
#define CONST3 0x8f1bbcdcL
|
|
||||||
#define CONST4 0xca62c1d6L
|
|
||||||
|
|
||||||
/* 32-bit rotate */
|
|
||||||
|
|
||||||
#define ROT32(x,n) ((x << n) | (x >> (32 - n)))
|
|
||||||
|
|
||||||
#define FUNC(n,i) \
|
|
||||||
temp = ROT32(A,5) + f##n(B,C,D) + E + W[i] + CONST##n; \
|
|
||||||
E = D; D = C; C = ROT32(B,30); B = A; A = temp
|
|
||||||
|
|
||||||
#define SHA_BLOCKSIZE 64
|
|
||||||
|
|
||||||
#if APR_CHARSET_EBCDIC
|
|
||||||
static apr_xlate_t *ebcdic2ascii_xlate;
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_SHA1InitEBCDIC(apr_xlate_t *x)
|
|
||||||
{
|
|
||||||
apr_status_t rv;
|
|
||||||
int onoff;
|
|
||||||
|
|
||||||
/* Only single-byte conversion is supported.
|
|
||||||
*/
|
|
||||||
rv = apr_xlate_sb_get(x, &onoff);
|
|
||||||
if (rv) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
if (!onoff) { /* If conversion is not single-byte-only */
|
|
||||||
return APR_EINVAL;
|
|
||||||
}
|
|
||||||
ebcdic2ascii_xlate = x;
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* do SHA transformation */
|
|
||||||
static void sha_transform(apr_sha1_ctx_t *sha_info)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
apr_uint32_t temp, A, B, C, D, E, W[80];
|
|
||||||
|
|
||||||
for (i = 0; i < 16; ++i) {
|
|
||||||
W[i] = sha_info->data[i];
|
|
||||||
}
|
|
||||||
for (i = 16; i < 80; ++i) {
|
|
||||||
W[i] = W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16];
|
|
||||||
#ifdef USE_MODIFIED_SHA
|
|
||||||
W[i] = ROT32(W[i], 1);
|
|
||||||
#endif /* USE_MODIFIED_SHA */
|
|
||||||
}
|
|
||||||
A = sha_info->digest[0];
|
|
||||||
B = sha_info->digest[1];
|
|
||||||
C = sha_info->digest[2];
|
|
||||||
D = sha_info->digest[3];
|
|
||||||
E = sha_info->digest[4];
|
|
||||||
#ifdef UNROLL_LOOPS
|
|
||||||
FUNC(1, 0); FUNC(1, 1); FUNC(1, 2); FUNC(1, 3); FUNC(1, 4);
|
|
||||||
FUNC(1, 5); FUNC(1, 6); FUNC(1, 7); FUNC(1, 8); FUNC(1, 9);
|
|
||||||
FUNC(1,10); FUNC(1,11); FUNC(1,12); FUNC(1,13); FUNC(1,14);
|
|
||||||
FUNC(1,15); FUNC(1,16); FUNC(1,17); FUNC(1,18); FUNC(1,19);
|
|
||||||
|
|
||||||
FUNC(2,20); FUNC(2,21); FUNC(2,22); FUNC(2,23); FUNC(2,24);
|
|
||||||
FUNC(2,25); FUNC(2,26); FUNC(2,27); FUNC(2,28); FUNC(2,29);
|
|
||||||
FUNC(2,30); FUNC(2,31); FUNC(2,32); FUNC(2,33); FUNC(2,34);
|
|
||||||
FUNC(2,35); FUNC(2,36); FUNC(2,37); FUNC(2,38); FUNC(2,39);
|
|
||||||
|
|
||||||
FUNC(3,40); FUNC(3,41); FUNC(3,42); FUNC(3,43); FUNC(3,44);
|
|
||||||
FUNC(3,45); FUNC(3,46); FUNC(3,47); FUNC(3,48); FUNC(3,49);
|
|
||||||
FUNC(3,50); FUNC(3,51); FUNC(3,52); FUNC(3,53); FUNC(3,54);
|
|
||||||
FUNC(3,55); FUNC(3,56); FUNC(3,57); FUNC(3,58); FUNC(3,59);
|
|
||||||
|
|
||||||
FUNC(4,60); FUNC(4,61); FUNC(4,62); FUNC(4,63); FUNC(4,64);
|
|
||||||
FUNC(4,65); FUNC(4,66); FUNC(4,67); FUNC(4,68); FUNC(4,69);
|
|
||||||
FUNC(4,70); FUNC(4,71); FUNC(4,72); FUNC(4,73); FUNC(4,74);
|
|
||||||
FUNC(4,75); FUNC(4,76); FUNC(4,77); FUNC(4,78); FUNC(4,79);
|
|
||||||
#else /* !UNROLL_LOOPS */
|
|
||||||
for (i = 0; i < 20; ++i) {
|
|
||||||
FUNC(1,i);
|
|
||||||
}
|
|
||||||
for (i = 20; i < 40; ++i) {
|
|
||||||
FUNC(2,i);
|
|
||||||
}
|
|
||||||
for (i = 40; i < 60; ++i) {
|
|
||||||
FUNC(3,i);
|
|
||||||
}
|
|
||||||
for (i = 60; i < 80; ++i) {
|
|
||||||
FUNC(4,i);
|
|
||||||
}
|
|
||||||
#endif /* !UNROLL_LOOPS */
|
|
||||||
sha_info->digest[0] += A;
|
|
||||||
sha_info->digest[1] += B;
|
|
||||||
sha_info->digest[2] += C;
|
|
||||||
sha_info->digest[3] += D;
|
|
||||||
sha_info->digest[4] += E;
|
|
||||||
}
|
|
||||||
|
|
||||||
union endianTest {
|
|
||||||
long Long;
|
|
||||||
char Char[sizeof(long)];
|
|
||||||
};
|
|
||||||
|
|
||||||
static char isLittleEndian(void)
|
|
||||||
{
|
|
||||||
static union endianTest u;
|
|
||||||
u.Long = 1;
|
|
||||||
return (u.Char[0] == 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* change endianness of data */
|
|
||||||
|
|
||||||
/* count is the number of bytes to do an endian flip */
|
|
||||||
static void maybe_byte_reverse(apr_uint32_t *buffer, int count)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
apr_byte_t ct[4], *cp;
|
|
||||||
|
|
||||||
if (isLittleEndian()) { /* do the swap only if it is little endian */
|
|
||||||
count /= sizeof(apr_uint32_t);
|
|
||||||
cp = (apr_byte_t *) buffer;
|
|
||||||
for (i = 0; i < count; ++i) {
|
|
||||||
ct[0] = cp[0];
|
|
||||||
ct[1] = cp[1];
|
|
||||||
ct[2] = cp[2];
|
|
||||||
ct[3] = cp[3];
|
|
||||||
cp[0] = ct[3];
|
|
||||||
cp[1] = ct[2];
|
|
||||||
cp[2] = ct[1];
|
|
||||||
cp[3] = ct[0];
|
|
||||||
cp += sizeof(apr_uint32_t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* initialize the SHA digest */
|
|
||||||
|
|
||||||
APU_DECLARE(void) apr_sha1_init(apr_sha1_ctx_t *sha_info)
|
|
||||||
{
|
|
||||||
sha_info->digest[0] = 0x67452301L;
|
|
||||||
sha_info->digest[1] = 0xefcdab89L;
|
|
||||||
sha_info->digest[2] = 0x98badcfeL;
|
|
||||||
sha_info->digest[3] = 0x10325476L;
|
|
||||||
sha_info->digest[4] = 0xc3d2e1f0L;
|
|
||||||
sha_info->count_lo = 0L;
|
|
||||||
sha_info->count_hi = 0L;
|
|
||||||
sha_info->local = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* update the SHA digest */
|
|
||||||
|
|
||||||
APU_DECLARE(void) apr_sha1_update_binary(apr_sha1_ctx_t *sha_info,
|
|
||||||
const unsigned char *buffer,
|
|
||||||
unsigned int count)
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
if ((sha_info->count_lo + ((apr_uint32_t) count << 3)) < sha_info->count_lo) {
|
|
||||||
++sha_info->count_hi;
|
|
||||||
}
|
|
||||||
sha_info->count_lo += (apr_uint32_t) count << 3;
|
|
||||||
sha_info->count_hi += (apr_uint32_t) count >> 29;
|
|
||||||
if (sha_info->local) {
|
|
||||||
i = SHA_BLOCKSIZE - sha_info->local;
|
|
||||||
if (i > count) {
|
|
||||||
i = count;
|
|
||||||
}
|
|
||||||
memcpy(((apr_byte_t *) sha_info->data) + sha_info->local, buffer, i);
|
|
||||||
count -= i;
|
|
||||||
buffer += i;
|
|
||||||
sha_info->local += i;
|
|
||||||
if (sha_info->local == SHA_BLOCKSIZE) {
|
|
||||||
maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
|
|
||||||
sha_transform(sha_info);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while (count >= SHA_BLOCKSIZE) {
|
|
||||||
memcpy(sha_info->data, buffer, SHA_BLOCKSIZE);
|
|
||||||
buffer += SHA_BLOCKSIZE;
|
|
||||||
count -= SHA_BLOCKSIZE;
|
|
||||||
maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
|
|
||||||
sha_transform(sha_info);
|
|
||||||
}
|
|
||||||
memcpy(sha_info->data, buffer, count);
|
|
||||||
sha_info->local = count;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(void) apr_sha1_update(apr_sha1_ctx_t *sha_info, const char *buf,
|
|
||||||
unsigned int count)
|
|
||||||
{
|
|
||||||
#if APR_CHARSET_EBCDIC
|
|
||||||
int i;
|
|
||||||
const apr_byte_t *buffer = (const apr_byte_t *) buf;
|
|
||||||
apr_size_t inbytes_left, outbytes_left;
|
|
||||||
|
|
||||||
if ((sha_info->count_lo + ((apr_uint32_t) count << 3)) < sha_info->count_lo) {
|
|
||||||
++sha_info->count_hi;
|
|
||||||
}
|
|
||||||
sha_info->count_lo += (apr_uint32_t) count << 3;
|
|
||||||
sha_info->count_hi += (apr_uint32_t) count >> 29;
|
|
||||||
/* Is there a remainder of the previous Update operation? */
|
|
||||||
if (sha_info->local) {
|
|
||||||
i = SHA_BLOCKSIZE - sha_info->local;
|
|
||||||
if (i > count) {
|
|
||||||
i = count;
|
|
||||||
}
|
|
||||||
inbytes_left = outbytes_left = i;
|
|
||||||
apr_xlate_conv_buffer(ebcdic2ascii_xlate, buffer, &inbytes_left,
|
|
||||||
((apr_byte_t *) sha_info->data) + sha_info->local,
|
|
||||||
&outbytes_left);
|
|
||||||
count -= i;
|
|
||||||
buffer += i;
|
|
||||||
sha_info->local += i;
|
|
||||||
if (sha_info->local == SHA_BLOCKSIZE) {
|
|
||||||
maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
|
|
||||||
sha_transform(sha_info);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while (count >= SHA_BLOCKSIZE) {
|
|
||||||
inbytes_left = outbytes_left = SHA_BLOCKSIZE;
|
|
||||||
apr_xlate_conv_buffer(ebcdic2ascii_xlate, buffer, &inbytes_left,
|
|
||||||
(apr_byte_t *) sha_info->data, &outbytes_left);
|
|
||||||
buffer += SHA_BLOCKSIZE;
|
|
||||||
count -= SHA_BLOCKSIZE;
|
|
||||||
maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
|
|
||||||
sha_transform(sha_info);
|
|
||||||
}
|
|
||||||
inbytes_left = outbytes_left = count;
|
|
||||||
apr_xlate_conv_buffer(ebcdic2ascii_xlate, buffer, &inbytes_left,
|
|
||||||
(apr_byte_t *) sha_info->data, &outbytes_left);
|
|
||||||
sha_info->local = count;
|
|
||||||
#else
|
|
||||||
apr_sha1_update_binary(sha_info, (const unsigned char *) buf, count);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* finish computing the SHA digest */
|
|
||||||
|
|
||||||
APU_DECLARE(void) apr_sha1_final(unsigned char digest[APR_SHA1_DIGESTSIZE],
|
|
||||||
apr_sha1_ctx_t *sha_info)
|
|
||||||
{
|
|
||||||
int count, i, j;
|
|
||||||
apr_uint32_t lo_bit_count, hi_bit_count, k;
|
|
||||||
|
|
||||||
lo_bit_count = sha_info->count_lo;
|
|
||||||
hi_bit_count = sha_info->count_hi;
|
|
||||||
count = (int) ((lo_bit_count >> 3) & 0x3f);
|
|
||||||
((apr_byte_t *) sha_info->data)[count++] = 0x80;
|
|
||||||
if (count > SHA_BLOCKSIZE - 8) {
|
|
||||||
memset(((apr_byte_t *) sha_info->data) + count, 0, SHA_BLOCKSIZE - count);
|
|
||||||
maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
|
|
||||||
sha_transform(sha_info);
|
|
||||||
memset((apr_byte_t *) sha_info->data, 0, SHA_BLOCKSIZE - 8);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
memset(((apr_byte_t *) sha_info->data) + count, 0,
|
|
||||||
SHA_BLOCKSIZE - 8 - count);
|
|
||||||
}
|
|
||||||
maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
|
|
||||||
sha_info->data[14] = hi_bit_count;
|
|
||||||
sha_info->data[15] = lo_bit_count;
|
|
||||||
sha_transform(sha_info);
|
|
||||||
|
|
||||||
for (i = 0, j = 0; j < APR_SHA1_DIGESTSIZE; i++) {
|
|
||||||
k = sha_info->digest[i];
|
|
||||||
digest[j++] = (unsigned char) ((k >> 24) & 0xff);
|
|
||||||
digest[j++] = (unsigned char) ((k >> 16) & 0xff);
|
|
||||||
digest[j++] = (unsigned char) ((k >> 8) & 0xff);
|
|
||||||
digest[j++] = (unsigned char) (k & 0xff);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
APU_DECLARE(void) apr_sha1_base64(const char *clear, int len, char *out)
|
|
||||||
{
|
|
||||||
int l;
|
|
||||||
apr_sha1_ctx_t context;
|
|
||||||
apr_byte_t digest[APR_SHA1_DIGESTSIZE];
|
|
||||||
|
|
||||||
if (strncmp(clear, APR_SHA1PW_ID, APR_SHA1PW_IDLEN) == 0) {
|
|
||||||
clear += APR_SHA1PW_IDLEN;
|
|
||||||
}
|
|
||||||
|
|
||||||
apr_sha1_init(&context);
|
|
||||||
apr_sha1_update(&context, clear, len);
|
|
||||||
apr_sha1_final(digest, &context);
|
|
||||||
|
|
||||||
/* private marker. */
|
|
||||||
apr_cpystrn(out, APR_SHA1PW_ID, APR_SHA1PW_IDLEN + 1);
|
|
||||||
|
|
||||||
/* SHA1 hash is always 20 chars */
|
|
||||||
l = apr_base64_encode_binary(out + APR_SHA1PW_IDLEN, digest, sizeof(digest));
|
|
||||||
out[l + APR_SHA1PW_IDLEN] = '\0';
|
|
||||||
|
|
||||||
/*
|
|
||||||
* output of base64 encoded SHA1 is always 28 chars + APR_SHA1PW_IDLEN
|
|
||||||
*/
|
|
||||||
}
|
|
|
@ -1,209 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This attempts to generate V1 UUIDs according to the Internet Draft
|
|
||||||
* located at http://www.webdav.org/specs/draft-leach-uuids-guids-01.txt
|
|
||||||
*/
|
|
||||||
#include "apr.h"
|
|
||||||
#include "apr_uuid.h"
|
|
||||||
#include "apr_general.h"
|
|
||||||
#include "apr_portable.h"
|
|
||||||
#if !APR_HAS_RANDOM
|
|
||||||
#include "apr_md5.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if APR_HAVE_UNISTD_H
|
|
||||||
#include <unistd.h> /* for getpid, gethostname */
|
|
||||||
#endif
|
|
||||||
#if APR_HAVE_STDLIB_H
|
|
||||||
#include <stdlib.h> /* for rand, srand */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if APR_HAVE_STRING_H
|
|
||||||
#include <string.h>
|
|
||||||
#endif
|
|
||||||
#if APR_HAVE_STRINGS_H
|
|
||||||
#include <strings.h>
|
|
||||||
#endif
|
|
||||||
#if APR_HAVE_NETDB_H
|
|
||||||
#include <netdb.h>
|
|
||||||
#endif
|
|
||||||
#if APR_HAVE_SYS_TIME_H
|
|
||||||
#include <sys/time.h> /* for gettimeofday */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define NODE_LENGTH 6
|
|
||||||
|
|
||||||
static int uuid_state_seqnum;
|
|
||||||
static unsigned char uuid_state_node[NODE_LENGTH] = { 0 };
|
|
||||||
|
|
||||||
|
|
||||||
static void get_random_info(unsigned char node[NODE_LENGTH])
|
|
||||||
{
|
|
||||||
#if APR_HAS_RANDOM
|
|
||||||
|
|
||||||
(void) apr_generate_random_bytes(node, NODE_LENGTH);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
unsigned char seed[APR_MD5_DIGESTSIZE];
|
|
||||||
apr_md5_ctx_t c;
|
|
||||||
|
|
||||||
/* ### probably should revise some of this to be a bit more portable */
|
|
||||||
|
|
||||||
/* Leach & Salz use Linux-specific struct sysinfo;
|
|
||||||
* replace with pid/tid for portability (in the spirit of mod_unique_id) */
|
|
||||||
struct {
|
|
||||||
/* Add thread id here, if applicable, when we get to pthread or apr */
|
|
||||||
pid_t pid;
|
|
||||||
#ifdef NETWARE
|
|
||||||
apr_uint64_t t;
|
|
||||||
#else
|
|
||||||
struct timeval t;
|
|
||||||
#endif
|
|
||||||
char hostname[257];
|
|
||||||
|
|
||||||
} r;
|
|
||||||
|
|
||||||
apr_md5_init(&c);
|
|
||||||
#ifdef NETWARE
|
|
||||||
r.pid = NXThreadGetId();
|
|
||||||
NXGetTime(NX_SINCE_BOOT, NX_USECONDS, &(r.t));
|
|
||||||
#else
|
|
||||||
r.pid = getpid();
|
|
||||||
gettimeofday(&r.t, (struct timezone *)0);
|
|
||||||
#endif
|
|
||||||
gethostname(r.hostname, 256);
|
|
||||||
apr_md5_update(&c, (const unsigned char *)&r, sizeof(r));
|
|
||||||
apr_md5_final(seed, &c);
|
|
||||||
|
|
||||||
memcpy(node, seed, NODE_LENGTH); /* use a subset of the seed bytes */
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This implementation generates a random node ID instead of a
|
|
||||||
system-dependent call to get IEEE node ID. This is also more secure:
|
|
||||||
we aren't passing out our MAC address.
|
|
||||||
*/
|
|
||||||
static void get_pseudo_node_identifier(unsigned char *node)
|
|
||||||
{
|
|
||||||
get_random_info(node);
|
|
||||||
node[0] |= 0x01; /* this designates a random node ID */
|
|
||||||
}
|
|
||||||
|
|
||||||
static void get_system_time(apr_uint64_t *uuid_time)
|
|
||||||
{
|
|
||||||
/* ### fix this call to be more portable? */
|
|
||||||
*uuid_time = apr_time_now();
|
|
||||||
|
|
||||||
/* Offset between UUID formatted times and Unix formatted times.
|
|
||||||
UUID UTC base time is October 15, 1582.
|
|
||||||
Unix base time is January 1, 1970. */
|
|
||||||
*uuid_time = (*uuid_time * 10) + APR_TIME_C(0x01B21DD213814000);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* true_random -- generate a crypto-quality random number. */
|
|
||||||
static int true_random(void)
|
|
||||||
{
|
|
||||||
apr_uint64_t time_now;
|
|
||||||
|
|
||||||
#if APR_HAS_RANDOM
|
|
||||||
unsigned char buf[2];
|
|
||||||
|
|
||||||
if (apr_generate_random_bytes(buf, 2) == APR_SUCCESS) {
|
|
||||||
return (buf[0] << 8) | buf[1];
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* crap. this isn't crypto quality, but it will be Good Enough */
|
|
||||||
|
|
||||||
get_system_time(&time_now);
|
|
||||||
srand((unsigned int)(((time_now >> 32) ^ time_now) & 0xffffffff));
|
|
||||||
|
|
||||||
return rand() & 0x0FFFF;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void init_state(void)
|
|
||||||
{
|
|
||||||
uuid_state_seqnum = true_random();
|
|
||||||
get_pseudo_node_identifier(uuid_state_node);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void get_current_time(apr_uint64_t *timestamp)
|
|
||||||
{
|
|
||||||
/* ### this needs to be made thread-safe! */
|
|
||||||
|
|
||||||
apr_uint64_t time_now;
|
|
||||||
static apr_uint64_t time_last = 0;
|
|
||||||
static apr_uint64_t fudge = 0;
|
|
||||||
|
|
||||||
get_system_time(&time_now);
|
|
||||||
|
|
||||||
/* if clock reading changed since last UUID generated... */
|
|
||||||
if (time_last != time_now) {
|
|
||||||
/* The clock reading has changed since the last UUID was generated.
|
|
||||||
Reset the fudge factor. if we are generating them too fast, then
|
|
||||||
the fudge may need to be reset to something greater than zero. */
|
|
||||||
if (time_last + fudge > time_now)
|
|
||||||
fudge = time_last + fudge - time_now + 1;
|
|
||||||
else
|
|
||||||
fudge = 0;
|
|
||||||
time_last = time_now;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* We generated two really fast. Bump the fudge factor. */
|
|
||||||
++fudge;
|
|
||||||
}
|
|
||||||
|
|
||||||
*timestamp = time_now + fudge;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(void) apr_uuid_get(apr_uuid_t *uuid)
|
|
||||||
{
|
|
||||||
apr_uint64_t timestamp;
|
|
||||||
unsigned char *d = uuid->data;
|
|
||||||
|
|
||||||
#if APR_HAS_OS_UUID
|
|
||||||
if (apr_os_uuid_get(d) == APR_SUCCESS) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif /* !APR_HAS_OS_UUID */
|
|
||||||
|
|
||||||
if (!uuid_state_node[0])
|
|
||||||
init_state();
|
|
||||||
|
|
||||||
get_current_time(×tamp);
|
|
||||||
|
|
||||||
/* time_low, uint32 */
|
|
||||||
d[3] = (unsigned char)timestamp;
|
|
||||||
d[2] = (unsigned char)(timestamp >> 8);
|
|
||||||
d[1] = (unsigned char)(timestamp >> 16);
|
|
||||||
d[0] = (unsigned char)(timestamp >> 24);
|
|
||||||
/* time_mid, uint16 */
|
|
||||||
d[5] = (unsigned char)(timestamp >> 32);
|
|
||||||
d[4] = (unsigned char)(timestamp >> 40);
|
|
||||||
/* time_hi_and_version, uint16 */
|
|
||||||
d[7] = (unsigned char)(timestamp >> 48);
|
|
||||||
d[6] = (unsigned char)(((timestamp >> 56) & 0x0F) | 0x10);
|
|
||||||
/* clock_seq_hi_and_reserved, uint8 */
|
|
||||||
d[8] = (unsigned char)(((++uuid_state_seqnum >> 8) & 0x3F) | 0x80);
|
|
||||||
/* clock_seq_low, uint8 */
|
|
||||||
d[9] = (unsigned char)uuid_state_seqnum;
|
|
||||||
/* node, byte[6] */
|
|
||||||
memcpy(&d[10], uuid_state_node, NODE_LENGTH);
|
|
||||||
}
|
|
|
@ -1,130 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h> /* for sprintf */
|
|
||||||
|
|
||||||
#include "apr.h"
|
|
||||||
#include "apr_uuid.h"
|
|
||||||
#include "apr_errno.h"
|
|
||||||
#include "apr_lib.h"
|
|
||||||
|
|
||||||
|
|
||||||
APU_DECLARE(void) apr_uuid_format(char *buffer, const apr_uuid_t *uuid)
|
|
||||||
{
|
|
||||||
const unsigned char *d = uuid->data;
|
|
||||||
|
|
||||||
sprintf(buffer,
|
|
||||||
"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
|
|
||||||
d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7],
|
|
||||||
d[8], d[9], d[10], d[11], d[12], d[13], d[14], d[15]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* convert a pair of hex digits to an integer value [0,255] */
|
|
||||||
#if 'A' == 65
|
|
||||||
static unsigned char parse_hexpair(const char *s)
|
|
||||||
{
|
|
||||||
int result;
|
|
||||||
int temp;
|
|
||||||
|
|
||||||
result = s[0] - '0';
|
|
||||||
if (result > 48)
|
|
||||||
result = (result - 39) << 4;
|
|
||||||
else if (result > 16)
|
|
||||||
result = (result - 7) << 4;
|
|
||||||
else
|
|
||||||
result = result << 4;
|
|
||||||
|
|
||||||
temp = s[1] - '0';
|
|
||||||
if (temp > 48)
|
|
||||||
result |= temp - 39;
|
|
||||||
else if (temp > 16)
|
|
||||||
result |= temp - 7;
|
|
||||||
else
|
|
||||||
result |= temp;
|
|
||||||
|
|
||||||
return (unsigned char)result;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
static unsigned char parse_hexpair(const char *s)
|
|
||||||
{
|
|
||||||
int result;
|
|
||||||
|
|
||||||
if (isdigit(*s)) {
|
|
||||||
result = (*s - '0') << 4;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (isupper(*s)) {
|
|
||||||
result = (*s - 'A' + 10) << 4;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
result = (*s - 'a' + 10) << 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
++s;
|
|
||||||
if (isdigit(*s)) {
|
|
||||||
result |= (*s - '0');
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (isupper(*s)) {
|
|
||||||
result |= (*s - 'A' + 10);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
result |= (*s - 'a' + 10);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (unsigned char)result;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_uuid_parse(apr_uuid_t *uuid,
|
|
||||||
const char *uuid_str)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
unsigned char *d = uuid->data;
|
|
||||||
|
|
||||||
for (i = 0; i < 36; ++i) {
|
|
||||||
char c = uuid_str[i];
|
|
||||||
if (!apr_isxdigit(c) &&
|
|
||||||
!(c == '-' && (i == 8 || i == 13 || i == 18 || i == 23)))
|
|
||||||
/* ### need a better value */
|
|
||||||
return APR_BADARG;
|
|
||||||
}
|
|
||||||
if (uuid_str[36] != '\0') {
|
|
||||||
/* ### need a better value */
|
|
||||||
return APR_BADARG;
|
|
||||||
}
|
|
||||||
|
|
||||||
d[0] = parse_hexpair(&uuid_str[0]);
|
|
||||||
d[1] = parse_hexpair(&uuid_str[2]);
|
|
||||||
d[2] = parse_hexpair(&uuid_str[4]);
|
|
||||||
d[3] = parse_hexpair(&uuid_str[6]);
|
|
||||||
|
|
||||||
d[4] = parse_hexpair(&uuid_str[9]);
|
|
||||||
d[5] = parse_hexpair(&uuid_str[11]);
|
|
||||||
|
|
||||||
d[6] = parse_hexpair(&uuid_str[14]);
|
|
||||||
d[7] = parse_hexpair(&uuid_str[16]);
|
|
||||||
|
|
||||||
d[8] = parse_hexpair(&uuid_str[19]);
|
|
||||||
d[9] = parse_hexpair(&uuid_str[21]);
|
|
||||||
|
|
||||||
for (i = 6; i--;)
|
|
||||||
d[10 + i] = parse_hexpair(&uuid_str[i*2+24]);
|
|
||||||
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
|
@ -1,303 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "apu.h"
|
|
||||||
#include "apr_pools.h"
|
|
||||||
#include "apr_dbd_internal.h"
|
|
||||||
#include "apr_dbd.h"
|
|
||||||
#include "apr_hash.h"
|
|
||||||
#include "apr_thread_mutex.h"
|
|
||||||
#include "apr_dso.h"
|
|
||||||
#include "apr_strings.h"
|
|
||||||
|
|
||||||
static apr_hash_t *drivers = NULL;
|
|
||||||
|
|
||||||
#define CLEANUP_CAST (apr_status_t (*)(void*))
|
|
||||||
|
|
||||||
/* Once the autofoo supports building it for dynamic load, we can use
|
|
||||||
* #define APR_DSO_BUILD APR_HAS_DSO
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if APR_DSO_BUILD
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
static apr_thread_mutex_t* mutex = NULL;
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
#define DRIVER_LOAD(name,driver,pool) \
|
|
||||||
{ \
|
|
||||||
extern const apr_dbd_driver_t driver; \
|
|
||||||
apr_hash_set(drivers,name,APR_HASH_KEY_STRING,&driver); \
|
|
||||||
if (driver.init) { \
|
|
||||||
driver.init(pool); \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static apr_status_t apr_dbd_term(void *ptr)
|
|
||||||
{
|
|
||||||
/* set drivers to NULL so init can work again */
|
|
||||||
drivers = NULL;
|
|
||||||
|
|
||||||
/* Everything else we need is handled by cleanups registered
|
|
||||||
* when we created mutexes and loaded DSOs
|
|
||||||
*/
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_dbd_init(apr_pool_t *pool)
|
|
||||||
{
|
|
||||||
apr_status_t ret = APR_SUCCESS;
|
|
||||||
|
|
||||||
if (drivers != NULL) {
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
drivers = apr_hash_make(pool);
|
|
||||||
apr_pool_cleanup_register(pool, NULL, apr_dbd_term,
|
|
||||||
apr_pool_cleanup_null);
|
|
||||||
|
|
||||||
#if APR_DSO_BUILD
|
|
||||||
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
ret = apr_thread_mutex_create(&mutex, APR_THREAD_MUTEX_DEFAULT, pool);
|
|
||||||
/* This already registers a pool cleanup */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#if APU_HAVE_MYSQL
|
|
||||||
DRIVER_LOAD("mysql", apr_dbd_mysql_driver, pool);
|
|
||||||
#endif
|
|
||||||
#if APU_HAVE_PGSQL
|
|
||||||
DRIVER_LOAD("pgsql", apr_dbd_pgsql_driver, pool);
|
|
||||||
#endif
|
|
||||||
#if APU_HAVE_SQLITE3
|
|
||||||
DRIVER_LOAD("sqlite3", apr_dbd_sqlite3_driver, pool);
|
|
||||||
#endif
|
|
||||||
#if APU_HAVE_SQLITE2
|
|
||||||
DRIVER_LOAD("sqlite2", apr_dbd_sqlite2_driver, pool);
|
|
||||||
#endif
|
|
||||||
#if APU_HAVE_SOME_OTHER_BACKEND
|
|
||||||
DRIVER_LOAD("firebird", apr_dbd_other_driver, pool);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
APU_DECLARE(apr_status_t) apr_dbd_get_driver(apr_pool_t *pool, const char *name,
|
|
||||||
const apr_dbd_driver_t **driver)
|
|
||||||
{
|
|
||||||
#if APR_DSO_BUILD
|
|
||||||
char path[80];
|
|
||||||
apr_dso_handle_t *dlhandle = NULL;
|
|
||||||
#endif
|
|
||||||
apr_status_t rv;
|
|
||||||
|
|
||||||
*driver = apr_hash_get(drivers, name, APR_HASH_KEY_STRING);
|
|
||||||
if (*driver) {
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if APR_DSO_BUILD
|
|
||||||
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
rv = apr_thread_mutex_lock(mutex);
|
|
||||||
if (rv != APR_SUCCESS) {
|
|
||||||
goto unlock;
|
|
||||||
}
|
|
||||||
*driver = apr_hash_get(drivers, name, APR_HASH_KEY_STRING);
|
|
||||||
if (*driver) {
|
|
||||||
goto unlock;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
sprintf(path, "apr_dbd_%s.dll", name);
|
|
||||||
#else
|
|
||||||
sprintf(path, "apr_dbd_%s.so", name);
|
|
||||||
#endif
|
|
||||||
rv = apr_dso_load(&dlhandle, path, pool);
|
|
||||||
if (rv != APR_SUCCESS) { /* APR_EDSOOPEN */
|
|
||||||
goto unlock;
|
|
||||||
}
|
|
||||||
sprintf(path, "apr_dbd_%s_driver", name);
|
|
||||||
rv = apr_dso_sym((void*)driver, dlhandle, path);
|
|
||||||
if (rv != APR_SUCCESS) { /* APR_ESYMNOTFOUND */
|
|
||||||
apr_dso_unload(dlhandle);
|
|
||||||
goto unlock;
|
|
||||||
}
|
|
||||||
if ((*driver)->init) {
|
|
||||||
(*driver)->init(pool);
|
|
||||||
}
|
|
||||||
apr_hash_set(drivers, name, APR_HASH_KEY_STRING, *driver);
|
|
||||||
|
|
||||||
unlock:
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
apr_thread_mutex_unlock(mutex);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else /* APR_DSO_BUILD - so if it wasn't already loaded, it's NOTIMPL */
|
|
||||||
rv = APR_ENOTIMPL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
APU_DECLARE(apr_status_t) apr_dbd_open(const apr_dbd_driver_t *driver,
|
|
||||||
apr_pool_t *pool, const char *params,
|
|
||||||
apr_dbd_t **handle)
|
|
||||||
{
|
|
||||||
apr_status_t rv;
|
|
||||||
*handle = driver->open(pool, params);
|
|
||||||
if (*handle == NULL) {
|
|
||||||
return APR_EGENERAL;
|
|
||||||
}
|
|
||||||
rv = apr_dbd_check_conn(driver, pool, *handle);
|
|
||||||
if ((rv != APR_SUCCESS) && (rv != APR_ENOTIMPL)) {
|
|
||||||
apr_dbd_close(driver, *handle);
|
|
||||||
return APR_EGENERAL;
|
|
||||||
}
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
APU_DECLARE(int) apr_dbd_transaction_start(const apr_dbd_driver_t *driver,
|
|
||||||
apr_pool_t *pool, apr_dbd_t *handle,
|
|
||||||
apr_dbd_transaction_t **trans)
|
|
||||||
{
|
|
||||||
int ret = driver->start_transaction(pool, handle, trans);
|
|
||||||
if (*trans) {
|
|
||||||
apr_pool_cleanup_register(pool, *trans,
|
|
||||||
CLEANUP_CAST driver->end_transaction,
|
|
||||||
apr_pool_cleanup_null);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
APU_DECLARE(int) apr_dbd_transaction_end(const apr_dbd_driver_t *driver,
|
|
||||||
apr_pool_t *pool,
|
|
||||||
apr_dbd_transaction_t *trans)
|
|
||||||
{
|
|
||||||
apr_pool_cleanup_kill(pool, trans, CLEANUP_CAST driver->end_transaction);
|
|
||||||
return driver->end_transaction(trans);
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_dbd_close(const apr_dbd_driver_t *driver,
|
|
||||||
apr_dbd_t *handle)
|
|
||||||
{
|
|
||||||
return driver->close(handle);
|
|
||||||
}
|
|
||||||
APU_DECLARE(const char*) apr_dbd_name(const apr_dbd_driver_t *driver)
|
|
||||||
{
|
|
||||||
return driver->name;
|
|
||||||
}
|
|
||||||
APU_DECLARE(void*) apr_dbd_native_handle(const apr_dbd_driver_t *driver,
|
|
||||||
apr_dbd_t *handle)
|
|
||||||
{
|
|
||||||
return driver->native_handle(handle);
|
|
||||||
}
|
|
||||||
APU_DECLARE(int) apr_dbd_check_conn(const apr_dbd_driver_t *driver, apr_pool_t *pool,
|
|
||||||
apr_dbd_t *handle)
|
|
||||||
{
|
|
||||||
return driver->check_conn(pool, handle);
|
|
||||||
}
|
|
||||||
APU_DECLARE(int) apr_dbd_set_dbname(const apr_dbd_driver_t *driver, apr_pool_t *pool,
|
|
||||||
apr_dbd_t *handle, const char *name)
|
|
||||||
{
|
|
||||||
return driver->set_dbname(pool,handle,name);
|
|
||||||
}
|
|
||||||
APU_DECLARE(int) apr_dbd_query(const apr_dbd_driver_t *driver, apr_dbd_t *handle,
|
|
||||||
int *nrows, const char *statement)
|
|
||||||
{
|
|
||||||
return driver->query(handle,nrows,statement);
|
|
||||||
}
|
|
||||||
APU_DECLARE(int) apr_dbd_select(const apr_dbd_driver_t *driver, apr_pool_t *pool,
|
|
||||||
apr_dbd_t *handle, apr_dbd_results_t **res,
|
|
||||||
const char *statement, int random)
|
|
||||||
{
|
|
||||||
return driver->select(pool,handle,res,statement,random);
|
|
||||||
}
|
|
||||||
APU_DECLARE(int) apr_dbd_num_cols(const apr_dbd_driver_t *driver,
|
|
||||||
apr_dbd_results_t *res)
|
|
||||||
{
|
|
||||||
return driver->num_cols(res);
|
|
||||||
}
|
|
||||||
APU_DECLARE(int) apr_dbd_num_tuples(const apr_dbd_driver_t *driver,
|
|
||||||
apr_dbd_results_t *res)
|
|
||||||
{
|
|
||||||
return driver->num_tuples(res);
|
|
||||||
}
|
|
||||||
APU_DECLARE(int) apr_dbd_get_row(const apr_dbd_driver_t *driver, apr_pool_t *pool,
|
|
||||||
apr_dbd_results_t *res, apr_dbd_row_t **row,
|
|
||||||
int rownum)
|
|
||||||
{
|
|
||||||
return driver->get_row(pool,res,row,rownum);
|
|
||||||
}
|
|
||||||
APU_DECLARE(const char*) apr_dbd_get_entry(const apr_dbd_driver_t *driver,
|
|
||||||
apr_dbd_row_t *row, int col)
|
|
||||||
{
|
|
||||||
return driver->get_entry(row,col);
|
|
||||||
}
|
|
||||||
APU_DECLARE(const char*) apr_dbd_error(const apr_dbd_driver_t *driver,
|
|
||||||
apr_dbd_t *handle, int errnum)
|
|
||||||
{
|
|
||||||
return driver->error(handle,errnum);
|
|
||||||
}
|
|
||||||
APU_DECLARE(const char*) apr_dbd_escape(const apr_dbd_driver_t *driver,
|
|
||||||
apr_pool_t *pool, const char *string,
|
|
||||||
apr_dbd_t *handle)
|
|
||||||
{
|
|
||||||
return driver->escape(pool,string,handle);
|
|
||||||
}
|
|
||||||
APU_DECLARE(int) apr_dbd_prepare(const apr_dbd_driver_t *driver, apr_pool_t *pool,
|
|
||||||
apr_dbd_t *handle, const char *query,
|
|
||||||
const char *label,
|
|
||||||
apr_dbd_prepared_t **statement)
|
|
||||||
{
|
|
||||||
return driver->prepare(pool,handle,query,label,statement);
|
|
||||||
}
|
|
||||||
APU_DECLARE(int) apr_dbd_pquery(const apr_dbd_driver_t *driver, apr_pool_t *pool,
|
|
||||||
apr_dbd_t *handle, int *nrows,
|
|
||||||
apr_dbd_prepared_t *statement, int nargs,
|
|
||||||
const char **args)
|
|
||||||
{
|
|
||||||
return driver->pquery(pool,handle,nrows,statement,nargs,args);
|
|
||||||
}
|
|
||||||
APU_DECLARE(int) apr_dbd_pselect(const apr_dbd_driver_t *driver, apr_pool_t *pool,
|
|
||||||
apr_dbd_t *handle, apr_dbd_results_t **res,
|
|
||||||
apr_dbd_prepared_t *statement, int random,
|
|
||||||
int nargs, const char **args)
|
|
||||||
{
|
|
||||||
return driver->pselect(pool,handle,res,statement,random,nargs,args);
|
|
||||||
}
|
|
||||||
APU_DECLARE(int) apr_dbd_pvquery(const apr_dbd_driver_t *driver, apr_pool_t *pool,
|
|
||||||
apr_dbd_t *handle, int *nrows,
|
|
||||||
apr_dbd_prepared_t *statement,...)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
va_list args;
|
|
||||||
va_start(args, statement);
|
|
||||||
ret = driver->pvquery(pool,handle,nrows,statement,args);
|
|
||||||
va_end(args);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
APU_DECLARE(int) apr_dbd_pvselect(const apr_dbd_driver_t *driver, apr_pool_t *pool,
|
|
||||||
apr_dbd_t *handle, apr_dbd_results_t **res,
|
|
||||||
apr_dbd_prepared_t *statement, int random,...)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
va_list args;
|
|
||||||
va_start(args, random);
|
|
||||||
ret = driver->pvselect(pool,handle,res,statement,random,args);
|
|
||||||
va_end(args);
|
|
||||||
return ret;
|
|
||||||
}
|
|
|
@ -1,664 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apu.h"
|
|
||||||
|
|
||||||
#if APU_HAVE_PGSQL
|
|
||||||
|
|
||||||
#include "apu_config.h"
|
|
||||||
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#ifdef HAVE_LIBPQ_FE_H
|
|
||||||
#include <libpq-fe.h>
|
|
||||||
#elif defined(HAVE_POSTGRESQL_LIBPQ_FE_H)
|
|
||||||
#include <postgresql/libpq-fe.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "apr_strings.h"
|
|
||||||
#include "apr_time.h"
|
|
||||||
|
|
||||||
#include "apr_dbd_internal.h"
|
|
||||||
|
|
||||||
#define QUERY_MAX_ARGS 40
|
|
||||||
|
|
||||||
struct apr_dbd_transaction_t {
|
|
||||||
int errnum;
|
|
||||||
apr_dbd_t *handle;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct apr_dbd_t {
|
|
||||||
PGconn *conn;
|
|
||||||
apr_dbd_transaction_t *trans;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct apr_dbd_results_t {
|
|
||||||
int random;
|
|
||||||
PGconn *handle;
|
|
||||||
PGresult *res;
|
|
||||||
size_t ntuples;
|
|
||||||
size_t sz;
|
|
||||||
size_t index;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct apr_dbd_row_t {
|
|
||||||
int n;
|
|
||||||
apr_dbd_results_t *res;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct apr_dbd_prepared_t {
|
|
||||||
const char *name;
|
|
||||||
int prepared;
|
|
||||||
int nargs;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define dbd_pgsql_is_success(x) (((x) == PGRES_EMPTY_QUERY) \
|
|
||||||
|| ((x) == PGRES_COMMAND_OK) \
|
|
||||||
|| ((x) == PGRES_TUPLES_OK))
|
|
||||||
|
|
||||||
static apr_status_t clear_result(void *data)
|
|
||||||
{
|
|
||||||
PQclear(data);
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_pgsql_select(apr_pool_t *pool, apr_dbd_t *sql,
|
|
||||||
apr_dbd_results_t **results,
|
|
||||||
const char *query, int seek)
|
|
||||||
{
|
|
||||||
PGresult *res;
|
|
||||||
int ret;
|
|
||||||
if ( sql->trans && sql->trans->errnum ) {
|
|
||||||
return sql->trans->errnum;
|
|
||||||
}
|
|
||||||
if (seek) { /* synchronous query */
|
|
||||||
res = PQexec(sql->conn, query);
|
|
||||||
if (res) {
|
|
||||||
ret = PQresultStatus(res);
|
|
||||||
if (dbd_pgsql_is_success(ret)) {
|
|
||||||
ret = 0;
|
|
||||||
} else {
|
|
||||||
PQclear(res);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ret = PGRES_FATAL_ERROR;
|
|
||||||
}
|
|
||||||
if (ret != 0) {
|
|
||||||
if (sql->trans) {
|
|
||||||
sql->trans->errnum = ret;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
if (!*results) {
|
|
||||||
*results = apr_pcalloc(pool, sizeof(apr_dbd_results_t));
|
|
||||||
}
|
|
||||||
(*results)->res = res;
|
|
||||||
(*results)->ntuples = PQntuples(res);
|
|
||||||
(*results)->sz = PQnfields(res);
|
|
||||||
(*results)->random = seek;
|
|
||||||
apr_pool_cleanup_register(pool, res, clear_result,
|
|
||||||
apr_pool_cleanup_null);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (PQsendQuery(sql->conn, query) == 0) {
|
|
||||||
if (sql->trans) {
|
|
||||||
sql->trans->errnum = 1;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if (*results == NULL) {
|
|
||||||
*results = apr_pcalloc(pool, sizeof(apr_dbd_results_t));
|
|
||||||
}
|
|
||||||
(*results)->random = seek;
|
|
||||||
(*results)->handle = sql->conn;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_pgsql_get_row(apr_pool_t *pool, apr_dbd_results_t *res,
|
|
||||||
apr_dbd_row_t **rowp, int rownum)
|
|
||||||
{
|
|
||||||
apr_dbd_row_t *row = *rowp;
|
|
||||||
int sequential = ((rownum >= 0) && res->random) ? 0 : 1;
|
|
||||||
|
|
||||||
if (row == NULL) {
|
|
||||||
row = apr_palloc(pool, sizeof(apr_dbd_row_t));
|
|
||||||
*rowp = row;
|
|
||||||
row->res = res;
|
|
||||||
row->n = sequential ? 0 : rownum;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if ( sequential ) {
|
|
||||||
++row->n;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
row->n = rownum;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (res->random) {
|
|
||||||
if (row->n >= res->ntuples) {
|
|
||||||
*rowp = NULL;
|
|
||||||
apr_pool_cleanup_run(pool, res->res, clear_result);
|
|
||||||
res->res = NULL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (row->n >= res->ntuples) {
|
|
||||||
/* no data; we have to fetch some */
|
|
||||||
row->n -= res->ntuples;
|
|
||||||
if (res->res != NULL) {
|
|
||||||
PQclear(res->res);
|
|
||||||
}
|
|
||||||
res->res = PQgetResult(res->handle);
|
|
||||||
if (res->res) {
|
|
||||||
res->ntuples = PQntuples(res->res);
|
|
||||||
while (res->ntuples == 0) {
|
|
||||||
/* if we got an empty result, clear it, wait a mo, try
|
|
||||||
* again */
|
|
||||||
PQclear(res->res);
|
|
||||||
apr_sleep(100000); /* 0.1 secs */
|
|
||||||
res->res = PQgetResult(res->handle);
|
|
||||||
if (res->res) {
|
|
||||||
res->ntuples = PQntuples(res->res);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (res->sz == 0) {
|
|
||||||
res->sz = PQnfields(res->res);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char *dbd_pgsql_get_entry(const apr_dbd_row_t *row, int n)
|
|
||||||
{
|
|
||||||
return PQgetvalue(row->res->res, row->n, n);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char *dbd_pgsql_error(apr_dbd_t *sql, int n)
|
|
||||||
{
|
|
||||||
return PQerrorMessage(sql->conn);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_pgsql_query(apr_dbd_t *sql, int *nrows, const char *query)
|
|
||||||
{
|
|
||||||
PGresult *res;
|
|
||||||
int ret;
|
|
||||||
if (sql->trans && sql->trans->errnum) {
|
|
||||||
return sql->trans->errnum;
|
|
||||||
}
|
|
||||||
res = PQexec(sql->conn, query);
|
|
||||||
if (res) {
|
|
||||||
ret = PQresultStatus(res);
|
|
||||||
if (dbd_pgsql_is_success(ret)) {
|
|
||||||
/* ugh, making 0 return-success doesn't fit */
|
|
||||||
ret = 0;
|
|
||||||
}
|
|
||||||
*nrows = atoi(PQcmdTuples(res));
|
|
||||||
PQclear(res);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ret = PGRES_FATAL_ERROR;
|
|
||||||
}
|
|
||||||
if (sql->trans) {
|
|
||||||
sql->trans->errnum = ret;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char *dbd_pgsql_escape(apr_pool_t *pool, const char *arg,
|
|
||||||
apr_dbd_t *sql)
|
|
||||||
{
|
|
||||||
size_t len = strlen(arg);
|
|
||||||
char *ret = apr_palloc(pool, 2*(len + 1));
|
|
||||||
PQescapeString(ret, arg, len);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_pgsql_prepare(apr_pool_t *pool, apr_dbd_t *sql,
|
|
||||||
const char *query, const char *label,
|
|
||||||
apr_dbd_prepared_t **statement)
|
|
||||||
{
|
|
||||||
char *sqlcmd;
|
|
||||||
char *sqlptr;
|
|
||||||
size_t length;
|
|
||||||
size_t i = 0;
|
|
||||||
const char *args[QUERY_MAX_ARGS];
|
|
||||||
size_t alen;
|
|
||||||
int ret;
|
|
||||||
PGresult *res;
|
|
||||||
char *pgquery;
|
|
||||||
char *pgptr;
|
|
||||||
|
|
||||||
if (!*statement) {
|
|
||||||
*statement = apr_palloc(pool, sizeof(apr_dbd_prepared_t));
|
|
||||||
}
|
|
||||||
(*statement)->nargs = 0;
|
|
||||||
/* Translate from apr_dbd to native query format */
|
|
||||||
for (sqlptr = (char*)query; *sqlptr; ++sqlptr) {
|
|
||||||
if (sqlptr[0] == '%') {
|
|
||||||
if (isalpha(sqlptr[1])) {
|
|
||||||
++(*statement)->nargs;
|
|
||||||
}
|
|
||||||
else if (sqlptr[1] == '%') {
|
|
||||||
++sqlptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
length = strlen(query) + 1;
|
|
||||||
if ((*statement)->nargs > 8) {
|
|
||||||
length += (*statement)->nargs - 8;
|
|
||||||
}
|
|
||||||
pgptr = pgquery = apr_palloc(pool, length) ;
|
|
||||||
|
|
||||||
for (sqlptr = (char*)query; *sqlptr; ++sqlptr) {
|
|
||||||
if ((sqlptr[0] == '%') && isalpha(sqlptr[1])) {
|
|
||||||
*pgptr++ = '$';
|
|
||||||
if (i < 9) {
|
|
||||||
*pgptr++ = '1' + i;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
*pgptr++ = '0' + ((i+1)/10);
|
|
||||||
*pgptr++ = '0' + ((i+1)%10);
|
|
||||||
}
|
|
||||||
switch (*++sqlptr) {
|
|
||||||
case 'd':
|
|
||||||
args[i] = "integer";
|
|
||||||
break;
|
|
||||||
case 's':
|
|
||||||
args[i] = "varchar";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
args[i] = "varchar";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
length += 1 + strlen(args[i]);
|
|
||||||
++i;
|
|
||||||
}
|
|
||||||
else if ((sqlptr[0] == '%') && (sqlptr[1] == '%')) {
|
|
||||||
/* reduce %% to % */
|
|
||||||
*pgptr++ = *sqlptr++;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
*pgptr++ = *sqlptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*pgptr = 0;
|
|
||||||
|
|
||||||
if (!label) {
|
|
||||||
/* don't really prepare; use in execParams instead */
|
|
||||||
(*statement)->prepared = 0;
|
|
||||||
(*statement)->name = apr_pstrdup(pool, pgquery);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
(*statement)->name = apr_pstrdup(pool, label);
|
|
||||||
|
|
||||||
/* length of SQL query that prepares this statement */
|
|
||||||
length = 8 + strlen(label) + 2 + 4 + length + 1;
|
|
||||||
sqlcmd = apr_palloc(pool, length);
|
|
||||||
sqlptr = sqlcmd;
|
|
||||||
memcpy(sqlptr, "PREPARE ", 8);
|
|
||||||
sqlptr += 8;
|
|
||||||
length = strlen(label);
|
|
||||||
memcpy(sqlptr, label, length);
|
|
||||||
sqlptr += length;
|
|
||||||
if ((*statement)->nargs > 0) {
|
|
||||||
memcpy(sqlptr, " (",2);
|
|
||||||
sqlptr += 2;
|
|
||||||
for (i=0; i < (*statement)->nargs; ++i) {
|
|
||||||
alen = strlen(args[i]);
|
|
||||||
memcpy(sqlptr, args[i], alen);
|
|
||||||
sqlptr += alen;
|
|
||||||
*sqlptr++ = ',';
|
|
||||||
}
|
|
||||||
sqlptr[-1] = ')';
|
|
||||||
}
|
|
||||||
memcpy(sqlptr, " AS ", 4);
|
|
||||||
sqlptr += 4;
|
|
||||||
memcpy(sqlptr, pgquery, strlen(pgquery));
|
|
||||||
sqlptr += strlen(pgquery);
|
|
||||||
*sqlptr = 0;
|
|
||||||
|
|
||||||
res = PQexec(sql->conn, sqlcmd);
|
|
||||||
if ( res ) {
|
|
||||||
ret = PQresultStatus(res);
|
|
||||||
if (dbd_pgsql_is_success(ret)) {
|
|
||||||
ret = 0;
|
|
||||||
}
|
|
||||||
/* Hmmm, do we do this here or register it on the pool? */
|
|
||||||
PQclear(res);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ret = PGRES_FATAL_ERROR;
|
|
||||||
}
|
|
||||||
(*statement)->prepared = 1;
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_pgsql_pquery(apr_pool_t *pool, apr_dbd_t *sql,
|
|
||||||
int *nrows, apr_dbd_prepared_t *statement,
|
|
||||||
int nargs, const char **values)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
PGresult *res;
|
|
||||||
|
|
||||||
if (sql->trans && sql->trans->errnum) {
|
|
||||||
return sql->trans->errnum;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (statement->prepared) {
|
|
||||||
res = PQexecPrepared(sql->conn, statement->name, nargs, values, 0, 0,
|
|
||||||
0);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
res = PQexecParams(sql->conn, statement->name, nargs, 0, values, 0, 0,
|
|
||||||
0);
|
|
||||||
}
|
|
||||||
if (res) {
|
|
||||||
ret = PQresultStatus(res);
|
|
||||||
if (dbd_pgsql_is_success(ret)) {
|
|
||||||
ret = 0;
|
|
||||||
}
|
|
||||||
*nrows = atoi(PQcmdTuples(res));
|
|
||||||
PQclear(res);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ret = PGRES_FATAL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sql->trans) {
|
|
||||||
sql->trans->errnum = ret;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_pgsql_pvquery(apr_pool_t *pool, apr_dbd_t *sql,
|
|
||||||
int *nrows, apr_dbd_prepared_t *statement,
|
|
||||||
va_list args)
|
|
||||||
{
|
|
||||||
const char **values;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (sql->trans && sql->trans->errnum) {
|
|
||||||
return sql->trans->errnum;
|
|
||||||
}
|
|
||||||
|
|
||||||
values = apr_palloc(pool, sizeof(*values) * statement->nargs);
|
|
||||||
|
|
||||||
for (i = 0; i < statement->nargs; i++) {
|
|
||||||
values[i] = apr_pstrdup(pool, va_arg(args, const char*));
|
|
||||||
}
|
|
||||||
|
|
||||||
return dbd_pgsql_pquery(pool, sql, nrows, statement,
|
|
||||||
statement->nargs, values);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_pgsql_pselect(apr_pool_t *pool, apr_dbd_t *sql,
|
|
||||||
apr_dbd_results_t **results,
|
|
||||||
apr_dbd_prepared_t *statement,
|
|
||||||
int seek, int nargs, const char **values)
|
|
||||||
{
|
|
||||||
PGresult *res;
|
|
||||||
int rv;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
if (sql->trans && sql->trans->errnum) {
|
|
||||||
return sql->trans->errnum;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (seek) { /* synchronous query */
|
|
||||||
if (statement->prepared) {
|
|
||||||
res = PQexecPrepared(sql->conn, statement->name, nargs, values, 0,
|
|
||||||
0, 0);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
res = PQexecParams(sql->conn, statement->name, nargs, 0, values, 0,
|
|
||||||
0, 0);
|
|
||||||
}
|
|
||||||
if (res) {
|
|
||||||
ret = PQresultStatus(res);
|
|
||||||
if (dbd_pgsql_is_success(ret)) {
|
|
||||||
ret = 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
PQclear(res);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ret = PGRES_FATAL_ERROR;
|
|
||||||
}
|
|
||||||
if (ret != 0) {
|
|
||||||
if (sql->trans) {
|
|
||||||
sql->trans->errnum = ret;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
if (!*results) {
|
|
||||||
*results = apr_pcalloc(pool, sizeof(apr_dbd_results_t));
|
|
||||||
}
|
|
||||||
(*results)->res = res;
|
|
||||||
(*results)->ntuples = PQntuples(res);
|
|
||||||
(*results)->sz = PQnfields(res);
|
|
||||||
(*results)->random = seek;
|
|
||||||
apr_pool_cleanup_register(pool, res, clear_result,
|
|
||||||
apr_pool_cleanup_null);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (statement->prepared) {
|
|
||||||
rv = PQsendQueryPrepared(sql->conn, statement->name, nargs, values,
|
|
||||||
0, 0, 0);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
rv = PQsendQueryParams(sql->conn, statement->name, nargs, 0,
|
|
||||||
values, 0, 0, 0);
|
|
||||||
}
|
|
||||||
if (rv == 0) {
|
|
||||||
if (sql->trans) {
|
|
||||||
sql->trans->errnum = 1;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if (!*results) {
|
|
||||||
*results = apr_pcalloc(pool, sizeof(apr_dbd_results_t));
|
|
||||||
}
|
|
||||||
(*results)->random = seek;
|
|
||||||
(*results)->handle = sql->conn;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sql->trans) {
|
|
||||||
sql->trans->errnum = ret;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_pgsql_pvselect(apr_pool_t *pool, apr_dbd_t *sql,
|
|
||||||
apr_dbd_results_t **results,
|
|
||||||
apr_dbd_prepared_t *statement,
|
|
||||||
int seek, va_list args)
|
|
||||||
{
|
|
||||||
const char **values;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (sql->trans && sql->trans->errnum) {
|
|
||||||
return sql->trans->errnum;
|
|
||||||
}
|
|
||||||
|
|
||||||
values = apr_palloc(pool, sizeof(*values) * statement->nargs);
|
|
||||||
|
|
||||||
for (i = 0; i < statement->nargs; i++) {
|
|
||||||
values[i] = apr_pstrdup(pool, va_arg(args, const char*));
|
|
||||||
}
|
|
||||||
|
|
||||||
return dbd_pgsql_pselect(pool, sql, results, statement,
|
|
||||||
seek, statement->nargs, values) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_pgsql_start_transaction(apr_pool_t *pool, apr_dbd_t *handle,
|
|
||||||
apr_dbd_transaction_t **trans)
|
|
||||||
{
|
|
||||||
int ret = 0;
|
|
||||||
PGresult *res;
|
|
||||||
|
|
||||||
/* XXX handle recursive transactions here */
|
|
||||||
|
|
||||||
res = PQexec(handle->conn, "BEGIN TRANSACTION");
|
|
||||||
if (res) {
|
|
||||||
ret = PQresultStatus(res);
|
|
||||||
if (dbd_pgsql_is_success(ret)) {
|
|
||||||
ret = 0;
|
|
||||||
if (!*trans) {
|
|
||||||
*trans = apr_pcalloc(pool, sizeof(apr_dbd_transaction_t));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
PQclear(res);
|
|
||||||
(*trans)->handle = handle;
|
|
||||||
handle->trans = *trans;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ret = PGRES_FATAL_ERROR;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_pgsql_end_transaction(apr_dbd_transaction_t *trans)
|
|
||||||
{
|
|
||||||
PGresult *res;
|
|
||||||
int ret = -1; /* no transaction is an error cond */
|
|
||||||
if (trans) {
|
|
||||||
if (trans->errnum) {
|
|
||||||
trans->errnum = 0;
|
|
||||||
res = PQexec(trans->handle->conn, "ROLLBACK");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
res = PQexec(trans->handle->conn, "COMMIT");
|
|
||||||
}
|
|
||||||
if (res) {
|
|
||||||
ret = PQresultStatus(res);
|
|
||||||
if (dbd_pgsql_is_success(ret)) {
|
|
||||||
ret = 0;
|
|
||||||
}
|
|
||||||
PQclear(res);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ret = PGRES_FATAL_ERROR;
|
|
||||||
}
|
|
||||||
trans->handle->trans = NULL;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_dbd_t *dbd_pgsql_open(apr_pool_t *pool, const char *params)
|
|
||||||
{
|
|
||||||
apr_dbd_t *sql;
|
|
||||||
|
|
||||||
PGconn *conn = PQconnectdb(params);
|
|
||||||
|
|
||||||
/* if there's an error in the connect string or something we get
|
|
||||||
* back a * bogus connection object, and things like PQreset are
|
|
||||||
* liable to segfault, so just close it out now. it would be nice
|
|
||||||
* if we could give an indication of why we failed to connect... */
|
|
||||||
if (PQstatus(conn) != CONNECTION_OK) {
|
|
||||||
PQfinish(conn);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
sql = apr_pcalloc (pool, sizeof (*sql));
|
|
||||||
|
|
||||||
sql->conn = conn;
|
|
||||||
|
|
||||||
return sql;
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t dbd_pgsql_close(apr_dbd_t *handle)
|
|
||||||
{
|
|
||||||
PQfinish(handle->conn);
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t dbd_pgsql_check_conn(apr_pool_t *pool,
|
|
||||||
apr_dbd_t *handle)
|
|
||||||
{
|
|
||||||
if (PQstatus(handle->conn) != CONNECTION_OK) {
|
|
||||||
PQreset(handle->conn);
|
|
||||||
if (PQstatus(handle->conn) != CONNECTION_OK) {
|
|
||||||
return APR_EGENERAL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_pgsql_select_db(apr_pool_t *pool, apr_dbd_t *handle,
|
|
||||||
const char *name)
|
|
||||||
{
|
|
||||||
return APR_ENOTIMPL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void *dbd_pgsql_native(apr_dbd_t *handle)
|
|
||||||
{
|
|
||||||
return handle->conn;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_pgsql_num_cols(apr_dbd_results_t* res)
|
|
||||||
{
|
|
||||||
return res->sz;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_pgsql_num_tuples(apr_dbd_results_t* res)
|
|
||||||
{
|
|
||||||
if (res->random) {
|
|
||||||
return res->ntuples;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE_DATA const apr_dbd_driver_t apr_dbd_pgsql_driver = {
|
|
||||||
"pgsql",
|
|
||||||
NULL,
|
|
||||||
dbd_pgsql_native,
|
|
||||||
dbd_pgsql_open,
|
|
||||||
dbd_pgsql_check_conn,
|
|
||||||
dbd_pgsql_close,
|
|
||||||
dbd_pgsql_select_db,
|
|
||||||
dbd_pgsql_start_transaction,
|
|
||||||
dbd_pgsql_end_transaction,
|
|
||||||
dbd_pgsql_query,
|
|
||||||
dbd_pgsql_select,
|
|
||||||
dbd_pgsql_num_cols,
|
|
||||||
dbd_pgsql_num_tuples,
|
|
||||||
dbd_pgsql_get_row,
|
|
||||||
dbd_pgsql_get_entry,
|
|
||||||
dbd_pgsql_error,
|
|
||||||
dbd_pgsql_escape,
|
|
||||||
dbd_pgsql_prepare,
|
|
||||||
dbd_pgsql_pvquery,
|
|
||||||
dbd_pgsql_pvselect,
|
|
||||||
dbd_pgsql_pquery,
|
|
||||||
dbd_pgsql_pselect,
|
|
||||||
};
|
|
||||||
#endif
|
|
|
@ -1,396 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apu.h"
|
|
||||||
|
|
||||||
#if APU_HAVE_SQLITE2
|
|
||||||
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include <sqlite.h>
|
|
||||||
|
|
||||||
#include "apr_strings.h"
|
|
||||||
#include "apr_time.h"
|
|
||||||
|
|
||||||
#include "apr_dbd_internal.h"
|
|
||||||
|
|
||||||
struct apr_dbd_transaction_t {
|
|
||||||
int errnum;
|
|
||||||
apr_dbd_t *handle;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct apr_dbd_t {
|
|
||||||
sqlite *conn;
|
|
||||||
char *errmsg;
|
|
||||||
apr_dbd_transaction_t *trans;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct apr_dbd_results_t {
|
|
||||||
int random;
|
|
||||||
sqlite *handle;
|
|
||||||
char **res;
|
|
||||||
size_t ntuples;
|
|
||||||
size_t sz;
|
|
||||||
size_t index;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct apr_dbd_row_t {
|
|
||||||
int n;
|
|
||||||
char **data;
|
|
||||||
apr_dbd_results_t *res;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct apr_dbd_prepared_t {
|
|
||||||
const char *name;
|
|
||||||
int prepared;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define FREE_ERROR_MSG(dbd) \
|
|
||||||
do { \
|
|
||||||
if(dbd && dbd->errmsg) { \
|
|
||||||
free(dbd->errmsg); \
|
|
||||||
dbd->errmsg = NULL; \
|
|
||||||
} \
|
|
||||||
} while(0);
|
|
||||||
|
|
||||||
static apr_status_t free_table(void *data)
|
|
||||||
{
|
|
||||||
sqlite_free_table(data);
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_sqlite_select(apr_pool_t * pool, apr_dbd_t * sql,
|
|
||||||
apr_dbd_results_t ** results, const char *query,
|
|
||||||
int seek)
|
|
||||||
{
|
|
||||||
char **result;
|
|
||||||
int ret = 0;
|
|
||||||
int tuples = 0;
|
|
||||||
int fields = 0;
|
|
||||||
|
|
||||||
if (sql->trans && sql->trans->errnum) {
|
|
||||||
return sql->trans->errnum;
|
|
||||||
}
|
|
||||||
|
|
||||||
FREE_ERROR_MSG(sql);
|
|
||||||
|
|
||||||
ret = sqlite_get_table(sql->conn, query, &result, &tuples, &fields,
|
|
||||||
&sql->errmsg);
|
|
||||||
|
|
||||||
if (ret == SQLITE_OK) {
|
|
||||||
if (!*results) {
|
|
||||||
*results = apr_pcalloc(pool, sizeof(apr_dbd_results_t));
|
|
||||||
}
|
|
||||||
|
|
||||||
(*results)->res = result;
|
|
||||||
(*results)->ntuples = tuples;
|
|
||||||
(*results)->sz = fields;
|
|
||||||
(*results)->random = seek;
|
|
||||||
|
|
||||||
if (tuples > 0)
|
|
||||||
apr_pool_cleanup_register(pool, result, free_table,
|
|
||||||
apr_pool_cleanup_null);
|
|
||||||
|
|
||||||
ret = 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
sql->trans->errnum = ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_sqlite_get_row(apr_pool_t * pool, apr_dbd_results_t * res,
|
|
||||||
apr_dbd_row_t ** rowp, int rownum)
|
|
||||||
{
|
|
||||||
apr_dbd_row_t *row = *rowp;
|
|
||||||
int sequential = ((rownum >= 0) && res->random) ? 0 : 1;
|
|
||||||
|
|
||||||
if (row == NULL) {
|
|
||||||
row = apr_palloc(pool, sizeof(apr_dbd_row_t));
|
|
||||||
*rowp = row;
|
|
||||||
row->res = res;
|
|
||||||
row->n = sequential ? 0 : rownum - 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (sequential) {
|
|
||||||
++row->n;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
row->n = rownum - 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (row->n >= res->ntuples) {
|
|
||||||
*rowp = NULL;
|
|
||||||
apr_pool_cleanup_run(pool, res->res, free_table);
|
|
||||||
res->res = NULL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Pointer magic explanation:
|
|
||||||
* The sqlite result is an array such that the first res->sz elements are
|
|
||||||
* the column names and each tuple follows afterwards
|
|
||||||
* ex: (from the sqlite2 documentation)
|
|
||||||
SELECT employee_name, login, host FROM users WHERE login LIKE * 'd%';
|
|
||||||
|
|
||||||
nrow = 2
|
|
||||||
ncolumn = 3
|
|
||||||
result[0] = "employee_name"
|
|
||||||
result[1] = "login"
|
|
||||||
result[2] = "host"
|
|
||||||
result[3] = "dummy"
|
|
||||||
result[4] = "No such user"
|
|
||||||
result[5] = 0
|
|
||||||
result[6] = "D. Richard Hipp"
|
|
||||||
result[7] = "drh"
|
|
||||||
result[8] = "zadok"
|
|
||||||
*/
|
|
||||||
|
|
||||||
row->data = res->res + res->sz + (res->sz * row->n);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char *dbd_sqlite_get_entry(const apr_dbd_row_t * row, int n)
|
|
||||||
{
|
|
||||||
if ((n < 0) || (n >= row->res->sz)) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return row->data[n];
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char *dbd_sqlite_error(apr_dbd_t * sql, int n)
|
|
||||||
{
|
|
||||||
return sql->errmsg;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_sqlite_query(apr_dbd_t * sql, int *nrows, const char *query)
|
|
||||||
{
|
|
||||||
char **result;
|
|
||||||
int ret;
|
|
||||||
int tuples = 0;
|
|
||||||
int fields = 0;
|
|
||||||
|
|
||||||
if (sql->trans && sql->trans->errnum) {
|
|
||||||
return sql->trans->errnum;
|
|
||||||
}
|
|
||||||
|
|
||||||
FREE_ERROR_MSG(sql);
|
|
||||||
|
|
||||||
ret =
|
|
||||||
sqlite_get_table(sql->conn, query, &result, &tuples, &fields,
|
|
||||||
&sql->errmsg);
|
|
||||||
if (ret == SQLITE_OK) {
|
|
||||||
*nrows = sqlite_changes(sql->conn);
|
|
||||||
|
|
||||||
if (tuples > 0)
|
|
||||||
free(result);
|
|
||||||
|
|
||||||
ret = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sql->trans) {
|
|
||||||
sql->trans->errnum = ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t free_mem(void *data)
|
|
||||||
{
|
|
||||||
sqlite_freemem(data);
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char *dbd_sqlite_escape(apr_pool_t * pool, const char *arg,
|
|
||||||
apr_dbd_t * sql)
|
|
||||||
{
|
|
||||||
char *ret = sqlite_mprintf("%q", arg);
|
|
||||||
apr_pool_cleanup_register(pool, ret, free_mem, apr_pool_cleanup_null);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_sqlite_prepare(apr_pool_t * pool, apr_dbd_t * sql,
|
|
||||||
const char *query, const char *label,
|
|
||||||
apr_dbd_prepared_t ** statement)
|
|
||||||
{
|
|
||||||
return APR_ENOTIMPL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_sqlite_pquery(apr_pool_t * pool, apr_dbd_t * sql,
|
|
||||||
int *nrows, apr_dbd_prepared_t * statement,
|
|
||||||
int nargs, const char **values)
|
|
||||||
{
|
|
||||||
return APR_ENOTIMPL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_sqlite_pvquery(apr_pool_t * pool, apr_dbd_t * sql,
|
|
||||||
int *nrows, apr_dbd_prepared_t * statement,
|
|
||||||
va_list args)
|
|
||||||
{
|
|
||||||
return APR_ENOTIMPL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_sqlite_pselect(apr_pool_t * pool, apr_dbd_t * sql,
|
|
||||||
apr_dbd_results_t ** results,
|
|
||||||
apr_dbd_prepared_t * statement,
|
|
||||||
int seek, int nargs, const char **values)
|
|
||||||
{
|
|
||||||
return APR_ENOTIMPL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_sqlite_pvselect(apr_pool_t * pool, apr_dbd_t * sql,
|
|
||||||
apr_dbd_results_t ** results,
|
|
||||||
apr_dbd_prepared_t * statement, int seek,
|
|
||||||
va_list args)
|
|
||||||
{
|
|
||||||
return APR_ENOTIMPL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_sqlite_start_transaction(apr_pool_t * pool, apr_dbd_t * handle,
|
|
||||||
apr_dbd_transaction_t ** trans)
|
|
||||||
{
|
|
||||||
int ret, rows;
|
|
||||||
|
|
||||||
ret = dbd_sqlite_query(handle, &rows, "BEGIN TRANSACTION");
|
|
||||||
if (ret == 0) {
|
|
||||||
if (!*trans) {
|
|
||||||
*trans = apr_pcalloc(pool, sizeof(apr_dbd_transaction_t));
|
|
||||||
}
|
|
||||||
(*trans)->handle = handle;
|
|
||||||
handle->trans = *trans;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ret = -1;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_sqlite_end_transaction(apr_dbd_transaction_t * trans)
|
|
||||||
{
|
|
||||||
int rows;
|
|
||||||
int ret = -1; /* no transaction is an error cond */
|
|
||||||
|
|
||||||
if (trans) {
|
|
||||||
if (trans->errnum) {
|
|
||||||
trans->errnum = 0;
|
|
||||||
ret =
|
|
||||||
dbd_sqlite_query(trans->handle, &rows,
|
|
||||||
"ROLLBACK TRANSACTION");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ret =
|
|
||||||
dbd_sqlite_query(trans->handle, &rows, "COMMIT TRANSACTION");
|
|
||||||
}
|
|
||||||
trans->handle->trans = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_dbd_t *dbd_sqlite_open(apr_pool_t * pool, const char *params_)
|
|
||||||
{
|
|
||||||
apr_dbd_t *sql;
|
|
||||||
sqlite *conn = NULL;
|
|
||||||
char *perm;
|
|
||||||
int iperms = 600;
|
|
||||||
char* params = apr_pstrdup(pool, params_);
|
|
||||||
/* params = "[filename]:[permissions]"
|
|
||||||
* example: "shopping.db:600"
|
|
||||||
*/
|
|
||||||
|
|
||||||
perm = strstr(params, ":");
|
|
||||||
if (perm) {
|
|
||||||
*(perm++) = '\x00'; /* split the filename and permissions */
|
|
||||||
|
|
||||||
if (strlen(perm) > 0)
|
|
||||||
iperms = atoi(perm);
|
|
||||||
}
|
|
||||||
|
|
||||||
conn = sqlite_open(params, iperms, NULL);
|
|
||||||
|
|
||||||
sql = apr_pcalloc(pool, sizeof(*sql));
|
|
||||||
sql->conn = conn;
|
|
||||||
|
|
||||||
return sql;
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t dbd_sqlite_close(apr_dbd_t * handle)
|
|
||||||
{
|
|
||||||
if (handle->conn) {
|
|
||||||
sqlite_close(handle->conn);
|
|
||||||
handle->conn = NULL;
|
|
||||||
}
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t dbd_sqlite_check_conn(apr_pool_t * pool,
|
|
||||||
apr_dbd_t * handle)
|
|
||||||
{
|
|
||||||
if (handle->conn == NULL)
|
|
||||||
return -1;
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_sqlite_select_db(apr_pool_t * pool, apr_dbd_t * handle,
|
|
||||||
const char *name)
|
|
||||||
{
|
|
||||||
return APR_ENOTIMPL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void *dbd_sqlite_native(apr_dbd_t * handle)
|
|
||||||
{
|
|
||||||
return handle->conn;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_sqlite_num_cols(apr_dbd_results_t * res)
|
|
||||||
{
|
|
||||||
return res->sz;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_sqlite_num_tuples(apr_dbd_results_t * res)
|
|
||||||
{
|
|
||||||
return res->ntuples;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE_DATA const apr_dbd_driver_t apr_dbd_sqlite2_driver = {
|
|
||||||
"sqlite2",
|
|
||||||
NULL,
|
|
||||||
dbd_sqlite_native,
|
|
||||||
dbd_sqlite_open,
|
|
||||||
dbd_sqlite_check_conn,
|
|
||||||
dbd_sqlite_close,
|
|
||||||
dbd_sqlite_select_db,
|
|
||||||
dbd_sqlite_start_transaction,
|
|
||||||
dbd_sqlite_end_transaction,
|
|
||||||
dbd_sqlite_query,
|
|
||||||
dbd_sqlite_select,
|
|
||||||
dbd_sqlite_num_cols,
|
|
||||||
dbd_sqlite_num_tuples,
|
|
||||||
dbd_sqlite_get_row,
|
|
||||||
dbd_sqlite_get_entry,
|
|
||||||
dbd_sqlite_error,
|
|
||||||
dbd_sqlite_escape,
|
|
||||||
dbd_sqlite_prepare,
|
|
||||||
dbd_sqlite_pvquery,
|
|
||||||
dbd_sqlite_pvselect,
|
|
||||||
dbd_sqlite_pquery,
|
|
||||||
dbd_sqlite_pselect,
|
|
||||||
};
|
|
||||||
#endif
|
|
|
@ -1,723 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apu.h"
|
|
||||||
|
|
||||||
#if APU_HAVE_SQLITE3
|
|
||||||
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include <sqlite3.h>
|
|
||||||
|
|
||||||
#include "apr_strings.h"
|
|
||||||
#include "apr_time.h"
|
|
||||||
|
|
||||||
#include "apr_dbd_internal.h"
|
|
||||||
|
|
||||||
#define MAX_RETRY_COUNT 15
|
|
||||||
#define MAX_RETRY_SLEEP 100000
|
|
||||||
|
|
||||||
struct apr_dbd_transaction_t {
|
|
||||||
int errnum;
|
|
||||||
apr_dbd_t *handle;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct apr_dbd_t {
|
|
||||||
sqlite3 *conn;
|
|
||||||
apr_dbd_transaction_t *trans;
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
apr_thread_mutex_t *mutex;
|
|
||||||
#endif
|
|
||||||
apr_pool_t *pool;
|
|
||||||
apr_dbd_prepared_t *prep;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
char *name;
|
|
||||||
char *value;
|
|
||||||
int size;
|
|
||||||
int type;
|
|
||||||
} apr_dbd_column_t;
|
|
||||||
|
|
||||||
struct apr_dbd_row_t {
|
|
||||||
apr_dbd_results_t *res;
|
|
||||||
apr_dbd_column_t **columns;
|
|
||||||
apr_dbd_row_t *next_row;
|
|
||||||
int columnCount;
|
|
||||||
int rownum;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct apr_dbd_results_t {
|
|
||||||
int random;
|
|
||||||
sqlite3 *handle;
|
|
||||||
sqlite3_stmt *stmt;
|
|
||||||
apr_dbd_row_t *next_row;
|
|
||||||
size_t sz;
|
|
||||||
int tuples;
|
|
||||||
char **col_names;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct apr_dbd_prepared_t {
|
|
||||||
sqlite3_stmt *stmt;
|
|
||||||
apr_dbd_prepared_t *next;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define dbd_sqlite3_is_success(x) (((x) == SQLITE_DONE ) \
|
|
||||||
|| ((x) == SQLITE_OK ))
|
|
||||||
|
|
||||||
static int dbd_sqlite3_select(apr_pool_t * pool, apr_dbd_t * sql, apr_dbd_results_t ** results, const char *query, int seek)
|
|
||||||
{
|
|
||||||
sqlite3_stmt *stmt = NULL;
|
|
||||||
const char *tail = NULL;
|
|
||||||
int i, ret, retry_count = 0;
|
|
||||||
size_t num_tuples = 0;
|
|
||||||
int increment = 0;
|
|
||||||
apr_dbd_row_t *row = NULL;
|
|
||||||
apr_dbd_row_t *lastrow = NULL;
|
|
||||||
apr_dbd_column_t *column;
|
|
||||||
char *hold = NULL;
|
|
||||||
|
|
||||||
if (sql->trans && sql->trans->errnum) {
|
|
||||||
return sql->trans->errnum;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
apr_thread_mutex_lock(sql->mutex);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ret = sqlite3_prepare(sql->conn, query, strlen(query), &stmt, &tail);
|
|
||||||
if (!dbd_sqlite3_is_success(ret)) {
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
apr_thread_mutex_unlock(sql->mutex);
|
|
||||||
#endif
|
|
||||||
return ret;
|
|
||||||
} else {
|
|
||||||
int column_count;
|
|
||||||
column_count = sqlite3_column_count(stmt);
|
|
||||||
if (!*results) {
|
|
||||||
*results = apr_pcalloc(pool, sizeof(apr_dbd_results_t));
|
|
||||||
}
|
|
||||||
(*results)->stmt = stmt;
|
|
||||||
(*results)->sz = column_count;
|
|
||||||
(*results)->random = seek;
|
|
||||||
(*results)->next_row = 0;
|
|
||||||
(*results)->tuples = 0;
|
|
||||||
(*results)->col_names = apr_pcalloc(pool,
|
|
||||||
column_count * sizeof(char *));
|
|
||||||
do {
|
|
||||||
ret = sqlite3_step(stmt);
|
|
||||||
if (ret == SQLITE_BUSY) {
|
|
||||||
if (retry_count++ > MAX_RETRY_COUNT) {
|
|
||||||
ret = SQLITE_ERROR;
|
|
||||||
} else {
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
apr_thread_mutex_unlock(sql->mutex);
|
|
||||||
#endif
|
|
||||||
apr_sleep(MAX_RETRY_SLEEP);
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
apr_thread_mutex_lock(sql->mutex);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
} else if (ret == SQLITE_ROW) {
|
|
||||||
int length;
|
|
||||||
apr_dbd_column_t *col;
|
|
||||||
row = apr_palloc(pool, sizeof(apr_dbd_row_t));
|
|
||||||
row->res = *results;
|
|
||||||
increment = sizeof(apr_dbd_column_t *);
|
|
||||||
length = increment * (*results)->sz;
|
|
||||||
row->columns = apr_palloc(pool, length);
|
|
||||||
row->columnCount = column_count;
|
|
||||||
for (i = 0; i < (*results)->sz; i++) {
|
|
||||||
column = apr_palloc(pool, sizeof(apr_dbd_column_t));
|
|
||||||
row->columns[i] = column;
|
|
||||||
/* copy column name once only */
|
|
||||||
if ((*results)->col_names[i] == NULL) {
|
|
||||||
(*results)->col_names[i] =
|
|
||||||
apr_pstrdup(pool, sqlite3_column_name(stmt, i));
|
|
||||||
}
|
|
||||||
column->name = (*results)->col_names[i];
|
|
||||||
column->size = sqlite3_column_bytes(stmt, i);
|
|
||||||
column->type = sqlite3_column_type(stmt, i);
|
|
||||||
column->value = NULL;
|
|
||||||
switch (column->type) {
|
|
||||||
case SQLITE_FLOAT:
|
|
||||||
case SQLITE_INTEGER:
|
|
||||||
case SQLITE_TEXT:
|
|
||||||
hold = NULL;
|
|
||||||
hold = (char *) sqlite3_column_text(stmt, i);
|
|
||||||
if (hold) {
|
|
||||||
column->value = apr_palloc(pool, column->size + 1);
|
|
||||||
strncpy(column->value, hold, column->size + 1);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SQLITE_BLOB:
|
|
||||||
break;
|
|
||||||
case SQLITE_NULL:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
col = row->columns[i];
|
|
||||||
}
|
|
||||||
row->rownum = num_tuples++;
|
|
||||||
row->next_row = 0;
|
|
||||||
(*results)->tuples = num_tuples;
|
|
||||||
if ((*results)->next_row == 0) {
|
|
||||||
(*results)->next_row = row;
|
|
||||||
}
|
|
||||||
if (lastrow != 0) {
|
|
||||||
lastrow->next_row = row;
|
|
||||||
}
|
|
||||||
lastrow = row;
|
|
||||||
} else if (ret == SQLITE_DONE) {
|
|
||||||
ret = SQLITE_OK;
|
|
||||||
}
|
|
||||||
} while (ret == SQLITE_ROW || ret == SQLITE_BUSY);
|
|
||||||
}
|
|
||||||
ret = sqlite3_finalize(stmt);
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
apr_thread_mutex_unlock(sql->mutex);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (sql->trans) {
|
|
||||||
sql->trans->errnum = ret;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_sqlite3_get_row(apr_pool_t *pool, apr_dbd_results_t *res,
|
|
||||||
apr_dbd_row_t **rowp, int rownum)
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
if (rownum == -1) {
|
|
||||||
*rowp = res->next_row;
|
|
||||||
if (*rowp == 0)
|
|
||||||
return -1;
|
|
||||||
res->next_row = (*rowp)->next_row;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (rownum > res->tuples) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
rownum--;
|
|
||||||
*rowp = res->next_row;
|
|
||||||
for (; *rowp != 0; i++, *rowp = (*rowp)->next_row) {
|
|
||||||
if (i == rownum) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char *dbd_sqlite3_get_entry(const apr_dbd_row_t *row, int n)
|
|
||||||
{
|
|
||||||
apr_dbd_column_t *column;
|
|
||||||
const char *value;
|
|
||||||
if ((n < 0) || (n >= row->columnCount)) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
column = row->columns[n];
|
|
||||||
value = column->value;
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char *dbd_sqlite3_error(apr_dbd_t *sql, int n)
|
|
||||||
{
|
|
||||||
return sqlite3_errmsg(sql->conn);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_sqlite3_query(apr_dbd_t *sql, int *nrows, const char *query)
|
|
||||||
{
|
|
||||||
sqlite3_stmt *stmt = NULL;
|
|
||||||
const char *tail = NULL;
|
|
||||||
int ret = -1, length = 0;
|
|
||||||
|
|
||||||
if (sql->trans && sql->trans->errnum) {
|
|
||||||
return sql->trans->errnum;
|
|
||||||
}
|
|
||||||
|
|
||||||
length = strlen(query);
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
apr_thread_mutex_lock(sql->mutex);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
do {
|
|
||||||
int retry_count = 0;
|
|
||||||
|
|
||||||
ret = sqlite3_prepare(sql->conn, query, length, &stmt, &tail);
|
|
||||||
if (ret != SQLITE_OK) {
|
|
||||||
sqlite3_finalize(stmt);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
while(retry_count++ <= MAX_RETRY_COUNT) {
|
|
||||||
ret = sqlite3_step(stmt);
|
|
||||||
if (ret != SQLITE_BUSY)
|
|
||||||
break;
|
|
||||||
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
apr_thread_mutex_unlock(sql->mutex);
|
|
||||||
#endif
|
|
||||||
apr_sleep(MAX_RETRY_SLEEP);
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
apr_thread_mutex_lock(sql->mutex);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
*nrows = sqlite3_changes(sql->conn);
|
|
||||||
sqlite3_finalize(stmt);
|
|
||||||
length -= (tail - query);
|
|
||||||
query = tail;
|
|
||||||
} while (length > 0);
|
|
||||||
|
|
||||||
if (dbd_sqlite3_is_success(ret)) {
|
|
||||||
ret = 0;
|
|
||||||
}
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
apr_thread_mutex_unlock(sql->mutex);
|
|
||||||
#endif
|
|
||||||
if (sql->trans) {
|
|
||||||
sql->trans->errnum = ret;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t free_mem(void *data)
|
|
||||||
{
|
|
||||||
sqlite3_free(data);
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char *dbd_sqlite3_escape(apr_pool_t *pool, const char *arg,
|
|
||||||
apr_dbd_t *sql)
|
|
||||||
{
|
|
||||||
char *ret = sqlite3_mprintf("%q", arg);
|
|
||||||
apr_pool_cleanup_register(pool, ret, free_mem,
|
|
||||||
apr_pool_cleanup_null);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_sqlite3_prepare(apr_pool_t *pool, apr_dbd_t *sql,
|
|
||||||
const char *query, const char *label,
|
|
||||||
apr_dbd_prepared_t **statement)
|
|
||||||
{
|
|
||||||
sqlite3_stmt *stmt;
|
|
||||||
char *p, *slquery = apr_pstrdup(pool, query);
|
|
||||||
const char *tail = NULL, *q;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
for (p = slquery, q = query; *q; ++q) {
|
|
||||||
if (q[0] == '%') {
|
|
||||||
if (isalpha(q[1])) {
|
|
||||||
*p++ = '?';
|
|
||||||
++q;
|
|
||||||
}
|
|
||||||
else if (q[1] == '%') {
|
|
||||||
/* reduce %% to % */
|
|
||||||
*p++ = *q++;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
*p++ = *q;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
*p++ = *q;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*p = 0;
|
|
||||||
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
apr_thread_mutex_lock(sql->mutex);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ret = sqlite3_prepare(sql->conn, slquery, strlen(query), &stmt, &tail);
|
|
||||||
if (ret == SQLITE_OK) {
|
|
||||||
apr_dbd_prepared_t *prep;
|
|
||||||
|
|
||||||
prep = apr_pcalloc(sql->pool, sizeof(*prep));
|
|
||||||
prep->stmt = stmt;
|
|
||||||
prep->next = sql->prep;
|
|
||||||
|
|
||||||
/* link new statement to the handle */
|
|
||||||
sql->prep = prep;
|
|
||||||
|
|
||||||
*statement = prep;
|
|
||||||
} else {
|
|
||||||
sqlite3_finalize(stmt);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
apr_thread_mutex_unlock(sql->mutex);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_sqlite3_pquery(apr_pool_t *pool, apr_dbd_t *sql,
|
|
||||||
int *nrows, apr_dbd_prepared_t *statement,
|
|
||||||
int nargs, const char **values)
|
|
||||||
{
|
|
||||||
sqlite3_stmt *stmt = statement->stmt;
|
|
||||||
int ret = -1, retry_count = 0, i;
|
|
||||||
|
|
||||||
if (sql->trans && sql->trans->errnum) {
|
|
||||||
return sql->trans->errnum;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
apr_thread_mutex_lock(sql->mutex);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ret = sqlite3_reset(stmt);
|
|
||||||
if (ret == SQLITE_OK) {
|
|
||||||
for (i=0; i < nargs; i++) {
|
|
||||||
sqlite3_bind_text(stmt, i + 1, values[i], strlen(values[i]),
|
|
||||||
SQLITE_STATIC);
|
|
||||||
}
|
|
||||||
|
|
||||||
while(retry_count++ <= MAX_RETRY_COUNT) {
|
|
||||||
ret = sqlite3_step(stmt);
|
|
||||||
if (ret != SQLITE_BUSY)
|
|
||||||
break;
|
|
||||||
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
apr_thread_mutex_unlock(sql->mutex);
|
|
||||||
#endif
|
|
||||||
apr_sleep(MAX_RETRY_SLEEP);
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
apr_thread_mutex_lock(sql->mutex);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
*nrows = sqlite3_changes(sql->conn);
|
|
||||||
|
|
||||||
sqlite3_reset(stmt);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dbd_sqlite3_is_success(ret)) {
|
|
||||||
ret = 0;
|
|
||||||
}
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
apr_thread_mutex_unlock(sql->mutex);
|
|
||||||
#endif
|
|
||||||
if (sql->trans) {
|
|
||||||
sql->trans->errnum = ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_sqlite3_pvquery(apr_pool_t *pool, apr_dbd_t *sql, int *nrows,
|
|
||||||
apr_dbd_prepared_t *statement, va_list args)
|
|
||||||
{
|
|
||||||
const char **values;
|
|
||||||
int i, nargs;
|
|
||||||
|
|
||||||
if (sql->trans && sql->trans->errnum) {
|
|
||||||
return sql->trans->errnum;
|
|
||||||
}
|
|
||||||
|
|
||||||
nargs = sqlite3_bind_parameter_count(statement->stmt);
|
|
||||||
values = apr_palloc(pool, sizeof(*values) * nargs);
|
|
||||||
|
|
||||||
for (i = 0; i < nargs; i++) {
|
|
||||||
values[i] = apr_pstrdup(pool, va_arg(args, const char*));
|
|
||||||
}
|
|
||||||
|
|
||||||
return dbd_sqlite3_pquery(pool, sql, nrows, statement, nargs, values);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_sqlite3_pselect(apr_pool_t *pool, apr_dbd_t *sql,
|
|
||||||
apr_dbd_results_t **results,
|
|
||||||
apr_dbd_prepared_t *statement, int seek,
|
|
||||||
int nargs, const char **values)
|
|
||||||
{
|
|
||||||
sqlite3_stmt *stmt = statement->stmt;
|
|
||||||
int i, ret, retry_count = 0;
|
|
||||||
size_t num_tuples = 0;
|
|
||||||
int increment = 0;
|
|
||||||
apr_dbd_row_t *row = NULL;
|
|
||||||
apr_dbd_row_t *lastrow = NULL;
|
|
||||||
apr_dbd_column_t *column;
|
|
||||||
char *hold = NULL;
|
|
||||||
|
|
||||||
if (sql->trans && sql->trans->errnum) {
|
|
||||||
return sql->trans->errnum;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
apr_thread_mutex_lock(sql->mutex);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ret = sqlite3_reset(stmt);
|
|
||||||
if (ret == SQLITE_OK) {
|
|
||||||
int column_count;
|
|
||||||
|
|
||||||
for (i=0; i < nargs; i++) {
|
|
||||||
sqlite3_bind_text(stmt, i + 1, values[i], strlen(values[i]),
|
|
||||||
SQLITE_STATIC);
|
|
||||||
}
|
|
||||||
|
|
||||||
column_count = sqlite3_column_count(stmt);
|
|
||||||
if (!*results) {
|
|
||||||
*results = apr_pcalloc(pool, sizeof(apr_dbd_results_t));
|
|
||||||
}
|
|
||||||
(*results)->stmt = stmt;
|
|
||||||
(*results)->sz = column_count;
|
|
||||||
(*results)->random = seek;
|
|
||||||
(*results)->next_row = 0;
|
|
||||||
(*results)->tuples = 0;
|
|
||||||
(*results)->col_names = apr_pcalloc(pool,
|
|
||||||
column_count * sizeof(char *));
|
|
||||||
do {
|
|
||||||
ret = sqlite3_step(stmt);
|
|
||||||
if (ret == SQLITE_BUSY) {
|
|
||||||
if (retry_count++ > MAX_RETRY_COUNT) {
|
|
||||||
ret = SQLITE_ERROR;
|
|
||||||
} else {
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
apr_thread_mutex_unlock(sql->mutex);
|
|
||||||
#endif
|
|
||||||
apr_sleep(MAX_RETRY_SLEEP);
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
apr_thread_mutex_lock(sql->mutex);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
} else if (ret == SQLITE_ROW) {
|
|
||||||
int length;
|
|
||||||
apr_dbd_column_t *col;
|
|
||||||
row = apr_palloc(pool, sizeof(apr_dbd_row_t));
|
|
||||||
row->res = *results;
|
|
||||||
increment = sizeof(apr_dbd_column_t *);
|
|
||||||
length = increment * (*results)->sz;
|
|
||||||
row->columns = apr_palloc(pool, length);
|
|
||||||
row->columnCount = column_count;
|
|
||||||
for (i = 0; i < (*results)->sz; i++) {
|
|
||||||
column = apr_palloc(pool, sizeof(apr_dbd_column_t));
|
|
||||||
row->columns[i] = column;
|
|
||||||
/* copy column name once only */
|
|
||||||
if ((*results)->col_names[i] == NULL) {
|
|
||||||
(*results)->col_names[i] =
|
|
||||||
apr_pstrdup(pool, sqlite3_column_name(stmt, i));
|
|
||||||
}
|
|
||||||
column->name = (*results)->col_names[i];
|
|
||||||
column->size = sqlite3_column_bytes(stmt, i);
|
|
||||||
column->type = sqlite3_column_type(stmt, i);
|
|
||||||
column->value = NULL;
|
|
||||||
switch (column->type) {
|
|
||||||
case SQLITE_FLOAT:
|
|
||||||
case SQLITE_INTEGER:
|
|
||||||
case SQLITE_TEXT:
|
|
||||||
hold = NULL;
|
|
||||||
hold = (char *) sqlite3_column_text(stmt, i);
|
|
||||||
if (hold) {
|
|
||||||
column->value = apr_palloc(pool, column->size + 1);
|
|
||||||
strncpy(column->value, hold, column->size + 1);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SQLITE_BLOB:
|
|
||||||
break;
|
|
||||||
case SQLITE_NULL:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
col = row->columns[i];
|
|
||||||
}
|
|
||||||
row->rownum = num_tuples++;
|
|
||||||
row->next_row = 0;
|
|
||||||
(*results)->tuples = num_tuples;
|
|
||||||
if ((*results)->next_row == 0) {
|
|
||||||
(*results)->next_row = row;
|
|
||||||
}
|
|
||||||
if (lastrow != 0) {
|
|
||||||
lastrow->next_row = row;
|
|
||||||
}
|
|
||||||
lastrow = row;
|
|
||||||
} else if (ret == SQLITE_DONE) {
|
|
||||||
ret = SQLITE_OK;
|
|
||||||
}
|
|
||||||
} while (ret == SQLITE_ROW || ret == SQLITE_BUSY);
|
|
||||||
|
|
||||||
sqlite3_reset(stmt);
|
|
||||||
}
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
apr_thread_mutex_unlock(sql->mutex);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (sql->trans) {
|
|
||||||
sql->trans->errnum = ret;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_sqlite3_pvselect(apr_pool_t *pool, apr_dbd_t *sql,
|
|
||||||
apr_dbd_results_t **results,
|
|
||||||
apr_dbd_prepared_t *statement, int seek,
|
|
||||||
va_list args)
|
|
||||||
{
|
|
||||||
const char **values;
|
|
||||||
int i, nargs;
|
|
||||||
|
|
||||||
if (sql->trans && sql->trans->errnum) {
|
|
||||||
return sql->trans->errnum;
|
|
||||||
}
|
|
||||||
|
|
||||||
nargs = sqlite3_bind_parameter_count(statement->stmt);
|
|
||||||
values = apr_palloc(pool, sizeof(*values) * nargs);
|
|
||||||
|
|
||||||
for (i = 0; i < nargs; i++) {
|
|
||||||
values[i] = apr_pstrdup(pool, va_arg(args, const char*));
|
|
||||||
}
|
|
||||||
|
|
||||||
return dbd_sqlite3_pselect(pool, sql, results, statement,
|
|
||||||
seek, nargs, values);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_sqlite3_start_transaction(apr_pool_t *pool,
|
|
||||||
apr_dbd_t *handle,
|
|
||||||
apr_dbd_transaction_t **trans)
|
|
||||||
{
|
|
||||||
int ret = 0;
|
|
||||||
int nrows = 0;
|
|
||||||
|
|
||||||
ret = dbd_sqlite3_query(handle, &nrows, "BEGIN");
|
|
||||||
if (!*trans) {
|
|
||||||
*trans = apr_pcalloc(pool, sizeof(apr_dbd_transaction_t));
|
|
||||||
(*trans)->handle = handle;
|
|
||||||
handle->trans = *trans;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_sqlite3_end_transaction(apr_dbd_transaction_t *trans)
|
|
||||||
{
|
|
||||||
int ret = -1; /* ending transaction that was never started is an error */
|
|
||||||
int nrows = 0;
|
|
||||||
|
|
||||||
if (trans) {
|
|
||||||
if (trans->errnum) {
|
|
||||||
trans->errnum = 0;
|
|
||||||
ret = dbd_sqlite3_query(trans->handle, &nrows, "ROLLBACK");
|
|
||||||
} else {
|
|
||||||
ret = dbd_sqlite3_query(trans->handle, &nrows, "COMMIT");
|
|
||||||
}
|
|
||||||
trans->handle->trans = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_dbd_t *dbd_sqlite3_open(apr_pool_t *pool, const char *params)
|
|
||||||
{
|
|
||||||
apr_dbd_t *sql = NULL;
|
|
||||||
sqlite3 *conn = NULL;
|
|
||||||
apr_status_t res;
|
|
||||||
int sqlres;
|
|
||||||
if (!params)
|
|
||||||
return NULL;
|
|
||||||
sqlres = sqlite3_open(params, &conn);
|
|
||||||
if (sqlres != SQLITE_OK) {
|
|
||||||
sqlite3_close(conn);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
/* should we register rand or power functions to the sqlite VM? */
|
|
||||||
sql = apr_pcalloc(pool, sizeof(*sql));
|
|
||||||
sql->conn = conn;
|
|
||||||
sql->pool = pool;
|
|
||||||
sql->trans = NULL;
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
/* Create a mutex */
|
|
||||||
res = apr_thread_mutex_create(&sql->mutex, APR_THREAD_MUTEX_DEFAULT,
|
|
||||||
pool);
|
|
||||||
if (res != APR_SUCCESS) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return sql;
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t dbd_sqlite3_close(apr_dbd_t *handle)
|
|
||||||
{
|
|
||||||
apr_dbd_prepared_t *prep = handle->prep;
|
|
||||||
|
|
||||||
/* finalize all prepared statements, or we'll get SQLITE_BUSY on close */
|
|
||||||
while (prep) {
|
|
||||||
sqlite3_finalize(prep->stmt);
|
|
||||||
prep = prep->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
sqlite3_close(handle->conn);
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
apr_thread_mutex_destroy(handle->mutex);
|
|
||||||
#endif
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t dbd_sqlite3_check_conn(apr_pool_t *pool,
|
|
||||||
apr_dbd_t *handle)
|
|
||||||
{
|
|
||||||
return (handle->conn != NULL) ? APR_SUCCESS : APR_EGENERAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_sqlite3_select_db(apr_pool_t *pool, apr_dbd_t *handle,
|
|
||||||
const char *name)
|
|
||||||
{
|
|
||||||
return APR_ENOTIMPL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void *dbd_sqlite3_native(apr_dbd_t *handle)
|
|
||||||
{
|
|
||||||
return handle->conn;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_sqlite3_num_cols(apr_dbd_results_t *res)
|
|
||||||
{
|
|
||||||
return res->sz;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dbd_sqlite3_num_tuples(apr_dbd_results_t *res)
|
|
||||||
{
|
|
||||||
return res->tuples;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE_DATA const apr_dbd_driver_t apr_dbd_sqlite3_driver = {
|
|
||||||
"sqlite3",
|
|
||||||
NULL,
|
|
||||||
dbd_sqlite3_native,
|
|
||||||
dbd_sqlite3_open,
|
|
||||||
dbd_sqlite3_check_conn,
|
|
||||||
dbd_sqlite3_close,
|
|
||||||
dbd_sqlite3_select_db,
|
|
||||||
dbd_sqlite3_start_transaction,
|
|
||||||
dbd_sqlite3_end_transaction,
|
|
||||||
dbd_sqlite3_query,
|
|
||||||
dbd_sqlite3_select,
|
|
||||||
dbd_sqlite3_num_cols,
|
|
||||||
dbd_sqlite3_num_tuples,
|
|
||||||
dbd_sqlite3_get_row,
|
|
||||||
dbd_sqlite3_get_entry,
|
|
||||||
dbd_sqlite3_error,
|
|
||||||
dbd_sqlite3_escape,
|
|
||||||
dbd_sqlite3_prepare,
|
|
||||||
dbd_sqlite3_pvquery,
|
|
||||||
dbd_sqlite3_pvselect,
|
|
||||||
dbd_sqlite3_pquery,
|
|
||||||
dbd_sqlite3_pselect,
|
|
||||||
};
|
|
||||||
#endif
|
|
|
@ -1,207 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apr.h"
|
|
||||||
#include "apr_errno.h"
|
|
||||||
#include "apr_pools.h"
|
|
||||||
#include "apr_strings.h"
|
|
||||||
#define APR_WANT_MEMFUNC
|
|
||||||
#define APR_WANT_STRFUNC
|
|
||||||
#include "apr_want.h"
|
|
||||||
#include "apr_general.h"
|
|
||||||
|
|
||||||
#include "apu.h"
|
|
||||||
#include "apu_select_dbm.h"
|
|
||||||
#include "apr_dbm.h"
|
|
||||||
#include "apr_dbm_private.h"
|
|
||||||
|
|
||||||
/* ### note: the setting of DBM_VTABLE will go away once we have multiple
|
|
||||||
### DBMs in here.
|
|
||||||
### Well, that day is here. So, do we remove DBM_VTABLE and the old
|
|
||||||
### API entirely? Oh, what to do. We need an APU_DEFAULT_DBM #define.
|
|
||||||
### Sounds like a job for autoconf. */
|
|
||||||
|
|
||||||
#if APU_USE_SDBM
|
|
||||||
#define DBM_VTABLE apr_dbm_type_sdbm
|
|
||||||
#elif APU_USE_GDBM
|
|
||||||
#define DBM_VTABLE apr_dbm_type_gdbm
|
|
||||||
#elif APU_USE_DB
|
|
||||||
#define DBM_VTABLE apr_dbm_type_db
|
|
||||||
#elif APU_USE_NDBM
|
|
||||||
#define DBM_VTABLE apr_dbm_type_ndbm
|
|
||||||
#else /* Not in the USE_xDBM list above */
|
|
||||||
#error a DBM implementation was not specified
|
|
||||||
#endif
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_dbm_open_ex(apr_dbm_t **pdb, const char*type,
|
|
||||||
const char *pathname,
|
|
||||||
apr_int32_t mode, apr_fileperms_t perm,
|
|
||||||
apr_pool_t *pool)
|
|
||||||
{
|
|
||||||
#if APU_HAVE_GDBM
|
|
||||||
if (!strcasecmp(type, "GDBM")) {
|
|
||||||
return (*apr_dbm_type_gdbm.open)(pdb, pathname, mode, perm, pool);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if APU_HAVE_SDBM
|
|
||||||
if (!strcasecmp(type, "SDBM")) {
|
|
||||||
return (*apr_dbm_type_sdbm.open)(pdb, pathname, mode, perm, pool);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if APU_HAVE_DB
|
|
||||||
if (!strcasecmp(type, "DB")) {
|
|
||||||
return (*apr_dbm_type_db.open)(pdb, pathname, mode, perm, pool);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if APU_HAVE_NDBM
|
|
||||||
if (!strcasecmp(type, "NDBM")) {
|
|
||||||
return (*apr_dbm_type_ndbm.open)(pdb, pathname, mode, perm, pool);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!strcasecmp(type, "default")) {
|
|
||||||
return (*DBM_VTABLE.open)(pdb, pathname, mode, perm, pool);
|
|
||||||
}
|
|
||||||
|
|
||||||
return APR_ENOTIMPL;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_dbm_open(apr_dbm_t **pdb, const char *pathname,
|
|
||||||
apr_int32_t mode, apr_fileperms_t perm,
|
|
||||||
apr_pool_t *pool)
|
|
||||||
{
|
|
||||||
return (*DBM_VTABLE.open)(pdb, pathname, mode, perm, pool);
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(void) apr_dbm_close(apr_dbm_t *dbm)
|
|
||||||
{
|
|
||||||
(*dbm->type->close)(dbm);
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_dbm_fetch(apr_dbm_t *dbm, apr_datum_t key,
|
|
||||||
apr_datum_t *pvalue)
|
|
||||||
{
|
|
||||||
return (*dbm->type->fetch)(dbm, key, pvalue);
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_dbm_store(apr_dbm_t *dbm, apr_datum_t key,
|
|
||||||
apr_datum_t value)
|
|
||||||
{
|
|
||||||
return (*dbm->type->store)(dbm, key, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_dbm_delete(apr_dbm_t *dbm, apr_datum_t key)
|
|
||||||
{
|
|
||||||
return (*dbm->type->del)(dbm, key);
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(int) apr_dbm_exists(apr_dbm_t *dbm, apr_datum_t key)
|
|
||||||
{
|
|
||||||
return (*dbm->type->exists)(dbm, key);
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_dbm_firstkey(apr_dbm_t *dbm, apr_datum_t *pkey)
|
|
||||||
{
|
|
||||||
return (*dbm->type->firstkey)(dbm, pkey);
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_dbm_nextkey(apr_dbm_t *dbm, apr_datum_t *pkey)
|
|
||||||
{
|
|
||||||
return (*dbm->type->nextkey)(dbm, pkey);
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(void) apr_dbm_freedatum(apr_dbm_t *dbm, apr_datum_t data)
|
|
||||||
{
|
|
||||||
(*dbm->type->freedatum)(dbm, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(char *) apr_dbm_geterror(apr_dbm_t *dbm, int *errcode,
|
|
||||||
char *errbuf, apr_size_t errbufsize)
|
|
||||||
{
|
|
||||||
if (errcode != NULL)
|
|
||||||
*errcode = dbm->errcode;
|
|
||||||
|
|
||||||
/* assert: errbufsize > 0 */
|
|
||||||
|
|
||||||
if (dbm->errmsg == NULL)
|
|
||||||
*errbuf = '\0';
|
|
||||||
else
|
|
||||||
(void) apr_cpystrn(errbuf, dbm->errmsg, errbufsize);
|
|
||||||
return errbuf;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_dbm_get_usednames_ex(apr_pool_t *p,
|
|
||||||
const char *type,
|
|
||||||
const char *pathname,
|
|
||||||
const char **used1,
|
|
||||||
const char **used2)
|
|
||||||
{
|
|
||||||
#if APU_HAVE_GDBM
|
|
||||||
if (!strcasecmp(type, "GDBM")) {
|
|
||||||
(*apr_dbm_type_gdbm.getusednames)(p,pathname,used1,used2);
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if APU_HAVE_SDBM
|
|
||||||
if (!strcasecmp(type, "SDBM")) {
|
|
||||||
(*apr_dbm_type_sdbm.getusednames)(p,pathname,used1,used2);
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if APU_HAVE_DB
|
|
||||||
if (!strcasecmp(type, "DB")) {
|
|
||||||
(*apr_dbm_type_db.getusednames)(p,pathname,used1,used2);
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if APU_HAVE_NDBM
|
|
||||||
if (!strcasecmp(type, "NDBM")) {
|
|
||||||
(*apr_dbm_type_ndbm.getusednames)(p,pathname,used1,used2);
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!strcasecmp(type, "default")) {
|
|
||||||
(*DBM_VTABLE.getusednames)(p, pathname, used1, used2);
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
return APR_ENOTIMPL;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(void) apr_dbm_get_usednames(apr_pool_t *p,
|
|
||||||
const char *pathname,
|
|
||||||
const char **used1,
|
|
||||||
const char **used2)
|
|
||||||
{
|
|
||||||
/* ### one day, a DBM type name will be passed and we'll need to look it
|
|
||||||
### up. for now, it is constant. */
|
|
||||||
|
|
||||||
(*DBM_VTABLE.getusednames)(p, pathname, used1, used2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Most DBM libraries take a POSIX mode for creating files. Don't trust
|
|
||||||
* the mode_t type, some platforms may not support it, int is safe.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_posix_perms2mode(apr_fileperms_t perm)
|
|
||||||
{
|
|
||||||
int mode = 0;
|
|
||||||
|
|
||||||
mode |= 0700 & (perm >> 2); /* User is off-by-2 bits */
|
|
||||||
mode |= 0070 & (perm >> 1); /* Group is off-by-1 bit */
|
|
||||||
mode |= 0007 & (perm); /* World maps 1 for 1 */
|
|
||||||
return mode;
|
|
||||||
}
|
|
|
@ -1,403 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apr_strings.h"
|
|
||||||
#define APR_WANT_MEMFUNC
|
|
||||||
#include "apr_want.h"
|
|
||||||
|
|
||||||
#define APU_WANT_DB
|
|
||||||
#include "apu_want.h"
|
|
||||||
|
|
||||||
#if APR_HAVE_STDLIB_H
|
|
||||||
#include <stdlib.h> /* for abort() */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "apu.h"
|
|
||||||
|
|
||||||
#if APU_HAVE_DB
|
|
||||||
#include "apr_dbm_private.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We pick up all varieties of Berkeley DB through db.h (included through
|
|
||||||
* apu_select_dbm.h). This code has been compiled/tested against DB1,
|
|
||||||
* DB_185, DB2, DB3, and DB4.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined(DB_VERSION_MAJOR) && (DB_VERSION_MAJOR == 4)
|
|
||||||
/* We will treat anything greater than 4.1 as DB4.
|
|
||||||
* We can treat 4.0 as DB3.
|
|
||||||
*/
|
|
||||||
#if defined(DB_VERSION_MINOR) && (DB_VERSION_MINOR >= 1)
|
|
||||||
#define DB_VER 4
|
|
||||||
#else
|
|
||||||
#define DB_VER 3
|
|
||||||
#endif
|
|
||||||
#elif defined(DB_VERSION_MAJOR) && (DB_VERSION_MAJOR == 3)
|
|
||||||
#define DB_VER 3
|
|
||||||
#elif defined(DB_VERSION_MAJOR) && (DB_VERSION_MAJOR == 2)
|
|
||||||
#define DB_VER 2
|
|
||||||
#else
|
|
||||||
#define DB_VER 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
DB *bdb;
|
|
||||||
#if DB_VER != 1
|
|
||||||
DBC *curs;
|
|
||||||
#endif
|
|
||||||
} real_file_t;
|
|
||||||
|
|
||||||
|
|
||||||
#if DB_VER == 1
|
|
||||||
#define TXN_ARG
|
|
||||||
#else
|
|
||||||
#define TXN_ARG NULL,
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define GET_BDB(f) (((real_file_t *)(f))->bdb)
|
|
||||||
|
|
||||||
#define do_fetch(bdb, k, v) ((*(bdb)->get)(bdb, TXN_ARG &(k), &(v), 0))
|
|
||||||
|
|
||||||
#if DB_VER == 1
|
|
||||||
#include <sys/fcntl.h>
|
|
||||||
#define APR_DBM_DBMODE_RO O_RDONLY
|
|
||||||
#define APR_DBM_DBMODE_RW O_RDWR
|
|
||||||
#define APR_DBM_DBMODE_RWCREATE (O_CREAT | O_RDWR)
|
|
||||||
#define APR_DBM_DBMODE_RWTRUNC (O_CREAT | O_RDWR | O_TRUNC)
|
|
||||||
#else
|
|
||||||
#define APR_DBM_DBMODE_RO DB_RDONLY
|
|
||||||
#define APR_DBM_DBMODE_RW 0
|
|
||||||
#define APR_DBM_DBMODE_RWCREATE DB_CREATE
|
|
||||||
#define APR_DBM_DBMODE_RWTRUNC DB_TRUNCATE
|
|
||||||
#endif /* DBVER == 1 */
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------
|
|
||||||
**
|
|
||||||
** UTILITY FUNCTIONS
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* map a DB error to an apr_status_t */
|
|
||||||
static apr_status_t db2s(int dberr)
|
|
||||||
{
|
|
||||||
if (dberr != 0) {
|
|
||||||
/* ### need to fix this */
|
|
||||||
return APR_OS_START_USEERR + dberr;
|
|
||||||
}
|
|
||||||
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static apr_status_t set_error(apr_dbm_t *dbm, apr_status_t dbm_said)
|
|
||||||
{
|
|
||||||
apr_status_t rv = APR_SUCCESS;
|
|
||||||
|
|
||||||
/* ### ignore whatever the DBM said (dbm_said); ask it explicitly */
|
|
||||||
|
|
||||||
if (dbm_said == APR_SUCCESS) {
|
|
||||||
dbm->errcode = 0;
|
|
||||||
dbm->errmsg = NULL;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* ### need to fix. dberr was tossed in db2s(). */
|
|
||||||
/* ### use db_strerror() */
|
|
||||||
dbm->errcode = dbm_said;
|
|
||||||
#if DB_VER == 1 || DB_VER == 2
|
|
||||||
dbm->errmsg = NULL;
|
|
||||||
#else
|
|
||||||
dbm->errmsg = db_strerror(dbm_said - APR_OS_START_USEERR);
|
|
||||||
#endif
|
|
||||||
rv = dbm_said;
|
|
||||||
}
|
|
||||||
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------
|
|
||||||
**
|
|
||||||
** DEFINE THE VTABLE FUNCTIONS FOR BERKELEY DB
|
|
||||||
**
|
|
||||||
** ### we may need three sets of these: db1, db2, db3
|
|
||||||
*/
|
|
||||||
|
|
||||||
static apr_status_t vt_db_open(apr_dbm_t **pdb, const char *pathname,
|
|
||||||
apr_int32_t mode, apr_fileperms_t perm,
|
|
||||||
apr_pool_t *pool)
|
|
||||||
{
|
|
||||||
real_file_t file;
|
|
||||||
int dbmode;
|
|
||||||
|
|
||||||
*pdb = NULL;
|
|
||||||
|
|
||||||
switch (mode) {
|
|
||||||
case APR_DBM_READONLY:
|
|
||||||
dbmode = APR_DBM_DBMODE_RO;
|
|
||||||
break;
|
|
||||||
case APR_DBM_READWRITE:
|
|
||||||
dbmode = APR_DBM_DBMODE_RW;
|
|
||||||
break;
|
|
||||||
case APR_DBM_RWCREATE:
|
|
||||||
dbmode = APR_DBM_DBMODE_RWCREATE;
|
|
||||||
break;
|
|
||||||
case APR_DBM_RWTRUNC:
|
|
||||||
dbmode = APR_DBM_DBMODE_RWTRUNC;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return APR_EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
int dberr;
|
|
||||||
|
|
||||||
#if DB_VER >= 3
|
|
||||||
if ((dberr = db_create(&file.bdb, NULL, 0)) == 0) {
|
|
||||||
if ((dberr = (*file.bdb->open)(file.bdb,
|
|
||||||
#if DB_VER == 4
|
|
||||||
NULL,
|
|
||||||
#endif
|
|
||||||
pathname, NULL,
|
|
||||||
DB_HASH, dbmode,
|
|
||||||
apr_posix_perms2mode(perm))) != 0) {
|
|
||||||
/* close the DB handler */
|
|
||||||
(void) (*file.bdb->close)(file.bdb, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
file.curs = NULL;
|
|
||||||
#elif DB_VER == 2
|
|
||||||
dberr = db_open(pathname, DB_HASH, dbmode, apr_posix_perms2mode(perm),
|
|
||||||
NULL, NULL, &file.bdb);
|
|
||||||
file.curs = NULL;
|
|
||||||
#else
|
|
||||||
file.bdb = dbopen(pathname, dbmode, apr_posix_perms2mode(perm),
|
|
||||||
DB_HASH, NULL);
|
|
||||||
if (file.bdb == NULL)
|
|
||||||
return APR_EGENERAL; /* ### need a better error */
|
|
||||||
dberr = 0;
|
|
||||||
#endif
|
|
||||||
if (dberr != 0)
|
|
||||||
return db2s(dberr);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* we have an open database... return it */
|
|
||||||
*pdb = apr_pcalloc(pool, sizeof(**pdb));
|
|
||||||
(*pdb)->pool = pool;
|
|
||||||
(*pdb)->type = &apr_dbm_type_db;
|
|
||||||
(*pdb)->file = apr_pmemdup(pool, &file, sizeof(file));
|
|
||||||
|
|
||||||
/* ### register a cleanup to close the DBM? */
|
|
||||||
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vt_db_close(apr_dbm_t *dbm)
|
|
||||||
{
|
|
||||||
(*GET_BDB(dbm->file)->close)(GET_BDB(dbm->file)
|
|
||||||
#if DB_VER != 1
|
|
||||||
, 0
|
|
||||||
#endif
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t vt_db_fetch(apr_dbm_t *dbm, apr_datum_t key,
|
|
||||||
apr_datum_t * pvalue)
|
|
||||||
{
|
|
||||||
DBT ckey = { 0 };
|
|
||||||
DBT rd = { 0 };
|
|
||||||
int dberr;
|
|
||||||
|
|
||||||
ckey.data = key.dptr;
|
|
||||||
ckey.size = key.dsize;
|
|
||||||
|
|
||||||
dberr = do_fetch(GET_BDB(dbm->file), ckey, rd);
|
|
||||||
|
|
||||||
/* "not found" is not an error. return zero'd value. */
|
|
||||||
if (dberr ==
|
|
||||||
#if DB_VER == 1
|
|
||||||
RET_SPECIAL
|
|
||||||
#else
|
|
||||||
DB_NOTFOUND
|
|
||||||
#endif
|
|
||||||
) {
|
|
||||||
memset(&rd, 0, sizeof(rd));
|
|
||||||
dberr = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
pvalue->dptr = rd.data;
|
|
||||||
pvalue->dsize = rd.size;
|
|
||||||
|
|
||||||
/* store the error info into DBM, and return a status code. Also, note
|
|
||||||
that *pvalue should have been cleared on error. */
|
|
||||||
return set_error(dbm, db2s(dberr));
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t vt_db_store(apr_dbm_t *dbm, apr_datum_t key,
|
|
||||||
apr_datum_t value)
|
|
||||||
{
|
|
||||||
apr_status_t rv;
|
|
||||||
DBT ckey = { 0 };
|
|
||||||
DBT cvalue = { 0 };
|
|
||||||
|
|
||||||
ckey.data = key.dptr;
|
|
||||||
ckey.size = key.dsize;
|
|
||||||
|
|
||||||
cvalue.data = value.dptr;
|
|
||||||
cvalue.size = value.dsize;
|
|
||||||
|
|
||||||
rv = db2s((*GET_BDB(dbm->file)->put)(GET_BDB(dbm->file),
|
|
||||||
TXN_ARG
|
|
||||||
&ckey,
|
|
||||||
&cvalue,
|
|
||||||
0));
|
|
||||||
|
|
||||||
/* store any error info into DBM, and return a status code. */
|
|
||||||
return set_error(dbm, rv);
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t vt_db_del(apr_dbm_t *dbm, apr_datum_t key)
|
|
||||||
{
|
|
||||||
apr_status_t rv;
|
|
||||||
DBT ckey = { 0 };
|
|
||||||
|
|
||||||
ckey.data = key.dptr;
|
|
||||||
ckey.size = key.dsize;
|
|
||||||
|
|
||||||
rv = db2s((*GET_BDB(dbm->file)->del)(GET_BDB(dbm->file),
|
|
||||||
TXN_ARG
|
|
||||||
&ckey,
|
|
||||||
0));
|
|
||||||
|
|
||||||
/* store any error info into DBM, and return a status code. */
|
|
||||||
return set_error(dbm, rv);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int vt_db_exists(apr_dbm_t *dbm, apr_datum_t key)
|
|
||||||
{
|
|
||||||
DBT ckey = { 0 }; /* converted key */
|
|
||||||
DBT data = { 0 };
|
|
||||||
int dberr;
|
|
||||||
|
|
||||||
ckey.data = key.dptr;
|
|
||||||
ckey.size = key.dsize;
|
|
||||||
|
|
||||||
dberr = do_fetch(GET_BDB(dbm->file), ckey, data);
|
|
||||||
|
|
||||||
/* note: the result data is "loaned" to us; we don't need to free it */
|
|
||||||
|
|
||||||
/* DB returns DB_NOTFOUND if it doesn't exist. but we want to say
|
|
||||||
that *any* error means it doesn't exist. */
|
|
||||||
return dberr == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t vt_db_firstkey(apr_dbm_t *dbm, apr_datum_t * pkey)
|
|
||||||
{
|
|
||||||
real_file_t *f = dbm->file;
|
|
||||||
DBT first = { 0 };
|
|
||||||
DBT data = { 0 };
|
|
||||||
int dberr;
|
|
||||||
|
|
||||||
#if DB_VER == 1
|
|
||||||
dberr = (*f->bdb->seq)(f->bdb, &first, &data, R_FIRST);
|
|
||||||
#else
|
|
||||||
if ((dberr = (*f->bdb->cursor)(f->bdb, NULL, &f->curs
|
|
||||||
#if DB_VER >= 3 || ((DB_VERSION_MAJOR == 2) && (DB_VERSION_MINOR > 5))
|
|
||||||
, 0
|
|
||||||
#endif
|
|
||||||
)) == 0) {
|
|
||||||
dberr = (*f->curs->c_get)(f->curs, &first, &data, DB_FIRST);
|
|
||||||
if (dberr == DB_NOTFOUND) {
|
|
||||||
memset(&first, 0, sizeof(first));
|
|
||||||
(*f->curs->c_close)(f->curs);
|
|
||||||
f->curs = NULL;
|
|
||||||
dberr = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
pkey->dptr = first.data;
|
|
||||||
pkey->dsize = first.size;
|
|
||||||
|
|
||||||
/* store any error info into DBM, and return a status code. */
|
|
||||||
return set_error(dbm, db2s(dberr));
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t vt_db_nextkey(apr_dbm_t *dbm, apr_datum_t * pkey)
|
|
||||||
{
|
|
||||||
real_file_t *f = dbm->file;
|
|
||||||
DBT ckey = { 0 };
|
|
||||||
DBT data = { 0 };
|
|
||||||
int dberr;
|
|
||||||
|
|
||||||
ckey.data = pkey->dptr;
|
|
||||||
ckey.size = pkey->dsize;
|
|
||||||
|
|
||||||
#if DB_VER == 1
|
|
||||||
dberr = (*f->bdb->seq)(f->bdb, &ckey, &data, R_NEXT);
|
|
||||||
if (dberr == RET_SPECIAL) {
|
|
||||||
dberr = 0;
|
|
||||||
ckey.data = NULL;
|
|
||||||
ckey.size = 0;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if (f->curs == NULL)
|
|
||||||
return APR_EINVAL;
|
|
||||||
|
|
||||||
dberr = (*f->curs->c_get)(f->curs, &ckey, &data, DB_NEXT);
|
|
||||||
if (dberr == DB_NOTFOUND) {
|
|
||||||
(*f->curs->c_close)(f->curs);
|
|
||||||
f->curs = NULL;
|
|
||||||
dberr = 0;
|
|
||||||
ckey.data = NULL;
|
|
||||||
ckey.size = 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
pkey->dptr = ckey.data;
|
|
||||||
pkey->dsize = ckey.size;
|
|
||||||
|
|
||||||
/* store any error info into DBM, and return a status code. */
|
|
||||||
/* ### or use db2s(dberr) instead of APR_SUCCESS? */
|
|
||||||
return set_error(dbm, APR_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vt_db_freedatum(apr_dbm_t *dbm, apr_datum_t data)
|
|
||||||
{
|
|
||||||
/* nothing to do */
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vt_db_usednames(apr_pool_t *pool, const char *pathname,
|
|
||||||
const char **used1, const char **used2)
|
|
||||||
{
|
|
||||||
*used1 = apr_pstrdup(pool, pathname);
|
|
||||||
*used2 = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
APU_DECLARE_DATA const apr_dbm_type_t apr_dbm_type_db = {
|
|
||||||
"db",
|
|
||||||
|
|
||||||
vt_db_open,
|
|
||||||
vt_db_close,
|
|
||||||
vt_db_fetch,
|
|
||||||
vt_db_store,
|
|
||||||
vt_db_del,
|
|
||||||
vt_db_exists,
|
|
||||||
vt_db_firstkey,
|
|
||||||
vt_db_nextkey,
|
|
||||||
vt_db_freedatum,
|
|
||||||
vt_db_usednames
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* APU_HAVE_DB */
|
|
|
@ -1,270 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apr_strings.h"
|
|
||||||
|
|
||||||
#if APR_HAVE_STDLIB_H
|
|
||||||
#include <stdlib.h> /* for free() */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "apu.h"
|
|
||||||
|
|
||||||
#if APU_HAVE_GDBM
|
|
||||||
#include "apr_dbm_private.h"
|
|
||||||
|
|
||||||
#include <gdbm.h>
|
|
||||||
|
|
||||||
/* this is used in a few places to define a noop "function". it is needed
|
|
||||||
to stop "no effect" warnings from GCC. */
|
|
||||||
#define NOOP_FUNCTION if (0) ; else
|
|
||||||
|
|
||||||
/* ### define defaults for now; these will go away in a while */
|
|
||||||
#define REGISTER_CLEANUP(dbm, pdatum) NOOP_FUNCTION
|
|
||||||
#define SET_FILE(pdb, f) ((pdb)->file = (f))
|
|
||||||
|
|
||||||
typedef GDBM_FILE real_file_t;
|
|
||||||
|
|
||||||
typedef datum *cvt_datum_t;
|
|
||||||
#define CONVERT_DATUM(cvt, pinput) ((cvt) = (datum *)(pinput))
|
|
||||||
|
|
||||||
typedef datum result_datum_t;
|
|
||||||
#define RETURN_DATUM(poutput, rd) (*(poutput) = *(apr_datum_t *)&(rd))
|
|
||||||
|
|
||||||
#define APR_DBM_CLOSE(f) gdbm_close(f)
|
|
||||||
#define APR_DBM_FETCH(f, k, v) ((v) = gdbm_fetch(f, *(k)), APR_SUCCESS)
|
|
||||||
#define APR_DBM_STORE(f, k, v) g2s(gdbm_store(f, *(k), *(v), GDBM_REPLACE))
|
|
||||||
#define APR_DBM_DELETE(f, k) g2s(gdbm_delete(f, *(k)))
|
|
||||||
#define APR_DBM_FIRSTKEY(f, k) ((k) = gdbm_firstkey(f), APR_SUCCESS)
|
|
||||||
#define APR_DBM_NEXTKEY(f, k, nk) ((nk) = gdbm_nextkey(f, *(k)), APR_SUCCESS)
|
|
||||||
#define APR_DBM_FREEDPTR(dptr) ((dptr) ? free(dptr) : 0)
|
|
||||||
|
|
||||||
#undef REGISTER_CLEANUP
|
|
||||||
#define REGISTER_CLEANUP(dbm, pdatum) \
|
|
||||||
if ((pdatum)->dptr) \
|
|
||||||
apr_pool_cleanup_register((dbm)->pool, (pdatum)->dptr, \
|
|
||||||
datum_cleanup, apr_pool_cleanup_null); \
|
|
||||||
else
|
|
||||||
|
|
||||||
#define APR_DBM_DBMODE_RO GDBM_READER
|
|
||||||
#define APR_DBM_DBMODE_RW GDBM_WRITER
|
|
||||||
#define APR_DBM_DBMODE_RWCREATE GDBM_WRCREAT
|
|
||||||
#define APR_DBM_DBMODE_RWTRUNC GDBM_NEWDB
|
|
||||||
|
|
||||||
/* map a GDBM error to an apr_status_t */
|
|
||||||
static apr_status_t g2s(int gerr)
|
|
||||||
{
|
|
||||||
if (gerr == -1) {
|
|
||||||
/* ### need to fix this */
|
|
||||||
return APR_EGENERAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t datum_cleanup(void *dptr)
|
|
||||||
{
|
|
||||||
if (dptr)
|
|
||||||
free(dptr);
|
|
||||||
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t set_error(apr_dbm_t *dbm, apr_status_t dbm_said)
|
|
||||||
{
|
|
||||||
apr_status_t rv = APR_SUCCESS;
|
|
||||||
|
|
||||||
/* ### ignore whatever the DBM said (dbm_said); ask it explicitly */
|
|
||||||
|
|
||||||
if ((dbm->errcode = gdbm_errno) == GDBM_NO_ERROR) {
|
|
||||||
dbm->errmsg = NULL;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
dbm->errmsg = gdbm_strerror(gdbm_errno);
|
|
||||||
rv = APR_EGENERAL; /* ### need something better */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* captured it. clear it now. */
|
|
||||||
gdbm_errno = GDBM_NO_ERROR;
|
|
||||||
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------
|
|
||||||
**
|
|
||||||
** DEFINE THE VTABLE FUNCTIONS FOR GDBM
|
|
||||||
*/
|
|
||||||
|
|
||||||
static apr_status_t vt_gdbm_open(apr_dbm_t **pdb, const char *pathname,
|
|
||||||
apr_int32_t mode, apr_fileperms_t perm,
|
|
||||||
apr_pool_t *pool)
|
|
||||||
{
|
|
||||||
real_file_t file;
|
|
||||||
int dbmode;
|
|
||||||
|
|
||||||
*pdb = NULL;
|
|
||||||
|
|
||||||
switch (mode) {
|
|
||||||
case APR_DBM_READONLY:
|
|
||||||
dbmode = APR_DBM_DBMODE_RO;
|
|
||||||
break;
|
|
||||||
case APR_DBM_READWRITE:
|
|
||||||
dbmode = APR_DBM_DBMODE_RW;
|
|
||||||
break;
|
|
||||||
case APR_DBM_RWCREATE:
|
|
||||||
dbmode = APR_DBM_DBMODE_RWCREATE;
|
|
||||||
break;
|
|
||||||
case APR_DBM_RWTRUNC:
|
|
||||||
dbmode = APR_DBM_DBMODE_RWTRUNC;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return APR_EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
/* Note: stupid cast to get rid of "const" on the pathname */
|
|
||||||
file = gdbm_open((char *) pathname, 0, dbmode,
|
|
||||||
apr_posix_perms2mode(perm), NULL);
|
|
||||||
if (file == NULL)
|
|
||||||
return APR_EGENERAL; /* ### need a better error */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* we have an open database... return it */
|
|
||||||
*pdb = apr_pcalloc(pool, sizeof(**pdb));
|
|
||||||
(*pdb)->pool = pool;
|
|
||||||
(*pdb)->type = &apr_dbm_type_gdbm;
|
|
||||||
SET_FILE(*pdb, file);
|
|
||||||
|
|
||||||
/* ### register a cleanup to close the DBM? */
|
|
||||||
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vt_gdbm_close(apr_dbm_t *dbm)
|
|
||||||
{
|
|
||||||
APR_DBM_CLOSE(dbm->file);
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t vt_gdbm_fetch(apr_dbm_t *dbm, apr_datum_t key,
|
|
||||||
apr_datum_t * pvalue)
|
|
||||||
{
|
|
||||||
apr_status_t rv;
|
|
||||||
cvt_datum_t ckey;
|
|
||||||
result_datum_t rd;
|
|
||||||
|
|
||||||
CONVERT_DATUM(ckey, &key);
|
|
||||||
rv = APR_DBM_FETCH(dbm->file, ckey, rd);
|
|
||||||
RETURN_DATUM(pvalue, rd);
|
|
||||||
|
|
||||||
REGISTER_CLEANUP(dbm, pvalue);
|
|
||||||
|
|
||||||
/* store the error info into DBM, and return a status code. Also, note
|
|
||||||
that *pvalue should have been cleared on error. */
|
|
||||||
return set_error(dbm, rv);
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t vt_gdbm_store(apr_dbm_t *dbm, apr_datum_t key,
|
|
||||||
apr_datum_t value)
|
|
||||||
{
|
|
||||||
apr_status_t rv;
|
|
||||||
cvt_datum_t ckey;
|
|
||||||
cvt_datum_t cvalue;
|
|
||||||
|
|
||||||
CONVERT_DATUM(ckey, &key);
|
|
||||||
CONVERT_DATUM(cvalue, &value);
|
|
||||||
rv = APR_DBM_STORE(dbm->file, ckey, cvalue);
|
|
||||||
|
|
||||||
/* store any error info into DBM, and return a status code. */
|
|
||||||
return set_error(dbm, rv);
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t vt_gdbm_del(apr_dbm_t *dbm, apr_datum_t key)
|
|
||||||
{
|
|
||||||
apr_status_t rv;
|
|
||||||
cvt_datum_t ckey;
|
|
||||||
|
|
||||||
CONVERT_DATUM(ckey, &key);
|
|
||||||
rv = APR_DBM_DELETE(dbm->file, ckey);
|
|
||||||
|
|
||||||
/* store any error info into DBM, and return a status code. */
|
|
||||||
return set_error(dbm, rv);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int vt_gdbm_exists(apr_dbm_t *dbm, apr_datum_t key)
|
|
||||||
{
|
|
||||||
datum *ckey = (datum *)&key;
|
|
||||||
|
|
||||||
return gdbm_exists(dbm->file, *ckey) != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t vt_gdbm_firstkey(apr_dbm_t *dbm, apr_datum_t * pkey)
|
|
||||||
{
|
|
||||||
apr_status_t rv;
|
|
||||||
result_datum_t rd;
|
|
||||||
|
|
||||||
rv = APR_DBM_FIRSTKEY(dbm->file, rd);
|
|
||||||
RETURN_DATUM(pkey, rd);
|
|
||||||
|
|
||||||
REGISTER_CLEANUP(dbm, pkey);
|
|
||||||
|
|
||||||
/* store any error info into DBM, and return a status code. */
|
|
||||||
return set_error(dbm, rv);
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t vt_gdbm_nextkey(apr_dbm_t *dbm, apr_datum_t * pkey)
|
|
||||||
{
|
|
||||||
apr_status_t rv;
|
|
||||||
cvt_datum_t ckey;
|
|
||||||
result_datum_t rd;
|
|
||||||
|
|
||||||
CONVERT_DATUM(ckey, pkey);
|
|
||||||
rv = APR_DBM_NEXTKEY(dbm->file, ckey, rd);
|
|
||||||
RETURN_DATUM(pkey, rd);
|
|
||||||
|
|
||||||
REGISTER_CLEANUP(dbm, pkey);
|
|
||||||
|
|
||||||
/* store any error info into DBM, and return a status code. */
|
|
||||||
return set_error(dbm, APR_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vt_gdbm_freedatum(apr_dbm_t *dbm, apr_datum_t data)
|
|
||||||
{
|
|
||||||
(void) apr_pool_cleanup_run(dbm->pool, data.dptr, datum_cleanup);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vt_gdbm_usednames(apr_pool_t *pool, const char *pathname,
|
|
||||||
const char **used1, const char **used2)
|
|
||||||
{
|
|
||||||
*used1 = apr_pstrdup(pool, pathname);
|
|
||||||
*used2 = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
APU_DECLARE_DATA const apr_dbm_type_t apr_dbm_type_gdbm = {
|
|
||||||
"gdbm",
|
|
||||||
|
|
||||||
vt_gdbm_open,
|
|
||||||
vt_gdbm_close,
|
|
||||||
vt_gdbm_fetch,
|
|
||||||
vt_gdbm_store,
|
|
||||||
vt_gdbm_del,
|
|
||||||
vt_gdbm_exists,
|
|
||||||
vt_gdbm_firstkey,
|
|
||||||
vt_gdbm_nextkey,
|
|
||||||
vt_gdbm_freedatum,
|
|
||||||
vt_gdbm_usednames
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* APU_HAVE_GDBM */
|
|
|
@ -1,227 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apr_strings.h"
|
|
||||||
|
|
||||||
#if APR_HAVE_STDLIB_H
|
|
||||||
#include <stdlib.h> /* for free() */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "apu.h"
|
|
||||||
|
|
||||||
#if APU_HAVE_NDBM
|
|
||||||
#include "apr_dbm_private.h"
|
|
||||||
|
|
||||||
#include <ndbm.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
|
|
||||||
/* this is used in a few places to define a noop "function". it is needed
|
|
||||||
to stop "no effect" warnings from GCC. */
|
|
||||||
#define NOOP_FUNCTION if (0) ; else
|
|
||||||
|
|
||||||
#define APR_DBM_DBMODE_RO O_RDONLY
|
|
||||||
#define APR_DBM_DBMODE_RW O_RDWR
|
|
||||||
#define APR_DBM_DBMODE_RWCREATE (O_RDWR|O_CREAT)
|
|
||||||
#define APR_DBM_DBMODE_RWTRUNC (O_RDWR|O_CREAT|O_TRUNC)
|
|
||||||
|
|
||||||
/* map a NDBM error to an apr_status_t */
|
|
||||||
static apr_status_t ndbm2s(int ndbmerr)
|
|
||||||
{
|
|
||||||
if (ndbmerr == -1) {
|
|
||||||
/* ### need to fix this */
|
|
||||||
return APR_EGENERAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t set_error(apr_dbm_t *dbm, apr_status_t dbm_said)
|
|
||||||
{
|
|
||||||
apr_status_t rv = APR_SUCCESS;
|
|
||||||
|
|
||||||
/* ### ignore whatever the DBM said (dbm_said); ask it explicitly */
|
|
||||||
|
|
||||||
dbm->errmsg = NULL;
|
|
||||||
if (dbm_error((DBM*)dbm->file)) {
|
|
||||||
dbm->errmsg = NULL;
|
|
||||||
rv = APR_EGENERAL; /* ### need something better */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* captured it. clear it now. */
|
|
||||||
dbm_clearerr((DBM*)dbm->file);
|
|
||||||
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------
|
|
||||||
**
|
|
||||||
** DEFINE THE VTABLE FUNCTIONS FOR NDBM
|
|
||||||
*/
|
|
||||||
|
|
||||||
static apr_status_t vt_ndbm_open(apr_dbm_t **pdb, const char *pathname,
|
|
||||||
apr_int32_t mode, apr_fileperms_t perm,
|
|
||||||
apr_pool_t *pool)
|
|
||||||
{
|
|
||||||
DBM *file;
|
|
||||||
int dbmode;
|
|
||||||
|
|
||||||
*pdb = NULL;
|
|
||||||
|
|
||||||
switch (mode) {
|
|
||||||
case APR_DBM_READONLY:
|
|
||||||
dbmode = APR_DBM_DBMODE_RO;
|
|
||||||
break;
|
|
||||||
case APR_DBM_READWRITE:
|
|
||||||
dbmode = APR_DBM_DBMODE_RW;
|
|
||||||
break;
|
|
||||||
case APR_DBM_RWCREATE:
|
|
||||||
dbmode = APR_DBM_DBMODE_RWCREATE;
|
|
||||||
break;
|
|
||||||
case APR_DBM_RWTRUNC:
|
|
||||||
dbmode = APR_DBM_DBMODE_RWTRUNC;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return APR_EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
file = dbm_open(pathname, dbmode, apr_posix_perms2mode(perm));
|
|
||||||
if (file == NULL)
|
|
||||||
return APR_EGENERAL; /* ### need a better error */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* we have an open database... return it */
|
|
||||||
*pdb = apr_pcalloc(pool, sizeof(**pdb));
|
|
||||||
(*pdb)->pool = pool;
|
|
||||||
(*pdb)->type = &apr_dbm_type_ndbm;
|
|
||||||
(*pdb)->file = file;
|
|
||||||
|
|
||||||
/* ### register a cleanup to close the DBM? */
|
|
||||||
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vt_ndbm_close(apr_dbm_t *dbm)
|
|
||||||
{
|
|
||||||
dbm_close(dbm->file);
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t vt_ndbm_fetch(apr_dbm_t *dbm, apr_datum_t key,
|
|
||||||
apr_datum_t * pvalue)
|
|
||||||
{
|
|
||||||
datum *ckey;
|
|
||||||
datum rd;
|
|
||||||
|
|
||||||
ckey = (datum*)&key;
|
|
||||||
rd = dbm_fetch(dbm->file, *ckey);
|
|
||||||
*pvalue = *(apr_datum_t*)&rd;
|
|
||||||
|
|
||||||
/* store the error info into DBM, and return a status code. Also, note
|
|
||||||
that *pvalue should have been cleared on error. */
|
|
||||||
return set_error(dbm, APR_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t vt_ndbm_store(apr_dbm_t *dbm, apr_datum_t key,
|
|
||||||
apr_datum_t value)
|
|
||||||
{
|
|
||||||
apr_status_t rv;
|
|
||||||
datum *ckey;
|
|
||||||
datum *cvalue;
|
|
||||||
|
|
||||||
ckey = (datum*)&key;
|
|
||||||
cvalue = (datum*)&value;
|
|
||||||
rv = ndbm2s( dbm_store( dbm->file, *ckey, *cvalue, DBM_REPLACE));
|
|
||||||
|
|
||||||
/* store any error info into DBM, and return a status code. */
|
|
||||||
return set_error(dbm, rv);
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t vt_ndbm_del(apr_dbm_t *dbm, apr_datum_t key)
|
|
||||||
{
|
|
||||||
apr_status_t rv;
|
|
||||||
datum *ckey;
|
|
||||||
|
|
||||||
ckey = (datum*)&key;
|
|
||||||
rv = ndbm2s( dbm_delete(dbm->file, *ckey));
|
|
||||||
|
|
||||||
/* store any error info into DBM, and return a status code. */
|
|
||||||
return set_error(dbm, rv);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int vt_ndbm_exists(apr_dbm_t *dbm, apr_datum_t key)
|
|
||||||
{
|
|
||||||
datum *ckey = (datum *)&key;
|
|
||||||
datum value;
|
|
||||||
|
|
||||||
value = dbm_fetch( dbm->file, *ckey);
|
|
||||||
|
|
||||||
return value.dptr != NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t vt_ndbm_firstkey(apr_dbm_t *dbm, apr_datum_t * pkey)
|
|
||||||
{
|
|
||||||
datum rd;
|
|
||||||
|
|
||||||
rd = dbm_firstkey(dbm->file);
|
|
||||||
*pkey = *(apr_datum_t*)&rd;
|
|
||||||
|
|
||||||
/* store any error info into DBM, and return a status code. */
|
|
||||||
return set_error(dbm, APR_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t vt_ndbm_nextkey(apr_dbm_t *dbm, apr_datum_t * pkey)
|
|
||||||
{
|
|
||||||
datum *ckey;
|
|
||||||
datum rd;
|
|
||||||
|
|
||||||
ckey = (datum*)pkey;
|
|
||||||
rd = dbm_nextkey(dbm->file);
|
|
||||||
*pkey = *(apr_datum_t*)&rd;
|
|
||||||
|
|
||||||
/* store any error info into DBM, and return a status code. */
|
|
||||||
return set_error(dbm, APR_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vt_ndbm_freedatum(apr_dbm_t *dbm, apr_datum_t data)
|
|
||||||
{
|
|
||||||
/* nothing to do */
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vt_ndbm_usednames(apr_pool_t *pool, const char *pathname,
|
|
||||||
const char **used1, const char **used2)
|
|
||||||
{
|
|
||||||
*used1 = apr_pstrdup(pool, pathname);
|
|
||||||
*used2 = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
APU_DECLARE_DATA const apr_dbm_type_t apr_dbm_type_ndbm = {
|
|
||||||
"ndbm",
|
|
||||||
|
|
||||||
vt_ndbm_open,
|
|
||||||
vt_ndbm_close,
|
|
||||||
vt_ndbm_fetch,
|
|
||||||
vt_ndbm_store,
|
|
||||||
vt_ndbm_del,
|
|
||||||
vt_ndbm_exists,
|
|
||||||
vt_ndbm_firstkey,
|
|
||||||
vt_ndbm_nextkey,
|
|
||||||
vt_ndbm_freedatum,
|
|
||||||
vt_ndbm_usednames
|
|
||||||
};
|
|
||||||
#endif /* APU_HAVE_NDBM */
|
|
|
@ -1,265 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apr_strings.h"
|
|
||||||
#define APR_WANT_MEMFUNC
|
|
||||||
#define APR_WANT_STRFUNC
|
|
||||||
#include "apr_want.h"
|
|
||||||
|
|
||||||
#include "apu.h"
|
|
||||||
|
|
||||||
#if APU_HAVE_SDBM
|
|
||||||
|
|
||||||
#include "apr_dbm_private.h"
|
|
||||||
|
|
||||||
#include "apr_sdbm.h"
|
|
||||||
#if APR_HAVE_STDLIB_H
|
|
||||||
#include <stdlib.h> /* For abort() */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* this is used in a few places to define a noop "function". it is needed
|
|
||||||
to stop "no effect" warnings from GCC. */
|
|
||||||
#define NOOP_FUNCTION if (0) ; else
|
|
||||||
|
|
||||||
/* ### define defaults for now; these will go away in a while */
|
|
||||||
#define REGISTER_CLEANUP(dbm, pdatum) NOOP_FUNCTION
|
|
||||||
#define SET_FILE(pdb, f) ((pdb)->file = (f))
|
|
||||||
|
|
||||||
typedef apr_sdbm_t *real_file_t;
|
|
||||||
|
|
||||||
typedef apr_sdbm_datum_t cvt_datum_t;
|
|
||||||
#define CONVERT_DATUM(cvt, pinput) ((cvt).dptr = (pinput)->dptr, (cvt).dsize = (pinput)->dsize)
|
|
||||||
|
|
||||||
typedef apr_sdbm_datum_t result_datum_t;
|
|
||||||
#define RETURN_DATUM(poutput, rd) ((poutput)->dptr = (rd).dptr, (poutput)->dsize = (rd).dsize)
|
|
||||||
|
|
||||||
#define APR_DBM_CLOSE(f) apr_sdbm_close(f)
|
|
||||||
#define APR_DBM_FETCH(f, k, v) apr_sdbm_fetch(f, &(v), (k))
|
|
||||||
#define APR_DBM_STORE(f, k, v) apr_sdbm_store(f, (k), (v), APR_SDBM_REPLACE)
|
|
||||||
#define APR_DBM_DELETE(f, k) apr_sdbm_delete(f, (k))
|
|
||||||
#define APR_DBM_FIRSTKEY(f, k) apr_sdbm_firstkey(f, &(k))
|
|
||||||
#define APR_DBM_NEXTKEY(f, k, nk) apr_sdbm_nextkey(f, &(nk))
|
|
||||||
#define APR_DBM_FREEDPTR(dptr) NOOP_FUNCTION
|
|
||||||
|
|
||||||
#define APR_DBM_DBMODE_RO APR_READ
|
|
||||||
#define APR_DBM_DBMODE_RW (APR_READ | APR_WRITE)
|
|
||||||
#define APR_DBM_DBMODE_RWCREATE (APR_READ | APR_WRITE | APR_CREATE)
|
|
||||||
#define APR_DBM_DBMODE_RWTRUNC (APR_READ | APR_WRITE | APR_CREATE | \
|
|
||||||
APR_TRUNCATE)
|
|
||||||
|
|
||||||
static apr_status_t set_error(apr_dbm_t *dbm, apr_status_t dbm_said)
|
|
||||||
{
|
|
||||||
apr_status_t rv = APR_SUCCESS;
|
|
||||||
|
|
||||||
/* ### ignore whatever the DBM said (dbm_said); ask it explicitly */
|
|
||||||
|
|
||||||
if ((dbm->errcode = dbm_said) == APR_SUCCESS) {
|
|
||||||
dbm->errmsg = NULL;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
dbm->errmsg = "I/O error occurred.";
|
|
||||||
rv = APR_EGENERAL; /* ### need something better */
|
|
||||||
}
|
|
||||||
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------
|
|
||||||
**
|
|
||||||
** DEFINE THE VTABLE FUNCTIONS FOR SDBM
|
|
||||||
*/
|
|
||||||
|
|
||||||
static apr_status_t vt_sdbm_open(apr_dbm_t **pdb, const char *pathname,
|
|
||||||
apr_int32_t mode, apr_fileperms_t perm,
|
|
||||||
apr_pool_t *pool)
|
|
||||||
{
|
|
||||||
real_file_t file;
|
|
||||||
int dbmode;
|
|
||||||
|
|
||||||
*pdb = NULL;
|
|
||||||
|
|
||||||
switch (mode) {
|
|
||||||
case APR_DBM_READONLY:
|
|
||||||
dbmode = APR_DBM_DBMODE_RO;
|
|
||||||
break;
|
|
||||||
case APR_DBM_READWRITE:
|
|
||||||
dbmode = APR_DBM_DBMODE_RW;
|
|
||||||
break;
|
|
||||||
case APR_DBM_RWCREATE:
|
|
||||||
dbmode = APR_DBM_DBMODE_RWCREATE;
|
|
||||||
break;
|
|
||||||
case APR_DBM_RWTRUNC:
|
|
||||||
dbmode = APR_DBM_DBMODE_RWTRUNC;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return APR_EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
apr_status_t rv;
|
|
||||||
|
|
||||||
rv = apr_sdbm_open(&file, pathname, dbmode, perm, pool);
|
|
||||||
if (rv != APR_SUCCESS)
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* we have an open database... return it */
|
|
||||||
*pdb = apr_pcalloc(pool, sizeof(**pdb));
|
|
||||||
(*pdb)->pool = pool;
|
|
||||||
(*pdb)->type = &apr_dbm_type_sdbm;
|
|
||||||
SET_FILE(*pdb, file);
|
|
||||||
|
|
||||||
/* ### register a cleanup to close the DBM? */
|
|
||||||
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vt_sdbm_close(apr_dbm_t *dbm)
|
|
||||||
{
|
|
||||||
APR_DBM_CLOSE(dbm->file);
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t vt_sdbm_fetch(apr_dbm_t *dbm, apr_datum_t key,
|
|
||||||
apr_datum_t * pvalue)
|
|
||||||
{
|
|
||||||
apr_status_t rv;
|
|
||||||
cvt_datum_t ckey;
|
|
||||||
result_datum_t rd;
|
|
||||||
|
|
||||||
CONVERT_DATUM(ckey, &key);
|
|
||||||
rv = APR_DBM_FETCH(dbm->file, ckey, rd);
|
|
||||||
RETURN_DATUM(pvalue, rd);
|
|
||||||
|
|
||||||
REGISTER_CLEANUP(dbm, pvalue);
|
|
||||||
|
|
||||||
/* store the error info into DBM, and return a status code. Also, note
|
|
||||||
that *pvalue should have been cleared on error. */
|
|
||||||
return set_error(dbm, rv);
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t vt_sdbm_store(apr_dbm_t *dbm, apr_datum_t key,
|
|
||||||
apr_datum_t value)
|
|
||||||
{
|
|
||||||
apr_status_t rv;
|
|
||||||
cvt_datum_t ckey;
|
|
||||||
cvt_datum_t cvalue;
|
|
||||||
|
|
||||||
CONVERT_DATUM(ckey, &key);
|
|
||||||
CONVERT_DATUM(cvalue, &value);
|
|
||||||
rv = APR_DBM_STORE(dbm->file, ckey, cvalue);
|
|
||||||
|
|
||||||
/* store any error info into DBM, and return a status code. */
|
|
||||||
return set_error(dbm, rv);
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t vt_sdbm_del(apr_dbm_t *dbm, apr_datum_t key)
|
|
||||||
{
|
|
||||||
apr_status_t rv;
|
|
||||||
cvt_datum_t ckey;
|
|
||||||
|
|
||||||
CONVERT_DATUM(ckey, &key);
|
|
||||||
rv = APR_DBM_DELETE(dbm->file, ckey);
|
|
||||||
|
|
||||||
/* store any error info into DBM, and return a status code. */
|
|
||||||
return set_error(dbm, rv);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int vt_sdbm_exists(apr_dbm_t *dbm, apr_datum_t key)
|
|
||||||
{
|
|
||||||
int exists;
|
|
||||||
apr_sdbm_datum_t ckey;
|
|
||||||
|
|
||||||
CONVERT_DATUM(ckey, &key);
|
|
||||||
|
|
||||||
{
|
|
||||||
apr_sdbm_datum_t value;
|
|
||||||
if (apr_sdbm_fetch(dbm->file, &value, ckey) != APR_SUCCESS) {
|
|
||||||
exists = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
exists = value.dptr != NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return exists;
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t vt_sdbm_firstkey(apr_dbm_t *dbm, apr_datum_t * pkey)
|
|
||||||
{
|
|
||||||
apr_status_t rv;
|
|
||||||
result_datum_t rd;
|
|
||||||
|
|
||||||
rv = APR_DBM_FIRSTKEY(dbm->file, rd);
|
|
||||||
RETURN_DATUM(pkey, rd);
|
|
||||||
|
|
||||||
REGISTER_CLEANUP(dbm, pkey);
|
|
||||||
|
|
||||||
/* store any error info into DBM, and return a status code. */
|
|
||||||
return set_error(dbm, rv);
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t vt_sdbm_nextkey(apr_dbm_t *dbm, apr_datum_t * pkey)
|
|
||||||
{
|
|
||||||
apr_status_t rv;
|
|
||||||
cvt_datum_t ckey;
|
|
||||||
result_datum_t rd;
|
|
||||||
|
|
||||||
CONVERT_DATUM(ckey, pkey);
|
|
||||||
rv = APR_DBM_NEXTKEY(dbm->file, ckey, rd);
|
|
||||||
RETURN_DATUM(pkey, rd);
|
|
||||||
|
|
||||||
REGISTER_CLEANUP(dbm, pkey);
|
|
||||||
|
|
||||||
/* store any error info into DBM, and return a status code. */
|
|
||||||
return set_error(dbm, APR_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vt_sdbm_freedatum(apr_dbm_t *dbm, apr_datum_t data)
|
|
||||||
{
|
|
||||||
APR_DBM_FREEDPTR(data.dptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vt_sdbm_usednames(apr_pool_t *pool, const char *pathname,
|
|
||||||
const char **used1, const char **used2)
|
|
||||||
{
|
|
||||||
char *work;
|
|
||||||
|
|
||||||
/* ### this could be optimized by computing strlen() once and using
|
|
||||||
### memcpy and pmemdup instead. but why bother? */
|
|
||||||
|
|
||||||
*used1 = apr_pstrcat(pool, pathname, APR_SDBM_DIRFEXT, NULL);
|
|
||||||
*used2 = work = apr_pstrdup(pool, *used1);
|
|
||||||
|
|
||||||
/* we know the extension is 4 characters */
|
|
||||||
memcpy(&work[strlen(work) - 4], APR_SDBM_PAGFEXT, 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
APU_DECLARE_DATA const apr_dbm_type_t apr_dbm_type_sdbm = {
|
|
||||||
"sdbm",
|
|
||||||
|
|
||||||
vt_sdbm_open,
|
|
||||||
vt_sdbm_close,
|
|
||||||
vt_sdbm_fetch,
|
|
||||||
vt_sdbm_store,
|
|
||||||
vt_sdbm_del,
|
|
||||||
vt_sdbm_exists,
|
|
||||||
vt_sdbm_firstkey,
|
|
||||||
vt_sdbm_nextkey,
|
|
||||||
vt_sdbm_freedatum,
|
|
||||||
vt_sdbm_usednames
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* APU_HAVE_SDBM */
|
|
|
@ -1,588 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* sdbm - ndbm work-alike hashed database library
|
|
||||||
* based on Per-Aake Larson's Dynamic Hashing algorithms. BIT 18 (1978).
|
|
||||||
* author: oz@nexus.yorku.ca
|
|
||||||
* ex-public domain, ported to APR for Apache 2
|
|
||||||
* core routines
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apr.h"
|
|
||||||
#include "apr_file_io.h"
|
|
||||||
#include "apr_strings.h"
|
|
||||||
#include "apr_errno.h"
|
|
||||||
#include "apr_sdbm.h"
|
|
||||||
|
|
||||||
#include "sdbm_tune.h"
|
|
||||||
#include "sdbm_pair.h"
|
|
||||||
#include "sdbm_private.h"
|
|
||||||
|
|
||||||
#include <string.h> /* for memset() */
|
|
||||||
#include <stdlib.h> /* for malloc() and free() */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* forward
|
|
||||||
*/
|
|
||||||
static int getdbit (apr_sdbm_t *, long);
|
|
||||||
static apr_status_t setdbit(apr_sdbm_t *, long);
|
|
||||||
static apr_status_t getpage(apr_sdbm_t *db, long);
|
|
||||||
static apr_status_t getnext(apr_sdbm_datum_t *key, apr_sdbm_t *db);
|
|
||||||
static apr_status_t makroom(apr_sdbm_t *, long, int);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* useful macros
|
|
||||||
*/
|
|
||||||
#define bad(x) ((x).dptr == NULL || (x).dsize <= 0)
|
|
||||||
#define exhash(item) sdbm_hash((item).dptr, (item).dsize)
|
|
||||||
|
|
||||||
/* ### Does anything need these externally? */
|
|
||||||
#define sdbm_dirfno(db) ((db)->dirf)
|
|
||||||
#define sdbm_pagfno(db) ((db)->pagf)
|
|
||||||
|
|
||||||
#define OFF_PAG(off) (apr_off_t) (off) * PBLKSIZ
|
|
||||||
#define OFF_DIR(off) (apr_off_t) (off) * DBLKSIZ
|
|
||||||
|
|
||||||
static long masks[] = {
|
|
||||||
000000000000, 000000000001, 000000000003, 000000000007,
|
|
||||||
000000000017, 000000000037, 000000000077, 000000000177,
|
|
||||||
000000000377, 000000000777, 000000001777, 000000003777,
|
|
||||||
000000007777, 000000017777, 000000037777, 000000077777,
|
|
||||||
000000177777, 000000377777, 000000777777, 000001777777,
|
|
||||||
000003777777, 000007777777, 000017777777, 000037777777,
|
|
||||||
000077777777, 000177777777, 000377777777, 000777777777,
|
|
||||||
001777777777, 003777777777, 007777777777, 017777777777
|
|
||||||
};
|
|
||||||
|
|
||||||
const apr_sdbm_datum_t sdbm_nullitem = { NULL, 0 };
|
|
||||||
|
|
||||||
static apr_status_t database_cleanup(void *data)
|
|
||||||
{
|
|
||||||
apr_sdbm_t *db = data;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Can't rely on apr_sdbm_unlock, since it will merely
|
|
||||||
* decrement the refcnt if several locks are held.
|
|
||||||
*/
|
|
||||||
if (db->flags & (SDBM_SHARED_LOCK | SDBM_EXCLUSIVE_LOCK))
|
|
||||||
(void) apr_file_unlock(db->dirf);
|
|
||||||
(void) apr_file_close(db->dirf);
|
|
||||||
(void) apr_file_close(db->pagf);
|
|
||||||
free(db);
|
|
||||||
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t prep(apr_sdbm_t **pdb, const char *dirname, const char *pagname,
|
|
||||||
apr_int32_t flags, apr_fileperms_t perms, apr_pool_t *p)
|
|
||||||
{
|
|
||||||
apr_sdbm_t *db;
|
|
||||||
apr_status_t status;
|
|
||||||
|
|
||||||
*pdb = NULL;
|
|
||||||
|
|
||||||
db = malloc(sizeof(*db));
|
|
||||||
memset(db, 0, sizeof(*db));
|
|
||||||
|
|
||||||
db->pool = p;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* adjust user flags so that WRONLY becomes RDWR,
|
|
||||||
* as required by this package. Also set our internal
|
|
||||||
* flag for RDONLY if needed.
|
|
||||||
*/
|
|
||||||
if (!(flags & APR_WRITE)) {
|
|
||||||
db->flags |= SDBM_RDONLY;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* adjust the file open flags so that we handle locking
|
|
||||||
* on our own (don't rely on any locking behavior within
|
|
||||||
* an apr_file_t, in case it's ever introduced, and set
|
|
||||||
* our own flag.
|
|
||||||
*/
|
|
||||||
if (flags & APR_SHARELOCK) {
|
|
||||||
db->flags |= SDBM_SHARED;
|
|
||||||
flags &= ~APR_SHARELOCK;
|
|
||||||
}
|
|
||||||
|
|
||||||
flags |= APR_BINARY | APR_READ;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* open the files in sequence, and stat the dirfile.
|
|
||||||
* If we fail anywhere, undo everything, return NULL.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ((status = apr_file_open(&db->dirf, dirname, flags, perms, p))
|
|
||||||
!= APR_SUCCESS)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if ((status = apr_file_open(&db->pagf, pagname, flags, perms, p))
|
|
||||||
!= APR_SUCCESS)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if ((status = apr_sdbm_lock(db, (db->flags & SDBM_RDONLY)
|
|
||||||
? APR_FLOCK_SHARED
|
|
||||||
: APR_FLOCK_EXCLUSIVE))
|
|
||||||
!= APR_SUCCESS)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
/* apr_pcalloc zeroed the buffers
|
|
||||||
* apr_sdbm_lock stated the dirf->size and invalidated the cache
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* if we are opened in SHARED mode, unlock ourself
|
|
||||||
*/
|
|
||||||
if (db->flags & SDBM_SHARED)
|
|
||||||
if ((status = apr_sdbm_unlock(db)) != APR_SUCCESS)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
/* make sure that we close the database at some point */
|
|
||||||
apr_pool_cleanup_register(p, db, database_cleanup, apr_pool_cleanup_null);
|
|
||||||
|
|
||||||
/* Done! */
|
|
||||||
*pdb = db;
|
|
||||||
return APR_SUCCESS;
|
|
||||||
|
|
||||||
error:
|
|
||||||
if (db->dirf && db->pagf)
|
|
||||||
(void) apr_sdbm_unlock(db);
|
|
||||||
if (db->dirf != NULL)
|
|
||||||
(void) apr_file_close(db->dirf);
|
|
||||||
if (db->pagf != NULL) {
|
|
||||||
(void) apr_file_close(db->pagf);
|
|
||||||
}
|
|
||||||
free(db);
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_sdbm_open(apr_sdbm_t **db, const char *file,
|
|
||||||
apr_int32_t flags,
|
|
||||||
apr_fileperms_t perms, apr_pool_t *p)
|
|
||||||
{
|
|
||||||
char *dirname = apr_pstrcat(p, file, APR_SDBM_DIRFEXT, NULL);
|
|
||||||
char *pagname = apr_pstrcat(p, file, APR_SDBM_PAGFEXT, NULL);
|
|
||||||
|
|
||||||
return prep(db, dirname, pagname, flags, perms, p);
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_sdbm_close(apr_sdbm_t *db)
|
|
||||||
{
|
|
||||||
return apr_pool_cleanup_run(db->pool, db, database_cleanup);
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_sdbm_fetch(apr_sdbm_t *db, apr_sdbm_datum_t *val,
|
|
||||||
apr_sdbm_datum_t key)
|
|
||||||
{
|
|
||||||
apr_status_t status;
|
|
||||||
|
|
||||||
if (db == NULL || bad(key))
|
|
||||||
return APR_EINVAL;
|
|
||||||
|
|
||||||
if ((status = apr_sdbm_lock(db, APR_FLOCK_SHARED)) != APR_SUCCESS)
|
|
||||||
return status;
|
|
||||||
|
|
||||||
if ((status = getpage(db, exhash(key))) == APR_SUCCESS) {
|
|
||||||
*val = getpair(db->pagbuf, key);
|
|
||||||
/* ### do we want a not-found result? */
|
|
||||||
}
|
|
||||||
|
|
||||||
(void) apr_sdbm_unlock(db);
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t write_page(apr_sdbm_t *db, const char *buf, long pagno)
|
|
||||||
{
|
|
||||||
apr_status_t status;
|
|
||||||
apr_off_t off = OFF_PAG(pagno);
|
|
||||||
|
|
||||||
if ((status = apr_file_seek(db->pagf, APR_SET, &off)) == APR_SUCCESS)
|
|
||||||
status = apr_file_write_full(db->pagf, buf, PBLKSIZ, NULL);
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_sdbm_delete(apr_sdbm_t *db,
|
|
||||||
const apr_sdbm_datum_t key)
|
|
||||||
{
|
|
||||||
apr_status_t status;
|
|
||||||
|
|
||||||
if (db == NULL || bad(key))
|
|
||||||
return APR_EINVAL;
|
|
||||||
if (apr_sdbm_rdonly(db))
|
|
||||||
return APR_EINVAL;
|
|
||||||
|
|
||||||
if ((status = apr_sdbm_lock(db, APR_FLOCK_EXCLUSIVE)) != APR_SUCCESS)
|
|
||||||
return status;
|
|
||||||
|
|
||||||
if ((status = getpage(db, exhash(key))) == APR_SUCCESS) {
|
|
||||||
if (!delpair(db->pagbuf, key))
|
|
||||||
/* ### should we define some APRUTIL codes? */
|
|
||||||
status = APR_EGENERAL;
|
|
||||||
else
|
|
||||||
status = write_page(db, db->pagbuf, db->pagbno);
|
|
||||||
}
|
|
||||||
|
|
||||||
(void) apr_sdbm_unlock(db);
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_sdbm_store(apr_sdbm_t *db, apr_sdbm_datum_t key,
|
|
||||||
apr_sdbm_datum_t val, int flags)
|
|
||||||
{
|
|
||||||
int need;
|
|
||||||
register long hash;
|
|
||||||
apr_status_t status;
|
|
||||||
|
|
||||||
if (db == NULL || bad(key))
|
|
||||||
return APR_EINVAL;
|
|
||||||
if (apr_sdbm_rdonly(db))
|
|
||||||
return APR_EINVAL;
|
|
||||||
need = key.dsize + val.dsize;
|
|
||||||
/*
|
|
||||||
* is the pair too big (or too small) for this database ??
|
|
||||||
*/
|
|
||||||
if (need < 0 || need > PAIRMAX)
|
|
||||||
return APR_EINVAL;
|
|
||||||
|
|
||||||
if ((status = apr_sdbm_lock(db, APR_FLOCK_EXCLUSIVE)) != APR_SUCCESS)
|
|
||||||
return status;
|
|
||||||
|
|
||||||
if ((status = getpage(db, (hash = exhash(key)))) == APR_SUCCESS) {
|
|
||||||
|
|
||||||
/*
|
|
||||||
* if we need to replace, delete the key/data pair
|
|
||||||
* first. If it is not there, ignore.
|
|
||||||
*/
|
|
||||||
if (flags == APR_SDBM_REPLACE)
|
|
||||||
(void) delpair(db->pagbuf, key);
|
|
||||||
else if (!(flags & APR_SDBM_INSERTDUP) && duppair(db->pagbuf, key)) {
|
|
||||||
status = APR_EEXIST;
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* if we do not have enough room, we have to split.
|
|
||||||
*/
|
|
||||||
if (!fitpair(db->pagbuf, need))
|
|
||||||
if ((status = makroom(db, hash, need)) != APR_SUCCESS)
|
|
||||||
goto error;
|
|
||||||
/*
|
|
||||||
* we have enough room or split is successful. insert the key,
|
|
||||||
* and update the page file.
|
|
||||||
*/
|
|
||||||
(void) putpair(db->pagbuf, key, val);
|
|
||||||
|
|
||||||
status = write_page(db, db->pagbuf, db->pagbno);
|
|
||||||
}
|
|
||||||
|
|
||||||
error:
|
|
||||||
(void) apr_sdbm_unlock(db);
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* makroom - make room by splitting the overfull page
|
|
||||||
* this routine will attempt to make room for SPLTMAX times before
|
|
||||||
* giving up.
|
|
||||||
*/
|
|
||||||
static apr_status_t makroom(apr_sdbm_t *db, long hash, int need)
|
|
||||||
{
|
|
||||||
long newp;
|
|
||||||
char twin[PBLKSIZ];
|
|
||||||
char *pag = db->pagbuf;
|
|
||||||
char *new = twin;
|
|
||||||
register int smax = SPLTMAX;
|
|
||||||
apr_status_t status;
|
|
||||||
|
|
||||||
do {
|
|
||||||
/*
|
|
||||||
* split the current page
|
|
||||||
*/
|
|
||||||
(void) splpage(pag, new, db->hmask + 1);
|
|
||||||
/*
|
|
||||||
* address of the new page
|
|
||||||
*/
|
|
||||||
newp = (hash & db->hmask) | (db->hmask + 1);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* write delay, read avoidence/cache shuffle:
|
|
||||||
* select the page for incoming pair: if key is to go to the new page,
|
|
||||||
* write out the previous one, and copy the new one over, thus making
|
|
||||||
* it the current page. If not, simply write the new page, and we are
|
|
||||||
* still looking at the page of interest. current page is not updated
|
|
||||||
* here, as sdbm_store will do so, after it inserts the incoming pair.
|
|
||||||
*/
|
|
||||||
if (hash & (db->hmask + 1)) {
|
|
||||||
if ((status = write_page(db, db->pagbuf, db->pagbno))
|
|
||||||
!= APR_SUCCESS)
|
|
||||||
return status;
|
|
||||||
|
|
||||||
db->pagbno = newp;
|
|
||||||
(void) memcpy(pag, new, PBLKSIZ);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if ((status = write_page(db, new, newp)) != APR_SUCCESS)
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((status = setdbit(db, db->curbit)) != APR_SUCCESS)
|
|
||||||
return status;
|
|
||||||
/*
|
|
||||||
* see if we have enough room now
|
|
||||||
*/
|
|
||||||
if (fitpair(pag, need))
|
|
||||||
return APR_SUCCESS;
|
|
||||||
/*
|
|
||||||
* try again... update curbit and hmask as getpage would have
|
|
||||||
* done. because of our update of the current page, we do not
|
|
||||||
* need to read in anything. BUT we have to write the current
|
|
||||||
* [deferred] page out, as the window of failure is too great.
|
|
||||||
*/
|
|
||||||
db->curbit = 2 * db->curbit
|
|
||||||
+ ((hash & (db->hmask + 1)) ? 2 : 1);
|
|
||||||
db->hmask |= db->hmask + 1;
|
|
||||||
|
|
||||||
if ((status = write_page(db, db->pagbuf, db->pagbno))
|
|
||||||
!= APR_SUCCESS)
|
|
||||||
return status;
|
|
||||||
|
|
||||||
} while (--smax);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* if we are here, this is real bad news. After SPLTMAX splits,
|
|
||||||
* we still cannot fit the key. say goodnight.
|
|
||||||
*/
|
|
||||||
#if 0
|
|
||||||
(void) write(2, "sdbm: cannot insert after SPLTMAX attempts.\n", 44);
|
|
||||||
#endif
|
|
||||||
/* ### ENOSPC not really appropriate but better than nothing */
|
|
||||||
return APR_ENOSPC;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Reads 'len' bytes from file 'f' at offset 'off' into buf.
|
|
||||||
* 'off' is given relative to the start of the file.
|
|
||||||
* If EOF is returned while reading, this is taken as success.
|
|
||||||
*/
|
|
||||||
static apr_status_t read_from(apr_file_t *f, void *buf,
|
|
||||||
apr_off_t off, apr_size_t len)
|
|
||||||
{
|
|
||||||
apr_status_t status;
|
|
||||||
|
|
||||||
if ((status = apr_file_seek(f, APR_SET, &off)) != APR_SUCCESS ||
|
|
||||||
((status = apr_file_read_full(f, buf, len, NULL)) != APR_SUCCESS)) {
|
|
||||||
/* if EOF is reached, pretend we read all zero's */
|
|
||||||
if (status == APR_EOF) {
|
|
||||||
memset(buf, 0, len);
|
|
||||||
status = APR_SUCCESS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* the following two routines will break if
|
|
||||||
* deletions aren't taken into account. (ndbm bug)
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_sdbm_firstkey(apr_sdbm_t *db,
|
|
||||||
apr_sdbm_datum_t *key)
|
|
||||||
{
|
|
||||||
apr_status_t status;
|
|
||||||
|
|
||||||
if ((status = apr_sdbm_lock(db, APR_FLOCK_SHARED)) != APR_SUCCESS)
|
|
||||||
return status;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* start at page 0
|
|
||||||
*/
|
|
||||||
if ((status = read_from(db->pagf, db->pagbuf, OFF_PAG(0), PBLKSIZ))
|
|
||||||
== APR_SUCCESS) {
|
|
||||||
db->pagbno = 0;
|
|
||||||
db->blkptr = 0;
|
|
||||||
db->keyptr = 0;
|
|
||||||
status = getnext(key, db);
|
|
||||||
}
|
|
||||||
|
|
||||||
(void) apr_sdbm_unlock(db);
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_sdbm_nextkey(apr_sdbm_t *db,
|
|
||||||
apr_sdbm_datum_t *key)
|
|
||||||
{
|
|
||||||
apr_status_t status;
|
|
||||||
|
|
||||||
if ((status = apr_sdbm_lock(db, APR_FLOCK_SHARED)) != APR_SUCCESS)
|
|
||||||
return status;
|
|
||||||
|
|
||||||
status = getnext(key, db);
|
|
||||||
|
|
||||||
(void) apr_sdbm_unlock(db);
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* all important binary tree traversal
|
|
||||||
*/
|
|
||||||
static apr_status_t getpage(apr_sdbm_t *db, long hash)
|
|
||||||
{
|
|
||||||
register int hbit;
|
|
||||||
register long dbit;
|
|
||||||
register long pagb;
|
|
||||||
apr_status_t status;
|
|
||||||
|
|
||||||
dbit = 0;
|
|
||||||
hbit = 0;
|
|
||||||
while (dbit < db->maxbno && getdbit(db, dbit))
|
|
||||||
dbit = 2 * dbit + ((hash & (1 << hbit++)) ? 2 : 1);
|
|
||||||
|
|
||||||
debug(("dbit: %d...", dbit));
|
|
||||||
|
|
||||||
db->curbit = dbit;
|
|
||||||
db->hmask = masks[hbit];
|
|
||||||
|
|
||||||
pagb = hash & db->hmask;
|
|
||||||
/*
|
|
||||||
* see if the block we need is already in memory.
|
|
||||||
* note: this lookaside cache has about 10% hit rate.
|
|
||||||
*/
|
|
||||||
if (pagb != db->pagbno) {
|
|
||||||
/*
|
|
||||||
* note: here, we assume a "hole" is read as 0s.
|
|
||||||
* if not, must zero pagbuf first.
|
|
||||||
* ### joe: this assumption was surely never correct? but
|
|
||||||
* ### we make it so in read_from anyway.
|
|
||||||
*/
|
|
||||||
if ((status = read_from(db->pagf, db->pagbuf, OFF_PAG(pagb), PBLKSIZ))
|
|
||||||
!= APR_SUCCESS)
|
|
||||||
return status;
|
|
||||||
|
|
||||||
if (!chkpage(db->pagbuf))
|
|
||||||
return APR_ENOSPC; /* ### better error? */
|
|
||||||
db->pagbno = pagb;
|
|
||||||
|
|
||||||
debug(("pag read: %d\n", pagb));
|
|
||||||
}
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int getdbit(apr_sdbm_t *db, long dbit)
|
|
||||||
{
|
|
||||||
register long c;
|
|
||||||
register long dirb;
|
|
||||||
|
|
||||||
c = dbit / BYTESIZ;
|
|
||||||
dirb = c / DBLKSIZ;
|
|
||||||
|
|
||||||
if (dirb != db->dirbno) {
|
|
||||||
if (read_from(db->dirf, db->dirbuf, OFF_DIR(dirb), DBLKSIZ)
|
|
||||||
!= APR_SUCCESS)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
db->dirbno = dirb;
|
|
||||||
|
|
||||||
debug(("dir read: %d\n", dirb));
|
|
||||||
}
|
|
||||||
|
|
||||||
return db->dirbuf[c % DBLKSIZ] & (1 << dbit % BYTESIZ);
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_status_t setdbit(apr_sdbm_t *db, long dbit)
|
|
||||||
{
|
|
||||||
register long c;
|
|
||||||
register long dirb;
|
|
||||||
apr_status_t status;
|
|
||||||
apr_off_t off;
|
|
||||||
|
|
||||||
c = dbit / BYTESIZ;
|
|
||||||
dirb = c / DBLKSIZ;
|
|
||||||
|
|
||||||
if (dirb != db->dirbno) {
|
|
||||||
if ((status = read_from(db->dirf, db->dirbuf, OFF_DIR(dirb), DBLKSIZ))
|
|
||||||
!= APR_SUCCESS)
|
|
||||||
return status;
|
|
||||||
|
|
||||||
db->dirbno = dirb;
|
|
||||||
|
|
||||||
debug(("dir read: %d\n", dirb));
|
|
||||||
}
|
|
||||||
|
|
||||||
db->dirbuf[c % DBLKSIZ] |= (1 << dbit % BYTESIZ);
|
|
||||||
|
|
||||||
if (dbit >= db->maxbno)
|
|
||||||
db->maxbno += DBLKSIZ * BYTESIZ;
|
|
||||||
|
|
||||||
off = OFF_DIR(dirb);
|
|
||||||
if ((status = apr_file_seek(db->dirf, APR_SET, &off)) == APR_SUCCESS)
|
|
||||||
status = apr_file_write_full(db->dirf, db->dirbuf, DBLKSIZ, NULL);
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* getnext - get the next key in the page, and if done with
|
|
||||||
* the page, try the next page in sequence
|
|
||||||
*/
|
|
||||||
static apr_status_t getnext(apr_sdbm_datum_t *key, apr_sdbm_t *db)
|
|
||||||
{
|
|
||||||
apr_status_t status;
|
|
||||||
for (;;) {
|
|
||||||
db->keyptr++;
|
|
||||||
*key = getnkey(db->pagbuf, db->keyptr);
|
|
||||||
if (key->dptr != NULL)
|
|
||||||
return APR_SUCCESS;
|
|
||||||
/*
|
|
||||||
* we either run out, or there is nothing on this page..
|
|
||||||
* try the next one... If we lost our position on the
|
|
||||||
* file, we will have to seek.
|
|
||||||
*/
|
|
||||||
db->keyptr = 0;
|
|
||||||
if (db->pagbno != db->blkptr++) {
|
|
||||||
apr_off_t off = OFF_PAG(db->blkptr);
|
|
||||||
if ((status = apr_file_seek(db->pagf, APR_SET, &off)
|
|
||||||
!= APR_SUCCESS))
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
db->pagbno = db->blkptr;
|
|
||||||
/* ### EOF acceptable here too? */
|
|
||||||
if ((status = apr_file_read_full(db->pagf, db->pagbuf, PBLKSIZ, NULL))
|
|
||||||
!= APR_SUCCESS)
|
|
||||||
return status;
|
|
||||||
if (!chkpage(db->pagbuf))
|
|
||||||
return APR_EGENERAL; /* ### need better error */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* NOTREACHED */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
APU_DECLARE(int) apr_sdbm_rdonly(apr_sdbm_t *db)
|
|
||||||
{
|
|
||||||
/* ### Should we return true if the first lock is a share lock,
|
|
||||||
* to reflect that apr_sdbm_store and apr_sdbm_delete will fail?
|
|
||||||
*/
|
|
||||||
return (db->flags & SDBM_RDONLY) != 0;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,63 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* sdbm - ndbm work-alike hashed database library
|
|
||||||
* based on Per-Aake Larson's Dynamic Hashing algorithms. BIT 18 (1978).
|
|
||||||
* author: oz@nexus.yorku.ca
|
|
||||||
* status: ex-public domain. keep it that way.
|
|
||||||
*
|
|
||||||
* hashing routine
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apr_sdbm.h"
|
|
||||||
#include "sdbm_private.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* polynomial conversion ignoring overflows
|
|
||||||
* [this seems to work remarkably well, in fact better
|
|
||||||
* then the ndbm hash function. Replace at your own risk]
|
|
||||||
* use: 65599 nice.
|
|
||||||
* 65587 even better.
|
|
||||||
*/
|
|
||||||
long sdbm_hash(const char *str, int len)
|
|
||||||
{
|
|
||||||
register unsigned long n = 0;
|
|
||||||
|
|
||||||
#define DUFF /* go ahead and use the loop-unrolled version */
|
|
||||||
#ifdef DUFF
|
|
||||||
|
|
||||||
#define HASHC n = *str++ + 65599 * n
|
|
||||||
|
|
||||||
if (len > 0) {
|
|
||||||
register int loop = (len + 8 - 1) >> 3;
|
|
||||||
|
|
||||||
switch(len & (8 - 1)) {
|
|
||||||
case 0: do {
|
|
||||||
HASHC; case 7: HASHC;
|
|
||||||
case 6: HASHC; case 5: HASHC;
|
|
||||||
case 4: HASHC; case 3: HASHC;
|
|
||||||
case 2: HASHC; case 1: HASHC;
|
|
||||||
} while (--loop);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
while (len--)
|
|
||||||
n = *str++ + 65599 * n;
|
|
||||||
#endif
|
|
||||||
return n;
|
|
||||||
}
|
|
|
@ -1,78 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apr_file_info.h"
|
|
||||||
#include "apr_file_io.h"
|
|
||||||
#include "apr_sdbm.h"
|
|
||||||
|
|
||||||
#include "sdbm_private.h"
|
|
||||||
#include "sdbm_tune.h"
|
|
||||||
|
|
||||||
/* NOTE: this function blocks until it acquires the lock */
|
|
||||||
APU_DECLARE(apr_status_t) apr_sdbm_lock(apr_sdbm_t *db, int type)
|
|
||||||
{
|
|
||||||
apr_status_t status;
|
|
||||||
|
|
||||||
if (!(type == APR_FLOCK_SHARED || type == APR_FLOCK_EXCLUSIVE))
|
|
||||||
return APR_EINVAL;
|
|
||||||
|
|
||||||
if (db->flags & SDBM_EXCLUSIVE_LOCK) {
|
|
||||||
++db->lckcnt;
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
else if (db->flags & SDBM_SHARED_LOCK) {
|
|
||||||
/*
|
|
||||||
* Cannot promote a shared lock to an exlusive lock
|
|
||||||
* in a cross-platform compatibile manner.
|
|
||||||
*/
|
|
||||||
if (type == APR_FLOCK_EXCLUSIVE)
|
|
||||||
return APR_EINVAL;
|
|
||||||
++db->lckcnt;
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* zero size: either a fresh database, or one with a single,
|
|
||||||
* unsplit data page: dirpage is all zeros.
|
|
||||||
*/
|
|
||||||
if ((status = apr_file_lock(db->dirf, type)) == APR_SUCCESS)
|
|
||||||
{
|
|
||||||
apr_finfo_t finfo;
|
|
||||||
if ((status = apr_file_info_get(&finfo, APR_FINFO_SIZE, db->dirf))
|
|
||||||
!= APR_SUCCESS) {
|
|
||||||
(void) apr_file_unlock(db->dirf);
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
SDBM_INVALIDATE_CACHE(db, finfo);
|
|
||||||
|
|
||||||
++db->lckcnt;
|
|
||||||
if (type == APR_FLOCK_SHARED)
|
|
||||||
db->flags |= SDBM_SHARED_LOCK;
|
|
||||||
else if (type == APR_FLOCK_EXCLUSIVE)
|
|
||||||
db->flags |= SDBM_EXCLUSIVE_LOCK;
|
|
||||||
}
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_sdbm_unlock(apr_sdbm_t *db)
|
|
||||||
{
|
|
||||||
if (!(db->flags & (SDBM_SHARED_LOCK | SDBM_EXCLUSIVE_LOCK)))
|
|
||||||
return APR_EINVAL;
|
|
||||||
if (--db->lckcnt > 0)
|
|
||||||
return APR_SUCCESS;
|
|
||||||
db->flags &= ~(SDBM_SHARED_LOCK | SDBM_EXCLUSIVE_LOCK);
|
|
||||||
return apr_file_unlock(db->dirf);
|
|
||||||
}
|
|
|
@ -1,319 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* sdbm - ndbm work-alike hashed database library
|
|
||||||
* based on Per-Aake Larson's Dynamic Hashing algorithms. BIT 18 (1978).
|
|
||||||
* author: oz@nexus.yorku.ca
|
|
||||||
* status: ex-public domain.
|
|
||||||
*
|
|
||||||
* page-level routines
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apr_sdbm.h"
|
|
||||||
|
|
||||||
#include "sdbm_tune.h"
|
|
||||||
#include "sdbm_pair.h"
|
|
||||||
#include "sdbm_private.h"
|
|
||||||
|
|
||||||
#include <string.h> /* for memset() */
|
|
||||||
|
|
||||||
|
|
||||||
#define exhash(item) sdbm_hash((item).dptr, (item).dsize)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* forward
|
|
||||||
*/
|
|
||||||
static int seepair(char *, int, char *, int);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* page format:
|
|
||||||
* +------------------------------+
|
|
||||||
* ino | n | keyoff | datoff | keyoff |
|
|
||||||
* +------------+--------+--------+
|
|
||||||
* | datoff | - - - ----> |
|
|
||||||
* +--------+---------------------+
|
|
||||||
* | F R E E A R E A |
|
|
||||||
* +--------------+---------------+
|
|
||||||
* | <---- - - - | data |
|
|
||||||
* +--------+-----+----+----------+
|
|
||||||
* | key | data | key |
|
|
||||||
* +--------+----------+----------+
|
|
||||||
*
|
|
||||||
* calculating the offsets for free area: if the number
|
|
||||||
* of entries (ino[0]) is zero, the offset to the END of
|
|
||||||
* the free area is the block size. Otherwise, it is the
|
|
||||||
* nth (ino[ino[0]]) entry's offset.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int
|
|
||||||
fitpair(pag, need)
|
|
||||||
char *pag;
|
|
||||||
int need;
|
|
||||||
{
|
|
||||||
register int n;
|
|
||||||
register int off;
|
|
||||||
register int avail;
|
|
||||||
register short *ino = (short *) pag;
|
|
||||||
|
|
||||||
off = ((n = ino[0]) > 0) ? ino[n] : PBLKSIZ;
|
|
||||||
avail = off - (n + 1) * sizeof(short);
|
|
||||||
need += 2 * sizeof(short);
|
|
||||||
|
|
||||||
debug(("avail %d need %d\n", avail, need));
|
|
||||||
|
|
||||||
return need <= avail;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
putpair(pag, key, val)
|
|
||||||
char *pag;
|
|
||||||
apr_sdbm_datum_t key;
|
|
||||||
apr_sdbm_datum_t val;
|
|
||||||
{
|
|
||||||
register int n;
|
|
||||||
register int off;
|
|
||||||
register short *ino = (short *) pag;
|
|
||||||
|
|
||||||
off = ((n = ino[0]) > 0) ? ino[n] : PBLKSIZ;
|
|
||||||
/*
|
|
||||||
* enter the key first
|
|
||||||
*/
|
|
||||||
off -= key.dsize;
|
|
||||||
(void) memcpy(pag + off, key.dptr, key.dsize);
|
|
||||||
ino[n + 1] = off;
|
|
||||||
/*
|
|
||||||
* now the data
|
|
||||||
*/
|
|
||||||
off -= val.dsize;
|
|
||||||
(void) memcpy(pag + off, val.dptr, val.dsize);
|
|
||||||
ino[n + 2] = off;
|
|
||||||
/*
|
|
||||||
* adjust item count
|
|
||||||
*/
|
|
||||||
ino[0] += 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
apr_sdbm_datum_t
|
|
||||||
getpair(pag, key)
|
|
||||||
char *pag;
|
|
||||||
apr_sdbm_datum_t key;
|
|
||||||
{
|
|
||||||
register int i;
|
|
||||||
register int n;
|
|
||||||
apr_sdbm_datum_t val;
|
|
||||||
register short *ino = (short *) pag;
|
|
||||||
|
|
||||||
if ((n = ino[0]) == 0)
|
|
||||||
return sdbm_nullitem;
|
|
||||||
|
|
||||||
if ((i = seepair(pag, n, key.dptr, key.dsize)) == 0)
|
|
||||||
return sdbm_nullitem;
|
|
||||||
|
|
||||||
val.dptr = pag + ino[i + 1];
|
|
||||||
val.dsize = ino[i] - ino[i + 1];
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
duppair(pag, key)
|
|
||||||
char *pag;
|
|
||||||
apr_sdbm_datum_t key;
|
|
||||||
{
|
|
||||||
register short *ino = (short *) pag;
|
|
||||||
return ino[0] > 0 && seepair(pag, ino[0], key.dptr, key.dsize) > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
apr_sdbm_datum_t
|
|
||||||
getnkey(pag, num)
|
|
||||||
char *pag;
|
|
||||||
int num;
|
|
||||||
{
|
|
||||||
apr_sdbm_datum_t key;
|
|
||||||
register int off;
|
|
||||||
register short *ino = (short *) pag;
|
|
||||||
|
|
||||||
num = num * 2 - 1;
|
|
||||||
if (ino[0] == 0 || num > ino[0])
|
|
||||||
return sdbm_nullitem;
|
|
||||||
|
|
||||||
off = (num > 1) ? ino[num - 1] : PBLKSIZ;
|
|
||||||
|
|
||||||
key.dptr = pag + ino[num];
|
|
||||||
key.dsize = off - ino[num];
|
|
||||||
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
delpair(pag, key)
|
|
||||||
char *pag;
|
|
||||||
apr_sdbm_datum_t key;
|
|
||||||
{
|
|
||||||
register int n;
|
|
||||||
register int i;
|
|
||||||
register short *ino = (short *) pag;
|
|
||||||
|
|
||||||
if ((n = ino[0]) == 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if ((i = seepair(pag, n, key.dptr, key.dsize)) == 0)
|
|
||||||
return 0;
|
|
||||||
/*
|
|
||||||
* found the key. if it is the last entry
|
|
||||||
* [i.e. i == n - 1] we just adjust the entry count.
|
|
||||||
* hard case: move all data down onto the deleted pair,
|
|
||||||
* shift offsets onto deleted offsets, and adjust them.
|
|
||||||
* [note: 0 < i < n]
|
|
||||||
*/
|
|
||||||
if (i < n - 1) {
|
|
||||||
register int m;
|
|
||||||
register char *dst = pag + (i == 1 ? PBLKSIZ : ino[i - 1]);
|
|
||||||
register char *src = pag + ino[i + 1];
|
|
||||||
register int zoo = dst - src;
|
|
||||||
|
|
||||||
debug(("free-up %d ", zoo));
|
|
||||||
/*
|
|
||||||
* shift data/keys down
|
|
||||||
*/
|
|
||||||
m = ino[i + 1] - ino[n];
|
|
||||||
|
|
||||||
#undef DUFF /* just use memmove. it should be plenty fast. */
|
|
||||||
#ifdef DUFF
|
|
||||||
#define MOVB *--dst = *--src
|
|
||||||
|
|
||||||
if (m > 0) {
|
|
||||||
register int loop = (m + 8 - 1) >> 3;
|
|
||||||
|
|
||||||
switch (m & (8 - 1)) {
|
|
||||||
case 0: do {
|
|
||||||
MOVB; case 7: MOVB;
|
|
||||||
case 6: MOVB; case 5: MOVB;
|
|
||||||
case 4: MOVB; case 3: MOVB;
|
|
||||||
case 2: MOVB; case 1: MOVB;
|
|
||||||
} while (--loop);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
dst -= m;
|
|
||||||
src -= m;
|
|
||||||
memmove(dst, src, m);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* adjust offset index up
|
|
||||||
*/
|
|
||||||
while (i < n - 1) {
|
|
||||||
ino[i] = ino[i + 2] + zoo;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ino[0] -= 2;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* search for the key in the page.
|
|
||||||
* return offset index in the range 0 < i < n.
|
|
||||||
* return 0 if not found.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
seepair(pag, n, key, siz)
|
|
||||||
char *pag;
|
|
||||||
register int n;
|
|
||||||
register char *key;
|
|
||||||
register int siz;
|
|
||||||
{
|
|
||||||
register int i;
|
|
||||||
register int off = PBLKSIZ;
|
|
||||||
register short *ino = (short *) pag;
|
|
||||||
|
|
||||||
for (i = 1; i < n; i += 2) {
|
|
||||||
if (siz == off - ino[i] &&
|
|
||||||
memcmp(key, pag + ino[i], siz) == 0)
|
|
||||||
return i;
|
|
||||||
off = ino[i + 1];
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
splpage(pag, new, sbit)
|
|
||||||
char *pag;
|
|
||||||
char *new;
|
|
||||||
long sbit;
|
|
||||||
{
|
|
||||||
apr_sdbm_datum_t key;
|
|
||||||
apr_sdbm_datum_t val;
|
|
||||||
|
|
||||||
register int n;
|
|
||||||
register int off = PBLKSIZ;
|
|
||||||
char cur[PBLKSIZ];
|
|
||||||
register short *ino = (short *) cur;
|
|
||||||
|
|
||||||
(void) memcpy(cur, pag, PBLKSIZ);
|
|
||||||
(void) memset(pag, 0, PBLKSIZ);
|
|
||||||
(void) memset(new, 0, PBLKSIZ);
|
|
||||||
|
|
||||||
n = ino[0];
|
|
||||||
for (ino++; n > 0; ino += 2) {
|
|
||||||
key.dptr = cur + ino[0];
|
|
||||||
key.dsize = off - ino[0];
|
|
||||||
val.dptr = cur + ino[1];
|
|
||||||
val.dsize = ino[0] - ino[1];
|
|
||||||
/*
|
|
||||||
* select the page pointer (by looking at sbit) and insert
|
|
||||||
*/
|
|
||||||
(void) putpair((exhash(key) & sbit) ? new : pag, key, val);
|
|
||||||
|
|
||||||
off = ino[1];
|
|
||||||
n -= 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
debug(("%d split %d/%d\n", ((short *) cur)[0] / 2,
|
|
||||||
((short *) new)[0] / 2,
|
|
||||||
((short *) pag)[0] / 2));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* check page sanity:
|
|
||||||
* number of entries should be something
|
|
||||||
* reasonable, and all offsets in the index should be in order.
|
|
||||||
* this could be made more rigorous.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
chkpage(pag)
|
|
||||||
char *pag;
|
|
||||||
{
|
|
||||||
register int n;
|
|
||||||
register int off;
|
|
||||||
register short *ino = (short *) pag;
|
|
||||||
|
|
||||||
if ((n = ino[0]) < 0 || n > PBLKSIZ / sizeof(short))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (n > 0) {
|
|
||||||
off = PBLKSIZ;
|
|
||||||
for (ino++; n > 0; ino += 2) {
|
|
||||||
if (ino[0] > off || ino[1] > off ||
|
|
||||||
ino[1] > ino[0])
|
|
||||||
return 0;
|
|
||||||
off = ino[1];
|
|
||||||
n -= 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
|
@ -1,40 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef SDBM_PAIR_H
|
|
||||||
#define SDBM_PAIR_H
|
|
||||||
|
|
||||||
/* Mini EMBED (pair.c) */
|
|
||||||
#define chkpage apu__sdbm_chkpage
|
|
||||||
#define delpair apu__sdbm_delpair
|
|
||||||
#define duppair apu__sdbm_duppair
|
|
||||||
#define fitpair apu__sdbm_fitpair
|
|
||||||
#define getnkey apu__sdbm_getnkey
|
|
||||||
#define getpair apu__sdbm_getpair
|
|
||||||
#define putpair apu__sdbm_putpair
|
|
||||||
#define splpage apu__sdbm_splpage
|
|
||||||
|
|
||||||
int fitpair(char *, int);
|
|
||||||
void putpair(char *, apr_sdbm_datum_t, apr_sdbm_datum_t);
|
|
||||||
apr_sdbm_datum_t getpair(char *, apr_sdbm_datum_t);
|
|
||||||
int delpair(char *, apr_sdbm_datum_t);
|
|
||||||
int chkpage (char *);
|
|
||||||
apr_sdbm_datum_t getnkey(char *, int);
|
|
||||||
void splpage(char *, char *, long);
|
|
||||||
int duppair(char *, apr_sdbm_datum_t);
|
|
||||||
|
|
||||||
#endif /* SDBM_PAIR_H */
|
|
||||||
|
|
|
@ -1,84 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* sdbm - ndbm work-alike hashed database library
|
|
||||||
* based on Per-Ake Larson's Dynamic Hashing algorithms. BIT 18 (1978).
|
|
||||||
* author: oz@nexus.yorku.ca
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef SDBM_PRIVATE_H
|
|
||||||
#define SDBM_PRIVATE_H
|
|
||||||
|
|
||||||
#include "apr.h"
|
|
||||||
#include "apr_pools.h"
|
|
||||||
#include "apr_file_io.h"
|
|
||||||
#include "apr_errno.h" /* for apr_status_t */
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* if the block/page size is increased, it breaks perl apr_sdbm_t compatibility */
|
|
||||||
#define DBLKSIZ 16384
|
|
||||||
#define PBLKSIZ 8192
|
|
||||||
#define PAIRMAX 8008 /* arbitrary on PBLKSIZ-N */
|
|
||||||
#else
|
|
||||||
#define DBLKSIZ 4096
|
|
||||||
#define PBLKSIZ 1024
|
|
||||||
#define PAIRMAX 1008 /* arbitrary on PBLKSIZ-N */
|
|
||||||
#endif
|
|
||||||
#define SPLTMAX 10 /* maximum allowed splits */
|
|
||||||
|
|
||||||
/* for apr_sdbm_t.flags */
|
|
||||||
#define SDBM_RDONLY 0x1 /* data base open read-only */
|
|
||||||
#define SDBM_SHARED 0x2 /* data base open for sharing */
|
|
||||||
#define SDBM_SHARED_LOCK 0x4 /* data base locked for shared read */
|
|
||||||
#define SDBM_EXCLUSIVE_LOCK 0x8 /* data base locked for write */
|
|
||||||
|
|
||||||
struct apr_sdbm_t {
|
|
||||||
apr_pool_t *pool;
|
|
||||||
apr_file_t *dirf; /* directory file descriptor */
|
|
||||||
apr_file_t *pagf; /* page file descriptor */
|
|
||||||
apr_int32_t flags; /* status/error flags, see below */
|
|
||||||
long maxbno; /* size of dirfile in bits */
|
|
||||||
long curbit; /* current bit number */
|
|
||||||
long hmask; /* current hash mask */
|
|
||||||
long blkptr; /* current block for nextkey */
|
|
||||||
int keyptr; /* current key for nextkey */
|
|
||||||
long blkno; /* current page to read/write */
|
|
||||||
long pagbno; /* current page in pagbuf */
|
|
||||||
char pagbuf[PBLKSIZ]; /* page file block buffer */
|
|
||||||
long dirbno; /* current block in dirbuf */
|
|
||||||
char dirbuf[DBLKSIZ]; /* directory file block buffer */
|
|
||||||
int lckcnt; /* number of calls to sdbm_lock */
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#define sdbm_hash apu__sdbm_hash
|
|
||||||
#define sdbm_nullitem apu__sdbm_nullitem
|
|
||||||
|
|
||||||
extern const apr_sdbm_datum_t sdbm_nullitem;
|
|
||||||
|
|
||||||
long sdbm_hash(const char *str, int len);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* zero the cache
|
|
||||||
*/
|
|
||||||
#define SDBM_INVALIDATE_CACHE(db, finfo) \
|
|
||||||
do { db->dirbno = (!finfo.size) ? 0 : -1; \
|
|
||||||
db->pagbno = -1; \
|
|
||||||
db->maxbno = (long)(finfo.size * BYTESIZ); \
|
|
||||||
} while (0);
|
|
||||||
|
|
||||||
#endif /* SDBM_PRIVATE_H */
|
|
|
@ -1,40 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* sdbm - ndbm work-alike hashed database library
|
|
||||||
* tuning and portability constructs [not nearly enough]
|
|
||||||
* author: oz@nexus.yorku.ca
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef SDBM_TUNE_H
|
|
||||||
#define SDBM_TUNE_H
|
|
||||||
|
|
||||||
#include "apr_errno.h"
|
|
||||||
|
|
||||||
/* ### this might be better off as sizeof(char *) */
|
|
||||||
#define BYTESIZ 8
|
|
||||||
|
|
||||||
/*
|
|
||||||
* misc
|
|
||||||
*/
|
|
||||||
#ifdef DEBUG
|
|
||||||
#define debug(x) printf x
|
|
||||||
#else
|
|
||||||
#define debug(x)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* SDBM_TUNE_H */
|
|
|
@ -1,30 +0,0 @@
|
||||||
PROJECT_NAME="Apache Portable Runtime Utility Library"
|
|
||||||
|
|
||||||
INPUT=.
|
|
||||||
QUIET=YES
|
|
||||||
RECURSIVE=YES
|
|
||||||
FILE_PATTERNS=*.h
|
|
||||||
|
|
||||||
OUTPUT_DIRECTORY=docs/dox
|
|
||||||
|
|
||||||
MACRO_EXPANSION=YES
|
|
||||||
EXPAND_ONLY_PREDEF=YES
|
|
||||||
#EXPAND_AS_DEFINED=
|
|
||||||
# not sure why this doesn't work as EXPAND_AS_DEFINED, it should!
|
|
||||||
PREDEFINED="APU_DECLARE(x)=x" \
|
|
||||||
"APU_DECLARE_NONSTD(x)=x" \
|
|
||||||
"APU_DECLARE_DATA" \
|
|
||||||
"APR_HAS_MMAP" \
|
|
||||||
"APR_HAS_THREADS" \
|
|
||||||
"APR_HAS_XLATE" \
|
|
||||||
"__attribute__(x)=" \
|
|
||||||
DOXYGEN=
|
|
||||||
|
|
||||||
OPTIMIZE_OUTPUT_FOR_C=YES
|
|
||||||
|
|
||||||
FULL_PATH_NAMES=YES
|
|
||||||
CASE_SENSE_NAMES=NO
|
|
||||||
# some autoconf guru needs to make configure set this correctly...
|
|
||||||
#STRIP_FROM_PATH=/root/apache/httpd-2.0-8/srclib/apr-util
|
|
||||||
|
|
||||||
GENERATE_TAGFILE=docs/dox/apu.tag
|
|
|
@ -1,268 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* base64 encoder/decoder. Originally part of main/util.c
|
|
||||||
* but moved here so that support/ab and apr_sha1.c could
|
|
||||||
* use it. This meant removing the apr_palloc()s and adding
|
|
||||||
* ugly 'len' functions, which is quite a nasty cost.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apr_base64.h"
|
|
||||||
#if APR_CHARSET_EBCDIC
|
|
||||||
#include "apr_xlate.h"
|
|
||||||
#endif /* APR_CHARSET_EBCDIC */
|
|
||||||
|
|
||||||
/* aaaack but it's fast and const should make it shared text page. */
|
|
||||||
static const unsigned char pr2six[256] =
|
|
||||||
{
|
|
||||||
#if !APR_CHARSET_EBCDIC
|
|
||||||
/* ASCII table */
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63,
|
|
||||||
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
|
|
||||||
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64,
|
|
||||||
64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
|
|
||||||
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
|
|
||||||
#else /*APR_CHARSET_EBCDIC*/
|
|
||||||
/* EBCDIC table */
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 63, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 35, 36, 37, 38, 39, 40, 41, 42, 43, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 9, 10, 11, 12, 13, 14, 15, 16, 17, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64, 64,
|
|
||||||
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64
|
|
||||||
#endif /*APR_CHARSET_EBCDIC*/
|
|
||||||
};
|
|
||||||
|
|
||||||
#if APR_CHARSET_EBCDIC
|
|
||||||
static apr_xlate_t *xlate_to_ebcdic;
|
|
||||||
static unsigned char os_toascii[256];
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_base64init_ebcdic(apr_xlate_t *to_ascii,
|
|
||||||
apr_xlate_t *to_ebcdic)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
apr_size_t inbytes_left, outbytes_left;
|
|
||||||
apr_status_t rv;
|
|
||||||
int onoff;
|
|
||||||
|
|
||||||
/* Only single-byte conversion is supported.
|
|
||||||
*/
|
|
||||||
rv = apr_xlate_sb_get(to_ascii, &onoff);
|
|
||||||
if (rv) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
if (!onoff) { /* If conversion is not single-byte-only */
|
|
||||||
return APR_EINVAL;
|
|
||||||
}
|
|
||||||
rv = apr_xlate_sb_get(to_ebcdic, &onoff);
|
|
||||||
if (rv) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
if (!onoff) { /* If conversion is not single-byte-only */
|
|
||||||
return APR_EINVAL;
|
|
||||||
}
|
|
||||||
xlate_to_ebcdic = to_ebcdic;
|
|
||||||
for (i = 0; i < sizeof(os_toascii); i++) {
|
|
||||||
os_toascii[i] = i;
|
|
||||||
}
|
|
||||||
inbytes_left = outbytes_left = sizeof(os_toascii);
|
|
||||||
apr_xlate_conv_buffer(to_ascii, os_toascii, &inbytes_left,
|
|
||||||
os_toascii, &outbytes_left);
|
|
||||||
|
|
||||||
return APR_SUCCESS;
|
|
||||||
}
|
|
||||||
#endif /*APR_CHARSET_EBCDIC*/
|
|
||||||
|
|
||||||
APU_DECLARE(int) apr_base64_decode_len(const char *bufcoded)
|
|
||||||
{
|
|
||||||
int nbytesdecoded;
|
|
||||||
register const unsigned char *bufin;
|
|
||||||
register int nprbytes;
|
|
||||||
|
|
||||||
bufin = (const unsigned char *) bufcoded;
|
|
||||||
while (pr2six[*(bufin++)] <= 63);
|
|
||||||
|
|
||||||
nprbytes = (bufin - (const unsigned char *) bufcoded) - 1;
|
|
||||||
nbytesdecoded = ((nprbytes + 3) / 4) * 3;
|
|
||||||
|
|
||||||
return nbytesdecoded + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(int) apr_base64_decode(char *bufplain, const char *bufcoded)
|
|
||||||
{
|
|
||||||
#if APR_CHARSET_EBCDIC
|
|
||||||
apr_size_t inbytes_left, outbytes_left;
|
|
||||||
#endif /* APR_CHARSET_EBCDIC */
|
|
||||||
int len;
|
|
||||||
|
|
||||||
len = apr_base64_decode_binary((unsigned char *) bufplain, bufcoded);
|
|
||||||
#if APR_CHARSET_EBCDIC
|
|
||||||
inbytes_left = outbytes_left = len;
|
|
||||||
apr_xlate_conv_buffer(xlate_to_ebcdic, bufplain, &inbytes_left,
|
|
||||||
bufplain, &outbytes_left);
|
|
||||||
#endif /* APR_CHARSET_EBCDIC */
|
|
||||||
bufplain[len] = '\0';
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This is the same as apr_base64_decode() except on EBCDIC machines, where
|
|
||||||
* the conversion of the output to ebcdic is left out.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_base64_decode_binary(unsigned char *bufplain,
|
|
||||||
const char *bufcoded)
|
|
||||||
{
|
|
||||||
int nbytesdecoded;
|
|
||||||
register const unsigned char *bufin;
|
|
||||||
register unsigned char *bufout;
|
|
||||||
register int nprbytes;
|
|
||||||
|
|
||||||
bufin = (const unsigned char *) bufcoded;
|
|
||||||
while (pr2six[*(bufin++)] <= 63);
|
|
||||||
nprbytes = (bufin - (const unsigned char *) bufcoded) - 1;
|
|
||||||
nbytesdecoded = ((nprbytes + 3) / 4) * 3;
|
|
||||||
|
|
||||||
bufout = (unsigned char *) bufplain;
|
|
||||||
bufin = (const unsigned char *) bufcoded;
|
|
||||||
|
|
||||||
while (nprbytes > 4) {
|
|
||||||
*(bufout++) =
|
|
||||||
(unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);
|
|
||||||
*(bufout++) =
|
|
||||||
(unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);
|
|
||||||
*(bufout++) =
|
|
||||||
(unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);
|
|
||||||
bufin += 4;
|
|
||||||
nprbytes -= 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Note: (nprbytes == 1) would be an error, so just ingore that case */
|
|
||||||
if (nprbytes > 1) {
|
|
||||||
*(bufout++) =
|
|
||||||
(unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);
|
|
||||||
}
|
|
||||||
if (nprbytes > 2) {
|
|
||||||
*(bufout++) =
|
|
||||||
(unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);
|
|
||||||
}
|
|
||||||
if (nprbytes > 3) {
|
|
||||||
*(bufout++) =
|
|
||||||
(unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);
|
|
||||||
}
|
|
||||||
|
|
||||||
nbytesdecoded -= (4 - nprbytes) & 3;
|
|
||||||
return nbytesdecoded;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char basis_64[] =
|
|
||||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
||||||
|
|
||||||
APU_DECLARE(int) apr_base64_encode_len(int len)
|
|
||||||
{
|
|
||||||
return ((len + 2) / 3 * 4) + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(int) apr_base64_encode(char *encoded, const char *string, int len)
|
|
||||||
{
|
|
||||||
#if !APR_CHARSET_EBCDIC
|
|
||||||
return apr_base64_encode_binary(encoded, (const unsigned char *) string, len);
|
|
||||||
#else /* APR_CHARSET_EBCDIC */
|
|
||||||
int i;
|
|
||||||
char *p;
|
|
||||||
|
|
||||||
p = encoded;
|
|
||||||
for (i = 0; i < len - 2; i += 3) {
|
|
||||||
*p++ = basis_64[(os_toascii[string[i]] >> 2) & 0x3F];
|
|
||||||
*p++ = basis_64[((os_toascii[string[i]] & 0x3) << 4) |
|
|
||||||
((int) (os_toascii[string[i + 1]] & 0xF0) >> 4)];
|
|
||||||
*p++ = basis_64[((os_toascii[string[i + 1]] & 0xF) << 2) |
|
|
||||||
((int) (os_toascii[string[i + 2]] & 0xC0) >> 6)];
|
|
||||||
*p++ = basis_64[os_toascii[string[i + 2]] & 0x3F];
|
|
||||||
}
|
|
||||||
if (i < len) {
|
|
||||||
*p++ = basis_64[(os_toascii[string[i]] >> 2) & 0x3F];
|
|
||||||
if (i == (len - 1)) {
|
|
||||||
*p++ = basis_64[((os_toascii[string[i]] & 0x3) << 4)];
|
|
||||||
*p++ = '=';
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
*p++ = basis_64[((os_toascii[string[i]] & 0x3) << 4) |
|
|
||||||
((int) (os_toascii[string[i + 1]] & 0xF0) >> 4)];
|
|
||||||
*p++ = basis_64[((os_toascii[string[i + 1]] & 0xF) << 2)];
|
|
||||||
}
|
|
||||||
*p++ = '=';
|
|
||||||
}
|
|
||||||
|
|
||||||
*p++ = '\0';
|
|
||||||
return p - encoded;
|
|
||||||
#endif /* APR_CHARSET_EBCDIC */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This is the same as apr_base64_encode() except on EBCDIC machines, where
|
|
||||||
* the conversion of the input to ascii is left out.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_base64_encode_binary(char *encoded,
|
|
||||||
const unsigned char *string, int len)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
char *p;
|
|
||||||
|
|
||||||
p = encoded;
|
|
||||||
for (i = 0; i < len - 2; i += 3) {
|
|
||||||
*p++ = basis_64[(string[i] >> 2) & 0x3F];
|
|
||||||
*p++ = basis_64[((string[i] & 0x3) << 4) |
|
|
||||||
((int) (string[i + 1] & 0xF0) >> 4)];
|
|
||||||
*p++ = basis_64[((string[i + 1] & 0xF) << 2) |
|
|
||||||
((int) (string[i + 2] & 0xC0) >> 6)];
|
|
||||||
*p++ = basis_64[string[i + 2] & 0x3F];
|
|
||||||
}
|
|
||||||
if (i < len) {
|
|
||||||
*p++ = basis_64[(string[i] >> 2) & 0x3F];
|
|
||||||
if (i == (len - 1)) {
|
|
||||||
*p++ = basis_64[((string[i] & 0x3) << 4)];
|
|
||||||
*p++ = '=';
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
*p++ = basis_64[((string[i] & 0x3) << 4) |
|
|
||||||
((int) (string[i + 1] & 0xF0) >> 4)];
|
|
||||||
*p++ = basis_64[((string[i + 1] & 0xF) << 2)];
|
|
||||||
}
|
|
||||||
*p++ = '=';
|
|
||||||
}
|
|
||||||
|
|
||||||
*p++ = '\0';
|
|
||||||
return p - encoded;
|
|
||||||
}
|
|
|
@ -1,13 +0,0 @@
|
||||||
#
|
|
||||||
# export_vars.sh
|
|
||||||
#
|
|
||||||
# This shell script is used to export vars to the application using the
|
|
||||||
# APRUTIL library. This script should be "sourced" to ensure the variable
|
|
||||||
# values are set within the calling script's context. For example:
|
|
||||||
#
|
|
||||||
# $ . path/to/apr-util/export_vars.sh
|
|
||||||
#
|
|
||||||
|
|
||||||
APRUTIL_EXPORT_INCLUDES="@APRUTIL_INCLUDES@"
|
|
||||||
APRUTIL_EXPORT_LIBS="@APRUTIL_EXPORT_LIBS@"
|
|
||||||
APRUTIL_LDFLAGS="@APRUTIL_LDFLAGS@"
|
|
|
@ -1,404 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include "apr_pools.h"
|
|
||||||
#include "apr_tables.h"
|
|
||||||
#include "apr.h"
|
|
||||||
#include "apr_hooks.h"
|
|
||||||
#include "apr_hash.h"
|
|
||||||
#include "apr_optional_hooks.h"
|
|
||||||
#include "apr_optional.h"
|
|
||||||
#define APR_WANT_MEMFUNC
|
|
||||||
#define APR_WANT_STRFUNC
|
|
||||||
#include "apr_want.h"
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
#define apr_palloc(pool,size) malloc(size)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
APU_DECLARE_DATA apr_pool_t *apr_hook_global_pool = NULL;
|
|
||||||
APU_DECLARE_DATA int apr_hook_debug_enabled = 0;
|
|
||||||
APU_DECLARE_DATA const char *apr_hook_debug_current = NULL;
|
|
||||||
|
|
||||||
/** @deprecated @see apr_hook_global_pool */
|
|
||||||
APU_DECLARE_DATA apr_pool_t *apr_global_hook_pool = NULL;
|
|
||||||
|
|
||||||
/** @deprecated @see apr_hook_debug_enabled */
|
|
||||||
APU_DECLARE_DATA int apr_debug_module_hooks = 0;
|
|
||||||
|
|
||||||
/** @deprecated @see apr_hook_debug_current */
|
|
||||||
APU_DECLARE_DATA const char *apr_current_hooking_module = NULL;
|
|
||||||
|
|
||||||
/* NB: This must echo the LINK_##name structure */
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
void (*dummy)(void *);
|
|
||||||
const char *szName;
|
|
||||||
const char * const *aszPredecessors;
|
|
||||||
const char * const *aszSuccessors;
|
|
||||||
int nOrder;
|
|
||||||
} TSortData;
|
|
||||||
|
|
||||||
typedef struct tsort_
|
|
||||||
{
|
|
||||||
void *pData;
|
|
||||||
int nPredecessors;
|
|
||||||
struct tsort_ **ppPredecessors;
|
|
||||||
struct tsort_ *pNext;
|
|
||||||
} TSort;
|
|
||||||
|
|
||||||
#ifdef NETWARE
|
|
||||||
#include "apr_private.h"
|
|
||||||
#define get_apd APP_DATA* apd = (APP_DATA*)get_app_data(gLibId);
|
|
||||||
#define s_aHooksToSort ((apr_array_header_t *)(apd->gs_aHooksToSort))
|
|
||||||
#define s_phOptionalHooks ((apr_hash_t *)(apd->gs_phOptionalHooks))
|
|
||||||
#define s_phOptionalFunctions ((apr_hash_t *)(apd->gs_phOptionalFunctions))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int crude_order(const void *a_,const void *b_)
|
|
||||||
{
|
|
||||||
const TSortData *a=a_;
|
|
||||||
const TSortData *b=b_;
|
|
||||||
|
|
||||||
return a->nOrder-b->nOrder;
|
|
||||||
}
|
|
||||||
|
|
||||||
static TSort *prepare(apr_pool_t *p,TSortData *pItems,int nItems)
|
|
||||||
{
|
|
||||||
TSort *pData=apr_palloc(p,nItems*sizeof *pData);
|
|
||||||
int n;
|
|
||||||
|
|
||||||
qsort(pItems,nItems,sizeof *pItems,crude_order);
|
|
||||||
for(n=0 ; n < nItems ; ++n) {
|
|
||||||
pData[n].nPredecessors=0;
|
|
||||||
pData[n].ppPredecessors=apr_pcalloc(p,nItems*sizeof *pData[n].ppPredecessors);
|
|
||||||
pData[n].pNext=NULL;
|
|
||||||
pData[n].pData=&pItems[n];
|
|
||||||
}
|
|
||||||
|
|
||||||
for(n=0 ; n < nItems ; ++n) {
|
|
||||||
int i,k;
|
|
||||||
|
|
||||||
for(i=0 ; pItems[n].aszPredecessors && pItems[n].aszPredecessors[i] ; ++i)
|
|
||||||
for(k=0 ; k < nItems ; ++k)
|
|
||||||
if(!strcmp(pItems[k].szName,pItems[n].aszPredecessors[i])) {
|
|
||||||
int l;
|
|
||||||
|
|
||||||
for(l=0 ; l < pData[n].nPredecessors ; ++l)
|
|
||||||
if(pData[n].ppPredecessors[l] == &pData[k])
|
|
||||||
goto got_it;
|
|
||||||
pData[n].ppPredecessors[pData[n].nPredecessors]=&pData[k];
|
|
||||||
++pData[n].nPredecessors;
|
|
||||||
got_it:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
for(i=0 ; pItems[n].aszSuccessors && pItems[n].aszSuccessors[i] ; ++i)
|
|
||||||
for(k=0 ; k < nItems ; ++k)
|
|
||||||
if(!strcmp(pItems[k].szName,pItems[n].aszSuccessors[i])) {
|
|
||||||
int l;
|
|
||||||
|
|
||||||
for(l=0 ; l < pData[k].nPredecessors ; ++l)
|
|
||||||
if(pData[k].ppPredecessors[l] == &pData[n])
|
|
||||||
goto got_it2;
|
|
||||||
pData[k].ppPredecessors[pData[k].nPredecessors]=&pData[n];
|
|
||||||
++pData[k].nPredecessors;
|
|
||||||
got_it2:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return pData;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Topologically sort, dragging out-of-order items to the front. Note that
|
|
||||||
this tends to preserve things that want to be near the front better, and
|
|
||||||
changing that behaviour might compromise some of Apache's behaviour (in
|
|
||||||
particular, mod_log_forensic might otherwise get pushed to the end, and
|
|
||||||
core.c's log open function used to end up at the end when pushing items
|
|
||||||
to the back was the methedology). Also note that the algorithm could
|
|
||||||
go back to its original simplicity by sorting from the back instead of
|
|
||||||
the front.
|
|
||||||
*/
|
|
||||||
static TSort *tsort(TSort *pData,int nItems)
|
|
||||||
{
|
|
||||||
int nTotal;
|
|
||||||
TSort *pHead=NULL;
|
|
||||||
TSort *pTail=NULL;
|
|
||||||
|
|
||||||
for(nTotal=0 ; nTotal < nItems ; ++nTotal) {
|
|
||||||
int n,i,k;
|
|
||||||
|
|
||||||
for(n=0 ; ; ++n) {
|
|
||||||
if(n == nItems)
|
|
||||||
assert(0); /* we have a loop... */
|
|
||||||
if(!pData[n].pNext) {
|
|
||||||
if(pData[n].nPredecessors) {
|
|
||||||
for(k=0 ; ; ++k) {
|
|
||||||
assert(k < nItems);
|
|
||||||
if(pData[n].ppPredecessors[k])
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
for(i=0 ; ; ++i) {
|
|
||||||
assert(i < nItems);
|
|
||||||
if(&pData[i] == pData[n].ppPredecessors[k]) {
|
|
||||||
n=i-1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(pTail)
|
|
||||||
pTail->pNext=&pData[n];
|
|
||||||
else
|
|
||||||
pHead=&pData[n];
|
|
||||||
pTail=&pData[n];
|
|
||||||
pTail->pNext=pTail; /* fudge it so it looks linked */
|
|
||||||
for(i=0 ; i < nItems ; ++i)
|
|
||||||
for(k=0 ; k < nItems ; ++k)
|
|
||||||
if(pData[i].ppPredecessors[k] == &pData[n]) {
|
|
||||||
--pData[i].nPredecessors;
|
|
||||||
pData[i].ppPredecessors[k]=NULL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (pTail) {
|
|
||||||
pTail->pNext = NULL; /* unfudge the tail */
|
|
||||||
}
|
|
||||||
return pHead;
|
|
||||||
}
|
|
||||||
|
|
||||||
static apr_array_header_t *sort_hook(apr_array_header_t *pHooks,
|
|
||||||
const char *szName)
|
|
||||||
{
|
|
||||||
apr_pool_t *p;
|
|
||||||
TSort *pSort;
|
|
||||||
apr_array_header_t *pNew;
|
|
||||||
int n;
|
|
||||||
|
|
||||||
apr_pool_create(&p, apr_hook_global_pool);
|
|
||||||
pSort=prepare(p,(TSortData *)pHooks->elts,pHooks->nelts);
|
|
||||||
pSort=tsort(pSort,pHooks->nelts);
|
|
||||||
pNew=apr_array_make(apr_hook_global_pool,pHooks->nelts,sizeof(TSortData));
|
|
||||||
if(apr_hook_debug_enabled)
|
|
||||||
printf("Sorting %s:",szName);
|
|
||||||
for(n=0 ; pSort ; pSort=pSort->pNext,++n) {
|
|
||||||
TSortData *pHook;
|
|
||||||
assert(n < pHooks->nelts);
|
|
||||||
pHook=apr_array_push(pNew);
|
|
||||||
memcpy(pHook,pSort->pData,sizeof *pHook);
|
|
||||||
if(apr_hook_debug_enabled)
|
|
||||||
printf(" %s",pHook->szName);
|
|
||||||
}
|
|
||||||
if(apr_hook_debug_enabled)
|
|
||||||
fputc('\n',stdout);
|
|
||||||
return pNew;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef NETWARE
|
|
||||||
static apr_array_header_t *s_aHooksToSort;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
const char *szHookName;
|
|
||||||
apr_array_header_t **paHooks;
|
|
||||||
} HookSortEntry;
|
|
||||||
|
|
||||||
APU_DECLARE(void) apr_hook_sort_register(const char *szHookName,
|
|
||||||
apr_array_header_t **paHooks)
|
|
||||||
{
|
|
||||||
#ifdef NETWARE
|
|
||||||
get_apd
|
|
||||||
#endif
|
|
||||||
HookSortEntry *pEntry;
|
|
||||||
|
|
||||||
if(!s_aHooksToSort)
|
|
||||||
s_aHooksToSort=apr_array_make(apr_hook_global_pool,1,sizeof(HookSortEntry));
|
|
||||||
pEntry=apr_array_push(s_aHooksToSort);
|
|
||||||
pEntry->szHookName=szHookName;
|
|
||||||
pEntry->paHooks=paHooks;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(void) apr_hook_sort_all(void)
|
|
||||||
{
|
|
||||||
#ifdef NETWARE
|
|
||||||
get_apd
|
|
||||||
#endif
|
|
||||||
int n;
|
|
||||||
|
|
||||||
for(n=0 ; n < s_aHooksToSort->nelts ; ++n) {
|
|
||||||
HookSortEntry *pEntry=&((HookSortEntry *)s_aHooksToSort->elts)[n];
|
|
||||||
*pEntry->paHooks=sort_hook(*pEntry->paHooks,pEntry->szHookName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef NETWARE
|
|
||||||
static apr_hash_t *s_phOptionalHooks;
|
|
||||||
static apr_hash_t *s_phOptionalFunctions;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
APU_DECLARE(void) apr_hook_deregister_all(void)
|
|
||||||
{
|
|
||||||
#ifdef NETWARE
|
|
||||||
get_apd
|
|
||||||
#endif
|
|
||||||
int n;
|
|
||||||
|
|
||||||
for(n=0 ; n < s_aHooksToSort->nelts ; ++n) {
|
|
||||||
HookSortEntry *pEntry=&((HookSortEntry *)s_aHooksToSort->elts)[n];
|
|
||||||
*pEntry->paHooks=NULL;
|
|
||||||
}
|
|
||||||
s_aHooksToSort=NULL;
|
|
||||||
s_phOptionalHooks=NULL;
|
|
||||||
s_phOptionalFunctions=NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(void) apr_hook_debug_show(const char *szName,
|
|
||||||
const char * const *aszPre,
|
|
||||||
const char * const *aszSucc)
|
|
||||||
{
|
|
||||||
int nFirst;
|
|
||||||
|
|
||||||
printf(" Hooked %s",szName);
|
|
||||||
if(aszPre) {
|
|
||||||
fputs(" pre(",stdout);
|
|
||||||
nFirst=1;
|
|
||||||
while(*aszPre) {
|
|
||||||
if(!nFirst)
|
|
||||||
fputc(',',stdout);
|
|
||||||
nFirst=0;
|
|
||||||
fputs(*aszPre,stdout);
|
|
||||||
++aszPre;
|
|
||||||
}
|
|
||||||
fputc(')',stdout);
|
|
||||||
}
|
|
||||||
if(aszSucc) {
|
|
||||||
fputs(" succ(",stdout);
|
|
||||||
nFirst=1;
|
|
||||||
while(*aszSucc) {
|
|
||||||
if(!nFirst)
|
|
||||||
fputc(',',stdout);
|
|
||||||
nFirst=0;
|
|
||||||
fputs(*aszSucc,stdout);
|
|
||||||
++aszSucc;
|
|
||||||
}
|
|
||||||
fputc(')',stdout);
|
|
||||||
}
|
|
||||||
fputc('\n',stdout);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Optional hook support */
|
|
||||||
|
|
||||||
APR_DECLARE_EXTERNAL_HOOK(apr,APU,void,_optional,(void))
|
|
||||||
|
|
||||||
APU_DECLARE(apr_array_header_t *) apr_optional_hook_get(const char *szName)
|
|
||||||
{
|
|
||||||
#ifdef NETWARE
|
|
||||||
get_apd
|
|
||||||
#endif
|
|
||||||
apr_array_header_t **ppArray;
|
|
||||||
|
|
||||||
if(!s_phOptionalHooks)
|
|
||||||
return NULL;
|
|
||||||
ppArray=apr_hash_get(s_phOptionalHooks,szName,strlen(szName));
|
|
||||||
if(!ppArray)
|
|
||||||
return NULL;
|
|
||||||
return *ppArray;
|
|
||||||
}
|
|
||||||
|
|
||||||
APU_DECLARE(void) apr_optional_hook_add(const char *szName,void (*pfn)(void),
|
|
||||||
const char * const *aszPre,
|
|
||||||
const char * const *aszSucc,int nOrder)
|
|
||||||
{
|
|
||||||
#ifdef NETWARE
|
|
||||||
get_apd
|
|
||||||
#endif
|
|
||||||
apr_array_header_t *pArray=apr_optional_hook_get(szName);
|
|
||||||
apr_LINK__optional_t *pHook;
|
|
||||||
|
|
||||||
if(!pArray) {
|
|
||||||
apr_array_header_t **ppArray;
|
|
||||||
|
|
||||||
pArray=apr_array_make(apr_hook_global_pool,1,
|
|
||||||
sizeof(apr_LINK__optional_t));
|
|
||||||
if(!s_phOptionalHooks)
|
|
||||||
s_phOptionalHooks=apr_hash_make(apr_hook_global_pool);
|
|
||||||
ppArray=apr_palloc(apr_hook_global_pool,sizeof *ppArray);
|
|
||||||
*ppArray=pArray;
|
|
||||||
apr_hash_set(s_phOptionalHooks,szName,strlen(szName),ppArray);
|
|
||||||
apr_hook_sort_register(szName,ppArray);
|
|
||||||
}
|
|
||||||
pHook=apr_array_push(pArray);
|
|
||||||
pHook->pFunc=pfn;
|
|
||||||
pHook->aszPredecessors=aszPre;
|
|
||||||
pHook->aszSuccessors=aszSucc;
|
|
||||||
pHook->nOrder=nOrder;
|
|
||||||
pHook->szName=apr_hook_debug_current;
|
|
||||||
if(apr_hook_debug_enabled)
|
|
||||||
apr_hook_debug_show(szName,aszPre,aszSucc);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* optional function support */
|
|
||||||
|
|
||||||
APU_DECLARE(apr_opt_fn_t *) apr_dynamic_fn_retrieve(const char *szName)
|
|
||||||
{
|
|
||||||
#ifdef NETWARE
|
|
||||||
get_apd
|
|
||||||
#endif
|
|
||||||
if(!s_phOptionalFunctions)
|
|
||||||
return NULL;
|
|
||||||
return (void(*)(void))apr_hash_get(s_phOptionalFunctions,szName,strlen(szName));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Deprecated */
|
|
||||||
APU_DECLARE_NONSTD(void) apr_dynamic_fn_register(const char *szName,
|
|
||||||
apr_opt_fn_t *pfn)
|
|
||||||
{
|
|
||||||
#ifdef NETWARE
|
|
||||||
get_apd
|
|
||||||
#endif
|
|
||||||
if(!s_phOptionalFunctions)
|
|
||||||
s_phOptionalFunctions=apr_hash_make(apr_hook_global_pool);
|
|
||||||
apr_hash_set(s_phOptionalFunctions,szName,strlen(szName),(void *)pfn);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
void main()
|
|
||||||
{
|
|
||||||
const char *aszAPre[]={"b","c",NULL};
|
|
||||||
const char *aszBPost[]={"a",NULL};
|
|
||||||
const char *aszCPost[]={"b",NULL};
|
|
||||||
TSortData t1[]=
|
|
||||||
{
|
|
||||||
{ "a",aszAPre,NULL },
|
|
||||||
{ "b",NULL,aszBPost },
|
|
||||||
{ "c",NULL,aszCPost }
|
|
||||||
};
|
|
||||||
TSort *pResult;
|
|
||||||
|
|
||||||
pResult=prepare(t1,3);
|
|
||||||
pResult=tsort(pResult,3);
|
|
||||||
|
|
||||||
for( ; pResult ; pResult=pResult->pNext)
|
|
||||||
printf("%s\n",pResult->pData->szName);
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -1,128 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file apr_anylock.h
|
|
||||||
* @brief APR-Util transparent any lock flavor wrapper
|
|
||||||
*/
|
|
||||||
#ifndef APR_ANYLOCK_H
|
|
||||||
#define APR_ANYLOCK_H
|
|
||||||
|
|
||||||
#include "apr_proc_mutex.h"
|
|
||||||
#include "apr_thread_mutex.h"
|
|
||||||
#include "apr_thread_rwlock.h"
|
|
||||||
|
|
||||||
/** Structure that may contain any APR lock type */
|
|
||||||
typedef struct apr_anylock_t {
|
|
||||||
/** Indicates what type of lock is in lock */
|
|
||||||
enum tm_lock {
|
|
||||||
apr_anylock_none, /**< None */
|
|
||||||
apr_anylock_procmutex, /**< Process-based */
|
|
||||||
apr_anylock_threadmutex, /**< Thread-based */
|
|
||||||
apr_anylock_readlock, /**< Read lock */
|
|
||||||
apr_anylock_writelock /**< Write lock */
|
|
||||||
} type;
|
|
||||||
/** Union of all possible APR locks */
|
|
||||||
union apr_anylock_u_t {
|
|
||||||
apr_proc_mutex_t *pm; /**< Process mutex */
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
apr_thread_mutex_t *tm; /**< Thread mutex */
|
|
||||||
apr_thread_rwlock_t *rw; /**< Read-write lock */
|
|
||||||
#endif
|
|
||||||
} lock;
|
|
||||||
} apr_anylock_t;
|
|
||||||
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
|
|
||||||
/** Lock an apr_anylock_t structure */
|
|
||||||
#define APR_ANYLOCK_LOCK(lck) \
|
|
||||||
(((lck)->type == apr_anylock_none) \
|
|
||||||
? APR_SUCCESS \
|
|
||||||
: (((lck)->type == apr_anylock_threadmutex) \
|
|
||||||
? apr_thread_mutex_lock((lck)->lock.tm) \
|
|
||||||
: (((lck)->type == apr_anylock_procmutex) \
|
|
||||||
? apr_proc_mutex_lock((lck)->lock.pm) \
|
|
||||||
: (((lck)->type == apr_anylock_readlock) \
|
|
||||||
? apr_thread_rwlock_rdlock((lck)->lock.rw) \
|
|
||||||
: (((lck)->type == apr_anylock_writelock) \
|
|
||||||
? apr_thread_rwlock_wrlock((lck)->lock.rw) \
|
|
||||||
: APR_EINVAL)))))
|
|
||||||
|
|
||||||
#else /* APR_HAS_THREADS */
|
|
||||||
|
|
||||||
#define APR_ANYLOCK_LOCK(lck) \
|
|
||||||
(((lck)->type == apr_anylock_none) \
|
|
||||||
? APR_SUCCESS \
|
|
||||||
: (((lck)->type == apr_anylock_procmutex) \
|
|
||||||
? apr_proc_mutex_lock((lck)->lock.pm) \
|
|
||||||
: APR_EINVAL))
|
|
||||||
|
|
||||||
#endif /* APR_HAS_THREADS */
|
|
||||||
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
|
|
||||||
/** Try to lock an apr_anylock_t structure */
|
|
||||||
#define APR_ANYLOCK_TRYLOCK(lck) \
|
|
||||||
(((lck)->type == apr_anylock_none) \
|
|
||||||
? APR_SUCCESS \
|
|
||||||
: (((lck)->type == apr_anylock_threadmutex) \
|
|
||||||
? apr_thread_mutex_trylock((lck)->lock.tm) \
|
|
||||||
: (((lck)->type == apr_anylock_procmutex) \
|
|
||||||
? apr_proc_mutex_trylock((lck)->lock.pm) \
|
|
||||||
: (((lck)->type == apr_anylock_readlock) \
|
|
||||||
? apr_thread_rwlock_tryrdlock((lck)->lock.rw) \
|
|
||||||
: (((lck)->type == apr_anylock_writelock) \
|
|
||||||
? apr_thread_rwlock_trywrlock((lck)->lock.rw) \
|
|
||||||
: APR_EINVAL)))))
|
|
||||||
|
|
||||||
#else /* APR_HAS_THREADS */
|
|
||||||
|
|
||||||
#define APR_ANYLOCK_TRYLOCK(lck) \
|
|
||||||
(((lck)->type == apr_anylock_none) \
|
|
||||||
? APR_SUCCESS \
|
|
||||||
: (((lck)->type == apr_anylock_procmutex) \
|
|
||||||
? apr_proc_mutex_trylock((lck)->lock.pm) \
|
|
||||||
: APR_EINVAL))
|
|
||||||
|
|
||||||
#endif /* APR_HAS_THREADS */
|
|
||||||
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
|
|
||||||
/** Unlock an apr_anylock_t structure */
|
|
||||||
#define APR_ANYLOCK_UNLOCK(lck) \
|
|
||||||
(((lck)->type == apr_anylock_none) \
|
|
||||||
? APR_SUCCESS \
|
|
||||||
: (((lck)->type == apr_anylock_threadmutex) \
|
|
||||||
? apr_thread_mutex_unlock((lck)->lock.tm) \
|
|
||||||
: (((lck)->type == apr_anylock_procmutex) \
|
|
||||||
? apr_proc_mutex_unlock((lck)->lock.pm) \
|
|
||||||
: ((((lck)->type == apr_anylock_readlock) || \
|
|
||||||
((lck)->type == apr_anylock_writelock)) \
|
|
||||||
? apr_thread_rwlock_unlock((lck)->lock.rw) \
|
|
||||||
: APR_EINVAL))))
|
|
||||||
|
|
||||||
#else /* APR_HAS_THREADS */
|
|
||||||
|
|
||||||
#define APR_ANYLOCK_UNLOCK(lck) \
|
|
||||||
(((lck)->type == apr_anylock_none) \
|
|
||||||
? APR_SUCCESS \
|
|
||||||
: (((lck)->type == apr_anylock_procmutex) \
|
|
||||||
? apr_proc_mutex_unlock((lck)->lock.pm) \
|
|
||||||
: APR_EINVAL))
|
|
||||||
|
|
||||||
#endif /* APR_HAS_THREADS */
|
|
||||||
|
|
||||||
#endif /* !APR_ANYLOCK_H */
|
|
|
@ -1,111 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
* The apr_vsnprintf/apr_snprintf functions are based on, and used with the
|
|
||||||
* permission of, the SIO stdio-replacement strx_* functions by Panos
|
|
||||||
* Tsirigotis <panos@alumni.cs.colorado.edu> for xinetd.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file apr_base64.h
|
|
||||||
* @brief APR-UTIL Base64 Encoding
|
|
||||||
*/
|
|
||||||
#ifndef APR_BASE64_H
|
|
||||||
#define APR_BASE64_H
|
|
||||||
|
|
||||||
#include "apu.h"
|
|
||||||
#include "apr_general.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup APR_Util_Base64 Base64 Encoding
|
|
||||||
* @ingroup APR_Util
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Simple BASE64 encode/decode functions.
|
|
||||||
*
|
|
||||||
* As we might encode binary strings, hence we require the length of
|
|
||||||
* the incoming plain source. And return the length of what we decoded.
|
|
||||||
*
|
|
||||||
* The decoding function takes any non valid char (i.e. whitespace, \0
|
|
||||||
* or anything non A-Z,0-9 etc as terminal.
|
|
||||||
*
|
|
||||||
* plain strings/binary sequences are not assumed '\0' terminated. Encoded
|
|
||||||
* strings are neither. But probably should.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Given the length of an un-encrypted string, get the length of the
|
|
||||||
* encrypted string.
|
|
||||||
* @param len the length of an unencrypted string.
|
|
||||||
* @return the length of the string after it is encrypted
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_base64_encode_len(int len);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Encode a text string using base64encoding.
|
|
||||||
* @param coded_dst The destination string for the encoded string.
|
|
||||||
* @param plain_src The original string in plain text
|
|
||||||
* @param len_plain_src The length of the plain text string
|
|
||||||
* @return the length of the encoded string
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_base64_encode(char * coded_dst, const char *plain_src,
|
|
||||||
int len_plain_src);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Encode an EBCDIC string using base64encoding.
|
|
||||||
* @param coded_dst The destination string for the encoded string.
|
|
||||||
* @param plain_src The original string in plain text
|
|
||||||
* @param len_plain_src The length of the plain text string
|
|
||||||
* @return the length of the encoded string
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_base64_encode_binary(char * coded_dst,
|
|
||||||
const unsigned char *plain_src,
|
|
||||||
int len_plain_src);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Determine the length of a plain text string given the encoded version
|
|
||||||
* @param coded_src The encoded string
|
|
||||||
* @return the length of the plain text string
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_base64_decode_len(const char * coded_src);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Decode a string to plain text
|
|
||||||
* @param plain_dst The destination string for the plain text
|
|
||||||
* @param coded_src The encoded string
|
|
||||||
* @return the length of the plain text string
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_base64_decode(char * plain_dst, const char *coded_src);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Decode an EBCDIC string to plain text
|
|
||||||
* @param plain_dst The destination string for the plain text
|
|
||||||
* @param coded_src The encoded string
|
|
||||||
* @return the length of the plain text string
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_base64_decode_binary(unsigned char * plain_dst,
|
|
||||||
const char *coded_src);
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* !APR_BASE64_H */
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,106 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef APR_DATE_H
|
|
||||||
#define APR_DATE_H
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file apr_date.h
|
|
||||||
* @brief APR-UTIL date routines
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup APR_Util_Date Date routines
|
|
||||||
* @ingroup APR_Util
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* apr_date.h: prototypes for date parsing utility routines
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apu.h"
|
|
||||||
#include "apr_time.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** A bad date. */
|
|
||||||
#define APR_DATE_BAD ((apr_time_t)0)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Compare a string to a mask
|
|
||||||
* @param data The string to compare
|
|
||||||
* @param mask Mask characters (arbitrary maximum is 256 characters):
|
|
||||||
* <PRE>
|
|
||||||
* '\@' - uppercase letter
|
|
||||||
* '\$' - lowercase letter
|
|
||||||
* '\&' - hex digit
|
|
||||||
* '#' - digit
|
|
||||||
* '~' - digit or space
|
|
||||||
* '*' - swallow remaining characters
|
|
||||||
* </PRE>
|
|
||||||
* @remark The mask tests for an exact match for any other character
|
|
||||||
* @return 1 if the string matches, 0 otherwise
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_date_checkmask(const char *data, const char *mask);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parses an HTTP date in one of three standard forms:
|
|
||||||
* <PRE>
|
|
||||||
* Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123
|
|
||||||
* Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
|
|
||||||
* Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format
|
|
||||||
* </PRE>
|
|
||||||
* @param date The date in one of the three formats above
|
|
||||||
* @return the apr_time_t number of microseconds since 1 Jan 1970 GMT, or
|
|
||||||
* 0 if this would be out of range or if the date is invalid.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_time_t) apr_date_parse_http(const char *date);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parses a string resembling an RFC 822 date. This is meant to be
|
|
||||||
* leinent in its parsing of dates. Hence, this will parse a wider
|
|
||||||
* range of dates than apr_date_parse_http.
|
|
||||||
*
|
|
||||||
* The prominent mailer (or poster, if mailer is unknown) that has
|
|
||||||
* been seen in the wild is included for the unknown formats.
|
|
||||||
* <PRE>
|
|
||||||
* Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123
|
|
||||||
* Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
|
|
||||||
* Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format
|
|
||||||
* Sun, 6 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123
|
|
||||||
* Sun, 06 Nov 94 08:49:37 GMT ; RFC 822
|
|
||||||
* Sun, 6 Nov 94 08:49:37 GMT ; RFC 822
|
|
||||||
* Sun, 06 Nov 94 08:49 GMT ; Unknown [drtr\@ast.cam.ac.uk]
|
|
||||||
* Sun, 6 Nov 94 08:49 GMT ; Unknown [drtr\@ast.cam.ac.uk]
|
|
||||||
* Sun, 06 Nov 94 8:49:37 GMT ; Unknown [Elm 70.85]
|
|
||||||
* Sun, 6 Nov 94 8:49:37 GMT ; Unknown [Elm 70.85]
|
|
||||||
* </PRE>
|
|
||||||
*
|
|
||||||
* @param date The date in one of the formats above
|
|
||||||
* @return the apr_time_t number of microseconds since 1 Jan 1970 GMT, or
|
|
||||||
* 0 if this would be out of range or if the date is invalid.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_time_t) apr_date_parse_rfc(const char *date);
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* !APR_DATE_H */
|
|
|
@ -1,357 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Overview of what this is and does:
|
|
||||||
* http://www.apache.org/~niq/dbd.html
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef APR_DBD_H
|
|
||||||
#define APR_DBD_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file apr_dbd.h
|
|
||||||
* @brief APR-UTIL DBD library
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @defgroup APR_Util_DBD DBD routines
|
|
||||||
* @ingroup APR_Util
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* These are opaque structs. Instantiation is up to each backend */
|
|
||||||
typedef struct apr_dbd_driver_t apr_dbd_driver_t;
|
|
||||||
typedef struct apr_dbd_t apr_dbd_t;
|
|
||||||
typedef struct apr_dbd_transaction_t apr_dbd_transaction_t;
|
|
||||||
typedef struct apr_dbd_results_t apr_dbd_results_t;
|
|
||||||
typedef struct apr_dbd_row_t apr_dbd_row_t;
|
|
||||||
typedef struct apr_dbd_prepared_t apr_dbd_prepared_t;
|
|
||||||
|
|
||||||
/** apr_dbd_init: perform once-only initialisation. Call once only.
|
|
||||||
*
|
|
||||||
* @param pool - pool to register any shutdown cleanups, etc
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_dbd_init(apr_pool_t *pool);
|
|
||||||
|
|
||||||
/** apr_dbd_get_driver: get the driver struct for a name
|
|
||||||
*
|
|
||||||
* @param pool - (process) pool to register cleanup
|
|
||||||
* @param name - driver name
|
|
||||||
* @param driver - pointer to driver struct.
|
|
||||||
* @return APR_SUCCESS for success
|
|
||||||
* @return APR_ENOTIMPL for no driver (when DSO not enabled)
|
|
||||||
* @return APR_EDSOOPEN if DSO driver file can't be opened
|
|
||||||
* @return APR_ESYMNOTFOUND if the driver file doesn't contain a driver
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_dbd_get_driver(apr_pool_t *pool, const char *name,
|
|
||||||
const apr_dbd_driver_t **driver);
|
|
||||||
|
|
||||||
/** apr_dbd_open: open a connection to a backend
|
|
||||||
*
|
|
||||||
* @param pool - working pool
|
|
||||||
* @param params - arguments to driver (implementation-dependent)
|
|
||||||
* @param handle - pointer to handle to return
|
|
||||||
* @param driver - driver struct.
|
|
||||||
* @return APR_SUCCESS for success
|
|
||||||
* @return APR_EGENERAL if driver exists but connection failed
|
|
||||||
* @remarks PostgreSQL: the params is passed directly to the PQconnectdb()
|
|
||||||
* function (check PostgreSQL documentation for more details on the syntax).
|
|
||||||
* @remarks SQLite2: the params is split on a colon, with the first part used
|
|
||||||
* as the filename and second part converted to an integer and used as file
|
|
||||||
* mode.
|
|
||||||
* @remarks SQLite3: the params is passed directly to the sqlite3_open()
|
|
||||||
* function as a filename to be opened (check SQLite3 documentation for more
|
|
||||||
* details).
|
|
||||||
* @remarks MySQL: the params can have "host", "port", "user", "pass",
|
|
||||||
* "dbname", "sock", "flags" and "fldsz" keys, each followed by an equal sign
|
|
||||||
* and a value. Such key/value pairs can be delimited by space, CR, LF, tab,
|
|
||||||
* semicolon, vertical bar or comma. For now, "flags" can only recognise
|
|
||||||
* CLIENT_FOUND_ROWS (check MySQL manual for details). The value associated
|
|
||||||
* with "fldsz" determines maximum amount of memory (in bytes) for each of
|
|
||||||
* the fields in the result set of prepared statements. By default, this
|
|
||||||
* value is 1 MB.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_dbd_open(const apr_dbd_driver_t *driver,
|
|
||||||
apr_pool_t *pool, const char *params,
|
|
||||||
apr_dbd_t **handle);
|
|
||||||
|
|
||||||
/** apr_dbd_close: close a connection to a backend
|
|
||||||
*
|
|
||||||
* @param handle - handle to close
|
|
||||||
* @param driver - driver struct.
|
|
||||||
* @return APR_SUCCESS for success or error status
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_dbd_close(const apr_dbd_driver_t *driver,
|
|
||||||
apr_dbd_t *handle);
|
|
||||||
|
|
||||||
/* apr-function-shaped versions of things */
|
|
||||||
|
|
||||||
/** apr_dbd_name: get the name of the driver
|
|
||||||
*
|
|
||||||
* @param driver - the driver
|
|
||||||
* @return - name
|
|
||||||
*/
|
|
||||||
APU_DECLARE(const char*) apr_dbd_name(const apr_dbd_driver_t *driver);
|
|
||||||
|
|
||||||
/** apr_dbd_native_handle: get native database handle of the underlying db
|
|
||||||
*
|
|
||||||
* @param driver - the driver
|
|
||||||
* @param handle - apr_dbd handle
|
|
||||||
* @return - native handle
|
|
||||||
*/
|
|
||||||
APU_DECLARE(void*) apr_dbd_native_handle(const apr_dbd_driver_t *driver,
|
|
||||||
apr_dbd_t *handle);
|
|
||||||
|
|
||||||
/** check_conn: check status of a database connection
|
|
||||||
*
|
|
||||||
* @param driver - the driver
|
|
||||||
* @param pool - working pool
|
|
||||||
* @param handle - the connection to check
|
|
||||||
* @return APR_SUCCESS or error
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_dbd_check_conn(const apr_dbd_driver_t *driver, apr_pool_t *pool,
|
|
||||||
apr_dbd_t *handle);
|
|
||||||
|
|
||||||
/** apr_dbd_set_dbname: select database name. May be a no-op if not supported.
|
|
||||||
*
|
|
||||||
* @param driver - the driver
|
|
||||||
* @param pool - working pool
|
|
||||||
* @param handle - the connection
|
|
||||||
* @param name - the database to select
|
|
||||||
* @return 0 for success or error code
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_dbd_set_dbname(const apr_dbd_driver_t *driver, apr_pool_t *pool,
|
|
||||||
apr_dbd_t *handle, const char *name);
|
|
||||||
|
|
||||||
/** apr_dbd_transaction_start: start a transaction. May be a no-op.
|
|
||||||
*
|
|
||||||
* @param driver - the driver
|
|
||||||
* @param pool - a pool to use for error messages (if any).
|
|
||||||
* @param handle - the db connection
|
|
||||||
* @param trans - ptr to a transaction. May be null on entry
|
|
||||||
* @return 0 for success or error code
|
|
||||||
* @remarks If any of the query/select calls during a transaction return
|
|
||||||
* non-zero status code, the transaction will inherit this code and any
|
|
||||||
* further query/select calls will fail immediately.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_dbd_transaction_start(const apr_dbd_driver_t *driver,
|
|
||||||
apr_pool_t *pool,
|
|
||||||
apr_dbd_t *handle,
|
|
||||||
apr_dbd_transaction_t **trans);
|
|
||||||
|
|
||||||
/** apr_dbd_transaction_end: end a transaction
|
|
||||||
* (commit on success, rollback on error).
|
|
||||||
* May be a no-op.
|
|
||||||
*
|
|
||||||
* @param driver - the driver
|
|
||||||
* @param handle - the db connection
|
|
||||||
* @param trans - the transaction.
|
|
||||||
* @return 0 for success or error code
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_dbd_transaction_end(const apr_dbd_driver_t *driver,
|
|
||||||
apr_pool_t *pool,
|
|
||||||
apr_dbd_transaction_t *trans);
|
|
||||||
|
|
||||||
/** apr_dbd_query: execute an SQL query that doesn't return a result set
|
|
||||||
*
|
|
||||||
* @param driver - the driver
|
|
||||||
* @param handle - the connection
|
|
||||||
* @param nrows - number of rows affected.
|
|
||||||
* @param statement - the SQL statement to execute
|
|
||||||
* @return 0 for success or error code
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_dbd_query(const apr_dbd_driver_t *driver, apr_dbd_t *handle,
|
|
||||||
int *nrows, const char *statement);
|
|
||||||
|
|
||||||
/** apr_dbd_select: execute an SQL query that returns a result set
|
|
||||||
*
|
|
||||||
* @param driver - the driver
|
|
||||||
* @param pool - pool to allocate the result set
|
|
||||||
* @param handle - the connection
|
|
||||||
* @param res - pointer to result set pointer. May point to NULL on entry
|
|
||||||
* @param statement - the SQL statement to execute
|
|
||||||
* @param random - 1 to support random access to results (seek any row);
|
|
||||||
* 0 to support only looping through results in order
|
|
||||||
* (async access - faster)
|
|
||||||
* @return 0 for success or error code
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_dbd_select(const apr_dbd_driver_t *driver, apr_pool_t *pool,
|
|
||||||
apr_dbd_t *handle, apr_dbd_results_t **res,
|
|
||||||
const char *statement, int random);
|
|
||||||
|
|
||||||
/** apr_dbd_num_cols: get the number of columns in a results set
|
|
||||||
*
|
|
||||||
* @param driver - the driver
|
|
||||||
* @param res - result set.
|
|
||||||
* @return number of columns
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_dbd_num_cols(const apr_dbd_driver_t *driver,
|
|
||||||
apr_dbd_results_t *res);
|
|
||||||
|
|
||||||
/** apr_dbd_num_tuples: get the number of rows in a results set
|
|
||||||
* of a synchronous select
|
|
||||||
*
|
|
||||||
* @param driver - the driver
|
|
||||||
* @param res - result set.
|
|
||||||
* @return number of rows, or -1 if the results are asynchronous
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_dbd_num_tuples(const apr_dbd_driver_t *driver,
|
|
||||||
apr_dbd_results_t *res);
|
|
||||||
|
|
||||||
/** apr_dbd_get_row: get a row from a result set
|
|
||||||
*
|
|
||||||
* @param driver - the driver
|
|
||||||
* @param pool - pool to allocate the row
|
|
||||||
* @param res - result set pointer
|
|
||||||
* @param row - pointer to row pointer. May point to NULL on entry
|
|
||||||
* @param rownum - row number, or -1 for "next row". Ignored if random
|
|
||||||
* access is not supported.
|
|
||||||
* @return 0 for success, -1 for rownum out of range or data finished
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_dbd_get_row(const apr_dbd_driver_t *driver, apr_pool_t *pool,
|
|
||||||
apr_dbd_results_t *res, apr_dbd_row_t **row,
|
|
||||||
int rownum);
|
|
||||||
|
|
||||||
/** apr_dbd_get_entry: get an entry from a row
|
|
||||||
*
|
|
||||||
* @param driver - the driver
|
|
||||||
* @param row - row pointer
|
|
||||||
* @param col - entry number
|
|
||||||
* @return value from the row, or NULL if col is out of bounds.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(const char*) apr_dbd_get_entry(const apr_dbd_driver_t *driver,
|
|
||||||
apr_dbd_row_t *row, int col);
|
|
||||||
|
|
||||||
/** apr_dbd_error: get current error message (if any)
|
|
||||||
*
|
|
||||||
* @param driver - the driver
|
|
||||||
* @param handle - the connection
|
|
||||||
* @param errnum - error code from operation that returned an error
|
|
||||||
* @return the database current error message, or message for errnum
|
|
||||||
* (implementation-dependent whether errnum is ignored)
|
|
||||||
*/
|
|
||||||
APU_DECLARE(const char*) apr_dbd_error(const apr_dbd_driver_t *driver,
|
|
||||||
apr_dbd_t *handle, int errnum);
|
|
||||||
|
|
||||||
/** apr_dbd_escape: escape a string so it is safe for use in query/select
|
|
||||||
*
|
|
||||||
* @param driver - the driver
|
|
||||||
* @param pool - pool to alloc the result from
|
|
||||||
* @param string - the string to escape
|
|
||||||
* @param handle - the connection
|
|
||||||
* @return the escaped, safe string
|
|
||||||
*/
|
|
||||||
APU_DECLARE(const char*) apr_dbd_escape(const apr_dbd_driver_t *driver,
|
|
||||||
apr_pool_t *pool, const char *string,
|
|
||||||
apr_dbd_t *handle);
|
|
||||||
|
|
||||||
/** apr_dbd_prepare: prepare a statement
|
|
||||||
*
|
|
||||||
* @param driver - the driver
|
|
||||||
* @param pool - pool to alloc the result from
|
|
||||||
* @param handle - the connection
|
|
||||||
* @param query - the SQL query
|
|
||||||
* @param label - A label for the prepared statement.
|
|
||||||
* use NULL for temporary prepared statements
|
|
||||||
* (eg within a Request in httpd)
|
|
||||||
* @param statement - statement to prepare. May point to null on entry.
|
|
||||||
* @return 0 for success or error code
|
|
||||||
* @remarks To specify parameters of the prepared query, use %s in place of
|
|
||||||
* database specific parameter syntax (e.g. for PostgreSQL, this would be $1,
|
|
||||||
* $2, for SQLite3 this would be ? etc.). For instance: "SELECT name FROM
|
|
||||||
* customers WHERE name=%s" would be a query that this function understands.
|
|
||||||
* Some drivers may support different data types using printf-like format:
|
|
||||||
* for example %d (e.g. PostgreSQL) or %f for numeric data.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_dbd_prepare(const apr_dbd_driver_t *driver, apr_pool_t *pool,
|
|
||||||
apr_dbd_t *handle, const char *query,
|
|
||||||
const char *label,
|
|
||||||
apr_dbd_prepared_t **statement);
|
|
||||||
|
|
||||||
|
|
||||||
/** apr_dbd_pquery: query using a prepared statement + args
|
|
||||||
*
|
|
||||||
* @param driver - the driver
|
|
||||||
* @param pool - working pool
|
|
||||||
* @param handle - the connection
|
|
||||||
* @param nrows - number of rows affected.
|
|
||||||
* @param statement - the prepared statement to execute
|
|
||||||
* @param nargs - number of args to prepared statement
|
|
||||||
* @param args - args to prepared statement
|
|
||||||
* @return 0 for success or error code
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_dbd_pquery(const apr_dbd_driver_t *driver, apr_pool_t *pool,
|
|
||||||
apr_dbd_t *handle, int *nrows,
|
|
||||||
apr_dbd_prepared_t *statement, int nargs,
|
|
||||||
const char **args);
|
|
||||||
|
|
||||||
/** apr_dbd_pselect: select using a prepared statement + args
|
|
||||||
*
|
|
||||||
* @param driver - the driver
|
|
||||||
* @param pool - working pool
|
|
||||||
* @param handle - the connection
|
|
||||||
* @param res - pointer to query results. May point to NULL on entry
|
|
||||||
* @param statement - the prepared statement to execute
|
|
||||||
* @param random - Whether to support random-access to results
|
|
||||||
* @param nargs - number of args to prepared statement
|
|
||||||
* @param args - args to prepared statement
|
|
||||||
* @return 0 for success or error code
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_dbd_pselect(const apr_dbd_driver_t *driver, apr_pool_t *pool,
|
|
||||||
apr_dbd_t *handle, apr_dbd_results_t **res,
|
|
||||||
apr_dbd_prepared_t *statement, int random,
|
|
||||||
int nargs, const char **args);
|
|
||||||
|
|
||||||
/** apr_dbd_pvquery: query using a prepared statement + args
|
|
||||||
*
|
|
||||||
* @param driver - the driver
|
|
||||||
* @param pool - working pool
|
|
||||||
* @param handle - the connection
|
|
||||||
* @param nrows - number of rows affected.
|
|
||||||
* @param statement - the prepared statement to execute
|
|
||||||
* @param ... - varargs list
|
|
||||||
* @return 0 for success or error code
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_dbd_pvquery(const apr_dbd_driver_t *driver, apr_pool_t *pool,
|
|
||||||
apr_dbd_t *handle, int *nrows,
|
|
||||||
apr_dbd_prepared_t *statement, ...);
|
|
||||||
|
|
||||||
/** apr_dbd_pvselect: select using a prepared statement + args
|
|
||||||
*
|
|
||||||
* @param driver - the driver
|
|
||||||
* @param pool - working pool
|
|
||||||
* @param handle - the connection
|
|
||||||
* @param res - pointer to query results. May point to NULL on entry
|
|
||||||
* @param statement - the prepared statement to execute
|
|
||||||
* @param random - Whether to support random-access to results
|
|
||||||
* @param ... - varargs list
|
|
||||||
* @return 0 for success or error code
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_dbd_pvselect(const apr_dbd_driver_t *driver, apr_pool_t *pool,
|
|
||||||
apr_dbd_t *handle, apr_dbd_results_t **res,
|
|
||||||
apr_dbd_prepared_t *statement, int random,
|
|
||||||
...);
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,224 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef APR_DBM_H
|
|
||||||
#define APR_DBM_H
|
|
||||||
|
|
||||||
#include "apu.h"
|
|
||||||
#include "apr.h"
|
|
||||||
#include "apr_errno.h"
|
|
||||||
#include "apr_pools.h"
|
|
||||||
#include "apr_file_info.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file apr_dbm.h
|
|
||||||
* @brief APR-UTIL DBM library
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @defgroup APR_Util_DBM DBM routines
|
|
||||||
* @ingroup APR_Util
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* Structure for referencing a dbm
|
|
||||||
*/
|
|
||||||
typedef struct apr_dbm_t apr_dbm_t;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Structure for referencing the datum record within a dbm
|
|
||||||
*/
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
/** pointer to the 'data' to retrieve/store in the DBM */
|
|
||||||
char *dptr;
|
|
||||||
/** size of the 'data' to retrieve/store in the DBM */
|
|
||||||
apr_size_t dsize;
|
|
||||||
} apr_datum_t;
|
|
||||||
|
|
||||||
/* modes to open the DB */
|
|
||||||
#define APR_DBM_READONLY 1 /**< open for read-only access */
|
|
||||||
#define APR_DBM_READWRITE 2 /**< open for read-write access */
|
|
||||||
#define APR_DBM_RWCREATE 3 /**< open for r/w, create if needed */
|
|
||||||
#define APR_DBM_RWTRUNC 4 /**< open for r/w, truncating an existing
|
|
||||||
DB if present */
|
|
||||||
/**
|
|
||||||
* Open a dbm file by file name and type of DBM
|
|
||||||
* @param dbm The newly opened database
|
|
||||||
* @param type The type of the DBM (not all may be available at run time)
|
|
||||||
* <pre>
|
|
||||||
* GDBM for GDBM files
|
|
||||||
* SDBM for SDBM files
|
|
||||||
* DB for berkeley DB files
|
|
||||||
* NDBM for NDBM files
|
|
||||||
* default for the default DBM type
|
|
||||||
* </pre>
|
|
||||||
* @param name The dbm file name to open
|
|
||||||
* @param mode The flag value
|
|
||||||
* <PRE>
|
|
||||||
* APR_DBM_READONLY open for read-only access
|
|
||||||
* APR_DBM_READWRITE open for read-write access
|
|
||||||
* APR_DBM_RWCREATE open for r/w, create if needed
|
|
||||||
* APR_DBM_RWTRUNC open for r/w, truncate if already there
|
|
||||||
* </PRE>
|
|
||||||
* @param perm Permissions to apply to if created
|
|
||||||
* @param cntxt The pool to use when creating the dbm
|
|
||||||
* @remark The dbm name may not be a true file name, as many dbm packages
|
|
||||||
* append suffixes for seperate data and index files.
|
|
||||||
*/
|
|
||||||
|
|
||||||
APU_DECLARE(apr_status_t) apr_dbm_open_ex(apr_dbm_t **dbm, const char* type,
|
|
||||||
const char *name,
|
|
||||||
apr_int32_t mode, apr_fileperms_t perm,
|
|
||||||
apr_pool_t *cntxt);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Open a dbm file by file name
|
|
||||||
* @param dbm The newly opened database
|
|
||||||
* @param name The dbm file name to open
|
|
||||||
* @param mode The flag value
|
|
||||||
* <PRE>
|
|
||||||
* APR_DBM_READONLY open for read-only access
|
|
||||||
* APR_DBM_READWRITE open for read-write access
|
|
||||||
* APR_DBM_RWCREATE open for r/w, create if needed
|
|
||||||
* APR_DBM_RWTRUNC open for r/w, truncate if already there
|
|
||||||
* </PRE>
|
|
||||||
* @param perm Permissions to apply to if created
|
|
||||||
* @param cntxt The pool to use when creating the dbm
|
|
||||||
* @remark The dbm name may not be a true file name, as many dbm packages
|
|
||||||
* append suffixes for seperate data and index files.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_dbm_open(apr_dbm_t **dbm, const char *name,
|
|
||||||
apr_int32_t mode, apr_fileperms_t perm,
|
|
||||||
apr_pool_t *cntxt);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Close a dbm file previously opened by apr_dbm_open
|
|
||||||
* @param dbm The database to close
|
|
||||||
*/
|
|
||||||
APU_DECLARE(void) apr_dbm_close(apr_dbm_t *dbm);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fetch a dbm record value by key
|
|
||||||
* @param dbm The database
|
|
||||||
* @param key The key datum to find this record
|
|
||||||
* @param pvalue The value datum retrieved for this record
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_dbm_fetch(apr_dbm_t *dbm, apr_datum_t key,
|
|
||||||
apr_datum_t *pvalue);
|
|
||||||
/**
|
|
||||||
* Store a dbm record value by key
|
|
||||||
* @param dbm The database
|
|
||||||
* @param key The key datum to store this record by
|
|
||||||
* @param value The value datum to store in this record
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_dbm_store(apr_dbm_t *dbm, apr_datum_t key,
|
|
||||||
apr_datum_t value);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete a dbm record value by key
|
|
||||||
* @param dbm The database
|
|
||||||
* @param key The key datum of the record to delete
|
|
||||||
* @remark It is not an error to delete a non-existent record.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_dbm_delete(apr_dbm_t *dbm, apr_datum_t key);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Search for a key within the dbm
|
|
||||||
* @param dbm The database
|
|
||||||
* @param key The datum describing a key to test
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_dbm_exists(apr_dbm_t *dbm, apr_datum_t key);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve the first record key from a dbm
|
|
||||||
* @param dbm The database
|
|
||||||
* @param pkey The key datum of the first record
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_dbm_firstkey(apr_dbm_t *dbm, apr_datum_t *pkey);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve the next record key from a dbm
|
|
||||||
* @param dbm The database
|
|
||||||
* @param pkey The key datum of the next record
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_dbm_nextkey(apr_dbm_t *dbm, apr_datum_t *pkey);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Proactively toss any memory associated with the apr_datum_t.
|
|
||||||
* @param dbm The database
|
|
||||||
* @param data The datum to free.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(void) apr_dbm_freedatum(apr_dbm_t *dbm, apr_datum_t data);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Report more information when an apr_dbm function fails.
|
|
||||||
* @param dbm The database
|
|
||||||
* @param errcode A DBM-specific value for the error (for logging). If this
|
|
||||||
* isn't needed, it may be NULL.
|
|
||||||
* @param errbuf Location to store the error text
|
|
||||||
* @param errbufsize The size of the provided buffer
|
|
||||||
* @return The errbuf parameter, for convenience.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(char *) apr_dbm_geterror(apr_dbm_t *dbm, int *errcode,
|
|
||||||
char *errbuf, apr_size_t errbufsize);
|
|
||||||
/**
|
|
||||||
* If the specified file/path were passed to apr_dbm_open(), return the
|
|
||||||
* actual file/path names which would be (created and) used. At most, two
|
|
||||||
* files may be used; used2 may be NULL if only one file is used.
|
|
||||||
* @param pool The pool for allocating used1 and used2.
|
|
||||||
* @param type The type of DBM you require info on
|
|
||||||
* @param pathname The path name to generate used-names from.
|
|
||||||
* @param used1 The first pathname used by the apr_dbm implementation.
|
|
||||||
* @param used2 The second pathname used by apr_dbm. If only one file is
|
|
||||||
* used by the specific implementation, this will be set to NULL.
|
|
||||||
* @return An error if the specified type is invalid.
|
|
||||||
* @remark The dbm file(s) don't need to exist. This function only manipulates
|
|
||||||
* the pathnames.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_dbm_get_usednames_ex(apr_pool_t *pool,
|
|
||||||
const char *type,
|
|
||||||
const char *pathname,
|
|
||||||
const char **used1,
|
|
||||||
const char **used2);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* If the specified file/path were passed to apr_dbm_open(), return the
|
|
||||||
* actual file/path names which would be (created and) used. At most, two
|
|
||||||
* files may be used; used2 may be NULL if only one file is used.
|
|
||||||
* @param pool The pool for allocating used1 and used2.
|
|
||||||
* @param pathname The path name to generate used-names from.
|
|
||||||
* @param used1 The first pathname used by the apr_dbm implementation.
|
|
||||||
* @param used2 The second pathname used by apr_dbm. If only one file is
|
|
||||||
* used by the specific implementation, this will be set to NULL.
|
|
||||||
* @remark The dbm file(s) don't need to exist. This function only manipulates
|
|
||||||
* the pathnames.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(void) apr_dbm_get_usednames(apr_pool_t *pool,
|
|
||||||
const char *pathname,
|
|
||||||
const char **used1,
|
|
||||||
const char **used2);
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* !APR_DBM_H */
|
|
|
@ -1,256 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef APR_HOOKS_H
|
|
||||||
#define APR_HOOKS_H
|
|
||||||
|
|
||||||
#include "apu.h"
|
|
||||||
/* For apr_array_header_t */
|
|
||||||
#include "apr_tables.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file apr_hooks.h
|
|
||||||
* @brief Apache hook functions
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
/**
|
|
||||||
* @defgroup APR_Util_Hook Hook Functions
|
|
||||||
* @ingroup APR_Util
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/** macro to return the prototype of the hook function */
|
|
||||||
#define APR_IMPLEMENT_HOOK_GET_PROTO(ns,link,name) \
|
|
||||||
link##_DECLARE(apr_array_header_t *) ns##_hook_get_##name(void)
|
|
||||||
|
|
||||||
/** macro to declare the hook correctly */
|
|
||||||
#define APR_DECLARE_EXTERNAL_HOOK(ns,link,ret,name,args) \
|
|
||||||
typedef ret ns##_HOOK_##name##_t args; \
|
|
||||||
link##_DECLARE(void) ns##_hook_##name(ns##_HOOK_##name##_t *pf, \
|
|
||||||
const char * const *aszPre, \
|
|
||||||
const char * const *aszSucc, int nOrder); \
|
|
||||||
link##_DECLARE(ret) ns##_run_##name args; \
|
|
||||||
APR_IMPLEMENT_HOOK_GET_PROTO(ns,link,name); \
|
|
||||||
typedef struct ns##_LINK_##name##_t \
|
|
||||||
{ \
|
|
||||||
ns##_HOOK_##name##_t *pFunc; \
|
|
||||||
const char *szName; \
|
|
||||||
const char * const *aszPredecessors; \
|
|
||||||
const char * const *aszSuccessors; \
|
|
||||||
int nOrder; \
|
|
||||||
} ns##_LINK_##name##_t;
|
|
||||||
|
|
||||||
/** macro to declare the hook structure */
|
|
||||||
#define APR_HOOK_STRUCT(members) \
|
|
||||||
static struct { members } _hooks;
|
|
||||||
|
|
||||||
/** macro to link the hook structure */
|
|
||||||
#define APR_HOOK_LINK(name) \
|
|
||||||
apr_array_header_t *link_##name;
|
|
||||||
|
|
||||||
/** macro to implement the hook */
|
|
||||||
#define APR_IMPLEMENT_EXTERNAL_HOOK_BASE(ns,link,name) \
|
|
||||||
link##_DECLARE(void) ns##_hook_##name(ns##_HOOK_##name##_t *pf,const char * const *aszPre, \
|
|
||||||
const char * const *aszSucc,int nOrder) \
|
|
||||||
{ \
|
|
||||||
ns##_LINK_##name##_t *pHook; \
|
|
||||||
if(!_hooks.link_##name) \
|
|
||||||
{ \
|
|
||||||
_hooks.link_##name=apr_array_make(apr_hook_global_pool,1,sizeof(ns##_LINK_##name##_t)); \
|
|
||||||
apr_hook_sort_register(#name,&_hooks.link_##name); \
|
|
||||||
} \
|
|
||||||
pHook=apr_array_push(_hooks.link_##name); \
|
|
||||||
pHook->pFunc=pf; \
|
|
||||||
pHook->aszPredecessors=aszPre; \
|
|
||||||
pHook->aszSuccessors=aszSucc; \
|
|
||||||
pHook->nOrder=nOrder; \
|
|
||||||
pHook->szName=apr_hook_debug_current; \
|
|
||||||
if(apr_hook_debug_enabled) \
|
|
||||||
apr_hook_debug_show(#name,aszPre,aszSucc); \
|
|
||||||
} \
|
|
||||||
APR_IMPLEMENT_HOOK_GET_PROTO(ns,link,name) \
|
|
||||||
{ \
|
|
||||||
return _hooks.link_##name; \
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implement a hook that has no return code, and therefore runs all of the
|
|
||||||
* registered functions
|
|
||||||
* @param ns The namespace prefix of the hook functions
|
|
||||||
* @param link The linkage declaration prefix of the hook
|
|
||||||
* @param name The name of the hook
|
|
||||||
* @param args_decl The declaration of the arguments for the hook
|
|
||||||
* @param args_use The names for the arguments for the hook
|
|
||||||
* @note The link prefix FOO corresponds to FOO_DECLARE() macros, which
|
|
||||||
* provide export linkage from the module that IMPLEMENTs the hook, and
|
|
||||||
* import linkage from external modules that link to the hook's module.
|
|
||||||
*/
|
|
||||||
#define APR_IMPLEMENT_EXTERNAL_HOOK_VOID(ns,link,name,args_decl,args_use) \
|
|
||||||
APR_IMPLEMENT_EXTERNAL_HOOK_BASE(ns,link,name) \
|
|
||||||
link##_DECLARE(void) ns##_run_##name args_decl \
|
|
||||||
{ \
|
|
||||||
ns##_LINK_##name##_t *pHook; \
|
|
||||||
int n; \
|
|
||||||
\
|
|
||||||
if(!_hooks.link_##name) \
|
|
||||||
return; \
|
|
||||||
\
|
|
||||||
pHook=(ns##_LINK_##name##_t *)_hooks.link_##name->elts; \
|
|
||||||
for(n=0 ; n < _hooks.link_##name->nelts ; ++n) \
|
|
||||||
pHook[n].pFunc args_use; \
|
|
||||||
}
|
|
||||||
|
|
||||||
/* FIXME: note that this returns ok when nothing is run. I suspect it should
|
|
||||||
really return decline, but that breaks Apache currently - Ben
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* Implement a hook that runs until one of the functions returns something
|
|
||||||
* other than OK or DECLINE
|
|
||||||
* @param ns The namespace prefix of the hook functions
|
|
||||||
* @param link The linkage declaration prefix of the hook
|
|
||||||
* @param ret Type to return
|
|
||||||
* @param name The name of the hook
|
|
||||||
* @param args_decl The declaration of the arguments for the hook
|
|
||||||
* @param args_use The names for the arguments for the hook
|
|
||||||
* @param ok Success value
|
|
||||||
* @param decline Decline value
|
|
||||||
* @note The link prefix FOO corresponds to FOO_DECLARE() macros, which
|
|
||||||
* provide export linkage from the module that IMPLEMENTs the hook, and
|
|
||||||
* import linkage from external modules that link to the hook's module.
|
|
||||||
*/
|
|
||||||
#define APR_IMPLEMENT_EXTERNAL_HOOK_RUN_ALL(ns,link,ret,name,args_decl,args_use,ok,decline) \
|
|
||||||
APR_IMPLEMENT_EXTERNAL_HOOK_BASE(ns,link,name) \
|
|
||||||
link##_DECLARE(ret) ns##_run_##name args_decl \
|
|
||||||
{ \
|
|
||||||
ns##_LINK_##name##_t *pHook; \
|
|
||||||
int n; \
|
|
||||||
ret rv; \
|
|
||||||
\
|
|
||||||
if(!_hooks.link_##name) \
|
|
||||||
return ok; \
|
|
||||||
\
|
|
||||||
pHook=(ns##_LINK_##name##_t *)_hooks.link_##name->elts; \
|
|
||||||
for(n=0 ; n < _hooks.link_##name->nelts ; ++n) \
|
|
||||||
{ \
|
|
||||||
rv=pHook[n].pFunc args_use; \
|
|
||||||
\
|
|
||||||
if(rv != ok && rv != decline) \
|
|
||||||
return rv; \
|
|
||||||
} \
|
|
||||||
return ok; \
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implement a hook that runs until the first function returns something
|
|
||||||
* other than the value of decline
|
|
||||||
* @param ns The namespace prefix of the hook functions
|
|
||||||
* @param link The linkage declaration prefix of the hook
|
|
||||||
* @param name The name of the hook
|
|
||||||
* @param ret Type to return
|
|
||||||
* @param args_decl The declaration of the arguments for the hook
|
|
||||||
* @param args_use The names for the arguments for the hook
|
|
||||||
* @param decline Decline value
|
|
||||||
* @note The link prefix FOO corresponds to FOO_DECLARE() macros, which
|
|
||||||
* provide export linkage from the module that IMPLEMENTs the hook, and
|
|
||||||
* import linkage from external modules that link to the hook's module.
|
|
||||||
*/
|
|
||||||
#define APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(ns,link,ret,name,args_decl,args_use,decline) \
|
|
||||||
APR_IMPLEMENT_EXTERNAL_HOOK_BASE(ns,link,name) \
|
|
||||||
link##_DECLARE(ret) ns##_run_##name args_decl \
|
|
||||||
{ \
|
|
||||||
ns##_LINK_##name##_t *pHook; \
|
|
||||||
int n; \
|
|
||||||
ret rv; \
|
|
||||||
\
|
|
||||||
if(!_hooks.link_##name) \
|
|
||||||
return decline; \
|
|
||||||
\
|
|
||||||
pHook=(ns##_LINK_##name##_t *)_hooks.link_##name->elts; \
|
|
||||||
for(n=0 ; n < _hooks.link_##name->nelts ; ++n) \
|
|
||||||
{ \
|
|
||||||
rv=pHook[n].pFunc args_use; \
|
|
||||||
\
|
|
||||||
if(rv != decline) \
|
|
||||||
return rv; \
|
|
||||||
} \
|
|
||||||
return decline; \
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Hook orderings */
|
|
||||||
/** run this hook first, before ANYTHING */
|
|
||||||
#define APR_HOOK_REALLY_FIRST (-10)
|
|
||||||
/** run this hook first */
|
|
||||||
#define APR_HOOK_FIRST 0
|
|
||||||
/** run this hook somewhere */
|
|
||||||
#define APR_HOOK_MIDDLE 10
|
|
||||||
/** run this hook after every other hook which is defined*/
|
|
||||||
#define APR_HOOK_LAST 20
|
|
||||||
/** run this hook last, after EVERYTHING */
|
|
||||||
#define APR_HOOK_REALLY_LAST 30
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The global pool used to allocate any memory needed by the hooks.
|
|
||||||
*/
|
|
||||||
APU_DECLARE_DATA extern apr_pool_t *apr_hook_global_pool;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A global variable to determine if debugging information about the
|
|
||||||
* hooks functions should be printed
|
|
||||||
*/
|
|
||||||
APU_DECLARE_DATA extern int apr_hook_debug_enabled;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The name of the module that is currently registering a function
|
|
||||||
*/
|
|
||||||
APU_DECLARE_DATA extern const char *apr_hook_debug_current;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Register a hook function to be sorted
|
|
||||||
* @param szHookName The name of the Hook the function is registered for
|
|
||||||
* @param aHooks The array which stores all of the functions for this hook
|
|
||||||
*/
|
|
||||||
APU_DECLARE(void) apr_hook_sort_register(const char *szHookName,
|
|
||||||
apr_array_header_t **aHooks);
|
|
||||||
/**
|
|
||||||
* Sort all of the registerd functions for a given hook
|
|
||||||
*/
|
|
||||||
APU_DECLARE(void) apr_hook_sort_all(void);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Print all of the information about the current hook. This is used for
|
|
||||||
* debugging purposes.
|
|
||||||
* @param szName The name of the hook
|
|
||||||
* @param aszPre All of the functions in the predecessor array
|
|
||||||
* @param aszSucc All of the functions in the successor array
|
|
||||||
*/
|
|
||||||
APU_DECLARE(void) apr_hook_debug_show(const char *szName,
|
|
||||||
const char * const *aszPre,
|
|
||||||
const char * const *aszSucc);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove all currently registered functions.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(void) apr_hook_deregister_all(void);
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* APR_HOOKS_H */
|
|
|
@ -1,131 +0,0 @@
|
||||||
/* Copyright 2002-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* apr_ldap.h is generated from apr_ldap.h.in by configure -- do not edit apr_ldap.h
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @file apr_ldap.h
|
|
||||||
* @brief APR-UTIL LDAP
|
|
||||||
*/
|
|
||||||
#ifndef APU_LDAP_H
|
|
||||||
#define APU_LDAP_H
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup APR_Util_LDAP LDAP
|
|
||||||
* @ingroup APR_Util
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* this will be defined if LDAP support was compiled into apr-util */
|
|
||||||
#define APR_HAS_LDAP @apu_has_ldap@
|
|
||||||
|
|
||||||
/* identify the LDAP toolkit used */
|
|
||||||
#define APR_HAS_NETSCAPE_LDAPSDK @apu_has_ldap_netscape@
|
|
||||||
#define APR_HAS_SOLARIS_LDAPSDK @apu_has_ldap_solaris@
|
|
||||||
#define APR_HAS_NOVELL_LDAPSDK @apu_has_ldap_novell@
|
|
||||||
#define APR_HAS_MOZILLA_LDAPSDK @apu_has_ldap_mozilla@
|
|
||||||
#define APR_HAS_OPENLDAP_LDAPSDK @apu_has_ldap_openldap@
|
|
||||||
#define APR_HAS_MICROSOFT_LDAPSDK @apu_has_ldap_microsoft@
|
|
||||||
#define APR_HAS_OTHER_LDAPSDK @apu_has_ldap_other@
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Handle the case when LDAP is enabled
|
|
||||||
*/
|
|
||||||
#if APR_HAS_LDAP
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The following #defines are DEPRECATED and should not be used for
|
|
||||||
* anything. They remain to maintain binary compatibility.
|
|
||||||
* The original code defined the OPENLDAP SDK as present regardless
|
|
||||||
* of what really was there, which was way bogus. In addition, the
|
|
||||||
* apr_ldap_url_parse*() functions have been rewritten specifically for
|
|
||||||
* APR, so the APR_HAS_LDAP_URL_PARSE macro is forced to zero.
|
|
||||||
*/
|
|
||||||
#define APR_HAS_LDAP_SSL 1
|
|
||||||
#define APR_HAS_LDAP_URL_PARSE 0
|
|
||||||
|
|
||||||
#if APR_HAS_OPENLDAP_LDAPSDK && !defined(LDAP_DEPRECATED)
|
|
||||||
/* Ensure that the "deprecated" interfaces are still exposed
|
|
||||||
* with OpenLDAP >= 2.3; these were exposed by default in earlier
|
|
||||||
* releases. */
|
|
||||||
#define LDAP_DEPRECATED 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Include the standard LDAP header files.
|
|
||||||
*/
|
|
||||||
|
|
||||||
@lber_h@
|
|
||||||
@ldap_h@
|
|
||||||
@ldap_ssl_h@
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Detected standard functions
|
|
||||||
*/
|
|
||||||
#define APR_HAS_LDAPSSL_CLIENT_INIT @apu_has_ldapssl_client_init@
|
|
||||||
#define APR_HAS_LDAPSSL_CLIENT_DEINIT @apu_has_ldapssl_client_deinit@
|
|
||||||
#define APR_HAS_LDAPSSL_ADD_TRUSTED_CERT @apu_has_ldapssl_add_trusted_cert@
|
|
||||||
#define APR_HAS_LDAP_START_TLS_S @apu_has_ldap_start_tls_s@
|
|
||||||
#define APR_HAS_LDAP_SSLINIT @apu_has_ldap_sslinit@
|
|
||||||
#define APR_HAS_LDAPSSL_INIT @apu_has_ldapssl_init@
|
|
||||||
#define APR_HAS_LDAPSSL_INSTALL_ROUTINES @apu_has_ldapssl_install_routines@
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Make sure the secure LDAP port is defined
|
|
||||||
*/
|
|
||||||
#ifndef LDAPS_PORT
|
|
||||||
#define LDAPS_PORT 636 /* ldaps:/// default LDAP over TLS port */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Note: Macros defining const casting has been removed in APR v1.0,
|
|
||||||
* pending real support for LDAP v2.0 toolkits.
|
|
||||||
*
|
|
||||||
* In the mean time, please use an LDAP v3.0 toolkit.
|
|
||||||
*/
|
|
||||||
#if LDAP_VERSION_MAX <= 2
|
|
||||||
#error Support for LDAP v2.0 toolkits has been removed from apr-util. Please use an LDAP v3.0 toolkit.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif /* __cplusplus */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This structure allows the C LDAP API error codes to be returned
|
|
||||||
* along with plain text error messages that explain to us mere mortals
|
|
||||||
* what really happened.
|
|
||||||
*/
|
|
||||||
typedef struct apr_ldap_err_t {
|
|
||||||
const char *reason;
|
|
||||||
const char *msg;
|
|
||||||
int rc;
|
|
||||||
} apr_ldap_err_t;
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "apr_ldap_url.h"
|
|
||||||
#include "apr_ldap_init.h"
|
|
||||||
#include "apr_ldap_option.h"
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
#endif /* APR_HAS_LDAP */
|
|
||||||
#endif /* APU_LDAP_H */
|
|
|
@ -1,133 +0,0 @@
|
||||||
/* Copyright 2002-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* apr_ldap.h is generated from apr_ldap.h.in by configure -- do not edit apr_ldap.h
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @file apr_ldap.h
|
|
||||||
* @brief APR-UTIL LDAP
|
|
||||||
*/
|
|
||||||
#ifndef APU_LDAP_H
|
|
||||||
#define APU_LDAP_H
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup APR_Util_LDAP LDAP
|
|
||||||
* @ingroup APR_Util
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* this will be defined if LDAP support was compiled into apr-util */
|
|
||||||
#define APR_HAS_LDAP 1
|
|
||||||
|
|
||||||
/* identify the LDAP toolkit used */
|
|
||||||
#define APR_HAS_NETSCAPE_LDAPSDK 0
|
|
||||||
#define APR_HAS_SOLARIS_LDAPSDK 0
|
|
||||||
#define APR_HAS_NOVELL_LDAPSDK 1
|
|
||||||
#define APR_HAS_MOZILLA_LDAPSDK 0
|
|
||||||
#define APR_HAS_OPENLDAP_LDAPSDK 0
|
|
||||||
#define APR_HAS_MICROSOFT_LDAPSDK 0
|
|
||||||
#define APR_HAS_OTHER_LDAPSDK 0
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Handle the case when LDAP is enabled
|
|
||||||
*/
|
|
||||||
#if APR_HAS_LDAP
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The following #defines are DEPRECATED and should not be used for
|
|
||||||
* anything. They remain to maintain binary compatibility.
|
|
||||||
* The original code defined the OPENLDAP SDK as present regardless
|
|
||||||
* of what really was there, which was way bogus. In addition, the
|
|
||||||
* apr_ldap_url_parse*() functions have been rewritten specifically for
|
|
||||||
* APR, so the APR_HAS_LDAP_URL_PARSE macro is forced to zero.
|
|
||||||
*/
|
|
||||||
#define APR_HAS_LDAP_SSL 1
|
|
||||||
#define APR_HAS_LDAP_URL_PARSE 0
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Include the standard LDAP header files.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef GENEXPORTS
|
|
||||||
#define LDAP_VERSION_MAX 3
|
|
||||||
#else
|
|
||||||
#include <lber.h>
|
|
||||||
#include <ldap.h>
|
|
||||||
#if APR_HAS_LDAP_SSL
|
|
||||||
#include <ldap_ssl.h>
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Detected standard functions
|
|
||||||
*/
|
|
||||||
#define APR_HAS_LDAPSSL_CLIENT_INIT 1
|
|
||||||
#define APR_HAS_LDAPSSL_CLIENT_DEINIT 1
|
|
||||||
#define APR_HAS_LDAPSSL_ADD_TRUSTED_CERT 1
|
|
||||||
#define APR_HAS_LDAP_START_TLS_S 0
|
|
||||||
#define APR_HAS_LDAP_SSLINIT 0
|
|
||||||
#define APR_HAS_LDAPSSL_INIT 1
|
|
||||||
#define APR_HAS_LDAPSSL_INSTALL_ROUTINES 0
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Make sure the secure LDAP port is defined
|
|
||||||
*/
|
|
||||||
#ifndef LDAPS_PORT
|
|
||||||
#define LDAPS_PORT 636 /* ldaps:/// default LDAP over TLS port */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Note: Macros defining const casting has been removed in APR v1.0,
|
|
||||||
* pending real support for LDAP v2.0 toolkits.
|
|
||||||
*
|
|
||||||
* In the mean time, please use an LDAP v3.0 toolkit.
|
|
||||||
*/
|
|
||||||
#if LDAP_VERSION_MAX <= 2
|
|
||||||
#error Support for LDAP v2.0 toolkits has been removed from apr-util. Please use an LDAP v3.0 toolkit.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif /* __cplusplus */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This structure allows the C LDAP API error codes to be returned
|
|
||||||
* along with plain text error messages that explain to us mere mortals
|
|
||||||
* what really happened.
|
|
||||||
*/
|
|
||||||
typedef struct apr_ldap_err_t {
|
|
||||||
const char *reason;
|
|
||||||
const char *msg;
|
|
||||||
int rc;
|
|
||||||
} apr_ldap_err_t;
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "apr_ldap_url.h"
|
|
||||||
#include "apr_ldap_init.h"
|
|
||||||
#include "apr_ldap_option.h"
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
#endif /* APR_HAS_LDAP */
|
|
||||||
#endif /* APU_LDAP_H */
|
|
||||||
|
|
|
@ -1,124 +0,0 @@
|
||||||
/* Copyright 2002-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* apr_ldap.h is generated from apr_ldap.h.in by configure -- do not edit apr_ldap.h
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @file apr_ldap.h
|
|
||||||
* @brief APR-UTIL LDAP
|
|
||||||
*/
|
|
||||||
#ifndef APU_LDAP_H
|
|
||||||
#define APU_LDAP_H
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup APR_Util_LDAP LDAP
|
|
||||||
* @ingroup APR_Util
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* this will be defined if LDAP support was compiled into apr-util */
|
|
||||||
#define APR_HAS_LDAP 1
|
|
||||||
|
|
||||||
/* identify the LDAP toolkit used */
|
|
||||||
#define APR_HAS_NETSCAPE_LDAPSDK 0
|
|
||||||
#define APR_HAS_SOLARIS_LDAPSDK 0
|
|
||||||
#define APR_HAS_NOVELL_LDAPSDK 0
|
|
||||||
#define APR_HAS_MOZILLA_LDAPSDK 0
|
|
||||||
#define APR_HAS_OPENLDAP_LDAPSDK 0
|
|
||||||
#define APR_HAS_MICROSOFT_LDAPSDK 1
|
|
||||||
#define APR_HAS_OTHER_LDAPSDK 0
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Handle the case when LDAP is enabled
|
|
||||||
*/
|
|
||||||
#if APR_HAS_LDAP
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The following #defines are DEPRECATED and should not be used for
|
|
||||||
* anything. They remain to maintain binary compatibility.
|
|
||||||
* The original code defined the OPENLDAP SDK as present regardless
|
|
||||||
* of what really was there, which was way bogus. In addition, the
|
|
||||||
* apr_ldap_url_parse*() functions have been rewritten specifically for
|
|
||||||
* APR, so the APR_HAS_LDAP_URL_PARSE macro is forced to zero.
|
|
||||||
*/
|
|
||||||
#define APR_HAS_LDAP_SSL 1
|
|
||||||
#define APR_HAS_LDAP_URL_PARSE 0
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Include the standard LDAP header files.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <winldap.h>
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Detected standard functions
|
|
||||||
*/
|
|
||||||
#define APR_HAS_LDAPSSL_CLIENT_INIT 0
|
|
||||||
#define APR_HAS_LDAPSSL_CLIENT_DEINIT 0
|
|
||||||
#define APR_HAS_LDAPSSL_ADD_TRUSTED_CERT 0
|
|
||||||
#define APR_HAS_LDAP_START_TLS_S 0
|
|
||||||
#define APR_HAS_LDAP_SSLINIT 1
|
|
||||||
#define APR_HAS_LDAPSSL_INIT 0
|
|
||||||
#define APR_HAS_LDAPSSL_INSTALL_ROUTINES 0
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Make sure the secure LDAP port is defined
|
|
||||||
*/
|
|
||||||
#ifndef LDAPS_PORT
|
|
||||||
#define LDAPS_PORT 636 /* ldaps:/// default LDAP over TLS port */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Note: Macros defining const casting has been removed in APR v1.0,
|
|
||||||
* pending real support for LDAP v2.0 toolkits.
|
|
||||||
*
|
|
||||||
* In the mean time, please use an LDAP v3.0 toolkit.
|
|
||||||
*/
|
|
||||||
#if LDAP_VERSION_MAX <= 2
|
|
||||||
#error Support for LDAP v2.0 toolkits has been removed from apr-util. Please use an LDAP v3.0 toolkit.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif /* __cplusplus */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This structure allows the C LDAP API error codes to be returned
|
|
||||||
* along with plain text error messages that explain to us mere mortals
|
|
||||||
* what really happened.
|
|
||||||
*/
|
|
||||||
typedef struct apr_ldap_err_t {
|
|
||||||
const char *reason;
|
|
||||||
const char *msg;
|
|
||||||
int rc;
|
|
||||||
} apr_ldap_err_t;
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "apr_ldap_url.h"
|
|
||||||
#include "apr_ldap_init.h"
|
|
||||||
#include "apr_ldap_option.h"
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
#endif /* APR_HAS_LDAP */
|
|
||||||
#endif /* APU_LDAP_H */
|
|
|
@ -1,137 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file apr_ldap_init.h
|
|
||||||
* @brief APR-UTIL LDAP ldap_init() functions
|
|
||||||
*/
|
|
||||||
#ifndef APR_LDAP_INIT_H
|
|
||||||
#define APR_LDAP_INIT_H
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup APR_Util_LDAP LDAP
|
|
||||||
* @ingroup APR_Util
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apr_ldap.h"
|
|
||||||
|
|
||||||
#if APR_HAS_LDAP
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif /* __cplusplus */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* APR LDAP SSL Initialise function
|
|
||||||
*
|
|
||||||
* This function initialises SSL on the underlying LDAP toolkit
|
|
||||||
* if this is necessary.
|
|
||||||
*
|
|
||||||
* If a CA certificate is provided, this is set, however the setting
|
|
||||||
* of certificates via this method has been deprecated and will be removed in
|
|
||||||
* APR v2.0.
|
|
||||||
*
|
|
||||||
* The apr_ldap_set_option() function with the APR_LDAP_OPT_TLS_CERT option
|
|
||||||
* should be used instead to set certificates.
|
|
||||||
*
|
|
||||||
* If SSL support is not available on this platform, or a problem
|
|
||||||
* was encountered while trying to set the certificate, the function
|
|
||||||
* will return APR_EGENERAL. Further LDAP specific error information
|
|
||||||
* can be found in result_err.
|
|
||||||
* @param pool The pool to use
|
|
||||||
* @param cert_auth_file The name of the certificate to use, can be NULL
|
|
||||||
* @param cert_file_type The type of certificate specified. See the
|
|
||||||
* apr_ldap_set_option() APR_LDAP_OPT_TLS_CERT option for details.
|
|
||||||
* @param result_err The returned result
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_ldap_ssl_init(apr_pool_t *pool,
|
|
||||||
const char *cert_auth_file,
|
|
||||||
int cert_file_type,
|
|
||||||
apr_ldap_err_t **result_err);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* APR LDAP SSL De-Initialise function
|
|
||||||
*
|
|
||||||
* This function tears down any SSL certificate setup previously
|
|
||||||
* set using apr_ldap_ssl_init(). It should be called to clean
|
|
||||||
* up if a graceful restart of a service is attempted.
|
|
||||||
* @todo currently we do not check whether apr_ldap_ssl_init()
|
|
||||||
* has been called first - we probably should.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_ldap_ssl_deinit(void);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* APR LDAP initialise function
|
|
||||||
*
|
|
||||||
* This function is responsible for initialising an LDAP
|
|
||||||
* connection in a toolkit independant way. It does the
|
|
||||||
* job of ldap_init() from the C api.
|
|
||||||
*
|
|
||||||
* It handles both the SSL and non-SSL case, and attempts
|
|
||||||
* to hide the complexity setup from the user. This function
|
|
||||||
* assumes that any certificate setup necessary has already
|
|
||||||
* been done.
|
|
||||||
*
|
|
||||||
* If SSL or STARTTLS needs to be enabled, and the underlying
|
|
||||||
* toolkit supports it, the following values are accepted for
|
|
||||||
* secure:
|
|
||||||
*
|
|
||||||
* APR_LDAP_NONE: No encryption
|
|
||||||
* APR_LDAP_SSL: SSL encryption (ldaps://)
|
|
||||||
* APR_LDAP_STARTTLS: Force STARTTLS on ldap://
|
|
||||||
* @remark The Novell toolkit is only able to set the SSL mode via this
|
|
||||||
* function. To work around this limitation, set the SSL mode here if no
|
|
||||||
* per connection client certificates are present, otherwise set secure
|
|
||||||
* APR_LDAP_NONE here, then set the per connection client certificates,
|
|
||||||
* followed by setting the SSL mode via apr_ldap_set_option(). As Novell
|
|
||||||
* does not support per connection client certificates, this problem is
|
|
||||||
* worked around while still being compatible with other LDAP toolkits.
|
|
||||||
* @param pool The pool to use
|
|
||||||
* @param ldap The LDAP handle
|
|
||||||
* @param hostname The name of the host to connect to. This can be either a
|
|
||||||
* DNS name, or an IP address.
|
|
||||||
* @param portno The port to connect to
|
|
||||||
* @param secure The security mode to set
|
|
||||||
* @param result_err The returned result
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_ldap_init(apr_pool_t *pool,
|
|
||||||
LDAP **ldap,
|
|
||||||
const char *hostname,
|
|
||||||
int portno,
|
|
||||||
int secure,
|
|
||||||
apr_ldap_err_t **result_err);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* APR LDAP info function
|
|
||||||
*
|
|
||||||
* This function returns a string describing the LDAP toolkit
|
|
||||||
* currently in use. The string is placed inside result_err->reason.
|
|
||||||
* @param pool The pool to use
|
|
||||||
* @param result_err The returned result
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_ldap_info(apr_pool_t *pool,
|
|
||||||
apr_ldap_err_t **result_err);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* APR_HAS_LDAP */
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
|
|
||||||
#endif /* APR_LDAP_URL_H */
|
|
|
@ -1,240 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file apr_ldap_option.h
|
|
||||||
* @brief APR-UTIL LDAP ldap_*_option() functions
|
|
||||||
*/
|
|
||||||
#ifndef APR_LDAP_OPTION_H
|
|
||||||
#define APR_LDAP_OPTION_H
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup APR_Util_LDAP LDAP
|
|
||||||
* @ingroup APR_Util
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apr_ldap.h"
|
|
||||||
|
|
||||||
#if APR_HAS_LDAP
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif /* __cplusplus */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The following defines handle the different TLS certificate
|
|
||||||
* options available. If these options are missing, APR will try and
|
|
||||||
* emulate support for this using the deprecated ldap_start_tls_s()
|
|
||||||
* function.
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* Set SSL mode to one of APR_LDAP_NONE, APR_LDAP_SSL, APR_LDAP_STARTTLS
|
|
||||||
* or APR_LDAP_STOPTLS.
|
|
||||||
*/
|
|
||||||
#define APR_LDAP_OPT_TLS 0x6fff
|
|
||||||
/**
|
|
||||||
* Set zero or more CA certificates, client certificates or private
|
|
||||||
* keys globally, or per connection (where supported).
|
|
||||||
*/
|
|
||||||
#define APR_LDAP_OPT_TLS_CERT 0x6ffe
|
|
||||||
/**
|
|
||||||
* Set the LDAP library to no verify the server certificate. This means
|
|
||||||
* all servers are considered trusted.
|
|
||||||
*/
|
|
||||||
#define APR_LDAP_OPT_VERIFY_CERT 0x6ffd
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Structures for the apr_set_option() cases
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* APR_LDAP_OPT_TLS_CERT
|
|
||||||
*
|
|
||||||
* This structure includes possible options to set certificates on
|
|
||||||
* system initialisation. Different SDKs have different certificate
|
|
||||||
* requirements, and to achieve this multiple certificates must be
|
|
||||||
* specified at once passed as an (apr_array_header_t *).
|
|
||||||
*
|
|
||||||
* Netscape:
|
|
||||||
* Needs the CA cert database (cert7.db), the client cert database (key3.db)
|
|
||||||
* and the security module file (secmod.db) set at the system initialisation
|
|
||||||
* time. Three types are supported: APR_LDAP_CERT7_DB, APR_LDAP_KEY3_DB and
|
|
||||||
* APR_LDAP_SECMOD.
|
|
||||||
*
|
|
||||||
* To specify a client cert connection, a certificate nickname needs to be
|
|
||||||
* provided with a type of APR_LDAP_CERT.
|
|
||||||
* int ldapssl_enable_clientauth( LDAP *ld, char *keynickname,
|
|
||||||
* char *keypasswd, char *certnickname );
|
|
||||||
* keynickname is currently not used, and should be set to ""
|
|
||||||
*
|
|
||||||
* Novell:
|
|
||||||
* Needs CA certificates and client certificates set at system initialisation
|
|
||||||
* time. Three types are supported: APR_LDAP_CA*, APR_LDAP_CERT* and
|
|
||||||
* APR_LDAP_KEY*.
|
|
||||||
*
|
|
||||||
* Certificates cannot be specified per connection.
|
|
||||||
*
|
|
||||||
* The functions used are:
|
|
||||||
* ldapssl_add_trusted_cert(serverTrustedRoot, serverTrustedRootEncoding);
|
|
||||||
* Clients certs and keys are set at system initialisation time with
|
|
||||||
* int ldapssl_set_client_cert (
|
|
||||||
* void *cert,
|
|
||||||
* int type
|
|
||||||
* void *password);
|
|
||||||
* type can be LDAPSSL_CERT_FILETYPE_B64 or LDAPSSL_CERT_FILETYPE_DER
|
|
||||||
* ldapssl_set_client_private_key(clientPrivateKey,
|
|
||||||
* clientPrivateKeyEncoding,
|
|
||||||
* clientPrivateKeyPassword);
|
|
||||||
*
|
|
||||||
* OpenSSL:
|
|
||||||
* Needs one or more CA certificates to be set at system initialisation time
|
|
||||||
* with a type of APR_LDAP_CA*.
|
|
||||||
*
|
|
||||||
* May have one or more client certificates set per connection with a type of
|
|
||||||
* APR_LDAP_CERT*, and keys with APR_LDAP_KEY*.
|
|
||||||
*/
|
|
||||||
/** CA certificate type unknown */
|
|
||||||
#define APR_LDAP_CA_TYPE_UNKNOWN 0
|
|
||||||
/** binary DER encoded CA certificate */
|
|
||||||
#define APR_LDAP_CA_TYPE_DER 1
|
|
||||||
/** PEM encoded CA certificate */
|
|
||||||
#define APR_LDAP_CA_TYPE_BASE64 2
|
|
||||||
/** Netscape/Mozilla cert7.db CA certificate database */
|
|
||||||
#define APR_LDAP_CA_TYPE_CERT7_DB 3
|
|
||||||
/** Netscape/Mozilla secmod file */
|
|
||||||
#define APR_LDAP_CA_TYPE_SECMOD 4
|
|
||||||
/** Client certificate type unknown */
|
|
||||||
#define APR_LDAP_CERT_TYPE_UNKNOWN 5
|
|
||||||
/** binary DER encoded client certificate */
|
|
||||||
#define APR_LDAP_CERT_TYPE_DER 6
|
|
||||||
/** PEM encoded client certificate */
|
|
||||||
#define APR_LDAP_CERT_TYPE_BASE64 7
|
|
||||||
/** Netscape/Mozilla key3.db client certificate database */
|
|
||||||
#define APR_LDAP_CERT_TYPE_KEY3_DB 8
|
|
||||||
/** Netscape/Mozilla client certificate nickname */
|
|
||||||
#define APR_LDAP_CERT_TYPE_NICKNAME 9
|
|
||||||
/** Private key type unknown */
|
|
||||||
#define APR_LDAP_KEY_TYPE_UNKNOWN 10
|
|
||||||
/** binary DER encoded private key */
|
|
||||||
#define APR_LDAP_KEY_TYPE_DER 11
|
|
||||||
/** PEM encoded private key */
|
|
||||||
#define APR_LDAP_KEY_TYPE_BASE64 12
|
|
||||||
/** PKCS#12 encoded client certificate */
|
|
||||||
#define APR_LDAP_CERT_TYPE_PFX 13
|
|
||||||
/** PKCS#12 encoded private key */
|
|
||||||
#define APR_LDAP_KEY_TYPE_PFX 14
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Certificate structure.
|
|
||||||
*
|
|
||||||
* This structure is used to store certificate details. An array of
|
|
||||||
* these structures is passed to apr_ldap_set_option() to set CA
|
|
||||||
* and client certificates.
|
|
||||||
* @param type Type of certificate APR_LDAP_*_TYPE_*
|
|
||||||
* @param path Path, file or nickname of the certificate
|
|
||||||
* @param password Optional password, can be NULL
|
|
||||||
*/
|
|
||||||
typedef struct apr_ldap_opt_tls_cert_t apr_ldap_opt_tls_cert_t;
|
|
||||||
struct apr_ldap_opt_tls_cert_t {
|
|
||||||
int type;
|
|
||||||
const char *path;
|
|
||||||
const char *password;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* APR_LDAP_OPT_TLS
|
|
||||||
*
|
|
||||||
* This sets the SSL level on the LDAP handle.
|
|
||||||
*
|
|
||||||
* Netscape/Mozilla:
|
|
||||||
* Supports SSL, but not STARTTLS
|
|
||||||
* SSL is enabled by calling ldapssl_install_routines().
|
|
||||||
*
|
|
||||||
* Novell:
|
|
||||||
* Supports SSL and STARTTLS.
|
|
||||||
* SSL is enabled by calling ldapssl_install_routines(). Note that calling
|
|
||||||
* other ldap functions before ldapssl_install_routines() may cause this
|
|
||||||
* function to fail.
|
|
||||||
* STARTTLS is enabled by calling ldapssl_start_tls_s() after calling
|
|
||||||
* ldapssl_install_routines() (check this).
|
|
||||||
*
|
|
||||||
* OpenLDAP:
|
|
||||||
* Supports SSL and supports STARTTLS, but none of this is documented:
|
|
||||||
* http://www.openldap.org/lists/openldap-software/200409/msg00618.html
|
|
||||||
* Documentation for both SSL support and STARTTLS has been deleted from
|
|
||||||
* the OpenLDAP documentation and website.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** No encryption */
|
|
||||||
#define APR_LDAP_NONE 0
|
|
||||||
/** SSL encryption (ldaps://) */
|
|
||||||
#define APR_LDAP_SSL 1
|
|
||||||
/** TLS encryption (STARTTLS) */
|
|
||||||
#define APR_LDAP_STARTTLS 2
|
|
||||||
/** end TLS encryption (STOPTLS) */
|
|
||||||
#define APR_LDAP_STOPTLS 3
|
|
||||||
|
|
||||||
/**
|
|
||||||
* APR LDAP get option function
|
|
||||||
*
|
|
||||||
* This function gets option values from a given LDAP session if
|
|
||||||
* one was specified. It maps to the native ldap_get_option() function.
|
|
||||||
* @param pool The pool to use
|
|
||||||
* @param ldap The LDAP handle
|
|
||||||
* @param option The LDAP_OPT_* option to return
|
|
||||||
* @param outvalue The value returned (if any)
|
|
||||||
* @param result_err The apr_ldap_err_t structure contained detailed results
|
|
||||||
* of the operation.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_ldap_get_option(apr_pool_t *pool,
|
|
||||||
LDAP *ldap,
|
|
||||||
int option,
|
|
||||||
void *outvalue,
|
|
||||||
apr_ldap_err_t **result_err);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* APR LDAP set option function
|
|
||||||
*
|
|
||||||
* This function sets option values to a given LDAP session if
|
|
||||||
* one was specified. It maps to the native ldap_set_option() function.
|
|
||||||
*
|
|
||||||
* Where an option is not supported by an LDAP toolkit, this function
|
|
||||||
* will try and apply legacy functions to achieve the same effect,
|
|
||||||
* depending on the platform.
|
|
||||||
* @param pool The pool to use
|
|
||||||
* @param ldap The LDAP handle
|
|
||||||
* @param option The LDAP_OPT_* option to set
|
|
||||||
* @param invalue The value to set
|
|
||||||
* @param result_err The apr_ldap_err_t structure contained detailed results
|
|
||||||
* of the operation.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_ldap_set_option(apr_pool_t *pool,
|
|
||||||
LDAP *ldap,
|
|
||||||
int option,
|
|
||||||
const void *invalue,
|
|
||||||
apr_ldap_err_t **result_err);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* APR_HAS_LDAP */
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
|
|
||||||
#endif /* APR_LDAP_OPTION_H */
|
|
||||||
|
|
|
@ -1,117 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file apr_ldap_url.h
|
|
||||||
* @brief APR-UTIL LDAP ldap_init() functions
|
|
||||||
*/
|
|
||||||
#ifndef APR_LDAP_URL_H
|
|
||||||
#define APR_LDAP_URL_H
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup APR_Util_LDAP LDAP
|
|
||||||
* @ingroup APR_Util
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if APR_HAS_LDAP
|
|
||||||
|
|
||||||
#include "apu.h"
|
|
||||||
#include "apr_pools.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif /* __cplusplus */
|
|
||||||
|
|
||||||
/** Structure to access an exploded LDAP URL */
|
|
||||||
typedef struct apr_ldap_url_desc_t {
|
|
||||||
struct apr_ldap_url_desc_t *lud_next;
|
|
||||||
char *lud_scheme;
|
|
||||||
char *lud_host;
|
|
||||||
int lud_port;
|
|
||||||
char *lud_dn;
|
|
||||||
char **lud_attrs;
|
|
||||||
int lud_scope;
|
|
||||||
char *lud_filter;
|
|
||||||
char **lud_exts;
|
|
||||||
int lud_crit_exts;
|
|
||||||
} apr_ldap_url_desc_t;
|
|
||||||
|
|
||||||
#ifndef APR_LDAP_URL_SUCCESS
|
|
||||||
#define APR_LDAP_URL_SUCCESS 0x00 /* Success */
|
|
||||||
#define APR_LDAP_URL_ERR_MEM 0x01 /* can't allocate memory space */
|
|
||||||
#define APR_LDAP_URL_ERR_PARAM 0x02 /* parameter is bad */
|
|
||||||
#define APR_LDAP_URL_ERR_BADSCHEME 0x03 /* URL doesn't begin with "ldap[si]://" */
|
|
||||||
#define APR_LDAP_URL_ERR_BADENCLOSURE 0x04 /* URL is missing trailing ">" */
|
|
||||||
#define APR_LDAP_URL_ERR_BADURL 0x05 /* URL is bad */
|
|
||||||
#define APR_LDAP_URL_ERR_BADHOST 0x06 /* host port is bad */
|
|
||||||
#define APR_LDAP_URL_ERR_BADATTRS 0x07 /* bad (or missing) attributes */
|
|
||||||
#define APR_LDAP_URL_ERR_BADSCOPE 0x08 /* scope string is invalid (or missing) */
|
|
||||||
#define APR_LDAP_URL_ERR_BADFILTER 0x09 /* bad or missing filter */
|
|
||||||
#define APR_LDAP_URL_ERR_BADEXTS 0x0a /* bad or missing extensions */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Is this URL an ldap url? ldap://
|
|
||||||
* @param url The url to test
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_ldap_is_ldap_url(const char *url);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Is this URL an SSL ldap url? ldaps://
|
|
||||||
* @param url The url to test
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_ldap_is_ldaps_url(const char *url);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Is this URL an ldap socket url? ldapi://
|
|
||||||
* @param url The url to test
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_ldap_is_ldapi_url(const char *url);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse an LDAP URL.
|
|
||||||
* @param pool The pool to use
|
|
||||||
* @param url_in The URL to parse
|
|
||||||
* @param ludpp The structure to return the exploded URL
|
|
||||||
* @param result_err The result structure of the operation
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_ldap_url_parse_ext(apr_pool_t *pool,
|
|
||||||
const char *url_in,
|
|
||||||
apr_ldap_url_desc_t **ludpp,
|
|
||||||
apr_ldap_err_t **result_err);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse an LDAP URL.
|
|
||||||
* @param pool The pool to use
|
|
||||||
* @param url_in The URL to parse
|
|
||||||
* @param ludpp The structure to return the exploded URL
|
|
||||||
* @param result_err The result structure of the operation
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_ldap_url_parse(apr_pool_t *pool,
|
|
||||||
const char *url_in,
|
|
||||||
apr_ldap_url_desc_t **ludpp,
|
|
||||||
apr_ldap_err_t **result_err);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* APR_HAS_LDAP */
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
|
|
||||||
#endif /* APR_LDAP_URL_H */
|
|
|
@ -1,135 +0,0 @@
|
||||||
/* Copyright 2001-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
/* This is derived from material copyright RSA Data Security, Inc.
|
|
||||||
* Their notice is reproduced below in its entirety.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
|
|
||||||
* rights reserved.
|
|
||||||
*
|
|
||||||
* License to copy and use this software is granted provided that it
|
|
||||||
* is identified as the "RSA Data Security, Inc. MD4 Message-Digest
|
|
||||||
* Algorithm" in all material mentioning or referencing this software
|
|
||||||
* or this function.
|
|
||||||
*
|
|
||||||
* License is also granted to make and use derivative works provided
|
|
||||||
* that such works are identified as "derived from the RSA Data
|
|
||||||
* Security, Inc. MD4 Message-Digest Algorithm" in all material
|
|
||||||
* mentioning or referencing the derived work.
|
|
||||||
*
|
|
||||||
* RSA Data Security, Inc. makes no representations concerning either
|
|
||||||
* the merchantability of this software or the suitability of this
|
|
||||||
* software for any particular purpose. It is provided "as is"
|
|
||||||
* without express or implied warranty of any kind.
|
|
||||||
*
|
|
||||||
* These notices must be retained in any copies of any part of this
|
|
||||||
* documentation and/or software.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef APR_MD4_H
|
|
||||||
#define APR_MD4_H
|
|
||||||
|
|
||||||
#include "apu.h"
|
|
||||||
#include "apr_xlate.h"
|
|
||||||
/**
|
|
||||||
* @file apr_md4.h
|
|
||||||
* @brief APR-UTIL MD4 Library
|
|
||||||
*/
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup APR_Util_MD4 MD4 Library
|
|
||||||
* @ingroup APR_Util
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** The digestsize for MD4 */
|
|
||||||
#define APR_MD4_DIGESTSIZE 16
|
|
||||||
|
|
||||||
/** @see apr_md4_ctx_t */
|
|
||||||
typedef struct apr_md4_ctx_t apr_md4_ctx_t;
|
|
||||||
|
|
||||||
/** MD4 context. */
|
|
||||||
struct apr_md4_ctx_t {
|
|
||||||
/** state (ABCD) */
|
|
||||||
apr_uint32_t state[4];
|
|
||||||
/** number of bits, modulo 2^64 (lsb first) */
|
|
||||||
apr_uint32_t count[2];
|
|
||||||
/** input buffer */
|
|
||||||
unsigned char buffer[64];
|
|
||||||
#if APR_HAS_XLATE
|
|
||||||
/** translation handle */
|
|
||||||
apr_xlate_t *xlate;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MD4 Initialize. Begins an MD4 operation, writing a new context.
|
|
||||||
* @param context The MD4 context to initialize.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_md4_init(apr_md4_ctx_t *context);
|
|
||||||
|
|
||||||
#if APR_HAS_XLATE
|
|
||||||
/**
|
|
||||||
* MDr4 translation setup. Provides the APR translation handle to be used
|
|
||||||
* for translating the content before calculating the digest.
|
|
||||||
* @param context The MD4 content to set the translation for.
|
|
||||||
* @param xlate The translation handle to use for this MD4 context
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_md4_set_xlate(apr_md4_ctx_t *context,
|
|
||||||
apr_xlate_t *xlate);
|
|
||||||
#else
|
|
||||||
#define apr_md4_set_xlate(context, xlate) APR_ENOTIMPL
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MD4 block update operation. Continue an MD4 message-digest operation,
|
|
||||||
* processing another message block, and updating the context.
|
|
||||||
* @param context The MD4 content to update.
|
|
||||||
* @param input next message block to update
|
|
||||||
* @param inputLen The length of the next message block
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_md4_update(apr_md4_ctx_t *context,
|
|
||||||
const unsigned char *input,
|
|
||||||
apr_size_t inputLen);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MD4 finalization. Ends an MD4 message-digest operation, writing the
|
|
||||||
* message digest and zeroing the context
|
|
||||||
* @param digest The final MD4 digest
|
|
||||||
* @param context The MD4 content we are finalizing.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_md4_final(
|
|
||||||
unsigned char digest[APR_MD4_DIGESTSIZE],
|
|
||||||
apr_md4_ctx_t *context);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MD4 digest computation
|
|
||||||
* @param digest The MD4 digest
|
|
||||||
* @param input message block to use
|
|
||||||
* @param inputLen The length of the message block
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_md4(unsigned char digest[APR_MD4_DIGESTSIZE],
|
|
||||||
const unsigned char *input,
|
|
||||||
apr_size_t inputLen);
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* !APR_MD4_H */
|
|
|
@ -1,162 +0,0 @@
|
||||||
/*
|
|
||||||
* This is work is derived from material Copyright RSA Data Security, Inc.
|
|
||||||
*
|
|
||||||
* The RSA copyright statement and Licence for that original material is
|
|
||||||
* included below. This is followed by the Apache copyright statement and
|
|
||||||
* licence for the modifications made to that material.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
|
|
||||||
rights reserved.
|
|
||||||
|
|
||||||
License to copy and use this software is granted provided that it
|
|
||||||
is identified as the "RSA Data Security, Inc. MD5 Message-Digest
|
|
||||||
Algorithm" in all material mentioning or referencing this software
|
|
||||||
or this function.
|
|
||||||
|
|
||||||
License is also granted to make and use derivative works provided
|
|
||||||
that such works are identified as "derived from the RSA Data
|
|
||||||
Security, Inc. MD5 Message-Digest Algorithm" in all material
|
|
||||||
mentioning or referencing the derived work.
|
|
||||||
|
|
||||||
RSA Data Security, Inc. makes no representations concerning either
|
|
||||||
the merchantability of this software or the suitability of this
|
|
||||||
software for any particular purpose. It is provided "as is"
|
|
||||||
without express or implied warranty of any kind.
|
|
||||||
|
|
||||||
These notices must be retained in any copies of any part of this
|
|
||||||
documentation and/or software.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef APR_MD5_H
|
|
||||||
#define APR_MD5_H
|
|
||||||
|
|
||||||
#include "apu.h"
|
|
||||||
#include "apr_xlate.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
/**
|
|
||||||
* @file apr_md5.h
|
|
||||||
* @brief APR MD5 Routines
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup APR_MD5 MD5 Routines
|
|
||||||
* @ingroup APR
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** The MD5 digest size */
|
|
||||||
#define APR_MD5_DIGESTSIZE 16
|
|
||||||
|
|
||||||
/** @see apr_md5_ctx_t */
|
|
||||||
typedef struct apr_md5_ctx_t apr_md5_ctx_t;
|
|
||||||
|
|
||||||
/** MD5 context. */
|
|
||||||
struct apr_md5_ctx_t {
|
|
||||||
/** state (ABCD) */
|
|
||||||
apr_uint32_t state[4];
|
|
||||||
/** number of bits, modulo 2^64 (lsb first) */
|
|
||||||
apr_uint32_t count[2];
|
|
||||||
/** input buffer */
|
|
||||||
unsigned char buffer[64];
|
|
||||||
/** translation handle
|
|
||||||
* ignored if xlate is unsupported
|
|
||||||
*/
|
|
||||||
apr_xlate_t *xlate;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MD5 Initialize. Begins an MD5 operation, writing a new context.
|
|
||||||
* @param context The MD5 context to initialize.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_md5_init(apr_md5_ctx_t *context);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MD5 translation setup. Provides the APR translation handle to be used
|
|
||||||
* for translating the content before calculating the digest.
|
|
||||||
* @param context The MD5 content to set the translation for.
|
|
||||||
* @param xlate The translation handle to use for this MD5 context
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_md5_set_xlate(apr_md5_ctx_t *context,
|
|
||||||
apr_xlate_t *xlate);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MD5 block update operation. Continue an MD5 message-digest operation,
|
|
||||||
* processing another message block, and updating the context.
|
|
||||||
* @param context The MD5 content to update.
|
|
||||||
* @param input next message block to update
|
|
||||||
* @param inputLen The length of the next message block
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_md5_update(apr_md5_ctx_t *context,
|
|
||||||
const void *input,
|
|
||||||
apr_size_t inputLen);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MD5 finalization. Ends an MD5 message-digest operation, writing the
|
|
||||||
* message digest and zeroing the context
|
|
||||||
* @param digest The final MD5 digest
|
|
||||||
* @param context The MD5 content we are finalizing.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_md5_final(unsigned char digest[APR_MD5_DIGESTSIZE],
|
|
||||||
apr_md5_ctx_t *context);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MD5 in one step
|
|
||||||
* @param digest The final MD5 digest
|
|
||||||
* @param input The message block to use
|
|
||||||
* @param inputLen The length of the message block
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_md5(unsigned char digest[APR_MD5_DIGESTSIZE],
|
|
||||||
const void *input,
|
|
||||||
apr_size_t inputLen);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Encode a password using an MD5 algorithm
|
|
||||||
* @param password The password to encode
|
|
||||||
* @param salt The salt to use for the encoding
|
|
||||||
* @param result The string to store the encoded password in
|
|
||||||
* @param nbytes The size of the result buffer
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_md5_encode(const char *password, const char *salt,
|
|
||||||
char *result, apr_size_t nbytes);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Validate hashes created by APR-supported algorithms: md5 and sha1.
|
|
||||||
* hashes created by crypt are supported only on platforms that provide
|
|
||||||
* crypt(3), so don't rely on that function unless you know that your
|
|
||||||
* application will be run only on platforms that support it. On platforms
|
|
||||||
* that don't support crypt(3), this falls back to a clear text string
|
|
||||||
* comparison.
|
|
||||||
* @param passwd The password to validate
|
|
||||||
* @param hash The password to validate against
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_password_validate(const char *passwd,
|
|
||||||
const char *hash);
|
|
||||||
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* !APR_MD5_H */
|
|
|
@ -1,92 +0,0 @@
|
||||||
/* Copyright 2001-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef APR_OPTIONAL_H
|
|
||||||
#define APR_OPTIONAL_H
|
|
||||||
|
|
||||||
#include "apu.h"
|
|
||||||
/**
|
|
||||||
* @file apr_optional.h
|
|
||||||
* @brief APR-UTIL registration of functions exported by modules
|
|
||||||
*/
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup APR_Util_Opt Optional Functions
|
|
||||||
* @ingroup APR_Util
|
|
||||||
*
|
|
||||||
* Typesafe registration and retrieval of functions that may not be present
|
|
||||||
* (i.e. functions exported by optional modules)
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The type of an optional function.
|
|
||||||
* @param name The name of the function
|
|
||||||
*/
|
|
||||||
#define APR_OPTIONAL_FN_TYPE(name) apr_OFN_##name##_t
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Declare an optional function.
|
|
||||||
* @param ret The return type of the function
|
|
||||||
* @param name The name of the function
|
|
||||||
* @param args The function arguments (including brackets)
|
|
||||||
*/
|
|
||||||
#define APR_DECLARE_OPTIONAL_FN(ret,name,args) \
|
|
||||||
typedef ret (APR_OPTIONAL_FN_TYPE(name)) args
|
|
||||||
|
|
||||||
/**
|
|
||||||
* XXX: This doesn't belong here, then!
|
|
||||||
* Private function! DO NOT USE!
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef void (apr_opt_fn_t)(void);
|
|
||||||
/** @internal */
|
|
||||||
APU_DECLARE_NONSTD(void) apr_dynamic_fn_register(const char *szName,
|
|
||||||
apr_opt_fn_t *pfn);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Register an optional function. This can be later retrieved, type-safely, by
|
|
||||||
* name. Like all global functions, the name must be unique. Note that,
|
|
||||||
* confusingly but correctly, the function itself can be static!
|
|
||||||
* @param name The name of the function
|
|
||||||
*/
|
|
||||||
#define APR_REGISTER_OPTIONAL_FN(name) do { \
|
|
||||||
APR_OPTIONAL_FN_TYPE(name) *apu__opt = name; \
|
|
||||||
apr_dynamic_fn_register(#name,(apr_opt_fn_t *)apu__opt); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/** @internal
|
|
||||||
* Private function! DO NOT USE!
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_opt_fn_t *) apr_dynamic_fn_retrieve(const char *szName);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve an optional function. Returns NULL if the function is not present.
|
|
||||||
* @param name The name of the function
|
|
||||||
*/
|
|
||||||
#define APR_RETRIEVE_OPTIONAL_FN(name) \
|
|
||||||
(APR_OPTIONAL_FN_TYPE(name) *)apr_dynamic_fn_retrieve(#name)
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* APR_OPTIONAL_H */
|
|
|
@ -1,117 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @file apr_optional_hooks.h
|
|
||||||
* @brief Apache optional hook functions
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef APR_OPTIONAL_HOOK_H
|
|
||||||
#define APR_OPTIONAL_HOOK_H
|
|
||||||
|
|
||||||
#include "apr_tables.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
/**
|
|
||||||
* @defgroup APR_Util_OPT_HOOK Optional Hook Functions
|
|
||||||
* @ingroup APR_Util_Hook
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* Function to implemnt the APR_OPTIONAL_HOOK Macro
|
|
||||||
* @internal
|
|
||||||
* @see APR_OPTIONAL_HOOK
|
|
||||||
*
|
|
||||||
* @param name The name of the hook
|
|
||||||
* @param pfn A pointer to a function that will be called
|
|
||||||
* @param aszPre a NULL-terminated array of strings that name modules whose hooks should precede this one
|
|
||||||
* @param aszSucc a NULL-terminated array of strings that name modules whose hooks should succeed this one
|
|
||||||
* @param nOrder an integer determining order before honouring aszPre and aszSucc (for example HOOK_MIDDLE)
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
APU_DECLARE(void) apr_optional_hook_add(const char *szName,void (*pfn)(void),
|
|
||||||
const char * const *aszPre,
|
|
||||||
const char * const *aszSucc,
|
|
||||||
int nOrder);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Hook to an optional hook.
|
|
||||||
*
|
|
||||||
* @param ns The namespace prefix of the hook functions
|
|
||||||
* @param name The name of the hook
|
|
||||||
* @param pfn A pointer to a function that will be called
|
|
||||||
* @param aszPre a NULL-terminated array of strings that name modules whose hooks should precede this one
|
|
||||||
* @param aszSucc a NULL-terminated array of strings that name modules whose hooks should succeed this one
|
|
||||||
* @param nOrder an integer determining order before honouring aszPre and aszSucc (for example HOOK_MIDDLE)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define APR_OPTIONAL_HOOK(ns,name,pfn,aszPre,aszSucc,nOrder) do { \
|
|
||||||
ns##_HOOK_##name##_t *apu__hook = pfn; \
|
|
||||||
apr_optional_hook_add(#name,(void (*)(void))apu__hook,aszPre, aszSucc, nOrder); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @internal
|
|
||||||
* @param szName - the name of the function
|
|
||||||
* @return the hook structure for a given hook
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_array_header_t *) apr_optional_hook_get(const char *szName);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implement an optional hook that runs until one of the functions
|
|
||||||
* returns something other than OK or DECLINE.
|
|
||||||
*
|
|
||||||
* @param ns The namespace prefix of the hook functions
|
|
||||||
* @param link The linkage declaration prefix of the hook
|
|
||||||
* @param ret The type of the return value of the hook
|
|
||||||
* @param ret The type of the return value of the hook
|
|
||||||
* @param name The name of the hook
|
|
||||||
* @param args_decl The declaration of the arguments for the hook
|
|
||||||
* @param args_use The names for the arguments for the hook
|
|
||||||
* @param ok Success value
|
|
||||||
* @param decline Decline value
|
|
||||||
*/
|
|
||||||
#define APR_IMPLEMENT_OPTIONAL_HOOK_RUN_ALL(ns,link,ret,name,args_decl,args_use,ok,decline) \
|
|
||||||
link##_DECLARE(ret) ns##_run_##name args_decl \
|
|
||||||
{ \
|
|
||||||
ns##_LINK_##name##_t *pHook; \
|
|
||||||
int n; \
|
|
||||||
ret rv; \
|
|
||||||
apr_array_header_t *pHookArray=apr_optional_hook_get(#name); \
|
|
||||||
\
|
|
||||||
if(!pHookArray) \
|
|
||||||
return ok; \
|
|
||||||
\
|
|
||||||
pHook=(ns##_LINK_##name##_t *)pHookArray->elts; \
|
|
||||||
for(n=0 ; n < pHookArray->nelts ; ++n) \
|
|
||||||
{ \
|
|
||||||
rv=(pHook[n].pFunc)args_use; \
|
|
||||||
\
|
|
||||||
if(rv != ok && rv != decline) \
|
|
||||||
return rv; \
|
|
||||||
} \
|
|
||||||
return ok; \
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* APR_OPTIONAL_HOOK_H */
|
|
|
@ -1,154 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef APR_QUEUE_H
|
|
||||||
#define APR_QUEUE_H
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file apr_queue.h
|
|
||||||
* @brief Thread Safe FIFO bounded queue
|
|
||||||
* @note Since most implementations of the queue are backed by a condition
|
|
||||||
* variable implementation, it isn't available on systems without threads.
|
|
||||||
* Although condition variables are some times available without threads.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apu.h"
|
|
||||||
#include "apr_errno.h"
|
|
||||||
#include "apr_pools.h"
|
|
||||||
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif /* __cplusplus */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup APR_Util_FIFO Thread Safe FIFO bounded queue
|
|
||||||
* @ingroup APR_Util
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* opaque structure
|
|
||||||
*/
|
|
||||||
typedef struct apr_queue_t apr_queue_t;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* create a FIFO queue
|
|
||||||
* @param queue The new queue
|
|
||||||
* @param queue_capacity maximum size of the queue
|
|
||||||
* @param a pool to allocate queue from
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_queue_create(apr_queue_t **queue,
|
|
||||||
unsigned int queue_capacity,
|
|
||||||
apr_pool_t *a);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* push/add a object to the queue, blocking if the queue is already full
|
|
||||||
*
|
|
||||||
* @param queue the queue
|
|
||||||
* @param data the data
|
|
||||||
* @returns APR_EINTR the blocking was interrupted (try again)
|
|
||||||
* @returns APR_EOF the queue has been terminated
|
|
||||||
* @returns APR_SUCCESS on a successfull push
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_queue_push(apr_queue_t *queue, void *data);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* pop/get an object from the queue, blocking if the queue is already empty
|
|
||||||
*
|
|
||||||
* @param queue the queue
|
|
||||||
* @param data the data
|
|
||||||
* @returns APR_EINTR the blocking was interrupted (try again)
|
|
||||||
* @returns APR_EOF if the queue has been terminated
|
|
||||||
* @returns APR_SUCCESS on a successfull pop
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_queue_pop(apr_queue_t *queue, void **data);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* pop/get an object from the queue, blocking if the queue is already empty
|
|
||||||
*
|
|
||||||
* @param queue the queue
|
|
||||||
* @param data the data
|
|
||||||
* @param timeout The amount of time in microseconds to wait. This is
|
|
||||||
* a maximum, not a minimum. If the condition is signaled, we
|
|
||||||
* will wake up before this time, otherwise the error APR_TIMEUP
|
|
||||||
* is returned.
|
|
||||||
* @returns APR_TIMEUP the request timed out
|
|
||||||
* @returns APR_EINTR the blocking was interrupted (try again)
|
|
||||||
* @returns APR_EOF if the queue has been terminated
|
|
||||||
* @returns APR_SUCCESS on a successfull pop
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_queue_pop_timeout(apr_queue_t *queue, void **data, apr_interval_time_t timeout);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* push/add a object to the queue, returning immediatly if the queue is full
|
|
||||||
*
|
|
||||||
* @param queue the queue
|
|
||||||
* @param data the data
|
|
||||||
* @returns APR_EINTR the blocking operation was interrupted (try again)
|
|
||||||
* @returns APR_EAGAIN the queue is full
|
|
||||||
* @returns APR_EOF the queue has been terminated
|
|
||||||
* @returns APR_SUCCESS on a successfull push
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_queue_trypush(apr_queue_t *queue, void *data);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* pop/get an object to the queue, returning immediatly if the queue is empty
|
|
||||||
*
|
|
||||||
* @param queue the queue
|
|
||||||
* @param data the data
|
|
||||||
* @returns APR_EINTR the blocking operation was interrupted (try again)
|
|
||||||
* @returns APR_EAGAIN the queue is empty
|
|
||||||
* @returns APR_EOF the queue has been terminated
|
|
||||||
* @returns APR_SUCCESS on a successfull push
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_queue_trypop(apr_queue_t *queue, void **data);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* returns the size of the queue.
|
|
||||||
*
|
|
||||||
* @warning this is not threadsafe, and is intended for reporting/monitoring
|
|
||||||
* of the queue.
|
|
||||||
* @param queue the queue
|
|
||||||
* @returns the size of the queue
|
|
||||||
*/
|
|
||||||
APU_DECLARE(unsigned int) apr_queue_size(apr_queue_t *queue);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* interrupt all the threads blocking on this queue.
|
|
||||||
*
|
|
||||||
* @param queue the queue
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_queue_interrupt_all(apr_queue_t *queue);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* terminate all queue, sendinging a interupt to all the
|
|
||||||
* blocking threads
|
|
||||||
*
|
|
||||||
* @param queue the queue
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_queue_term(apr_queue_t *queue);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
|
|
||||||
#endif /* APR_HAS_THREADS */
|
|
||||||
|
|
||||||
#endif /* APRQUEUE_H */
|
|
|
@ -1,144 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef APR_RESLIST_H
|
|
||||||
#define APR_RESLIST_H
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file apr_reslist.h
|
|
||||||
* @brief APR-UTIL Resource List Routines
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apr.h"
|
|
||||||
#include "apu.h"
|
|
||||||
#include "apr_pools.h"
|
|
||||||
#include "apr_errno.h"
|
|
||||||
#include "apr_time.h"
|
|
||||||
|
|
||||||
#if APR_HAS_THREADS
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup APR_Util_RL Resource List Routines
|
|
||||||
* @ingroup APR_Util
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif /* __cplusplus */
|
|
||||||
|
|
||||||
/** Opaque resource list object */
|
|
||||||
typedef struct apr_reslist_t apr_reslist_t;
|
|
||||||
|
|
||||||
/* Generic constructor called by resource list when it needs to create a
|
|
||||||
* resource.
|
|
||||||
* @param resource opaque resource
|
|
||||||
* @param param flags
|
|
||||||
* @param pool Pool
|
|
||||||
*/
|
|
||||||
typedef apr_status_t (*apr_reslist_constructor)(void **resource, void *params,
|
|
||||||
apr_pool_t *pool);
|
|
||||||
|
|
||||||
/* Generic destructor called by resource list when it needs to destroy a
|
|
||||||
* resource.
|
|
||||||
* @param resource opaque resource
|
|
||||||
* @param param flags
|
|
||||||
* @param pool Pool
|
|
||||||
*/
|
|
||||||
typedef apr_status_t (*apr_reslist_destructor)(void *resource, void *params,
|
|
||||||
apr_pool_t *pool);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a new resource list with the following parameters:
|
|
||||||
* @param reslist An address where the pointer to the new resource
|
|
||||||
* list will be stored.
|
|
||||||
* @param pool The pool to use for local storage and management
|
|
||||||
* @param min Allowed minimum number of available resources. Zero
|
|
||||||
* creates new resources only when needed.
|
|
||||||
* @param smax Resources will be destroyed to meet this maximum
|
|
||||||
* restriction as they expire.
|
|
||||||
* @param hmax Absolute maximum limit on the number of total resources.
|
|
||||||
* @param ttl If non-zero, sets the maximum amount of time a resource
|
|
||||||
* may be available while exceeding the soft limit.
|
|
||||||
* @param con Constructor routine that is called to create a new resource.
|
|
||||||
* @param de Destructor routine that is called to destroy an expired resource.
|
|
||||||
* @param params Passed to constructor and deconstructor
|
|
||||||
* @param pool The pool from which to create this resoure list. Also the
|
|
||||||
* same pool that is passed to the constructor and destructor
|
|
||||||
* routines.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_reslist_create(apr_reslist_t **reslist,
|
|
||||||
int min, int smax, int hmax,
|
|
||||||
apr_interval_time_t ttl,
|
|
||||||
apr_reslist_constructor con,
|
|
||||||
apr_reslist_destructor de,
|
|
||||||
void *params,
|
|
||||||
apr_pool_t *pool);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Destroy the given resource list and all resources controlled by
|
|
||||||
* this list.
|
|
||||||
* FIXME: Should this block until all resources become available,
|
|
||||||
* or maybe just destroy all the free ones, or maybe destroy
|
|
||||||
* them even though they might be in use by something else?
|
|
||||||
* Currently it will abort if there are resources that haven't
|
|
||||||
* been released, so there is an assumption that all resources
|
|
||||||
* have been released to the list before calling this function.
|
|
||||||
* @param reslist The reslist to destroy
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_reslist_destroy(apr_reslist_t *reslist);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve a resource from the list, creating a new one if necessary.
|
|
||||||
* If we have met our maximum number of resources, we will block
|
|
||||||
* until one becomes available.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_reslist_acquire(apr_reslist_t *reslist,
|
|
||||||
void **resource);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return a resource back to the list of available resources.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_reslist_release(apr_reslist_t *reslist,
|
|
||||||
void *resource);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the timeout the acquire will wait for a free resource
|
|
||||||
* when the maximum number of resources is exceeded.
|
|
||||||
* @param reslist The resource list.
|
|
||||||
* @param timeout Timeout to wait. The zero waits forewer.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(void) apr_reslist_timeout_set(apr_reslist_t *reslist,
|
|
||||||
apr_interval_time_t timeout);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Invalidate a resource in the pool - e.g. a database connection
|
|
||||||
* that returns a "lost connection" error and can't be restored.
|
|
||||||
* Use this instead of apr_reslist_release if the resource is bad.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_reslist_invalidate(apr_reslist_t *reslist,
|
|
||||||
void *resource);
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
|
|
||||||
#endif /* APR_HAS_THREADS */
|
|
||||||
|
|
||||||
#endif /* ! APR_RESLIST_H */
|
|
|
@ -1,137 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef APR_RMM_H
|
|
||||||
#define APR_RMM_H
|
|
||||||
/**
|
|
||||||
* @file apr_rmm.h
|
|
||||||
* @brief APR-UTIL Relocatable Memory Management Routines
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @defgroup APR_Util_RMM Relocatable Memory Management Routines
|
|
||||||
* @ingroup APR_Util
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apr.h"
|
|
||||||
#include "apr_pools.h"
|
|
||||||
#include "apr_errno.h"
|
|
||||||
#include "apu.h"
|
|
||||||
#include "apr_anylock.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif /* __cplusplus */
|
|
||||||
|
|
||||||
/** Structure to access Relocatable, Managed Memory */
|
|
||||||
typedef struct apr_rmm_t apr_rmm_t;
|
|
||||||
|
|
||||||
/** Fundamental allocation unit, within a specific apr_rmm_t */
|
|
||||||
typedef apr_size_t apr_rmm_off_t;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize a relocatable memory block to be managed by the apr_rmm API.
|
|
||||||
* @param rmm The relocatable memory block
|
|
||||||
* @param lock An apr_anylock_t of the appropriate type of lock, or NULL
|
|
||||||
* if no locking is required.
|
|
||||||
* @param membuf The block of relocatable memory to be managed
|
|
||||||
* @param memsize The size of relocatable memory block to be managed
|
|
||||||
* @param cont The pool to use for local storage and management
|
|
||||||
* @remark Both @param membuf and @param memsize must be aligned
|
|
||||||
* (for instance using APR_ALIGN_DEFAULT).
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_rmm_init(apr_rmm_t **rmm, apr_anylock_t *lock,
|
|
||||||
void *membuf, apr_size_t memsize,
|
|
||||||
apr_pool_t *cont);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Destroy a managed memory block.
|
|
||||||
* @param rmm The relocatable memory block to destroy
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_rmm_destroy(apr_rmm_t *rmm);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Attach to a relocatable memory block already managed by the apr_rmm API.
|
|
||||||
* @param rmm The relocatable memory block
|
|
||||||
* @param lock An apr_anylock_t of the appropriate type of lock
|
|
||||||
* @param membuf The block of relocatable memory already under management
|
|
||||||
* @param cont The pool to use for local storage and management
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_rmm_attach(apr_rmm_t **rmm, apr_anylock_t *lock,
|
|
||||||
void *membuf, apr_pool_t *cont);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Detach from the managed block of memory.
|
|
||||||
* @param rmm The relocatable memory block to detach from
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_rmm_detach(apr_rmm_t *rmm);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Allocate memory from the block of relocatable memory.
|
|
||||||
* @param rmm The relocatable memory block
|
|
||||||
* @param reqsize How much memory to allocate
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_rmm_off_t) apr_rmm_malloc(apr_rmm_t *rmm, apr_size_t reqsize);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Realloc memory from the block of relocatable memory.
|
|
||||||
* @param rmm The relocatable memory block
|
|
||||||
* @param entity The memory allocation to realloc
|
|
||||||
* @param reqsize The new size
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_rmm_off_t) apr_rmm_realloc(apr_rmm_t *rmm, void *entity, apr_size_t reqsize);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Allocate memory from the block of relocatable memory and initialize it to zero.
|
|
||||||
* @param rmm The relocatable memory block
|
|
||||||
* @param reqsize How much memory to allocate
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_rmm_off_t) apr_rmm_calloc(apr_rmm_t *rmm, apr_size_t reqsize);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Free allocation returned by apr_rmm_malloc or apr_rmm_calloc.
|
|
||||||
* @param rmm The relocatable memory block
|
|
||||||
* @param entity The memory allocation to free
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_rmm_free(apr_rmm_t *rmm, apr_rmm_off_t entity);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve the physical address of a relocatable allocation of memory
|
|
||||||
* @param rmm The relocatable memory block
|
|
||||||
* @param entity The memory allocation to free
|
|
||||||
* @return address The address, aligned with APR_ALIGN_DEFAULT.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(void *) apr_rmm_addr_get(apr_rmm_t *rmm, apr_rmm_off_t entity);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Compute the offset of a relocatable allocation of memory
|
|
||||||
* @param rmm The relocatable memory block
|
|
||||||
* @param entity The physical address to convert to an offset
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_rmm_off_t) apr_rmm_offset_get(apr_rmm_t *rmm, void *entity);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Compute the required overallocation of memory needed to fit n allocs
|
|
||||||
* @param n The number of alloc/calloc regions desired
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_size_t) apr_rmm_overhead_get(int n);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
/** @} */
|
|
||||||
#endif /* ! APR_RMM_H */
|
|
||||||
|
|
|
@ -1,175 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* sdbm - ndbm work-alike hashed database library
|
|
||||||
* based on Per-Ake Larson's Dynamic Hashing algorithms. BIT 18 (1978).
|
|
||||||
* author: oz@nexus.yorku.ca
|
|
||||||
* status: ex-public domain
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef APR_SDBM_H
|
|
||||||
#define APR_SDBM_H
|
|
||||||
|
|
||||||
#include "apu.h"
|
|
||||||
#include "apr_errno.h"
|
|
||||||
#include "apr_file_io.h" /* for apr_fileperms_t */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file apr_sdbm.h
|
|
||||||
* @brief apr-util SDBM library
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @defgroup APR_Util_DBM_SDBM SDBM library
|
|
||||||
* @ingroup APR_Util_DBM
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Structure for referencing an sdbm
|
|
||||||
*/
|
|
||||||
typedef struct apr_sdbm_t apr_sdbm_t;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Structure for referencing the datum record within an sdbm
|
|
||||||
*/
|
|
||||||
typedef struct {
|
|
||||||
/** pointer to the data stored/retrieved */
|
|
||||||
char *dptr;
|
|
||||||
/** size of data */
|
|
||||||
int dsize;
|
|
||||||
} apr_sdbm_datum_t;
|
|
||||||
|
|
||||||
/* The extensions used for the database files */
|
|
||||||
/** SDBM Directory file extension */
|
|
||||||
#define APR_SDBM_DIRFEXT ".dir"
|
|
||||||
/** SDBM page file extension */
|
|
||||||
#define APR_SDBM_PAGFEXT ".pag"
|
|
||||||
|
|
||||||
/* flags to sdbm_store */
|
|
||||||
#define APR_SDBM_INSERT 0 /**< Insert */
|
|
||||||
#define APR_SDBM_REPLACE 1 /**< Replace */
|
|
||||||
#define APR_SDBM_INSERTDUP 2 /**< Insert with duplicates */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Open an sdbm database by file name
|
|
||||||
* @param db The newly opened database
|
|
||||||
* @param name The sdbm file to open
|
|
||||||
* @param mode The flag values (APR_READ and APR_BINARY flags are implicit)
|
|
||||||
* <PRE>
|
|
||||||
* APR_WRITE open for read-write access
|
|
||||||
* APR_CREATE create the sdbm if it does not exist
|
|
||||||
* APR_TRUNCATE empty the contents of the sdbm
|
|
||||||
* APR_EXCL fail for APR_CREATE if the file exists
|
|
||||||
* APR_DELONCLOSE delete the sdbm when closed
|
|
||||||
* APR_SHARELOCK support locking across process/machines
|
|
||||||
* </PRE>
|
|
||||||
* @param perms Permissions to apply to if created
|
|
||||||
* @param p The pool to use when creating the sdbm
|
|
||||||
* @remark The sdbm name is not a true file name, as sdbm appends suffixes
|
|
||||||
* for seperate data and index files.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_sdbm_open(apr_sdbm_t **db, const char *name,
|
|
||||||
apr_int32_t mode,
|
|
||||||
apr_fileperms_t perms, apr_pool_t *p);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Close an sdbm file previously opened by apr_sdbm_open
|
|
||||||
* @param db The database to close
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_sdbm_close(apr_sdbm_t *db);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Lock an sdbm database for concurency of multiple operations
|
|
||||||
* @param db The database to lock
|
|
||||||
* @param type The lock type
|
|
||||||
* <PRE>
|
|
||||||
* APR_FLOCK_SHARED
|
|
||||||
* APR_FLOCK_EXCLUSIVE
|
|
||||||
* </PRE>
|
|
||||||
* @remark Calls to apr_sdbm_lock may be nested. All apr_sdbm functions
|
|
||||||
* perform implicit locking. Since an APR_FLOCK_SHARED lock cannot be
|
|
||||||
* portably promoted to an APR_FLOCK_EXCLUSIVE lock, apr_sdbm_store and
|
|
||||||
* apr_sdbm_delete calls will fail if an APR_FLOCK_SHARED lock is held.
|
|
||||||
* The apr_sdbm_lock call requires the database to be opened with the
|
|
||||||
* APR_SHARELOCK mode value.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_sdbm_lock(apr_sdbm_t *db, int type);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Release an sdbm lock previously aquired by apr_sdbm_lock
|
|
||||||
* @param db The database to unlock
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_sdbm_unlock(apr_sdbm_t *db);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fetch an sdbm record value by key
|
|
||||||
* @param db The database
|
|
||||||
* @param value The value datum retrieved for this record
|
|
||||||
* @param key The key datum to find this record
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_sdbm_fetch(apr_sdbm_t *db,
|
|
||||||
apr_sdbm_datum_t *value,
|
|
||||||
apr_sdbm_datum_t key);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Store an sdbm record value by key
|
|
||||||
* @param db The database
|
|
||||||
* @param key The key datum to store this record by
|
|
||||||
* @param value The value datum to store in this record
|
|
||||||
* @param opt The method used to store the record
|
|
||||||
* <PRE>
|
|
||||||
* APR_SDBM_INSERT return an error if the record exists
|
|
||||||
* APR_SDBM_REPLACE overwrite any existing record for key
|
|
||||||
* </PRE>
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_sdbm_store(apr_sdbm_t *db, apr_sdbm_datum_t key,
|
|
||||||
apr_sdbm_datum_t value, int opt);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete an sdbm record value by key
|
|
||||||
* @param db The database
|
|
||||||
* @param key The key datum of the record to delete
|
|
||||||
* @remark It is not an error to delete a non-existent record.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_sdbm_delete(apr_sdbm_t *db,
|
|
||||||
const apr_sdbm_datum_t key);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve the first record key from a dbm
|
|
||||||
* @param db The database
|
|
||||||
* @param key The key datum of the first record
|
|
||||||
* @remark The keys returned are not ordered. To traverse the list of keys
|
|
||||||
* for an sdbm opened with APR_SHARELOCK, the caller must use apr_sdbm_lock
|
|
||||||
* prior to retrieving the first record, and hold the lock until after the
|
|
||||||
* last call to apr_sdbm_nextkey.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_sdbm_firstkey(apr_sdbm_t *db, apr_sdbm_datum_t *key);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve the next record key from an sdbm
|
|
||||||
* @param db The database
|
|
||||||
* @param key The key datum of the next record
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_sdbm_nextkey(apr_sdbm_t *db, apr_sdbm_datum_t *key);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if the sdbm database opened for read-only access
|
|
||||||
* @param db The database to test
|
|
||||||
*/
|
|
||||||
APU_DECLARE(int) apr_sdbm_rdonly(apr_sdbm_t *db);
|
|
||||||
/** @} */
|
|
||||||
#endif /* APR_SDBM_H */
|
|
|
@ -1,121 +0,0 @@
|
||||||
/* Copyright 2001-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
/* NIST Secure Hash Algorithm
|
|
||||||
* heavily modified by Uwe Hollerbach uh@alumni.caltech edu
|
|
||||||
* from Peter C. Gutmann's implementation as found in
|
|
||||||
* Applied Cryptography by Bruce Schneier
|
|
||||||
* This code is hereby placed in the public domain
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef APR_SHA1_H
|
|
||||||
#define APR_SHA1_H
|
|
||||||
|
|
||||||
#include "apu.h"
|
|
||||||
#include "apr_general.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file apr_sha1.h
|
|
||||||
* @brief APR-UTIL SHA1 library
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** size of the SHA1 DIGEST */
|
|
||||||
#define APR_SHA1_DIGESTSIZE 20
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Define the Magic String prefix that identifies a password as being
|
|
||||||
* hashed using our algorithm.
|
|
||||||
*/
|
|
||||||
#define APR_SHA1PW_ID "{SHA}"
|
|
||||||
|
|
||||||
/** length of the SHA Password */
|
|
||||||
#define APR_SHA1PW_IDLEN 5
|
|
||||||
|
|
||||||
/** @see apr_sha1_ctx_t */
|
|
||||||
typedef struct apr_sha1_ctx_t apr_sha1_ctx_t;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SHA1 context structure
|
|
||||||
*/
|
|
||||||
struct apr_sha1_ctx_t {
|
|
||||||
/** message digest */
|
|
||||||
apr_uint32_t digest[5];
|
|
||||||
/** 64-bit bit counts */
|
|
||||||
apr_uint32_t count_lo, count_hi;
|
|
||||||
/** SHA data buffer */
|
|
||||||
apr_uint32_t data[16];
|
|
||||||
/** unprocessed amount in data */
|
|
||||||
int local;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Provide a means to SHA1 crypt/encode a plaintext password in a way which
|
|
||||||
* makes password file compatible with those commonly use in netscape web
|
|
||||||
* and ldap installations.
|
|
||||||
* @param clear The plaintext password
|
|
||||||
* @param len The length of the plaintext password
|
|
||||||
* @param out The encrypted/encoded password
|
|
||||||
* @note SHA1 support is useful for migration purposes, but is less
|
|
||||||
* secure than Apache's password format, since Apache's (MD5)
|
|
||||||
* password format uses a random eight character salt to generate
|
|
||||||
* one of many possible hashes for the same password. Netscape
|
|
||||||
* uses plain SHA1 without a salt, so the same password
|
|
||||||
* will always generate the same hash, making it easier
|
|
||||||
* to break since the search space is smaller.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(void) apr_sha1_base64(const char *clear, int len, char *out);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize the SHA digest
|
|
||||||
* @param context The SHA context to initialize
|
|
||||||
*/
|
|
||||||
APU_DECLARE(void) apr_sha1_init(apr_sha1_ctx_t *context);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update the SHA digest
|
|
||||||
* @param context The SHA1 context to update
|
|
||||||
* @param input The buffer to add to the SHA digest
|
|
||||||
* @param inputLen The length of the input buffer
|
|
||||||
*/
|
|
||||||
APU_DECLARE(void) apr_sha1_update(apr_sha1_ctx_t *context, const char *input,
|
|
||||||
unsigned int inputLen);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update the SHA digest with binary data
|
|
||||||
* @param context The SHA1 context to update
|
|
||||||
* @param input The buffer to add to the SHA digest
|
|
||||||
* @param inputLen The length of the input buffer
|
|
||||||
*/
|
|
||||||
APU_DECLARE(void) apr_sha1_update_binary(apr_sha1_ctx_t *context,
|
|
||||||
const unsigned char *input,
|
|
||||||
unsigned int inputLen);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Finish computing the SHA digest
|
|
||||||
* @param digest the output buffer in which to store the digest
|
|
||||||
* @param context The context to finalize
|
|
||||||
*/
|
|
||||||
APU_DECLARE(void) apr_sha1_final(unsigned char digest[APR_SHA1_DIGESTSIZE],
|
|
||||||
apr_sha1_ctx_t *context);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* APR_SHA1_H */
|
|
|
@ -1,81 +0,0 @@
|
||||||
/* Copyright 2002-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef APR_STRMATCH_H
|
|
||||||
#define APR_STRMATCH_H
|
|
||||||
/**
|
|
||||||
* @file apr_strmatch.h
|
|
||||||
* @brief APR-UTIL string matching routines
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "apu.h"
|
|
||||||
#include "apr_pools.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup APR_Util_StrMatch String matching routines
|
|
||||||
* @ingroup APR_Util
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @see apr_strmatch_pattern */
|
|
||||||
typedef struct apr_strmatch_pattern apr_strmatch_pattern;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Precompiled search pattern
|
|
||||||
*/
|
|
||||||
struct apr_strmatch_pattern {
|
|
||||||
/** Function called to compare */
|
|
||||||
const char *(*compare)(const apr_strmatch_pattern *this_pattern,
|
|
||||||
const char *s, apr_size_t slen);
|
|
||||||
const char *pattern; /**< Current pattern */
|
|
||||||
apr_size_t length; /**< Current length */
|
|
||||||
void *context; /**< hook to add precomputed metadata */
|
|
||||||
};
|
|
||||||
|
|
||||||
#if defined(DOXYGEN)
|
|
||||||
/**
|
|
||||||
* Search for a precompiled pattern within a string
|
|
||||||
* @param pattern The pattern
|
|
||||||
* @param s The string in which to search for the pattern
|
|
||||||
* @param slen The length of s (excluding null terminator)
|
|
||||||
* @return A pointer to the first instance of the pattern in s, or
|
|
||||||
* NULL if not found
|
|
||||||
*/
|
|
||||||
APU_DECLARE(const char *) apr_strmatch(const apr_strmatch_pattern *pattern,
|
|
||||||
const char *s, apr_size_t slen);
|
|
||||||
#else
|
|
||||||
#define apr_strmatch(pattern, s, slen) (*((pattern)->compare))((pattern), (s), (slen))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Precompile a pattern for matching using the Boyer-Moore-Horspool algorithm
|
|
||||||
* @param p The pool from which to allocate the pattern
|
|
||||||
* @param s The pattern string
|
|
||||||
* @param case_sensitive Whether the matching should be case-sensitive
|
|
||||||
* @return a pointer to the compiled pattern, or NULL if compilation fails
|
|
||||||
*/
|
|
||||||
APU_DECLARE(const apr_strmatch_pattern *) apr_strmatch_precompile(apr_pool_t *p, const char *s, int case_sensitive);
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* !APR_STRMATCH_H */
|
|
|
@ -1,178 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* apr_uri.h: External Interface of apr_uri.c
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file apr_uri.h
|
|
||||||
* @brief APR-UTIL URI Routines
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef APR_URI_H
|
|
||||||
#define APR_URI_H
|
|
||||||
|
|
||||||
#include "apu.h"
|
|
||||||
|
|
||||||
#include "apr_network_io.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup APR_Util_URI URI
|
|
||||||
* @ingroup APR_Util
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define APR_URI_FTP_DEFAULT_PORT 21 /**< default FTP port */
|
|
||||||
#define APR_URI_SSH_DEFAULT_PORT 22 /**< default SSH port */
|
|
||||||
#define APR_URI_TELNET_DEFAULT_PORT 23 /**< default telnet port */
|
|
||||||
#define APR_URI_GOPHER_DEFAULT_PORT 70 /**< default Gopher port */
|
|
||||||
#define APR_URI_HTTP_DEFAULT_PORT 80 /**< default HTTP port */
|
|
||||||
#define APR_URI_POP_DEFAULT_PORT 110 /**< default POP port */
|
|
||||||
#define APR_URI_NNTP_DEFAULT_PORT 119 /**< default NNTP port */
|
|
||||||
#define APR_URI_IMAP_DEFAULT_PORT 143 /**< default IMAP port */
|
|
||||||
#define APR_URI_PROSPERO_DEFAULT_PORT 191 /**< default Prospero port */
|
|
||||||
#define APR_URI_WAIS_DEFAULT_PORT 210 /**< default WAIS port */
|
|
||||||
#define APR_URI_LDAP_DEFAULT_PORT 389 /**< default LDAP port */
|
|
||||||
#define APR_URI_HTTPS_DEFAULT_PORT 443 /**< default HTTPS port */
|
|
||||||
#define APR_URI_RTSP_DEFAULT_PORT 554 /**< default RTSP port */
|
|
||||||
#define APR_URI_SNEWS_DEFAULT_PORT 563 /**< default SNEWS port */
|
|
||||||
#define APR_URI_ACAP_DEFAULT_PORT 674 /**< default ACAP port */
|
|
||||||
#define APR_URI_NFS_DEFAULT_PORT 2049 /**< default NFS port */
|
|
||||||
#define APR_URI_TIP_DEFAULT_PORT 3372 /**< default TIP port */
|
|
||||||
#define APR_URI_SIP_DEFAULT_PORT 5060 /**< default SIP port */
|
|
||||||
|
|
||||||
/** Flags passed to unparse_uri_components(): */
|
|
||||||
/** suppress "scheme://user\@site:port" */
|
|
||||||
#define APR_URI_UNP_OMITSITEPART (1U<<0)
|
|
||||||
/** Just omit user */
|
|
||||||
#define APR_URI_UNP_OMITUSER (1U<<1)
|
|
||||||
/** Just omit password */
|
|
||||||
#define APR_URI_UNP_OMITPASSWORD (1U<<2)
|
|
||||||
/** omit "user:password\@" part */
|
|
||||||
#define APR_URI_UNP_OMITUSERINFO (APR_URI_UNP_OMITUSER | \
|
|
||||||
APR_URI_UNP_OMITPASSWORD)
|
|
||||||
/** Show plain text password (default: show XXXXXXXX) */
|
|
||||||
#define APR_URI_UNP_REVEALPASSWORD (1U<<3)
|
|
||||||
/** Show "scheme://user\@site:port" only */
|
|
||||||
#define APR_URI_UNP_OMITPATHINFO (1U<<4)
|
|
||||||
/** Omit the "?queryarg" from the path */
|
|
||||||
#define APR_URI_UNP_OMITQUERY (1U<<5)
|
|
||||||
|
|
||||||
/** @see apr_uri_t */
|
|
||||||
typedef struct apr_uri_t apr_uri_t;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A structure to encompass all of the fields in a uri
|
|
||||||
*/
|
|
||||||
struct apr_uri_t {
|
|
||||||
/** scheme ("http"/"ftp"/...) */
|
|
||||||
char *scheme;
|
|
||||||
/** combined [user[:password]\@]host[:port] */
|
|
||||||
char *hostinfo;
|
|
||||||
/** user name, as in http://user:passwd\@host:port/ */
|
|
||||||
char *user;
|
|
||||||
/** password, as in http://user:passwd\@host:port/ */
|
|
||||||
char *password;
|
|
||||||
/** hostname from URI (or from Host: header) */
|
|
||||||
char *hostname;
|
|
||||||
/** port string (integer representation is in "port") */
|
|
||||||
char *port_str;
|
|
||||||
/** the request path (or "/" if only scheme://host was given) */
|
|
||||||
char *path;
|
|
||||||
/** Everything after a '?' in the path, if present */
|
|
||||||
char *query;
|
|
||||||
/** Trailing "#fragment" string, if present */
|
|
||||||
char *fragment;
|
|
||||||
|
|
||||||
/** structure returned from gethostbyname() */
|
|
||||||
struct hostent *hostent;
|
|
||||||
|
|
||||||
/** The port number, numeric, valid only if port_str != NULL */
|
|
||||||
apr_port_t port;
|
|
||||||
|
|
||||||
/** has the structure been initialized */
|
|
||||||
unsigned is_initialized:1;
|
|
||||||
|
|
||||||
/** has the DNS been looked up yet */
|
|
||||||
unsigned dns_looked_up:1;
|
|
||||||
/** has the dns been resolved yet */
|
|
||||||
unsigned dns_resolved:1;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* apr_uri.c */
|
|
||||||
/**
|
|
||||||
* Return the default port for a given scheme. The schemes recognized are
|
|
||||||
* http, ftp, https, gopher, wais, nntp, snews, and prospero
|
|
||||||
* @param scheme_str The string that contains the current scheme
|
|
||||||
* @return The default port for this scheme
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_port_t) apr_uri_port_of_scheme(const char *scheme_str);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Unparse a apr_uri_t structure to an URI string. Optionally
|
|
||||||
* suppress the password for security reasons.
|
|
||||||
* @param p The pool to allocate out of
|
|
||||||
* @param uptr All of the parts of the uri
|
|
||||||
* @param flags How to unparse the uri. One of:
|
|
||||||
* <PRE>
|
|
||||||
* APR_URI_UNP_OMITSITEPART Suppress "scheme://user\@site:port"
|
|
||||||
* APR_URI_UNP_OMITUSER Just omit user
|
|
||||||
* APR_URI_UNP_OMITPASSWORD Just omit password
|
|
||||||
* APR_URI_UNP_OMITUSERINFO Omit "user:password\@" part
|
|
||||||
* APR_URI_UNP_REVEALPASSWORD Show plain text password (default: show XXXXXXXX)
|
|
||||||
* APR_URI_UNP_OMITPATHINFO Show "scheme://user\@site:port" only
|
|
||||||
* APR_URI_UNP_OMITQUERY Omit "?queryarg" or "#fragment"
|
|
||||||
* </PRE>
|
|
||||||
* @return The uri as a string
|
|
||||||
*/
|
|
||||||
APU_DECLARE(char *) apr_uri_unparse(apr_pool_t *p,
|
|
||||||
const apr_uri_t *uptr,
|
|
||||||
unsigned flags);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse a given URI, fill in all supplied fields of a apr_uri_t
|
|
||||||
* structure. This eliminates the necessity of extracting host, port,
|
|
||||||
* path, query info repeatedly in the modules.
|
|
||||||
* @param p The pool to allocate out of
|
|
||||||
* @param uri The uri to parse
|
|
||||||
* @param uptr The apr_uri_t to fill out
|
|
||||||
* @return APR_SUCCESS for success or error code
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_uri_parse(apr_pool_t *p, const char *uri,
|
|
||||||
apr_uri_t *uptr);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Special case for CONNECT parsing: it comes with the hostinfo part only
|
|
||||||
* @param p The pool to allocate out of
|
|
||||||
* @param hostinfo The hostinfo string to parse
|
|
||||||
* @param uptr The apr_uri_t to fill out
|
|
||||||
* @return APR_SUCCESS for success or error code
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_uri_parse_hostinfo(apr_pool_t *p,
|
|
||||||
const char *hostinfo,
|
|
||||||
apr_uri_t *uptr);
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* APR_URI_H */
|
|
|
@ -1,76 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file apr_uuid.h
|
|
||||||
* @brief APR UUID library
|
|
||||||
*/
|
|
||||||
#ifndef APR_UUID_H
|
|
||||||
#define APR_UUID_H
|
|
||||||
|
|
||||||
#include "apu.h"
|
|
||||||
#include "apr_errno.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif /* __cplusplus */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup APR_UUID UUID Handling
|
|
||||||
* @ingroup APR
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* we represent a UUID as a block of 16 bytes.
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
unsigned char data[16]; /**< the actual UUID */
|
|
||||||
} apr_uuid_t;
|
|
||||||
|
|
||||||
/** UUIDs are formatted as: 00112233-4455-6677-8899-AABBCCDDEEFF */
|
|
||||||
#define APR_UUID_FORMATTED_LENGTH 36
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate and return a (new) UUID
|
|
||||||
* @param uuid The resulting UUID
|
|
||||||
*/
|
|
||||||
APU_DECLARE(void) apr_uuid_get(apr_uuid_t *uuid);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Format a UUID into a string, following the standard format
|
|
||||||
* @param buffer The buffer to place the formatted UUID string into. It must
|
|
||||||
* be at least APR_UUID_FORMATTED_LENGTH + 1 bytes long to hold
|
|
||||||
* the formatted UUID and a null terminator
|
|
||||||
* @param uuid The UUID to format
|
|
||||||
*/
|
|
||||||
APU_DECLARE(void) apr_uuid_format(char *buffer, const apr_uuid_t *uuid);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse a standard-format string into a UUID
|
|
||||||
* @param uuid The resulting UUID
|
|
||||||
* @param uuid_str The formatted UUID
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_uuid_parse(apr_uuid_t *uuid, const char *uuid_str);
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* APR_UUID_H */
|
|
|
@ -1,163 +0,0 @@
|
||||||
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
|
|
||||||
* applicable.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef APR_XLATE_H
|
|
||||||
#define APR_XLATE_H
|
|
||||||
|
|
||||||
#include "apu.h"
|
|
||||||
#include "apr_pools.h"
|
|
||||||
#include "apr_errno.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif /* __cplusplus */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file apr_xlate.h
|
|
||||||
* @brief APR I18N translation library
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup APR_XLATE I18N translation library
|
|
||||||
* @ingroup APR
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/** Opaque translation buffer */
|
|
||||||
typedef struct apr_xlate_t apr_xlate_t;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set up for converting text from one charset to another.
|
|
||||||
* @param convset The handle to be filled in by this function
|
|
||||||
* @param topage The name of the target charset
|
|
||||||
* @param frompage The name of the source charset
|
|
||||||
* @param pool The pool to use
|
|
||||||
* @remark
|
|
||||||
* Specify APR_DEFAULT_CHARSET for one of the charset
|
|
||||||
* names to indicate the charset of the source code at
|
|
||||||
* compile time. This is useful if there are literal
|
|
||||||
* strings in the source code which must be translated
|
|
||||||
* according to the charset of the source code.
|
|
||||||
* APR_DEFAULT_CHARSET is not useful if the source code
|
|
||||||
* of the caller was not encoded in the same charset as
|
|
||||||
* APR at compile time.
|
|
||||||
*
|
|
||||||
* @remark
|
|
||||||
* Specify APR_LOCALE_CHARSET for one of the charset
|
|
||||||
* names to indicate the charset of the current locale.
|
|
||||||
*
|
|
||||||
* @remark
|
|
||||||
* Return APR_EINVAL if unable to procure a convset, or APR_ENOTIMPL
|
|
||||||
* if charset transcoding is not available in this instance of
|
|
||||||
* apr-util at all (i.e., APR_HAS_XLATE is undefined).
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_xlate_open(apr_xlate_t **convset,
|
|
||||||
const char *topage,
|
|
||||||
const char *frompage,
|
|
||||||
apr_pool_t *pool);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This is to indicate the charset of the sourcecode at compile time
|
|
||||||
* names to indicate the charset of the source code at
|
|
||||||
* compile time. This is useful if there are literal
|
|
||||||
* strings in the source code which must be translated
|
|
||||||
* according to the charset of the source code.
|
|
||||||
*/
|
|
||||||
#define APR_DEFAULT_CHARSET (const char *)0
|
|
||||||
/**
|
|
||||||
* To indicate charset names of the current locale
|
|
||||||
*/
|
|
||||||
#define APR_LOCALE_CHARSET (const char *)1
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Find out whether or not the specified conversion is single-byte-only.
|
|
||||||
* @param convset The handle allocated by apr_xlate_open, specifying the
|
|
||||||
* parameters of conversion
|
|
||||||
* @param onoff Output: whether or not the conversion is single-byte-only
|
|
||||||
* @remark
|
|
||||||
* Return APR_ENOTIMPL if charset transcoding is not available
|
|
||||||
* in this instance of apr-util (i.e., APR_HAS_XLATE is undefined).
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_xlate_sb_get(apr_xlate_t *convset, int *onoff);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert a buffer of text from one codepage to another.
|
|
||||||
* @param convset The handle allocated by apr_xlate_open, specifying
|
|
||||||
* the parameters of conversion
|
|
||||||
* @param inbuf The address of the source buffer
|
|
||||||
* @param inbytes_left Input: the amount of input data to be translated
|
|
||||||
* Output: the amount of input data not yet translated
|
|
||||||
* @param outbuf The address of the destination buffer
|
|
||||||
* @param outbytes_left Input: the size of the output buffer
|
|
||||||
* Output: the amount of the output buffer not yet used
|
|
||||||
* @remark
|
|
||||||
* Returns APR_ENOTIMPL if charset transcoding is not available
|
|
||||||
* in this instance of apr-util (i.e., APR_HAS_XLATE is undefined).
|
|
||||||
* Returns APR_INCOMPLETE if the input buffer ends in an incomplete
|
|
||||||
* multi-byte character.
|
|
||||||
*
|
|
||||||
* To correctly terminate the output buffer for some multi-byte
|
|
||||||
* character set encodings, a final call must be made to this function
|
|
||||||
* after the complete input string has been converted, passing
|
|
||||||
* the inbuf and inbytes_left parameters as NULL. (Note that this
|
|
||||||
* mode only works from version 1.1.0 onwards)
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_xlate_conv_buffer(apr_xlate_t *convset,
|
|
||||||
const char *inbuf,
|
|
||||||
apr_size_t *inbytes_left,
|
|
||||||
char *outbuf,
|
|
||||||
apr_size_t *outbytes_left);
|
|
||||||
|
|
||||||
/* @see apr_file_io.h the comment in apr_file_io.h about this hack */
|
|
||||||
#ifdef APR_NOT_DONE_YET
|
|
||||||
/**
|
|
||||||
* The purpose of apr_xlate_conv_char is to translate one character
|
|
||||||
* at a time. This needs to be written carefully so that it works
|
|
||||||
* with double-byte character sets.
|
|
||||||
* @param convset The handle allocated by apr_xlate_open, specifying the
|
|
||||||
* parameters of conversion
|
|
||||||
* @param inchar The character to convert
|
|
||||||
* @param outchar The converted character
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_xlate_conv_char(apr_xlate_t *convset,
|
|
||||||
char inchar, char outchar);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert a single-byte character from one charset to another.
|
|
||||||
* @param convset The handle allocated by apr_xlate_open, specifying the
|
|
||||||
* parameters of conversion
|
|
||||||
* @param inchar The single-byte character to convert.
|
|
||||||
* @warning This only works when converting between single-byte character sets.
|
|
||||||
* -1 will be returned if the conversion can't be performed.
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_int32_t) apr_xlate_conv_byte(apr_xlate_t *convset,
|
|
||||||
unsigned char inchar);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Close a codepage translation handle.
|
|
||||||
* @param convset The codepage translation handle to close
|
|
||||||
* @remark
|
|
||||||
* Return APR_ENOTIMPL if charset transcoding is not available
|
|
||||||
* in this instance of apr-util (i.e., APR_HAS_XLATE is undefined).
|
|
||||||
*/
|
|
||||||
APU_DECLARE(apr_status_t) apr_xlate_close(apr_xlate_t *convset);
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* ! APR_XLATE_H */
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue