Import apache apr-util 1.4.1

This commit is contained in:
Peter Wemm 2013-06-18 01:59:55 +00:00
commit cce25783c6
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/vendor/apr-util/dist/; revision=251876
svn path=/vendor/apr-util/apr-util-1.4.1/; revision=251879; tag=vendor/apr-util/apr-util-1.4.1
190 changed files with 93934 additions and 0 deletions

62
CHANGES Normal file
View File

@ -0,0 +1,62 @@
-*- coding: utf-8 -*-
Changes with APR-Util 1.4.1
*) Apply Windows build fixes for the apr_crypto API. [Mladen Turk]
Changes with APR-util 1.4.0
*) apr_ldap_init: Pass secure=1 to ldapssl_init() with Solaris LDAP SDK.
PR: 42682 [Stefan Fritsch]
*) apr_memcache_server_create: Fix possible segfault. PR 51064.
[Michajlo Matijkiw <michajlo_matijkiw comcast com>]
*) apr_thread_pool: Fix thread unsafe pool usage. [Stefan Fritsch]
*) Do not include apr.h and apr_errno.h from system search path in
apu_errno.h. PR 46487 [Rainer Jung]
*) Add optional dbm, openssl and nss subpackages to the RPM spec file.
[Graham Leggett]
*) apr_dbd_freetds: The sybdb.h header file might be freetds/sybdb.h
or sybdb.h. [Graham Leggett]
*) Add apr_crypto implementations for OpenSSL and Mozilla NSS. Add a unit
test to verify the interoperability of the two modules. Builds default
to disabled unless explicitly enabled.
[Graham Leggett]
*) Add the apr_crypto interface, a rewrite of the earlier apr_ssl code,
based on the modular dso interface used for dbd and ldap. Initially,
the interface supports symmetrical encryption and decryption. The
purpose of the interface is to offer portable and interoperable
access to basic crypto using the native crypto libraries present on
each platform. [Graham Leggett]
*) Add trace probes to hooks, making it easier to inspect APR Hook based
applications with DTrace or other such mechanisms.
[Theo Schlossnagle <jesus omniti.com>, generalized by Jeff Trawick]
*) Implement resource list when threads are unavailable. PR 24325
[Bojan Smojver]
Changes for APR-util 1.3.x and later:
*) http://svn.apache.org/viewvc/apr/apr-util/branches/1.3.x/CHANGES?view=markup
Changes for APR-util 1.2.x and later:
*) http://svn.apache.org/viewvc/apr/apr-util/branches/1.2.x/CHANGES?view=markup
Changes for APR-util 1.1.x and later:
*) http://svn.apache.org/viewvc/apr/apr-util/branches/1.1.x/CHANGES?view=markup
Changes for APR-util 1.0.x and later:
*) http://svn.apache.org/viewvc/apr/apr-util/branches/1.0.x/CHANGES?view=markup
Changes for APR-util 0.9.x and later/earlier:
*) http://svn.apache.org/viewvc/apr/apr-util/branches/0.9.x/CHANGES?view=markup

443
LICENSE Normal file
View File

@ -0,0 +1,443 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
APACHE PORTABLE RUNTIME SUBCOMPONENTS:
The Apache Portable Runtime includes a number of subcomponents with
separate copyright notices and license terms. Your use of the source
code for the these subcomponents is subject to the terms and
conditions of the following licenses.
For the include\apr_md5.h component:
/*
* This is work is derived from material Copyright RSA Data Security, Inc.
*
* The RSA copyright statement and Licence for that original material is
* included below. This is followed by the Apache copyright statement and
* licence for the modifications made to that material.
*/
/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
rights reserved.
License to copy and use this software is granted provided that it
is identified as the "RSA Data Security, Inc. MD5 Message-Digest
Algorithm" in all material mentioning or referencing this software
or this function.
License is also granted to make and use derivative works provided
that such works are identified as "derived from the RSA Data
Security, Inc. MD5 Message-Digest Algorithm" in all material
mentioning or referencing the derived work.
RSA Data Security, Inc. makes no representations concerning either
the merchantability of this software or the suitability of this
software for any particular purpose. It is provided "as is"
without express or implied warranty of any kind.
These notices must be retained in any copies of any part of this
documentation and/or software.
*/
For the passwd\apr_md5.c component:
/*
* This is work is derived from material Copyright RSA Data Security, Inc.
*
* The RSA copyright statement and Licence for that original material is
* included below. This is followed by the Apache copyright statement and
* licence for the modifications made to that material.
*/
/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
*/
/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
rights reserved.
License to copy and use this software is granted provided that it
is identified as the "RSA Data Security, Inc. MD5 Message-Digest
Algorithm" in all material mentioning or referencing this software
or this function.
License is also granted to make and use derivative works provided
that such works are identified as "derived from the RSA Data
Security, Inc. MD5 Message-Digest Algorithm" in all material
mentioning or referencing the derived work.
RSA Data Security, Inc. makes no representations concerning either
the merchantability of this software or the suitability of this
software for any particular purpose. It is provided "as is"
without express or implied warranty of any kind.
These notices must be retained in any copies of any part of this
documentation and/or software.
*/
/*
* The apr_md5_encode() routine uses much code obtained from the FreeBSD 3.0
* MD5 crypt() function, which is licenced as follows:
* ----------------------------------------------------------------------------
* "THE BEER-WARE LICENSE" (Revision 42):
* <phk@login.dknet.dk> wrote this file. As long as you retain this notice you
* can do whatever you want with this stuff. If we meet some day, and you think
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
* ----------------------------------------------------------------------------
*/
For the crypto\apr_md4.c component:
* This is derived from material copyright RSA Data Security, Inc.
* Their notice is reproduced below in its entirety.
*
* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
* rights reserved.
*
* License to copy and use this software is granted provided that it
* is identified as the "RSA Data Security, Inc. MD4 Message-Digest
* Algorithm" in all material mentioning or referencing this software
* or this function.
*
* License is also granted to make and use derivative works provided
* that such works are identified as "derived from the RSA Data
* Security, Inc. MD4 Message-Digest Algorithm" in all material
* mentioning or referencing the derived work.
*
* RSA Data Security, Inc. makes no representations concerning either
* the merchantability of this software or the suitability of this
* software for any particular purpose. It is provided "as is"
* without express or implied warranty of any kind.
*
* These notices must be retained in any copies of any part of this
* documentation and/or software.
*/
For the include\apr_md4.h component:
*
* This is derived from material copyright RSA Data Security, Inc.
* Their notice is reproduced below in its entirety.
*
* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
* rights reserved.
*
* License to copy and use this software is granted provided that it
* is identified as the "RSA Data Security, Inc. MD4 Message-Digest
* Algorithm" in all material mentioning or referencing this software
* or this function.
*
* License is also granted to make and use derivative works provided
* that such works are identified as "derived from the RSA Data
* Security, Inc. MD4 Message-Digest Algorithm" in all material
* mentioning or referencing the derived work.
*
* RSA Data Security, Inc. makes no representations concerning either
* the merchantability of this software or the suitability of this
* software for any particular purpose. It is provided "as is"
* without express or implied warranty of any kind.
*
* These notices must be retained in any copies of any part of this
* documentation and/or software.
*/
For the test\testmd4.c component:
*
* This is derived from material copyright RSA Data Security, Inc.
* Their notice is reproduced below in its entirety.
*
* Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All
* rights reserved.
*
* RSA Data Security, Inc. makes no representations concerning either
* the merchantability of this software or the suitability of this
* software for any particular purpose. It is provided "as is"
* without express or implied warranty of any kind.
*
* These notices must be retained in any copies of any part of this
* documentation and/or software.
*/
For the xml\expat\conftools\install-sh component:
#
# install - install a program, script, or datafile
# This comes from X11R5 (mit/util/scripts/install.sh).
#
# Copyright 1991 by the Massachusetts Institute of Technology
#
# Permission to use, copy, modify, distribute, and sell this software and its
# documentation for any purpose is hereby granted without fee, provided that
# the above copyright notice appear in all copies and that both that
# copyright notice and this permission notice appear in supporting
# documentation, and that the name of M.I.T. not be used in advertising or
# publicity pertaining to distribution of the software without specific,
# written prior permission. M.I.T. makes no representations about the
# suitability of this software for any purpose. It is provided "as is"
# without express or implied warranty.
#
For the expat xml parser component:
Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
and Clark Cooper
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
====================================================================
For the ldap/apr_ldap_url.c component:
/* Portions Copyright 1998-2002 The OpenLDAP Foundation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted only as authorized by the OpenLDAP
* Public License. A copy of this license is available at
* http://www.OpenLDAP.org/license.html or in file LICENSE in the
* top-level directory of the distribution.
*
* OpenLDAP is a registered trademark of the OpenLDAP Foundation.
*
* Individual files and/or contributed packages may be copyright by
* other parties and subject to additional restrictions.
*
* This work is derived from the University of Michigan LDAP v3.3
* distribution. Information concerning this software is available
* at: http://www.umich.edu/~dirsvcs/ldap/
*
* This work also contains materials derived from public sources.
*
* Additional information about OpenLDAP can be obtained at:
* http://www.openldap.org/
*/
/*
* Portions Copyright (c) 1992-1996 Regents of the University of Michigan.
* All rights reserved.
*
* Redistribution and use in source and binary forms are permitted
* provided that this notice is preserved and that due credit is given
* to the University of Michigan at Ann Arbor. The name of the University
* may not be used to endorse or promote products derived from this
* software without specific prior written permission. This software
* is provided ``as is'' without express or implied warranty.
*/

123
Makefile.in Normal file
View File

@ -0,0 +1,123 @@
#
# Top-level Makefile for APRUTIL
#
CPP = @CPP@
# gets substituted into some targets
APRUTIL_MAJOR_VERSION=@APRUTIL_MAJOR_VERSION@
APRUTIL_DOTTED_VERSION=@APRUTIL_DOTTED_VERSION@
srcdir = @srcdir@
VPATH = @srcdir@
INCLUDES = @APRUTIL_PRIV_INCLUDES@ @APR_INCLUDES@ @APRUTIL_INCLUDES@
APRUTIL_LDFLAGS = @APRUTIL_LDFLAGS@
APRUTIL_LIBS = @APRUTIL_LIBS@
TARGET_LIB = lib@APRUTIL_LIBNAME@.la
INSTALL_SUBDIRS = @APR_ICONV_DIR@ @APR_XML_DIR@
EXTRA_SOURCE_DIRS = @APR_ICONV_DIR@ @APR_XML_DIR@
APRUTIL_PCFILE = apr-util-$(APRUTIL_MAJOR_VERSION).pc
APU_CONFIG = apu-$(APRUTIL_MAJOR_VERSION)-config
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
APU_MODULES = @APU_MODULES@
LINK_MODULE = $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) $(LT_LDFLAGS) $(ALL_CFLAGS) $(ALL_LDFLAGS) $(APRUTIL_LDFLAGS) -release $(APRUTIL_MAJOR_VERSION) -module -rpath $(APU_DSO_LIBDIR)
APU_DSO_LIBDIR = @APU_DSO_LIBDIR@
LT_VERSION = @APU_LTVERSION@
EXTRA_OBJECTS = @EXTRA_OBJECTS@
LDADD_dbd_pgsql = @LDADD_dbd_pgsql@
LDADD_dbd_oracle = @LDADD_dbd_oracle@
LDADD_dbd_sqlite2 = @LDADD_dbd_sqlite2@
LDADD_dbd_sqlite3 = @LDADD_dbd_sqlite3@
LDADD_dbd_mysql = @LDADD_dbd_mysql@
LDADD_dbd_freetds = @LDADD_dbd_freetds@
LDADD_dbd_odbc = @LDADD_dbd_odbc@
LDADD_dbm_db = @LDADD_dbm_db@
LDADD_dbm_gdbm = @LDADD_dbm_gdbm@
LDADD_dbm_ndbm = @LDADD_dbm_ndbm@
LDADD_ldap = @LDADD_ldap@
LDADD_crypto_openssl = @LDADD_crypto_openssl@
LDADD_crypto_nss = @LDADD_crypto_nss@
TARGETS = $(TARGET_LIB) aprutil.exp apu-config.out $(APU_MODULES)
# bring in rules.mk for standard functionality
@INCLUDE_RULES@
@INCLUDE_OUTPUTS@
CLEAN_SUBDIRS = test @APR_ICONV_DIR@ @APR_XML_DIR@
CLEAN_TARGETS = exports.c export_vars.c aprutil.exp .make.dirs apu-config.out
DISTCLEAN_TARGETS = config.cache config.log config.status libtool \
include/private/apu_config.h include/private/apu_private.h \
include/private/apu_select_dbm.h include/apr_ldap.h include/apu.h \
export_vars.sh $(APU_CONFIG) build/rules.mk include/apu_want.h \
apr-util.pc build/pkg/pkginfo
EXTRACLEAN_TARGETS = configure aclocal.m4 include/private/apu_config.h.in \
exports.c build-outputs.mk \
build/apr_common.m4 build/find_apr.m4 build/install.sh \
build/config.guess build/config.sub
prefix=@prefix@
exec_prefix=@exec_prefix@
bindir=@bindir@
libdir=@libdir@
includedir=@includedir@
top_srcdir=@abs_srcdir@
top_blddir=@abs_builddir@
# Create apu-config script suitable for the install tree
apu-config.out: $(APU_CONFIG)
sed 's,^\(location=\).*$$,\1installed,' < $(APU_CONFIG) > $@
install: $(TARGETS) install-modules
$(APR_MKDIR) $(DESTDIR)$(includedir) $(DESTDIR)$(libdir)/pkgconfig \
$(DESTDIR)$(libdir) $(DESTDIR)$(bindir)
for f in $(top_srcdir)/include/*.h $(top_blddir)/include/*.h; do \
$(INSTALL_DATA) $${f} $(DESTDIR)$(includedir); \
done
$(INSTALL_DATA) apr-util.pc $(DESTDIR)$(libdir)/pkgconfig/$(APRUTIL_PCFILE)
list='$(INSTALL_SUBDIRS)'; for i in $$list; do \
( cd $$i ; $(MAKE) DESTDIR=$(DESTDIR) install ); \
done
$(LIBTOOL) --mode=install $(INSTALL) -m 755 $(TARGET_LIB) $(DESTDIR)$(libdir)
$(INSTALL_DATA) aprutil.exp $(DESTDIR)$(libdir)
$(INSTALL) -m 755 apu-config.out $(DESTDIR)$(bindir)/$(APU_CONFIG)
$(TARGET_LIB): $(OBJECTS) $(EXTRA_OBJECTS)
$(LINK) @lib_target@ $(EXTRA_OBJECTS) $(ALL_LIBS) $(APRUTIL_LDFLAGS) $(APRUTIL_LIBS)
install-modules: install-modules-@APU_HAVE_MODULES@
install-modules-no:
install-modules-yes: $(APU_MODULES)
$(APR_MKDIR) $(DESTDIR)$(APU_DSO_LIBDIR)
@for m in $(APU_MODULES); do $(LIBTOOL) $(LT_LTFLAGS) $(LTFLAGS) --mode=install $(INSTALL) -m 755 $$m $(DESTDIR)$(APU_DSO_LIBDIR); done
exports.c: $(HEADERS)
$(APR_MKEXPORT) $(HEADERS) > $@
export_vars.c: $(HEADERS)
$(APR_MKVAREXPORT) $(HEADERS) > $@
aprutil.exp: exports.c export_vars.c
@echo "#! lib@APRUTIL_LIBNAME@.so" > $@
@echo "* This file was AUTOGENERATED at build time." >> $@
@echo "* Please do not edit by hand." >> $@
$(CPP) $(ALL_CPPFLAGS) $(ALL_INCLUDES) exports.c | grep "ap_hack_" | sed -e 's/^.*[)]\(.*\);$$/\1/' >> $@
$(CPP) $(ALL_CPPFLAGS) $(ALL_INCLUDES) export_vars.c | sed -e 's/^\#[^!]*//' | sed -e '/^$$/d' >> $@
dox:
doxygen $(top_srcdir)/docs/doxygen.conf
test: check
check: $(TARGET_LIB)
cd test && $(MAKE) all check
.PHONY: install-modules install-modules-yes install-modules-no dox test check

365
Makefile.win Normal file
View File

@ -0,0 +1,365 @@
# Makefile.win for Win32 APR + APR-iconv + APR-util
#
# Targets are:
#
# buildall - compile everything
# checkall - run APR + APR-util regression tests
# install - compile everything
# clean - mop up everything
#
# You can override the build mechansim, choose only one;
#
# USEMAK=1 - compile from exported make files
# USEDSW=1 - compile from .dsw / .dsp VC6 projects
# USESLN=1 - compile from converted .sln / .vcproj VC7+ files
#
# Define ARCH to your desired preference (your PATH must point
# to the correct compiler tools!) Choose only one;
#
# ARCH="Win32 Release"
# ARCH="Win32 Debug"
# ARCH="Win32 Release9x"
# ARCH="Win32 Debug9x"
# ARCH="x64 Release"
# ARCH="x64 Debug"
#
# Provide the APR_PATH, API_PATH and APU_PATH entirely relative
# to one another! At this time, building the libraries themselves
# is only expected to work if the defaults (../apr, ../apr-iconv
# and ../apr-util) are used, or if they are built with USEMAK=1.
#
# APR_PATH=..\apr-1.3.0
# API_PATH=..\apr-iconv-1.3.0
# APU_PATH=..\apr-util-1.3.0
#
# Provide a DBD_LIST argument after configuring LIB and INCLUDE with
# the SDK paths of the corresponding client support libraries.
# ODBC is always built on Windows, so it does not get included in DBD_LIST
# Note that at this time, none of these are supported on win32, per say.
#
# DBD_LIST="sqlite3 pgsql oracle mysql freetds"
#
# Provide a DBM_LIST argument after configuring LIB and INCLUDE with
# the SDK paths of the corresponding database support libraries. Right
# now only db has been configured, gdbm and ndbm require additional study.
# Note that at this time, none of these are supported on win32, per say.
#
# DBM_LIST="db gdbm"
#
# Provide a CRYPTO_LIST argument after configuring LIB and INCLUDE with
# the SDK paths of the corresponding cryptographic support libraries.
#
# CRYPTO_LIST="nss openssl"
#
# For example;
#
# nmake -f Makefile.win PREFIX=C:\APR buildall checkall installall clean
#
!IF EXIST("aprutil.sln") && ([devenv /help > NUL 2>&1] == 0) \
&& !defined(USEMAK) && !defined(USEDSW)
USESLN=1
USEMAK=0
USEDSW=0
!ELSEIF EXIST("aprutil.mak") && !defined(USEDSW)
USESLN=0
USEMAK=1
USEDSW=0
!ELSE
USESLN=0
USEMAK=0
USEDSW=1
!ENDIF
PREFIX=..\apr-dist
!IF [$(COMSPEC) /c cl /nologo /? \
| $(SystemRoot)\System32\find.exe "x64" >NUL ] == 0
ARCH=x64 Release
!ELSE
ARCH=Win32 Release
!ENDIF
APR_PATH=..\apr
API_PATH=..\apr-iconv
APU_PATH=..\apr-util
!MESSAGE ARCH = $(ARCH)
!MESSAGE APR_PATH = $(APR_PATH)
!MESSAGE API_PATH = $(API_PATH) (apr-iconv)
!MESSAGE APU_PATH = $(APU_PATH) (apr-util)
!MESSAGE PREFIX = $(PREFIX) (install path)
!MESSAGE DBD_LIST = $(DBD_LIST)
!MESSAGE DBM_LIST = $(DBM_LIST)
!MESSAGE CRYPTO_LIST = $(CRYPTO_LIST)
# Utility and Translation things, nothing here for the user
#
!IF "$(ARCH)" == "Win32 Release"
SLNARCH=Release|Win32
ARCHPATH=Release
LIBSPATH=LibR
ARCHOSPATH=Release
LIBSOSPATH=LibR
!ELSEIF "$(ARCH)" == "Win32 Debug"
SLNARCH=Debug|Win32
ARCHPATH=Debug
LIBSPATH=LibD
ARCHOSPATH=Debug
LIBSOSPATH=LibD
!ELSEIF "$(ARCH)" == "Win32 Release9x"
SLNARCH=Release9x|Win32
ARCHPATH=Release
LIBSPATH=LibR
ARCHOSPATH=9x\Release
LIBSOSPATH=9x\LibR
!ELSEIF "$(ARCH)" == "Win32 Debug9x"
SLNARCH=Debug9x|Win32
ARCHPATH=Debug
LIBSPATH=LibD
ARCHOSPATH=9x\Debug
LIBSOSPATH=9x\LibD
!ELSEIF "$(ARCH)" == "x64 Release"
SLNARCH=Release|x64
ARCHPATH=x64\Release
LIBSPATH=x64\LibR
ARCHOSPATH=x64\Release
LIBSOSPATH=x64\LibR
!ELSEIF "$(ARCH)" == "x64 Debug"
SLNARCH=Debug|x64
ARCHPATH=x64\Debug
LIBSPATH=x64\LibD
ARCHOSPATH=x64\Debug
LIBSOSPATH=x64\LibD
!ENDIF
!IFNDEF MAKEOPT
# Only default the behavior if MAKEOPT= is omitted
!IFDEF _NMAKE_VER
# Microsoft NMake options
MAKEOPT=-nologo
!ELSEIF "$(MAKE)" == "make"
# Borland make options? Not really supported (yet)
MAKEOPT=-s -N
!ENDIF
!ENDIF
# Sanity Checks
#
!IF !EXIST("$(APR_PATH)\apr.dsp") || !EXIST("$(API_PATH)\apriconv.dsp") \
|| !EXIST("$(APU_PATH)\aprutil.dsp")
!MESSAGE Please check out or download and unpack the Apache Portability Runtime
!MESSAGE sources (apr, apr-iconv and apr-util) under a single parent dir,
!MESSAGE or provide APR_PATH, API_PATH and APU_PATH (all relative to each other,
!MESSAGE or all absolute paths).
!MESSAGE Apache cannot build without these libraries!
!MESSAGE
!ERROR Need apr and apr-iconv alongside apr-util to build!
!ENDIF
all: buildall checkall
# To help win32 pick up the locations where they don't fall in the usual
# path locations. This may not be completely effective for USESLN/USEDSP
# oriented builds, just yet
#
LIB=$(APR_PATH)\$(ARCHOSPATH);$(APR_PATH)\$(LIBSOSPATH);$(API_PATH)\$(ARCHPATH);$(API_PATH)\$(LIBSPATH);$(APU_PATH)\$(ARCHPATH);$(APU_PATH)\$(LIBSPATH);$(LIB)
INCLUDE=$(APR_PATH)\include;$(API_PATH)\include;$(INCLUDE)
!IF $(USEMAK) == 1
clean:
$(MAKE) $(MAKEOPT) -f Makefile.win ARCH="$(ARCH)" \
CTARGET=CLEAN buildall
buildall:
cd $(APR_PATH)
$(MAKE) $(MAKEOPT) -f apr.mak CFG="apr - $(ARCH)" RECURSE=0 $(CTARGET)
$(MAKE) $(MAKEOPT) -f libapr.mak CFG="libapr - $(ARCH)" RECURSE=0 $(CTARGET)
cd build
$(MAKE) $(MAKEOPT) -f aprapp.mak CFG="aprapp - $(ARCH)" RECURSE=0 $(CTARGET)
$(MAKE) $(MAKEOPT) -f libaprapp.mak CFG="libaprapp - $(ARCH)" RECURSE=0 $(CTARGET)
cd ..
cd $(API_PATH)
$(MAKE) $(MAKEOPT) -f apriconv.mak CFG="apriconv - $(ARCH)" RECURSE=0 $(CTARGET)
$(MAKE) $(MAKEOPT) -f libapriconv.mak CFG="libapriconv - $(ARCH)" RECURSE=0 $(CTARGET)
!IF "$(CTARGET)" == "CLEAN"
$(MAKE) $(MAKEOPT) -f build\modules.mk.win clean \
BUILD_MODE="$(ARCH)" BIND_MODE=shared API_SOURCE=.
!ELSE
cd ccs
$(MAKE) $(MAKEOPT) -f Makefile.win all \
BUILD_MODE="$(ARCH)" BIND_MODE=shared
cd ..\ces
$(MAKE) $(MAKEOPT) -f Makefile.win all \
BUILD_MODE="$(ARCH)" BIND_MODE=shared
cd ..
!ENDIF
cd $(APU_PATH)\xml\expat\lib
$(MAKE) $(MAKEOPT) -f xml.mak CFG="xml - $(ARCH)" RECURSE=0 $(CTARGET)
cd ..\..\..
$(MAKE) $(MAKEOPT) -f aprutil.mak CFG="aprutil - $(ARCH)" RECURSE=0 $(CTARGET)
$(MAKE) $(MAKEOPT) -f libaprutil.mak CFG="libaprutil - $(ARCH)" RECURSE=0 $(CTARGET)
cd ldap
$(MAKE) $(MAKEOPT) -f apr_ldap.mak CFG="apr_ldap - $(ARCH)" RECURSE=0 $(CTARGET)
cd ..
cd dbd
for %d in (odbc $(DBD_LIST)) do \
$(MAKE) $(MAKEOPT) -f apr_dbd_%d.mak CFG="apr_dbd_%d - $(ARCH)" RECURSE=0 $(CTARGET)
cd ..
cd dbm
for %d in ($(DBM_LIST) x) do if not %d == x \
$(MAKE) $(MAKEOPT) -f apr_dbm_%d.mak CFG="apr_dbm_%d - $(ARCH)" RECURSE=0 $(CTARGET)
cd ..
cd crypto
for %d in ($(CRYPTO_LIST) x) do if not %d == x \
$(MAKE) $(MAKEOPT) -f apr_crypto_%d.mak CFG="apr_crypto_%d - $(ARCH)" RECURSE=0 $(CTARGET)
cd ..
!ELSEIF $(USESLN) == 1
clean:
-for %d in (odbc $(DBD_LIST)) do \
devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project apr_dbd_%d
-for %d in ($(DBM_LIST) x) do if not %d == x \
devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project apr_dbm_%d
-for %d in ($(CRYPTO_LIST) x) do if not %d == x \
devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project apr_crypto_%d
-devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project apr_ldap
-devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project libaprutil
-devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project aprutil
cd $(API_PATH)
-$(MAKE) $(MAKEOPT) -f build\modules.mk.win clean \
BUILD_MODE="$(ARCH)" BIND_MODE=shared API_SOURCE=.
cd $(APU_PATH)
-devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project libapriconv
-devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project apriconv
-devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project libaprapp
-devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project aprapp
-devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project libapr
-devenv aprutil.sln /useenv /clean "$(SLNARCH)" /project apr
buildall:
devenv aprutil.sln /useenv /build "$(SLNARCH)" /project aprapp
devenv aprutil.sln /useenv /build "$(SLNARCH)" /project libaprapp
devenv aprutil.sln /useenv /build "$(SLNARCH)" /project aprutil
devenv aprutil.sln /useenv /build "$(SLNARCH)" /project libaprutil
devenv aprutil.sln /useenv /build "$(SLNARCH)" /project apr_ldap
for %d in (odbc $(DBD_LIST)) do \
devenv aprutil.sln /useenv /build "$(SLNARCH)" /project apr_dbd_%d
for %d in ($(DBM_LIST) x) do if not %d == x \
devenv aprutil.sln /useenv /build "$(SLNARCH)" /project apr_dbm_%d
for %d in ($(CRYPTO_LIST) x) do if not %d == x \
devenv aprutil.sln /useenv /build "$(SLNARCH)" /project apr_crypto_%d
!ELSE
# $(USEDSP) == 1
clean:
-for %d in (odbc $(DBD_LIST)) do \
msdev aprutil.dsw /USEENV /MAKE "apr_dbd_%d - $(ARCH)" /CLEAN
-for %d in ($(DBM_LIST) x) do if not %d == x \
msdev aprutil.dsw /USEENV /MAKE "apr_dbm_%d - $(ARCH)" /CLEAN
-for %d in ($(CRYPTO_LIST) x) do if not %d == x \
msdev aprutil.dsw /USEENV /MAKE "apr_crypto_%d - $(ARCH)" /CLEAN
-msdev aprutil.dsw /USEENV /MAKE "apr_ldap - $(ARCH)" /CLEAN
-msdev aprutil.dsw /USEENV /MAKE "libaprutil - $(ARCH)" /CLEAN
-msdev aprutil.dsw /USEENV /MAKE "aprutil - $(ARCH)" /CLEAN
cd $(API_PATH)
$(MAKE) $(MAKEOPT) -f build\modules.mk.win clean \
BUILD_MODE="$(ARCH)" BIND_MODE=shared API_SOURCE=.
cd $(APU_PATH)
-msdev aprutil.dsw /USEENV /MAKE "libapriconv - $(ARCH)" /CLEAN
-msdev aprutil.dsw /USEENV /MAKE "apriconv - $(ARCH)" /CLEAN
-msdev aprutil.dsw /USEENV /MAKE "libaprapp - $(ARCH)" /CLEAN
-msdev aprutil.dsw /USEENV /MAKE "aprapp - $(ARCH)" /CLEAN
-msdev aprutil.dsw /USEENV /MAKE "libapr - $(ARCH)" /CLEAN
-msdev aprutil.dsw /USEENV /MAKE "apr - $(ARCH)" /CLEAN
buildall:
@msdev aprutil.dsw /USEENV /MAKE "aprapp - $(ARCH)"
@msdev aprutil.dsw /USEENV /MAKE "aprutil - $(ARCH)"
@msdev aprutil.dsw /USEENV /MAKE "libaprapp - $(ARCH)"
@msdev aprutil.dsw /USEENV /MAKE "libaprutil - $(ARCH)"
@msdev aprutil.dsw /USEENV /MAKE "apr_ldap - $(ARCH)"
@for %d in (odbc $(DBD_LIST)) do \
msdev aprutil.dsw /USEENV /MAKE "apr_dbd_%d - $(ARCH)"
@for %d in ($(DBM_LIST) x) do if not %d == x \
msdev aprutil.dsw /USEENV /MAKE "apr_dbm_%d - $(ARCH)"
@for %d in ($(CRYPTO_LIST) x) do if not %d == x \
msdev aprutil.dsw /USEENV /MAKE "apr_crypto_%d - $(ARCH)"
!ENDIF
checkapr:
cd $(APR_PATH)\test
$(MAKE) $(MAKEOPT) -f Makefile.win MODEL=static \
OUTDIR=$(LIBSOSPATH) check
$(MAKE) $(MAKEOPT) -f Makefile.win MODEL=dynamic \
OUTDIR=$(ARCHOSPATH) check
cd ..
cd $(APU_PATH)
checkapu:
cd $(APU_PATH)
cd test
$(MAKE) $(MAKEOPT) -f Makefile.win MODEL=static \
OUTDIR=$(LIBSPATH) APROUTDIR=$(LIBSOSPATH) \
APR_PATH=..\$(APR_PATH) API_PATH=..\$(API_PATH) check
$(MAKE) $(MAKEOPT) -f Makefile.win MODEL=dynamic \
OUTDIR=$(ARCHPATH) APROUTDIR=$(ARCHOSPATH) \
APR_PATH=..\$(APR_PATH) API_PATH=..\$(API_PATH) check
cd ..
checkall: checkapr checkapu
install:
echo Y >.y
echo A >.A
@if NOT EXIST "$(PREFIX)\." mkdir "$(PREFIX)"
@if NOT EXIST "$(PREFIX)\bin\." mkdir "$(PREFIX)\bin"
@if NOT EXIST "$(PREFIX)\bin\iconv\." mkdir "$(PREFIX)\bin\iconv"
@if NOT EXIST "$(PREFIX)\include\." mkdir "$(PREFIX)\include"
@if NOT EXIST "$(PREFIX)\lib\." mkdir "$(PREFIX)\lib"
copy CHANGES "$(PREFIX)\CHANGES.txt" <.y
copy LICENSE "$(PREFIX)\LICENSE.txt" <.y
copy NOTICE "$(PREFIX)\NOTICE.txt" <.y
xcopy $(APR_PATH)\include\*.h "$(PREFIX)\include\" /d < .a
xcopy $(APU_PATH)\include\*.h "$(PREFIX)\include\" /d < .a
copy $(APR_PATH)\$(LIBSOSPATH)\apr-1.lib "$(PREFIX)\lib\" <.y
copy $(APR_PATH)\$(LIBSOSPATH)\apr-1.pdb "$(PREFIX)\lib\" <.y
copy $(APU_PATH)\$(LIBSPATH)\aprutil-1.lib "$(PREFIX)\lib\" <.y
copy $(APU_PATH)\$(LIBSPATH)\aprutil-1.pdb "$(PREFIX)\lib\" <.y
copy $(APR_PATH)\$(ARCHOSPATH)\libapr-1.lib "$(PREFIX)\lib\" <.y
copy $(APR_PATH)\$(ARCHOSPATH)\libapr-1.exp "$(PREFIX)\lib\" <.y
copy $(APU_PATH)\$(ARCHPATH)\libaprutil-1.lib "$(PREFIX)\lib\" <.y
copy $(APU_PATH)\$(ARCHPATH)\libaprutil-1.exp "$(PREFIX)\lib\" <.y
copy $(APR_PATH)\$(ARCHOSPATH)\libapr-1.dll "$(PREFIX)\bin\" <.y
copy $(APR_PATH)\$(ARCHOSPATH)\libapr-1.pdb "$(PREFIX)\bin\" <.y
copy $(API_PATH)\$(ARCHPATH)\libapriconv-1.dll "$(PREFIX)\bin\" <.y
copy $(API_PATH)\$(ARCHPATH)\libapriconv-1.pdb "$(PREFIX)\bin\" <.y
copy $(APU_PATH)\$(ARCHPATH)\libaprutil-1.dll "$(PREFIX)\bin\" <.y
copy $(APU_PATH)\$(ARCHPATH)\libaprutil-1.pdb "$(PREFIX)\bin\" <.y
copy $(APU_PATH)\ldap\$(ARCHPATH)\apr_ldap-1.dll "$(PREFIX)\bin\" <.y
copy $(APU_PATH)\ldap\$(ARCHPATH)\apr_ldap-1.pdb "$(PREFIX)\bin\" <.y
for %d in (odbc $(DBD_LIST)) do ( \
copy $(APU_PATH)\dbd\$(ARCHPATH)\apr_dbd_%d-1.dll "$(PREFIX)\bin\" <.y && \
copy $(APU_PATH)\dbd\$(ARCHPATH)\apr_dbd_%d-1.pdb "$(PREFIX)\bin\" <.y \
)
for %d in ($(DBM_LIST) x) do if not %d == x ( \
copy $(APU_PATH)\dbm\$(ARCHPATH)\apr_dbm_%d-1.dll "$(PREFIX)\bin\" <.y && \
copy $(APU_PATH)\dbm\$(ARCHPATH)\apr_dbm_%d-1.pdb "$(PREFIX)\bin\" <.y \
)
for %d in ($(CRYPTO_LIST) x) do if not %d == x ( \
copy $(APU_PATH)\crypto\$(ARCHPATH)\apr_crypto_%d-1.dll "$(PREFIX)\bin\" <.y && \
copy $(APU_PATH)\crypto\$(ARCHPATH)\apr_crypto_%d-1.pdb "$(PREFIX)\bin\" <.y \
)
xcopy $(API_PATH)\$(ARCHPATH)\iconv\*.so "$(PREFIX)\bin\iconv\" /d < .a
xcopy $(API_PATH)\$(ARCHPATH)\iconv\*.pdb "$(PREFIX)\bin\iconv\" /d < .a
del .y
del .a

14
NOTICE Normal file
View File

@ -0,0 +1,14 @@
Apache Portable Runtime Utility Library
Copyright (c) 2011 The Apache Software Foundation.
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).

306
NWGNUmakefile Normal file
View File

@ -0,0 +1,306 @@
#
# Declare the sub-directories to be built here
#
SUBDIRS = \
ldap \
xml \
$(EOLIST)
ifdef WITH_APR_DBD
SUBDIRS += \
dbd \
$(EOLIST)
endif
ifdef WITH_APR_DBM
SUBDIRS += \
dbm \
$(EOLIST)
endif
#
# Get the 'head' of the build environment. This includes default targets and
# paths to tools
#
include $(APR_WORK)/build/NWGNUhead.inc
#
# Make sure all needed macro's are defined
#
#
# These directories will be at the beginning of the include list, followed by
# INCDIRS
#
XINCDIRS += \
$(APR)/include \
$(APR)/include/arch/NetWare \
$(APU)/include \
$(APU)/uri \
$(APU)/dbm/sdbm \
$(APU)/include/private \
$(APUXML)/expat/lib \
$(LDAPSDK)/inc \
$(EOLIST)
#
# These flags will come after CFLAGS
#
XCFLAGS += \
$(EOLIST)
#
# These defines will come after DEFINES
#
XDEFINES += \
$(EOLIST)
#
# These flags will be added to the link.opt file
#
XLFLAGS += \
$(EOLIST)
#
# These values will be appended to the correct variables based on the value of
# RELEASE
#
ifeq "$(RELEASE)" "debug"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
ifeq "$(RELEASE)" "noopt"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
ifeq "$(RELEASE)" "release"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
#
# These are used by the link target if an NLM is being generated
# This is used by the link 'name' directive to name the nlm. If left blank
# TARGET_nlm (see below) will be used.
#
NLM_NAME =
#
# This is used by the link '-desc ' directive.
# If left blank, NLM_NAME will be used.
#
NLM_DESCRIPTION =
#
# This is used by the '-threadname' directive. If left blank,
# NLM_NAME Thread will be used.
#
NLM_THREAD_NAME =
#
# If this is specified, it will override VERSION value in
# $(APR_WORK)/build/NWGNUenvironment.inc
#
NLM_VERSION =
#
# If this is specified, it will override the default of 64K
#
NLM_STACK_SIZE =
#
# If this is specified it will be used by the link '-entry' directive
#
NLM_ENTRY_SYM =
#
# If this is specified it will be used by the link '-exit' directive
#
NLM_EXIT_SYM =
#
# If this is specified it will be used by the link '-check' directive
#
NLM_CHECK_SYM =
#
# If this is specified it will be used by the link '-flags' directive
#
NLM_FLAGS =
#
# If this is specified it will be linked in with the XDCData option in the def
# file instead of the default of $(APR)/misc/netware/apache.xdc. XDCData can
# be disabled by setting APACHE_UNIPROC in the environment
#
XDCDATA =
#
# Declare all target files (you must add your files here)
#
#
# If there is an NLM target, put it here
#
TARGET_nlm = \
$(EOLIST)
#
# If there is an LIB target, put it here
#
TARGET_lib = \
$(OBJDIR)/apulib.lib \
$(EOLIST)
#
# These are the OBJ files needed to create the NLM target above.
# Paths must all use the '/' character
#
FILES_nlm_objs = \
$(EOLIST)
#
# These are the LIB files needed to create the NLM target above.
# These will be added as a library command in the link.opt file.
#
FILES_nlm_libs = \
$(EOLIST)
#
# These are the modules that the above NLM target depends on to load.
# These will be added as a module command in the link.opt file.
#
FILES_nlm_modules = \
$(EOLIST)
#
# If the nlm has a msg file, put it's path here
#
FILE_nlm_msg =
#
# If the nlm has a hlp file put it's path here
#
FILE_nlm_hlp =
#
# If this is specified, it will override $(NWOS)\copyright.txt.
#
FILE_nlm_copyright =
#
# Any additional imports go here
#
FILES_nlm_Ximports = \
$(EOLIST)
#
# Any symbols exported to here
#
FILES_nlm_exports = \
$(EOLIST)
#
# These are the OBJ files needed to create the LIB target above.
# Paths must all use the '/' character
#
FILES_lib_objs = \
$(OBJDIR)/apr_base64.o \
$(OBJDIR)/apr_brigade.o \
$(OBJDIR)/apr_buckets.o \
$(OBJDIR)/apr_buckets_alloc.o \
$(OBJDIR)/apr_buckets_eos.o \
$(OBJDIR)/apr_buckets_file.o \
$(OBJDIR)/apr_buckets_flush.o \
$(OBJDIR)/apr_buckets_heap.o \
$(OBJDIR)/apr_buckets_mmap.o \
$(OBJDIR)/apr_buckets_pipe.o \
$(OBJDIR)/apr_buckets_pool.o \
$(OBJDIR)/apr_buckets_refcount.o \
$(OBJDIR)/apr_buckets_simple.o \
$(OBJDIR)/apr_buckets_socket.o \
$(OBJDIR)/apr_crypto.o \
$(OBJDIR)/apr_date.o \
$(OBJDIR)/apr_dbm.o \
$(OBJDIR)/apr_dbd.o \
$(OBJDIR)/apr_dbm_sdbm.o \
$(OBJDIR)/apu_dso.o \
$(OBJDIR)/apr_hooks.o \
$(OBJDIR)/apr_md4.o \
$(OBJDIR)/apr_md5.o \
$(OBJDIR)/apr_memcache.o \
$(OBJDIR)/apr_queue.o \
$(OBJDIR)/apr_reslist.o \
$(OBJDIR)/apr_rmm.o \
$(OBJDIR)/apr_sha1.o \
$(OBJDIR)/apu_version.o \
$(OBJDIR)/getuuid.o \
$(OBJDIR)/uuid.o \
$(OBJDIR)/apr_strmatch.o \
$(OBJDIR)/apr_thread_pool.o \
$(OBJDIR)/apr_uri.o \
$(OBJDIR)/sdbm.o \
$(OBJDIR)/sdbm_hash.o \
$(OBJDIR)/sdbm_lock.o \
$(OBJDIR)/sdbm_pair.o \
$(OBJDIR)/xlate.o \
$(EOLIST)
#
# implement targets and dependancies (leave this section alone)
#
libs :: $(OBJDIR) $(TARGET_lib)
nlms :: libs $(TARGET_nlm)
#
# Updated this target to create necessary directories and copy files to the
# correct place. (See $(APR_WORK)/build/NWGNUhead.inc for examples)
#
install :: nlms FORCE
#
# Any specialized rules here
#
vpath %.c buckets:crypto:dbd:dbm:dbm/sdbm:encoding:hooks:ldap:memcache:misc:strmatch:uri:xlate:xml
#
# Include the 'tail' makefile that has targets that depend on variables defined
# in this makefile
#
include $(APRBUILD)/NWGNUtail.inc

111
README Normal file
View File

@ -0,0 +1,111 @@
Apache Portable Runtime Utility Library README
----------------------------------------------
The Apache Portable Runtime Utility Library provides a predictable
and consistent interface to underlying client library interfaces.
This API assures predictable if not identical behavior regardless
of which libraries are available on a given platform.
APR and its companion libraries are implemented entirely in C
and provide a common programming interface across a wide variety
of operating system platforms without sacrificing performance.
Currently supported platforms include:
UNIX variants
Windows
Netware
Mac OS X
OS/2
To give a brief overview, the primary core
subsystems of APR-util 1.3 include the following:
Hashing and UUID services
Multiple SQL DBD client interfaces
Multiple flat-database DBM client interfaces
Typesafe function Hooks abstraction
LDAP SSL connections for a variety of LDAP toolkits
MemCache interface
Date parsing rourtines
Resource Lists
Thread Pools
Queues
Relocatable Memory Management functions
String filename-style pattern matching
URI Parsing
Charset translation (iconv based)
XML parsing (expat based)
For a more complete list, please refer to the following URLs:
http://apr.apache.org/docs/apr-util/modules.html
Users of APR 0.9 should be aware that migrating to the APR 1.x
programming interfaces may require some adjustments; APR 1.x is
neither source nor binary compatible with earlier APR 0.9 releases.
Users of APR 1.x can expect consistent interfaces and binary backwards
compatibility throughout the entire APR 1.x release cycle, as defined
in our versioning rules:
http://apr.apache.org/versioning.html
APR is already used extensively by the Apache HTTP Server
version 2 and the Subversion revision control system, to
name but a few. We list all known projects using APR at
http://apr.apache.org/projects.html -- so please let us know
if you find our libraries useful in your own projects!
Database Providers
------------------
As of apr-util version 1.2.11, MySQL DBD driver is shipped as part of the
distribution. However, to avoid licensing incompatibilities, it is not
built by default. To enable MySQL support, use the --with-mysql option,
but be aware that the MySQL license may introduce licensing implications
for your compiled code. Similarly, the bindings for propritary drivers
such as Oracle (--with-oracle option) must also be explicitly enabled.
On windows, selection of supported drivers is via the environment values
DBD_LIST (for freetds, mysql, oracle, pgsql, sqlite2 and/or sqlite3)
and DBM_LIST (db and/or gdbm). DBD odbc and DBM sdbm are unconditionally
compiled and installed, do not include these in the list.
Whenever distributing apr-util in combination with database client
drivers, always review the license requirements of all components.
Cryptographic Software Notice
-----------------------------
This distribution includes cryptographic software. The country in
which you currently reside may have restrictions on the import,
possession, use, and/or re-export to another country, of
encryption software. BEFORE using any encryption software, please
check your country's laws, regulations and policies concerning the
import, possession, or use, and re-export of encryption software, to
see if this is permitted. See http://www.wassenaar.org/ for more
information.
The U.S. Government Department of Commerce, Bureau of Industry and
Security (BIS), has classified this software as Export Commodity
Control Number (ECCN) 5D002.C.1, which includes information security
software using or performing cryptographic functions with asymmetric
algorithms. The form and manner of this Apache Software Foundation
distribution makes it eligible for export under the License Exception
ENC Technology Software Unrestricted (TSU) exception (see the BIS
Export Administration Regulations, Section 740.13) for both object
code and source code.
The following provides more details on the included cryptographic
software:
APR-Util provides an abstract interface for symmetrical cryptographic
functions that make use of a general-purpose encryption library,
such as OpenSSL, NSS, or the operating system's platform-specific
facilities. This interface is known as the apr_crypto interface,
with implementation beneath the /crypto directory.
APR-Util provides an abstract interface for SSL encrypted LDAP (ldaps
and STARTTLS style) connections, which can be powered by OpenLDAP,
Netscape LDAP SDK, Mozilla LDAP SDK, or other platform specific ldap
interfaces.

13
apr-util.pc.in Normal file
View File

@ -0,0 +1,13 @@
prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
APRUTIL_MAJOR_VERSION=@APRUTIL_MAJOR_VERSION@
includedir=@includedir@
Name: APR Utils
Description: Companion library for APR
Version: @APRUTIL_DOTTED_VERSION@
# assume that apr-util requires libapr of same major version
Requires: apr-@APRUTIL_MAJOR_VERSION@
Libs: -L${libdir} -l@APRUTIL_LIBNAME@ @LDADD_ldap@ @APRUTIL_EXPORT_LIBS@
Cflags: -I${includedir}

214
apr-util.spec Normal file
View File

@ -0,0 +1,214 @@
%define apuver 1
Summary: Apache Portable Runtime Utility library
Name: apr-util
Version: 1.4.1
Release: 1
License: Apache Software License
Group: System Environment/Libraries
URL: http://apr.apache.org/
Source0: http://www.apache.org/dist/apr/%{name}-%{version}.tar.bz2
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot
BuildRequires: autoconf, libtool, doxygen, apr-devel >= 1.4.0
BuildRequires: expat-devel, libuuid-devel
%description
The mission of the Apache Portable Runtime (APR) is to provide a
free library of C data structures and routines. This library
contains additional utility interfaces for APR; including support
for XML, LDAP, database interfaces, URI parsing and more.
%package devel
Group: Development/Libraries
Summary: APR utility library development kit
Requires: apr-util = %{version}-%{release}, apr-devel
Requires: db4-devel, expat-devel
%description devel
This package provides the support files which can be used to
build applications using the APR utility library. The mission
of the Apache Portable Runtime (APR) is to provide a free
library of C data structures and routines.
%package dbm
Group: Development/Libraries
Summary: APR utility library DBM driver
BuildRequires: db4-devel
Requires: apr-util = %{version}-%{release}
%description dbm
This package provides the DBM driver for the apr-util.
%package pgsql
Group: Development/Libraries
Summary: APR utility library PostgreSQL DBD driver
BuildRequires: postgresql-devel
Requires: apr-util = %{version}-%{release}
%description pgsql
This package provides the PostgreSQL driver for the apr-util
DBD (database abstraction) interface.
%package mysql
Group: Development/Libraries
Summary: APR utility library MySQL DBD driver
BuildRequires: mysql-devel
Requires: apr-util = %{version}-%{release}
%description mysql
This package provides the MySQL driver for the apr-util DBD
(database abstraction) interface.
%package sqlite
Group: Development/Libraries
Summary: APR utility library SQLite DBD driver
BuildRequires: sqlite-devel >= 3.0.0
Requires: apr-util = %{version}-%{release}
%description sqlite
This package provides the SQLite driver for the apr-util DBD
(database abstraction) interface.
%package freetds
Group: Development/Libraries
Summary: APR utility library FreeTDS DBD driver
BuildRequires: freetds-devel
Requires: apr-util = %{version}-%{release}
%description freetds
This package provides the FreeTDS driver for the apr-util DBD
(database abstraction) interface.
%package odbc
Group: Development/Libraries
Summary: APR utility library ODBC DBD driver
BuildRequires: unixODBC-devel
Requires: apr-util = %{version}-%{release}
%description odbc
This package provides the ODBC driver for the apr-util DBD
(database abstraction) interface.
%package ldap
Group: Development/Libraries
Summary: APR utility library LDAP support
BuildRequires: openldap-devel
Requires: apr-util = %{version}-%{release}
%description ldap
This package provides the LDAP support for the apr-util.
%package openssl
Group: Development/Libraries
Summary: APR utility library OpenSSL crypto support
BuildRequires: openssl-devel
Requires: apr-util = %{version}-%{release}
%description openssl
This package provides crypto support for apr-util based on OpenSSL.
%package nss
Group: Development/Libraries
Summary: APR utility library NSS crypto support
BuildRequires: nss-devel
Requires: apr-util = %{version}-%{release}
%description nss
This package provides crypto support for apr-util based on Mozilla NSS.
%prep
%setup -q
%build
%configure --with-apr=%{_prefix} \
--includedir=%{_includedir}/apr-%{apuver} \
--with-ldap --without-gdbm \
--with-sqlite3 --with-pgsql --with-mysql --with-freetds --with-odbc \
--with-berkeley-db \
--with-crypto --with-openssl --with-nss \
--without-sqlite2
make %{?_smp_mflags} && make dox
%check
# Run non-interactive tests
pushd test
make %{?_smp_mflags} all CFLAGS=-fno-strict-aliasing
make check || exit 1
popd
%install
rm -rf $RPM_BUILD_ROOT
make install DESTDIR=$RPM_BUILD_ROOT
# Documentation
mv docs/dox/html html
# Unpackaged files
rm -f $RPM_BUILD_ROOT%{_libdir}/aprutil.exp
%clean
rm -rf $RPM_BUILD_ROOT
%post -p /sbin/ldconfig
%postun -p /sbin/ldconfig
%files
%defattr(-,root,root,-)
%doc CHANGES LICENSE NOTICE
%{_libdir}/libaprutil-%{apuver}.so.*
%dir %{_libdir}/apr-util-%{apuver}
%files dbm
%defattr(-,root,root,-)
%{_libdir}/apr-util-%{apuver}/apr_dbm_db*
%files pgsql
%defattr(-,root,root,-)
%{_libdir}/apr-util-%{apuver}/apr_dbd_pgsql*
%files mysql
%defattr(-,root,root,-)
%{_libdir}/apr-util-%{apuver}/apr_dbd_mysql*
%files sqlite
%defattr(-,root,root,-)
%{_libdir}/apr-util-%{apuver}/apr_dbd_sqlite*
%files freetds
%defattr(-,root,root,-)
%{_libdir}/apr-util-%{apuver}/apr_dbd_freetds*
%files odbc
%defattr(-,root,root,-)
%{_libdir}/apr-util-%{apuver}/apr_dbd_odbc*
%files ldap
%defattr(-,root,root,-)
%{_libdir}/apr-util-%{apuver}/apr_ldap*
%files openssl
%defattr(-,root,root,-)
%{_libdir}/apr-util-%{apuver}/apr_crypto_openssl*
%files nss
%defattr(-,root,root,-)
%{_libdir}/apr-util-%{apuver}/apr_crypto_nss*
%files devel
%defattr(-,root,root,-)
%{_bindir}/apu-%{apuver}-config
%{_libdir}/libaprutil-%{apuver}.*a
%{_libdir}/libaprutil-%{apuver}.so
%{_libdir}/pkgconfig/apr-util-%{apuver}.pc
%{_includedir}/apr-%{apuver}/*.h
%doc --parents html
%changelog
* Tue Jun 22 2004 Graham Leggett <minfrin@sharp.fm> 1.0.0-1
- update to support v1.0.0 of APR
* Tue Jun 22 2004 Graham Leggett <minfrin@sharp.fm> 1.0.0-1
- derived from Fedora Core apr.spec

794
aprutil.dsp Normal file
View File

@ -0,0 +1,794 @@
# 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 Release
!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 Release"
!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 "aprutil - x64 Release" (based on "Win32 (x86) Static Library")
!MESSAGE "aprutil - x64 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 "HAVE_SQL_H" /D "XML_STATIC" /D "WIN32" /D "_WINDOWS" /Fo"$(INTDIR)\" /Fd"$(OUTDIR)\aprutil-1" /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 "HAVE_SQL_H" /D "XML_STATIC" /D "WIN32" /D "_WINDOWS" /Fo"$(INTDIR)\" /Fd"$(OUTDIR)\aprutil-1" /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"
!ELSEIF "$(CFG)" == "aprutil - x64 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "x64\LibR"
# PROP BASE Intermediate_Dir "x64\LibR"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "x64\LibR"
# PROP Intermediate_Dir "x64\LibR"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
# ADD CPP /nologo /MD /W3 /Zi /O2 /Oy- /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 "HAVE_SQL_H" /D "XML_STATIC" /D "WIN32" /D "_WINDOWS" /Fo"$(INTDIR)\" /Fd"$(OUTDIR)\aprutil-1" /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:"x64\LibR\aprutil-1.lib"
!ELSEIF "$(CFG)" == "aprutil - x64 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "x64\LibD"
# PROP BASE Intermediate_Dir "x64\LibD"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "x64\LibD"
# PROP Intermediate_Dir "x64\LibD"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /EHsc /c
# ADD CPP /nologo /MDd /W3 /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 "HAVE_SQL_H" /D "XML_STATIC" /D "WIN32" /D "_WINDOWS" /Fo"$(INTDIR)\" /Fd"$(OUTDIR)\aprutil-1" /FD /EHsc /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:"x64\LibD\aprutil-1.lib"
!ENDIF
# Begin Target
# Name "aprutil - Win32 Release"
# Name "aprutil - Win32 Debug"
# Name "aprutil - x64 Release"
# Name "aprutil - x64 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_crypto.c
# End Source File
# 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_freetds.c
# End Source File
# Begin Source File
SOURCE=.\dbd\apr_dbd_mysql.c
# End Source File
# Begin Source File
SOURCE=.\dbd\apr_dbd_odbc.c
# End Source File
# Begin Source File
SOURCE=.\dbd\apr_dbd_oracle.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_option.c
# End Source File
# Begin Source File
SOURCE=.\ldap\apr_ldap_rebind.c
# End Source File
# Begin Source File
SOURCE=.\ldap\apr_ldap_stub.c
# End Source File
# Begin Source File
SOURCE=.\ldap\apr_ldap_url.c
# End Source File
# End Group
# Begin Group "memcache"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\memcache\apr_memcache.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\apu_dso.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\apr_thread_pool.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
!ELSEIF "$(CFG)" == "aprutil - x64 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 - x64 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
!ELSEIF "$(CFG)" == "aprutil - x64 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 - x64 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
!ELSEIF "$(CFG)" == "aprutil - x64 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 - x64 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
!ELSEIF "$(CFG)" == "aprutil - x64 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 - x64 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
!ELSEIF "$(CFG)" == "aprutil - x64 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 - x64 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_memcache.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_thread_pool.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
# Begin Source File
SOURCE=.\include\apu_version.h
# End Source File
# End Group
# End Target
# End Project

479
aprutil.dsw Normal file
View File

@ -0,0 +1,479 @@
Microsoft Developer Studio Workspace File, Format Version 6.00
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
###############################################################################
Project: "apr"="..\apr\apr.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Project: "apr_crypto_nss"=".\crypto\apr_crypto_nss.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name libapr
End Project Dependency
Begin Project Dependency
Project_Dep_Name libaprutil
End Project Dependency
}}}
###############################################################################
Project: "apr_crypto_openssl"=".\crypto\apr_crypto_openssl.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name libapr
End Project Dependency
Begin Project Dependency
Project_Dep_Name libaprutil
End Project Dependency
}}}
###############################################################################
Project: "apr_dbd_freetds"=".\dbd\apr_dbd_freetds.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name libapr
End Project Dependency
Begin Project Dependency
Project_Dep_Name libaprutil
End Project Dependency
}}}
###############################################################################
Project: "apr_dbd_mysql"=".\dbd\apr_dbd_mysql.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name libapr
End Project Dependency
Begin Project Dependency
Project_Dep_Name libaprutil
End Project Dependency
}}}
###############################################################################
Project: "apr_dbd_odbc"=".\dbd\apr_dbd_odbc.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name libaprutil
End Project Dependency
Begin Project Dependency
Project_Dep_Name libapr
End Project Dependency
}}}
###############################################################################
Project: "apr_dbd_oracle"=".\dbd\apr_dbd_oracle.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name libapr
End Project Dependency
Begin Project Dependency
Project_Dep_Name libaprutil
End Project Dependency
}}}
###############################################################################
Project: "apr_dbd_pgsql"=".\dbd\apr_dbd_pgsql.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name libapr
End Project Dependency
Begin Project Dependency
Project_Dep_Name libaprutil
End Project Dependency
}}}
###############################################################################
Project: "apr_dbd_sqlite2"=".\dbd\apr_dbd_sqlite2.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name libapr
End Project Dependency
Begin Project Dependency
Project_Dep_Name libaprutil
End Project Dependency
}}}
###############################################################################
Project: "apr_dbd_sqlite3"=".\dbd\apr_dbd_sqlite3.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name libapr
End Project Dependency
Begin Project Dependency
Project_Dep_Name libaprutil
End Project Dependency
}}}
###############################################################################
Project: "apr_dbm_db"=".\dbm\apr_dbm_db.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name libapr
End Project Dependency
Begin Project Dependency
Project_Dep_Name libaprutil
End Project Dependency
}}}
###############################################################################
Project: "apr_dbm_gdbm"=".\dbm\apr_dbm_gdbm.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name libapr
End Project Dependency
Begin Project Dependency
Project_Dep_Name libaprutil
End Project Dependency
}}}
###############################################################################
Project: "apr_ldap"=".\ldap\apr_ldap.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name libapr
End Project Dependency
Begin Project Dependency
Project_Dep_Name libaprutil
End Project Dependency
}}}
###############################################################################
Project: "aprapp"="..\apr\build\aprapp.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name preaprapp
End Project Dependency
}}}
###############################################################################
Project: "apriconv"="..\apr-iconv\apriconv.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name preapriconv
End Project Dependency
}}}
###############################################################################
Project: "aprutil"=".\aprutil.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name preaprutil
End Project Dependency
Begin Project Dependency
Project_Dep_Name apriconv
End Project Dependency
Begin Project Dependency
Project_Dep_Name xml
End Project Dependency
}}}
###############################################################################
Project: "libapr"="..\apr\libapr.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Project: "libaprapp"="..\apr\build\libaprapp.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name prelibaprapp
End Project Dependency
}}}
###############################################################################
Project: "libapriconv"="..\apr-iconv\libapriconv.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name libapr
End Project Dependency
}}}
###############################################################################
Project: "libapriconv_ccs_modules"="..\apr-iconv\ccs\libapriconv_ccs_modules.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name libapr
End Project Dependency
Begin Project Dependency
Project_Dep_Name libapriconv
End Project Dependency
}}}
###############################################################################
Project: "libapriconv_ces_modules"="..\apr-iconv\ces\libapriconv_ces_modules.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name libapr
End Project Dependency
Begin Project Dependency
Project_Dep_Name libapriconv
End Project Dependency
}}}
###############################################################################
Project: "libaprutil"=".\libaprutil.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name libapr
End Project Dependency
Begin Project Dependency
Project_Dep_Name libaprapp
End Project Dependency
Begin Project Dependency
Project_Dep_Name libapriconv
End Project Dependency
Begin Project Dependency
Project_Dep_Name libapriconv_ccs_modules
End Project Dependency
Begin Project Dependency
Project_Dep_Name libapriconv_ces_modules
End Project Dependency
Begin Project Dependency
Project_Dep_Name xml
End Project Dependency
}}}
###############################################################################
Project: "preaprapp"="..\apr\build\preaprapp.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name apr
End Project Dependency
}}}
###############################################################################
Project: "preapriconv"="..\apr-iconv\build\preapriconv.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name apr
End Project Dependency
}}}
###############################################################################
Project: "preaprutil"=".\build\preaprutil.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name apr
End Project Dependency
Begin Project Dependency
Project_Dep_Name aprapp
End Project Dependency
}}}
###############################################################################
Project: "prelibaprapp"="..\apr\build\prelibaprapp.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name libapr
End Project Dependency
}}}
###############################################################################
Project: "xml"=".\xml\expat\lib\xml.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Global:
Package=<5>
{{{
}}}
Package=<3>
{{{
}}}
###############################################################################

225
apu-config.in Normal file
View File

@ -0,0 +1,225 @@
#!/bin/sh
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# APR-util script designed to allow easy command line access to APR-util
# configuration parameters.
APRUTIL_MAJOR_VERSION="@APRUTIL_MAJOR_VERSION@"
APRUTIL_DOTTED_VERSION="@APRUTIL_DOTTED_VERSION@"
prefix="@prefix@"
exec_prefix="@exec_prefix@"
bindir="@bindir@"
libdir="@libdir@"
includedir="@includedir@"
LIBS="@APRUTIL_EXPORT_LIBS@"
INCLUDES="@APRUTIL_INCLUDES@"
LDFLAGS="@APRUTIL_LDFLAGS@"
LDAP_LIBS="@LDADD_ldap@"
DBM_LIBS="@LDADD_dbm_db@ @LDADD_dbm_gdbm@ @LDADD_dbm_ndbm@"
APRUTIL_LIBNAME="@APRUTIL_LIBNAME@"
APU_SOURCE_DIR="@abs_srcdir@"
APU_BUILD_DIR="@abs_builddir@"
APR_XML_EXPAT_OLD="@APR_XML_EXPAT_OLD@"
APU_DB_VERSION="@apu_db_version@"
# NOTE: the following line is modified during 'make install': alter with care!
location=@APU_CONFIG_LOCATION@
show_usage()
{
cat << EOF
Usage: apu-$APRUTIL_MAJOR_VERSION-config [OPTION]
Known values for OPTION are:
--prefix[=DIR] change prefix to DIR
--bindir print location where binaries are installed
--includes print include information
--includedir print location where headers are installed
--ldflags print linker flags
--libs print library information
--avoid-ldap do not include ldap library information with --libs
--ldap-libs print library information to link with ldap
--avoid-dbm do not include DBM library information with --libs
--dbm-libs print additional library information to link with DBM
--srcdir print APR-util source directory
--link-ld print link switch(es) for linking to APR-util
--link-libtool print the libtool inputs for linking to APR-util
--apu-la-file print the path to the .la file, if available
--old-expat indicate if APR-util was built against an old expat
--db-version print the DB version
--version print APR-util's version as a dotted triple
--help print this help
When linking with libtool, an application should do something like:
APU_LIBS="\`apu-$APRUTIL_MAJOR_VERSION-config --link-libtool --libs\`"
or when linking directly:
APU_LIBS="\`apu-$APRUTIL_MAJOR_VERSION-config --link-ld --libs\`"
An application should use the results of --includes, and --ldflags in
their build process.
EOF
}
if test $# -eq 0; then
show_usage
exit 1
fi
if test "$location" = "installed"; then
LA_FILE="$libdir/lib${APRUTIL_LIBNAME}.la"
LIBS=`echo "$LIBS" | sed -e "s $APU_BUILD_DIR/xml/expat $prefix g" -e "s $prefix/libexpat.la -lexpat g"`
LDFLAGS=`echo "$LDFLAGS" | sed -e "s $APU_BUILD_DIR/xml/expat $prefix g"`
INCLUDES=`echo "$INCLUDES" | sed -e "s $APU_BUILD_DIR/xml/expat $prefix g" -e "s -I$prefix/lib g"`
else
LA_FILE="$APU_BUILD_DIR/lib${APRUTIL_LIBNAME}.la"
fi
flags=""
while test $# -gt 0; do
# Normalize the prefix.
case "$1" in
-*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
*) optarg= ;;
esac
case "$1" in
# It is possible for the user to override our prefix.
--prefix=*)
prefix=$optarg
;;
--prefix)
echo $prefix
exit 0
;;
--bindir)
echo $bindir
exit 0
;;
--avoid-ldap)
LDAP_LIBS=""
;;
--avoid-dbm)
DBM_LIBS=""
;;
--libs)
flags="$flags $LDAP_LIBS $DBM_LIBS $LIBS"
;;
--ldap-libs)
flags="$flags $LDAP_LIBS"
;;
--dbm-libs)
flags="$flags $DBM_LIBS"
;;
--includedir)
if test "$location" = "installed"; then
flags="$includedir"
elif test "$location" = "source"; then
flags="$APU_SOURCE_DIR/include"
else
# this is for VPATH builds
flags="$APU_BUILD_DIR/include $APU_SOURCE_DIR/include"
fi
echo $flags
exit 0
;;
--includes)
if test "$location" = "installed"; then
flags="$flags -I$includedir $INCLUDES"
elif test "$location" = "source"; then
flags="$flags -I$APU_SOURCE_DIR/include $INCLUDES"
else
# this is for VPATH builds
flags="$flags -I$APU_BUILD_DIR/include -I$APU_SOURCE_DIR/include $INCLUDES"
fi
;;
--ldflags)
flags="$flags $LDFLAGS"
;;
--srcdir)
echo $APU_SOURCE_DIR
exit 0
;;
--version)
echo $APRUTIL_DOTTED_VERSION
exit 0
;;
--link-ld)
if test "$location" = "installed"; then
### avoid using -L if libdir is a "standard" location like /usr/lib
flags="$flags -L$libdir -l$APRUTIL_LIBNAME"
else
flags="$flags -L$APU_BUILD_DIR -l$APRUTIL_LIBNAME"
fi
;;
--link-libtool)
# If the LA_FILE exists where we think it should be, use it. If we're
# installed and the LA_FILE does not exist, assume to use -L/-l
# (the LA_FILE may not have been installed). If we're building ourselves,
# we'll assume that at some point the .la file be created.
if test -f "$LA_FILE"; then
flags="$flags $LA_FILE"
elif test "$location" = "installed"; then
### avoid using -L if libdir is a "standard" location like /usr/lib
# Since the user is specifying they are linking with libtool, we
# *know* that -R will be recognized by libtool.
flags="$flags -L$libdir -R$libdir -l$APRUTIL_LIBNAME"
else
flags="$flags $LA_FILE"
fi
;;
--apu-la-file)
if test -f "$LA_FILE"; then
flags="$flags $LA_FILE"
fi
;;
--old-expat)
if test ! -n "$APR_XML_EXPAT_OLD"; then
echo "no"
else
echo "$APR_XML_EXPAT_OLD"
fi
exit 0
;;
--db-version)
echo $APU_DB_VERSION
exit 0
;;
--help)
show_usage
exit 0
;;
*)
show_usage
exit 1
;;
esac
# Next please.
shift
done
if test -n "$flags"; then
echo "$flags"
fi
exit 0

739
buckets/apr_brigade.c Normal file
View File

@ -0,0 +1,739 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr.h"
#include "apr_lib.h"
#include "apr_strings.h"
#include "apr_pools.h"
#include "apr_tables.h"
#include "apr_buckets.h"
#include "apr_errno.h"
#define APR_WANT_MEMFUNC
#define APR_WANT_STRFUNC
#include "apr_want.h"
#if APR_HAVE_SYS_UIO_H
#include <sys/uio.h>
#endif
static apr_status_t brigade_cleanup(void *data)
{
return apr_brigade_cleanup(data);
}
APU_DECLARE(apr_status_t) apr_brigade_cleanup(void *data)
{
apr_bucket_brigade *b = data;
apr_bucket *e;
while (!APR_BRIGADE_EMPTY(b)) {
e = APR_BRIGADE_FIRST(b);
apr_bucket_delete(e);
}
/* We don't need to free(bb) because it's allocated from a pool. */
return APR_SUCCESS;
}
APU_DECLARE(apr_status_t) apr_brigade_destroy(apr_bucket_brigade *b)
{
apr_pool_cleanup_kill(b->p, b, brigade_cleanup);
return apr_brigade_cleanup(b);
}
APU_DECLARE(apr_bucket_brigade *) apr_brigade_create(apr_pool_t *p,
apr_bucket_alloc_t *list)
{
apr_bucket_brigade *b;
b = apr_palloc(p, sizeof(*b));
b->p = p;
b->bucket_alloc = list;
APR_RING_INIT(&b->list, apr_bucket, link);
apr_pool_cleanup_register(b->p, b, brigade_cleanup, apr_pool_cleanup_null);
return b;
}
APU_DECLARE(apr_bucket_brigade *) apr_brigade_split_ex(apr_bucket_brigade *b,
apr_bucket *e,
apr_bucket_brigade *a)
{
apr_bucket *f;
if (!a) {
a = apr_brigade_create(b->p, b->bucket_alloc);
}
else if (!APR_BRIGADE_EMPTY(a)) {
apr_brigade_cleanup(a);
}
/* Return an empty brigade if there is nothing left in
* the first brigade to split off
*/
if (e != APR_BRIGADE_SENTINEL(b)) {
f = APR_RING_LAST(&b->list);
APR_RING_UNSPLICE(e, f, link);
APR_RING_SPLICE_HEAD(&a->list, e, f, apr_bucket, link);
}
APR_BRIGADE_CHECK_CONSISTENCY(a);
APR_BRIGADE_CHECK_CONSISTENCY(b);
return a;
}
APU_DECLARE(apr_bucket_brigade *) apr_brigade_split(apr_bucket_brigade *b,
apr_bucket *e)
{
return apr_brigade_split_ex(b, e, NULL);
}
APU_DECLARE(apr_status_t) apr_brigade_partition(apr_bucket_brigade *b,
apr_off_t point,
apr_bucket **after_point)
{
apr_bucket *e;
const char *s;
apr_size_t len;
apr_uint64_t point64;
apr_status_t rv;
if (point < 0) {
/* this could cause weird (not necessarily SEGV) things to happen */
return APR_EINVAL;
}
if (point == 0) {
*after_point = APR_BRIGADE_FIRST(b);
return APR_SUCCESS;
}
/*
* Try to reduce the following casting mess: We know that point will be
* larger equal 0 now and forever and thus that point (apr_off_t) and
* apr_size_t will fit into apr_uint64_t in any case.
*/
point64 = (apr_uint64_t)point;
APR_BRIGADE_CHECK_CONSISTENCY(b);
for (e = APR_BRIGADE_FIRST(b);
e != APR_BRIGADE_SENTINEL(b);
e = APR_BUCKET_NEXT(e))
{
/* For an unknown length bucket, while 'point64' is beyond the possible
* size contained in apr_size_t, read and continue...
*/
if ((e->length == (apr_size_t)(-1))
&& (point64 > (apr_uint64_t)APR_SIZE_MAX)) {
/* point64 is too far out to simply split this bucket,
* we must fix this bucket's size and keep going... */
rv = apr_bucket_read(e, &s, &len, APR_BLOCK_READ);
if (rv != APR_SUCCESS) {
*after_point = e;
return rv;
}
}
else if ((point64 < (apr_uint64_t)e->length)
|| (e->length == (apr_size_t)(-1))) {
/* We already consumed buckets where point64 is beyond
* our interest ( point64 > APR_SIZE_MAX ), above.
* Here point falls between 0 and APR_SIZE_MAX
* and is within this bucket, or this bucket's len
* is undefined, so now we are ready to split it.
* First try to split the bucket natively... */
if ((rv = apr_bucket_split(e, (apr_size_t)point64))
!= APR_ENOTIMPL) {
*after_point = APR_BUCKET_NEXT(e);
return rv;
}
/* if the bucket cannot be split, we must read from it,
* changing its type to one that can be split */
rv = apr_bucket_read(e, &s, &len, APR_BLOCK_READ);
if (rv != APR_SUCCESS) {
*after_point = e;
return rv;
}
/* this assumes that len == e->length, which is okay because e
* might have been morphed by the apr_bucket_read() above, but
* if it was, the length would have been adjusted appropriately */
if (point64 < (apr_uint64_t)e->length) {
rv = apr_bucket_split(e, (apr_size_t)point64);
*after_point = APR_BUCKET_NEXT(e);
return rv;
}
}
if (point64 == (apr_uint64_t)e->length) {
*after_point = APR_BUCKET_NEXT(e);
return APR_SUCCESS;
}
point64 -= (apr_uint64_t)e->length;
}
*after_point = APR_BRIGADE_SENTINEL(b);
return APR_INCOMPLETE;
}
APU_DECLARE(apr_status_t) apr_brigade_length(apr_bucket_brigade *bb,
int read_all, apr_off_t *length)
{
apr_off_t total = 0;
apr_bucket *bkt;
apr_status_t status = APR_SUCCESS;
for (bkt = APR_BRIGADE_FIRST(bb);
bkt != APR_BRIGADE_SENTINEL(bb);
bkt = APR_BUCKET_NEXT(bkt))
{
if (bkt->length == (apr_size_t)(-1)) {
const char *ignore;
apr_size_t len;
if (!read_all) {
total = -1;
break;
}
if ((status = apr_bucket_read(bkt, &ignore, &len,
APR_BLOCK_READ)) != APR_SUCCESS) {
break;
}
}
total += bkt->length;
}
*length = total;
return status;
}
APU_DECLARE(apr_status_t) apr_brigade_flatten(apr_bucket_brigade *bb,
char *c, apr_size_t *len)
{
apr_size_t actual = 0;
apr_bucket *b;
for (b = APR_BRIGADE_FIRST(bb);
b != APR_BRIGADE_SENTINEL(bb);
b = APR_BUCKET_NEXT(b))
{
const char *str;
apr_size_t str_len;
apr_status_t status;
status = apr_bucket_read(b, &str, &str_len, APR_BLOCK_READ);
if (status != APR_SUCCESS) {
return status;
}
/* If we would overflow. */
if (str_len + actual > *len) {
str_len = *len - actual;
}
/* XXX: It appears that overflow of the final bucket
* is DISCARDED without any warning to the caller.
*
* No, we only copy the data up to their requested size. -- jre
*/
memcpy(c, str, str_len);
c += str_len;
actual += str_len;
/* This could probably be actual == *len, but be safe from stray
* photons. */
if (actual >= *len) {
break;
}
}
*len = actual;
return APR_SUCCESS;
}
APU_DECLARE(apr_status_t) apr_brigade_pflatten(apr_bucket_brigade *bb,
char **c,
apr_size_t *len,
apr_pool_t *pool)
{
apr_off_t actual;
apr_size_t total;
apr_status_t rv;
apr_brigade_length(bb, 1, &actual);
/* XXX: This is dangerous beyond belief. At least in the
* apr_brigade_flatten case, the user explicitly stated their
* buffer length - so we don't up and palloc 4GB for a single
* file bucket. This API must grow a useful max boundry,
* either compiled-in or preset via the *len value.
*
* Shouldn't both fn's grow an additional return value for
* the case that the brigade couldn't be flattened into the
* provided or allocated buffer (such as APR_EMOREDATA?)
* Not a failure, simply an advisory result.
*/
total = (apr_size_t)actual;
*c = apr_palloc(pool, total);
rv = apr_brigade_flatten(bb, *c, &total);
if (rv != APR_SUCCESS) {
return rv;
}
*len = total;
return APR_SUCCESS;
}
APU_DECLARE(apr_status_t) apr_brigade_split_line(apr_bucket_brigade *bbOut,
apr_bucket_brigade *bbIn,
apr_read_type_e block,
apr_off_t maxbytes)
{
apr_off_t readbytes = 0;
while (!APR_BRIGADE_EMPTY(bbIn)) {
const char *pos;
const char *str;
apr_size_t len;
apr_status_t rv;
apr_bucket *e;
e = APR_BRIGADE_FIRST(bbIn);
rv = apr_bucket_read(e, &str, &len, block);
if (rv != APR_SUCCESS) {
return rv;
}
pos = memchr(str, APR_ASCII_LF, len);
/* We found a match. */
if (pos != NULL) {
apr_bucket_split(e, pos - str + 1);
APR_BUCKET_REMOVE(e);
APR_BRIGADE_INSERT_TAIL(bbOut, e);
return APR_SUCCESS;
}
APR_BUCKET_REMOVE(e);
if (APR_BUCKET_IS_METADATA(e) || len > APR_BUCKET_BUFF_SIZE/4) {
APR_BRIGADE_INSERT_TAIL(bbOut, e);
}
else {
if (len > 0) {
rv = apr_brigade_write(bbOut, NULL, NULL, str, len);
if (rv != APR_SUCCESS) {
return rv;
}
}
apr_bucket_destroy(e);
}
readbytes += len;
/* We didn't find an APR_ASCII_LF within the maximum line length. */
if (readbytes >= maxbytes) {
break;
}
}
return APR_SUCCESS;
}
APU_DECLARE(apr_status_t) apr_brigade_to_iovec(apr_bucket_brigade *b,
struct iovec *vec, int *nvec)
{
int left = *nvec;
apr_bucket *e;
struct iovec *orig;
apr_size_t iov_len;
const char *iov_base;
apr_status_t rv;
orig = vec;
for (e = APR_BRIGADE_FIRST(b);
e != APR_BRIGADE_SENTINEL(b);
e = APR_BUCKET_NEXT(e))
{
if (left-- == 0)
break;
rv = apr_bucket_read(e, &iov_base, &iov_len, APR_NONBLOCK_READ);
if (rv != APR_SUCCESS)
return rv;
/* Set indirectly since types differ: */
vec->iov_len = iov_len;
vec->iov_base = (void *)iov_base;
++vec;
}
*nvec = (int)(vec - orig);
return APR_SUCCESS;
}
APU_DECLARE(apr_status_t) apr_brigade_vputstrs(apr_bucket_brigade *b,
apr_brigade_flush flush,
void *ctx,
va_list va)
{
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];
int written;
vd.vbuff.curpos = buf;
vd.vbuff.endpos = buf + APR_BUCKET_BUFF_SIZE;
vd.b = b;
vd.flusher = &flush;
vd.ctx = ctx;
vd.cbuff = buf;
written = apr_vformatter(brigade_flush, &vd.vbuff, fmt, va);
if (written == -1) {
return -1;
}
/* write out what remains in the buffer */
return apr_brigade_write(b, flush, ctx, buf, vd.vbuff.curpos - buf);
}
/* A "safe" maximum bucket size, 1Gb */
#define MAX_BUCKET_SIZE (0x40000000)
APU_DECLARE(apr_bucket *) apr_brigade_insert_file(apr_bucket_brigade *bb,
apr_file_t *f,
apr_off_t start,
apr_off_t length,
apr_pool_t *p)
{
apr_bucket *e;
if (sizeof(apr_off_t) == sizeof(apr_size_t) || length < MAX_BUCKET_SIZE) {
e = apr_bucket_file_create(f, start, (apr_size_t)length, p,
bb->bucket_alloc);
}
else {
/* Several buckets are needed. */
e = apr_bucket_file_create(f, start, MAX_BUCKET_SIZE, p,
bb->bucket_alloc);
while (length > MAX_BUCKET_SIZE) {
apr_bucket *ce;
apr_bucket_copy(e, &ce);
APR_BRIGADE_INSERT_TAIL(bb, ce);
e->start += MAX_BUCKET_SIZE;
length -= MAX_BUCKET_SIZE;
}
e->length = (apr_size_t)length; /* Resize just the last bucket */
}
APR_BRIGADE_INSERT_TAIL(bb, e);
return e;
}

46
buckets/apr_buckets.c Normal file
View File

@ -0,0 +1,46 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr_buckets.h"
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_setaside_noop(apr_bucket *data,
apr_pool_t *pool)
{
return APR_SUCCESS;
}
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_setaside_notimpl(apr_bucket *data,
apr_pool_t *pool)
{
return APR_ENOTIMPL;
}
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_split_notimpl(apr_bucket *data,
apr_size_t point)
{
return APR_ENOTIMPL;
}
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_copy_notimpl(apr_bucket *e,
apr_bucket **c)
{
return APR_ENOTIMPL;
}
APU_DECLARE_NONSTD(void) apr_bucket_destroy_noop(void *data)
{
return;
}

193
buckets/apr_buckets_alloc.c Normal file
View File

@ -0,0 +1,193 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <stdlib.h>
#include "apr_buckets.h"
#include "apr_allocator.h"
#define ALLOC_AMT (8192 - APR_MEMNODE_T_SIZE)
typedef struct node_header_t {
apr_size_t size;
apr_bucket_alloc_t *alloc;
apr_memnode_t *memnode;
struct node_header_t *next;
} node_header_t;
#define SIZEOF_NODE_HEADER_T APR_ALIGN_DEFAULT(sizeof(node_header_t))
#define SMALL_NODE_SIZE (APR_BUCKET_ALLOC_SIZE + SIZEOF_NODE_HEADER_T)
/** A list of free memory from which new buckets or private bucket
* structures can be allocated.
*/
struct apr_bucket_alloc_t {
apr_pool_t *pool;
apr_allocator_t *allocator;
node_header_t *freelist;
apr_memnode_t *blocks;
};
static apr_status_t alloc_cleanup(void *data)
{
apr_bucket_alloc_t *list = data;
apr_allocator_free(list->allocator, list->blocks);
#if APR_POOL_DEBUG
if (list->pool && list->allocator != apr_pool_allocator_get(list->pool)) {
apr_allocator_destroy(list->allocator);
}
#endif
return APR_SUCCESS;
}
APU_DECLARE_NONSTD(apr_bucket_alloc_t *) apr_bucket_alloc_create(apr_pool_t *p)
{
apr_allocator_t *allocator = apr_pool_allocator_get(p);
apr_bucket_alloc_t *list;
#if APR_POOL_DEBUG
/* may be NULL for debug mode. */
if (allocator == NULL) {
if (apr_allocator_create(&allocator) != APR_SUCCESS) {
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);
if (!block) {
return NULL;
}
list = (apr_bucket_alloc_t *)block->first_avail;
list->pool = NULL;
list->allocator = allocator;
list->freelist = NULL;
list->blocks = block;
block->first_avail += APR_ALIGN_DEFAULT(sizeof(*list));
return list;
}
APU_DECLARE_NONSTD(void) apr_bucket_alloc_destroy(apr_bucket_alloc_t *list)
{
if (list->pool) {
apr_pool_cleanup_kill(list->pool, list, alloc_cleanup);
}
apr_allocator_free(list->allocator, list->blocks);
#if APR_POOL_DEBUG
if (list->pool && list->allocator != apr_pool_allocator_get(list->pool)) {
apr_allocator_destroy(list->allocator);
}
#endif
}
APU_DECLARE_NONSTD(void *) apr_bucket_alloc(apr_size_t size,
apr_bucket_alloc_t *list)
{
node_header_t *node;
apr_memnode_t *active = list->blocks;
char *endp;
size += SIZEOF_NODE_HEADER_T;
if (size <= SMALL_NODE_SIZE) {
if (list->freelist) {
node = list->freelist;
list->freelist = node->next;
}
else {
endp = active->first_avail + SMALL_NODE_SIZE;
if (endp >= active->endp) {
list->blocks = apr_allocator_alloc(list->allocator, ALLOC_AMT);
if (!list->blocks) {
return NULL;
}
list->blocks->next = active;
active = list->blocks;
endp = active->first_avail + SMALL_NODE_SIZE;
}
node = (node_header_t *)active->first_avail;
node->alloc = list;
node->memnode = active;
node->size = SMALL_NODE_SIZE;
active->first_avail = endp;
}
}
else {
apr_memnode_t *memnode = apr_allocator_alloc(list->allocator, size);
if (!memnode) {
return NULL;
}
node = (node_header_t *)memnode->first_avail;
node->alloc = list;
node->memnode = memnode;
node->size = size;
}
return ((char *)node) + SIZEOF_NODE_HEADER_T;
}
#ifdef APR_BUCKET_DEBUG
#if APR_HAVE_STDLIB_H
#include <stdlib.h>
#endif
static void check_not_already_free(node_header_t *node)
{
apr_bucket_alloc_t *list = node->alloc;
node_header_t *curr = list->freelist;
while (curr) {
if (node == curr) {
abort();
}
curr = curr->next;
}
}
#else
#define check_not_already_free(node)
#endif
APU_DECLARE_NONSTD(void) apr_bucket_free(void *mem)
{
node_header_t *node = (node_header_t *)((char *)mem - SIZEOF_NODE_HEADER_T);
apr_bucket_alloc_t *list = node->alloc;
if (node->size == SMALL_NODE_SIZE) {
check_not_already_free(node);
node->next = list->freelist;
list->freelist = node;
}
else {
apr_allocator_free(list->allocator, node->memnode);
}
}

54
buckets/apr_buckets_eos.c Normal file
View File

@ -0,0 +1,54 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr_buckets.h"
static apr_status_t eos_bucket_read(apr_bucket *b, const char **str,
apr_size_t *len, apr_read_type_e block)
{
*str = NULL;
*len = 0;
return APR_SUCCESS;
}
APU_DECLARE(apr_bucket *) apr_bucket_eos_make(apr_bucket *b)
{
b->length = 0;
b->start = 0;
b->data = NULL;
b->type = &apr_bucket_type_eos;
return b;
}
APU_DECLARE(apr_bucket *) apr_bucket_eos_create(apr_bucket_alloc_t *list)
{
apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
APR_BUCKET_INIT(b);
b->free = apr_bucket_free;
b->list = list;
return apr_bucket_eos_make(b);
}
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_eos = {
"EOS", 5, APR_BUCKET_METADATA,
apr_bucket_destroy_noop,
eos_bucket_read,
apr_bucket_setaside_noop,
apr_bucket_split_notimpl,
apr_bucket_simple_copy
};

228
buckets/apr_buckets_file.c Normal file
View File

@ -0,0 +1,228 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr.h"
#include "apr_general.h"
#include "apr_file_io.h"
#include "apr_buckets.h"
#if APR_HAS_MMAP
#include "apr_mmap.h"
/* mmap support for static files based on ideas from John Heidemann's
* patch against 1.0.5. See
* <http://www.isi.edu/~johnh/SOFTWARE/APACHE/index.html>.
*/
#endif /* APR_HAS_MMAP */
static void file_bucket_destroy(void *data)
{
apr_bucket_file *f = data;
if (apr_bucket_shared_destroy(f)) {
/* no need to close the file here; it will get
* done automatically when the pool gets cleaned up */
apr_bucket_free(f);
}
}
#if APR_HAS_MMAP
static int file_make_mmap(apr_bucket *e, apr_size_t filelength,
apr_off_t fileoffset, apr_pool_t *p)
{
apr_bucket_file *a = e->data;
apr_mmap_t *mm;
if (!a->can_mmap) {
return 0;
}
if (filelength > APR_MMAP_LIMIT) {
if (apr_mmap_create(&mm, a->fd, fileoffset, APR_MMAP_LIMIT,
APR_MMAP_READ, p) != APR_SUCCESS)
{
return 0;
}
apr_bucket_split(e, APR_MMAP_LIMIT);
filelength = APR_MMAP_LIMIT;
}
else if ((filelength < APR_MMAP_THRESHOLD) ||
(apr_mmap_create(&mm, a->fd, fileoffset, filelength,
APR_MMAP_READ, p) != APR_SUCCESS))
{
return 0;
}
apr_bucket_mmap_make(e, mm, 0, filelength);
file_bucket_destroy(a);
return 1;
}
#endif
static apr_status_t file_bucket_read(apr_bucket *e, const char **str,
apr_size_t *len, apr_read_type_e block)
{
apr_bucket_file *a = e->data;
apr_file_t *f = a->fd;
apr_bucket *b = NULL;
char *buf;
apr_status_t rv;
apr_size_t filelength = e->length; /* bytes remaining in file past offset */
apr_off_t fileoffset = e->start;
#if APR_HAS_THREADS && !APR_HAS_XTHREAD_FILES
apr_int32_t flags;
#endif
#if APR_HAS_MMAP
if (file_make_mmap(e, filelength, fileoffset, a->readpool)) {
return apr_bucket_read(e, str, len, block);
}
#endif
#if APR_HAS_THREADS && !APR_HAS_XTHREAD_FILES
if ((flags = apr_file_flags_get(f)) & APR_FOPEN_XTHREAD) {
/* this file descriptor is shared across multiple threads and
* this OS doesn't support that natively, so as a workaround
* we must reopen the file into a->readpool */
const char *fname;
apr_file_name_get(&fname, f);
rv = apr_file_open(&f, fname, (flags & ~APR_FOPEN_XTHREAD), 0, a->readpool);
if (rv != APR_SUCCESS)
return rv;
a->fd = f;
}
#endif
*len = (filelength > APR_BUCKET_BUFF_SIZE)
? APR_BUCKET_BUFF_SIZE
: filelength;
*str = NULL; /* in case we die prematurely */
buf = apr_bucket_alloc(*len, e->list);
/* Handle offset ... */
rv = apr_file_seek(f, APR_SET, &fileoffset);
if (rv != APR_SUCCESS) {
apr_bucket_free(buf);
return rv;
}
rv = apr_file_read(f, buf, len);
if (rv != APR_SUCCESS && rv != APR_EOF) {
apr_bucket_free(buf);
return rv;
}
filelength -= *len;
/*
* Change the current bucket to refer to what we read,
* even if we read nothing because we hit EOF.
*/
apr_bucket_heap_make(e, buf, *len, apr_bucket_free);
/* If we have more to read from the file, then create another bucket */
if (filelength > 0 && rv != APR_EOF) {
/* for efficiency, we can just build a new apr_bucket struct
* to wrap around the existing file bucket */
b = apr_bucket_alloc(sizeof(*b), e->list);
b->start = fileoffset + (*len);
b->length = filelength;
b->data = a;
b->type = &apr_bucket_type_file;
b->free = apr_bucket_free;
b->list = e->list;
APR_BUCKET_INSERT_AFTER(e, b);
}
else {
file_bucket_destroy(a);
}
*str = buf;
return rv;
}
APU_DECLARE(apr_bucket *) apr_bucket_file_make(apr_bucket *b, apr_file_t *fd,
apr_off_t offset,
apr_size_t len, apr_pool_t *p)
{
apr_bucket_file *f;
f = apr_bucket_alloc(sizeof(*f), b->list);
f->fd = fd;
f->readpool = p;
#if APR_HAS_MMAP
f->can_mmap = 1;
#endif
b = apr_bucket_shared_make(b, f, offset, len);
b->type = &apr_bucket_type_file;
return b;
}
APU_DECLARE(apr_bucket *) apr_bucket_file_create(apr_file_t *fd,
apr_off_t offset,
apr_size_t len, apr_pool_t *p,
apr_bucket_alloc_t *list)
{
apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
APR_BUCKET_INIT(b);
b->free = apr_bucket_free;
b->list = list;
return apr_bucket_file_make(b, fd, offset, len, p);
}
APU_DECLARE(apr_status_t) apr_bucket_file_enable_mmap(apr_bucket *e,
int enabled)
{
#if APR_HAS_MMAP
apr_bucket_file *a = e->data;
a->can_mmap = enabled;
return APR_SUCCESS;
#else
return APR_ENOTIMPL;
#endif /* APR_HAS_MMAP */
}
static apr_status_t file_bucket_setaside(apr_bucket *data, apr_pool_t *reqpool)
{
apr_bucket_file *a = data->data;
apr_file_t *fd = NULL;
apr_file_t *f = a->fd;
apr_pool_t *curpool = apr_file_pool_get(f);
if (apr_pool_is_ancestor(curpool, reqpool)) {
return APR_SUCCESS;
}
if (!apr_pool_is_ancestor(a->readpool, reqpool)) {
a->readpool = reqpool;
}
apr_file_setaside(&fd, f, reqpool);
a->fd = fd;
return APR_SUCCESS;
}
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_file = {
"FILE", 5, APR_BUCKET_DATA,
file_bucket_destroy,
file_bucket_read,
file_bucket_setaside,
apr_bucket_shared_split,
apr_bucket_shared_copy
};

View File

@ -0,0 +1,54 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr_buckets.h"
static apr_status_t flush_bucket_read(apr_bucket *b, const char **str,
apr_size_t *len, apr_read_type_e block)
{
*str = NULL;
*len = 0;
return APR_SUCCESS;
}
APU_DECLARE(apr_bucket *) apr_bucket_flush_make(apr_bucket *b)
{
b->length = 0;
b->start = 0;
b->data = NULL;
b->type = &apr_bucket_type_flush;
return b;
}
APU_DECLARE(apr_bucket *) apr_bucket_flush_create(apr_bucket_alloc_t *list)
{
apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
APR_BUCKET_INIT(b);
b->free = apr_bucket_free;
b->list = list;
return apr_bucket_flush_make(b);
}
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_flush = {
"FLUSH", 5, APR_BUCKET_METADATA,
apr_bucket_destroy_noop,
flush_bucket_read,
apr_bucket_setaside_noop,
apr_bucket_split_notimpl,
apr_bucket_simple_copy
};

View File

@ -0,0 +1,96 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr_buckets.h"
#define APR_WANT_MEMFUNC
#include "apr_want.h"
static apr_status_t heap_bucket_read(apr_bucket *b, const char **str,
apr_size_t *len, apr_read_type_e block)
{
apr_bucket_heap *h = b->data;
*str = h->base + b->start;
*len = b->length;
return APR_SUCCESS;
}
static void heap_bucket_destroy(void *data)
{
apr_bucket_heap *h = data;
if (apr_bucket_shared_destroy(h)) {
(*h->free_func)(h->base);
apr_bucket_free(h);
}
}
/* Warning: if you change this function, be sure to
* change apr_bucket_pool_make() too! */
APU_DECLARE(apr_bucket *) apr_bucket_heap_make(apr_bucket *b, const char *buf,
apr_size_t length,
void (*free_func)(void *data))
{
apr_bucket_heap *h;
h = apr_bucket_alloc(sizeof(*h), b->list);
if (!free_func) {
h->alloc_len = length;
h->base = apr_bucket_alloc(h->alloc_len, b->list);
if (h->base == NULL) {
apr_bucket_free(h);
return NULL;
}
h->free_func = apr_bucket_free;
memcpy(h->base, buf, length);
}
else {
/* XXX: we lose the const qualifier here which indicates
* there's something screwy with the API...
*/
h->base = (char *) buf;
h->alloc_len = length;
h->free_func = free_func;
}
b = apr_bucket_shared_make(b, h, 0, length);
b->type = &apr_bucket_type_heap;
return b;
}
APU_DECLARE(apr_bucket *) apr_bucket_heap_create(const char *buf,
apr_size_t length,
void (*free_func)(void *data),
apr_bucket_alloc_t *list)
{
apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
APR_BUCKET_INIT(b);
b->free = apr_bucket_free;
b->list = list;
return apr_bucket_heap_make(b, buf, length, free_func);
}
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_heap = {
"HEAP", 5, APR_BUCKET_DATA,
heap_bucket_destroy,
heap_bucket_read,
apr_bucket_setaside_noop,
apr_bucket_shared_split,
apr_bucket_shared_copy
};

144
buckets/apr_buckets_mmap.c Normal file
View File

@ -0,0 +1,144 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr_buckets.h"
#if APR_HAS_MMAP
static apr_status_t mmap_bucket_read(apr_bucket *b, const char **str,
apr_size_t *length, apr_read_type_e block)
{
apr_bucket_mmap *m = b->data;
apr_status_t ok;
void *addr;
if (!m->mmap) {
/* the apr_mmap_t was already cleaned up out from under us */
return APR_EINVAL;
}
ok = apr_mmap_offset(&addr, m->mmap, b->start);
if (ok != APR_SUCCESS) {
return ok;
}
*str = addr;
*length = b->length;
return APR_SUCCESS;
}
static apr_status_t mmap_bucket_cleanup(void *data)
{
/* the apr_mmap_t is about to disappear out from under us, so we
* have no choice but to pretend it doesn't exist anymore. the
* refcount is now useless because there's nothing to refer to
* anymore. so the only valid action on any remaining referrer
* is to delete it. no more reads, no more anything. */
apr_bucket_mmap *m = data;
m->mmap = NULL;
return APR_SUCCESS;
}
static void mmap_bucket_destroy(void *data)
{
apr_bucket_mmap *m = data;
if (apr_bucket_shared_destroy(m)) {
if (m->mmap) {
apr_pool_cleanup_kill(m->mmap->cntxt, m, mmap_bucket_cleanup);
apr_mmap_delete(m->mmap);
}
apr_bucket_free(m);
}
}
/*
* XXX: are the start and length arguments useful?
*/
APU_DECLARE(apr_bucket *) apr_bucket_mmap_make(apr_bucket *b, apr_mmap_t *mm,
apr_off_t start,
apr_size_t length)
{
apr_bucket_mmap *m;
m = apr_bucket_alloc(sizeof(*m), b->list);
m->mmap = mm;
apr_pool_cleanup_register(mm->cntxt, m, mmap_bucket_cleanup,
apr_pool_cleanup_null);
b = apr_bucket_shared_make(b, m, start, length);
b->type = &apr_bucket_type_mmap;
return b;
}
APU_DECLARE(apr_bucket *) apr_bucket_mmap_create(apr_mmap_t *mm,
apr_off_t start,
apr_size_t length,
apr_bucket_alloc_t *list)
{
apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
APR_BUCKET_INIT(b);
b->free = apr_bucket_free;
b->list = list;
return apr_bucket_mmap_make(b, mm, start, length);
}
static apr_status_t mmap_bucket_setaside(apr_bucket *b, apr_pool_t *p)
{
apr_bucket_mmap *m = b->data;
apr_mmap_t *mm = m->mmap;
apr_mmap_t *new_mm;
apr_status_t ok;
if (!mm) {
/* the apr_mmap_t was already cleaned up out from under us */
return APR_EINVAL;
}
/* shortcut if possible */
if (apr_pool_is_ancestor(mm->cntxt, p)) {
return APR_SUCCESS;
}
/* duplicate apr_mmap_t into new pool */
ok = apr_mmap_dup(&new_mm, mm, p);
if (ok != APR_SUCCESS) {
return ok;
}
/* decrement refcount on old apr_bucket_mmap */
mmap_bucket_destroy(m);
/* create new apr_bucket_mmap pointing to new apr_mmap_t */
apr_bucket_mmap_make(b, new_mm, b->start, b->length);
return APR_SUCCESS;
}
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_mmap = {
"MMAP", 5, APR_BUCKET_DATA,
mmap_bucket_destroy,
mmap_bucket_read,
mmap_bucket_setaside,
apr_bucket_shared_split,
apr_bucket_shared_copy
};
#endif

119
buckets/apr_buckets_pipe.c Normal file
View File

@ -0,0 +1,119 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr_buckets.h"
static apr_status_t pipe_bucket_read(apr_bucket *a, const char **str,
apr_size_t *len, apr_read_type_e block)
{
apr_file_t *p = a->data;
char *buf;
apr_status_t rv;
apr_interval_time_t timeout;
if (block == APR_NONBLOCK_READ) {
apr_file_pipe_timeout_get(p, &timeout);
apr_file_pipe_timeout_set(p, 0);
}
*str = NULL;
*len = APR_BUCKET_BUFF_SIZE;
buf = apr_bucket_alloc(*len, a->list); /* XXX: check for failure? */
rv = apr_file_read(p, buf, len);
if (block == APR_NONBLOCK_READ) {
apr_file_pipe_timeout_set(p, timeout);
}
if (rv != APR_SUCCESS && rv != APR_EOF) {
apr_bucket_free(buf);
return rv;
}
/*
* If there's more to read we have to keep the rest of the pipe
* for later. Otherwise, we'll close the pipe.
* XXX: Note that more complicated bucket types that
* refer to data not in memory and must therefore have a read()
* function similar to this one should be wary of copying this
* code because if they have a destroy function they probably
* want to migrate the bucket's subordinate structure from the
* old bucket to a raw new one and adjust it as appropriate,
* rather than destroying the old one and creating a completely
* new bucket.
*/
if (*len > 0) {
apr_bucket_heap *h;
/* Change the current bucket to refer to what we read */
a = apr_bucket_heap_make(a, buf, *len, apr_bucket_free);
h = a->data;
h->alloc_len = APR_BUCKET_BUFF_SIZE; /* note the real buffer size */
*str = buf;
APR_BUCKET_INSERT_AFTER(a, apr_bucket_pipe_create(p, a->list));
}
else {
apr_bucket_free(buf);
a = apr_bucket_immortal_make(a, "", 0);
*str = a->data;
if (rv == APR_EOF) {
apr_file_close(p);
}
}
return APR_SUCCESS;
}
APU_DECLARE(apr_bucket *) apr_bucket_pipe_make(apr_bucket *b, apr_file_t *p)
{
/*
* A pipe is closed when the end is reached in pipe_bucket_read(). If
* the pipe isn't read to the end (e.g., error path), the pipe will be
* closed when its pool goes away.
*
* Note that typically the pipe is allocated from the request pool
* so it will disappear when the request is finished. However the
* core filter may decide to set aside the tail end of a CGI
* response if the connection is pipelined. This turns out not to
* be a problem because the core will have read to the end of the
* stream so the bucket(s) that it sets aside will be the heap
* buckets created by pipe_bucket_read() above.
*/
b->type = &apr_bucket_type_pipe;
b->length = (apr_size_t)(-1);
b->start = -1;
b->data = p;
return b;
}
APU_DECLARE(apr_bucket *) apr_bucket_pipe_create(apr_file_t *p,
apr_bucket_alloc_t *list)
{
apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
APR_BUCKET_INIT(b);
b->free = apr_bucket_free;
b->list = list;
return apr_bucket_pipe_make(b, p);
}
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_pipe = {
"PIPE", 5, APR_BUCKET_DATA,
apr_bucket_destroy_noop,
pipe_bucket_read,
apr_bucket_setaside_notimpl,
apr_bucket_split_notimpl,
apr_bucket_copy_notimpl
};

142
buckets/apr_buckets_pool.c Normal file
View File

@ -0,0 +1,142 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr_buckets.h"
#define APR_WANT_MEMFUNC
#include "apr_want.h"
static apr_status_t pool_bucket_cleanup(void *data)
{
apr_bucket_pool *p = data;
/*
* If the pool gets cleaned up, we have to copy the data out
* of the pool and onto the heap. But the apr_buckets out there
* that point to this pool bucket need to be notified such that
* they can morph themselves into a regular heap bucket the next
* time they try to read. To avoid having to manipulate
* reference counts and b->data pointers, the apr_bucket_pool
* actually _contains_ an apr_bucket_heap as its first element,
* so the two share their apr_bucket_refcount member, and you
* can typecast a pool bucket struct to make it look like a
* regular old heap bucket struct.
*/
p->heap.base = apr_bucket_alloc(p->heap.alloc_len, p->list);
memcpy(p->heap.base, p->base, p->heap.alloc_len);
p->base = NULL;
p->pool = NULL;
return APR_SUCCESS;
}
static apr_status_t pool_bucket_read(apr_bucket *b, const char **str,
apr_size_t *len, apr_read_type_e block)
{
apr_bucket_pool *p = b->data;
const char *base = p->base;
if (p->pool == NULL) {
/*
* pool has been cleaned up... masquerade as a heap bucket from now
* on. subsequent bucket operations will use the heap bucket code.
*/
b->type = &apr_bucket_type_heap;
base = p->heap.base;
}
*str = base + b->start;
*len = b->length;
return APR_SUCCESS;
}
static void pool_bucket_destroy(void *data)
{
apr_bucket_pool *p = data;
/* If the pool is cleaned up before the last reference goes
* away, the data is really now on the heap; heap_destroy() takes
* over. free() in heap_destroy() thinks it's freeing
* an apr_bucket_heap, when in reality it's freeing the whole
* apr_bucket_pool for us.
*/
if (p->pool) {
/* the shared resource is still in the pool
* because the pool has not been cleaned up yet
*/
if (apr_bucket_shared_destroy(p)) {
apr_pool_cleanup_kill(p->pool, p, pool_bucket_cleanup);
apr_bucket_free(p);
}
}
else {
/* the shared resource is no longer in the pool, it's
* on the heap, but this reference still thinks it's a pool
* bucket. we should just go ahead and pass control to
* heap_destroy() for it since it doesn't know any better.
*/
apr_bucket_type_heap.destroy(p);
}
}
APU_DECLARE(apr_bucket *) apr_bucket_pool_make(apr_bucket *b,
const char *buf, apr_size_t length, apr_pool_t *pool)
{
apr_bucket_pool *p;
p = apr_bucket_alloc(sizeof(*p), b->list);
/* XXX: we lose the const qualifier here which indicates
* there's something screwy with the API...
*/
/* XXX: why is this? buf is const, p->base is const... what's
* the problem? --jcw */
p->base = (char *) buf;
p->pool = pool;
p->list = b->list;
b = apr_bucket_shared_make(b, p, 0, length);
b->type = &apr_bucket_type_pool;
/* pre-initialize heap bucket member */
p->heap.alloc_len = length;
p->heap.base = NULL;
p->heap.free_func = apr_bucket_free;
apr_pool_cleanup_register(p->pool, p, pool_bucket_cleanup,
apr_pool_cleanup_null);
return b;
}
APU_DECLARE(apr_bucket *) apr_bucket_pool_create(const char *buf,
apr_size_t length,
apr_pool_t *pool,
apr_bucket_alloc_t *list)
{
apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
APR_BUCKET_INIT(b);
b->free = apr_bucket_free;
b->list = list;
return apr_bucket_pool_make(b, buf, length, pool);
}
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_pool = {
"POOL", 5, APR_BUCKET_DATA,
pool_bucket_destroy,
pool_bucket_read,
apr_bucket_setaside_noop, /* don't need to setaside thanks to the cleanup*/
apr_bucket_shared_split,
apr_bucket_shared_copy
};

View File

@ -0,0 +1,64 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr_buckets.h"
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_shared_split(apr_bucket *a,
apr_size_t point)
{
apr_bucket_refcount *r = a->data;
apr_status_t rv;
if ((rv = apr_bucket_simple_split(a, point)) != APR_SUCCESS) {
return rv;
}
r->refcount++;
return APR_SUCCESS;
}
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_shared_copy(apr_bucket *a,
apr_bucket **b)
{
apr_bucket_refcount *r = a->data;
apr_bucket_simple_copy(a, b);
r->refcount++;
return APR_SUCCESS;
}
APU_DECLARE(int) apr_bucket_shared_destroy(void *data)
{
apr_bucket_refcount *r = data;
r->refcount--;
return (r->refcount == 0);
}
APU_DECLARE(apr_bucket *) apr_bucket_shared_make(apr_bucket *b, void *data,
apr_off_t start,
apr_size_t length)
{
apr_bucket_refcount *r = data;
b->data = r;
b->start = start;
b->length = length;
/* caller initializes the type field */
r->refcount = 1;
return b;
}

View File

@ -0,0 +1,137 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr_buckets.h"
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_simple_copy(apr_bucket *a,
apr_bucket **b)
{
*b = apr_bucket_alloc(sizeof(**b), a->list); /* XXX: check for failure? */
**b = *a;
return APR_SUCCESS;
}
APU_DECLARE_NONSTD(apr_status_t) apr_bucket_simple_split(apr_bucket *a,
apr_size_t point)
{
apr_bucket *b;
if (point > a->length) {
return APR_EINVAL;
}
apr_bucket_simple_copy(a, &b);
a->length = point;
b->length -= point;
b->start += point;
APR_BUCKET_INSERT_AFTER(a, b);
return APR_SUCCESS;
}
static apr_status_t simple_bucket_read(apr_bucket *b, const char **str,
apr_size_t *len, apr_read_type_e block)
{
*str = (char *)b->data + b->start;
*len = b->length;
return APR_SUCCESS;
}
APU_DECLARE(apr_bucket *) apr_bucket_immortal_make(apr_bucket *b,
const char *buf,
apr_size_t length)
{
b->data = (char *)buf;
b->length = length;
b->start = 0;
b->type = &apr_bucket_type_immortal;
return b;
}
APU_DECLARE(apr_bucket *) apr_bucket_immortal_create(const char *buf,
apr_size_t length,
apr_bucket_alloc_t *list)
{
apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
APR_BUCKET_INIT(b);
b->free = apr_bucket_free;
b->list = list;
return apr_bucket_immortal_make(b, buf, length);
}
/*
* XXX: This function could do with some tweaking to reduce memory
* usage in various cases, e.g. share buffers in the heap between all
* the buckets that are set aside, or even spool set-aside data to
* disk if it gets too voluminous (but if it does then that's probably
* a bug elsewhere). There should probably be a apr_brigade_setaside()
* function that co-ordinates the action of all the bucket setaside
* functions to improve memory efficiency.
*/
static apr_status_t transient_bucket_setaside(apr_bucket *b, apr_pool_t *pool)
{
b = apr_bucket_heap_make(b, (char *)b->data + b->start, b->length, NULL);
if (b == NULL) {
return APR_ENOMEM;
}
return APR_SUCCESS;
}
APU_DECLARE(apr_bucket *) apr_bucket_transient_make(apr_bucket *b,
const char *buf,
apr_size_t length)
{
b->data = (char *)buf;
b->length = length;
b->start = 0;
b->type = &apr_bucket_type_transient;
return b;
}
APU_DECLARE(apr_bucket *) apr_bucket_transient_create(const char *buf,
apr_size_t length,
apr_bucket_alloc_t *list)
{
apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
APR_BUCKET_INIT(b);
b->free = apr_bucket_free;
b->list = list;
return apr_bucket_transient_make(b, buf, length);
}
const apr_bucket_type_t apr_bucket_type_immortal = {
"IMMORTAL", 5, APR_BUCKET_DATA,
apr_bucket_destroy_noop,
simple_bucket_read,
apr_bucket_setaside_noop,
apr_bucket_simple_split,
apr_bucket_simple_copy
};
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_transient = {
"TRANSIENT", 5, APR_BUCKET_DATA,
apr_bucket_destroy_noop,
simple_bucket_read,
transient_bucket_setaside,
apr_bucket_simple_split,
apr_bucket_simple_copy
};

View File

@ -0,0 +1,114 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr_buckets.h"
static apr_status_t socket_bucket_read(apr_bucket *a, const char **str,
apr_size_t *len, apr_read_type_e block)
{
apr_socket_t *p = a->data;
char *buf;
apr_status_t rv;
apr_interval_time_t timeout;
if (block == APR_NONBLOCK_READ) {
apr_socket_timeout_get(p, &timeout);
apr_socket_timeout_set(p, 0);
}
*str = NULL;
*len = APR_BUCKET_BUFF_SIZE;
buf = apr_bucket_alloc(*len, a->list); /* XXX: check for failure? */
rv = apr_socket_recv(p, buf, len);
if (block == APR_NONBLOCK_READ) {
apr_socket_timeout_set(p, timeout);
}
if (rv != APR_SUCCESS && rv != APR_EOF) {
apr_bucket_free(buf);
return rv;
}
/*
* If there's more to read we have to keep the rest of the socket
* for later. XXX: Note that more complicated bucket types that
* refer to data not in memory and must therefore have a read()
* function similar to this one should be wary of copying this
* code because if they have a destroy function they probably
* want to migrate the bucket's subordinate structure from the
* old bucket to a raw new one and adjust it as appropriate,
* rather than destroying the old one and creating a completely
* new bucket.
*
* Even if there is nothing more to read, don't close the socket here
* as we have to use it to send any response :) We could shut it
* down for reading, but there is no benefit to doing so.
*/
if (*len > 0) {
apr_bucket_heap *h;
/* Change the current bucket to refer to what we read */
a = apr_bucket_heap_make(a, buf, *len, apr_bucket_free);
h = a->data;
h->alloc_len = APR_BUCKET_BUFF_SIZE; /* note the real buffer size */
*str = buf;
APR_BUCKET_INSERT_AFTER(a, apr_bucket_socket_create(p, a->list));
}
else {
apr_bucket_free(buf);
a = apr_bucket_immortal_make(a, "", 0);
*str = a->data;
}
return APR_SUCCESS;
}
APU_DECLARE(apr_bucket *) apr_bucket_socket_make(apr_bucket *b, apr_socket_t *p)
{
/*
* XXX: We rely on a cleanup on some pool or other to actually
* destroy the socket. We should probably explicitly call apr to
* destroy it instead.
*
* Note that typically the socket is allocated from the connection pool
* so it will disappear when the connection is finished.
*/
b->type = &apr_bucket_type_socket;
b->length = (apr_size_t)(-1);
b->start = -1;
b->data = p;
return b;
}
APU_DECLARE(apr_bucket *) apr_bucket_socket_create(apr_socket_t *p,
apr_bucket_alloc_t *list)
{
apr_bucket *b = apr_bucket_alloc(sizeof(*b), list);
APR_BUCKET_INIT(b);
b->free = apr_bucket_free;
b->list = list;
return apr_bucket_socket_make(b, p);
}
APU_DECLARE_DATA const apr_bucket_type_t apr_bucket_type_socket = {
"SOCKET", 5, APR_BUCKET_DATA,
apr_bucket_destroy_noop,
socket_bucket_read,
apr_bucket_setaside_notimpl,
apr_bucket_split_notimpl,
apr_bucket_copy_notimpl
};

148
build-outputs.mk Normal file
View File

@ -0,0 +1,148 @@
# DO NOT EDIT. AUTOMATICALLY GENERATED.
buckets/apr_brigade.lo: buckets/apr_brigade.c .make.dirs include/apr_buckets.h
buckets/apr_buckets.lo: buckets/apr_buckets.c .make.dirs include/apr_buckets.h
buckets/apr_buckets_alloc.lo: buckets/apr_buckets_alloc.c .make.dirs include/apr_buckets.h
buckets/apr_buckets_eos.lo: buckets/apr_buckets_eos.c .make.dirs include/apr_buckets.h
buckets/apr_buckets_file.lo: buckets/apr_buckets_file.c .make.dirs include/apr_buckets.h
buckets/apr_buckets_flush.lo: buckets/apr_buckets_flush.c .make.dirs include/apr_buckets.h
buckets/apr_buckets_heap.lo: buckets/apr_buckets_heap.c .make.dirs include/apr_buckets.h
buckets/apr_buckets_mmap.lo: buckets/apr_buckets_mmap.c .make.dirs include/apr_buckets.h
buckets/apr_buckets_pipe.lo: buckets/apr_buckets_pipe.c .make.dirs include/apr_buckets.h
buckets/apr_buckets_pool.lo: buckets/apr_buckets_pool.c .make.dirs include/apr_buckets.h
buckets/apr_buckets_refcount.lo: buckets/apr_buckets_refcount.c .make.dirs include/apr_buckets.h
buckets/apr_buckets_simple.lo: buckets/apr_buckets_simple.c .make.dirs include/apr_buckets.h
buckets/apr_buckets_socket.lo: buckets/apr_buckets_socket.c .make.dirs include/apr_buckets.h
crypto/apr_crypto.lo: crypto/apr_crypto.c .make.dirs include/apr_crypto.h include/apu_errno.h include/apu_version.h include/private/apr_crypto_internal.h include/private/apu_internal.h
crypto/apr_md4.lo: crypto/apr_md4.c .make.dirs include/apr_md4.h include/apr_xlate.h
crypto/apr_md5.lo: crypto/apr_md5.c .make.dirs include/apr_md5.h include/apr_sha1.h include/apr_xlate.h
crypto/apr_sha1.lo: crypto/apr_sha1.c .make.dirs include/apr_base64.h include/apr_sha1.h include/apr_xlate.h
crypto/getuuid.lo: crypto/getuuid.c .make.dirs include/apr_md5.h include/apr_uuid.h include/apr_xlate.h
crypto/uuid.lo: crypto/uuid.c .make.dirs include/apr_uuid.h
dbd/apr_dbd.lo: dbd/apr_dbd.c .make.dirs include/apr_dbd.h include/apu_version.h include/private/apr_dbd_internal.h include/private/apu_internal.h
dbm/apr_dbm.lo: dbm/apr_dbm.c .make.dirs include/apr_dbm.h include/apu_version.h include/private/apr_dbm_private.h include/private/apu_internal.h
dbm/apr_dbm_sdbm.lo: dbm/apr_dbm_sdbm.c .make.dirs include/apr_dbm.h include/apr_sdbm.h include/private/apr_dbm_private.h
dbm/sdbm/sdbm.lo: dbm/sdbm/sdbm.c .make.dirs include/apr_sdbm.h
dbm/sdbm/sdbm_hash.lo: dbm/sdbm/sdbm_hash.c .make.dirs include/apr_sdbm.h
dbm/sdbm/sdbm_lock.lo: dbm/sdbm/sdbm_lock.c .make.dirs include/apr_sdbm.h
dbm/sdbm/sdbm_pair.lo: dbm/sdbm/sdbm_pair.c .make.dirs include/apr_sdbm.h
encoding/apr_base64.lo: encoding/apr_base64.c .make.dirs include/apr_base64.h include/apr_xlate.h
hooks/apr_hooks.lo: hooks/apr_hooks.c .make.dirs include/apr_hooks.h include/apr_optional.h include/apr_optional_hooks.h
ldap/apr_ldap_stub.lo: ldap/apr_ldap_stub.c .make.dirs include/apu_version.h include/private/apu_internal.h
ldap/apr_ldap_url.lo: ldap/apr_ldap_url.c .make.dirs
memcache/apr_memcache.lo: memcache/apr_memcache.c .make.dirs include/apr_buckets.h include/apr_memcache.h include/apr_reslist.h
misc/apr_date.lo: misc/apr_date.c .make.dirs include/apr_date.h
misc/apr_queue.lo: misc/apr_queue.c .make.dirs include/apr_queue.h
misc/apr_reslist.lo: misc/apr_reslist.c .make.dirs include/apr_reslist.h
misc/apr_rmm.lo: misc/apr_rmm.c .make.dirs include/apr_anylock.h include/apr_rmm.h
misc/apr_thread_pool.lo: misc/apr_thread_pool.c .make.dirs include/apr_thread_pool.h
misc/apu_dso.lo: misc/apu_dso.c .make.dirs include/apu_version.h include/private/apu_internal.h
misc/apu_version.lo: misc/apu_version.c .make.dirs include/apu_version.h
strmatch/apr_strmatch.lo: strmatch/apr_strmatch.c .make.dirs include/apr_strmatch.h
uri/apr_uri.lo: uri/apr_uri.c .make.dirs include/apr_uri.h
xlate/xlate.lo: xlate/xlate.c .make.dirs include/apr_xlate.h
xml/apr_xml.lo: xml/apr_xml.c .make.dirs include/apr_xlate.h include/apr_xml.h
OBJECTS_all = buckets/apr_brigade.lo buckets/apr_buckets.lo buckets/apr_buckets_alloc.lo buckets/apr_buckets_eos.lo buckets/apr_buckets_file.lo buckets/apr_buckets_flush.lo buckets/apr_buckets_heap.lo buckets/apr_buckets_mmap.lo buckets/apr_buckets_pipe.lo buckets/apr_buckets_pool.lo buckets/apr_buckets_refcount.lo buckets/apr_buckets_simple.lo buckets/apr_buckets_socket.lo crypto/apr_crypto.lo crypto/apr_md4.lo crypto/apr_md5.lo crypto/apr_sha1.lo crypto/getuuid.lo crypto/uuid.lo dbd/apr_dbd.lo dbm/apr_dbm.lo dbm/apr_dbm_sdbm.lo dbm/sdbm/sdbm.lo dbm/sdbm/sdbm_hash.lo dbm/sdbm/sdbm_lock.lo dbm/sdbm/sdbm_pair.lo encoding/apr_base64.lo hooks/apr_hooks.lo ldap/apr_ldap_stub.lo ldap/apr_ldap_url.lo memcache/apr_memcache.lo misc/apr_date.lo misc/apr_queue.lo misc/apr_reslist.lo misc/apr_rmm.lo misc/apr_thread_pool.lo misc/apu_dso.lo misc/apu_version.lo strmatch/apr_strmatch.lo uri/apr_uri.lo xlate/xlate.lo xml/apr_xml.lo
OBJECTS_unix = $(OBJECTS_all)
OBJECTS_aix = $(OBJECTS_all)
OBJECTS_beos = $(OBJECTS_all)
OBJECTS_os2 = $(OBJECTS_all)
OBJECTS_os390 = $(OBJECTS_all)
OBJECTS_win32 = $(OBJECTS_all)
HEADERS = $(top_srcdir)/include/apr_anylock.h $(top_srcdir)/include/apr_base64.h $(top_srcdir)/include/apr_buckets.h $(top_srcdir)/include/apr_crypto.h $(top_srcdir)/include/apr_date.h $(top_srcdir)/include/apr_dbd.h $(top_srcdir)/include/apr_dbm.h $(top_srcdir)/include/apr_hooks.h $(top_srcdir)/include/apr_ldap_init.h $(top_srcdir)/include/apr_ldap_option.h $(top_srcdir)/include/apr_ldap_rebind.h $(top_srcdir)/include/apr_ldap_url.h $(top_srcdir)/include/apr_md4.h $(top_srcdir)/include/apr_md5.h $(top_srcdir)/include/apr_memcache.h $(top_srcdir)/include/apr_optional.h $(top_srcdir)/include/apr_optional_hooks.h $(top_srcdir)/include/apr_queue.h $(top_srcdir)/include/apr_reslist.h $(top_srcdir)/include/apr_rmm.h $(top_srcdir)/include/apr_sdbm.h $(top_srcdir)/include/apr_sha1.h $(top_srcdir)/include/apr_strmatch.h $(top_srcdir)/include/apr_thread_pool.h $(top_srcdir)/include/apr_uri.h $(top_srcdir)/include/apr_uuid.h $(top_srcdir)/include/apr_xlate.h $(top_srcdir)/include/apr_xml.h $(top_srcdir)/include/apu_errno.h $(top_srcdir)/include/apu_version.h $(top_srcdir)/include/private/apr_crypto_internal.h $(top_srcdir)/include/private/apr_dbd_internal.h $(top_srcdir)/include/private/apr_dbd_odbc_v2.h $(top_srcdir)/include/private/apr_dbm_private.h $(top_srcdir)/include/private/apu_internal.h
SOURCE_DIRS = xml dbm encoding hooks buckets uri misc crypto dbd strmatch memcache dbm/sdbm ldap xlate $(EXTRA_SOURCE_DIRS)
ldap/apr_ldap_init.lo: ldap/apr_ldap_init.c .make.dirs include/private/apu_internal.h
ldap/apr_ldap_option.lo: ldap/apr_ldap_option.c .make.dirs
ldap/apr_ldap_rebind.lo: ldap/apr_ldap_rebind.c .make.dirs include/apr_ldap_rebind.h
OBJECTS_ldap = ldap/apr_ldap_init.lo ldap/apr_ldap_option.lo ldap/apr_ldap_rebind.lo
MODULE_ldap = ldap/apr_ldap.la
ldap/apr_ldap.la: ldap/apr_ldap_init.lo ldap/apr_ldap_option.lo ldap/apr_ldap_rebind.lo
$(LINK_MODULE) -o $@ $(OBJECTS_ldap) $(LDADD_ldap)
crypto/apr_crypto_openssl.lo: crypto/apr_crypto_openssl.c .make.dirs include/apr_buckets.h include/apr_crypto.h include/apu_errno.h include/private/apr_crypto_internal.h
OBJECTS_crypto_openssl = crypto/apr_crypto_openssl.lo
MODULE_crypto_openssl = crypto/apr_crypto_openssl.la
crypto/apr_crypto_openssl.la: crypto/apr_crypto_openssl.lo
$(LINK_MODULE) -o $@ $(OBJECTS_crypto_openssl) $(LDADD_crypto_openssl)
crypto/apr_crypto_nss.lo: crypto/apr_crypto_nss.c .make.dirs include/apr_buckets.h include/apr_crypto.h include/apu_errno.h include/private/apr_crypto_internal.h
OBJECTS_crypto_nss = crypto/apr_crypto_nss.lo
MODULE_crypto_nss = crypto/apr_crypto_nss.la
crypto/apr_crypto_nss.la: crypto/apr_crypto_nss.lo
$(LINK_MODULE) -o $@ $(OBJECTS_crypto_nss) $(LDADD_crypto_nss)
dbd/apr_dbd_pgsql.lo: dbd/apr_dbd_pgsql.c .make.dirs include/apr_buckets.h include/apr_dbd.h include/private/apr_dbd_internal.h
OBJECTS_dbd_pgsql = dbd/apr_dbd_pgsql.lo
MODULE_dbd_pgsql = dbd/apr_dbd_pgsql.la
dbd/apr_dbd_pgsql.la: dbd/apr_dbd_pgsql.lo
$(LINK_MODULE) -o $@ $(OBJECTS_dbd_pgsql) $(LDADD_dbd_pgsql)
dbd/apr_dbd_sqlite2.lo: dbd/apr_dbd_sqlite2.c .make.dirs include/apr_buckets.h include/apr_dbd.h include/private/apr_dbd_internal.h
OBJECTS_dbd_sqlite2 = dbd/apr_dbd_sqlite2.lo
MODULE_dbd_sqlite2 = dbd/apr_dbd_sqlite2.la
dbd/apr_dbd_sqlite2.la: dbd/apr_dbd_sqlite2.lo
$(LINK_MODULE) -o $@ $(OBJECTS_dbd_sqlite2) $(LDADD_dbd_sqlite2)
dbd/apr_dbd_sqlite3.lo: dbd/apr_dbd_sqlite3.c .make.dirs include/apr_buckets.h include/apr_dbd.h include/private/apr_dbd_internal.h
OBJECTS_dbd_sqlite3 = dbd/apr_dbd_sqlite3.lo
MODULE_dbd_sqlite3 = dbd/apr_dbd_sqlite3.la
dbd/apr_dbd_sqlite3.la: dbd/apr_dbd_sqlite3.lo
$(LINK_MODULE) -o $@ $(OBJECTS_dbd_sqlite3) $(LDADD_dbd_sqlite3)
dbd/apr_dbd_oracle.lo: dbd/apr_dbd_oracle.c .make.dirs include/apr_buckets.h include/apr_dbd.h include/private/apr_dbd_internal.h
OBJECTS_dbd_oracle = dbd/apr_dbd_oracle.lo
MODULE_dbd_oracle = dbd/apr_dbd_oracle.la
dbd/apr_dbd_oracle.la: dbd/apr_dbd_oracle.lo
$(LINK_MODULE) -o $@ $(OBJECTS_dbd_oracle) $(LDADD_dbd_oracle)
dbd/apr_dbd_mysql.lo: dbd/apr_dbd_mysql.c .make.dirs include/apr_buckets.h include/apr_dbd.h include/apu_version.h include/private/apr_dbd_internal.h
OBJECTS_dbd_mysql = dbd/apr_dbd_mysql.lo
MODULE_dbd_mysql = dbd/apr_dbd_mysql.la
dbd/apr_dbd_mysql.la: dbd/apr_dbd_mysql.lo
$(LINK_MODULE) -o $@ $(OBJECTS_dbd_mysql) $(LDADD_dbd_mysql)
dbd/apr_dbd_freetds.lo: dbd/apr_dbd_freetds.c .make.dirs include/apr_dbd.h include/private/apr_dbd_internal.h
OBJECTS_dbd_freetds = dbd/apr_dbd_freetds.lo
MODULE_dbd_freetds = dbd/apr_dbd_freetds.la
dbd/apr_dbd_freetds.la: dbd/apr_dbd_freetds.lo
$(LINK_MODULE) -o $@ $(OBJECTS_dbd_freetds) $(LDADD_dbd_freetds)
dbd/apr_dbd_odbc.lo: dbd/apr_dbd_odbc.c .make.dirs include/apr_buckets.h include/apr_dbd.h include/apu_version.h include/private/apr_dbd_internal.h include/private/apr_dbd_odbc_v2.h
OBJECTS_dbd_odbc = dbd/apr_dbd_odbc.lo
MODULE_dbd_odbc = dbd/apr_dbd_odbc.la
dbd/apr_dbd_odbc.la: dbd/apr_dbd_odbc.lo
$(LINK_MODULE) -o $@ $(OBJECTS_dbd_odbc) $(LDADD_dbd_odbc)
dbm/apr_dbm_berkeleydb.lo: dbm/apr_dbm_berkeleydb.c .make.dirs include/apr_dbm.h include/private/apr_dbm_private.h
OBJECTS_dbm_db = dbm/apr_dbm_berkeleydb.lo
MODULE_dbm_db = dbm/apr_dbm_db.la
dbm/apr_dbm_db.la: dbm/apr_dbm_berkeleydb.lo
$(LINK_MODULE) -o $@ $(OBJECTS_dbm_db) $(LDADD_dbm_db)
dbm/apr_dbm_gdbm.lo: dbm/apr_dbm_gdbm.c .make.dirs include/apr_dbm.h include/private/apr_dbm_private.h
OBJECTS_dbm_gdbm = dbm/apr_dbm_gdbm.lo
MODULE_dbm_gdbm = dbm/apr_dbm_gdbm.la
dbm/apr_dbm_gdbm.la: dbm/apr_dbm_gdbm.lo
$(LINK_MODULE) -o $@ $(OBJECTS_dbm_gdbm) $(LDADD_dbm_gdbm)
dbm/apr_dbm_ndbm.lo: dbm/apr_dbm_ndbm.c .make.dirs include/apr_dbm.h include/private/apr_dbm_private.h
OBJECTS_dbm_ndbm = dbm/apr_dbm_ndbm.lo
MODULE_dbm_ndbm = dbm/apr_dbm_ndbm.la
dbm/apr_dbm_ndbm.la: dbm/apr_dbm_ndbm.lo
$(LINK_MODULE) -o $@ $(OBJECTS_dbm_ndbm) $(LDADD_dbm_ndbm)
BUILD_DIRS = buckets crypto dbd dbm dbm/sdbm encoding hooks ldap memcache misc strmatch uri xlate xml
.make.dirs: $(srcdir)/build-outputs.mk
@for d in $(BUILD_DIRS); do test -d $$d || mkdir $$d; done
@echo timestamp > $@

100
build.conf Normal file
View File

@ -0,0 +1,100 @@
#
# Configuration file for APRUTIL. Used by APR/build/gen-build.py
#
[options]
# the platform-independent .c files
paths =
buckets/*.c
crypto/apr_crypto.c
crypto/apr_md4.c
crypto/apr_md5.c
crypto/apr_sha1.c
crypto/getuuid.c
crypto/uuid.c
dbm/apr_dbm_sdbm.c
dbm/apr_dbm.c
dbm/sdbm/*.c
encoding/*.c
hooks/*.c
ldap/apr_ldap_stub.c
ldap/apr_ldap_url.c
misc/*.c
memcache/*.c
uri/apr_uri.c
xml/*.c
strmatch/*.c
xlate/*.c
dbd/apr_dbd.c
# we have no platform-specific subdirs
platform_dirs =
# the public headers
headers = include/*.h include/private/*.h
modules =
ldap crypto_openssl crypto_nss dbd_pgsql
dbd_sqlite2 dbd_sqlite3 dbd_oracle dbd_mysql dbd_freetds dbd_odbc
dbm_db dbm_gdbm dbm_ndbm
# gen_uri_delim.c
# we have a recursive makefile for the test files (for now)
# test/*.c
[crypto_openssl]
paths = crypto/apr_crypto_openssl.c
target = crypto/apr_crypto_openssl.la
[crypto_nss]
paths = crypto/apr_crypto_nss.c
target = crypto/apr_crypto_nss.la
[dbd_pgsql]
paths = dbd/apr_dbd_pgsql.c
target = dbd/apr_dbd_pgsql.la
[dbd_sqlite2]
paths = dbd/apr_dbd_sqlite2.c
target = dbd/apr_dbd_sqlite2.la
[dbd_sqlite3]
paths = dbd/apr_dbd_sqlite3.c
target = dbd/apr_dbd_sqlite3.la
[dbd_oracle]
paths = dbd/apr_dbd_oracle.c
target = dbd/apr_dbd_oracle.la
[dbd_mysql]
paths = dbd/apr_dbd_mysql.c
target = dbd/apr_dbd_mysql.la
[dbd_freetds]
paths = dbd/apr_dbd_freetds.c
target = dbd/apr_dbd_freetds.la
[dbd_odbc]
paths = dbd/apr_dbd_odbc.c
target = dbd/apr_dbd_odbc.la
[dbm_db]
paths = dbm/apr_dbm_berkeleydb.c
target = dbm/apr_dbm_db.la
[dbm_gdbm]
paths = dbm/apr_dbm_gdbm.c
target = dbm/apr_dbm_gdbm.la
[dbm_ndbm]
paths = dbm/apr_dbm_ndbm.c
target = dbm/apr_dbm_ndbm.la
[ldap]
paths = ldap/apr_ldap_init.c
ldap/apr_ldap_option.c
ldap/apr_ldap_rebind.c
target = ldap/apr_ldap.la

116
buildconf Executable file
View File

@ -0,0 +1,116 @@
#!/bin/sh
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
if [ "$1" = "--verbose" -o "$1" = "-v" ]; then
verbose="--verbose"
shift
fi
# Default place to look for apr source. Can be overridden with
# --with-apr=[directory]
apr_src_dir=../apr
while test $# -gt 0
do
# Normalize
case "$1" in
-*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
*) optarg= ;;
esac
case "$1" in
--with-apr=*)
apr_src_dir=$optarg
;;
esac
shift
done
if [ -f "$apr_src_dir/build/apr_common.m4" ]; then
apr_src_dir=`cd $apr_src_dir; pwd`
echo ""
echo "Looking for apr source in $apr_src_dir"
else
echo ""
echo "Problem finding apr source in $apr_src_dir."
echo "Use:"
echo " --with-apr=[directory]"
exit 1
fi
set -e
# Remove some files, then copy them from apr source tree
rm -f build/apr_common.m4 build/find_apr.m4 build/install.sh \
build/config.guess build/config.sub build/get-version.sh
cp -p $apr_src_dir/build/apr_common.m4 $apr_src_dir/build/find_apr.m4 \
$apr_src_dir/build/install.sh $apr_src_dir/build/config.guess \
$apr_src_dir/build/config.sub $apr_src_dir/build/get-version.sh \
build/
# Remove aclocal.m4 as it'll break some builds...
rm -rf aclocal.m4 autom4te*.cache
#
# Generate the autoconf header (include/apu_config.h) and ./configure
#
echo "Creating include/private/apu_config.h ..."
${AUTOHEADER:-autoheader} $verbose
echo "Creating configure ..."
### do some work to toss config.cache?
if ${AUTOCONF:-autoconf} $verbose; then
:
else
echo "autoconf failed"
exit 1
fi
#
# Generate build-outputs.mk for the build system
#
echo "Generating 'make' outputs ..."
$apr_src_dir/build/gen-build.py $verbose make
#
# If Expat has been bundled, then go and configure the thing
#
if [ -f xml/expat/buildconf.sh ]; then
echo "Invoking xml/expat/buildconf.sh ..."
(cd xml/expat; ./buildconf.sh $verbose)
fi
# Remove autoconf cache again
rm -rf autom4te*.cache
# Create RPM Spec file
if [ -f `which cut` ]; then
echo rebuilding rpm spec file
REVISION=`build/get-version.sh all include/apu_version.h APU`
VERSION=`echo $REVISION | cut -d- -s -f1`
RELEASE=`echo $REVISION | cut -d- -s -f2`
if [ "x$VERSION" = "x" ]; then
VERSION=$REVISION
RELEASE=1
fi
sed -e "s/APU_VERSION/$VERSION/" -e "s/APU_RELEASE/$RELEASE/" \
./build/rpm/apr-util.spec.in > apr-util.spec
fi

232
config.layout Normal file
View File

@ -0,0 +1,232 @@
##
## config.layout -- Pre-defined Installation Path Layouts
##
## Hints:
## - layouts can be loaded with configure's --enable-layout=ID option
## - when no --enable-layout option is given, the default layout is `apr'
## - a trailing plus character (`+') on paths is replaced with a
## `/<target>' suffix where <target> is currently hardcoded to 'apr'.
## (This may become a configurable parameter at some point.)
##
# Classical APR-util path layout designed for parallel installs.
<Layout apr-util>
prefix: /usr/local/apr
exec_prefix: ${prefix}
bindir: ${exec_prefix}/bin
sbindir: ${exec_prefix}/bin
libdir: ${exec_prefix}/lib
libexecdir: ${exec_prefix}/modules
mandir: ${prefix}/man
sysconfdir: ${prefix}/conf
datadir: ${prefix}
installbuilddir: ${datadir}/build
includedir: ${prefix}/include/apr-${APRUTIL_MAJOR_VERSION}
localstatedir: ${prefix}
libsuffix: -${APRUTIL_MAJOR_VERSION}
</Layout>
# Classical single-installation APR path layout.
<Layout classic>
prefix: /usr/local/apr
exec_prefix: ${prefix}
bindir: ${exec_prefix}/bin
sbindir: ${exec_prefix}/bin
libdir: ${exec_prefix}/lib
libexecdir: ${exec_prefix}/modules
mandir: ${prefix}/man
sysconfdir: ${prefix}/conf
datadir: ${prefix}
installbuilddir: ${datadir}/build
includedir: ${prefix}/include
localstatedir: ${prefix}
</Layout>
# GNU standards conforming path layout.
# See FSF's GNU project `make-stds' document for details.
<Layout GNU>
prefix: /usr/local
exec_prefix: ${prefix}
bindir: ${exec_prefix}/bin
sbindir: ${exec_prefix}/sbin
libdir: ${exec_prefix}/lib
libexecdir: ${exec_prefix}/libexec
mandir: ${prefix}/man
sysconfdir: ${prefix}/etc+
datadir: ${prefix}/share+
installbuilddir: ${datadir}/build
includedir: ${prefix}/include+
localstatedir: ${prefix}/var+
runtimedir: ${localstatedir}/run
</Layout>
# Mac OS X Server (Rhapsody)
<Layout Mac OS X Server>
prefix: /Local/Library/WebServer
exec_prefix: /usr
bindir: ${exec_prefix}/bin
sbindir: ${exec_prefix}/sbin
libdir: ${exec_prefix}/lib
libexecdir: /System/Library/apr/Modules
mandir: ${exec_prefix}/share/man
sysconfdir: ${prefix}/Configuration
datadir: ${prefix}
installbuilddir: /System/Library/apr/Build
includedir: /System/Library/Frameworks/apr.framework/Versions/2.0/Headers
localstatedir: /var
runtimedir: ${prefix}/Logs
</Layout>
# Darwin/Mac OS Layout
<Layout Darwin>
prefix: /usr
exec_prefix: ${prefix}
bindir: ${exec_prefix}/bin
sbindir: ${exec_prefix}/sbin
libdir: ${exec_prefix}/lib
libexecdir: ${exec_prefix}/libexec+
mandir: ${prefix}/share/man
datadir: /Library/WebServer
sysconfdir: /etc+
installbuilddir: ${prefix}/share/httpd/build
includedir: ${prefix}/include+
localstatedir: /var
runtimedir: ${localstatedir}/run
</Layout>
# Red Hat Linux 7.x layout
<Layout RedHat>
prefix: /usr
exec_prefix: ${prefix}
bindir: ${prefix}/bin
sbindir: ${prefix}/sbin
libdir: ${prefix}/lib
libexecdir: ${prefix}/lib/apr
mandir: ${prefix}/man
sysconfdir: /etc/httpd/conf
datadir: /var/www
installbuilddir: ${datadir}/build
includedir: ${prefix}/include/apr
localstatedir: /var
runtimedir: ${localstatedir}/run
</Layout>
# According to the /opt filesystem conventions
<Layout opt>
prefix: /opt/apr
exec_prefix: ${prefix}
bindir: ${exec_prefix}/bin
sbindir: ${exec_prefix}/sbin
libdir: ${exec_prefix}/lib
libexecdir: ${exec_prefix}/libexec
mandir: ${prefix}/man
sysconfdir: /etc${prefix}
datadir: ${prefix}/share
installbuilddir: ${datadir}/build
includedir: ${prefix}/include
localstatedir: /var${prefix}
runtimedir: ${localstatedir}/run
</Layout>
# BeOS layout...
<Layout beos>
prefix: /boot/home/apr
exec_prefix: ${prefix}
bindir: ${exec_prefix}/bin
sbindir: ${exec_prefix}/bin
libdir: ${exec_prefix}/lib
libexecdir: ${exec_prefix}/libexec
mandir: ${prefix}/man
sysconfdir: ${prefix}/conf
datadir: ${prefix}
installbuilddir: ${datadir}/build
includedir: ${prefix}/include
localstatedir: ${prefix}
runtimedir: ${localstatedir}/logs
</Layout>
# SuSE 6.x layout
<Layout SuSE>
prefix: /usr
exec_prefix: ${prefix}
bindir: ${prefix}/bin
sbindir: ${prefix}/sbin
libdir: ${prefix}/lib
libexecdir: ${prefix}/lib/apr
mandir: ${prefix}/share/man
sysconfdir: /etc/httpd
datadir: /usr/local/httpd
installbuilddir: ${datadir}/build
includedir: ${prefix}/include/apr
localstatedir: /var/lib/httpd
runtimedir: /var/run
</Layout>
# BSD/OS layout
<Layout BSDI>
prefix: /var/www
exec_prefix: /usr/contrib
bindir: ${exec_prefix}/bin
sbindir: ${exec_prefix}/bin
libdir: ${exec_prefix}/lib
libexecdir: ${exec_prefix}/libexec/apr
mandir: ${exec_prefix}/man
sysconfdir: ${prefix}/conf
datadir: ${prefix}
installbuilddir: ${datadir}/build
includedir: ${exec_prefix}/include/apr
localstatedir: /var
runtimedir: ${localstatedir}/run
</Layout>
# Solaris 8 Layout
<Layout Solaris>
prefix: /usr/apr
exec_prefix: ${prefix}
bindir: ${exec_prefix}/bin
sbindir: ${exec_prefix}/bin
libdir: ${exec_prefix}/lib
libexecdir: ${exec_prefix}/libexec
mandir: ${exec_prefix}/man
sysconfdir: /etc/apr
datadir: /var/apr
installbuilddir: ${datadir}/build
includedir: ${exec_prefix}/include
localstatedir: ${prefix}
runtimedir: /var/run
</Layout>
# OpenBSD Layout
<Layout OpenBSD>
prefix: /var/www
exec_prefix: /usr
bindir: ${exec_prefix}/bin
sbindir: ${exec_prefix}/sbin
libdir: ${exec_prefix}/lib
libexecdir: ${exec_prefix}/lib/apr/modules
mandir: ${exec_prefix}/share/man
sysconfdir: ${prefix}/conf
datadir: ${prefix}
installbuilddir: ${prefix}/build
includedir: ${exec_prefix}/lib/apr/include
localstatedir: ${prefix}
runtimedir: ${prefix}/logs
</Layout>
# Debian layout
<Layout Debian>
prefix:
exec_prefix: ${prefix}/usr
bindir: ${exec_prefix}/bin
sbindir: ${exec_prefix}/sbin
libdir: ${exec_prefix}/lib
libexecdir: ${exec_prefix}/lib/apr/modules
mandir: ${exec_prefix}/share/man
datadir: ${exec_prefix}/share/apr
includedir: ${exec_prefix}/include/apr-${APRUTIL_MAJOR_VERSION}
localstatedir: ${prefix}/var/run
runtimedir: ${prefix}/var/run
infodir: ${exec_prefix}/share/info
libsuffix: -${APRUTIL_MAJOR_VERSION}
installbuilddir: ${prefix}/usr/share/apache2/build
</Layout>

37786
configure vendored Executable file

File diff suppressed because it is too large Load Diff

272
configure.in Normal file
View File

@ -0,0 +1,272 @@
dnl
dnl Process this file with autoconf to produce a configure script
dnl
AC_PREREQ(2.59)
AC_INIT(export_vars.sh.in)
AC_CONFIG_HEADER(include/private/apu_config.h)
AC_CONFIG_AUX_DIR(build)
sinclude(build/apu-conf.m4)
sinclude(build/apu-iconv.m4)
sinclude(build/apu-hints.m4)
sinclude(build/apr_common.m4)
sinclude(build/find_apr.m4)
sinclude(build/crypto.m4)
sinclude(build/dbm.m4)
sinclude(build/dbd.m4)
sinclude(build/dso.m4)
dnl Generate ./config.nice for reproducing runs of configure
dnl
APR_CONFIG_NICE(config.nice)
dnl # Some initial steps for configuration. We setup the default directory
dnl # and which files are to be configured.
dnl Absolute source/build directory
abs_srcdir=`(cd $srcdir && pwd)`
abs_builddir=`pwd`
if test "$abs_builddir" != "$abs_srcdir"; then
USE_VPATH=1
APU_CONFIG_LOCATION=build
else
APU_CONFIG_LOCATION=source
fi
AC_SUBST(APU_CONFIG_LOCATION)
AC_CANONICAL_SYSTEM
AC_PROG_INSTALL
# Use -no-install to link the test programs on all platforms
# but Darwin, where it would cause the programs to be linked
# against installed versions of libapr instead of those just
# built.
case $host in
*-apple-darwin*) LT_NO_INSTALL="" ;;
*) LT_NO_INSTALL="-no-install" ;;
esac
AC_SUBST(LT_NO_INSTALL)
dnl
dnl compute the top directory of the build
dnl note: this is needed for LIBTOOL and exporting the bundled Expat
dnl
top_builddir="$abs_builddir"
AC_SUBST(top_builddir)
AC_SUBST(abs_srcdir)
AC_SUBST(abs_builddir)
dnl Initialize mkdir -p functionality.
APR_MKDIR_P_CHECK($abs_srcdir/build/mkdir.sh)
dnl get our version information
get_version="$abs_srcdir/build/get-version.sh"
version_hdr="$abs_srcdir/include/apu_version.h"
APRUTIL_MAJOR_VERSION="`$get_version major $version_hdr APU`"
APRUTIL_DOTTED_VERSION="`$get_version all $version_hdr APU`"
APU_LTVERSION="-version-info `$get_version libtool $version_hdr APU`"
AC_SUBST(APRUTIL_DOTTED_VERSION)
AC_SUBST(APRUTIL_MAJOR_VERSION)
AC_SUBST(APU_LTVERSION)
echo "APR-util Version: ${APRUTIL_DOTTED_VERSION}"
dnl Enable the layout handling code, then reparse the prefix-style
dnl arguments due to autoconf being a PITA.
APR_ENABLE_LAYOUT(apr-util)
APR_PARSE_ARGUMENTS
dnl load os-specific hints for apr-util
APU_PRELOAD
dnl
dnl set up the compilation flags and stuff
dnl
APRUTIL_INCLUDES=""
APRUTIL_PRIV_INCLUDES="-I$top_builddir/include -I$top_builddir/include/private"
if test -n "$USE_VPATH"; then
APRUTIL_PRIV_INCLUDES="$APRUTIL_PRIV_INCLUDES -I$abs_srcdir/include/private -I$abs_srcdir/include"
fi
dnl
dnl Find the APR includes directory and (possibly) the source (base) dir.
dnl
APU_FIND_APR
dnl
dnl even though we use apr_rules.mk for building apr-util, we need
dnl to grab CC and CPP ahead of time so that apr-util config tests
dnl use the same compiler as APR; we need the same compiler options
dnl and feature test macros as well
dnl
APR_SETIFNULL(CC, `$apr_config --cc`)
APR_SETIFNULL(CPP, `$apr_config --cpp`)
APR_ADDTO(CFLAGS, `$apr_config --cflags`)
APR_ADDTO(CPPFLAGS, `$apr_config --cppflags`)
apr_shlibpath_var=`$apr_config --shlib-path-var`
AC_SUBST(apr_shlibpath_var)
dnl
dnl Find the APR-ICONV directory.
dnl
AC_ARG_WITH(apr-iconv,
[ --with-apr-iconv=DIR relative path to apr-iconv source],
[ apu_apriconv_dir="$withval"
if test "$apu_apriconv_dir" != "no"; then
if test -d "$apu_apriconv_dir"; then
APR_SUBDIR_CONFIG("$apu_apriconv_dir",
[$apache_apr_flags \
--prefix=$prefix \
--exec-prefix=$exec_prefix \
--libdir=$libdir \
--includedir=$includedir \
--bindir=$bindir \
--datadir=$datadir \
--with-installbuilddir=$installbuilddir],
[--enable-layout=*|\'--enable-layout=*])
APRUTIL_EXPORT_LIBS="$abs_srcdir/$apu_apriconv_dir/lib/libapriconv.la \
$APRUTIL_EXPORT_LIBS"
APRUTIL_INCLUDES="-I$abs_srcdir/$apu_apriconv_dir/include \
$APRUTIL_INCLUDES"
APR_ICONV_DIR="$apu_apriconv_dir"
else
APR_ICONV_DIR=""
fi
else
APR_ICONV_DIR=""
fi
])
AC_SUBST(APR_ICONV_DIR)
dnl Find LDAP library
dnl Determine what DBM backend type to use.
dnl Find Expat
dnl Find an iconv library
APU_CHECK_CRYPTO
APU_CHECK_CRYPTO_OPENSSL
APU_CHECK_CRYPTO_NSS
APU_FIND_LDAP
APU_CHECK_DBM
APU_CHECK_DBD
APU_CHECK_DBD_MYSQL
APU_CHECK_DBD_SQLITE3
APU_CHECK_DBD_SQLITE2
APU_CHECK_DBD_ORACLE
APU_CHECK_DBD_FREETDS
APU_CHECK_DBD_ODBC
APU_FIND_EXPAT
APU_FIND_ICONV
dnl Enable DSO build; must be last:
APU_CHECK_UTIL_DSO
AC_SEARCH_LIBS(crypt, crypt ufc)
AC_MSG_CHECKING(if system crypt() function is threadsafe)
if test "x$apu_crypt_threadsafe" = "x1"; then
AC_DEFINE(APU_CRYPT_THREADSAFE, 1, [Define if the system crypt() function is threadsafe])
msg="yes"
else
msg="no"
fi
AC_MSG_RESULT([$msg])
AC_CHECK_FUNCS(crypt_r, [ crypt_r="1" ], [ crypt_r="0" ])
if test "$crypt_r" = "1"; then
APU_CHECK_CRYPT_R_STYLE
fi
so_ext=$APR_SO_EXT
lib_target=$APR_LIB_TARGET
AC_SUBST(so_ext)
AC_SUBST(lib_target)
APRUTIL_LIBNAME="aprutil${libsuffix}"
AC_SUBST(APRUTIL_LIBNAME)
# Set up destination directory for DSOs.
APU_DSO_LIBDIR="\${libdir}/apr-util-${APRUTIL_MAJOR_VERSION}"
# Set APU_HAVE_MODULES appropriately for the Makefile
if test -n "$APU_MODULES"; then
APU_HAVE_MODULES=yes
else
APU_HAVE_MODULES=no
fi
# Define expanded libdir for apu_config.h
APR_EXPAND_VAR(abs_dso_libdir, $APU_DSO_LIBDIR)
AC_DEFINE_UNQUOTED([APU_DSO_LIBDIR], ["$abs_dso_libdir"],
[Define to be absolute path to DSO directory])
AC_SUBST(APU_HAVE_MODULES)
AC_SUBST(APU_DSO_LIBDIR)
AC_SUBST(APU_MODULES)
AC_SUBST(EXTRA_OBJECTS)
dnl
dnl Prep all the flags and stuff for compilation and export to other builds
dnl
APR_ADDTO(APRUTIL_LIBS, [$APR_LIBS])
AC_SUBST(APRUTIL_EXPORT_LIBS)
AC_SUBST(APRUTIL_PRIV_INCLUDES)
AC_SUBST(APRUTIL_INCLUDES)
AC_SUBST(APRUTIL_LDFLAGS)
AC_SUBST(APRUTIL_LIBS)
AC_SUBST(LDFLAGS)
dnl copy apr's rules.mk into our build directory.
if test ! -d ./build; then
$mkdir_p build
fi
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

523
crypto/apr_crypto.c Normal file
View File

@ -0,0 +1,523 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <ctype.h>
#include <stdio.h>
#include "apu_config.h"
#include "apu.h"
#include "apr_pools.h"
#include "apr_dso.h"
#include "apr_strings.h"
#include "apr_hash.h"
#include "apr_thread_mutex.h"
#include "apr_lib.h"
#if APU_HAVE_CRYPTO
#include "apu_internal.h"
#include "apr_crypto_internal.h"
#include "apr_crypto.h"
#include "apu_version.h"
static apr_hash_t *drivers = NULL;
#define ERROR_SIZE 1024
#define CLEANUP_CAST (apr_status_t (*)(void*))
#define APR_TYPEDEF_STRUCT(type, incompletion) \
struct type { \
incompletion \
void *unk[]; \
};
APR_TYPEDEF_STRUCT(apr_crypto_t,
apr_pool_t *pool;
apr_crypto_driver_t *provider;
)
APR_TYPEDEF_STRUCT(apr_crypto_key_t,
apr_pool_t *pool;
apr_crypto_driver_t *provider;
const apr_crypto_t *f;
)
APR_TYPEDEF_STRUCT(apr_crypto_block_t,
apr_pool_t *pool;
apr_crypto_driver_t *provider;
const apr_crypto_t *f;
)
typedef struct apr_crypto_clear_t {
void *buffer;
apr_size_t size;
} apr_crypto_clear_t;
#if !APU_DSO_BUILD
#define DRIVER_LOAD(name,driver,pool,params) \
{ \
extern const apr_crypto_driver_t driver; \
apr_hash_set(drivers,name,APR_HASH_KEY_STRING,&driver); \
if (driver.init) { \
driver.init(pool, params); \
} \
}
#endif
static apr_status_t apr_crypto_term(void *ptr)
{
/* set drivers to NULL so init can work again */
drivers = NULL;
/* Everything else we need is handled by cleanups registered
* when we created mutexes and loaded DSOs
*/
return APR_SUCCESS;
}
APU_DECLARE(apr_status_t) apr_crypto_init(apr_pool_t *pool)
{
apr_status_t ret = APR_SUCCESS;
apr_pool_t *parent;
if (drivers != NULL) {
return APR_SUCCESS;
}
/* Top level pool scope, need process-scope lifetime */
for (parent = pool; parent; parent = apr_pool_parent_get(pool))
pool = parent;
#if APU_DSO_BUILD
/* deprecate in 2.0 - permit implicit initialization */
apu_dso_init(pool);
#endif
drivers = apr_hash_make(pool);
#if !APU_DSO_BUILD
/* Load statically-linked drivers: */
#if APU_HAVE_OPENSSL
DRIVER_LOAD("openssl", apr_crypto_openssl_driver, pool, params);
#endif
#if APU_HAVE_NSS
DRIVER_LOAD("nss", apr_crypto_nss_driver, pool, params);
#endif
#if APU_HAVE_MSCAPI
DRIVER_LOAD("mscapi", apr_crypto_mscapi_driver, pool, params);
#endif
#if APU_HAVE_MSCNG
DRIVER_LOAD("mscng", apr_crypto_mscng_driver, pool, params);
#endif
#endif /* APU_DSO_BUILD */
apr_pool_cleanup_register(pool, NULL, apr_crypto_term,
apr_pool_cleanup_null);
return ret;
}
static apr_status_t crypto_clear(void *ptr)
{
apr_crypto_clear_t *clear = (apr_crypto_clear_t *)ptr;
memset(clear->buffer, 0, clear->size);
clear->buffer = NULL;
clear->size = 0;
return APR_SUCCESS;
}
APU_DECLARE(apr_status_t) apr_crypto_clear(apr_pool_t *pool,
void *buffer, apr_size_t size)
{
apr_crypto_clear_t *clear = apr_palloc(pool, sizeof(apr_crypto_clear_t));
clear->buffer = buffer;
clear->size = size;
apr_pool_cleanup_register(pool, clear, crypto_clear,
apr_pool_cleanup_null);
return APR_SUCCESS;
}
APU_DECLARE(apr_status_t) apr_crypto_get_driver(
const apr_crypto_driver_t **driver, const char *name,
const char *params, const apu_err_t **result, apr_pool_t *pool)
{
#if APU_DSO_BUILD
char modname[32];
char symname[34];
apr_dso_handle_t *dso;
apr_dso_handle_sym_t symbol;
#endif
apr_status_t rv;
int rc = 0;
#if APU_DSO_BUILD
rv = apu_dso_mutex_lock();
if (rv) {
return rv;
}
#endif
*driver = apr_hash_get(drivers, name, APR_HASH_KEY_STRING);
if (*driver) {
#if APU_DSO_BUILD
apu_dso_mutex_unlock();
#endif
return APR_SUCCESS;
}
#if APU_DSO_BUILD
/* The driver DSO must have exactly the same lifetime as the
* drivers hash table; ignore the passed-in pool */
pool = apr_hash_pool_get(drivers);
#if defined(NETWARE)
apr_snprintf(modname, sizeof(modname), "crypto%s.nlm", name);
#elif defined(WIN32)
apr_snprintf(modname, sizeof(modname),
"apr_crypto_%s-" APU_STRINGIFY(APU_MAJOR_VERSION) ".dll", name);
#else
apr_snprintf(modname, sizeof(modname),
"apr_crypto_%s-" APU_STRINGIFY(APU_MAJOR_VERSION) ".so", name);
#endif
apr_snprintf(symname, sizeof(symname), "apr_crypto_%s_driver", name);
rv = apu_dso_load(&dso, &symbol, modname, symname, pool);
if (rv != APR_SUCCESS) { /* APR_EDSOOPEN or APR_ESYMNOTFOUND? */
if (rv == APR_EINIT) { /* previously loaded?!? */
name = apr_pstrdup(pool, name);
apr_hash_set(drivers, name, APR_HASH_KEY_STRING, *driver);
rv = APR_SUCCESS;
}
goto unlock;
}
*driver = symbol;
if ((*driver)->init) {
rv = (*driver)->init(pool, params, &rc);
}
name = apr_pstrdup(pool, name);
apr_hash_set(drivers, name, APR_HASH_KEY_STRING, *driver);
unlock: apu_dso_mutex_unlock();
if (APR_SUCCESS != rv && result) {
char *buffer = apr_pcalloc(pool, ERROR_SIZE);
apu_err_t *err = apr_pcalloc(pool, sizeof(apu_err_t));
if (err && buffer) {
apr_dso_error(dso, buffer, ERROR_SIZE - 1);
err->msg = buffer;
err->reason = modname;
err->rc = rc;
*result = err;
}
}
#else /* not builtin and !APR_HAS_DSO => not implemented */
rv = APR_ENOTIMPL;
#endif
return rv;
}
/**
* @brief Return the name of the driver.
*
* @param driver - The driver in use.
* @return The name of the driver.
*/
APU_DECLARE(const char *)apr_crypto_driver_name (
const apr_crypto_driver_t *driver)
{
return driver->name;
}
/**
* @brief Get the result of the last operation on a context. If the result
* is NULL, the operation was successful.
* @param result - the result structure
* @param f - context pointer
* @return APR_SUCCESS for success
*/
APU_DECLARE(apr_status_t) apr_crypto_error(const apu_err_t **result,
const apr_crypto_t *f)
{
return f->provider->error(result, f);
}
/**
* @brief Create a context for supporting encryption. Keys, certificates,
* algorithms and other parameters will be set per context. More than
* one context can be created at one time. A cleanup will be automatically
* registered with the given pool to guarantee a graceful shutdown.
* @param f - context pointer will be written here
* @param driver - driver to use
* @param params - array of key parameters
* @param pool - process pool
* @return APR_ENOENGINE when the engine specified does not exist. APR_EINITENGINE
* if the engine cannot be initialised.
* @remarks NSS: currently no params are supported.
* @remarks OpenSSL: the params can have "engine" as a key, followed by an equal
* sign and a value.
*/
APU_DECLARE(apr_status_t) apr_crypto_make(apr_crypto_t **f,
const apr_crypto_driver_t *driver, const char *params, apr_pool_t *pool)
{
return driver->make(f, driver, params, pool);
}
/**
* @brief Get a hash table of key types, keyed by the name of the type against
* an integer pointer constant.
*
* @param types - hashtable of key types keyed to constants.
* @param f - encryption context
* @return APR_SUCCESS for success
*/
APU_DECLARE(apr_status_t) apr_crypto_get_block_key_types(apr_hash_t **types,
const apr_crypto_t *f)
{
return f->provider->get_block_key_types(types, f);
}
/**
* @brief Get a hash table of key modes, keyed by the name of the mode against
* an integer pointer constant.
*
* @param modes - hashtable of key modes keyed to constants.
* @param f - encryption context
* @return APR_SUCCESS for success
*/
APU_DECLARE(apr_status_t) apr_crypto_get_block_key_modes(apr_hash_t **modes,
const apr_crypto_t *f)
{
return f->provider->get_block_key_modes(modes, f);
}
/**
* @brief Create a key from the given passphrase. By default, the PBKDF2
* algorithm is used to generate the key from the passphrase. It is expected
* that the same pass phrase will generate the same key, regardless of the
* backend crypto platform used. The key is cleaned up when the context
* is cleaned, and may be reused with multiple encryption or decryption
* operations.
* @note If *key is NULL, a apr_crypto_key_t will be created from a pool. If
* *key is not NULL, *key must point at a previously created structure.
* @param key The key returned, see note.
* @param ivSize The size of the initialisation vector will be returned, based
* on whether an IV is relevant for this type of crypto.
* @param pass The passphrase to use.
* @param passLen The passphrase length in bytes
* @param salt The salt to use.
* @param saltLen The salt length in bytes
* @param type 3DES_192, AES_128, AES_192, AES_256.
* @param mode Electronic Code Book / Cipher Block Chaining.
* @param doPad Pad if necessary.
* @param iterations Number of iterations to use in algorithm
* @param f The context to use.
* @param p The pool to use.
* @return Returns APR_ENOKEY if the pass phrase is missing or empty, or if a backend
* error occurred while generating the key. APR_ENOCIPHER if the type or mode
* is not supported by the particular backend. APR_EKEYTYPE if the key type is
* not known. APR_EPADDING if padding was requested but is not supported.
* APR_ENOTIMPL if not implemented.
*/
APU_DECLARE(apr_status_t) apr_crypto_passphrase(apr_crypto_key_t **key,
apr_size_t *ivSize, const char *pass, apr_size_t passLen,
const unsigned char * salt, apr_size_t saltLen,
const apr_crypto_block_key_type_e type,
const apr_crypto_block_key_mode_e mode, const int doPad,
const int iterations, const apr_crypto_t *f, apr_pool_t *p)
{
return f->provider->passphrase(key, ivSize, pass, passLen, salt, saltLen,
type, mode, doPad, iterations, f, p);
}
/**
* @brief Initialise a context for encrypting arbitrary data using the given key.
* @note If *ctx is NULL, a apr_crypto_block_t will be created from a pool. If
* *ctx is not NULL, *ctx must point at a previously created structure.
* @param ctx The block context returned, see note.
* @param iv Optional initialisation vector. If the buffer pointed to is NULL,
* an IV will be created at random, in space allocated from the pool.
* If the buffer pointed to is not NULL, the IV in the buffer will be
* used.
* @param key The key structure to use.
* @param blockSize The block size of the cipher.
* @param p The pool to use.
* @return Returns APR_ENOIV if an initialisation vector is required but not specified.
* Returns APR_EINIT if the backend failed to initialise the context. Returns
* APR_ENOTIMPL if not implemented.
*/
APU_DECLARE(apr_status_t) apr_crypto_block_encrypt_init(
apr_crypto_block_t **ctx, const unsigned char **iv,
const apr_crypto_key_t *key, apr_size_t *blockSize, apr_pool_t *p)
{
return key->provider->block_encrypt_init(ctx, iv, key, blockSize, p);
}
/**
* @brief Encrypt data provided by in, write it to out.
* @note The number of bytes written will be written to outlen. If
* out is NULL, outlen will contain the maximum size of the
* buffer needed to hold the data, including any data
* generated by apr_crypto_block_encrypt_finish below. If *out points
* to NULL, a buffer sufficiently large will be created from
* the pool provided. If *out points to a not-NULL value, this
* value will be used as a buffer instead.
* @param out Address of a buffer to which data will be written,
* see note.
* @param outlen Length of the output will be written here.
* @param in Address of the buffer to read.
* @param inlen Length of the buffer to read.
* @param ctx The block context to use.
* @return APR_ECRYPT if an error occurred. Returns APR_ENOTIMPL if
* not implemented.
*/
APU_DECLARE(apr_status_t) apr_crypto_block_encrypt(unsigned char **out,
apr_size_t *outlen, const unsigned char *in, apr_size_t inlen,
apr_crypto_block_t *ctx)
{
return ctx->provider->block_encrypt(out, outlen, in, inlen, ctx);
}
/**
* @brief Encrypt final data block, write it to out.
* @note If necessary the final block will be written out after being
* padded. Typically the final block will be written to the
* same buffer used by apr_crypto_block_encrypt, offset by the
* number of bytes returned as actually written by the
* apr_crypto_block_encrypt() call. After this call, the context
* is cleaned and can be reused by apr_crypto_block_encrypt_init().
* @param out Address of a buffer to which data will be written. This
* buffer must already exist, and is usually the same
* buffer used by apr_evp_crypt(). See note.
* @param outlen Length of the output will be written here.
* @param ctx The block context to use.
* @return APR_ECRYPT if an error occurred.
* @return APR_EPADDING if padding was enabled and the block was incorrectly
* formatted.
* @return APR_ENOTIMPL if not implemented.
*/
APU_DECLARE(apr_status_t) apr_crypto_block_encrypt_finish(unsigned char *out,
apr_size_t *outlen, apr_crypto_block_t *ctx)
{
return ctx->provider->block_encrypt_finish(out, outlen, ctx);
}
/**
* @brief Initialise a context for decrypting arbitrary data using the given key.
* @note If *ctx is NULL, a apr_crypto_block_t will be created from a pool. If
* *ctx is not NULL, *ctx must point at a previously created structure.
* @param ctx The block context returned, see note.
* @param blockSize The block size of the cipher.
* @param iv Optional initialisation vector.
* @param key The key structure to use.
* @param p The pool to use.
* @return Returns APR_ENOIV if an initialisation vector is required but not specified.
* Returns APR_EINIT if the backend failed to initialise the context. Returns
* APR_ENOTIMPL if not implemented.
*/
APU_DECLARE(apr_status_t) apr_crypto_block_decrypt_init(
apr_crypto_block_t **ctx, apr_size_t *blockSize,
const unsigned char *iv, const apr_crypto_key_t *key, apr_pool_t *p)
{
return key->provider->block_decrypt_init(ctx, blockSize, iv, key, p);
}
/**
* @brief Decrypt data provided by in, write it to out.
* @note The number of bytes written will be written to outlen. If
* out is NULL, outlen will contain the maximum size of the
* buffer needed to hold the data, including any data
* generated by apr_crypto_block_decrypt_finish below. If *out points
* to NULL, a buffer sufficiently large will be created from
* the pool provided. If *out points to a not-NULL value, this
* value will be used as a buffer instead.
* @param out Address of a buffer to which data will be written,
* see note.
* @param outlen Length of the output will be written here.
* @param in Address of the buffer to read.
* @param inlen Length of the buffer to read.
* @param ctx The block context to use.
* @return APR_ECRYPT if an error occurred. Returns APR_ENOTIMPL if
* not implemented.
*/
APU_DECLARE(apr_status_t) apr_crypto_block_decrypt(unsigned char **out,
apr_size_t *outlen, const unsigned char *in, apr_size_t inlen,
apr_crypto_block_t *ctx)
{
return ctx->provider->block_decrypt(out, outlen, in, inlen, ctx);
}
/**
* @brief Decrypt final data block, write it to out.
* @note If necessary the final block will be written out after being
* padded. Typically the final block will be written to the
* same buffer used by apr_crypto_block_decrypt, offset by the
* number of bytes returned as actually written by the
* apr_crypto_block_decrypt() call. After this call, the context
* is cleaned and can be reused by apr_crypto_block_decrypt_init().
* @param out Address of a buffer to which data will be written. This
* buffer must already exist, and is usually the same
* buffer used by apr_evp_crypt(). See note.
* @param outlen Length of the output will be written here.
* @param ctx The block context to use.
* @return APR_ECRYPT if an error occurred.
* @return APR_EPADDING if padding was enabled and the block was incorrectly
* formatted.
* @return APR_ENOTIMPL if not implemented.
*/
APU_DECLARE(apr_status_t) apr_crypto_block_decrypt_finish(unsigned char *out,
apr_size_t *outlen, apr_crypto_block_t *ctx)
{
return ctx->provider->block_decrypt_finish(out, outlen, ctx);
}
/**
* @brief Clean encryption / decryption context.
* @note After cleanup, a context is free to be reused if necessary.
* @param ctx The block context to use.
* @return Returns APR_ENOTIMPL if not supported.
*/
APU_DECLARE(apr_status_t) apr_crypto_block_cleanup(apr_crypto_block_t *ctx)
{
return ctx->provider->block_cleanup(ctx);
}
/**
* @brief Clean encryption / decryption context.
* @note After cleanup, a context is free to be reused if necessary.
* @param f The context to use.
* @return Returns APR_ENOTIMPL if not supported.
*/
APU_DECLARE(apr_status_t) apr_crypto_cleanup(apr_crypto_t *f)
{
return f->provider->cleanup(f);
}
/**
* @brief Shutdown the crypto library.
* @note After shutdown, it is expected that the init function can be called again.
* @param driver - driver to use
* @return Returns APR_ENOTIMPL if not supported.
*/
APU_DECLARE(apr_status_t) apr_crypto_shutdown(const apr_crypto_driver_t *driver)
{
return driver->shutdown();
}
#endif /* APU_HAVE_CRYPTO */

865
crypto/apr_crypto_nss.c Normal file
View File

@ -0,0 +1,865 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr_lib.h"
#include "apu.h"
#include "apu_config.h"
#include "apu_errno.h"
#include <ctype.h>
#include <stdlib.h>
#include "apr_strings.h"
#include "apr_time.h"
#include "apr_buckets.h"
#include "apr_crypto_internal.h"
#if APU_HAVE_CRYPTO
#include <prerror.h>
#ifdef HAVE_NSS_NSS_H
#include <nss/nss.h>
#endif
#ifdef HAVE_NSS_H
#include <nss.h>
#endif
#ifdef HAVE_NSS_PK11PUB_H
#include <nss/pk11pub.h>
#endif
#ifdef HAVE_PK11PUB_H
#include <pk11pub.h>
#endif
struct apr_crypto_t {
apr_pool_t *pool;
const apr_crypto_driver_t *provider;
apu_err_t *result;
apr_array_header_t *keys;
apr_crypto_config_t *config;
apr_hash_t *types;
apr_hash_t *modes;
};
struct apr_crypto_config_t {
void *opaque;
};
struct apr_crypto_key_t {
apr_pool_t *pool;
const apr_crypto_driver_t *provider;
const apr_crypto_t *f;
CK_MECHANISM_TYPE cipherMech;
SECOidTag cipherOid;
PK11SymKey *symKey;
int ivSize;
};
struct apr_crypto_block_t {
apr_pool_t *pool;
const apr_crypto_driver_t *provider;
const apr_crypto_t *f;
PK11Context *ctx;
apr_crypto_key_t *key;
int blockSize;
};
static int key_3des_192 = APR_KEY_3DES_192;
static int key_aes_128 = APR_KEY_AES_128;
static int key_aes_192 = APR_KEY_AES_192;
static int key_aes_256 = APR_KEY_AES_256;
static int mode_ecb = APR_MODE_ECB;
static int mode_cbc = APR_MODE_CBC;
/**
* Fetch the most recent error from this driver.
*/
static apr_status_t crypto_error(const apu_err_t **result,
const apr_crypto_t *f)
{
*result = f->result;
return APR_SUCCESS;
}
/**
* Shutdown the crypto library and release resources.
*
* It is safe to shut down twice.
*/
static apr_status_t crypto_shutdown(void)
{
if (NSS_IsInitialized()) {
SECStatus s = NSS_Shutdown();
if (s != SECSuccess) {
return APR_EINIT;
}
}
return APR_SUCCESS;
}
static apr_status_t crypto_shutdown_helper(void *data)
{
return crypto_shutdown();
}
/**
* Initialise the crypto library and perform one time initialisation.
*/
static apr_status_t crypto_init(apr_pool_t *pool, const char *params, int *rc)
{
SECStatus s;
const char *dir = NULL;
const char *keyPrefix = NULL;
const char *certPrefix = NULL;
const char *secmod = NULL;
int noinit = 0;
PRUint32 flags = 0;
struct {
const char *field;
const char *value;
int set;
} fields[] = {
{ "dir", NULL, 0 },
{ "key3", NULL, 0 },
{ "cert7", NULL, 0 },
{ "secmod", NULL, 0 },
{ "noinit", NULL, 0 },
{ NULL, NULL, 0 }
};
const char *ptr;
size_t klen;
char **elts = NULL;
char *elt;
int i = 0, j;
apr_status_t status;
if (params) {
if (APR_SUCCESS != (status = apr_tokenize_to_argv(params, &elts, pool))) {
return status;
}
while ((elt = elts[i])) {
ptr = strchr(elt, '=');
if (ptr) {
for (klen = ptr - elt; klen && apr_isspace(elt[klen - 1]); --klen)
;
ptr++;
}
else {
for (klen = strlen(elt); klen && apr_isspace(elt[klen - 1]); --klen)
;
}
elt[klen] = 0;
for (j = 0; fields[j].field != NULL; ++j) {
if (klen && !strcasecmp(fields[j].field, elt)) {
fields[j].set = 1;
if (ptr) {
fields[j].value = ptr;
}
break;
}
}
i++;
}
dir = fields[0].value;
keyPrefix = fields[1].value;
certPrefix = fields[2].value;
secmod = fields[3].value;
noinit = fields[4].set;
}
/* if we've been asked to bypass, do so here */
if (noinit) {
return APR_SUCCESS;
}
/* sanity check - we can only initialise NSS once */
if (NSS_IsInitialized()) {
return APR_EREINIT;
}
apr_pool_cleanup_register(pool, pool, crypto_shutdown_helper,
apr_pool_cleanup_null);
if (keyPrefix || certPrefix || secmod) {
s = NSS_Initialize(dir, certPrefix, keyPrefix, secmod, flags);
}
else if (dir) {
s = NSS_InitReadWrite(dir);
}
else {
s = NSS_NoDB_Init(NULL);
}
if (s != SECSuccess) {
if (rc) {
*rc = PR_GetError();
}
return APR_ECRYPT;
}
return APR_SUCCESS;
}
/**
* @brief Clean encryption / decryption context.
* @note After cleanup, a context is free to be reused if necessary.
* @param f The context to use.
* @return Returns APR_ENOTIMPL if not supported.
*/
static apr_status_t crypto_block_cleanup(apr_crypto_block_t *block)
{
if (block->ctx) {
PK11_DestroyContext(block->ctx, PR_TRUE);
block->ctx = NULL;
}
return APR_SUCCESS;
}
static apr_status_t crypto_block_cleanup_helper(void *data)
{
apr_crypto_block_t *block = (apr_crypto_block_t *) data;
return crypto_block_cleanup(block);
}
/**
* @brief Clean encryption / decryption context.
* @note After cleanup, a context is free to be reused if necessary.
* @param f The context to use.
* @return Returns APR_ENOTIMPL if not supported.
*/
static apr_status_t crypto_cleanup(apr_crypto_t *f)
{
apr_crypto_key_t *key;
if (f->keys) {
while ((key = apr_array_pop(f->keys))) {
if (key->symKey) {
PK11_FreeSymKey(key->symKey);
key->symKey = NULL;
}
}
}
return APR_SUCCESS;
}
static apr_status_t crypto_cleanup_helper(void *data)
{
apr_crypto_t *f = (apr_crypto_t *) data;
return crypto_cleanup(f);
}
/**
* @brief Create a context for supporting encryption. Keys, certificates,
* algorithms and other parameters will be set per context. More than
* one context can be created at one time. A cleanup will be automatically
* registered with the given pool to guarantee a graceful shutdown.
* @param f - context pointer will be written here
* @param provider - provider to use
* @param params - parameter string
* @param pool - process pool
* @return APR_ENOENGINE when the engine specified does not exist. APR_EINITENGINE
* if the engine cannot be initialised.
*/
static apr_status_t crypto_make(apr_crypto_t **ff,
const apr_crypto_driver_t *provider, const char *params,
apr_pool_t *pool)
{
apr_crypto_config_t *config = NULL;
apr_crypto_t *f;
f = apr_pcalloc(pool, sizeof(apr_crypto_t));
if (!f) {
return APR_ENOMEM;
}
*ff = f;
f->pool = pool;
f->provider = provider;
config = f->config = apr_pcalloc(pool, sizeof(apr_crypto_config_t));
if (!config) {
return APR_ENOMEM;
}
f->result = apr_pcalloc(pool, sizeof(apu_err_t));
if (!f->result) {
return APR_ENOMEM;
}
f->keys = apr_array_make(pool, 10, sizeof(apr_crypto_key_t));
f->types = apr_hash_make(pool);
if (!f->types) {
return APR_ENOMEM;
}
apr_hash_set(f->types, "3des192", APR_HASH_KEY_STRING, &(key_3des_192));
apr_hash_set(f->types, "aes128", APR_HASH_KEY_STRING, &(key_aes_128));
apr_hash_set(f->types, "aes192", APR_HASH_KEY_STRING, &(key_aes_192));
apr_hash_set(f->types, "aes256", APR_HASH_KEY_STRING, &(key_aes_256));
f->modes = apr_hash_make(pool);
if (!f->modes) {
return APR_ENOMEM;
}
apr_hash_set(f->modes, "ecb", APR_HASH_KEY_STRING, &(mode_ecb));
apr_hash_set(f->modes, "cbc", APR_HASH_KEY_STRING, &(mode_cbc));
apr_pool_cleanup_register(pool, f, crypto_cleanup_helper,
apr_pool_cleanup_null);
return APR_SUCCESS;
}
/**
* @brief Get a hash table of key types, keyed by the name of the type against
* an integer pointer constant.
*
* @param types - hashtable of key types keyed to constants.
* @param f - encryption context
* @return APR_SUCCESS for success
*/
static apr_status_t crypto_get_block_key_types(apr_hash_t **types,
const apr_crypto_t *f)
{
*types = f->types;
return APR_SUCCESS;
}
/**
* @brief Get a hash table of key modes, keyed by the name of the mode against
* an integer pointer constant.
*
* @param modes - hashtable of key modes keyed to constants.
* @param f - encryption context
* @return APR_SUCCESS for success
*/
static apr_status_t crypto_get_block_key_modes(apr_hash_t **modes,
const apr_crypto_t *f)
{
*modes = f->modes;
return APR_SUCCESS;
}
/**
* @brief Create a key from the given passphrase. By default, the PBKDF2
* algorithm is used to generate the key from the passphrase. It is expected
* that the same pass phrase will generate the same key, regardless of the
* backend crypto platform used. The key is cleaned up when the context
* is cleaned, and may be reused with multiple encryption or decryption
* operations.
* @note If *key is NULL, a apr_crypto_key_t will be created from a pool. If
* *key is not NULL, *key must point at a previously created structure.
* @param key The key returned, see note.
* @param ivSize The size of the initialisation vector will be returned, based
* on whether an IV is relevant for this type of crypto.
* @param pass The passphrase to use.
* @param passLen The passphrase length in bytes
* @param salt The salt to use.
* @param saltLen The salt length in bytes
* @param type 3DES_192, AES_128, AES_192, AES_256.
* @param mode Electronic Code Book / Cipher Block Chaining.
* @param doPad Pad if necessary.
* @param iterations Iteration count
* @param f The context to use.
* @param p The pool to use.
* @return Returns APR_ENOKEY if the pass phrase is missing or empty, or if a backend
* error occurred while generating the key. APR_ENOCIPHER if the type or mode
* is not supported by the particular backend. APR_EKEYTYPE if the key type is
* not known. APR_EPADDING if padding was requested but is not supported.
* APR_ENOTIMPL if not implemented.
*/
static apr_status_t crypto_passphrase(apr_crypto_key_t **k, apr_size_t *ivSize,
const char *pass, apr_size_t passLen, const unsigned char * salt,
apr_size_t saltLen, const apr_crypto_block_key_type_e type,
const apr_crypto_block_key_mode_e mode, const int doPad,
const int iterations, const apr_crypto_t *f, apr_pool_t *p)
{
apr_status_t rv = APR_SUCCESS;
PK11SlotInfo * slot;
SECItem passItem;
SECItem saltItem;
SECAlgorithmID *algid;
void *wincx = NULL; /* what is wincx? */
apr_crypto_key_t *key = *k;
if (!key) {
*k = key = apr_array_push(f->keys);
}
if (!key) {
return APR_ENOMEM;
}
key->f = f;
key->provider = f->provider;
/* decide on what cipher mechanism we will be using */
switch (type) {
case (APR_KEY_3DES_192):
if (APR_MODE_CBC == mode) {
key->cipherOid = SEC_OID_DES_EDE3_CBC;
}
else if (APR_MODE_ECB == mode) {
return APR_ENOCIPHER;
/* No OID for CKM_DES3_ECB; */
}
break;
case (APR_KEY_AES_128):
if (APR_MODE_CBC == mode) {
key->cipherOid = SEC_OID_AES_128_CBC;
}
else {
key->cipherOid = SEC_OID_AES_128_ECB;
}
break;
case (APR_KEY_AES_192):
if (APR_MODE_CBC == mode) {
key->cipherOid = SEC_OID_AES_192_CBC;
}
else {
key->cipherOid = SEC_OID_AES_192_ECB;
}
break;
case (APR_KEY_AES_256):
if (APR_MODE_CBC == mode) {
key->cipherOid = SEC_OID_AES_256_CBC;
}
else {
key->cipherOid = SEC_OID_AES_256_ECB;
}
break;
default:
/* unknown key type, give up */
return APR_EKEYTYPE;
}
/* AES_128_CBC --> CKM_AES_CBC --> CKM_AES_CBC_PAD */
key->cipherMech = PK11_AlgtagToMechanism(key->cipherOid);
if (key->cipherMech == CKM_INVALID_MECHANISM) {
return APR_ENOCIPHER;
}
if (doPad) {
CK_MECHANISM_TYPE paddedMech;
paddedMech = PK11_GetPadMechanism(key->cipherMech);
if (CKM_INVALID_MECHANISM == paddedMech || key->cipherMech
== paddedMech) {
return APR_EPADDING;
}
key->cipherMech = paddedMech;
}
/* Turn the raw passphrase and salt into SECItems */
passItem.data = (unsigned char*) pass;
passItem.len = passLen;
saltItem.data = (unsigned char*) salt;
saltItem.len = saltLen;
/* generate the key */
/* pbeAlg and cipherAlg are the same. NSS decides the keylength. */
algid = PK11_CreatePBEV2AlgorithmID(key->cipherOid, key->cipherOid,
SEC_OID_HMAC_SHA1, 0, iterations, &saltItem);
if (algid) {
slot = PK11_GetBestSlot(key->cipherMech, wincx);
if (slot) {
key->symKey = PK11_PBEKeyGen(slot, algid, &passItem, PR_FALSE,
wincx);
PK11_FreeSlot(slot);
}
SECOID_DestroyAlgorithmID(algid, PR_TRUE);
}
/* sanity check? */
if (!key->symKey) {
PRErrorCode perr = PORT_GetError();
if (perr) {
f->result->rc = perr;
f->result->msg = PR_ErrorToName(perr);
rv = APR_ENOKEY;
}
}
key->ivSize = PK11_GetIVLength(key->cipherMech);
if (ivSize) {
*ivSize = key->ivSize;
}
return rv;
}
/**
* @brief Initialise a context for encrypting arbitrary data using the given key.
* @note If *ctx is NULL, a apr_crypto_block_t will be created from a pool. If
* *ctx is not NULL, *ctx must point at a previously created structure.
* @param ctx The block context returned, see note.
* @param iv Optional initialisation vector. If the buffer pointed to is NULL,
* an IV will be created at random, in space allocated from the pool.
* If the buffer pointed to is not NULL, the IV in the buffer will be
* used.
* @param key The key structure.
* @param blockSize The block size of the cipher.
* @param p The pool to use.
* @return Returns APR_ENOIV if an initialisation vector is required but not specified.
* Returns APR_EINIT if the backend failed to initialise the context. Returns
* APR_ENOTIMPL if not implemented.
*/
static apr_status_t crypto_block_encrypt_init(apr_crypto_block_t **ctx,
const unsigned char **iv, const apr_crypto_key_t *key,
apr_size_t *blockSize, apr_pool_t *p)
{
PRErrorCode perr;
SECItem * secParam;
SECItem ivItem;
unsigned char * usedIv;
apr_crypto_block_t *block = *ctx;
if (!block) {
*ctx = block = apr_pcalloc(p, sizeof(apr_crypto_block_t));
}
if (!block) {
return APR_ENOMEM;
}
block->f = key->f;
block->pool = p;
block->provider = key->provider;
apr_pool_cleanup_register(p, block, crypto_block_cleanup_helper,
apr_pool_cleanup_null);
if (key->ivSize) {
if (iv == NULL) {
return APR_ENOIV;
}
if (*iv == NULL) {
SECStatus s;
usedIv = apr_pcalloc(p, key->ivSize);
if (!usedIv) {
return APR_ENOMEM;
}
apr_crypto_clear(p, usedIv, key->ivSize);
s = PK11_GenerateRandom(usedIv, key->ivSize);
if (s != SECSuccess) {
return APR_ENOIV;
}
*iv = usedIv;
}
else {
usedIv = (unsigned char *) *iv;
}
ivItem.data = usedIv;
ivItem.len = key->ivSize;
secParam = PK11_ParamFromIV(key->cipherMech, &ivItem);
}
else {
secParam = PK11_GenerateNewParam(key->cipherMech, key->symKey);
}
block->blockSize = PK11_GetBlockSize(key->cipherMech, secParam);
block->ctx = PK11_CreateContextBySymKey(key->cipherMech, CKA_ENCRYPT,
key->symKey, secParam);
/* did an error occur? */
perr = PORT_GetError();
if (perr || !block->ctx) {
key->f->result->rc = perr;
key->f->result->msg = PR_ErrorToName(perr);
return APR_EINIT;
}
if (blockSize) {
*blockSize = PK11_GetBlockSize(key->cipherMech, secParam);
}
return APR_SUCCESS;
}
/**
* @brief Encrypt data provided by in, write it to out.
* @note The number of bytes written will be written to outlen. If
* out is NULL, outlen will contain the maximum size of the
* buffer needed to hold the data, including any data
* generated by apr_crypto_block_encrypt_finish below. If *out points
* to NULL, a buffer sufficiently large will be created from
* the pool provided. If *out points to a not-NULL value, this
* value will be used as a buffer instead.
* @param out Address of a buffer to which data will be written,
* see note.
* @param outlen Length of the output will be written here.
* @param in Address of the buffer to read.
* @param inlen Length of the buffer to read.
* @param ctx The block context to use.
* @return APR_ECRYPT if an error occurred. Returns APR_ENOTIMPL if
* not implemented.
*/
static apr_status_t crypto_block_encrypt(unsigned char **out,
apr_size_t *outlen, const unsigned char *in, apr_size_t inlen,
apr_crypto_block_t *block)
{
unsigned char *buffer;
int outl = (int) *outlen;
SECStatus s;
if (!out) {
*outlen = inlen + block->blockSize;
return APR_SUCCESS;
}
if (!*out) {
buffer = apr_palloc(block->pool, inlen + block->blockSize);
if (!buffer) {
return APR_ENOMEM;
}
apr_crypto_clear(block->pool, buffer, inlen + block->blockSize);
*out = buffer;
}
s = PK11_CipherOp(block->ctx, *out, &outl, inlen, (unsigned char*) in,
inlen);
if (s != SECSuccess) {
PRErrorCode perr = PORT_GetError();
if (perr) {
block->f->result->rc = perr;
block->f->result->msg = PR_ErrorToName(perr);
}
return APR_ECRYPT;
}
*outlen = outl;
return APR_SUCCESS;
}
/**
* @brief Encrypt final data block, write it to out.
* @note If necessary the final block will be written out after being
* padded. Typically the final block will be written to the
* same buffer used by apr_crypto_block_encrypt, offset by the
* number of bytes returned as actually written by the
* apr_crypto_block_encrypt() call. After this call, the context
* is cleaned and can be reused by apr_crypto_block_encrypt_init().
* @param out Address of a buffer to which data will be written. This
* buffer must already exist, and is usually the same
* buffer used by apr_evp_crypt(). See note.
* @param outlen Length of the output will be written here.
* @param ctx The block context to use.
* @return APR_ECRYPT if an error occurred.
* @return APR_EPADDING if padding was enabled and the block was incorrectly
* formatted.
* @return APR_ENOTIMPL if not implemented.
*/
static apr_status_t crypto_block_encrypt_finish(unsigned char *out,
apr_size_t *outlen, apr_crypto_block_t *block)
{
apr_status_t rv = APR_SUCCESS;
unsigned int outl = *outlen;
SECStatus s = PK11_DigestFinal(block->ctx, out, &outl, block->blockSize);
*outlen = outl;
if (s != SECSuccess) {
PRErrorCode perr = PORT_GetError();
if (perr) {
block->f->result->rc = perr;
block->f->result->msg = PR_ErrorToName(perr);
}
rv = APR_ECRYPT;
}
crypto_block_cleanup(block);
return rv;
}
/**
* @brief Initialise a context for decrypting arbitrary data using the given key.
* @note If *ctx is NULL, a apr_crypto_block_t will be created from a pool. If
* *ctx is not NULL, *ctx must point at a previously created structure.
* @param ctx The block context returned, see note.
* @param blockSize The block size of the cipher.
* @param iv Optional initialisation vector. If the buffer pointed to is NULL,
* an IV will be created at random, in space allocated from the pool.
* If the buffer is not NULL, the IV in the buffer will be used.
* @param key The key structure.
* @param p The pool to use.
* @return Returns APR_ENOIV if an initialisation vector is required but not specified.
* Returns APR_EINIT if the backend failed to initialise the context. Returns
* APR_ENOTIMPL if not implemented.
*/
static apr_status_t crypto_block_decrypt_init(apr_crypto_block_t **ctx,
apr_size_t *blockSize, const unsigned char *iv,
const apr_crypto_key_t *key, apr_pool_t *p)
{
PRErrorCode perr;
SECItem * secParam;
apr_crypto_block_t *block = *ctx;
if (!block) {
*ctx = block = apr_pcalloc(p, sizeof(apr_crypto_block_t));
}
if (!block) {
return APR_ENOMEM;
}
block->f = key->f;
block->pool = p;
block->provider = key->provider;
apr_pool_cleanup_register(p, block, crypto_block_cleanup_helper,
apr_pool_cleanup_null);
if (key->ivSize) {
SECItem ivItem;
if (iv == NULL) {
return APR_ENOIV; /* Cannot initialise without an IV */
}
ivItem.data = (unsigned char*) iv;
ivItem.len = key->ivSize;
secParam = PK11_ParamFromIV(key->cipherMech, &ivItem);
}
else {
secParam = PK11_GenerateNewParam(key->cipherMech, key->symKey);
}
block->blockSize = PK11_GetBlockSize(key->cipherMech, secParam);
block->ctx = PK11_CreateContextBySymKey(key->cipherMech, CKA_DECRYPT,
key->symKey, secParam);
/* did an error occur? */
perr = PORT_GetError();
if (perr || !block->ctx) {
key->f->result->rc = perr;
key->f->result->msg = PR_ErrorToName(perr);
return APR_EINIT;
}
if (blockSize) {
*blockSize = PK11_GetBlockSize(key->cipherMech, secParam);
}
return APR_SUCCESS;
}
/**
* @brief Decrypt data provided by in, write it to out.
* @note The number of bytes written will be written to outlen. If
* out is NULL, outlen will contain the maximum size of the
* buffer needed to hold the data, including any data
* generated by apr_crypto_block_decrypt_finish below. If *out points
* to NULL, a buffer sufficiently large will be created from
* the pool provided. If *out points to a not-NULL value, this
* value will be used as a buffer instead.
* @param out Address of a buffer to which data will be written,
* see note.
* @param outlen Length of the output will be written here.
* @param in Address of the buffer to read.
* @param inlen Length of the buffer to read.
* @param ctx The block context to use.
* @return APR_ECRYPT if an error occurred. Returns APR_ENOTIMPL if
* not implemented.
*/
static apr_status_t crypto_block_decrypt(unsigned char **out,
apr_size_t *outlen, const unsigned char *in, apr_size_t inlen,
apr_crypto_block_t *block)
{
unsigned char *buffer;
int outl = (int) *outlen;
SECStatus s;
if (!out) {
*outlen = inlen + block->blockSize;
return APR_SUCCESS;
}
if (!*out) {
buffer = apr_palloc(block->pool, inlen + block->blockSize);
if (!buffer) {
return APR_ENOMEM;
}
apr_crypto_clear(block->pool, buffer, inlen + block->blockSize);
*out = buffer;
}
s = PK11_CipherOp(block->ctx, *out, &outl, inlen, (unsigned char*) in,
inlen);
if (s != SECSuccess) {
PRErrorCode perr = PORT_GetError();
if (perr) {
block->f->result->rc = perr;
block->f->result->msg = PR_ErrorToName(perr);
}
return APR_ECRYPT;
}
*outlen = outl;
return APR_SUCCESS;
}
/**
* @brief Decrypt final data block, write it to out.
* @note If necessary the final block will be written out after being
* padded. Typically the final block will be written to the
* same buffer used by apr_crypto_block_decrypt, offset by the
* number of bytes returned as actually written by the
* apr_crypto_block_decrypt() call. After this call, the context
* is cleaned and can be reused by apr_crypto_block_decrypt_init().
* @param out Address of a buffer to which data will be written. This
* buffer must already exist, and is usually the same
* buffer used by apr_evp_crypt(). See note.
* @param outlen Length of the output will be written here.
* @param ctx The block context to use.
* @return APR_ECRYPT if an error occurred.
* @return APR_EPADDING if padding was enabled and the block was incorrectly
* formatted.
* @return APR_ENOTIMPL if not implemented.
*/
static apr_status_t crypto_block_decrypt_finish(unsigned char *out,
apr_size_t *outlen, apr_crypto_block_t *block)
{
apr_status_t rv = APR_SUCCESS;
unsigned int outl = *outlen;
SECStatus s = PK11_DigestFinal(block->ctx, out, &outl, block->blockSize);
*outlen = outl;
if (s != SECSuccess) {
PRErrorCode perr = PORT_GetError();
if (perr) {
block->f->result->rc = perr;
block->f->result->msg = PR_ErrorToName(perr);
}
rv = APR_ECRYPT;
}
crypto_block_cleanup(block);
return rv;
}
/**
* NSS module.
*/
APU_MODULE_DECLARE_DATA const apr_crypto_driver_t apr_crypto_nss_driver = {
"nss", crypto_init, crypto_make, crypto_get_block_key_types,
crypto_get_block_key_modes, crypto_passphrase,
crypto_block_encrypt_init, crypto_block_encrypt,
crypto_block_encrypt_finish, crypto_block_decrypt_init,
crypto_block_decrypt, crypto_block_decrypt_finish,
crypto_block_cleanup, crypto_cleanup, crypto_shutdown, crypto_error
};
#endif

203
crypto/apr_crypto_nss.dsp Normal file
View File

@ -0,0 +1,203 @@
# Microsoft Developer Studio Project File - Name="apr_crypto_nss" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
CFG=apr_crypto_nss - Win32 Release
!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 "apr_crypto_nss.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 "apr_crypto_nss.mak" CFG="apr_crypto_nss - Win32 Release"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "apr_crypto_nss - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_crypto_nss - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_crypto_nss - x64 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_crypto_nss - x64 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe
!IF "$(CFG)" == "apr_crypto_nss - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
# ADD CPP /nologo /MD /W3 /Zi /O2 /Oy- /I "../include" /I "../../apr/include" /I "../include/private" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_NSS=1 /D HAVE_NSS_H=1 /D HAVE_PK11PUB_H=1 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_crypto_nss_src" /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /fo"Release/apr_crypto_nss-1.res" /d DLL_NAME="apr_crypto_nss" /d "NDEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib nss3.lib nspr4.lib /nologo /base:"0x6F110000" /subsystem:windows /dll /incremental:no /debug /opt:ref
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib nss3.lib nspr4.lib nspr4.lib /nologo /base:"0x6F110000" /subsystem:windows /dll /incremental:no /debug /out:"Release\apr_crypto_nss-1.dll" /pdb:"Release\apr_crypto_nss-1.pdb" /implib:"Release\apr_crypto_nss-1.lib" /MACHINE:X86 /opt:ref
# Begin Special Build Tool
TargetPath=Release\apr_crypto_nss-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_crypto_nss - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /EHsc /c
# ADD CPP /nologo /MDd /W3 /Zi /Od /I "../include" /I "../../apr/include" /I "../include/private" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_NSS=1 /D HAVE_NSS_H=1 /D HAVE_PK11PUB_H=1 /D /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_crypto_nss_src" /FD /EHsc /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /fo"Debug/apr_crypto_nss-1.res" /d DLL_NAME="apr_crypto_nss" /d "_DEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib nss3.lib nspr4.lib /nologo /base:"0x6F110000" /subsystem:windows /dll /incremental:no /debug
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib nss3.lib nspr4.lib /nologo /base:"0x6F110000" /subsystem:windows /dll /incremental:no /debug /out:"Debug\apr_crypto_nss-1.dll" /pdb:"Debug\apr_crypto_nss-1.pdb" /implib:"Debug\apr_crypto_nss-1.lib" /MACHINE:X86
# Begin Special Build Tool
TargetPath=Debug\apr_crypto_nss-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_crypto_nss - x64 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "x64\Release"
# PROP BASE Intermediate_Dir "x64\Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "x64\Release"
# PROP Intermediate_Dir "x64\Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
# ADD CPP /nologo /MD /W3 /Zi /O2 /Oy- /I "../include" /I "../../apr/include" /I "../include/private" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_NSS=1 /D HAVE_NSS_H=1 /D HAVE_PK11PUB_H=1 /D /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_crypto_nss_src" /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /fo"x64/Release/apr_crypto_nss-1.res" /d DLL_NAME="apr_crypto_nss" /d "NDEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib nss3.lib nspr4.lib /nologo /base:"0x6F110000" /subsystem:windows /dll /incremental:no /debug /opt:ref
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib nss3.lib nspr4.lib /nologo /base:"0x6F110000" /subsystem:windows /dll /incremental:no /debug /out:"x64\Release\apr_crypto_nss-1.dll" /pdb:"x64\Release\apr_crypto_nss-1.pdb" /implib:"x64\Release\apr_crypto_nss-1.lib" /MACHINE:X64 /opt:ref
# Begin Special Build Tool
TargetPath=x64\Release\apr_crypto_nss-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_crypto_nss - x64 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "x64\Debug"
# PROP BASE Intermediate_Dir "x64\Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "x64\Debug"
# PROP Intermediate_Dir "x64\Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /EHsc /c
# ADD CPP /nologo /MDd /W3 /Zi /Od /I "../include" /I "../../apr/include" /I "../include/private" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_NSS=1 /D HAVE_NSS_H=1 /D HAVE_PK11PUB_H=1 /D /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_crypto_nss_src" /FD /EHsc /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /fo"x64/Debug/apr_crypto_nss-1.res" /d DLL_NAME="apr_crypto_nss" /d "_DEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib nss3.lib nspr4.lib /nologo /base:"0x6F110000" /subsystem:windows /dll /incremental:no /debug
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib nss3.lib nspr4.lib /nologo /base:"0x6F110000" /subsystem:windows /dll /incremental:no /debug /out:"x64\Debug\apr_crypto_nss-1.dll" /pdb:"x64\Debug\apr_crypto_nss-1.pdb" /implib:"x64\Debug\apr_crypto_nss-1.lib" /MACHINE:X64
# Begin Special Build Tool
TargetPath=x64\Debug\apr_crypto_nss-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ENDIF
# Begin Target
# Name "apr_crypto_nss - Win32 Release"
# Name "apr_crypto_nss - Win32 Debug"
# Name "apr_crypto_nss - x64 Release"
# Name "apr_crypto_nss - x64 Debug"
# Begin Group "Source Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\apr_crypto_nss.c
# End Source File
# End Group
# Begin Group "Public Header Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=..\include\apr_crypto.h
# End Source File
# End Group
# Begin Group "Internal Header Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=..\include\private\apu_config.h
# End Source File
# Begin Source File
SOURCE=..\include\private\apu_internal.h
# End Source File
# End Group
# Begin Source File
SOURCE=..\libaprutil.rc
# End Source File
# End Target
# End Project

797
crypto/apr_crypto_openssl.c Normal file
View File

@ -0,0 +1,797 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr_lib.h"
#include "apu.h"
#include "apu_errno.h"
#include <ctype.h>
#include <assert.h>
#include <stdlib.h>
#include "apr_strings.h"
#include "apr_time.h"
#include "apr_buckets.h"
#include "apr_crypto_internal.h"
#if APU_HAVE_CRYPTO
#include <openssl/evp.h>
#include <openssl/engine.h>
#define LOG_PREFIX "apr_crypto_openssl: "
struct apr_crypto_t {
apr_pool_t *pool;
const apr_crypto_driver_t *provider;
apu_err_t *result;
apr_array_header_t *keys;
apr_crypto_config_t *config;
apr_hash_t *types;
apr_hash_t *modes;
};
struct apr_crypto_config_t {
ENGINE *engine;
};
struct apr_crypto_key_t {
apr_pool_t *pool;
const apr_crypto_driver_t *provider;
const apr_crypto_t *f;
const EVP_CIPHER * cipher;
unsigned char *key;
int keyLen;
int doPad;
int ivSize;
};
struct apr_crypto_block_t {
apr_pool_t *pool;
const apr_crypto_driver_t *provider;
const apr_crypto_t *f;
EVP_CIPHER_CTX cipherCtx;
int initialised;
int ivSize;
int blockSize;
int doPad;
};
static int key_3des_192 = APR_KEY_3DES_192;
static int key_aes_128 = APR_KEY_AES_128;
static int key_aes_192 = APR_KEY_AES_192;
static int key_aes_256 = APR_KEY_AES_256;
static int mode_ecb = APR_MODE_ECB;
static int mode_cbc = APR_MODE_CBC;
/**
* Fetch the most recent error from this driver.
*/
static apr_status_t crypto_error(const apu_err_t **result,
const apr_crypto_t *f)
{
*result = f->result;
return APR_SUCCESS;
}
/**
* Shutdown the crypto library and release resources.
*/
static apr_status_t crypto_shutdown(void)
{
ERR_free_strings();
EVP_cleanup();
ENGINE_cleanup();
return APR_SUCCESS;
}
static apr_status_t crypto_shutdown_helper(void *data)
{
return crypto_shutdown();
}
/**
* Initialise the crypto library and perform one time initialisation.
*/
static apr_status_t crypto_init(apr_pool_t *pool, const char *params, int *rc)
{
CRYPTO_malloc_init();
ERR_load_crypto_strings();
/* SSL_load_error_strings(); */
OpenSSL_add_all_algorithms();
ENGINE_load_builtin_engines();
ENGINE_register_all_complete();
apr_pool_cleanup_register(pool, pool, crypto_shutdown_helper,
apr_pool_cleanup_null);
return APR_SUCCESS;
}
/**
* @brief Clean encryption / decryption context.
* @note After cleanup, a context is free to be reused if necessary.
* @param ctx The block context to use.
* @return Returns APR_ENOTIMPL if not supported.
*/
static apr_status_t crypto_block_cleanup(apr_crypto_block_t *ctx)
{
if (ctx->initialised) {
EVP_CIPHER_CTX_cleanup(&ctx->cipherCtx);
ctx->initialised = 0;
}
return APR_SUCCESS;
}
static apr_status_t crypto_block_cleanup_helper(void *data)
{
apr_crypto_block_t *block = (apr_crypto_block_t *) data;
return crypto_block_cleanup(block);
}
/**
* @brief Clean encryption / decryption context.
* @note After cleanup, a context is free to be reused if necessary.
* @param f The context to use.
* @return Returns APR_ENOTIMPL if not supported.
*/
static apr_status_t crypto_cleanup(apr_crypto_t *f)
{
if (f->config->engine) {
ENGINE_finish(f->config->engine);
ENGINE_free(f->config->engine);
f->config->engine = NULL;
}
return APR_SUCCESS;
}
static apr_status_t crypto_cleanup_helper(void *data)
{
apr_crypto_t *f = (apr_crypto_t *) data;
return crypto_cleanup(f);
}
/**
* @brief Create a context for supporting encryption. Keys, certificates,
* algorithms and other parameters will be set per context. More than
* one context can be created at one time. A cleanup will be automatically
* registered with the given pool to guarantee a graceful shutdown.
* @param f - context pointer will be written here
* @param provider - provider to use
* @param params - array of key parameters
* @param pool - process pool
* @return APR_ENOENGINE when the engine specified does not exist. APR_EINITENGINE
* if the engine cannot be initialised.
*/
static apr_status_t crypto_make(apr_crypto_t **ff,
const apr_crypto_driver_t *provider, const char *params,
apr_pool_t *pool)
{
apr_crypto_config_t *config = NULL;
apr_crypto_t *f = apr_pcalloc(pool, sizeof(apr_crypto_t));
const char *engine = NULL;
struct {
const char *field;
const char *value;
int set;
} fields[] = {
{ "engine", NULL, 0 },
{ NULL, NULL, 0 }
};
const char *ptr;
size_t klen;
char **elts = NULL;
char *elt;
int i = 0, j;
apr_status_t status;
if (params) {
if (APR_SUCCESS != (status = apr_tokenize_to_argv(params, &elts, pool))) {
return status;
}
while ((elt = elts[i])) {
ptr = strchr(elt, '=');
if (ptr) {
for (klen = ptr - elt; klen && apr_isspace(elt[klen - 1]); --klen)
;
ptr++;
}
else {
for (klen = strlen(elt); klen && apr_isspace(elt[klen - 1]); --klen)
;
}
elt[klen] = 0;
for (j = 0; fields[j].field != NULL; ++j) {
if (!strcasecmp(fields[j].field, elt)) {
fields[j].set = 1;
if (ptr) {
fields[j].value = ptr;
}
break;
}
}
i++;
}
engine = fields[0].value;
}
if (!f) {
return APR_ENOMEM;
}
*ff = f;
f->pool = pool;
f->provider = provider;
config = f->config = apr_pcalloc(pool, sizeof(apr_crypto_config_t));
if (!config) {
return APR_ENOMEM;
}
f->result = apr_pcalloc(pool, sizeof(apu_err_t));
if (!f->result) {
return APR_ENOMEM;
}
f->keys = apr_array_make(pool, 10, sizeof(apr_crypto_key_t));
if (!f->keys) {
return APR_ENOMEM;
}
f->types = apr_hash_make(pool);
if (!f->types) {
return APR_ENOMEM;
}
apr_hash_set(f->types, "3des192", APR_HASH_KEY_STRING, &(key_3des_192));
apr_hash_set(f->types, "aes128", APR_HASH_KEY_STRING, &(key_aes_128));
apr_hash_set(f->types, "aes192", APR_HASH_KEY_STRING, &(key_aes_192));
apr_hash_set(f->types, "aes256", APR_HASH_KEY_STRING, &(key_aes_256));
f->modes = apr_hash_make(pool);
if (!f->modes) {
return APR_ENOMEM;
}
apr_hash_set(f->modes, "ecb", APR_HASH_KEY_STRING, &(mode_ecb));
apr_hash_set(f->modes, "cbc", APR_HASH_KEY_STRING, &(mode_cbc));
apr_pool_cleanup_register(pool, f, crypto_cleanup_helper,
apr_pool_cleanup_null);
if (engine) {
config->engine = ENGINE_by_id(engine);
if (!config->engine) {
return APR_ENOENGINE;
}
if (!ENGINE_init(config->engine)) {
ENGINE_free(config->engine);
config->engine = NULL;
return APR_EINITENGINE;
}
}
return APR_SUCCESS;
}
/**
* @brief Get a hash table of key types, keyed by the name of the type against
* an integer pointer constant.
*
* @param types - hashtable of key types keyed to constants.
* @param f - encryption context
* @return APR_SUCCESS for success
*/
static apr_status_t crypto_get_block_key_types(apr_hash_t **types,
const apr_crypto_t *f)
{
*types = f->types;
return APR_SUCCESS;
}
/**
* @brief Get a hash table of key modes, keyed by the name of the mode against
* an integer pointer constant.
*
* @param modes - hashtable of key modes keyed to constants.
* @param f - encryption context
* @return APR_SUCCESS for success
*/
static apr_status_t crypto_get_block_key_modes(apr_hash_t **modes,
const apr_crypto_t *f)
{
*modes = f->modes;
return APR_SUCCESS;
}
/**
* @brief Create a key from the given passphrase. By default, the PBKDF2
* algorithm is used to generate the key from the passphrase. It is expected
* that the same pass phrase will generate the same key, regardless of the
* backend crypto platform used. The key is cleaned up when the context
* is cleaned, and may be reused with multiple encryption or decryption
* operations.
* @note If *key is NULL, a apr_crypto_key_t will be created from a pool. If
* *key is not NULL, *key must point at a previously created structure.
* @param key The key returned, see note.
* @param ivSize The size of the initialisation vector will be returned, based
* on whether an IV is relevant for this type of crypto.
* @param pass The passphrase to use.
* @param passLen The passphrase length in bytes
* @param salt The salt to use.
* @param saltLen The salt length in bytes
* @param type 3DES_192, AES_128, AES_192, AES_256.
* @param mode Electronic Code Book / Cipher Block Chaining.
* @param doPad Pad if necessary.
* @param iterations Iteration count
* @param f The context to use.
* @param p The pool to use.
* @return Returns APR_ENOKEY if the pass phrase is missing or empty, or if a backend
* error occurred while generating the key. APR_ENOCIPHER if the type or mode
* is not supported by the particular backend. APR_EKEYTYPE if the key type is
* not known. APR_EPADDING if padding was requested but is not supported.
* APR_ENOTIMPL if not implemented.
*/
static apr_status_t crypto_passphrase(apr_crypto_key_t **k, apr_size_t *ivSize,
const char *pass, apr_size_t passLen, const unsigned char * salt,
apr_size_t saltLen, const apr_crypto_block_key_type_e type,
const apr_crypto_block_key_mode_e mode, const int doPad,
const int iterations, const apr_crypto_t *f, apr_pool_t *p)
{
apr_crypto_key_t *key = *k;
if (!key) {
*k = key = apr_array_push(f->keys);
}
if (!key) {
return APR_ENOMEM;
}
key->f = f;
key->provider = f->provider;
/* determine the cipher to be used */
switch (type) {
case (APR_KEY_3DES_192):
/* A 3DES key */
if (mode == APR_MODE_CBC) {
key->cipher = EVP_des_ede3_cbc();
}
else {
key->cipher = EVP_des_ede3_ecb();
}
break;
case (APR_KEY_AES_128):
if (mode == APR_MODE_CBC) {
key->cipher = EVP_aes_128_cbc();
}
else {
key->cipher = EVP_aes_128_ecb();
}
break;
case (APR_KEY_AES_192):
if (mode == APR_MODE_CBC) {
key->cipher = EVP_aes_192_cbc();
}
else {
key->cipher = EVP_aes_192_ecb();
}
break;
case (APR_KEY_AES_256):
if (mode == APR_MODE_CBC) {
key->cipher = EVP_aes_256_cbc();
}
else {
key->cipher = EVP_aes_256_ecb();
}
break;
default:
/* unknown key type, give up */
return APR_EKEYTYPE;
}
/* find the length of the key we need */
key->keyLen = EVP_CIPHER_key_length(key->cipher);
/* make space for the key */
key->key = apr_pcalloc(p, key->keyLen);
if (!key->key) {
return APR_ENOMEM;
}
apr_crypto_clear(p, key->key, key->keyLen);
/* generate the key */
if (PKCS5_PBKDF2_HMAC_SHA1(pass, passLen, (unsigned char *) salt, saltLen,
iterations, key->keyLen, key->key) == 0) {
return APR_ENOKEY;
}
key->doPad = doPad;
/* note: openssl incorrectly returns non zero IV size values for ECB
* algorithms, so work around this by ignoring the IV size.
*/
if (APR_MODE_ECB != mode) {
key->ivSize = EVP_CIPHER_iv_length(key->cipher);
}
if (ivSize) {
*ivSize = key->ivSize;
}
return APR_SUCCESS;
}
/**
* @brief Initialise a context for encrypting arbitrary data using the given key.
* @note If *ctx is NULL, a apr_crypto_block_t will be created from a pool. If
* *ctx is not NULL, *ctx must point at a previously created structure.
* @param ctx The block context returned, see note.
* @param iv Optional initialisation vector. If the buffer pointed to is NULL,
* an IV will be created at random, in space allocated from the pool.
* If the buffer pointed to is not NULL, the IV in the buffer will be
* used.
* @param key The key structure.
* @param blockSize The block size of the cipher.
* @param p The pool to use.
* @return Returns APR_ENOIV if an initialisation vector is required but not specified.
* Returns APR_EINIT if the backend failed to initialise the context. Returns
* APR_ENOTIMPL if not implemented.
*/
static apr_status_t crypto_block_encrypt_init(apr_crypto_block_t **ctx,
const unsigned char **iv, const apr_crypto_key_t *key,
apr_size_t *blockSize, apr_pool_t *p)
{
unsigned char *usedIv;
apr_crypto_config_t *config = key->f->config;
apr_crypto_block_t *block = *ctx;
if (!block) {
*ctx = block = apr_pcalloc(p, sizeof(apr_crypto_block_t));
}
if (!block) {
return APR_ENOMEM;
}
block->f = key->f;
block->pool = p;
block->provider = key->provider;
apr_pool_cleanup_register(p, block, crypto_block_cleanup_helper,
apr_pool_cleanup_null);
/* create a new context for encryption */
EVP_CIPHER_CTX_init(&block->cipherCtx);
block->initialised = 1;
/* generate an IV, if necessary */
usedIv = NULL;
if (key->ivSize) {
if (iv == NULL) {
return APR_ENOIV;
}
if (*iv == NULL) {
usedIv = apr_pcalloc(p, key->ivSize);
if (!usedIv) {
return APR_ENOMEM;
}
apr_crypto_clear(p, usedIv, key->ivSize);
if (!((RAND_status() == 1)
&& (RAND_bytes(usedIv, key->ivSize) == 1))) {
return APR_ENOIV;
}
*iv = usedIv;
}
else {
usedIv = (unsigned char *) *iv;
}
}
/* set up our encryption context */
#if CRYPTO_OPENSSL_CONST_BUFFERS
if (!EVP_EncryptInit_ex(&block->cipherCtx, key->cipher, config->engine,
key->key, usedIv)) {
#else
if (!EVP_EncryptInit_ex(&block->cipherCtx, key->cipher, config->engine, (unsigned char *) key->key, (unsigned char *) usedIv)) {
#endif
return APR_EINIT;
}
/* Clear up any read padding */
if (!EVP_CIPHER_CTX_set_padding(&block->cipherCtx, key->doPad)) {
return APR_EPADDING;
}
if (blockSize) {
*blockSize = EVP_CIPHER_block_size(key->cipher);
}
return APR_SUCCESS;
}
/**
* @brief Encrypt data provided by in, write it to out.
* @note The number of bytes written will be written to outlen. If
* out is NULL, outlen will contain the maximum size of the
* buffer needed to hold the data, including any data
* generated by apr_crypto_block_encrypt_finish below. If *out points
* to NULL, a buffer sufficiently large will be created from
* the pool provided. If *out points to a not-NULL value, this
* value will be used as a buffer instead.
* @param out Address of a buffer to which data will be written,
* see note.
* @param outlen Length of the output will be written here.
* @param in Address of the buffer to read.
* @param inlen Length of the buffer to read.
* @param ctx The block context to use.
* @return APR_ECRYPT if an error occurred. Returns APR_ENOTIMPL if
* not implemented.
*/
static apr_status_t crypto_block_encrypt(unsigned char **out,
apr_size_t *outlen, const unsigned char *in, apr_size_t inlen,
apr_crypto_block_t *ctx)
{
int outl = *outlen;
unsigned char *buffer;
/* are we after the maximum size of the out buffer? */
if (!out) {
*outlen = inlen + EVP_MAX_BLOCK_LENGTH;
return APR_SUCCESS;
}
/* must we allocate the output buffer from a pool? */
if (!*out) {
buffer = apr_palloc(ctx->pool, inlen + EVP_MAX_BLOCK_LENGTH);
if (!buffer) {
return APR_ENOMEM;
}
apr_crypto_clear(ctx->pool, buffer, inlen + EVP_MAX_BLOCK_LENGTH);
*out = buffer;
}
#if CRYPT_OPENSSL_CONST_BUFFERS
if (!EVP_EncryptUpdate(&ctx->cipherCtx, (*out), &outl, in, inlen)) {
#else
if (!EVP_EncryptUpdate(&ctx->cipherCtx, (*out), &outl,
(unsigned char *) in, inlen)) {
#endif
return APR_ECRYPT;
}
*outlen = outl;
return APR_SUCCESS;
}
/**
* @brief Encrypt final data block, write it to out.
* @note If necessary the final block will be written out after being
* padded. Typically the final block will be written to the
* same buffer used by apr_crypto_block_encrypt, offset by the
* number of bytes returned as actually written by the
* apr_crypto_block_encrypt() call. After this call, the context
* is cleaned and can be reused by apr_crypto_block_encrypt_init().
* @param out Address of a buffer to which data will be written. This
* buffer must already exist, and is usually the same
* buffer used by apr_evp_crypt(). See note.
* @param outlen Length of the output will be written here.
* @param ctx The block context to use.
* @return APR_ECRYPT if an error occurred.
* @return APR_EPADDING if padding was enabled and the block was incorrectly
* formatted.
* @return APR_ENOTIMPL if not implemented.
*/
static apr_status_t crypto_block_encrypt_finish(unsigned char *out,
apr_size_t *outlen, apr_crypto_block_t *ctx)
{
int len = *outlen;
if (EVP_EncryptFinal_ex(&ctx->cipherCtx, out, &len) == 0) {
return APR_EPADDING;
}
*outlen = len;
return APR_SUCCESS;
}
/**
* @brief Initialise a context for decrypting arbitrary data using the given key.
* @note If *ctx is NULL, a apr_crypto_block_t will be created from a pool. If
* *ctx is not NULL, *ctx must point at a previously created structure.
* @param ctx The block context returned, see note.
* @param blockSize The block size of the cipher.
* @param iv Optional initialisation vector. If the buffer pointed to is NULL,
* an IV will be created at random, in space allocated from the pool.
* If the buffer is not NULL, the IV in the buffer will be used.
* @param key The key structure.
* @param p The pool to use.
* @return Returns APR_ENOIV if an initialisation vector is required but not specified.
* Returns APR_EINIT if the backend failed to initialise the context. Returns
* APR_ENOTIMPL if not implemented.
*/
static apr_status_t crypto_block_decrypt_init(apr_crypto_block_t **ctx,
apr_size_t *blockSize, const unsigned char *iv,
const apr_crypto_key_t *key, apr_pool_t *p)
{
apr_crypto_config_t *config = key->f->config;
apr_crypto_block_t *block = *ctx;
if (!block) {
*ctx = block = apr_pcalloc(p, sizeof(apr_crypto_block_t));
}
if (!block) {
return APR_ENOMEM;
}
block->f = key->f;
block->pool = p;
block->provider = key->provider;
apr_pool_cleanup_register(p, block, crypto_block_cleanup_helper,
apr_pool_cleanup_null);
/* create a new context for encryption */
EVP_CIPHER_CTX_init(&block->cipherCtx);
block->initialised = 1;
/* generate an IV, if necessary */
if (key->ivSize) {
if (iv == NULL) {
return APR_ENOIV;
}
}
/* set up our encryption context */
#if CRYPTO_OPENSSL_CONST_BUFFERS
if (!EVP_DecryptInit_ex(&block->cipherCtx, key->cipher, config->engine,
key->key, iv)) {
#else
if (!EVP_DecryptInit_ex(&block->cipherCtx, key->cipher, config->engine, (unsigned char *) key->key, (unsigned char *) iv)) {
#endif
return APR_EINIT;
}
/* Clear up any read padding */
if (!EVP_CIPHER_CTX_set_padding(&block->cipherCtx, key->doPad)) {
return APR_EPADDING;
}
if (blockSize) {
*blockSize = EVP_CIPHER_block_size(key->cipher);
}
return APR_SUCCESS;
}
/**
* @brief Decrypt data provided by in, write it to out.
* @note The number of bytes written will be written to outlen. If
* out is NULL, outlen will contain the maximum size of the
* buffer needed to hold the data, including any data
* generated by apr_crypto_block_decrypt_finish below. If *out points
* to NULL, a buffer sufficiently large will be created from
* the pool provided. If *out points to a not-NULL value, this
* value will be used as a buffer instead.
* @param out Address of a buffer to which data will be written,
* see note.
* @param outlen Length of the output will be written here.
* @param in Address of the buffer to read.
* @param inlen Length of the buffer to read.
* @param ctx The block context to use.
* @return APR_ECRYPT if an error occurred. Returns APR_ENOTIMPL if
* not implemented.
*/
static apr_status_t crypto_block_decrypt(unsigned char **out,
apr_size_t *outlen, const unsigned char *in, apr_size_t inlen,
apr_crypto_block_t *ctx)
{
int outl = *outlen;
unsigned char *buffer;
/* are we after the maximum size of the out buffer? */
if (!out) {
*outlen = inlen + EVP_MAX_BLOCK_LENGTH;
return APR_SUCCESS;
}
/* must we allocate the output buffer from a pool? */
if (!(*out)) {
buffer = apr_palloc(ctx->pool, inlen + EVP_MAX_BLOCK_LENGTH);
if (!buffer) {
return APR_ENOMEM;
}
apr_crypto_clear(ctx->pool, buffer, inlen + EVP_MAX_BLOCK_LENGTH);
*out = buffer;
}
#if CRYPT_OPENSSL_CONST_BUFFERS
if (!EVP_DecryptUpdate(&ctx->cipherCtx, *out, &outl, in, inlen)) {
#else
if (!EVP_DecryptUpdate(&ctx->cipherCtx, *out, &outl, (unsigned char *) in,
inlen)) {
#endif
return APR_ECRYPT;
}
*outlen = outl;
return APR_SUCCESS;
}
/**
* @brief Decrypt final data block, write it to out.
* @note If necessary the final block will be written out after being
* padded. Typically the final block will be written to the
* same buffer used by apr_crypto_block_decrypt, offset by the
* number of bytes returned as actually written by the
* apr_crypto_block_decrypt() call. After this call, the context
* is cleaned and can be reused by apr_crypto_block_decrypt_init().
* @param out Address of a buffer to which data will be written. This
* buffer must already exist, and is usually the same
* buffer used by apr_evp_crypt(). See note.
* @param outlen Length of the output will be written here.
* @param ctx The block context to use.
* @return APR_ECRYPT if an error occurred.
* @return APR_EPADDING if padding was enabled and the block was incorrectly
* formatted.
* @return APR_ENOTIMPL if not implemented.
*/
static apr_status_t crypto_block_decrypt_finish(unsigned char *out,
apr_size_t *outlen, apr_crypto_block_t *ctx)
{
int len = *outlen;
if (EVP_DecryptFinal_ex(&ctx->cipherCtx, out, &len) == 0) {
return APR_EPADDING;
}
*outlen = len;
return APR_SUCCESS;
}
/**
* OpenSSL module.
*/
APU_MODULE_DECLARE_DATA const apr_crypto_driver_t apr_crypto_openssl_driver = {
"openssl", crypto_init, crypto_make, crypto_get_block_key_types,
crypto_get_block_key_modes, crypto_passphrase,
crypto_block_encrypt_init, crypto_block_encrypt,
crypto_block_encrypt_finish, crypto_block_decrypt_init,
crypto_block_decrypt, crypto_block_decrypt_finish,
crypto_block_cleanup, crypto_cleanup, crypto_shutdown, crypto_error
};
#endif

View File

@ -0,0 +1,203 @@
# Microsoft Developer Studio Project File - Name="apr_crypto_openssl" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
CFG=apr_crypto_openssl - Win32 Release
!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 "apr_crypto_openssl.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 "apr_crypto_openssl.mak" CFG="apr_crypto_openssl - Win32 Release"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "apr_crypto_openssl - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_crypto_openssl - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_crypto_openssl - x64 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_crypto_openssl - x64 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe
!IF "$(CFG)" == "apr_crypto_openssl - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
# ADD CPP /nologo /MD /W3 /Zi /O2 /Oy- /I "../include" /I "../../apr/include" /I "../include/private" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_OPENSSL=1 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_crypto_openssl_src" /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /fo"Release/apr_crypto_openssl-1.res" /d DLL_NAME="apr_crypto_openssl" /d "NDEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libeay32.lib ssleay32.lib /nologo /base:"0x6F100000" /subsystem:windows /dll /incremental:no /debug /opt:ref
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libeay32.lib ssleay32.lib /nologo /base:"0x6F100000" /subsystem:windows /dll /incremental:no /debug /out:"Release\apr_crypto_openssl-1.dll" /pdb:"Release\apr_crypto_openssl-1.pdb" /implib:"Release\apr_crypto_openssl-1.lib" /MACHINE:X86 /opt:ref
# Begin Special Build Tool
TargetPath=Release\apr_crypto_openssl-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_crypto_openssl - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /EHsc /c
# ADD CPP /nologo /MDd /W3 /Zi /Od /I "../include" /I "../../apr/include" /I "../include/private" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_OPENSSL=1 /D /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_crypto_openssl_src" /FD /EHsc /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /fo"Debug/apr_crypto_openssl-1.res" /d DLL_NAME="apr_crypto_openssl" /d "_DEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libeay32.lib ssleay32.lib /nologo /base:"0x6F100000" /subsystem:windows /dll /incremental:no /debug
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libeay32.lib ssleay32.lib /nologo /base:"0x6F100000" /subsystem:windows /dll /incremental:no /debug /out:"Debug\apr_crypto_openssl-1.dll" /pdb:"Debug\apr_crypto_openssl-1.pdb" /implib:"Debug\apr_crypto_openssl-1.lib" /MACHINE:X86
# Begin Special Build Tool
TargetPath=Debug\apr_crypto_openssl-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_crypto_openssl - x64 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "x64\Release"
# PROP BASE Intermediate_Dir "x64\Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "x64\Release"
# PROP Intermediate_Dir "x64\Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
# ADD CPP /nologo /MD /W3 /Zi /O2 /Oy- /I "../include" /I "../../apr/include" /I "../include/private" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_OPENSSL=1 /D /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_crypto_openssl_src" /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /fo"x64/Release/apr_crypto_openssl-1.res" /d DLL_NAME="apr_crypto_openssl" /d "NDEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libeay32.lib ssleay32.lib /nologo /base:"0x6F100000" /subsystem:windows /dll /incremental:no /debug /opt:ref
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libeay32.lib ssleay32.lib /nologo /base:"0x6F100000" /subsystem:windows /dll /incremental:no /debug /out:"x64\Release\apr_crypto_openssl-1.dll" /pdb:"x64\Release\apr_crypto_openssl-1.pdb" /implib:"x64\Release\apr_crypto_openssl-1.lib" /MACHINE:X64 /opt:ref
# Begin Special Build Tool
TargetPath=x64\Release\apr_crypto_openssl-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_crypto_openssl - x64 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "x64\Debug"
# PROP BASE Intermediate_Dir "x64\Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "x64\Debug"
# PROP Intermediate_Dir "x64\Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /EHsc /c
# ADD CPP /nologo /MDd /W3 /Zi /Od /I "../include" /I "../../apr/include" /I "../include/private" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_OPENSSL=1 /D /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_crypto_openssl_src" /FD /EHsc /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /fo"x64/Debug/apr_crypto_openssl-1.res" /d DLL_NAME="apr_crypto_openssl" /d "_DEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libeay32.lib ssleay32.lib /nologo /base:"0x6F100000" /subsystem:windows /dll /incremental:no /debug
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libeay32.lib ssleay32.lib /nologo /base:"0x6F100000" /subsystem:windows /dll /incremental:no /debug /out:"x64\Debug\apr_crypto_openssl-1.dll" /pdb:"x64\Debug\apr_crypto_openssl-1.pdb" /implib:"x64\Debug\apr_crypto_openssl-1.lib" /MACHINE:X64
# Begin Special Build Tool
TargetPath=x64\Debug\apr_crypto_openssl-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ENDIF
# Begin Target
# Name "apr_crypto_openssl - Win32 Release"
# Name "apr_crypto_openssl - Win32 Debug"
# Name "apr_crypto_openssl - x64 Release"
# Name "apr_crypto_openssl - x64 Debug"
# Begin Group "Source Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\apr_crypto_openssl.c
# End Source File
# End Group
# Begin Group "Public Header Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=..\include\apr_crypto.h
# End Source File
# End Group
# Begin Group "Internal Header Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=..\include\private\apu_config.h
# End Source File
# Begin Source File
SOURCE=..\include\private\apu_internal.h
# End Source File
# End Group
# Begin Source File
SOURCE=..\libaprutil.rc
# End Source File
# End Target
# End Project

404
crypto/apr_md4.c Normal file
View File

@ -0,0 +1,404 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* This is derived from material copyright RSA Data Security, Inc.
* Their notice is reproduced below in its entirety.
*
* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
* rights reserved.
*
* License to copy and use this software is granted provided that it
* is identified as the "RSA Data Security, Inc. MD4 Message-Digest
* Algorithm" in all material mentioning or referencing this software
* or this function.
*
* License is also granted to make and use derivative works provided
* that such works are identified as "derived from the RSA Data
* Security, Inc. MD4 Message-Digest Algorithm" in all material
* mentioning or referencing the derived work.
*
* RSA Data Security, Inc. makes no representations concerning either
* the merchantability of this software or the suitability of this
* software for any particular purpose. It is provided "as is"
* without express or implied warranty of any kind.
*
* These notices must be retained in any copies of any part of this
* documentation and/or software.
*/
#include "apr_strings.h"
#include "apr_md4.h"
#include "apr_lib.h"
#if APR_HAVE_STRING_H
#include <string.h>
#endif
#if APR_HAVE_UNISTD_H
#include <unistd.h>
#endif
/* Constants for MD4Transform routine.
*/
#define S11 3
#define S12 7
#define S13 11
#define S14 19
#define S21 3
#define S22 5
#define S23 9
#define S24 13
#define S31 3
#define S32 9
#define S33 11
#define S34 15
static void MD4Transform(apr_uint32_t state[4], const unsigned char block[64]);
static void Encode(unsigned char *output, const apr_uint32_t *input,
unsigned int len);
static void Decode(apr_uint32_t *output, const unsigned char *input,
unsigned int len);
static unsigned char PADDING[64] =
{
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
#if APR_CHARSET_EBCDIC
static apr_xlate_t *xlate_ebcdic_to_ascii; /* used in apr_md4_encode() */
#endif
/* F, G and I are basic MD4 functions.
*/
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
#define G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z)))
#define H(x, y, z) ((x) ^ (y) ^ (z))
/* ROTATE_LEFT rotates x left n bits.
*/
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
/* FF, GG and HH are transformations for rounds 1, 2 and 3 */
/* Rotation is separate from addition to prevent recomputation */
#define FF(a, b, c, d, x, s) { \
(a) += F ((b), (c), (d)) + (x); \
(a) = ROTATE_LEFT ((a), (s)); \
}
#define GG(a, b, c, d, x, s) { \
(a) += G ((b), (c), (d)) + (x) + (apr_uint32_t)0x5a827999; \
(a) = ROTATE_LEFT ((a), (s)); \
}
#define HH(a, b, c, d, x, s) { \
(a) += H ((b), (c), (d)) + (x) + (apr_uint32_t)0x6ed9eba1; \
(a) = ROTATE_LEFT ((a), (s)); \
}
/* MD4 initialization. Begins an MD4 operation, writing a new context.
*/
APU_DECLARE(apr_status_t) apr_md4_init(apr_md4_ctx_t *context)
{
context->count[0] = context->count[1] = 0;
/* Load magic initialization constants. */
context->state[0] = 0x67452301;
context->state[1] = 0xefcdab89;
context->state[2] = 0x98badcfe;
context->state[3] = 0x10325476;
#if APR_HAS_XLATE
context->xlate = NULL;
#endif
return APR_SUCCESS;
}
#if APR_HAS_XLATE
/* MD4 translation setup. Provides the APR translation handle
* to be used for translating the content before calculating the
* digest.
*/
APU_DECLARE(apr_status_t) apr_md4_set_xlate(apr_md4_ctx_t *context,
apr_xlate_t *xlate)
{
apr_status_t rv;
int is_sb;
/* TODO: remove the single-byte-only restriction from this code
*/
rv = apr_xlate_sb_get(xlate, &is_sb);
if (rv != APR_SUCCESS) {
return rv;
}
if (!is_sb) {
return APR_EINVAL;
}
context->xlate = xlate;
return APR_SUCCESS;
}
#endif /* APR_HAS_XLATE */
/* MD4 block update operation. Continues an MD4 message-digest
* operation, processing another message block, and updating the
* context.
*/
APU_DECLARE(apr_status_t) apr_md4_update(apr_md4_ctx_t *context,
const unsigned char *input,
apr_size_t inputLen)
{
unsigned int i, idx, partLen;
#if APR_HAS_XLATE
apr_size_t inbytes_left, outbytes_left;
#endif
/* Compute number of bytes mod 64 */
idx = (unsigned int)((context->count[0] >> 3) & 0x3F);
/* Update number of bits */
if ((context->count[0] += ((apr_uint32_t)inputLen << 3))
< ((apr_uint32_t)inputLen << 3))
context->count[1]++;
context->count[1] += (apr_uint32_t)inputLen >> 29;
partLen = 64 - idx;
/* Transform as many times as possible. */
#if !APR_HAS_XLATE
if (inputLen >= partLen) {
memcpy(&context->buffer[idx], input, partLen);
MD4Transform(context->state, context->buffer);
for (i = partLen; i + 63 < inputLen; i += 64)
MD4Transform(context->state, &input[i]);
idx = 0;
}
else
i = 0;
/* Buffer remaining input */
memcpy(&context->buffer[idx], &input[i], inputLen - i);
#else /*APR_HAS_XLATE*/
if (inputLen >= partLen) {
if (context->xlate) {
inbytes_left = outbytes_left = partLen;
apr_xlate_conv_buffer(context->xlate, (const char *)input,
&inbytes_left,
(char *)&context->buffer[idx],
&outbytes_left);
}
else {
memcpy(&context->buffer[idx], input, partLen);
}
MD4Transform(context->state, context->buffer);
for (i = partLen; i + 63 < inputLen; i += 64) {
if (context->xlate) {
unsigned char inp_tmp[64];
inbytes_left = outbytes_left = 64;
apr_xlate_conv_buffer(context->xlate, (const char *)&input[i],
&inbytes_left,
(char *)inp_tmp, &outbytes_left);
MD4Transform(context->state, inp_tmp);
}
else {
MD4Transform(context->state, &input[i]);
}
}
idx = 0;
}
else
i = 0;
/* Buffer remaining input */
if (context->xlate) {
inbytes_left = outbytes_left = inputLen - i;
apr_xlate_conv_buffer(context->xlate, (const char *)&input[i],
&inbytes_left, (char *)&context->buffer[idx],
&outbytes_left);
}
else {
memcpy(&context->buffer[idx], &input[i], inputLen - i);
}
#endif /*APR_HAS_XLATE*/
return APR_SUCCESS;
}
/* MD4 finalization. Ends an MD4 message-digest operation, writing the
* the message digest and zeroizing the context.
*/
APU_DECLARE(apr_status_t) apr_md4_final(
unsigned char digest[APR_MD4_DIGESTSIZE],
apr_md4_ctx_t *context)
{
unsigned char bits[8];
unsigned int idx, padLen;
/* Save number of bits */
Encode(bits, context->count, 8);
#if APR_HAS_XLATE
/* apr_md4_update() should not translate for this final round. */
context->xlate = NULL;
#endif /*APR_HAS_XLATE*/
/* Pad out to 56 mod 64. */
idx = (unsigned int) ((context->count[0] >> 3) & 0x3f);
padLen = (idx < 56) ? (56 - idx) : (120 - idx);
apr_md4_update(context, PADDING, padLen);
/* Append length (before padding) */
apr_md4_update(context, bits, 8);
/* Store state in digest */
Encode(digest, context->state, APR_MD4_DIGESTSIZE);
/* Zeroize sensitive information. */
memset(context, 0, sizeof(*context));
return APR_SUCCESS;
}
/* MD4 computation in one step (init, update, final)
*/
APU_DECLARE(apr_status_t) apr_md4(unsigned char digest[APR_MD4_DIGESTSIZE],
const unsigned char *input,
apr_size_t inputLen)
{
apr_md4_ctx_t ctx;
apr_status_t rv;
apr_md4_init(&ctx);
if ((rv = apr_md4_update(&ctx, input, inputLen)) != APR_SUCCESS)
return rv;
return apr_md4_final(digest, &ctx);
}
/* MD4 basic transformation. Transforms state based on block. */
static void MD4Transform(apr_uint32_t state[4], const unsigned char block[64])
{
apr_uint32_t a = state[0], b = state[1], c = state[2], d = state[3],
x[APR_MD4_DIGESTSIZE];
Decode(x, block, 64);
/* Round 1 */
FF (a, b, c, d, x[ 0], S11); /* 1 */
FF (d, a, b, c, x[ 1], S12); /* 2 */
FF (c, d, a, b, x[ 2], S13); /* 3 */
FF (b, c, d, a, x[ 3], S14); /* 4 */
FF (a, b, c, d, x[ 4], S11); /* 5 */
FF (d, a, b, c, x[ 5], S12); /* 6 */
FF (c, d, a, b, x[ 6], S13); /* 7 */
FF (b, c, d, a, x[ 7], S14); /* 8 */
FF (a, b, c, d, x[ 8], S11); /* 9 */
FF (d, a, b, c, x[ 9], S12); /* 10 */
FF (c, d, a, b, x[10], S13); /* 11 */
FF (b, c, d, a, x[11], S14); /* 12 */
FF (a, b, c, d, x[12], S11); /* 13 */
FF (d, a, b, c, x[13], S12); /* 14 */
FF (c, d, a, b, x[14], S13); /* 15 */
FF (b, c, d, a, x[15], S14); /* 16 */
/* Round 2 */
GG (a, b, c, d, x[ 0], S21); /* 17 */
GG (d, a, b, c, x[ 4], S22); /* 18 */
GG (c, d, a, b, x[ 8], S23); /* 19 */
GG (b, c, d, a, x[12], S24); /* 20 */
GG (a, b, c, d, x[ 1], S21); /* 21 */
GG (d, a, b, c, x[ 5], S22); /* 22 */
GG (c, d, a, b, x[ 9], S23); /* 23 */
GG (b, c, d, a, x[13], S24); /* 24 */
GG (a, b, c, d, x[ 2], S21); /* 25 */
GG (d, a, b, c, x[ 6], S22); /* 26 */
GG (c, d, a, b, x[10], S23); /* 27 */
GG (b, c, d, a, x[14], S24); /* 28 */
GG (a, b, c, d, x[ 3], S21); /* 29 */
GG (d, a, b, c, x[ 7], S22); /* 30 */
GG (c, d, a, b, x[11], S23); /* 31 */
GG (b, c, d, a, x[15], S24); /* 32 */
/* Round 3 */
HH (a, b, c, d, x[ 0], S31); /* 33 */
HH (d, a, b, c, x[ 8], S32); /* 34 */
HH (c, d, a, b, x[ 4], S33); /* 35 */
HH (b, c, d, a, x[12], S34); /* 36 */
HH (a, b, c, d, x[ 2], S31); /* 37 */
HH (d, a, b, c, x[10], S32); /* 38 */
HH (c, d, a, b, x[ 6], S33); /* 39 */
HH (b, c, d, a, x[14], S34); /* 40 */
HH (a, b, c, d, x[ 1], S31); /* 41 */
HH (d, a, b, c, x[ 9], S32); /* 42 */
HH (c, d, a, b, x[ 5], S33); /* 43 */
HH (b, c, d, a, x[13], S34); /* 44 */
HH (a, b, c, d, x[ 3], S31); /* 45 */
HH (d, a, b, c, x[11], S32); /* 46 */
HH (c, d, a, b, x[ 7], S33); /* 47 */
HH (b, c, d, a, x[15], S34); /* 48 */
state[0] += a;
state[1] += b;
state[2] += c;
state[3] += d;
/* Zeroize sensitive information. */
memset(x, 0, sizeof(x));
}
/* Encodes input (apr_uint32_t) into output (unsigned char). Assumes len is
* a multiple of 4.
*/
static void Encode(unsigned char *output, const apr_uint32_t *input,
unsigned int len)
{
unsigned int i, j;
apr_uint32_t k;
for (i = 0, j = 0; j < len; i++, j += 4) {
k = input[i];
output[j] = (unsigned char)(k & 0xff);
output[j + 1] = (unsigned char)((k >> 8) & 0xff);
output[j + 2] = (unsigned char)((k >> 16) & 0xff);
output[j + 3] = (unsigned char)((k >> 24) & 0xff);
}
}
/* Decodes input (unsigned char) into output (apr_uint32_t). Assumes len is
* a multiple of 4.
*/
static void Decode(apr_uint32_t *output, const unsigned char *input,
unsigned int len)
{
unsigned int i, j;
for (i = 0, j = 0; j < len; i++, j += 4)
output[i] = ((apr_uint32_t)input[j]) |
(((apr_uint32_t)input[j + 1]) << 8) |
(((apr_uint32_t)input[j + 2]) << 16) |
(((apr_uint32_t)input[j + 3]) << 24);
}
#if APR_CHARSET_EBCDIC
APU_DECLARE(apr_status_t) apr_MD4InitEBCDIC(apr_xlate_t *xlate)
{
xlate_ebcdic_to_ascii = xlate;
return APR_SUCCESS;
}
#endif

756
crypto/apr_md5.c Normal file
View File

@ -0,0 +1,756 @@
/*
* This is work is derived from material Copyright RSA Data Security, Inc.
*
* The RSA copyright statement and Licence for that original material is
* included below. This is followed by the Apache copyright statement and
* licence for the modifications made to that material.
*/
/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
*/
/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
rights reserved.
License to copy and use this software is granted provided that it
is identified as the "RSA Data Security, Inc. MD5 Message-Digest
Algorithm" in all material mentioning or referencing this software
or this function.
License is also granted to make and use derivative works provided
that such works are identified as "derived from the RSA Data
Security, Inc. MD5 Message-Digest Algorithm" in all material
mentioning or referencing the derived work.
RSA Data Security, Inc. makes no representations concerning either
the merchantability of this software or the suitability of this
software for any particular purpose. It is provided "as is"
without express or implied warranty of any kind.
These notices must be retained in any copies of any part of this
documentation and/or software.
*/
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* The apr_md5_encode() routine uses much code obtained from the FreeBSD 3.0
* MD5 crypt() function, which is licenced as follows:
* ----------------------------------------------------------------------------
* "THE BEER-WARE LICENSE" (Revision 42):
* <phk@login.dknet.dk> wrote this file. As long as you retain this notice you
* can do whatever you want with this stuff. If we meet some day, and you think
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
* ----------------------------------------------------------------------------
*/
#include "apr_strings.h"
#include "apr_md5.h"
#include "apr_lib.h"
#include "apu_config.h"
#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 const unsigned char PADDING[64] =
{
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
#if APR_CHARSET_EBCDIC
static apr_xlate_t *xlate_ebcdic_to_ascii; /* used in apr_md5_encode() */
#endif
#define DO_XLATE 0
#define SKIP_XLATE 1
/* F, G, H and I are basic MD5 functions.
*/
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
#define H(x, y, z) ((x) ^ (y) ^ (z))
#define I(x, y, z) ((y) ^ ((x) | (~z)))
/* ROTATE_LEFT rotates x left n bits.
*/
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
* Rotation is separate from addition to prevent recomputation.
*/
#define FF(a, b, c, d, x, s, ac) { \
(a) += F ((b), (c), (d)) + (x) + (apr_uint32_t)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
#define GG(a, b, c, d, x, s, ac) { \
(a) += G ((b), (c), (d)) + (x) + (apr_uint32_t)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
#define HH(a, b, c, d, x, s, ac) { \
(a) += H ((b), (c), (d)) + (x) + (apr_uint32_t)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
#define II(a, b, c, d, x, s, ac) { \
(a) += I ((b), (c), (d)) + (x) + (apr_uint32_t)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
/* MD5 initialization. Begins an MD5 operation, writing a new context.
*/
APU_DECLARE(apr_status_t) apr_md5_init(apr_md5_ctx_t *context)
{
context->count[0] = context->count[1] = 0;
/* Load magic initialization constants. */
context->state[0] = 0x67452301;
context->state[1] = 0xefcdab89;
context->state[2] = 0x98badcfe;
context->state[3] = 0x10325476;
context->xlate = NULL;
return APR_SUCCESS;
}
/* MD5 translation setup. Provides the APR translation handle
* to be used for translating the content before calculating the
* digest.
*/
APU_DECLARE(apr_status_t) apr_md5_set_xlate(apr_md5_ctx_t *context,
apr_xlate_t *xlate)
{
#if APR_HAS_XLATE
apr_status_t rv;
int is_sb;
/* TODO: remove the single-byte-only restriction from this code
*/
rv = apr_xlate_sb_get(xlate, &is_sb);
if (rv != APR_SUCCESS) {
return rv;
}
if (!is_sb) {
return APR_EINVAL;
}
context->xlate = xlate;
return APR_SUCCESS;
#else
return APR_ENOTIMPL;
#endif /* APR_HAS_XLATE */
}
/* MD5 block update operation. Continues an MD5 message-digest
* operation, processing another message block, and updating the
* context.
*/
static apr_status_t md5_update_buffer(apr_md5_ctx_t *context,
const void *vinput,
apr_size_t inputLen,
int xlate_buffer)
{
const unsigned char *input = vinput;
unsigned int i, idx, partLen;
#if APR_HAS_XLATE
apr_size_t inbytes_left, outbytes_left;
#endif
/* Compute number of bytes mod 64 */
idx = (unsigned int)((context->count[0] >> 3) & 0x3F);
/* Update number of bits */
if ((context->count[0] += ((apr_uint32_t)inputLen << 3))
< ((apr_uint32_t)inputLen << 3))
context->count[1]++;
context->count[1] += (apr_uint32_t)inputLen >> 29;
partLen = 64 - idx;
/* Transform as many times as possible. */
#if !APR_HAS_XLATE
if (inputLen >= partLen) {
memcpy(&context->buffer[idx], input, partLen);
MD5Transform(context->state, context->buffer);
for (i = partLen; i + 63 < inputLen; i += 64)
MD5Transform(context->state, &input[i]);
idx = 0;
}
else
i = 0;
/* Buffer remaining input */
memcpy(&context->buffer[idx], &input[i], inputLen - i);
#else /*APR_HAS_XLATE*/
if (inputLen >= partLen) {
if (context->xlate && (xlate_buffer == DO_XLATE)) {
inbytes_left = outbytes_left = partLen;
apr_xlate_conv_buffer(context->xlate, (const char *)input,
&inbytes_left,
(char *)&context->buffer[idx],
&outbytes_left);
}
else {
memcpy(&context->buffer[idx], input, partLen);
}
MD5Transform(context->state, context->buffer);
for (i = partLen; i + 63 < inputLen; i += 64) {
if (context->xlate && (xlate_buffer == DO_XLATE)) {
unsigned char inp_tmp[64];
inbytes_left = outbytes_left = 64;
apr_xlate_conv_buffer(context->xlate, (const char *)&input[i],
&inbytes_left, (char *)inp_tmp,
&outbytes_left);
MD5Transform(context->state, inp_tmp);
}
else {
MD5Transform(context->state, &input[i]);
}
}
idx = 0;
}
else
i = 0;
/* Buffer remaining input */
if (context->xlate && (xlate_buffer == DO_XLATE)) {
inbytes_left = outbytes_left = inputLen - i;
apr_xlate_conv_buffer(context->xlate, (const char *)&input[i],
&inbytes_left, (char *)&context->buffer[idx],
&outbytes_left);
}
else {
memcpy(&context->buffer[idx], &input[i], inputLen - i);
}
#endif /*APR_HAS_XLATE*/
return APR_SUCCESS;
}
/* MD5 block update operation. API with the default setting
* for EBCDIC translations
*/
APU_DECLARE(apr_status_t) apr_md5_update(apr_md5_ctx_t *context,
const void *input,
apr_size_t inputLen)
{
return md5_update_buffer(context, input, inputLen, DO_XLATE);
}
/* MD5 finalization. Ends an MD5 message-digest operation, writing the
* the message digest and zeroizing the context.
*/
APU_DECLARE(apr_status_t) apr_md5_final(unsigned char digest[APR_MD5_DIGESTSIZE],
apr_md5_ctx_t *context)
{
unsigned char bits[8];
unsigned int idx, padLen;
/* Save number of bits */
Encode(bits, context->count, 8);
#if APR_HAS_XLATE
/* apr_md5_update() should not translate for this final round. */
context->xlate = NULL;
#endif /*APR_HAS_XLATE*/
/* Pad out to 56 mod 64. */
idx = (unsigned int)((context->count[0] >> 3) & 0x3f);
padLen = (idx < 56) ? (56 - idx) : (120 - idx);
apr_md5_update(context, PADDING, padLen);
/* Append length (before padding) */
apr_md5_update(context, bits, 8);
/* Store state in digest */
Encode(digest, context->state, APR_MD5_DIGESTSIZE);
/* Zeroize sensitive information. */
memset(context, 0, sizeof(*context));
return APR_SUCCESS;
}
/* MD5 in one step (init, update, final)
*/
APU_DECLARE(apr_status_t) apr_md5(unsigned char digest[APR_MD5_DIGESTSIZE],
const void *_input,
apr_size_t inputLen)
{
const unsigned char *input = _input;
apr_md5_ctx_t ctx;
apr_status_t rv;
apr_md5_init(&ctx);
if ((rv = apr_md5_update(&ctx, input, inputLen)) != APR_SUCCESS)
return rv;
return apr_md5_final(digest, &ctx);
}
/* MD5 basic transformation. Transforms state based on block. */
static void MD5Transform(apr_uint32_t state[4], const unsigned char block[64])
{
apr_uint32_t a = state[0], b = state[1], c = state[2], d = state[3],
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);
#if APR_CHARSET_EBCDIC
apr_md5_set_xlate(&ctx1, xlate_ebcdic_to_ascii);
#endif
apr_md5_update(&ctx1, pw, strlen(pw));
apr_md5_update(&ctx1, sp, sl);
apr_md5_update(&ctx1, pw, strlen(pw));
apr_md5_final(final, &ctx1);
for (pl = strlen(pw); pl > 0; pl -= APR_MD5_DIGESTSIZE) {
md5_update_buffer(&ctx, final,
(pl > APR_MD5_DIGESTSIZE) ? APR_MD5_DIGESTSIZE : pl, SKIP_XLATE);
}
/*
* Don't leave anything around in vm they could use.
*/
memset(final, 0, sizeof(final));
/*
* Then something really weird...
*/
for (i = strlen(pw); i != 0; i >>= 1) {
if (i & 1) {
md5_update_buffer(&ctx, final, 1, SKIP_XLATE);
}
else {
apr_md5_update(&ctx, pw, 1);
}
}
/*
* Now make the output string. We know our limitations, so we
* can use the string routines without bounds checking.
*/
strcpy(passwd, apr1_id);
strncat(passwd, sp, sl);
strcat(passwd, "$");
apr_md5_final(final, &ctx);
/*
* And now, just to make sure things don't run too fast..
* On a 60 Mhz Pentium this takes 34 msec, so you would
* need 30 seconds to build a 1000 entry dictionary...
*/
for (i = 0; i < 1000; i++) {
apr_md5_init(&ctx1);
/*
* apr_md5_final clears out ctx1.xlate at the end of each loop,
* so need to to set it each time through
*/
#if APR_CHARSET_EBCDIC
apr_md5_set_xlate(&ctx1, xlate_ebcdic_to_ascii);
#endif
if (i & 1) {
apr_md5_update(&ctx1, pw, strlen(pw));
}
else {
md5_update_buffer(&ctx1, final, APR_MD5_DIGESTSIZE, SKIP_XLATE);
}
if (i % 3) {
apr_md5_update(&ctx1, sp, sl);
}
if (i % 7) {
apr_md5_update(&ctx1, pw, strlen(pw));
}
if (i & 1) {
md5_update_buffer(&ctx1, final, APR_MD5_DIGESTSIZE, SKIP_XLATE);
}
else {
apr_md5_update(&ctx1, pw, strlen(pw));
}
apr_md5_final(final,&ctx1);
}
p = passwd + strlen(passwd);
l = (final[ 0]<<16) | (final[ 6]<<8) | final[12]; to64(p, l, 4); p += 4;
l = (final[ 1]<<16) | (final[ 7]<<8) | final[13]; to64(p, l, 4); p += 4;
l = (final[ 2]<<16) | (final[ 8]<<8) | final[14]; to64(p, l, 4); p += 4;
l = (final[ 3]<<16) | (final[ 9]<<8) | final[15]; to64(p, l, 4); p += 4;
l = (final[ 4]<<16) | (final[10]<<8) | final[ 5]; to64(p, l, 4); p += 4;
l = final[11] ; to64(p, l, 2); p += 2;
*p = '\0';
/*
* Don't leave anything around in vm they could use.
*/
memset(final, 0, sizeof(final));
apr_cpystrn(result, passwd, nbytes - 1);
return APR_SUCCESS;
}
#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, (int)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;
}

368
crypto/apr_sha1.c Normal file
View File

@ -0,0 +1,368 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* The exported function:
*
* apr_sha1_base64(const char *clear, int len, char *out);
*
* provides a means to SHA1 crypt/encode a plaintext password in
* a way which makes password files compatible with those commonly
* used in netscape web and ldap installations. It was put together
* by Clinton Wong <clintdw@netcom.com>, who also notes that:
*
* Note: SHA1 support is useful for migration purposes, but is less
* secure than Apache's password format, since Apache's (MD5)
* password format uses a random eight character salt to generate
* one of many possible hashes for the same password. Netscape
* uses plain SHA1 without a salt, so the same password
* will always generate the same hash, making it easier
* to break since the search space is smaller.
*
* See also the documentation in support/SHA1 as to hints on how to
* migrate an existing netscape installation and other supplied utitlites.
*
* This software also makes use of the following component:
*
* NIST Secure Hash Algorithm
* heavily modified by Uwe Hollerbach uh@alumni.caltech edu
* from Peter C. Gutmann's implementation as found in
* Applied Cryptography by Bruce Schneier
* This code is hereby placed in the public domain
*/
#include "apr_sha1.h"
#include "apr_base64.h"
#include "apr_strings.h"
#include "apr_lib.h"
#if APR_CHARSET_EBCDIC
#include "apr_xlate.h"
#endif /*APR_CHARSET_EBCDIC*/
#include <string.h>
/* a bit faster & bigger, if defined */
#define UNROLL_LOOPS
/* NIST's proposed modification to SHA, 7/11/94 */
#define USE_MODIFIED_SHA
/* SHA f()-functions */
#define f1(x,y,z) ((x & y) | (~x & z))
#define f2(x,y,z) (x ^ y ^ z)
#define f3(x,y,z) ((x & y) | (x & z) | (y & z))
#define f4(x,y,z) (x ^ y ^ z)
/* SHA constants */
#define CONST1 0x5a827999L
#define CONST2 0x6ed9eba1L
#define CONST3 0x8f1bbcdcL
#define CONST4 0xca62c1d6L
/* 32-bit rotate */
#define ROT32(x,n) ((x << n) | (x >> (32 - n)))
#define FUNC(n,i) \
temp = ROT32(A,5) + f##n(B,C,D) + E + W[i] + CONST##n; \
E = D; D = C; C = ROT32(B,30); B = A; A = temp
#define SHA_BLOCKSIZE 64
#if APR_CHARSET_EBCDIC
static apr_xlate_t *ebcdic2ascii_xlate;
APU_DECLARE(apr_status_t) apr_SHA1InitEBCDIC(apr_xlate_t *x)
{
apr_status_t rv;
int onoff;
/* Only single-byte conversion is supported.
*/
rv = apr_xlate_sb_get(x, &onoff);
if (rv) {
return rv;
}
if (!onoff) { /* If conversion is not single-byte-only */
return APR_EINVAL;
}
ebcdic2ascii_xlate = x;
return APR_SUCCESS;
}
#endif
/* do SHA transformation */
static void sha_transform(apr_sha1_ctx_t *sha_info)
{
int i;
apr_uint32_t temp, A, B, C, D, E, W[80];
for (i = 0; i < 16; ++i) {
W[i] = sha_info->data[i];
}
for (i = 16; i < 80; ++i) {
W[i] = W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16];
#ifdef USE_MODIFIED_SHA
W[i] = ROT32(W[i], 1);
#endif /* USE_MODIFIED_SHA */
}
A = sha_info->digest[0];
B = sha_info->digest[1];
C = sha_info->digest[2];
D = sha_info->digest[3];
E = sha_info->digest[4];
#ifdef UNROLL_LOOPS
FUNC(1, 0); FUNC(1, 1); FUNC(1, 2); FUNC(1, 3); FUNC(1, 4);
FUNC(1, 5); FUNC(1, 6); FUNC(1, 7); FUNC(1, 8); FUNC(1, 9);
FUNC(1,10); FUNC(1,11); FUNC(1,12); FUNC(1,13); FUNC(1,14);
FUNC(1,15); FUNC(1,16); FUNC(1,17); FUNC(1,18); FUNC(1,19);
FUNC(2,20); FUNC(2,21); FUNC(2,22); FUNC(2,23); FUNC(2,24);
FUNC(2,25); FUNC(2,26); FUNC(2,27); FUNC(2,28); FUNC(2,29);
FUNC(2,30); FUNC(2,31); FUNC(2,32); FUNC(2,33); FUNC(2,34);
FUNC(2,35); FUNC(2,36); FUNC(2,37); FUNC(2,38); FUNC(2,39);
FUNC(3,40); FUNC(3,41); FUNC(3,42); FUNC(3,43); FUNC(3,44);
FUNC(3,45); FUNC(3,46); FUNC(3,47); FUNC(3,48); FUNC(3,49);
FUNC(3,50); FUNC(3,51); FUNC(3,52); FUNC(3,53); FUNC(3,54);
FUNC(3,55); FUNC(3,56); FUNC(3,57); FUNC(3,58); FUNC(3,59);
FUNC(4,60); FUNC(4,61); FUNC(4,62); FUNC(4,63); FUNC(4,64);
FUNC(4,65); FUNC(4,66); FUNC(4,67); FUNC(4,68); FUNC(4,69);
FUNC(4,70); FUNC(4,71); FUNC(4,72); FUNC(4,73); FUNC(4,74);
FUNC(4,75); FUNC(4,76); FUNC(4,77); FUNC(4,78); FUNC(4,79);
#else /* !UNROLL_LOOPS */
for (i = 0; i < 20; ++i) {
FUNC(1,i);
}
for (i = 20; i < 40; ++i) {
FUNC(2,i);
}
for (i = 40; i < 60; ++i) {
FUNC(3,i);
}
for (i = 60; i < 80; ++i) {
FUNC(4,i);
}
#endif /* !UNROLL_LOOPS */
sha_info->digest[0] += A;
sha_info->digest[1] += B;
sha_info->digest[2] += C;
sha_info->digest[3] += D;
sha_info->digest[4] += E;
}
union endianTest {
long Long;
char Char[sizeof(long)];
};
static char isLittleEndian(void)
{
static union endianTest u;
u.Long = 1;
return (u.Char[0] == 1);
}
/* change endianness of data */
/* count is the number of bytes to do an endian flip */
static void maybe_byte_reverse(apr_uint32_t *buffer, int count)
{
int i;
apr_byte_t ct[4], *cp;
if (isLittleEndian()) { /* do the swap only if it is little endian */
count /= sizeof(apr_uint32_t);
cp = (apr_byte_t *) buffer;
for (i = 0; i < count; ++i) {
ct[0] = cp[0];
ct[1] = cp[1];
ct[2] = cp[2];
ct[3] = cp[3];
cp[0] = ct[3];
cp[1] = ct[2];
cp[2] = ct[1];
cp[3] = ct[0];
cp += sizeof(apr_uint32_t);
}
}
}
/* initialize the SHA digest */
APU_DECLARE(void) apr_sha1_init(apr_sha1_ctx_t *sha_info)
{
sha_info->digest[0] = 0x67452301L;
sha_info->digest[1] = 0xefcdab89L;
sha_info->digest[2] = 0x98badcfeL;
sha_info->digest[3] = 0x10325476L;
sha_info->digest[4] = 0xc3d2e1f0L;
sha_info->count_lo = 0L;
sha_info->count_hi = 0L;
sha_info->local = 0;
}
/* update the SHA digest */
APU_DECLARE(void) apr_sha1_update_binary(apr_sha1_ctx_t *sha_info,
const unsigned char *buffer,
unsigned int count)
{
unsigned int i;
if ((sha_info->count_lo + ((apr_uint32_t) count << 3)) < sha_info->count_lo) {
++sha_info->count_hi;
}
sha_info->count_lo += (apr_uint32_t) count << 3;
sha_info->count_hi += (apr_uint32_t) count >> 29;
if (sha_info->local) {
i = SHA_BLOCKSIZE - sha_info->local;
if (i > count) {
i = count;
}
memcpy(((apr_byte_t *) sha_info->data) + sha_info->local, buffer, i);
count -= i;
buffer += i;
sha_info->local += i;
if (sha_info->local == SHA_BLOCKSIZE) {
maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
sha_transform(sha_info);
}
else {
return;
}
}
while (count >= SHA_BLOCKSIZE) {
memcpy(sha_info->data, buffer, SHA_BLOCKSIZE);
buffer += SHA_BLOCKSIZE;
count -= SHA_BLOCKSIZE;
maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
sha_transform(sha_info);
}
memcpy(sha_info->data, buffer, count);
sha_info->local = count;
}
APU_DECLARE(void) apr_sha1_update(apr_sha1_ctx_t *sha_info, const char *buf,
unsigned int count)
{
#if APR_CHARSET_EBCDIC
int i;
const apr_byte_t *buffer = (const apr_byte_t *) buf;
apr_size_t inbytes_left, outbytes_left;
if ((sha_info->count_lo + ((apr_uint32_t) count << 3)) < sha_info->count_lo) {
++sha_info->count_hi;
}
sha_info->count_lo += (apr_uint32_t) count << 3;
sha_info->count_hi += (apr_uint32_t) count >> 29;
/* Is there a remainder of the previous Update operation? */
if (sha_info->local) {
i = SHA_BLOCKSIZE - sha_info->local;
if (i > count) {
i = count;
}
inbytes_left = outbytes_left = i;
apr_xlate_conv_buffer(ebcdic2ascii_xlate, buffer, &inbytes_left,
((apr_byte_t *) sha_info->data) + sha_info->local,
&outbytes_left);
count -= i;
buffer += i;
sha_info->local += i;
if (sha_info->local == SHA_BLOCKSIZE) {
maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
sha_transform(sha_info);
}
else {
return;
}
}
while (count >= SHA_BLOCKSIZE) {
inbytes_left = outbytes_left = SHA_BLOCKSIZE;
apr_xlate_conv_buffer(ebcdic2ascii_xlate, buffer, &inbytes_left,
(apr_byte_t *) sha_info->data, &outbytes_left);
buffer += SHA_BLOCKSIZE;
count -= SHA_BLOCKSIZE;
maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
sha_transform(sha_info);
}
inbytes_left = outbytes_left = count;
apr_xlate_conv_buffer(ebcdic2ascii_xlate, buffer, &inbytes_left,
(apr_byte_t *) sha_info->data, &outbytes_left);
sha_info->local = count;
#else
apr_sha1_update_binary(sha_info, (const unsigned char *) buf, count);
#endif
}
/* finish computing the SHA digest */
APU_DECLARE(void) apr_sha1_final(unsigned char digest[APR_SHA1_DIGESTSIZE],
apr_sha1_ctx_t *sha_info)
{
int count, i, j;
apr_uint32_t lo_bit_count, hi_bit_count, k;
lo_bit_count = sha_info->count_lo;
hi_bit_count = sha_info->count_hi;
count = (int) ((lo_bit_count >> 3) & 0x3f);
((apr_byte_t *) sha_info->data)[count++] = 0x80;
if (count > SHA_BLOCKSIZE - 8) {
memset(((apr_byte_t *) sha_info->data) + count, 0, SHA_BLOCKSIZE - count);
maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
sha_transform(sha_info);
memset((apr_byte_t *) sha_info->data, 0, SHA_BLOCKSIZE - 8);
}
else {
memset(((apr_byte_t *) sha_info->data) + count, 0,
SHA_BLOCKSIZE - 8 - count);
}
maybe_byte_reverse(sha_info->data, SHA_BLOCKSIZE);
sha_info->data[14] = hi_bit_count;
sha_info->data[15] = lo_bit_count;
sha_transform(sha_info);
for (i = 0, j = 0; j < APR_SHA1_DIGESTSIZE; i++) {
k = sha_info->digest[i];
digest[j++] = (unsigned char) ((k >> 24) & 0xff);
digest[j++] = (unsigned char) ((k >> 16) & 0xff);
digest[j++] = (unsigned char) ((k >> 8) & 0xff);
digest[j++] = (unsigned char) (k & 0xff);
}
}
APU_DECLARE(void) apr_sha1_base64(const char *clear, int len, char *out)
{
int l;
apr_sha1_ctx_t context;
apr_byte_t digest[APR_SHA1_DIGESTSIZE];
apr_sha1_init(&context);
apr_sha1_update(&context, clear, len);
apr_sha1_final(digest, &context);
/* private marker. */
apr_cpystrn(out, APR_SHA1PW_ID, APR_SHA1PW_IDLEN + 1);
/* SHA1 hash is always 20 chars */
l = apr_base64_encode_binary(out + APR_SHA1PW_IDLEN, digest, sizeof(digest));
out[l + APR_SHA1PW_IDLEN] = '\0';
/*
* output of base64 encoded SHA1 is always 28 chars + APR_SHA1PW_IDLEN
*/
}

208
crypto/getuuid.c Normal file
View File

@ -0,0 +1,208 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* This attempts to generate V1 UUIDs according to the Internet Draft
* located at http://www.webdav.org/specs/draft-leach-uuids-guids-01.txt
*/
#include "apr.h"
#include "apr_uuid.h"
#include "apr_md5.h"
#include "apr_general.h"
#include "apr_portable.h"
#if APR_HAVE_UNISTD_H
#include <unistd.h> /* for getpid, gethostname */
#endif
#if APR_HAVE_STDLIB_H
#include <stdlib.h> /* for rand, srand */
#endif
#if APR_HAVE_STRING_H
#include <string.h>
#endif
#if APR_HAVE_STRINGS_H
#include <strings.h>
#endif
#if APR_HAVE_NETDB_H
#include <netdb.h>
#endif
#if APR_HAVE_SYS_TIME_H
#include <sys/time.h> /* for gettimeofday */
#endif
#define NODE_LENGTH 6
static int uuid_state_seqnum;
static unsigned char uuid_state_node[NODE_LENGTH] = { 0 };
static void get_random_info(unsigned char node[NODE_LENGTH])
{
#if APR_HAS_RANDOM
(void) apr_generate_random_bytes(node, NODE_LENGTH);
#else
unsigned char seed[APR_MD5_DIGESTSIZE];
apr_md5_ctx_t c;
/* ### probably should revise some of this to be a bit more portable */
/* Leach & Salz use Linux-specific struct sysinfo;
* replace with pid/tid for portability (in the spirit of mod_unique_id) */
struct {
/* Add thread id here, if applicable, when we get to pthread or apr */
pid_t pid;
#ifdef NETWARE
apr_uint64_t t;
#else
struct timeval t;
#endif
char hostname[257];
} r;
apr_md5_init(&c);
#ifdef NETWARE
r.pid = NXThreadGetId();
NXGetTime(NX_SINCE_BOOT, NX_USECONDS, &(r.t));
#else
r.pid = getpid();
gettimeofday(&r.t, (struct timezone *)0);
#endif
gethostname(r.hostname, 256);
apr_md5_update(&c, (const unsigned char *)&r, sizeof(r));
apr_md5_final(seed, &c);
memcpy(node, seed, NODE_LENGTH); /* use a subset of the seed bytes */
#endif
}
/* This implementation generates a random node ID instead of a
system-dependent call to get IEEE node ID. This is also more secure:
we aren't passing out our MAC address.
*/
static void get_pseudo_node_identifier(unsigned char *node)
{
get_random_info(node);
node[0] |= 0x01; /* this designates a random multicast node ID */
}
static void get_system_time(apr_uint64_t *uuid_time)
{
/* ### fix this call to be more portable? */
*uuid_time = apr_time_now();
/* Offset between UUID formatted times and Unix formatted times.
UUID UTC base time is October 15, 1582.
Unix base time is January 1, 1970. */
*uuid_time = (*uuid_time * 10) + APR_TIME_C(0x01B21DD213814000);
}
/* true_random -- generate a crypto-quality random number. */
static int true_random(void)
{
apr_uint64_t time_now;
#if APR_HAS_RANDOM
unsigned char buf[2];
if (apr_generate_random_bytes(buf, 2) == APR_SUCCESS) {
return (buf[0] << 8) | buf[1];
}
#endif
/* crap. this isn't crypto quality, but it will be Good Enough */
time_now = apr_time_now();
srand((unsigned int)(((time_now >> 32) ^ time_now) & 0xffffffff));
return rand() & 0x0FFFF;
}
static void init_state(void)
{
uuid_state_seqnum = true_random();
get_pseudo_node_identifier(uuid_state_node);
}
static void get_current_time(apr_uint64_t *timestamp)
{
/* ### this needs to be made thread-safe! */
apr_uint64_t time_now;
static apr_uint64_t time_last = 0;
static apr_uint64_t fudge = 0;
get_system_time(&time_now);
/* if clock reading changed since last UUID generated... */
if (time_last != time_now) {
/* The clock reading has changed since the last UUID was generated.
Reset the fudge factor. if we are generating them too fast, then
the fudge may need to be reset to something greater than zero. */
if (time_last + fudge > time_now)
fudge = time_last + fudge - time_now + 1;
else
fudge = 0;
time_last = time_now;
}
else {
/* We generated two really fast. Bump the fudge factor. */
++fudge;
}
*timestamp = time_now + fudge;
}
APU_DECLARE(void) apr_uuid_get(apr_uuid_t *uuid)
{
apr_uint64_t timestamp;
unsigned char *d = uuid->data;
#if APR_HAS_OS_UUID
if (apr_os_uuid_get(d) == APR_SUCCESS) {
return;
}
#endif /* !APR_HAS_OS_UUID */
if (!uuid_state_node[0])
init_state();
get_current_time(&timestamp);
/* time_low, uint32 */
d[3] = (unsigned char)timestamp;
d[2] = (unsigned char)(timestamp >> 8);
d[1] = (unsigned char)(timestamp >> 16);
d[0] = (unsigned char)(timestamp >> 24);
/* time_mid, uint16 */
d[5] = (unsigned char)(timestamp >> 32);
d[4] = (unsigned char)(timestamp >> 40);
/* time_hi_and_version, uint16 */
d[7] = (unsigned char)(timestamp >> 48);
d[6] = (unsigned char)(((timestamp >> 56) & 0x0F) | 0x10);
/* clock_seq_hi_and_reserved, uint8 */
d[8] = (unsigned char)(((uuid_state_seqnum >> 8) & 0x3F) | 0x80);
/* clock_seq_low, uint8 */
d[9] = (unsigned char)uuid_state_seqnum;
/* node, byte[6] */
memcpy(&d[10], uuid_state_node, NODE_LENGTH);
}

130
crypto/uuid.c Normal file
View File

@ -0,0 +1,130 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <stdio.h> /* for sprintf */
#include "apr.h"
#include "apr_uuid.h"
#include "apr_errno.h"
#include "apr_lib.h"
APU_DECLARE(void) apr_uuid_format(char *buffer, const apr_uuid_t *uuid)
{
const unsigned char *d = uuid->data;
sprintf(buffer,
"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7],
d[8], d[9], d[10], d[11], d[12], d[13], d[14], d[15]);
}
/* convert a pair of hex digits to an integer value [0,255] */
#if 'A' == 65
static unsigned char parse_hexpair(const char *s)
{
int result;
int temp;
result = s[0] - '0';
if (result > 48)
result = (result - 39) << 4;
else if (result > 16)
result = (result - 7) << 4;
else
result = result << 4;
temp = s[1] - '0';
if (temp > 48)
result |= temp - 39;
else if (temp > 16)
result |= temp - 7;
else
result |= temp;
return (unsigned char)result;
}
#else
static unsigned char parse_hexpair(const char *s)
{
int result;
if (isdigit(*s)) {
result = (*s - '0') << 4;
}
else {
if (isupper(*s)) {
result = (*s - 'A' + 10) << 4;
}
else {
result = (*s - 'a' + 10) << 4;
}
}
++s;
if (isdigit(*s)) {
result |= (*s - '0');
}
else {
if (isupper(*s)) {
result |= (*s - 'A' + 10);
}
else {
result |= (*s - 'a' + 10);
}
}
return (unsigned char)result;
}
#endif
APU_DECLARE(apr_status_t) apr_uuid_parse(apr_uuid_t *uuid,
const char *uuid_str)
{
int i;
unsigned char *d = uuid->data;
for (i = 0; i < 36; ++i) {
char c = uuid_str[i];
if (!apr_isxdigit(c) &&
!(c == '-' && (i == 8 || i == 13 || i == 18 || i == 23)))
/* ### need a better value */
return APR_BADARG;
}
if (uuid_str[36] != '\0') {
/* ### need a better value */
return APR_BADARG;
}
d[0] = parse_hexpair(&uuid_str[0]);
d[1] = parse_hexpair(&uuid_str[2]);
d[2] = parse_hexpair(&uuid_str[4]);
d[3] = parse_hexpair(&uuid_str[6]);
d[4] = parse_hexpair(&uuid_str[9]);
d[5] = parse_hexpair(&uuid_str[11]);
d[6] = parse_hexpair(&uuid_str[14]);
d[7] = parse_hexpair(&uuid_str[16]);
d[8] = parse_hexpair(&uuid_str[19]);
d[9] = parse_hexpair(&uuid_str[21]);
for (i = 6; i--;)
d[10 + i] = parse_hexpair(&uuid_str[i*2+24]);
return APR_SUCCESS;
}

296
dbd/NWGNUdbdfreetds Normal file
View File

@ -0,0 +1,296 @@
#
# Declare the sub-directories to be built here
#
SUBDIRS = \
$(EOLIST)
#
# Get the 'head' of the build environment. This includes default targets and
# paths to tools
#
ifndef EnvironmentDefined
include $(APR_WORK)/build/NWGNUhead.inc
endif
#include $(APR)\build\NWGNUcustom.inc
#
# build this level's files
#
# Make sure all needed macro's are defined
#
# LINK_STATIC = 1
# for now defined here - should finally go into build/NWGNUenvironment.inc
FREETDS_INC = $(FREETDSSDK)/include
FREETDS_IMP = $(FREETDSSDK)/lib/libfreetds.imp
FREETDS_LIB = $(FREETDSSDK)/lib/libfreetds.lib
FREETDS_NLM = libfreetds
#
# These directories will be at the beginning of the include list, followed by
# INCDIRS
#
XINCDIRS += \
$(APR)/include/arch/netware \
$(APR)/include \
$(APU)/include \
$(APU)/include/private \
$(APR) \
$(FREETDS_INC) \
$(EOLIST)
#
# These flags will come after CFLAGS
#
XCFLAGS += \
$(EOLIST)
#
# These defines will come after DEFINES
#
XDEFINES += \
-DAPU_HAVE_FREETDS=1 \
-DAPU_DSO_MODULE_BUILD \
$(EOLIST)
#
# These flags will be added to the link.opt file
#
XLFLAGS += \
$(EOLIST)
ifdef LINK_STATIC
XLFLAGS += \
-l $(FREETDSSDK)/lib \
$(EOLIST)
endif
#
# These values will be appended to the correct variables based on the value of
# RELEASE
#
ifeq "$(RELEASE)" "debug"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
ifeq "$(RELEASE)" "noopt"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
ifeq "$(RELEASE)" "release"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
#
# These are used by the link target if an NLM is being generated
# This is used by the link 'name' directive to name the nlm. If left blank
# TARGET_nlm (see below) will be used.
#
NLM_NAME = dbdfreetds
#
# This is used by the link '-desc ' directive.
# If left blank, NLM_NAME will be used.
#
NLM_DESCRIPTION = Apache Portability Runtime Library $(VERSION_STR) DBD FreeTDS Driver Module
#
# This is used by the '-threadname' directive. If left blank,
# NLM_NAME Thread will be used.
#
NLM_THREAD_NAME = dbdfreetds
#
# If this is specified, it will override VERSION value in
# $(AP_WORK)\build\NWGNUenvironment.inc
#
NLM_VERSION =
#
# If this is specified, it will override the default of 64K
#
NLM_STACK_SIZE = 8192
#
# If this is specified it will be used by the link '-entry' directive
#
NLM_ENTRY_SYM =
#
# If this is specified it will be used by the link '-exit' directive
#
NLM_EXIT_SYM =
#
# If this is specified it will be used by the link '-check' directive
#
NLM_CHECK_SYM =
#
# If these are specified it will be used by the link '-flags' directive
#
NLM_FLAGS =
#
# If this is specified it will be linked in with the XDCData option in the def
# file instead of the default of $(NWOS)/apache.xdc. XDCData can be disabled
# by setting APACHE_UNIPROC in the environment
#
XDCDATA =
#
# If there is an NLM target, put it here
#
TARGET_nlm = \
$(OBJDIR)\$(NLM_NAME).nlm \
$(EOLIST)
#
# If there is an LIB target, put it here
#
TARGET_lib = \
$(EOLIST)
#
# These are the OBJ files needed to create the NLM target above.
# Paths must all use the '/' character
#
FILES_nlm_objs = \
$(OBJDIR)/apr_dbd_freetds.o \
$(EOLIST)
#
# These are the LIB files needed to create the NLM target above.
# These will be added as a library command in the link.opt file.
#
FILES_nlm_libs = \
$(PRELUDE) \
$(EOLIST)
ifeq ($(LINK_STATIC),1)
FILES_nlm_libs += \
$(FREETDS_LIB) \
$(EOLIST)
endif
#
# These are the modules that the above NLM target depends on to load.
# These will be added as a module command in the link.opt file.
#
FILES_nlm_modules = \
aprlib \
libc \
$(EOLIST)
ifneq ($(LINK_STATIC),1)
FILES_nlm_modules += \
$(FREETDS_NLM) \
$(EOLIST)
endif
#
# If the nlm has a msg file, put it's path here
#
FILE_nlm_msg =
#
# If the nlm has a hlp file put it's path here
#
FILE_nlm_hlp =
#
# If this is specified, it will override $(NWOS)\copyright.txt.
#
FILE_nlm_copyright =
#
# Any additional imports go here
#
FILES_nlm_Ximports = \
@$(APR)/aprlib.imp \
@libc.imp \
$(EOLIST)
ifneq ($(LINK_STATIC),1)
FILES_nlm_Ximports += \
@$(FREETDS_IMP) \
$(EOLIST)
endif
#
# Any symbols exported to here
#
FILES_nlm_exports = \
apr_dbd_freetds_driver \
$(EOLIST)
#
# These are the OBJ files needed to create the LIB target above.
# Paths must all use the '/' character
#
FILES_lib_objs = \
$(EOLIST)
#
# implement targets and dependancies (leave this section alone)
#
libs :: $(OBJDIR) $(TARGET_lib)
nlms :: libs $(TARGET_nlm)
#
# Updated this target to create necessary directories and copy files to the
# correct place. (See $(AP_WORK)\build\NWGNUhead.inc for examples)
#
install :: nlms FORCE
#
# Any specialized rules here
#
#
# Include the 'tail' makefile that has targets that depend on variables defined
# in this makefile
#
include $(APRBUILD)/NWGNUtail.inc

292
dbd/NWGNUdbdmysql Normal file
View File

@ -0,0 +1,292 @@
#
# Declare the sub-directories to be built here
#
SUBDIRS = \
$(EOLIST)
#
# Get the 'head' of the build environment. This includes default targets and
# paths to tools
#
ifndef EnvironmentDefined
include $(APR_WORK)/build/NWGNUhead.inc
endif
#include $(APR)\build\NWGNUcustom.inc
#
# build this level's files
#
# Make sure all needed macro's are defined
#
# LINK_STATIC = 1
# for now defined here - should finally go into build/NWGNUenvironment.inc
MYSQL_INC = $(MYSQLSDK)/include
MYSQL_IMP = libmysql.imp
MYSQL_LIB = libmysqlclient_r.lib libz.lib
MYSQL_NLM = libmysql
#
# These directories will be at the beginning of the include list, followed by
# INCDIRS
#
XINCDIRS += \
$(APR)/include/arch/netware \
$(APR)/include \
$(APU)/include \
$(APU)/include/private \
$(APR) \
$(MYSQL_INC) \
$(EOLIST)
#
# These flags will come after CFLAGS
#
XCFLAGS += \
$(EOLIST)
#
# These defines will come after DEFINES
#
XDEFINES += \
-DAPU_DSO_MODULE_BUILD \
-DAPU_HAVE_MYSQL=1 \
-DHAVE_MYSQL_H \
$(EOLIST)
#
# These flags will be added to the link.opt file
#
XLFLAGS += \
-l $(MYSQLSDK)/lib \
$(EOLIST)
#
# These values will be appended to the correct variables based on the value of
# RELEASE
#
ifeq "$(RELEASE)" "debug"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
ifeq "$(RELEASE)" "noopt"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
ifeq "$(RELEASE)" "release"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
#
# These are used by the link target if an NLM is being generated
# This is used by the link 'name' directive to name the nlm. If left blank
# TARGET_nlm (see below) will be used.
#
NLM_NAME = dbdmysql
#
# This is used by the link '-desc ' directive.
# If left blank, NLM_NAME will be used.
#
NLM_DESCRIPTION = Apache Portability Runtime Library $(VERSION_STR) DBD MySQL Driver Module
#
# This is used by the '-threadname' directive. If left blank,
# NLM_NAME Thread will be used.
#
NLM_THREAD_NAME = dbdmysql
#
# If this is specified, it will override VERSION value in
# $(AP_WORK)\build\NWGNUenvironment.inc
#
NLM_VERSION =
#
# If this is specified, it will override the default of 64K
#
NLM_STACK_SIZE = 8192
#
# If this is specified it will be used by the link '-entry' directive
#
NLM_ENTRY_SYM =
#
# If this is specified it will be used by the link '-exit' directive
#
NLM_EXIT_SYM =
#
# If this is specified it will be used by the link '-check' directive
#
NLM_CHECK_SYM =
#
# If these are specified it will be used by the link '-flags' directive
#
NLM_FLAGS =
#
# If this is specified it will be linked in with the XDCData option in the def
# file instead of the default of $(NWOS)/apache.xdc. XDCData can be disabled
# by setting APACHE_UNIPROC in the environment
#
XDCDATA =
#
# If there is an NLM target, put it here
#
TARGET_nlm = \
$(OBJDIR)/$(NLM_NAME).nlm \
$(EOLIST)
#
# If there is an LIB target, put it here
#
TARGET_lib = \
$(EOLIST)
#
# These are the OBJ files needed to create the NLM target above.
# Paths must all use the '/' character
#
FILES_nlm_objs = \
$(OBJDIR)/apr_dbd_mysql.o \
$(EOLIST)
#
# These are the LIB files needed to create the NLM target above.
# These will be added as a library command in the link.opt file.
#
FILES_nlm_libs = \
$(PRELUDE) \
$(EOLIST)
ifeq ($(LINK_STATIC),1)
FILES_nlm_libs += \
$(MYSQL_LIB) \
$(EOLIST)
endif
#
# These are the modules that the above NLM target depends on to load.
# These will be added as a module command in the link.opt file.
#
FILES_nlm_modules = \
aprlib \
libc \
$(EOLIST)
ifneq ($(LINK_STATIC),1)
FILES_nlm_modules += \
$(MYSQL_NLM) \
$(EOLIST)
endif
#
# If the nlm has a msg file, put it's path here
#
FILE_nlm_msg =
#
# If the nlm has a hlp file put it's path here
#
FILE_nlm_hlp =
#
# If this is specified, it will override $(NWOS)\copyright.txt.
#
FILE_nlm_copyright =
#
# Any additional imports go here
#
FILES_nlm_Ximports = \
@aprlib.imp \
@libc.imp \
$(EOLIST)
ifneq ($(LINK_STATIC),1)
FILES_nlm_Ximports += \
@$(MYSQL_IMP) \
$(EOLIST)
endif
#
# Any symbols exported to here
#
FILES_nlm_exports = \
apr_dbd_mysql_driver \
$(EOLIST)
#
# These are the OBJ files needed to create the LIB target above.
# Paths must all use the '/' character
#
FILES_lib_objs = \
$(EOLIST)
#
# implement targets and dependancies (leave this section alone)
#
libs :: $(OBJDIR) $(TARGET_lib)
nlms :: libs $(TARGET_nlm)
#
# Updated this target to create necessary directories and copy files to the
# correct place. (See $(AP_WORK)\build\NWGNUhead.inc for examples)
#
install :: nlms FORCE
#
# Any specialized rules here
#
#
# Include the 'tail' makefile that has targets that depend on variables defined
# in this makefile
#
include $(APRBUILD)/NWGNUtail.inc

301
dbd/NWGNUdbdpgsql Normal file
View File

@ -0,0 +1,301 @@
#
# Declare the sub-directories to be built here
#
SUBDIRS = \
$(EOLIST)
#
# Get the 'head' of the build environment. This includes default targets and
# paths to tools
#
ifndef EnvironmentDefined
include $(APR_WORK)/build/NWGNUhead.inc
endif
#include $(APR)\build\NWGNUcustom.inc
#
# build this level's files
#
# Make sure all needed macro's are defined
#
# LINK_STATIC = 1
# for now defined here - should finally go into build/NWGNUenvironment.inc
PGSQL_INC = $(PGSQLSDK)/inc
PGSQL_IMP = libpq.imp
PGSQL_LIB = libpq.lib
PGSQL_NLM = libpq
#
# These directories will be at the beginning of the include list, followed by
# INCDIRS
#
XINCDIRS += \
$(APR)/include/arch/netware \
$(APR)/include \
$(APU)/include \
$(APU)/include/private \
$(APR) \
$(PGSQL_INC) \
$(EOLIST)
#
# These flags will come after CFLAGS
#
XCFLAGS += \
$(EOLIST)
#
# These defines will come after DEFINES
#
XDEFINES += \
-DAPU_DSO_MODULE_BUILD \
-DAPU_HAVE_PGSQL=1 \
-DHAVE_LIBPQ_FE_H \
$(EOLIST)
#
# These flags will be added to the link.opt file
#
XLFLAGS += \
$(EOLIST)
ifdef LINK_STATIC
XLFLAGS += \
-l $(PGSQLSDK)/lib \
$(EOLIST)
else
XLFLAGS += \
-l $(PGSQLSDK)/imp \
$(EOLIST)
endif
#
# These values will be appended to the correct variables based on the value of
# RELEASE
#
ifeq "$(RELEASE)" "debug"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
ifeq "$(RELEASE)" "noopt"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
ifeq "$(RELEASE)" "release"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
#
# These are used by the link target if an NLM is being generated
# This is used by the link 'name' directive to name the nlm. If left blank
# TARGET_nlm (see below) will be used.
#
NLM_NAME = dbdpgsql
#
# This is used by the link '-desc ' directive.
# If left blank, NLM_NAME will be used.
#
NLM_DESCRIPTION = Apache Portability Runtime Library $(VERSION_STR) DBD PostgreSQL Driver Module
#
# This is used by the '-threadname' directive. If left blank,
# NLM_NAME Thread will be used.
#
NLM_THREAD_NAME = dbdpgsql
#
# If this is specified, it will override VERSION value in
# $(AP_WORK)\build\NWGNUenvironment.inc
#
NLM_VERSION =
#
# If this is specified, it will override the default of 64K
#
NLM_STACK_SIZE = 8192
#
# If this is specified it will be used by the link '-entry' directive
#
NLM_ENTRY_SYM =
#
# If this is specified it will be used by the link '-exit' directive
#
NLM_EXIT_SYM =
#
# If this is specified it will be used by the link '-check' directive
#
NLM_CHECK_SYM =
#
# If these are specified it will be used by the link '-flags' directive
#
NLM_FLAGS =
#
# If this is specified it will be linked in with the XDCData option in the def
# file instead of the default of $(NWOS)/apache.xdc. XDCData can be disabled
# by setting APACHE_UNIPROC in the environment
#
XDCDATA =
#
# If there is an NLM target, put it here
#
TARGET_nlm = \
$(OBJDIR)/$(NLM_NAME).nlm \
$(EOLIST)
#
# If there is an LIB target, put it here
#
TARGET_lib = \
$(EOLIST)
#
# These are the OBJ files needed to create the NLM target above.
# Paths must all use the '/' character
#
FILES_nlm_objs = \
$(OBJDIR)/apr_dbd_pgsql.o \
$(EOLIST)
#
# These are the LIB files needed to create the NLM target above.
# These will be added as a library command in the link.opt file.
#
FILES_nlm_libs = \
$(PRELUDE) \
$(EOLIST)
ifeq ($(LINK_STATIC),1)
FILES_nlm_libs += \
$(PGSQL_LIB) \
$(EOLIST)
endif
#
# These are the modules that the above NLM target depends on to load.
# These will be added as a module command in the link.opt file.
#
FILES_nlm_modules = \
aprlib \
libc \
$(EOLIST)
ifneq ($(LINK_STATIC),1)
FILES_nlm_modules += \
$(PGSQL_NLM) \
$(EOLIST)
endif
#
# If the nlm has a msg file, put it's path here
#
FILE_nlm_msg =
#
# If the nlm has a hlp file put it's path here
#
FILE_nlm_hlp =
#
# If this is specified, it will override $(NWOS)\copyright.txt.
#
FILE_nlm_copyright =
#
# Any additional imports go here
#
FILES_nlm_Ximports = \
@aprlib.imp \
@libc.imp \
$(EOLIST)
ifneq ($(LINK_STATIC),1)
FILES_nlm_Ximports += \
@$(PGSQL_IMP) \
$(EOLIST)
endif
#
# Any symbols exported to here
#
FILES_nlm_exports = \
apr_dbd_pgsql_driver \
$(EOLIST)
#
# These are the OBJ files needed to create the LIB target above.
# Paths must all use the '/' character
#
FILES_lib_objs = \
$(EOLIST)
#
# implement targets and dependancies (leave this section alone)
#
libs :: $(OBJDIR) $(TARGET_lib)
nlms :: libs $(TARGET_nlm)
#
# Updated this target to create necessary directories and copy files to the
# correct place. (See $(AP_WORK)\build\NWGNUhead.inc for examples)
#
install :: nlms FORCE
#
# Any specialized rules here
#
#
# Include the 'tail' makefile that has targets that depend on variables defined
# in this makefile
#
include $(APRBUILD)/NWGNUtail.inc

296
dbd/NWGNUdbdsqli2 Normal file
View File

@ -0,0 +1,296 @@
#
# Declare the sub-directories to be built here
#
SUBDIRS = \
$(EOLIST)
#
# Get the 'head' of the build environment. This includes default targets and
# paths to tools
#
ifndef EnvironmentDefined
include $(APR_WORK)/build/NWGNUhead.inc
endif
#include $(APR)\build\NWGNUcustom.inc
#
# build this level's files
#
# Make sure all needed macro's are defined
#
# LINK_STATIC = 1
# for now defined here - should finally go into build/NWGNUenvironment.inc
SQLITE2_INC = $(SQLITE2SDK)/src
SQLITE2_IMP = $(SQLITE2SDK)/lsqlite2.imp
SQLITE2_LIB = $(SQLITE2SDK)/lsqlite2.lib
SQLITE2_NLM = lsqlite2
#
# These directories will be at the beginning of the include list, followed by
# INCDIRS
#
XINCDIRS += \
$(APR)/include/arch/netware \
$(APR)/include \
$(APU)/include \
$(APU)/include/private \
$(APR) \
$(SQLITE2_INC) \
$(EOLIST)
#
# These flags will come after CFLAGS
#
XCFLAGS += \
$(EOLIST)
#
# These defines will come after DEFINES
#
XDEFINES += \
-DAPU_DSO_MODULE_BUILD \
-DAPU_HAVE_SQLITE2=1 \
$(EOLIST)
#
# These flags will be added to the link.opt file
#
XLFLAGS += \
$(EOLIST)
ifdef LINK_STATIC
XLFLAGS += \
-l $(SQLITE2SDK) \
$(EOLIST)
endif
#
# These values will be appended to the correct variables based on the value of
# RELEASE
#
ifeq "$(RELEASE)" "debug"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
ifeq "$(RELEASE)" "noopt"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
ifeq "$(RELEASE)" "release"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
#
# These are used by the link target if an NLM is being generated
# This is used by the link 'name' directive to name the nlm. If left blank
# TARGET_nlm (see below) will be used.
#
NLM_NAME = dbdsqli2
#
# This is used by the link '-desc ' directive.
# If left blank, NLM_NAME will be used.
#
NLM_DESCRIPTION = Apache Portability Runtime Library $(VERSION_STR) DBD SQLite2 Driver Module
#
# This is used by the '-threadname' directive. If left blank,
# NLM_NAME Thread will be used.
#
NLM_THREAD_NAME = dbdsqli2
#
# If this is specified, it will override VERSION value in
# $(AP_WORK)\build\NWGNUenvironment.inc
#
NLM_VERSION =
#
# If this is specified, it will override the default of 64K
#
NLM_STACK_SIZE = 8192
#
# If this is specified it will be used by the link '-entry' directive
#
NLM_ENTRY_SYM =
#
# If this is specified it will be used by the link '-exit' directive
#
NLM_EXIT_SYM =
#
# If this is specified it will be used by the link '-check' directive
#
NLM_CHECK_SYM =
#
# If these are specified it will be used by the link '-flags' directive
#
NLM_FLAGS =
#
# If this is specified it will be linked in with the XDCData option in the def
# file instead of the default of $(NWOS)/apache.xdc. XDCData can be disabled
# by setting APACHE_UNIPROC in the environment
#
XDCDATA =
#
# If there is an NLM target, put it here
#
TARGET_nlm = \
$(OBJDIR)\$(NLM_NAME).nlm \
$(EOLIST)
#
# If there is an LIB target, put it here
#
TARGET_lib = \
$(EOLIST)
#
# These are the OBJ files needed to create the NLM target above.
# Paths must all use the '/' character
#
FILES_nlm_objs = \
$(OBJDIR)/apr_dbd_sqlite2.o \
$(EOLIST)
#
# These are the LIB files needed to create the NLM target above.
# These will be added as a library command in the link.opt file.
#
FILES_nlm_libs = \
$(PRELUDE) \
$(EOLIST)
ifeq ($(LINK_STATIC),1)
FILES_nlm_libs += \
$(SQLITE2_LIB) \
$(EOLIST)
endif
#
# These are the modules that the above NLM target depends on to load.
# These will be added as a module command in the link.opt file.
#
FILES_nlm_modules = \
aprlib \
libc \
$(EOLIST)
ifneq ($(LINK_STATIC),1)
FILES_nlm_modules += \
$(SQLITE2_NLM) \
$(EOLIST)
endif
#
# If the nlm has a msg file, put it's path here
#
FILE_nlm_msg =
#
# If the nlm has a hlp file put it's path here
#
FILE_nlm_hlp =
#
# If this is specified, it will override $(NWOS)\copyright.txt.
#
FILE_nlm_copyright =
#
# Any additional imports go here
#
FILES_nlm_Ximports = \
@$(APR)/aprlib.imp \
@libc.imp \
$(EOLIST)
ifneq ($(LINK_STATIC),1)
FILES_nlm_Ximports += \
@$(SQLITE2_IMP) \
$(EOLIST)
endif
#
# Any symbols exported to here
#
FILES_nlm_exports = \
apr_dbd_sqlite2_driver \
$(EOLIST)
#
# These are the OBJ files needed to create the LIB target above.
# Paths must all use the '/' character
#
FILES_lib_objs = \
$(EOLIST)
#
# implement targets and dependancies (leave this section alone)
#
libs :: $(OBJDIR) $(TARGET_lib)
nlms :: libs $(TARGET_nlm)
#
# Updated this target to create necessary directories and copy files to the
# correct place. (See $(AP_WORK)\build\NWGNUhead.inc for examples)
#
install :: nlms FORCE
#
# Any specialized rules here
#
#
# Include the 'tail' makefile that has targets that depend on variables defined
# in this makefile
#
include $(APRBUILD)/NWGNUtail.inc

298
dbd/NWGNUdbdsqli3 Normal file
View File

@ -0,0 +1,298 @@
#
# Declare the sub-directories to be built here
#
SUBDIRS = \
$(EOLIST)
#
# Get the 'head' of the build environment. This includes default targets and
# paths to tools
#
ifndef EnvironmentDefined
include $(APR_WORK)/build/NWGNUhead.inc
endif
#include $(APR)\build\NWGNUcustom.inc
#
# build this level's files
#
# Make sure all needed macro's are defined
#
# LINK_STATIC = 1
# for now defined here - should finally go into build/NWGNUenvironment.inc
SQLITE3_INC = $(SQLITE3SDK)/src
SQLITE3_IMP = $(SQLITE3SDK)/lsqlite3.imp
SQLITE3_LIB = $(SQLITE3SDK)/lsqlite3.lib
SQLITE3_NLM = lsqlite3
#
# These directories will be at the beginning of the include list, followed by
# INCDIRS
#
XINCDIRS += \
$(APR)/include/arch/netware \
$(APR)/include \
$(APU)/include \
$(APU)/include/private \
$(APR) \
$(SQLITE3_INC) \
$(EOLIST)
#
# These flags will come after CFLAGS
#
XCFLAGS += \
$(EOLIST)
#
# These defines will come after DEFINES
#
XDEFINES += \
-DAPU_DSO_MODULE_BUILD \
-DAPU_HAVE_SQLITE3=1 \
$(EOLIST)
#
# These flags will be added to the link.opt file
#
XLFLAGS += \
$(EOLIST)
ifdef LINK_STATIC
XLFLAGS += \
-l $(SQLITE3SDK) \
$(EOLIST)
endif
#
# These values will be appended to the correct variables based on the value of
# RELEASE
#
ifeq "$(RELEASE)" "debug"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
ifeq "$(RELEASE)" "noopt"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
ifeq "$(RELEASE)" "release"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
#
# These are used by the link target if an NLM is being generated
# This is used by the link 'name' directive to name the nlm. If left blank
# TARGET_nlm (see below) will be used.
#
NLM_NAME = dbdsqli3
#
# This is used by the link '-desc ' directive.
# If left blank, NLM_NAME will be used.
#
NLM_DESCRIPTION = Apache Portability Runtime Library $(VERSION_STR) DBD SQLite3 Driver Module
#
# This is used by the '-threadname' directive. If left blank,
# NLM_NAME Thread will be used.
#
NLM_THREAD_NAME = dbdsqli3
#
# If this is specified, it will override VERSION value in
# $(AP_WORK)\build\NWGNUenvironment.inc
#
NLM_VERSION =
#
# If this is specified, it will override the default of 64K
#
NLM_STACK_SIZE = 8192
#
# If this is specified it will be used by the link '-entry' directive
#
NLM_ENTRY_SYM =
#
# If this is specified it will be used by the link '-exit' directive
#
NLM_EXIT_SYM =
#
# If this is specified it will be used by the link '-check' directive
#
NLM_CHECK_SYM =
#
# If these are specified it will be used by the link '-flags' directive
#
NLM_FLAGS =
#
# If this is specified it will be linked in with the XDCData option in the def
# file instead of the default of $(NWOS)/apache.xdc. XDCData can be disabled
# by setting APACHE_UNIPROC in the environment
#
XDCDATA =
#
# If there is an NLM target, put it here
#
TARGET_nlm = \
$(OBJDIR)\$(NLM_NAME).nlm \
$(EOLIST)
#
# If there is an LIB target, put it here
#
TARGET_lib = \
$(EOLIST)
#
# These are the OBJ files needed to create the NLM target above.
# Paths must all use the '/' character
#
FILES_nlm_objs = \
$(OBJDIR)/apr_dbd_sqlite3.o \
$(EOLIST)
#
# These are the LIB files needed to create the NLM target above.
# These will be added as a library command in the link.opt file.
#
FILES_nlm_libs = \
$(PRELUDE) \
$(EOLIST)
ifeq ($(LINK_STATIC),1)
FILES_nlm_libs += \
$(SQLITE3_LIB) \
$(EOLIST)
endif
#
# These are the modules that the above NLM target depends on to load.
# These will be added as a module command in the link.opt file.
#
FILES_nlm_modules = \
aprlib \
libc \
$(EOLIST)
ifneq ($(LINK_STATIC),1)
FILES_nlm_modules += \
$(SQLITE3_NLM) \
$(EOLIST)
endif
#
# If the nlm has a msg file, put it's path here
#
FILE_nlm_msg =
#
# If the nlm has a hlp file put it's path here
#
FILE_nlm_hlp =
#
# If this is specified, it will override $(NWOS)\copyright.txt.
#
FILE_nlm_copyright =
#
# Any additional imports go here
#
FILES_nlm_Ximports = \
@$(APR)/aprlib.imp \
@libc.imp \
apr_dbd_mutex_lock \
apr_dbd_mutex_unlock \
$(EOLIST)
ifneq ($(LINK_STATIC),1)
FILES_nlm_Ximports += \
@$(SQLITE3_IMP) \
$(EOLIST)
endif
#
# Any symbols exported to here
#
FILES_nlm_exports = \
apr_dbd_sqlite3_driver \
$(EOLIST)
#
# These are the OBJ files needed to create the LIB target above.
# Paths must all use the '/' character
#
FILES_lib_objs = \
$(EOLIST)
#
# implement targets and dependancies (leave this section alone)
#
libs :: $(OBJDIR) $(TARGET_lib)
nlms :: libs $(TARGET_nlm)
#
# Updated this target to create necessary directories and copy files to the
# correct place. (See $(AP_WORK)\build\NWGNUhead.inc for examples)
#
install :: nlms FORCE
#
# Any specialized rules here
#
#
# Include the 'tail' makefile that has targets that depend on variables defined
# in this makefile
#
include $(APRBUILD)/NWGNUtail.inc

262
dbd/NWGNUmakefile Normal file
View File

@ -0,0 +1,262 @@
#
# Declare the sub-directories to be built here
#
SUBDIRS = \
$(EOLIST)
#
# Get the 'head' of the build environment. This includes default targets and
# paths to tools
#
include $(APR_WORK)/build/NWGNUhead.inc
#
# build this level's files
#
# Make sure all needed macro's are defined
#
#
# These directories will be at the beginning of the include list, followed by
# INCDIRS
#
XINCDIRS += \
$(EOLIST)
#
# These flags will come after CFLAGS
#
XCFLAGS += \
$(EOLIST)
#
# These defines will come after DEFINES
#
XDEFINES += \
$(EOLIST)
#
# These flags will be added to the link.opt file
#
XLFLAGS += \
$(EOLIST)
#
# These values will be appended to the correct variables based on the value of
# RELEASE
#
ifeq "$(RELEASE)" "debug"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
ifeq "$(RELEASE)" "noopt"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
ifeq "$(RELEASE)" "release"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
#
# These are used by the link target if an NLM is being generated
# This is used by the link 'name' directive to name the nlm. If left blank
# TARGET_nlm (see below) will be used.
#
NLM_NAME =
#
# This is used by the link '-desc ' directive.
# If left blank, NLM_NAME will be used.
#
NLM_DESCRIPTION =
#
# This is used by the '-threadname' directive. If left blank,
# NLM_NAME Thread will be used.
#
NLM_THREAD_NAME =
#
# If this is specified, it will override VERSION value in
# $(AP_WORK)\build\NWGNUenvironment.inc
#
NLM_VERSION =
#
# If this is specified, it will override the default of 64K
#
NLM_STACK_SIZE =
#
# If this is specified it will be used by the link '-entry' directive
#
NLM_ENTRY_SYM =
#
# If this is specified it will be used by the link '-exit' directive
#
NLM_EXIT_SYM =
#
# If this is specified it will be used by the link '-check' directive
#
NLM_CHECK_SYM =
#
# If these are specified it will be used by the link '-flags' directive
#
NLM_FLAGS =
#
# If this is specified it will be linked in with the XDCData option in the def
# file instead of the default of $(NWOS)/apache.xdc. XDCData can be disabled
# by setting APACHE_UNIPROC in the environment
#
XDCDATA =
#
# If there is an NLM target, put it here
#
TARGET_nlm = \
$(EOLIST)
ifeq "$(APU_HAVE_MYSQL)" "1"
ifeq "$(wildcard apr_dbd_mysql.c)" "apr_dbd_mysql.c"
TARGET_nlm += $(OBJDIR)/dbdmysql.nlm $(OBJDIR)/dbdmysql.nlm $(EOLIST)
endif
endif
ifeq "$(APU_HAVE_PGSQL)" "1"
TARGET_nlm += $(OBJDIR)/dbdpgsql.nlm $(OBJDIR)/dbdpgsql.nlm $(EOLIST)
endif
ifeq "$(APU_HAVE_SQLITE2)" "1"
TARGET_nlm += $(OBJDIR)/dbdsqli2.nlm $(OBJDIR)/dbdsqli2.nlm $(EOLIST)
endif
ifeq "$(APU_HAVE_SQLITE3)" "1"
TARGET_nlm += $(OBJDIR)/dbdsqli3.nlm $(OBJDIR)/dbdsqli3.nlm $(EOLIST)
endif
ifeq "$(APU_HAVE_FREETDS)" "1"
TARGET_nlm += $(OBJDIR)/dbdfreetds.nlm $(OBJDIR)/dbdfreetds.nlm $(EOLIST)
endif
#
# If there is an LIB target, put it here
#
TARGET_lib = \
$(EOLIST)
#
# These are the OBJ files needed to create the NLM target above.
# Paths must all use the '/' character
#
FILES_nlm_objs = \
$(EOLIST)
#
# These are the LIB files needed to create the NLM target above.
# These will be added as a library command in the link.opt file.
#
FILES_nlm_libs = \
$(EOLIST)
#
# These are the modules that the above NLM target depends on to load.
# These will be added as a module command in the link.opt file.
#
FILES_nlm_modules = \
$(EOLIST)
#
# If the nlm has a msg file, put it's path here
#
FILE_nlm_msg =
#
# If the nlm has a hlp file put it's path here
#
FILE_nlm_hlp =
#
# If this is specified, it will override $(NWOS)\copyright.txt.
#
FILE_nlm_copyright =
#
# Any additional imports go here
#
FILES_nlm_Ximports = \
$(EOLIST)
#
# Any symbols exported to here
#
FILES_nlm_exports = \
$(EOLIST)
#
# These are the OBJ files needed to create the LIB target above.
# Paths must all use the '/' character
#
FILES_lib_objs = \
$(EOLIST)
#
# implement targets and dependancies (leave this section alone)
#
libs :: $(OBJDIR) $(TARGET_lib)
nlms :: libs $(TARGET_nlm)
#
# Updated this target to create necessary directories and copy files to the
# correct place. (See $(AP_WORK)\build\NWGNUhead.inc for examples)
#
install :: nlms $(INSTDIRS) FORCE
$(call COPY,$(OBJDIR)/*.nlm,$(INSTALLBASE))
#
# Any specialized rules here
#
#
# Include the 'tail' makefile that has targets that depend on variables defined
# in this makefile
#
include $(APRBUILD)/NWGNUtail.inc

574
dbd/apr_dbd.c Normal file
View File

@ -0,0 +1,574 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <ctype.h>
#include <stdio.h>
#include "apu_config.h"
#include "apu.h"
#include "apr_pools.h"
#include "apr_dso.h"
#include "apr_strings.h"
#include "apr_hash.h"
#include "apr_thread_mutex.h"
#include "apr_lib.h"
#include "apr_atomic.h"
#include "apu_internal.h"
#include "apr_dbd_internal.h"
#include "apr_dbd.h"
#include "apu_version.h"
static apr_hash_t *drivers = NULL;
static apr_uint32_t initialised = 0, in_init = 1;
#define CLEANUP_CAST (apr_status_t (*)(void*))
#if APR_HAS_THREADS
/* deprecated, but required for existing providers. Existing and new
* providers should be refactored to use a provider-specific mutex so
* that different providers do not block one another.
* In APR 1.3 this is no longer used for dso module loading, and
* apu_dso_mutex_[un]lock is used instead.
* In APR 2.0 this should become entirely local to libaprutil-2.so and
* no longer be exported.
*/
static apr_thread_mutex_t* mutex = NULL;
APU_DECLARE(apr_status_t) apr_dbd_mutex_lock()
{
return apr_thread_mutex_lock(mutex);
}
APU_DECLARE(apr_status_t) apr_dbd_mutex_unlock()
{
return apr_thread_mutex_unlock(mutex);
}
#else
APU_DECLARE(apr_status_t) apr_dbd_mutex_lock() {
return APR_SUCCESS;
}
APU_DECLARE(apr_status_t) apr_dbd_mutex_unlock() {
return APR_SUCCESS;
}
#endif
#if !APU_DSO_BUILD
#define DRIVER_LOAD(name,driver,pool) \
{ \
extern const apr_dbd_driver_t driver; \
apr_hash_set(drivers,name,APR_HASH_KEY_STRING,&driver); \
if (driver.init) { \
driver.init(pool); \
} \
}
#endif
static apr_status_t apr_dbd_term(void *ptr)
{
/* set drivers to NULL so init can work again */
drivers = NULL;
/* Everything else we need is handled by cleanups registered
* when we created mutexes and loaded DSOs
*/
return APR_SUCCESS;
}
APU_DECLARE(apr_status_t) apr_dbd_init(apr_pool_t *pool)
{
apr_status_t ret = APR_SUCCESS;
apr_pool_t *parent;
if (apr_atomic_inc32(&initialised)) {
apr_atomic_set32(&initialised, 1); /* prevent wrap-around */
while (apr_atomic_read32(&in_init)) /* wait until we get fully inited */
;
return APR_SUCCESS;
}
/* Top level pool scope, need process-scope lifetime */
for (parent = pool; parent; parent = apr_pool_parent_get(pool))
pool = parent;
#if APU_DSO_BUILD
/* deprecate in 2.0 - permit implicit initialization */
apu_dso_init(pool);
#endif
drivers = apr_hash_make(pool);
#if APR_HAS_THREADS
ret = apr_thread_mutex_create(&mutex, APR_THREAD_MUTEX_DEFAULT, pool);
/* This already registers a pool cleanup */
#endif
#if !APU_DSO_BUILD
/* Load statically-linked drivers: */
#if APU_HAVE_MYSQL
DRIVER_LOAD("mysql", apr_dbd_mysql_driver, pool);
#endif
#if APU_HAVE_PGSQL
DRIVER_LOAD("pgsql", apr_dbd_pgsql_driver, pool);
#endif
#if APU_HAVE_SQLITE3
DRIVER_LOAD("sqlite3", apr_dbd_sqlite3_driver, pool);
#endif
#if APU_HAVE_SQLITE2
DRIVER_LOAD("sqlite2", apr_dbd_sqlite2_driver, pool);
#endif
#if APU_HAVE_ORACLE
DRIVER_LOAD("oracle", apr_dbd_oracle_driver, pool);
#endif
#if APU_HAVE_FREETDS
DRIVER_LOAD("freetds", apr_dbd_freetds_driver, pool);
#endif
#if APU_HAVE_ODBC
DRIVER_LOAD("odbc", apr_dbd_odbc_driver, pool);
#endif
#if APU_HAVE_SOME_OTHER_BACKEND
DRIVER_LOAD("firebird", apr_dbd_other_driver, pool);
#endif
#endif /* APU_DSO_BUILD */
apr_pool_cleanup_register(pool, NULL, apr_dbd_term,
apr_pool_cleanup_null);
apr_atomic_dec32(&in_init);
return ret;
}
APU_DECLARE(apr_status_t) apr_dbd_get_driver(apr_pool_t *pool, const char *name,
const apr_dbd_driver_t **driver)
{
#if APU_DSO_BUILD
char modname[32];
char symname[34];
apr_dso_handle_sym_t symbol;
#endif
apr_status_t rv;
#if APU_DSO_BUILD
rv = apu_dso_mutex_lock();
if (rv) {
return rv;
}
#endif
*driver = apr_hash_get(drivers, name, APR_HASH_KEY_STRING);
if (*driver) {
#if APU_DSO_BUILD
apu_dso_mutex_unlock();
#endif
return APR_SUCCESS;
}
#if APU_DSO_BUILD
/* The driver DSO must have exactly the same lifetime as the
* drivers hash table; ignore the passed-in pool */
pool = apr_hash_pool_get(drivers);
#if defined(NETWARE)
apr_snprintf(modname, sizeof(modname), "dbd%s.nlm", name);
#elif defined(WIN32)
apr_snprintf(modname, sizeof(modname),
"apr_dbd_%s-" APU_STRINGIFY(APU_MAJOR_VERSION) ".dll", name);
#else
apr_snprintf(modname, sizeof(modname),
"apr_dbd_%s-" APU_STRINGIFY(APU_MAJOR_VERSION) ".so", name);
#endif
apr_snprintf(symname, sizeof(symname), "apr_dbd_%s_driver", name);
rv = apu_dso_load(NULL, &symbol, modname, symname, pool);
if (rv == APR_SUCCESS || rv == APR_EINIT) { /* previously loaded?!? */
*driver = symbol;
name = apr_pstrdup(pool, name);
apr_hash_set(drivers, name, APR_HASH_KEY_STRING, *driver);
rv = APR_SUCCESS;
if ((*driver)->init) {
(*driver)->init(pool);
}
}
apu_dso_mutex_unlock();
#else /* not builtin and !APR_HAS_DSO => not implemented */
rv = APR_ENOTIMPL;
#endif
return rv;
}
APU_DECLARE(apr_status_t) apr_dbd_open_ex(const apr_dbd_driver_t *driver,
apr_pool_t *pool, const char *params,
apr_dbd_t **handle,
const char **error)
{
apr_status_t rv;
*handle = (driver->open)(pool, params, error);
if (*handle == NULL) {
return APR_EGENERAL;
}
rv = apr_dbd_check_conn(driver, pool, *handle);
if ((rv != APR_SUCCESS) && (rv != APR_ENOTIMPL)) {
/* XXX: rv is APR error code, but apr_dbd_error() takes int! */
if (error) {
*error = apr_dbd_error(driver, *handle, rv);
}
apr_dbd_close(driver, *handle);
return APR_EGENERAL;
}
return APR_SUCCESS;
}
APU_DECLARE(apr_status_t) apr_dbd_open(const apr_dbd_driver_t *driver,
apr_pool_t *pool, const char *params,
apr_dbd_t **handle)
{
return apr_dbd_open_ex(driver,pool,params,handle,NULL);
}
APU_DECLARE(int) apr_dbd_transaction_start(const apr_dbd_driver_t *driver,
apr_pool_t *pool, apr_dbd_t *handle,
apr_dbd_transaction_t **trans)
{
int ret = driver->start_transaction(pool, handle, trans);
if (*trans) {
apr_pool_cleanup_register(pool, *trans,
CLEANUP_CAST driver->end_transaction,
apr_pool_cleanup_null);
}
return ret;
}
APU_DECLARE(int) apr_dbd_transaction_end(const apr_dbd_driver_t *driver,
apr_pool_t *pool,
apr_dbd_transaction_t *trans)
{
apr_pool_cleanup_kill(pool, trans, CLEANUP_CAST driver->end_transaction);
return driver->end_transaction(trans);
}
APU_DECLARE(int) apr_dbd_transaction_mode_get(const apr_dbd_driver_t *driver,
apr_dbd_transaction_t *trans)
{
return driver->transaction_mode_get(trans);
}
APU_DECLARE(int) apr_dbd_transaction_mode_set(const apr_dbd_driver_t *driver,
apr_dbd_transaction_t *trans,
int mode)
{
return driver->transaction_mode_set(trans, mode);
}
APU_DECLARE(apr_status_t) apr_dbd_close(const apr_dbd_driver_t *driver,
apr_dbd_t *handle)
{
return driver->close(handle);
}
APU_DECLARE(const char*) apr_dbd_name(const apr_dbd_driver_t *driver)
{
return driver->name;
}
APU_DECLARE(void*) apr_dbd_native_handle(const apr_dbd_driver_t *driver,
apr_dbd_t *handle)
{
return driver->native_handle(handle);
}
APU_DECLARE(int) apr_dbd_check_conn(const apr_dbd_driver_t *driver,
apr_pool_t *pool,
apr_dbd_t *handle)
{
return driver->check_conn(pool, handle);
}
APU_DECLARE(int) apr_dbd_set_dbname(const apr_dbd_driver_t *driver,
apr_pool_t *pool,
apr_dbd_t *handle, const char *name)
{
return driver->set_dbname(pool,handle,name);
}
APU_DECLARE(int) apr_dbd_query(const apr_dbd_driver_t *driver,
apr_dbd_t *handle,
int *nrows, const char *statement)
{
return driver->query(handle,nrows,statement);
}
APU_DECLARE(int) apr_dbd_select(const apr_dbd_driver_t *driver,
apr_pool_t *pool,
apr_dbd_t *handle, apr_dbd_results_t **res,
const char *statement, int random)
{
return driver->select(pool,handle,res,statement,random);
}
APU_DECLARE(int) apr_dbd_num_cols(const apr_dbd_driver_t *driver,
apr_dbd_results_t *res)
{
return driver->num_cols(res);
}
APU_DECLARE(int) apr_dbd_num_tuples(const apr_dbd_driver_t *driver,
apr_dbd_results_t *res)
{
return driver->num_tuples(res);
}
APU_DECLARE(int) apr_dbd_get_row(const apr_dbd_driver_t *driver,
apr_pool_t *pool,
apr_dbd_results_t *res, apr_dbd_row_t **row,
int rownum)
{
return driver->get_row(pool,res,row,rownum);
}
APU_DECLARE(const char*) apr_dbd_get_entry(const apr_dbd_driver_t *driver,
apr_dbd_row_t *row, int col)
{
return driver->get_entry(row,col);
}
APU_DECLARE(const char*) apr_dbd_get_name(const apr_dbd_driver_t *driver,
apr_dbd_results_t *res, int col)
{
return driver->get_name(res,col);
}
APU_DECLARE(const char*) apr_dbd_error(const apr_dbd_driver_t *driver,
apr_dbd_t *handle, int errnum)
{
return driver->error(handle,errnum);
}
APU_DECLARE(const char*) apr_dbd_escape(const apr_dbd_driver_t *driver,
apr_pool_t *pool, const char *string,
apr_dbd_t *handle)
{
return driver->escape(pool,string,handle);
}
APU_DECLARE(int) apr_dbd_prepare(const apr_dbd_driver_t *driver,
apr_pool_t *pool,
apr_dbd_t *handle, const char *query,
const char *label,
apr_dbd_prepared_t **statement)
{
size_t qlen;
int i, nargs = 0, nvals = 0;
char *p, *pq;
const char *q;
apr_dbd_type_e *t;
if (!driver->pformat) {
return APR_ENOTIMPL;
}
/* find the number of parameters in the query */
for (q = query; *q; q++) {
if (q[0] == '%') {
if (apr_isalpha(q[1])) {
nargs++;
} else if (q[1] == '%') {
q++;
}
}
}
nvals = nargs;
qlen = strlen(query) +
nargs * (strlen(driver->pformat) + sizeof(nargs) * 3 + 2) + 1;
pq = apr_palloc(pool, qlen);
t = apr_pcalloc(pool, sizeof(*t) * nargs);
for (p = pq, q = query, i = 0; *q; q++) {
if (q[0] == '%') {
if (apr_isalpha(q[1])) {
switch (q[1]) {
case 'd': t[i] = APR_DBD_TYPE_INT; break;
case 'u': t[i] = APR_DBD_TYPE_UINT; break;
case 'f': t[i] = APR_DBD_TYPE_FLOAT; break;
case 'h':
switch (q[2]) {
case 'h':
switch (q[3]){
case 'd': t[i] = APR_DBD_TYPE_TINY; q += 2; break;
case 'u': t[i] = APR_DBD_TYPE_UTINY; q += 2; break;
}
break;
case 'd': t[i] = APR_DBD_TYPE_SHORT; q++; break;
case 'u': t[i] = APR_DBD_TYPE_USHORT; q++; break;
}
break;
case 'l':
switch (q[2]) {
case 'l':
switch (q[3]){
case 'd': t[i] = APR_DBD_TYPE_LONGLONG; q += 2; break;
case 'u': t[i] = APR_DBD_TYPE_ULONGLONG; q += 2; break;
}
break;
case 'd': t[i] = APR_DBD_TYPE_LONG; q++; break;
case 'u': t[i] = APR_DBD_TYPE_ULONG; q++; break;
case 'f': t[i] = APR_DBD_TYPE_DOUBLE; q++; break;
}
break;
case 'p':
if (q[2] == 'D') {
switch (q[3]) {
case 't': t[i] = APR_DBD_TYPE_TEXT; q += 2; break;
case 'i': t[i] = APR_DBD_TYPE_TIME; q += 2; break;
case 'd': t[i] = APR_DBD_TYPE_DATE; q += 2; break;
case 'a': t[i] = APR_DBD_TYPE_DATETIME; q += 2; break;
case 's': t[i] = APR_DBD_TYPE_TIMESTAMP; q += 2; break;
case 'z': t[i] = APR_DBD_TYPE_ZTIMESTAMP; q += 2; break;
case 'b': t[i] = APR_DBD_TYPE_BLOB; q += 2; break;
case 'c': t[i] = APR_DBD_TYPE_CLOB; q += 2; break;
case 'n': t[i] = APR_DBD_TYPE_NULL; q += 2; break;
}
}
break;
}
q++;
switch (t[i]) {
case APR_DBD_TYPE_NONE: /* by default, we expect strings */
t[i] = APR_DBD_TYPE_STRING;
break;
case APR_DBD_TYPE_BLOB:
case APR_DBD_TYPE_CLOB: /* three (3) more values passed in */
nvals += 3;
break;
default:
break;
}
/* insert database specific parameter reference */
p += apr_snprintf(p, qlen - (p - pq), driver->pformat, ++i);
} else if (q[1] == '%') { /* reduce %% to % */
*p++ = *q++;
} else {
*p++ = *q;
}
} else {
*p++ = *q;
}
}
*p = '\0';
return driver->prepare(pool,handle,pq,label,nargs,nvals,t,statement);
}
APU_DECLARE(int) apr_dbd_pquery(const apr_dbd_driver_t *driver,
apr_pool_t *pool,
apr_dbd_t *handle, int *nrows,
apr_dbd_prepared_t *statement,
int nargs, const char **args)
{
return driver->pquery(pool,handle,nrows,statement,args);
}
APU_DECLARE(int) apr_dbd_pselect(const apr_dbd_driver_t *driver,
apr_pool_t *pool,
apr_dbd_t *handle, apr_dbd_results_t **res,
apr_dbd_prepared_t *statement, int random,
int nargs, const char **args)
{
return driver->pselect(pool,handle,res,statement,random,args);
}
APU_DECLARE_NONSTD(int) apr_dbd_pvquery(const apr_dbd_driver_t *driver,
apr_pool_t *pool,
apr_dbd_t *handle, int *nrows,
apr_dbd_prepared_t *statement, ...)
{
int ret;
va_list args;
va_start(args, statement);
ret = driver->pvquery(pool,handle,nrows,statement,args);
va_end(args);
return ret;
}
APU_DECLARE_NONSTD(int) apr_dbd_pvselect(const apr_dbd_driver_t *driver,
apr_pool_t *pool, apr_dbd_t *handle,
apr_dbd_results_t **res,
apr_dbd_prepared_t *statement,
int random, ...)
{
int ret;
va_list args;
va_start(args, random);
ret = driver->pvselect(pool,handle,res,statement,random,args);
va_end(args);
return ret;
}
APU_DECLARE(int) apr_dbd_pbquery(const apr_dbd_driver_t *driver,
apr_pool_t *pool,
apr_dbd_t *handle, int *nrows,
apr_dbd_prepared_t *statement,
const void **args)
{
return driver->pbquery(pool,handle,nrows,statement,args);
}
APU_DECLARE(int) apr_dbd_pbselect(const apr_dbd_driver_t *driver,
apr_pool_t *pool,
apr_dbd_t *handle, apr_dbd_results_t **res,
apr_dbd_prepared_t *statement, int random,
const void **args)
{
return driver->pbselect(pool,handle,res,statement,random,args);
}
APU_DECLARE_NONSTD(int) apr_dbd_pvbquery(const apr_dbd_driver_t *driver,
apr_pool_t *pool,
apr_dbd_t *handle, int *nrows,
apr_dbd_prepared_t *statement, ...)
{
int ret;
va_list args;
va_start(args, statement);
ret = driver->pvbquery(pool,handle,nrows,statement,args);
va_end(args);
return ret;
}
APU_DECLARE_NONSTD(int) apr_dbd_pvbselect(const apr_dbd_driver_t *driver,
apr_pool_t *pool, apr_dbd_t *handle,
apr_dbd_results_t **res,
apr_dbd_prepared_t *statement,
int random, ...)
{
int ret;
va_list args;
va_start(args, random);
ret = driver->pvbselect(pool,handle,res,statement,random,args);
va_end(args);
return ret;
}
APU_DECLARE(apr_status_t) apr_dbd_datum_get(const apr_dbd_driver_t *driver,
apr_dbd_row_t *row, int col,
apr_dbd_type_e type, void *data)
{
return driver->datum_get(row,col,type,data);
}

805
dbd/apr_dbd_freetds.c Normal file
View File

@ -0,0 +1,805 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apu.h"
#include "apu_config.h"
/* COMPILE_STUBS: compile stubs for unimplemented functions.
*
* This is required to compile in /trunk/, but can be
* undefined to compile a driver for httpd-2.2 and other
* APR-1.2 applications
*/
#define COMPILE_STUBS
#if APU_HAVE_FREETDS
#include <ctype.h>
#include <stdlib.h>
#include "apr_strings.h"
#include "apr_lib.h"
#include "apr_pools.h"
#include "apr_dbd_internal.h"
#ifdef HAVE_FREETDS_SYBDB_H
#include <freetds/sybdb.h>
#endif
#ifdef HAVE_SYBDB_H
#include <sybdb.h>
#endif
#include <stdio.h>
#include <sys/types.h>
#include <regex.h>
/* This probably needs to change for different applications */
#define MAX_COL_LEN 256
typedef struct freetds_cell_t {
int type;
DBINT len;
BYTE *data;
} freetds_cell_t;
struct apr_dbd_transaction_t {
int mode;
int errnum;
apr_dbd_t *handle;
};
struct apr_dbd_t {
DBPROCESS *proc;
apr_dbd_transaction_t *trans;
apr_pool_t *pool;
const char *params;
RETCODE err;
};
struct apr_dbd_results_t {
int random;
size_t ntuples;
size_t sz;
apr_pool_t *pool;
DBPROCESS *proc;
};
struct apr_dbd_row_t {
apr_dbd_results_t *res;
BYTE buf[MAX_COL_LEN];
};
struct apr_dbd_prepared_t {
int nargs;
regex_t **taint;
int *sz;
char *fmt;
};
#define dbd_freetds_is_success(x) (x == SUCCEED)
static int labelnum = 0; /* FIXME */
static regex_t dbd_freetds_find_arg;
/* execute a query that doesn't return a result set, mop up,
* and return and APR-flavoured status
*/
static RETCODE freetds_exec(DBPROCESS *proc, const char *query,
int want_results, int *nrows)
{
/* TBD */
RETCODE rv = dbcmd(proc, query);
if (rv != SUCCEED) {
return rv;
}
rv = dbsqlexec(proc);
if (rv != SUCCEED) {
return rv;
}
if (!want_results) {
while (dbresults(proc) != NO_MORE_RESULTS) {
++*nrows;
}
}
return SUCCEED;
}
static apr_status_t clear_result(void *data)
{
/* clear cursor */
return (dbcanquery((DBPROCESS*)data) == SUCCEED)
? APR_SUCCESS
: APR_EGENERAL;
}
static int dbd_freetds_select(apr_pool_t *pool, apr_dbd_t *sql,
apr_dbd_results_t **results,
const char *query, int seek)
{
apr_dbd_results_t *res;
if (sql->trans && (sql->trans->errnum != SUCCEED)) {
return 1;
}
/* the core of this is
* dbcmd(proc, query);
* dbsqlexec(proc);
* while (dbnextrow(dbproc) != NO_MORE_ROWS) {
* do things
* }
*
* Ignore seek
*/
sql->err = freetds_exec(sql->proc, query, 1, NULL);
if (!dbd_freetds_is_success(sql->err)) {
if (sql->trans) {
sql->trans->errnum = sql->err;
}
return 1;
}
sql->err = dbresults(sql->proc);
if (sql->err != SUCCEED) {
if (sql->trans) {
sql->trans->errnum = sql->err;
}
return 1;
}
if (!*results) {
*results = apr_pcalloc(pool, sizeof(apr_dbd_results_t));
}
res = *results;
res->proc = sql->proc;
res->random = seek;
res->pool = pool;
res->ntuples = dblastrow(sql->proc);
res->sz = dbnumcols(sql->proc);
apr_pool_cleanup_register(pool, sql->proc, clear_result,
apr_pool_cleanup_null);
#if 0
/* Now we have a result set. We need to bind to its vars */
res->vars = apr_palloc(pool, res->sz * sizeof(freetds_cell_t*));
for (i=1; i <= res->sz; ++i) {
freetds_cell_t *cell = &res->vars[i-1];
cell->type = dbcoltype(sql->proc, i);
cell->len = dbcollen(sql->proc, i);
cell->data = apr_palloc(pool, cell->len);
sql->err = dbbind(sql->proc, i, /*cell->type */ STRINGBIND, cell->len, cell->data);
if (sql->err != SUCCEED) {
fprintf(stderr, "dbbind error: %d, %d, %d", i, cell->type, cell->len);
}
if ((sql->err != SUCCEED) && (sql->trans != NULL)) {
sql->trans->errnum = sql->err;
}
}
#endif
return (sql->err == SUCCEED) ? 0 : 1;
}
static const char *dbd_untaint(apr_pool_t *pool, regex_t *rx, const char *val)
{
regmatch_t match[1];
if (rx == NULL) {
/* no untaint expression */
return val;
}
if (regexec(rx, val, 1, match, 0) == 0) {
return apr_pstrndup(pool, val+match[0].rm_so,
match[0].rm_eo - match[0].rm_so);
}
return "";
}
static const char *dbd_statement(apr_pool_t *pool,
apr_dbd_prepared_t *stmt,
int nargs, const char **args)
{
int i;
int len;
const char *var;
char *ret;
const char *p_in;
char *p_out;
char *q;
/* compute upper bound on length (since untaint shrinks) */
len = strlen(stmt->fmt) +1;
for (i=0; i<nargs; ++i) {
len += strlen(args[i]) - 2;
}
i = 0;
p_in = stmt->fmt;
p_out = ret = apr_palloc(pool, len);
/* FIXME silly bug - this'll catch %%s */
while (q = strstr(p_in, "%s"), q != NULL) {
len = q-p_in;
strncpy(p_out, p_in, len);
p_in += len;
p_out += len;
var = dbd_untaint(pool, stmt->taint[i], args[i]);
len = strlen(var);
strncpy(p_out, var, len);
p_in += 2;
p_out += len;
++i;
}
strcpy(p_out, p_in);
return ret;
}
static int dbd_freetds_pselect(apr_pool_t *pool, apr_dbd_t *sql,
apr_dbd_results_t **results,
apr_dbd_prepared_t *statement,
int seek, const char **values)
{
const char *query = dbd_statement(pool, statement,
statement->nargs, values);
return dbd_freetds_select(pool, sql, results, query, seek);
}
static int dbd_freetds_pvselect(apr_pool_t *pool, apr_dbd_t *sql,
apr_dbd_results_t **results,
apr_dbd_prepared_t *statement,
int seek, va_list args)
{
const char **values;
int i;
if (sql->trans && sql->trans->errnum) {
return sql->trans->errnum;
}
values = apr_palloc(pool, sizeof(*values) * statement->nargs);
for (i = 0; i < statement->nargs; i++) {
values[i] = va_arg(args, const char*);
}
return dbd_freetds_pselect(pool, sql, results, statement, seek, values);
}
static int dbd_freetds_query(apr_dbd_t *sql, int *nrows, const char *query);
static int dbd_freetds_pquery(apr_pool_t *pool, apr_dbd_t *sql,
int *nrows, apr_dbd_prepared_t *statement,
const char **values)
{
const char *query = dbd_statement(pool, statement,
statement->nargs, values);
return dbd_freetds_query(sql, nrows, query);
}
static int dbd_freetds_pvquery(apr_pool_t *pool, apr_dbd_t *sql, int *nrows,
apr_dbd_prepared_t *statement, va_list args)
{
const char **values;
int i;
if (sql->trans && sql->trans->errnum) {
return sql->trans->errnum;
}
values = apr_palloc(pool, sizeof(*values) * statement->nargs);
for (i = 0; i < statement->nargs; i++) {
values[i] = va_arg(args, const char*);
}
return dbd_freetds_pquery(pool, sql, nrows, statement, values);
}
static int dbd_freetds_get_row(apr_pool_t *pool, apr_dbd_results_t *res,
apr_dbd_row_t **rowp, int rownum)
{
RETCODE rv = 0;
apr_dbd_row_t *row = *rowp;
int sequential = ((rownum >= 0) && res->random) ? 0 : 1;
if (row == NULL) {
row = apr_palloc(pool, sizeof(apr_dbd_row_t));
*rowp = row;
row->res = res;
}
/*
else {
if ( sequential ) {
++row->n;
}
else {
row->n = rownum;
}
}
*/
if (sequential) {
rv = dbnextrow(res->proc);
}
else {
rv = (rownum >= 0) ? dbgetrow(res->proc, rownum) : NO_MORE_ROWS;
}
switch (rv) {
case SUCCEED: return 0;
case REG_ROW: return 0;
case NO_MORE_ROWS:
apr_pool_cleanup_run(pool, res->proc, clear_result);
*rowp = NULL;
return -1;
case FAIL: return 1;
case BUF_FULL: return 2; /* FIXME */
default: return 3;
}
return 0;
}
static const char *dbd_freetds_get_entry(const apr_dbd_row_t *row, int n)
{
/* FIXME: support different data types */
/* this fails - bind gets some vars but not others
return (const char*)row->res->vars[n].data;
*/
DBPROCESS* proc = row->res->proc;
BYTE *ptr = dbdata(proc, n+1);
int t = dbcoltype(proc, n+1);
int l = dbcollen(proc, n+1);
if (dbwillconvert(t, SYBCHAR)) {
dbconvert(proc, t, ptr, l, SYBCHAR, (BYTE *)row->buf, -1);
return (const char*)row->buf;
}
return (char*)ptr;
}
static const char *dbd_freetds_error(apr_dbd_t *sql, int n)
{
/* XXX this doesn't seem to exist in the API ??? */
return apr_psprintf(sql->pool, "Error %d", sql->err);
}
static int dbd_freetds_query(apr_dbd_t *sql, int *nrows, const char *query)
{
if (sql->trans && sql->trans->errnum) {
return sql->trans->errnum;
}
*nrows = 0;
sql->err = freetds_exec(sql->proc, query, 0, nrows);
if (sql->err != SUCCEED) {
if (sql->trans) {
sql->trans->errnum = sql->err;
}
return 1;
}
return 0;
}
static const char *dbd_freetds_escape(apr_pool_t *pool, const char *arg,
apr_dbd_t *sql)
{
return arg;
}
static apr_status_t freetds_regfree(void *rx)
{
regfree((regex_t*)rx);
return APR_SUCCESS;
}
static int recurse_args(apr_pool_t *pool, int n, const char *query,
apr_dbd_prepared_t *stmt, int offs)
{
/* we only support %s arguments for now */
int ret;
char arg[256];
regmatch_t matches[3];
if (regexec(&dbd_freetds_find_arg, query, 3, matches, 0) != 0) {
/* No more args */
stmt->nargs = n;
stmt->taint = apr_palloc(pool, n*sizeof(regex_t*));
stmt->sz = apr_palloc(pool, n*sizeof(int));
ret = 0;
}
else {
int i;
int sz = 0;
int len = matches[1].rm_eo - matches[1].rm_so - 2;
if (len > 255) {
return 9999;
}
ret = recurse_args(pool, n+1, query+matches[0].rm_eo,
stmt, offs+matches[0].rm_eo);
memmove(stmt->fmt + offs + matches[1].rm_so,
stmt->fmt + offs + matches[0].rm_eo-1,
strlen(stmt->fmt+offs+matches[0].rm_eo)+2);
/* compile untaint to a regex if found */
if (matches[1].rm_so == -1) {
stmt->taint[n] = NULL;
}
else {
strncpy(arg, query+matches[1].rm_so+1,
matches[1].rm_eo - matches[1].rm_so - 2);
arg[matches[1].rm_eo - matches[1].rm_so - 2] = '\0';
stmt->taint[n] = apr_palloc(pool, sizeof(regex_t));
if (regcomp(stmt->taint[n], arg, REG_ICASE|REG_EXTENDED) != 0) {
++ret;
}
else {
apr_pool_cleanup_register(pool, stmt->taint[n], freetds_regfree,
apr_pool_cleanup_null);
}
}
/* record length if specified */
for (i=matches[2].rm_so; i<matches[2].rm_eo; ++i) {
sz = 10*sz + (query[i]-'\0');
}
}
return ret;
}
static int dbd_freetds_prepare(apr_pool_t *pool, apr_dbd_t *sql,
const char *query, const char *label,
int nargs, int nvals, apr_dbd_type_e *types,
apr_dbd_prepared_t **statement)
{
apr_dbd_prepared_t *stmt;
if (label == NULL) {
label = apr_psprintf(pool, "%d", labelnum++);
}
if (!*statement) {
*statement = apr_palloc(pool, sizeof(apr_dbd_prepared_t));
}
stmt = *statement;
#if 0
/* count args */
stmt->fmt = apr_pstrdup(pool, query);
stmt->fmt = recurse_args(pool, 0, query, stmt, stmt->fmt);
/* overestimate by a byte or two to simplify */
len = strlen("CREATE PROC apr.")
+ strlen(label)
+ stmt->nargs * strlen(" @arg1 varchar(len1),")
+ strlen(" AS begin ")
+ strlen(stmt->fmt)
+ strlen(" end "); /* extra byte for terminator */
pquery = apr_pcalloc(pool, len);
sprintf(pquery, "CREATE PROC apr.%s", label);
for (i=0; i<stmt->nargs; ++i) {
sprintf(pquery+strlen(pquery), " @arg%d varchar(%d)", i, stmt->sz[i]);
if (i < stmt->nargs-1) {
pquery[strlen(pquery)] = ',';
}
}
strcat(pquery, " AS BEGIN ");
strcat(pquery, stmt->fmt);
strcat(pquery, " END");
return (freetds_exec(sql->proc, pquery, 0, &i) == SUCCEED) ? 0 : 1;
#else
stmt->fmt = apr_pstrdup(pool, query);
return recurse_args(pool, 0, query, stmt, 0);
#endif
}
static int dbd_freetds_start_transaction(apr_pool_t *pool, apr_dbd_t *handle,
apr_dbd_transaction_t **trans)
{
int dummy;
/* XXX handle recursive transactions here */
handle->err = freetds_exec(handle->proc, "BEGIN TRANSACTION", 0, &dummy);
if (dbd_freetds_is_success(handle->err)) {
if (!*trans) {
*trans = apr_pcalloc(pool, sizeof(apr_dbd_transaction_t));
}
(*trans)->handle = handle;
handle->trans = *trans;
return 0;
}
return 1;
}
static int dbd_freetds_end_transaction(apr_dbd_transaction_t *trans)
{
int dummy;
if (trans) {
/* rollback on error or explicit rollback request */
if (trans->errnum) {
trans->errnum = 0;
trans->handle->err = freetds_exec(trans->handle->proc,
"ROLLBACK", 0, &dummy);
}
else {
trans->handle->err = freetds_exec(trans->handle->proc,
"COMMIT", 0, &dummy);
}
trans->handle->trans = NULL;
}
return (trans->handle->err == SUCCEED) ? 0 : 1;
}
static DBPROCESS *freetds_open(apr_pool_t *pool, const char *params,
const char **error)
{
char *server = NULL;
DBPROCESS *process;
LOGINREC *login;
static const char *delims = " \r\n\t;|,";
char *ptr;
char *key;
char *value;
int vlen;
int klen;
char *buf;
char *databaseName = NULL;
/* FIXME - this uses malloc */
/* FIXME - pass error message back to the caller in case of failure */
login = dblogin();
if (login == NULL) {
return NULL;
}
/* now set login properties */
for (ptr = strchr(params, '='); ptr; ptr = strchr(ptr, '=')) {
/* don't dereference memory that may not belong to us */
if (ptr == params) {
++ptr;
continue;
}
for (key = ptr-1; apr_isspace(*key); --key);
klen = 0;
while (apr_isalpha(*key)) {
--key;
++klen;
}
++key;
for (value = ptr+1; apr_isspace(*value); ++value);
vlen = strcspn(value, delims);
buf = apr_pstrndup(pool, value, vlen); /* NULL-terminated copy */
if (!strncasecmp(key, "username", klen)) {
DBSETLUSER(login, buf);
}
else if (!strncasecmp(key, "password", klen)) {
DBSETLPWD(login, buf);
}
else if (!strncasecmp(key, "appname", klen)) {
DBSETLAPP(login, buf);
}
else if (!strncasecmp(key, "dbname", klen)) {
databaseName = buf;
}
else if (!strncasecmp(key, "host", klen)) {
DBSETLHOST(login, buf);
}
else if (!strncasecmp(key, "charset", klen)) {
DBSETLCHARSET(login, buf);
}
else if (!strncasecmp(key, "lang", klen)) {
DBSETLNATLANG(login, buf);
}
else if (!strncasecmp(key, "server", klen)) {
server = buf;
}
else {
/* unknown param */
}
ptr = value+vlen;
}
process = dbopen(login, server);
if (process != NULL && databaseName != NULL)
{
dbuse(process, databaseName);
}
dbloginfree(login);
if (process == NULL) {
return NULL;
}
return process;
}
static apr_dbd_t *dbd_freetds_open(apr_pool_t *pool, const char *params,
const char **error)
{
apr_dbd_t *sql;
/* FIXME - pass error message back to the caller in case of failure */
DBPROCESS *process = freetds_open(pool, params, error);
if (process == NULL) {
return NULL;
}
sql = apr_palloc (pool, sizeof (apr_dbd_t));
sql->pool = pool;
sql->proc = process;
sql->params = params;
return sql;
}
static apr_status_t dbd_freetds_close(apr_dbd_t *handle)
{
dbclose(handle->proc);
return APR_SUCCESS;
}
static apr_status_t dbd_freetds_check_conn(apr_pool_t *pool,
apr_dbd_t *handle)
{
if (dbdead(handle->proc)) {
/* try again */
dbclose(handle->proc);
handle->proc = freetds_open(handle->pool, handle->params, NULL);
if (!handle->proc || dbdead(handle->proc)) {
return APR_EGENERAL;
}
}
/* clear it, in case this is called in error handling */
dbcancel(handle->proc);
return APR_SUCCESS;
}
static int dbd_freetds_select_db(apr_pool_t *pool, apr_dbd_t *handle,
const char *name)
{
/* ouch, it's declared int. But we can use APR 0/nonzero */
return (dbuse(handle->proc, (char*)name) == SUCCEED) ? APR_SUCCESS : APR_EGENERAL;
}
static void *dbd_freetds_native(apr_dbd_t *handle)
{
return handle->proc;
}
static int dbd_freetds_num_cols(apr_dbd_results_t* res)
{
return res->sz;
}
static int dbd_freetds_num_tuples(apr_dbd_results_t* res)
{
if (res->random) {
return res->ntuples;
}
else {
return -1;
}
}
static apr_status_t freetds_term(void *dummy)
{
dbexit();
regfree(&dbd_freetds_find_arg);
return APR_SUCCESS;
}
static int freetds_err_handler(DBPROCESS *dbproc, int severity, int dberr,
int oserr, char *dberrstr, char *oserrstr)
{
return INT_CANCEL; /* never exit */
}
static void dbd_freetds_init(apr_pool_t *pool)
{
int rv = regcomp(&dbd_freetds_find_arg,
"%(\\{[^}]*\\})?([0-9]*)[A-Za-z]", REG_EXTENDED);
if (rv != 0) {
char errmsg[256];
regerror(rv, &dbd_freetds_find_arg, errmsg, 256);
fprintf(stderr, "regcomp failed: %s\n", errmsg);
}
dbinit();
dberrhandle(freetds_err_handler);
apr_pool_cleanup_register(pool, NULL, freetds_term, apr_pool_cleanup_null);
}
#ifdef COMPILE_STUBS
/* get_name is the only one of these that is implemented */
static const char *dbd_freetds_get_name(const apr_dbd_results_t *res, int n)
{
return (const char*) dbcolname(res->proc, n+1); /* numbering starts at 1 */
}
/* These are stubs: transaction modes not implemented here */
#define DBD_NOTIMPL APR_ENOTIMPL;
static int dbd_freetds_transaction_mode_get(apr_dbd_transaction_t *trans)
{
return trans ? trans->mode : APR_DBD_TRANSACTION_COMMIT;
}
static int dbd_freetds_transaction_mode_set(apr_dbd_transaction_t *trans,
int mode)
{
if (trans) {
trans->mode = mode & TXN_MODE_BITS;
return trans->mode;
}
return APR_DBD_TRANSACTION_COMMIT;
}
static int dbd_freetds_pvbquery(apr_pool_t *pool, apr_dbd_t *sql, int *nrows,
apr_dbd_prepared_t *statement, va_list args)
{
return DBD_NOTIMPL;
}
static int dbd_freetds_pbquery(apr_pool_t *pool, apr_dbd_t *sql, int *nrows,
apr_dbd_prepared_t * statement,
const void **values)
{
return DBD_NOTIMPL;
}
static int dbd_freetds_pvbselect(apr_pool_t *pool, apr_dbd_t *sql,
apr_dbd_results_t **results,
apr_dbd_prepared_t *statement,
int seek, va_list args)
{
return DBD_NOTIMPL;
}
static int dbd_freetds_pbselect(apr_pool_t *pool, apr_dbd_t *sql,
apr_dbd_results_t **results,
apr_dbd_prepared_t *statement,
int seek, const void **values)
{
return DBD_NOTIMPL;
}
static apr_status_t dbd_freetds_datum_get(const apr_dbd_row_t *row, int n,
apr_dbd_type_e type, void *data)
{
return APR_ENOTIMPL;
}
#endif
APU_MODULE_DECLARE_DATA const apr_dbd_driver_t apr_dbd_freetds_driver = {
"freetds",
dbd_freetds_init,
dbd_freetds_native,
dbd_freetds_open,
dbd_freetds_check_conn,
dbd_freetds_close,
dbd_freetds_select_db,
dbd_freetds_start_transaction,
dbd_freetds_end_transaction,
dbd_freetds_query,
dbd_freetds_select,
dbd_freetds_num_cols,
dbd_freetds_num_tuples,
dbd_freetds_get_row,
dbd_freetds_get_entry,
dbd_freetds_error,
dbd_freetds_escape,
dbd_freetds_prepare,
dbd_freetds_pvquery,
dbd_freetds_pvselect,
dbd_freetds_pquery,
dbd_freetds_pselect,
/* this is only implemented to support httpd/2.2 standard usage,
* as in the original DBD implementation. Everything else is NOTIMPL.
*/
#ifdef COMPILE_STUBS
dbd_freetds_get_name,
dbd_freetds_transaction_mode_get,
dbd_freetds_transaction_mode_set,
"",
dbd_freetds_pvbquery,
dbd_freetds_pvbselect,
dbd_freetds_pbquery,
dbd_freetds_pbselect,
dbd_freetds_datum_get
#endif
};
#endif

207
dbd/apr_dbd_freetds.dsp Normal file
View File

@ -0,0 +1,207 @@
# Microsoft Developer Studio Project File - Name="apr_dbd_freetds" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
CFG=apr_dbd_freetds - Win32 Release
!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 "apr_dbd_freetds.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 "apr_dbd_freetds.mak" CFG="apr_dbd_freetds - Win32 Release"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "apr_dbd_freetds - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_dbd_freetds - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_dbd_freetds - x64 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_dbd_freetds - x64 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe
!IF "$(CFG)" == "apr_dbd_freetds - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
# ADD CPP /nologo /MD /W3 /Zi /O2 /Oy- /I "../include" /I "../../apr/include" /I "../include/private" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_FREETDS=1 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_freetds_src" /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /fo"Release/apr_dbd_freetds-1.res" /d DLL_NAME="apr_dbd_freetds" /d "NDEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libTDS.lib /nologo /base:"0x6EF60000" /subsystem:windows /dll /incremental:no /debug /opt:ref
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libTDS.lib /nologo /base:"0x6EF60000" /subsystem:windows /dll /incremental:no /debug /out:"Release\apr_dbd_freetds-1.dll" /pdb:"Release\apr_dbd_freetds-1.pdb" /implib:"Release\apr_dbd_freetds-1.lib" /MACHINE:X86 /opt:ref
# Begin Special Build Tool
TargetPath=Release\apr_dbd_freetds-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_dbd_freetds - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /EHsc /c
# ADD CPP /nologo /MDd /W3 /Zi /Od /I "../include" /I "../../apr/include" /I "../include/private" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_FREETDS=1 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_freetds_src" /FD /EHsc /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /fo"Debug/apr_dbd_freetds-1.res" /d DLL_NAME="apr_dbd_freetds" /d "_DEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libTDS.lib /nologo /base:"0x6EF60000" /subsystem:windows /dll /incremental:no /debug
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libTDS.lib /nologo /base:"0x6EF60000" /subsystem:windows /dll /incremental:no /debug /out:"Debug\apr_dbd_freetds-1.dll" /pdb:"Debug\apr_dbd_freetds-1.pdb" /implib:"Debug\apr_dbd_freetds-1.lib" /MACHINE:X86
# Begin Special Build Tool
TargetPath=Debug\apr_dbd_freetds-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_dbd_freetds - x64 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "x64\Release"
# PROP BASE Intermediate_Dir "x64\Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "x64\Release"
# PROP Intermediate_Dir "x64\Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
# ADD CPP /nologo /MD /W3 /Zi /O2 /Oy- /I "../include" /I "../../apr/include" /I "../include/private" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_FREETDS=1 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_freetds_src" /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /fo"x64/Release/apr_dbd_freetds-1.res" /d DLL_NAME="apr_dbd_freetds" /d "NDEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libTDS.lib /nologo /base:"0x6EF60000" /subsystem:windows /dll /incremental:no /debug /opt:ref
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libTDS.lib /nologo /base:"0x6EF60000" /subsystem:windows /dll /incremental:no /debug /out:"x64\Release\apr_dbd_freetds-1.dll" /pdb:"x64\Release\apr_dbd_freetds-1.pdb" /implib:"x64\Release\apr_dbd_freetds-1.lib" /MACHINE:X64 /opt:ref
# Begin Special Build Tool
TargetPath=x64\Release\apr_dbd_freetds-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_dbd_freetds - x64 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "x64\Debug"
# PROP BASE Intermediate_Dir "x64\Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "x64\Debug"
# PROP Intermediate_Dir "x64\Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /EHsc /c
# ADD CPP /nologo /MDd /W3 /Zi /Od /I "../include" /I "../../apr/include" /I "../include/private" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_FREETDS=1 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_freetds_src" /FD /EHsc /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /fo"x64/Debug/apr_dbd_freetds-1.res" /d DLL_NAME="apr_dbd_freetds" /d "_DEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libTDS.lib /nologo /base:"0x6EF60000" /subsystem:windows /dll /incremental:no /debug
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libTDS.lib /nologo /base:"0x6EF60000" /subsystem:windows /dll /incremental:no /debug /out:"x64\Debug\apr_dbd_freetds-1.dll" /pdb:"x64\Debug\apr_dbd_freetds-1.pdb" /implib:"x64\Debug\apr_dbd_freetds-1.lib" /MACHINE:X64
# Begin Special Build Tool
TargetPath=x64\Debug\apr_dbd_freetds-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ENDIF
# Begin Target
# Name "apr_dbd_freetds - Win32 Release"
# Name "apr_dbd_freetds - Win32 Debug"
# Name "apr_dbd_freetds - x64 Release"
# Name "apr_dbd_freetds - x64 Debug"
# Begin Group "Source Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\apr_dbd_freetds.c
# End Source File
# End Group
# Begin Group "Public Header Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=..\include\apr_dbd.h
# End Source File
# End Group
# Begin Group "Internal Header Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=..\include\private\apu_config.h
# End Source File
# Begin Source File
SOURCE=..\include\private\apu_dbd_internal.h
# End Source File
# Begin Source File
SOURCE=..\include\private\apu_internal.h
# End Source File
# End Group
# Begin Source File
SOURCE=..\libaprutil.rc
# End Source File
# End Target
# End Project

1305
dbd/apr_dbd_mysql.c Normal file

File diff suppressed because it is too large Load Diff

207
dbd/apr_dbd_mysql.dsp Normal file
View File

@ -0,0 +1,207 @@
# Microsoft Developer Studio Project File - Name="apr_dbd_mysql" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
CFG=apr_dbd_mysql - Win32 Release
!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 "apr_dbd_mysql.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 "apr_dbd_mysql.mak" CFG="apr_dbd_mysql - Win32 Release"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "apr_dbd_mysql - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_dbd_mysql - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_dbd_mysql - x64 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_dbd_mysql - x64 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe
!IF "$(CFG)" == "apr_dbd_mysql - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
# ADD CPP /nologo /MD /W3 /Zi /O2 /Oy- /I "../include" /I "../../apr/include" /I "../include/private" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_MYSQL=1 /D "HAVE_MYSQL_H" /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_mysql_src" /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /fo"Release/apr_dbd_mysql-1.res" /d DLL_NAME="apr_dbd_mysql" /d "NDEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libmysql.lib /nologo /base:"0x6EF50000" /subsystem:windows /dll /incremental:no /debug /opt:ref
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libmysql.lib /nologo /base:"0x6EF50000" /subsystem:windows /dll /incremental:no /debug /out:"Release\apr_dbd_mysql-1.dll" /pdb:"Release\apr_dbd_mysql-1.pdb" /implib:"Release\apr_dbd_mysql-1.lib" /MACHINE:X86 /opt:ref
# Begin Special Build Tool
TargetPath=Release\apr_dbd_mysql-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_dbd_mysql - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /EHsc /c
# ADD CPP /nologo /MDd /W3 /Zi /Od /I "../include" /I "../../apr/include" /I "../include/private" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_MYSQL=1 /D "HAVE_MYSQL_H" /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_mysql_src" /FD /EHsc /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /fo"Debug/apr_dbd_mysql-1.res" /d DLL_NAME="apr_dbd_mysql" /d "_DEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libmysql.lib /nologo /base:"0x6EF50000" /subsystem:windows /dll /incremental:no /debug
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libmysql.lib /nologo /base:"0x6EF50000" /subsystem:windows /dll /incremental:no /debug /out:"Debug\apr_dbd_mysql-1.dll" /pdb:"Debug\apr_dbd_mysql-1.pdb" /implib:"Debug\apr_dbd_mysql-1.lib" /MACHINE:X86
# Begin Special Build Tool
TargetPath=Debug\apr_dbd_mysql-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_dbd_mysql - x64 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "x64\Release"
# PROP BASE Intermediate_Dir "x64\Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "x64\Release"
# PROP Intermediate_Dir "x64\Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
# ADD CPP /nologo /MD /W3 /Zi /O2 /Oy- /I "../include" /I "../../apr/include" /I "../include/private" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_MYSQL=1 /D "HAVE_MYSQL_H" /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_mysql_src" /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /fo"x64/Release/apr_dbd_mysql-1.res" /d DLL_NAME="apr_dbd_mysql" /d "NDEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libmysql.lib /nologo /base:"0x6EF50000" /subsystem:windows /dll /incremental:no /debug /opt:ref
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libmysql.lib /nologo /base:"0x6EF50000" /subsystem:windows /dll /incremental:no /debug /out:"x64\Release\apr_dbd_mysql-1.dll" /pdb:"x64\Release\apr_dbd_mysql-1.pdb" /implib:"x64\Release\apr_dbd_mysql-1.lib" /MACHINE:X64 /opt:ref
# Begin Special Build Tool
TargetPath=x64\Release\apr_dbd_mysql-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_dbd_mysql - x64 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "x64\Debug"
# PROP BASE Intermediate_Dir "x64\Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "x64\Debug"
# PROP Intermediate_Dir "x64\Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /EHsc /c
# ADD CPP /nologo /MDd /W3 /Zi /Od /I "../include" /I "../../apr/include" /I "../include/private" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_MYSQL=1 /D "HAVE_MYSQL_H" /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_mysql_src" /FD /EHsc /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /fo"x64/Debug/apr_dbd_mysql-1.res" /d DLL_NAME="apr_dbd_mysql" /d "_DEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libmysql.lib /nologo /base:"0x6EF50000" /subsystem:windows /dll /incremental:no /debug
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libmysql.lib /nologo /base:"0x6EF50000" /subsystem:windows /dll /incremental:no /debug /out:"x64\Debug\apr_dbd_mysql-1.dll" /pdb:"x64\Debug\apr_dbd_mysql-1.pdb" /implib:"x64\Debug\apr_dbd_mysql-1.lib" /MACHINE:X64
# Begin Special Build Tool
TargetPath=x64\Debug\apr_dbd_mysql-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ENDIF
# Begin Target
# Name "apr_dbd_mysql - Win32 Release"
# Name "apr_dbd_mysql - Win32 Debug"
# Name "apr_dbd_mysql - x64 Release"
# Name "apr_dbd_mysql - x64 Debug"
# Begin Group "Source Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\apr_dbd_mysql.c
# End Source File
# End Group
# Begin Group "Public Header Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=..\include\apr_dbd.h
# End Source File
# End Group
# Begin Group "Internal Header Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=..\include\private\apu_config.h
# End Source File
# Begin Source File
SOURCE=..\include\private\apu_dbd_internal.h
# End Source File
# Begin Source File
SOURCE=..\include\private\apu_internal.h
# End Source File
# End Group
# Begin Source File
SOURCE=..\libaprutil.rc
# End Source File
# End Target
# End Project

1734
dbd/apr_dbd_odbc.c Normal file

File diff suppressed because it is too large Load Diff

191
dbd/apr_dbd_odbc.dsp Normal file
View File

@ -0,0 +1,191 @@
# Microsoft Developer Studio Project File - Name="apr_dbd_odbc" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
CFG=apr_dbd_odbc - 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 "apr_dbd_odbc.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 "apr_dbd_odbc.mak" CFG="apr_dbd_odbc - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "apr_dbd_odbc - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_dbd_odbc - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_dbd_odbc - x64 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_dbd_odbc - x64 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe
!IF "$(CFG)" == "apr_dbd_odbc - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
# ADD CPP /nologo /MD /W3 /Zi /O2 /Oy- /I "../include" /I "../../apr/include" /I "../include/private" /D "NDEBUG" /D "HAVE_SQL_H" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_ODBC=1 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_odbc_src" /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /fo"Release/apr_dbd_odbc-1.res" /d DLL_NAME="apr_dbd_odbc" /d "NDEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib odbc32.lib odbccp32.lib /nologo /base:"0x6EF00000" /subsystem:windows /dll /incremental:no /debug
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib odbc32.lib odbccp32.lib /nologo /base:"0x6EF00000" /subsystem:windows /dll /incremental:no /debug /out:"Release\apr_dbd_odbc-1.dll" /implib:"Release\apr_dbd_odbc-1.lib" /MACHINE:X86 /opt:ref
# Begin Special Build Tool
TargetPath=Release\apr_dbd_odbc-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_dbd_odbc - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /EHsc /c
# ADD CPP /nologo /MDd /W3 /Zi /Od /I "../include" /I "../../apr/include" /I "../include/private" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_ODBC=1 /D "HAVE_SQL_H" /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_odbc_src" /FD /EHsc /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /fo"Debug/apr_dbd_odbc-1.res" /d DLL_NAME="apr_dbd_odbc" /d "_DEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib odbc32.lib odbccp32.lib /nologo /base:"0x6EF00000" /subsystem:windows /dll /incremental:no /debug
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib odbc32.lib odbccp32.lib /nologo /base:"0x6EF00000" /subsystem:windows /dll /incremental:no /debug /out:"Debug\apr_dbd_odbc-1.dll" /implib:"Debug\apr_dbd_odbc-1.lib" /MACHINE:X86
# Begin Special Build Tool
TargetPath=Debug\apr_dbd_odbc-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_dbd_odbc - x64 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "x64\Release"
# PROP BASE Intermediate_Dir "x64\Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "x64\Release"
# PROP Intermediate_Dir "x64\Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
# ADD CPP /nologo /MD /W3 /Zi /O2 /Oy- /I "../include" /I "../../apr/include" /I "../include/private" /D "NDEBUG" /D "HAVE_SQL_H" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_ODBC=1 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_odbc_src" /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /fo"x64\Release/apr_dbd_odbc-1.res" /d DLL_NAME="apr_dbd_odbc" /d "NDEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib odbc32.lib odbccp32.lib /nologo /base:"0x6EF00000" /subsystem:windows /dll /incremental:no /debug
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib odbc32.lib odbccp32.lib /nologo /base:"0x6EF00000" /subsystem:windows /dll /incremental:no /debug /out:"x64\Release\apr_dbd_odbc-1.dll" /implib:"x64\Release\apr_dbd_odbc-1.lib" /MACHINE:X64 /opt:ref
# Begin Special Build Tool
TargetPath=x64\Release\apr_dbd_odbc-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_dbd_odbc - x64 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "x64\Debug"
# PROP BASE Intermediate_Dir "x64\Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "x64\Debug"
# PROP Intermediate_Dir "x64\Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /EHsc /c
# ADD CPP /nologo /MDd /W3 /Zi /Od /I "../include" /I "../../apr/include" /I "../include/private" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_ODBC=1 /D "HAVE_SQL_H" /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_odbc_src" /FD /EHsc /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /fo"x64/debug/apr_dbd_odbc-1.res" /d DLL_NAME="apr_dbd_odbc" /d "_DEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib odbc32.lib odbccp32.lib /nologo /base:"0x6EF00000" /subsystem:windows /dll /incremental:no /debug
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib odbc32.lib odbccp32.lib /nologo /base:"0x6EF00000" /subsystem:windows /dll /incremental:no /debug /out:"x64\Debug\apr_dbd_odbc-1.dll" /implib:"x64\Debug\apr_dbd_odbc-1.lib" /MACHINE:X64
# Begin Special Build Tool
TargetPath=x64\Debug\apr_dbd_odbc-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ENDIF
# Begin Target
# Name "apr_dbd_odbc - Win32 Release"
# Name "apr_dbd_odbc - Win32 Debug"
# Name "apr_dbd_odbc - x64 Release"
# Name "apr_dbd_odbc - x64 Debug"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=.\apr_dbd_odbc.c
# End Source File
# End Group
# Begin Group "Public Header Files"
# PROP Default_Filter ".h"
# Begin Source File
SOURCE=..\include\apr_dbd.h
# End Source File
# End Group
# Begin Group "Internal Header Files"
# PROP Default_Filter ".h"
# End Group
# End Target
# End Project

2220
dbd/apr_dbd_oracle.c Normal file

File diff suppressed because it is too large Load Diff

207
dbd/apr_dbd_oracle.dsp Normal file
View File

@ -0,0 +1,207 @@
# Microsoft Developer Studio Project File - Name="apr_dbd_oracle" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
CFG=apr_dbd_oracle - Win32 Release
!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 "apr_dbd_oracle.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 "apr_dbd_oracle.mak" CFG="apr_dbd_oracle - Win32 Release"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "apr_dbd_oracle - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_dbd_oracle - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_dbd_oracle - x64 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_dbd_oracle - x64 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe
!IF "$(CFG)" == "apr_dbd_oracle - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
# ADD CPP /nologo /MD /W3 /Zi /O2 /Oy- /I "../include" /I "../../apr/include" /I "../include/private" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_ORACLE=1 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_oracle_src" /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /fo"Release/apr_dbd_oracle-1.res" /d DLL_NAME="apr_dbd_oracle" /d "NDEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib oci.lib /nologo /base:"0x6EF40000" /subsystem:windows /dll /incremental:no /debug /opt:ref
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib oci.lib /nologo /base:"0x6EF40000" /subsystem:windows /dll /incremental:no /debug /out:"Release\apr_dbd_oracle-1.dll" /pdb:"Release\apr_dbd_oracle-1.pdb" /implib:"Release\apr_dbd_oracle-1.lib" /MACHINE:X86 /opt:ref
# Begin Special Build Tool
TargetPath=Release\apr_dbd_oracle-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_dbd_oracle - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /EHsc /c
# ADD CPP /nologo /MDd /W3 /Zi /Od /I "../include" /I "../../apr/include" /I "../include/private" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_ORACLE=1 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_oracle_src" /FD /EHsc /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /fo"Debug/apr_dbd_oracle-1.res" /d DLL_NAME="apr_dbd_oracle" /d "_DEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib oci.lib /nologo /base:"0x6EF40000" /subsystem:windows /dll /incremental:no /debug
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib oci.lib /nologo /base:"0x6EF40000" /subsystem:windows /dll /incremental:no /debug /out:"Debug\apr_dbd_oracle-1.dll" /pdb:"Debug\apr_dbd_oracle-1.pdb" /implib:"Debug\apr_dbd_oracle-1.lib" /MACHINE:X86
# Begin Special Build Tool
TargetPath=Debug\apr_dbd_oracle-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_dbd_oracle - x64 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "x64\Release"
# PROP BASE Intermediate_Dir "x64\Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "x64\Release"
# PROP Intermediate_Dir "x64\Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
# ADD CPP /nologo /MD /W3 /Zi /O2 /Oy- /I "../include" /I "../../apr/include" /I "../include/private" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_ORACLE=1 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_oracle_src" /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /fo"x64/Release/apr_dbd_oracle-1.res" /d DLL_NAME="apr_dbd_oracle" /d "NDEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib oci.lib /nologo /base:"0x6EF40000" /subsystem:windows /dll /incremental:no /debug /opt:ref
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib oci.lib /nologo /base:"0x6EF40000" /subsystem:windows /dll /incremental:no /debug /out:"x64\Release\apr_dbd_oracle-1.dll" /pdb:"x64\Release\apr_dbd_oracle-1.pdb" /implib:"x64\Release\apr_dbd_oracle-1.lib" /MACHINE:X64 /opt:ref
# Begin Special Build Tool
TargetPath=x64\Release\apr_dbd_oracle-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_dbd_oracle - x64 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "x64\Debug"
# PROP BASE Intermediate_Dir "x64\Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "x64\Debug"
# PROP Intermediate_Dir "x64\Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /EHsc /c
# ADD CPP /nologo /MDd /W3 /Zi /Od /I "../include" /I "../../apr/include" /I "../include/private" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_ORACLE=1 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_oracle_src" /FD /EHsc /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /fo"x64/Debug/apr_dbd_oracle-1.res" /d DLL_NAME="apr_dbd_oracle" /d "_DEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib oci.lib /nologo /base:"0x6EF40000" /subsystem:windows /dll /incremental:no /debug
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib oci.lib /nologo /base:"0x6EF40000" /subsystem:windows /dll /incremental:no /debug /out:"x64\Debug\apr_dbd_oracle-1.dll" /pdb:"x64\Debug\apr_dbd_oracle-1.pdb" /implib:"x64\Debug\apr_dbd_oracle-1.lib" /MACHINE:X64
# Begin Special Build Tool
TargetPath=x64\Debug\apr_dbd_oracle-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ENDIF
# Begin Target
# Name "apr_dbd_oracle - Win32 Release"
# Name "apr_dbd_oracle - Win32 Debug"
# Name "apr_dbd_oracle - x64 Release"
# Name "apr_dbd_oracle - x64 Debug"
# Begin Group "Source Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\apr_dbd_oracle.c
# End Source File
# End Group
# Begin Group "Public Header Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=..\include\apr_dbd.h
# End Source File
# End Group
# Begin Group "Internal Header Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=..\include\private\apu_config.h
# End Source File
# Begin Source File
SOURCE=..\include\private\apu_dbd_internal.h
# End Source File
# Begin Source File
SOURCE=..\include\private\apu_internal.h
# End Source File
# End Group
# Begin Source File
SOURCE=..\libaprutil.rc
# End Source File
# End Target
# End Project

1315
dbd/apr_dbd_pgsql.c Normal file

File diff suppressed because it is too large Load Diff

207
dbd/apr_dbd_pgsql.dsp Normal file
View File

@ -0,0 +1,207 @@
# Microsoft Developer Studio Project File - Name="apr_dbd_pgsql" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
CFG=apr_dbd_pgsql - Win32 Release
!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 "apr_dbd_pgsql.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 "apr_dbd_pgsql.mak" CFG="apr_dbd_pgsql - Win32 Release"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "apr_dbd_pgsql - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_dbd_pgsql - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_dbd_pgsql - x64 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_dbd_pgsql - x64 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe
!IF "$(CFG)" == "apr_dbd_pgsql - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
# ADD CPP /nologo /MD /W3 /Zi /O2 /Oy- /I "../include" /I "../../apr/include" /I "../include/private" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_PGSQL=1 /D "HAVE_LIBPQ_FE_H" /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_pgsql_src" /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /fo"Release/apr_dbd_pgsql-1.res" /d DLL_NAME="apr_dbd_pgsql" /d "NDEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libpq.lib /nologo /base:"0x6EF30000" /subsystem:windows /dll /incremental:no /debug /opt:ref
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libpq.lib /nologo /base:"0x6EF30000" /subsystem:windows /dll /incremental:no /debug /out:"Release\apr_dbd_pgsql-1.dll" /pdb:"Release\apr_dbd_pgsql-1.pdb" /implib:"Release\apr_dbd_pgsql-1.lib" /MACHINE:X86 /opt:ref
# Begin Special Build Tool
TargetPath=Release\apr_dbd_pgsql-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_dbd_pgsql - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /EHsc /c
# ADD CPP /nologo /MDd /W3 /Zi /Od /I "../include" /I "../../apr/include" /I "../include/private" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_PGSQL=1 /D "HAVE_LIBPQ_FE_H" /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_pgsql_src" /FD /EHsc /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /fo"Debug/apr_dbd_pgsql-1.res" /d DLL_NAME="apr_dbd_pgsql" /d "_DEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libpq.lib /nologo /base:"0x6EF30000" /subsystem:windows /dll /incremental:no /debug
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libpq.lib /nologo /base:"0x6EF30000" /subsystem:windows /dll /incremental:no /debug /out:"Debug\apr_dbd_pgsql-1.dll" /pdb:"Debug\apr_dbd_pgsql-1.pdb" /implib:"Debug\apr_dbd_pgsql-1.lib" /MACHINE:X86
# Begin Special Build Tool
TargetPath=Debug\apr_dbd_pgsql-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_dbd_pgsql - x64 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "x64\Release"
# PROP BASE Intermediate_Dir "x64\Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "x64\Release"
# PROP Intermediate_Dir "x64\Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
# ADD CPP /nologo /MD /W3 /Zi /O2 /Oy- /I "../include" /I "../../apr/include" /I "../include/private" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_PGSQL=1 /D "HAVE_LIBPQ_FE_H" /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_pgsql_src" /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /fo"x64/Release/apr_dbd_pgsql-1.res" /d DLL_NAME="apr_dbd_pgsql" /d "NDEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libpq.lib /nologo /base:"0x6EF30000" /subsystem:windows /dll /incremental:no /debug /opt:ref
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libpq.lib /nologo /base:"0x6EF30000" /subsystem:windows /dll /incremental:no /debug /out:"x64\Release\apr_dbd_pgsql-1.dll" /pdb:"x64\Release\apr_dbd_pgsql-1.pdb" /implib:"x64\Release\apr_dbd_pgsql-1.lib" /MACHINE:X64 /opt:ref
# Begin Special Build Tool
TargetPath=x64\Release\apr_dbd_pgsql-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_dbd_pgsql - x64 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "x64\Debug"
# PROP BASE Intermediate_Dir "x64\Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "x64\Debug"
# PROP Intermediate_Dir "x64\Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /EHsc /c
# ADD CPP /nologo /MDd /W3 /Zi /Od /I "../include" /I "../../apr/include" /I "../include/private" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_PGSQL=1 /D "HAVE_LIBPQ_FE_H" /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_pgsql_src" /FD /EHsc /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /fo"x64/Debug/apr_dbd_pgsql-1.res" /d DLL_NAME="apr_dbd_pgsql" /d "_DEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libpq.lib /nologo /base:"0x6EF30000" /subsystem:windows /dll /incremental:no /debug
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libpq.lib /nologo /base:"0x6EF30000" /subsystem:windows /dll /incremental:no /debug /out:"x64\Debug\apr_dbd_pgsql-1.dll" /pdb:"x64\Debug\apr_dbd_pgsql-1.pdb" /implib:"x64\Debug\apr_dbd_pgsql-1.lib" /MACHINE:X64
# Begin Special Build Tool
TargetPath=x64\Debug\apr_dbd_pgsql-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ENDIF
# Begin Target
# Name "apr_dbd_pgsql - Win32 Release"
# Name "apr_dbd_pgsql - Win32 Debug"
# Name "apr_dbd_pgsql - x64 Release"
# Name "apr_dbd_pgsql - x64 Debug"
# Begin Group "Source Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\apr_dbd_pgsql.c
# End Source File
# End Group
# Begin Group "Public Header Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=..\include\apr_dbd.h
# End Source File
# End Group
# Begin Group "Internal Header Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=..\include\private\apu_config.h
# End Source File
# Begin Source File
SOURCE=..\include\private\apu_dbd_internal.h
# End Source File
# Begin Source File
SOURCE=..\include\private\apu_internal.h
# End Source File
# End Group
# Begin Source File
SOURCE=..\libaprutil.rc
# End Source File
# End Target
# End Project

566
dbd/apr_dbd_sqlite2.c Normal file
View File

@ -0,0 +1,566 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apu.h"
#if APU_HAVE_SQLITE2
#include <ctype.h>
#include <stdlib.h>
#include <sqlite.h>
#include "apr_strings.h"
#include "apr_time.h"
#include "apr_buckets.h"
#include "apr_dbd_internal.h"
struct apr_dbd_transaction_t {
int mode;
int errnum;
apr_dbd_t *handle;
};
struct apr_dbd_t {
sqlite *conn;
char *errmsg;
apr_dbd_transaction_t *trans;
};
struct apr_dbd_results_t {
int random;
sqlite *handle;
char **res;
size_t ntuples;
size_t sz;
size_t index;
apr_pool_t *pool;
};
struct apr_dbd_row_t {
int n;
char **data;
apr_dbd_results_t *res;
};
struct apr_dbd_prepared_t {
const char *name;
int prepared;
};
#define FREE_ERROR_MSG(dbd) \
do { \
if(dbd && dbd->errmsg) { \
free(dbd->errmsg); \
dbd->errmsg = NULL; \
} \
} while(0);
static apr_status_t free_table(void *data)
{
sqlite_free_table(data);
return APR_SUCCESS;
}
static int dbd_sqlite_select(apr_pool_t * pool, apr_dbd_t * sql,
apr_dbd_results_t ** results, const char *query,
int seek)
{
char **result;
int ret = 0;
int tuples = 0;
int fields = 0;
if (sql->trans && sql->trans->errnum) {
return sql->trans->errnum;
}
FREE_ERROR_MSG(sql);
ret = sqlite_get_table(sql->conn, query, &result, &tuples, &fields,
&sql->errmsg);
if (ret == SQLITE_OK) {
if (!*results) {
*results = apr_pcalloc(pool, sizeof(apr_dbd_results_t));
}
(*results)->res = result;
(*results)->ntuples = tuples;
(*results)->sz = fields;
(*results)->random = seek;
(*results)->pool = pool;
if (tuples > 0)
apr_pool_cleanup_register(pool, result, free_table,
apr_pool_cleanup_null);
ret = 0;
}
else {
if (TXN_NOTICE_ERRORS(sql->trans)) {
sql->trans->errnum = ret;
}
}
return ret;
}
static const char *dbd_sqlite_get_name(const apr_dbd_results_t *res, int n)
{
if ((n < 0) || (n >= res->sz)) {
return NULL;
}
return res->res[n];
}
static int dbd_sqlite_get_row(apr_pool_t * pool, apr_dbd_results_t * res,
apr_dbd_row_t ** rowp, int rownum)
{
apr_dbd_row_t *row = *rowp;
int sequential = ((rownum >= 0) && res->random) ? 0 : 1;
if (row == NULL) {
row = apr_palloc(pool, sizeof(apr_dbd_row_t));
*rowp = row;
row->res = res;
row->n = sequential ? 0 : rownum - 1;
}
else {
if (sequential) {
++row->n;
}
else {
row->n = rownum - 1;
}
}
if (row->n >= res->ntuples) {
*rowp = NULL;
apr_pool_cleanup_run(pool, res->res, free_table);
res->res = NULL;
return -1;
}
/* Pointer magic explanation:
* The sqlite result is an array such that the first res->sz elements are
* the column names and each tuple follows afterwards
* ex: (from the sqlite2 documentation)
SELECT employee_name, login, host FROM users WHERE login LIKE * 'd%';
nrow = 2
ncolumn = 3
result[0] = "employee_name"
result[1] = "login"
result[2] = "host"
result[3] = "dummy"
result[4] = "No such user"
result[5] = 0
result[6] = "D. Richard Hipp"
result[7] = "drh"
result[8] = "zadok"
*/
row->data = res->res + res->sz + (res->sz * row->n);
return 0;
}
static const char *dbd_sqlite_get_entry(const apr_dbd_row_t * row, int n)
{
if ((n < 0) || (n >= row->res->sz)) {
return NULL;
}
return row->data[n];
}
static apr_status_t dbd_sqlite_datum_get(const apr_dbd_row_t *row, int n,
apr_dbd_type_e type, void *data)
{
if ((n < 0) || (n >= row->res->sz)) {
return APR_EGENERAL;
}
if (row->data[n] == NULL) {
return APR_ENOENT;
}
switch (type) {
case APR_DBD_TYPE_TINY:
*(char*)data = atoi(row->data[n]);
break;
case APR_DBD_TYPE_UTINY:
*(unsigned char*)data = atoi(row->data[n]);
break;
case APR_DBD_TYPE_SHORT:
*(short*)data = atoi(row->data[n]);
break;
case APR_DBD_TYPE_USHORT:
*(unsigned short*)data = atoi(row->data[n]);
break;
case APR_DBD_TYPE_INT:
*(int*)data = atoi(row->data[n]);
break;
case APR_DBD_TYPE_UINT:
*(unsigned int*)data = atoi(row->data[n]);
break;
case APR_DBD_TYPE_LONG:
*(long*)data = atol(row->data[n]);
break;
case APR_DBD_TYPE_ULONG:
*(unsigned long*)data = atol(row->data[n]);
break;
case APR_DBD_TYPE_LONGLONG:
*(apr_int64_t*)data = apr_atoi64(row->data[n]);
break;
case APR_DBD_TYPE_ULONGLONG:
*(apr_uint64_t*)data = apr_atoi64(row->data[n]);
break;
case APR_DBD_TYPE_FLOAT:
*(float*)data = atof(row->data[n]);
break;
case APR_DBD_TYPE_DOUBLE:
*(double*)data = atof(row->data[n]);
break;
case APR_DBD_TYPE_STRING:
case APR_DBD_TYPE_TEXT:
case APR_DBD_TYPE_TIME:
case APR_DBD_TYPE_DATE:
case APR_DBD_TYPE_DATETIME:
case APR_DBD_TYPE_TIMESTAMP:
case APR_DBD_TYPE_ZTIMESTAMP:
*(char**)data = row->data[n];
break;
case APR_DBD_TYPE_BLOB:
case APR_DBD_TYPE_CLOB:
{
apr_bucket *e;
apr_bucket_brigade *b = (apr_bucket_brigade*)data;
e = apr_bucket_pool_create(row->data[n],strlen(row->data[n]),
row->res->pool, b->bucket_alloc);
APR_BRIGADE_INSERT_TAIL(b, e);
}
break;
case APR_DBD_TYPE_NULL:
*(void**)data = NULL;
break;
default:
return APR_EGENERAL;
}
return APR_SUCCESS;
}
static const char *dbd_sqlite_error(apr_dbd_t * sql, int n)
{
return sql->errmsg;
}
static int dbd_sqlite_query(apr_dbd_t * sql, int *nrows, const char *query)
{
char **result;
int ret;
int tuples = 0;
int fields = 0;
if (sql->trans && sql->trans->errnum) {
return sql->trans->errnum;
}
FREE_ERROR_MSG(sql);
ret =
sqlite_get_table(sql->conn, query, &result, &tuples, &fields,
&sql->errmsg);
if (ret == SQLITE_OK) {
*nrows = sqlite_changes(sql->conn);
if (tuples > 0)
free(result);
ret = 0;
}
if (TXN_NOTICE_ERRORS(sql->trans)) {
sql->trans->errnum = ret;
}
return ret;
}
static apr_status_t free_mem(void *data)
{
sqlite_freemem(data);
return APR_SUCCESS;
}
static const char *dbd_sqlite_escape(apr_pool_t * pool, const char *arg,
apr_dbd_t * sql)
{
char *ret = sqlite_mprintf("%q", arg);
apr_pool_cleanup_register(pool, ret, free_mem, apr_pool_cleanup_null);
return ret;
}
static int dbd_sqlite_prepare(apr_pool_t * pool, apr_dbd_t * sql,
const char *query, const char *label,
int nargs, int nvals, apr_dbd_type_e *types,
apr_dbd_prepared_t ** statement)
{
return APR_ENOTIMPL;
}
static int dbd_sqlite_pquery(apr_pool_t * pool, apr_dbd_t * sql,
int *nrows, apr_dbd_prepared_t * statement,
const char **values)
{
return APR_ENOTIMPL;
}
static int dbd_sqlite_pvquery(apr_pool_t * pool, apr_dbd_t * sql,
int *nrows, apr_dbd_prepared_t * statement,
va_list args)
{
return APR_ENOTIMPL;
}
static int dbd_sqlite_pselect(apr_pool_t * pool, apr_dbd_t * sql,
apr_dbd_results_t ** results,
apr_dbd_prepared_t * statement,
int seek, const char **values)
{
return APR_ENOTIMPL;
}
static int dbd_sqlite_pvselect(apr_pool_t * pool, apr_dbd_t * sql,
apr_dbd_results_t ** results,
apr_dbd_prepared_t * statement, int seek,
va_list args)
{
return APR_ENOTIMPL;
}
static int dbd_sqlite_pbquery(apr_pool_t * pool, apr_dbd_t * sql,
int *nrows, apr_dbd_prepared_t * statement,
const void **values)
{
return APR_ENOTIMPL;
}
static int dbd_sqlite_pvbquery(apr_pool_t * pool, apr_dbd_t * sql,
int *nrows, apr_dbd_prepared_t * statement,
va_list args)
{
return APR_ENOTIMPL;
}
static int dbd_sqlite_pbselect(apr_pool_t * pool, apr_dbd_t * sql,
apr_dbd_results_t ** results,
apr_dbd_prepared_t * statement,
int seek, const void **values)
{
return APR_ENOTIMPL;
}
static int dbd_sqlite_pvbselect(apr_pool_t * pool, apr_dbd_t * sql,
apr_dbd_results_t ** results,
apr_dbd_prepared_t * statement, int seek,
va_list args)
{
return APR_ENOTIMPL;
}
static int dbd_sqlite_start_transaction(apr_pool_t * pool, apr_dbd_t * handle,
apr_dbd_transaction_t ** trans)
{
int ret, rows;
ret = dbd_sqlite_query(handle, &rows, "BEGIN TRANSACTION");
if (ret == 0) {
if (!*trans) {
*trans = apr_pcalloc(pool, sizeof(apr_dbd_transaction_t));
}
(*trans)->handle = handle;
handle->trans = *trans;
}
else {
ret = -1;
}
return ret;
}
static int dbd_sqlite_end_transaction(apr_dbd_transaction_t * trans)
{
int rows;
int ret = -1; /* no transaction is an error cond */
if (trans) {
/* rollback on error or explicit rollback request */
if (trans->errnum || TXN_DO_ROLLBACK(trans)) {
trans->errnum = 0;
ret =
dbd_sqlite_query(trans->handle, &rows,
"ROLLBACK TRANSACTION");
}
else {
ret =
dbd_sqlite_query(trans->handle, &rows, "COMMIT TRANSACTION");
}
trans->handle->trans = NULL;
}
return ret;
}
static int dbd_sqlite_transaction_mode_get(apr_dbd_transaction_t *trans)
{
if (!trans)
return APR_DBD_TRANSACTION_COMMIT;
return trans->mode;
}
static int dbd_sqlite_transaction_mode_set(apr_dbd_transaction_t *trans,
int mode)
{
if (!trans)
return APR_DBD_TRANSACTION_COMMIT;
return trans->mode = (mode & TXN_MODE_BITS);
}
static apr_status_t error_free(void *data)
{
free(data);
return APR_SUCCESS;
}
static apr_dbd_t *dbd_sqlite_open(apr_pool_t * pool, const char *params_,
const char **error)
{
apr_dbd_t *sql;
sqlite *conn = NULL;
char *perm;
int iperms = 600;
char* params = apr_pstrdup(pool, params_);
/* params = "[filename]:[permissions]"
* example: "shopping.db:600"
*/
perm = strstr(params, ":");
if (perm) {
*(perm++) = '\x00'; /* split the filename and permissions */
if (strlen(perm) > 0)
iperms = atoi(perm);
}
if (error) {
*error = NULL;
conn = sqlite_open(params, iperms, (char **)error);
if (*error) {
apr_pool_cleanup_register(pool, *error, error_free,
apr_pool_cleanup_null);
}
}
else {
conn = sqlite_open(params, iperms, NULL);
}
sql = apr_pcalloc(pool, sizeof(*sql));
sql->conn = conn;
return sql;
}
static apr_status_t dbd_sqlite_close(apr_dbd_t * handle)
{
if (handle->conn) {
sqlite_close(handle->conn);
handle->conn = NULL;
}
return APR_SUCCESS;
}
static apr_status_t dbd_sqlite_check_conn(apr_pool_t * pool,
apr_dbd_t * handle)
{
if (handle->conn == NULL)
return -1;
return APR_SUCCESS;
}
static int dbd_sqlite_select_db(apr_pool_t * pool, apr_dbd_t * handle,
const char *name)
{
return APR_ENOTIMPL;
}
static void *dbd_sqlite_native(apr_dbd_t * handle)
{
return handle->conn;
}
static int dbd_sqlite_num_cols(apr_dbd_results_t * res)
{
return res->sz;
}
static int dbd_sqlite_num_tuples(apr_dbd_results_t * res)
{
return res->ntuples;
}
APU_MODULE_DECLARE_DATA const apr_dbd_driver_t apr_dbd_sqlite2_driver = {
"sqlite2",
NULL,
dbd_sqlite_native,
dbd_sqlite_open,
dbd_sqlite_check_conn,
dbd_sqlite_close,
dbd_sqlite_select_db,
dbd_sqlite_start_transaction,
dbd_sqlite_end_transaction,
dbd_sqlite_query,
dbd_sqlite_select,
dbd_sqlite_num_cols,
dbd_sqlite_num_tuples,
dbd_sqlite_get_row,
dbd_sqlite_get_entry,
dbd_sqlite_error,
dbd_sqlite_escape,
dbd_sqlite_prepare,
dbd_sqlite_pvquery,
dbd_sqlite_pvselect,
dbd_sqlite_pquery,
dbd_sqlite_pselect,
dbd_sqlite_get_name,
dbd_sqlite_transaction_mode_get,
dbd_sqlite_transaction_mode_set,
NULL,
dbd_sqlite_pvbquery,
dbd_sqlite_pvbselect,
dbd_sqlite_pbquery,
dbd_sqlite_pbselect,
dbd_sqlite_datum_get
};
#endif

207
dbd/apr_dbd_sqlite2.dsp Normal file
View File

@ -0,0 +1,207 @@
# Microsoft Developer Studio Project File - Name="apr_dbd_sqlite2" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
CFG=apr_dbd_sqlite2 - Win32 Release
!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 "apr_dbd_sqlite2.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 "apr_dbd_sqlite2.mak" CFG="apr_dbd_sqlite2 - Win32 Release"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "apr_dbd_sqlite2 - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_dbd_sqlite2 - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_dbd_sqlite2 - x64 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_dbd_sqlite2 - x64 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe
!IF "$(CFG)" == "apr_dbd_sqlite2 - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
# ADD CPP /nologo /MD /W3 /Zi /O2 /Oy- /I "../include" /I "../../apr/include" /I "../include/private" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_SQLITE2=1 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_sqlite2_src" /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /fo"Release/apr_dbd_sqlite2-1.res" /d DLL_NAME="apr_dbd_sqlite2" /d "NDEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib sqlite2.lib /nologo /base:"0x6EF10000" /subsystem:windows /dll /incremental:no /debug /opt:ref
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib sqlite2.lib /nologo /base:"0x6EF10000" /subsystem:windows /dll /incremental:no /debug /out:"Release\apr_dbd_sqlite2-1.dll" /pdb:"Release\apr_dbd_sqlite2-1.pdb" /implib:"Release\apr_dbd_sqlite2-1.lib" /MACHINE:X86 /opt:ref
# Begin Special Build Tool
TargetPath=Release\apr_dbd_sqlite2-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_dbd_sqlite2 - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /EHsc /c
# ADD CPP /nologo /MDd /W3 /Zi /Od /I "../include" /I "../../apr/include" /I "../include/private" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_SQLITE2=1 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_sqlite2_src" /FD /EHsc /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /fo"Debug/apr_dbd_sqlite2-1.res" /d DLL_NAME="apr_dbd_sqlite2" /d "_DEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib sqlite2.lib /nologo /base:"0x6EF10000" /subsystem:windows /dll /incremental:no /debug
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib sqlite2.lib /nologo /base:"0x6EF10000" /subsystem:windows /dll /incremental:no /debug /out:"Debug\apr_dbd_sqlite2-1.dll" /pdb:"Debug\apr_dbd_sqlite2-1.pdb" /implib:"Debug\apr_dbd_sqlite2-1.lib" /MACHINE:X86
# Begin Special Build Tool
TargetPath=Debug\apr_dbd_sqlite2-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_dbd_sqlite2 - x64 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "x64\Release"
# PROP BASE Intermediate_Dir "x64\Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "x64\Release"
# PROP Intermediate_Dir "x64\Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
# ADD CPP /nologo /MD /W3 /Zi /O2 /Oy- /I "../include" /I "../../apr/include" /I "../include/private" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_SQLITE2=1 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_sqlite2_src" /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /fo"x64/Release/apr_dbd_sqlite2-1.res" /d DLL_NAME="apr_dbd_sqlite2" /d "NDEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib sqlite2.lib /nologo /base:"0x6EF10000" /subsystem:windows /dll /incremental:no /debug /opt:ref
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib sqlite2.lib /nologo /base:"0x6EF10000" /subsystem:windows /dll /incremental:no /debug /out:"x64\Release\apr_dbd_sqlite2-1.dll" /pdb:"x64\Release\apr_dbd_sqlite2-1.pdb" /implib:"x64\Release\apr_dbd_sqlite2-1.lib" /MACHINE:X64 /opt:ref
# Begin Special Build Tool
TargetPath=x64\Release\apr_dbd_sqlite2-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_dbd_sqlite2 - x64 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "x64\Debug"
# PROP BASE Intermediate_Dir "x64\Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "x64\Debug"
# PROP Intermediate_Dir "x64\Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /EHsc /c
# ADD CPP /nologo /MDd /W3 /Zi /Od /I "../include" /I "../../apr/include" /I "../include/private" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_SQLITE2=1 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_sqlite2_src" /FD /EHsc /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /fo"x64/Debug/apr_dbd_sqlite2-1.res" /d DLL_NAME="apr_dbd_sqlite2" /d "_DEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib sqlite2.lib /nologo /base:"0x6EF10000" /subsystem:windows /dll /incremental:no /debug
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib sqlite2.lib /nologo /base:"0x6EF10000" /subsystem:windows /dll /incremental:no /debug /out:"x64\Debug\apr_dbd_sqlite2-1.dll" /pdb:"x64\Debug\apr_dbd_sqlite2-1.pdb" /implib:"x64\Debug\apr_dbd_sqlite2-1.lib" /MACHINE:X64
# Begin Special Build Tool
TargetPath=x64\Debug\apr_dbd_sqlite2-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ENDIF
# Begin Target
# Name "apr_dbd_sqlite2 - Win32 Release"
# Name "apr_dbd_sqlite2 - Win32 Debug"
# Name "apr_dbd_sqlite2 - x64 Release"
# Name "apr_dbd_sqlite2 - x64 Debug"
# Begin Group "Source Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\apr_dbd_sqlite2.c
# End Source File
# End Group
# Begin Group "Public Header Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=..\include\apr_dbd.h
# End Source File
# End Group
# Begin Group "Internal Header Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=..\include\private\apu_config.h
# End Source File
# Begin Source File
SOURCE=..\include\private\apu_dbd_internal.h
# End Source File
# Begin Source File
SOURCE=..\include\private\apu_internal.h
# End Source File
# End Group
# Begin Source File
SOURCE=..\libaprutil.rc
# End Source File
# End Target
# End Project

914
dbd/apr_dbd_sqlite3.c Normal file
View File

@ -0,0 +1,914 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apu.h"
#if APU_HAVE_SQLITE3
#include <ctype.h>
#include <stdlib.h>
#include <sqlite3.h>
#include "apr_strings.h"
#include "apr_time.h"
#include "apr_buckets.h"
#include "apr_dbd_internal.h"
#define MAX_RETRY_COUNT 15
#define MAX_RETRY_SLEEP 100000
struct apr_dbd_transaction_t {
int mode;
int errnum;
apr_dbd_t *handle;
};
struct apr_dbd_t {
sqlite3 *conn;
apr_dbd_transaction_t *trans;
apr_pool_t *pool;
apr_dbd_prepared_t *prep;
};
typedef struct {
char *name;
char *value;
int size;
int type;
} apr_dbd_column_t;
struct apr_dbd_row_t {
apr_dbd_results_t *res;
apr_dbd_column_t **columns;
apr_dbd_row_t *next_row;
int columnCount;
int rownum;
};
struct apr_dbd_results_t {
int random;
sqlite3 *handle;
sqlite3_stmt *stmt;
apr_dbd_row_t *next_row;
size_t sz;
int tuples;
char **col_names;
apr_pool_t *pool;
};
struct apr_dbd_prepared_t {
sqlite3_stmt *stmt;
apr_dbd_prepared_t *next;
int nargs;
int nvals;
apr_dbd_type_e *types;
};
#define dbd_sqlite3_is_success(x) (((x) == SQLITE_DONE) || ((x) == SQLITE_OK))
static int dbd_sqlite3_select_internal(apr_pool_t *pool,
apr_dbd_t *sql,
apr_dbd_results_t **results,
sqlite3_stmt *stmt, int seek)
{
int ret, retry_count = 0, column_count;
size_t i, num_tuples = 0;
int increment = 0;
apr_dbd_row_t *row = NULL;
apr_dbd_row_t *lastrow = NULL;
apr_dbd_column_t *column;
char *hold = NULL;
column_count = sqlite3_column_count(stmt);
if (!*results) {
*results = apr_pcalloc(pool, sizeof(apr_dbd_results_t));
}
(*results)->stmt = stmt;
(*results)->sz = column_count;
(*results)->random = seek;
(*results)->next_row = 0;
(*results)->tuples = 0;
(*results)->col_names = apr_pcalloc(pool, column_count * sizeof(char *));
(*results)->pool = pool;
do {
ret = sqlite3_step(stmt);
if (ret == SQLITE_BUSY) {
if (retry_count++ > MAX_RETRY_COUNT) {
ret = SQLITE_ERROR;
} else {
apr_dbd_mutex_unlock();
apr_sleep(MAX_RETRY_SLEEP);
apr_dbd_mutex_lock();
}
} else if (ret == SQLITE_ROW) {
int length;
row = apr_palloc(pool, sizeof(apr_dbd_row_t));
row->res = *results;
increment = sizeof(apr_dbd_column_t *);
length = increment * (*results)->sz;
row->columns = apr_palloc(pool, length);
row->columnCount = column_count;
for (i = 0; i < (*results)->sz; i++) {
column = apr_palloc(pool, sizeof(apr_dbd_column_t));
row->columns[i] = column;
/* copy column name once only */
if ((*results)->col_names[i] == NULL) {
(*results)->col_names[i] =
apr_pstrdup(pool, sqlite3_column_name(stmt, i));
}
column->name = (*results)->col_names[i];
column->size = sqlite3_column_bytes(stmt, i);
column->type = sqlite3_column_type(stmt, i);
column->value = NULL;
switch (column->type) {
case SQLITE_FLOAT:
case SQLITE_INTEGER:
case SQLITE_TEXT:
hold = (char *) sqlite3_column_text(stmt, i);
if (hold) {
column->value = apr_pstrmemdup(pool, hold,
column->size);
}
break;
case SQLITE_BLOB:
hold = (char *) sqlite3_column_blob(stmt, i);
if (hold) {
column->value = apr_pstrmemdup(pool, hold,
column->size);
}
break;
case SQLITE_NULL:
break;
}
}
row->rownum = num_tuples++;
row->next_row = 0;
(*results)->tuples = num_tuples;
if ((*results)->next_row == 0) {
(*results)->next_row = row;
}
if (lastrow != 0) {
lastrow->next_row = row;
}
lastrow = row;
}
} while (ret == SQLITE_ROW || ret == SQLITE_BUSY);
if (dbd_sqlite3_is_success(ret)) {
ret = 0;
}
return ret;
}
static int dbd_sqlite3_select(apr_pool_t *pool, apr_dbd_t *sql,
apr_dbd_results_t **results, const char *query,
int seek)
{
sqlite3_stmt *stmt = NULL;
const char *tail = NULL;
int ret;
if (sql->trans && sql->trans->errnum) {
return sql->trans->errnum;
}
apr_dbd_mutex_lock();
ret = sqlite3_prepare(sql->conn, query, strlen(query), &stmt, &tail);
if (dbd_sqlite3_is_success(ret)) {
ret = dbd_sqlite3_select_internal(pool, sql, results, stmt, seek);
}
sqlite3_finalize(stmt);
apr_dbd_mutex_unlock();
if (TXN_NOTICE_ERRORS(sql->trans)) {
sql->trans->errnum = ret;
}
return ret;
}
static const char *dbd_sqlite3_get_name(const apr_dbd_results_t *res, int n)
{
if ((n < 0) || ((size_t)n >= res->sz)) {
return NULL;
}
return res->col_names[n];
}
static int dbd_sqlite3_get_row(apr_pool_t *pool, apr_dbd_results_t *res,
apr_dbd_row_t **rowp, int rownum)
{
int i = 0;
if (rownum == -1) {
*rowp = res->next_row;
if (*rowp == 0)
return -1;
res->next_row = (*rowp)->next_row;
return 0;
}
if (rownum > res->tuples) {
return -1;
}
rownum--;
*rowp = res->next_row;
for (; *rowp != 0; i++, *rowp = (*rowp)->next_row) {
if (i == rownum) {
return 0;
}
}
return -1;
}
static const char *dbd_sqlite3_get_entry(const apr_dbd_row_t *row, int n)
{
apr_dbd_column_t *column;
const char *value;
if ((n < 0) || (n >= row->columnCount)) {
return NULL;
}
column = row->columns[n];
value = column->value;
return value;
}
static apr_status_t dbd_sqlite3_datum_get(const apr_dbd_row_t *row, int n,
apr_dbd_type_e type, void *data)
{
if ((n < 0) || ((size_t)n >= row->res->sz)) {
return APR_EGENERAL;
}
if (row->columns[n]->type == SQLITE_NULL) {
return APR_ENOENT;
}
switch (type) {
case APR_DBD_TYPE_TINY:
*(char*)data = atoi(row->columns[n]->value);
break;
case APR_DBD_TYPE_UTINY:
*(unsigned char*)data = atoi(row->columns[n]->value);
break;
case APR_DBD_TYPE_SHORT:
*(short*)data = atoi(row->columns[n]->value);
break;
case APR_DBD_TYPE_USHORT:
*(unsigned short*)data = atoi(row->columns[n]->value);
break;
case APR_DBD_TYPE_INT:
*(int*)data = atoi(row->columns[n]->value);
break;
case APR_DBD_TYPE_UINT:
*(unsigned int*)data = atoi(row->columns[n]->value);
break;
case APR_DBD_TYPE_LONG:
*(long*)data = atol(row->columns[n]->value);
break;
case APR_DBD_TYPE_ULONG:
*(unsigned long*)data = atol(row->columns[n]->value);
break;
case APR_DBD_TYPE_LONGLONG:
*(apr_int64_t*)data = apr_atoi64(row->columns[n]->value);
break;
case APR_DBD_TYPE_ULONGLONG:
*(apr_uint64_t*)data = apr_atoi64(row->columns[n]->value);
break;
case APR_DBD_TYPE_FLOAT:
*(float*)data = (float)atof(row->columns[n]->value);
break;
case APR_DBD_TYPE_DOUBLE:
*(double*)data = atof(row->columns[n]->value);
break;
case APR_DBD_TYPE_STRING:
case APR_DBD_TYPE_TEXT:
case APR_DBD_TYPE_TIME:
case APR_DBD_TYPE_DATE:
case APR_DBD_TYPE_DATETIME:
case APR_DBD_TYPE_TIMESTAMP:
case APR_DBD_TYPE_ZTIMESTAMP:
*(char**)data = row->columns[n]->value;
break;
case APR_DBD_TYPE_BLOB:
case APR_DBD_TYPE_CLOB:
{
apr_bucket *e;
apr_bucket_brigade *b = (apr_bucket_brigade*)data;
e = apr_bucket_pool_create(row->columns[n]->value,
row->columns[n]->size,
row->res->pool, b->bucket_alloc);
APR_BRIGADE_INSERT_TAIL(b, e);
}
break;
case APR_DBD_TYPE_NULL:
*(void**)data = NULL;
break;
default:
return APR_EGENERAL;
}
return APR_SUCCESS;
}
static const char *dbd_sqlite3_error(apr_dbd_t *sql, int n)
{
return sqlite3_errmsg(sql->conn);
}
static int dbd_sqlite3_query_internal(apr_dbd_t *sql, sqlite3_stmt *stmt,
int *nrows)
{
int ret = -1, retry_count = 0;
while(retry_count++ <= MAX_RETRY_COUNT) {
ret = sqlite3_step(stmt);
if (ret != SQLITE_BUSY)
break;
apr_dbd_mutex_unlock();
apr_sleep(MAX_RETRY_SLEEP);
apr_dbd_mutex_lock();
}
*nrows = sqlite3_changes(sql->conn);
if (dbd_sqlite3_is_success(ret)) {
ret = 0;
}
return ret;
}
static int dbd_sqlite3_query(apr_dbd_t *sql, int *nrows, const char *query)
{
sqlite3_stmt *stmt = NULL;
const char *tail = NULL;
int ret = -1, length = 0;
if (sql->trans && sql->trans->errnum) {
return sql->trans->errnum;
}
length = strlen(query);
apr_dbd_mutex_lock();
do {
ret = sqlite3_prepare(sql->conn, query, length, &stmt, &tail);
if (ret != SQLITE_OK) {
sqlite3_finalize(stmt);
break;
}
ret = dbd_sqlite3_query_internal(sql, stmt, nrows);
sqlite3_finalize(stmt);
length -= (tail - query);
query = tail;
} while (length > 0);
apr_dbd_mutex_unlock();
if (TXN_NOTICE_ERRORS(sql->trans)) {
sql->trans->errnum = ret;
}
return ret;
}
static apr_status_t free_mem(void *data)
{
sqlite3_free(data);
return APR_SUCCESS;
}
static const char *dbd_sqlite3_escape(apr_pool_t *pool, const char *arg,
apr_dbd_t *sql)
{
char *ret = sqlite3_mprintf("%q", arg);
apr_pool_cleanup_register(pool, ret, free_mem,
apr_pool_cleanup_null);
return ret;
}
static int dbd_sqlite3_prepare(apr_pool_t *pool, apr_dbd_t *sql,
const char *query, const char *label,
int nargs, int nvals, apr_dbd_type_e *types,
apr_dbd_prepared_t **statement)
{
sqlite3_stmt *stmt;
const char *tail = NULL;
int ret;
apr_dbd_mutex_lock();
ret = sqlite3_prepare(sql->conn, query, strlen(query), &stmt, &tail);
if (ret == SQLITE_OK) {
apr_dbd_prepared_t *prep;
prep = apr_pcalloc(sql->pool, sizeof(*prep));
prep->stmt = stmt;
prep->next = sql->prep;
prep->nargs = nargs;
prep->nvals = nvals;
prep->types = types;
/* link new statement to the handle */
sql->prep = prep;
*statement = prep;
} else {
sqlite3_finalize(stmt);
}
apr_dbd_mutex_unlock();
return ret;
}
static void dbd_sqlite3_bind(apr_dbd_prepared_t *statement, const char **values)
{
sqlite3_stmt *stmt = statement->stmt;
int i, j;
for (i = 0, j = 0; i < statement->nargs; i++, j++) {
if (values[j] == NULL) {
sqlite3_bind_null(stmt, i + 1);
}
else {
switch (statement->types[i]) {
case APR_DBD_TYPE_BLOB:
case APR_DBD_TYPE_CLOB:
{
char *data = (char *)values[j];
int size = atoi((char*)values[++j]);
/* skip table and column */
j += 2;
sqlite3_bind_blob(stmt, i + 1, data, size, SQLITE_STATIC);
}
break;
default:
sqlite3_bind_text(stmt, i + 1, values[j],
strlen(values[j]), SQLITE_STATIC);
break;
}
}
}
return;
}
static int dbd_sqlite3_pquery(apr_pool_t *pool, apr_dbd_t *sql,
int *nrows, apr_dbd_prepared_t *statement,
const char **values)
{
sqlite3_stmt *stmt = statement->stmt;
int ret = -1;
if (sql->trans && sql->trans->errnum) {
return sql->trans->errnum;
}
apr_dbd_mutex_lock();
ret = sqlite3_reset(stmt);
if (ret == SQLITE_OK) {
dbd_sqlite3_bind(statement, values);
ret = dbd_sqlite3_query_internal(sql, stmt, nrows);
sqlite3_reset(stmt);
}
apr_dbd_mutex_unlock();
if (TXN_NOTICE_ERRORS(sql->trans)) {
sql->trans->errnum = ret;
}
return ret;
}
static int dbd_sqlite3_pvquery(apr_pool_t *pool, apr_dbd_t *sql, int *nrows,
apr_dbd_prepared_t *statement, va_list args)
{
const char **values;
int i;
if (sql->trans && sql->trans->errnum) {
return sql->trans->errnum;
}
values = apr_palloc(pool, sizeof(*values) * statement->nvals);
for (i = 0; i < statement->nvals; i++) {
values[i] = va_arg(args, const char*);
}
return dbd_sqlite3_pquery(pool, sql, nrows, statement, values);
}
static int dbd_sqlite3_pselect(apr_pool_t *pool, apr_dbd_t *sql,
apr_dbd_results_t **results,
apr_dbd_prepared_t *statement, int seek,
const char **values)
{
sqlite3_stmt *stmt = statement->stmt;
int ret;
if (sql->trans && sql->trans->errnum) {
return sql->trans->errnum;
}
apr_dbd_mutex_lock();
ret = sqlite3_reset(stmt);
if (ret == SQLITE_OK) {
dbd_sqlite3_bind(statement, values);
ret = dbd_sqlite3_select_internal(pool, sql, results, stmt, seek);
sqlite3_reset(stmt);
}
apr_dbd_mutex_unlock();
if (TXN_NOTICE_ERRORS(sql->trans)) {
sql->trans->errnum = ret;
}
return ret;
}
static int dbd_sqlite3_pvselect(apr_pool_t *pool, apr_dbd_t *sql,
apr_dbd_results_t **results,
apr_dbd_prepared_t *statement, int seek,
va_list args)
{
const char **values;
int i;
if (sql->trans && sql->trans->errnum) {
return sql->trans->errnum;
}
values = apr_palloc(pool, sizeof(*values) * statement->nvals);
for (i = 0; i < statement->nvals; i++) {
values[i] = va_arg(args, const char*);
}
return dbd_sqlite3_pselect(pool, sql, results, statement, seek, values);
}
static void dbd_sqlite3_bbind(apr_dbd_prepared_t * statement,
const void **values)
{
sqlite3_stmt *stmt = statement->stmt;
int i, j;
apr_dbd_type_e type;
for (i = 0, j = 0; i < statement->nargs; i++, j++) {
type = (values[j] == NULL ? APR_DBD_TYPE_NULL : statement->types[i]);
switch (type) {
case APR_DBD_TYPE_TINY:
sqlite3_bind_int(stmt, i + 1, *(char*)values[j]);
break;
case APR_DBD_TYPE_UTINY:
sqlite3_bind_int(stmt, i + 1, *(unsigned char*)values[j]);
break;
case APR_DBD_TYPE_SHORT:
sqlite3_bind_int(stmt, i + 1, *(short*)values[j]);
break;
case APR_DBD_TYPE_USHORT:
sqlite3_bind_int(stmt, i + 1, *(unsigned short*)values[j]);
break;
case APR_DBD_TYPE_INT:
sqlite3_bind_int(stmt, i + 1, *(int*)values[j]);
break;
case APR_DBD_TYPE_UINT:
sqlite3_bind_int(stmt, i + 1, *(unsigned int*)values[j]);
break;
case APR_DBD_TYPE_LONG:
sqlite3_bind_int64(stmt, i + 1, *(long*)values[j]);
break;
case APR_DBD_TYPE_ULONG:
sqlite3_bind_int64(stmt, i + 1, *(unsigned long*)values[j]);
break;
case APR_DBD_TYPE_LONGLONG:
sqlite3_bind_int64(stmt, i + 1, *(apr_int64_t*)values[j]);
break;
case APR_DBD_TYPE_ULONGLONG:
sqlite3_bind_int64(stmt, i + 1, *(apr_uint64_t*)values[j]);
break;
case APR_DBD_TYPE_FLOAT:
sqlite3_bind_double(stmt, i + 1, *(float*)values[j]);
break;
case APR_DBD_TYPE_DOUBLE:
sqlite3_bind_double(stmt, i + 1, *(double*)values[j]);
break;
case APR_DBD_TYPE_STRING:
case APR_DBD_TYPE_TEXT:
case APR_DBD_TYPE_TIME:
case APR_DBD_TYPE_DATE:
case APR_DBD_TYPE_DATETIME:
case APR_DBD_TYPE_TIMESTAMP:
case APR_DBD_TYPE_ZTIMESTAMP:
sqlite3_bind_text(stmt, i + 1, values[j], strlen(values[j]),
SQLITE_STATIC);
break;
case APR_DBD_TYPE_BLOB:
case APR_DBD_TYPE_CLOB:
{
char *data = (char*)values[j];
apr_size_t size = *(apr_size_t*)values[++j];
sqlite3_bind_blob(stmt, i + 1, data, size, SQLITE_STATIC);
/* skip table and column */
j += 2;
}
break;
case APR_DBD_TYPE_NULL:
default:
sqlite3_bind_null(stmt, i + 1);
break;
}
}
return;
}
static int dbd_sqlite3_pbquery(apr_pool_t * pool, apr_dbd_t * sql,
int *nrows, apr_dbd_prepared_t * statement,
const void **values)
{
sqlite3_stmt *stmt = statement->stmt;
int ret = -1;
if (sql->trans && sql->trans->errnum) {
return sql->trans->errnum;
}
apr_dbd_mutex_lock();
ret = sqlite3_reset(stmt);
if (ret == SQLITE_OK) {
dbd_sqlite3_bbind(statement, values);
ret = dbd_sqlite3_query_internal(sql, stmt, nrows);
sqlite3_reset(stmt);
}
apr_dbd_mutex_unlock();
if (TXN_NOTICE_ERRORS(sql->trans)) {
sql->trans->errnum = ret;
}
return ret;
}
static int dbd_sqlite3_pvbquery(apr_pool_t * pool, apr_dbd_t * sql,
int *nrows, apr_dbd_prepared_t * statement,
va_list args)
{
const void **values;
int i;
if (sql->trans && sql->trans->errnum) {
return sql->trans->errnum;
}
values = apr_palloc(pool, sizeof(*values) * statement->nvals);
for (i = 0; i < statement->nvals; i++) {
values[i] = va_arg(args, const void*);
}
return dbd_sqlite3_pbquery(pool, sql, nrows, statement, values);
}
static int dbd_sqlite3_pbselect(apr_pool_t * pool, apr_dbd_t * sql,
apr_dbd_results_t ** results,
apr_dbd_prepared_t * statement,
int seek, const void **values)
{
sqlite3_stmt *stmt = statement->stmt;
int ret;
if (sql->trans && sql->trans->errnum) {
return sql->trans->errnum;
}
apr_dbd_mutex_lock();
ret = sqlite3_reset(stmt);
if (ret == SQLITE_OK) {
dbd_sqlite3_bbind(statement, values);
ret = dbd_sqlite3_select_internal(pool, sql, results, stmt, seek);
sqlite3_reset(stmt);
}
apr_dbd_mutex_unlock();
if (TXN_NOTICE_ERRORS(sql->trans)) {
sql->trans->errnum = ret;
}
return ret;
}
static int dbd_sqlite3_pvbselect(apr_pool_t * pool, apr_dbd_t * sql,
apr_dbd_results_t ** results,
apr_dbd_prepared_t * statement, int seek,
va_list args)
{
const void **values;
int i;
if (sql->trans && sql->trans->errnum) {
return sql->trans->errnum;
}
values = apr_palloc(pool, sizeof(*values) * statement->nvals);
for (i = 0; i < statement->nvals; i++) {
values[i] = va_arg(args, const void*);
}
return dbd_sqlite3_pbselect(pool, sql, results, statement, seek, values);
}
static int dbd_sqlite3_start_transaction(apr_pool_t *pool,
apr_dbd_t *handle,
apr_dbd_transaction_t **trans)
{
int ret = 0;
int nrows = 0;
ret = dbd_sqlite3_query(handle, &nrows, "BEGIN IMMEDIATE");
if (!*trans) {
*trans = apr_pcalloc(pool, sizeof(apr_dbd_transaction_t));
(*trans)->handle = handle;
handle->trans = *trans;
}
return ret;
}
static int dbd_sqlite3_end_transaction(apr_dbd_transaction_t *trans)
{
int ret = -1; /* ending transaction that was never started is an error */
int nrows = 0;
if (trans) {
/* rollback on error or explicit rollback request */
if (trans->errnum || TXN_DO_ROLLBACK(trans)) {
trans->errnum = 0;
ret = dbd_sqlite3_query(trans->handle, &nrows, "ROLLBACK");
} else {
ret = dbd_sqlite3_query(trans->handle, &nrows, "COMMIT");
}
trans->handle->trans = NULL;
}
return ret;
}
static int dbd_sqlite3_transaction_mode_get(apr_dbd_transaction_t *trans)
{
if (!trans)
return APR_DBD_TRANSACTION_COMMIT;
return trans->mode;
}
static int dbd_sqlite3_transaction_mode_set(apr_dbd_transaction_t *trans,
int mode)
{
if (!trans)
return APR_DBD_TRANSACTION_COMMIT;
return trans->mode = (mode & TXN_MODE_BITS);
}
static apr_dbd_t *dbd_sqlite3_open(apr_pool_t *pool, const char *params,
const char **error)
{
apr_dbd_t *sql = NULL;
sqlite3 *conn = NULL;
int sqlres;
if (!params)
return NULL;
sqlres = sqlite3_open(params, &conn);
if (sqlres != SQLITE_OK) {
if (error) {
*error = apr_pstrdup(pool, sqlite3_errmsg(conn));
}
sqlite3_close(conn);
return NULL;
}
/* should we register rand or power functions to the sqlite VM? */
sql = apr_pcalloc(pool, sizeof(*sql));
sql->conn = conn;
sql->pool = pool;
sql->trans = NULL;
return sql;
}
static apr_status_t dbd_sqlite3_close(apr_dbd_t *handle)
{
apr_dbd_prepared_t *prep = handle->prep;
/* finalize all prepared statements, or we'll get SQLITE_BUSY on close */
while (prep) {
sqlite3_finalize(prep->stmt);
prep = prep->next;
}
sqlite3_close(handle->conn);
return APR_SUCCESS;
}
static apr_status_t dbd_sqlite3_check_conn(apr_pool_t *pool,
apr_dbd_t *handle)
{
return (handle->conn != NULL) ? APR_SUCCESS : APR_EGENERAL;
}
static int dbd_sqlite3_select_db(apr_pool_t *pool, apr_dbd_t *handle,
const char *name)
{
return APR_ENOTIMPL;
}
static void *dbd_sqlite3_native(apr_dbd_t *handle)
{
return handle->conn;
}
static int dbd_sqlite3_num_cols(apr_dbd_results_t *res)
{
return res->sz;
}
static int dbd_sqlite3_num_tuples(apr_dbd_results_t *res)
{
return res->tuples;
}
APU_MODULE_DECLARE_DATA const apr_dbd_driver_t apr_dbd_sqlite3_driver = {
"sqlite3",
NULL,
dbd_sqlite3_native,
dbd_sqlite3_open,
dbd_sqlite3_check_conn,
dbd_sqlite3_close,
dbd_sqlite3_select_db,
dbd_sqlite3_start_transaction,
dbd_sqlite3_end_transaction,
dbd_sqlite3_query,
dbd_sqlite3_select,
dbd_sqlite3_num_cols,
dbd_sqlite3_num_tuples,
dbd_sqlite3_get_row,
dbd_sqlite3_get_entry,
dbd_sqlite3_error,
dbd_sqlite3_escape,
dbd_sqlite3_prepare,
dbd_sqlite3_pvquery,
dbd_sqlite3_pvselect,
dbd_sqlite3_pquery,
dbd_sqlite3_pselect,
dbd_sqlite3_get_name,
dbd_sqlite3_transaction_mode_get,
dbd_sqlite3_transaction_mode_set,
"?",
dbd_sqlite3_pvbquery,
dbd_sqlite3_pvbselect,
dbd_sqlite3_pbquery,
dbd_sqlite3_pbselect,
dbd_sqlite3_datum_get
};
#endif

207
dbd/apr_dbd_sqlite3.dsp Normal file
View File

@ -0,0 +1,207 @@
# Microsoft Developer Studio Project File - Name="apr_dbd_sqlite3" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
CFG=apr_dbd_sqlite3 - Win32 Release
!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 "apr_dbd_sqlite3.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 "apr_dbd_sqlite3.mak" CFG="apr_dbd_sqlite3 - Win32 Release"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "apr_dbd_sqlite3 - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_dbd_sqlite3 - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_dbd_sqlite3 - x64 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_dbd_sqlite3 - x64 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe
!IF "$(CFG)" == "apr_dbd_sqlite3 - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
# ADD CPP /nologo /MD /W3 /Zi /O2 /Oy- /I "../include" /I "../../apr/include" /I "../include/private" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_SQLITE3=1 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_sqlite3_src" /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /fo"Release/apr_dbd_sqlite3-1.res" /d DLL_NAME="apr_dbd_sqlite3" /d "NDEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib sqlite3.lib /nologo /base:"0x6EF20000" /subsystem:windows /dll /incremental:no /debug /opt:ref
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib sqlite3.lib /nologo /base:"0x6EF20000" /subsystem:windows /dll /incremental:no /debug /out:"Release\apr_dbd_sqlite3-1.dll" /pdb:"Release\apr_dbd_sqlite3-1.pdb" /implib:"Release\apr_dbd_sqlite3-1.lib" /MACHINE:X86 /opt:ref
# Begin Special Build Tool
TargetPath=Release\apr_dbd_sqlite3-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_dbd_sqlite3 - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /EHsc /c
# ADD CPP /nologo /MDd /W3 /Zi /Od /I "../include" /I "../../apr/include" /I "../include/private" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_SQLITE3=1 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_sqlite3_src" /FD /EHsc /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /fo"Debug/apr_dbd_sqlite3-1.res" /d DLL_NAME="apr_dbd_sqlite3" /d "_DEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib sqlite3.lib /nologo /base:"0x6EF20000" /subsystem:windows /dll /incremental:no /debug
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib sqlite3.lib /nologo /base:"0x6EF20000" /subsystem:windows /dll /incremental:no /debug /out:"Debug\apr_dbd_sqlite3-1.dll" /pdb:"Debug\apr_dbd_sqlite3-1.pdb" /implib:"Debug\apr_dbd_sqlite3-1.lib" /MACHINE:X86
# Begin Special Build Tool
TargetPath=Debug\apr_dbd_sqlite3-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_dbd_sqlite3 - x64 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "x64\Release"
# PROP BASE Intermediate_Dir "x64\Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "x64\Release"
# PROP Intermediate_Dir "x64\Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
# ADD CPP /nologo /MD /W3 /Zi /O2 /Oy- /I "../include" /I "../../apr/include" /I "../include/private" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_SQLITE3=1 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_sqlite3_src" /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /fo"x64/Release/apr_dbd_sqlite3-1.res" /d DLL_NAME="apr_dbd_sqlite3" /d "NDEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib sqlite3.lib /nologo /base:"0x6EF20000" /subsystem:windows /dll /incremental:no /debug /opt:ref
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib sqlite3.lib /nologo /base:"0x6EF20000" /subsystem:windows /dll /incremental:no /debug /out:"x64\Release\apr_dbd_sqlite3-1.dll" /pdb:"x64\Release\apr_dbd_sqlite3-1.pdb" /implib:"x64\Release\apr_dbd_sqlite3-1.lib" /MACHINE:X64 /opt:ref
# Begin Special Build Tool
TargetPath=x64\Release\apr_dbd_sqlite3-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_dbd_sqlite3 - x64 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "x64\Debug"
# PROP BASE Intermediate_Dir "x64\Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "x64\Debug"
# PROP Intermediate_Dir "x64\Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /EHsc /c
# ADD CPP /nologo /MDd /W3 /Zi /Od /I "../include" /I "../../apr/include" /I "../include/private" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_SQLITE3=1 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbd_sqlite3_src" /FD /EHsc /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /fo"x64/Debug/apr_dbd_sqlite3-1.res" /d DLL_NAME="apr_dbd_sqlite3" /d "_DEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib sqlite3.lib /nologo /base:"0x6EF20000" /subsystem:windows /dll /incremental:no /debug
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib sqlite3.lib /nologo /base:"0x6EF20000" /subsystem:windows /dll /incremental:no /debug /out:"x64\Debug\apr_dbd_sqlite3-1.dll" /pdb:"x64\Debug\apr_dbd_sqlite3-1.pdb" /implib:"x64\Debug\apr_dbd_sqlite3-1.lib" /MACHINE:X64
# Begin Special Build Tool
TargetPath=x64\Debug\apr_dbd_sqlite3-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ENDIF
# Begin Target
# Name "apr_dbd_sqlite3 - Win32 Release"
# Name "apr_dbd_sqlite3 - Win32 Debug"
# Name "apr_dbd_sqlite3 - x64 Release"
# Name "apr_dbd_sqlite3 - x64 Debug"
# Begin Group "Source Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\apr_dbd_sqlite3.c
# End Source File
# End Group
# Begin Group "Public Header Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=..\include\apr_dbd.h
# End Source File
# End Group
# Begin Group "Internal Header Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=..\include\private\apu_config.h
# End Source File
# Begin Source File
SOURCE=..\include\private\apu_dbd_internal.h
# End Source File
# Begin Source File
SOURCE=..\include\private\apu_internal.h
# End Source File
# End Group
# Begin Source File
SOURCE=..\libaprutil.rc
# End Source File
# End Target
# End Project

299
dbm/NWGNUdbmdb Normal file
View File

@ -0,0 +1,299 @@
#
# Declare the sub-directories to be built here
#
SUBDIRS = \
$(EOLIST)
#
# Get the 'head' of the build environment. This includes default targets and
# paths to tools
#
ifndef EnvironmentDefined
include $(APR_WORK)/build/NWGNUhead.inc
endif
#
# build this level's files
#
# Make sure all needed macro's are defined
#
# LINK_STATIC = 1
# for now defined here - should finally go into build/NWGNUenvironment.inc
DB_INC = $(DBSDK)/inc
DB_IMP = libdb47.imp
DB_LIB = libdb47.lib
DB_NLM = libdb47
#
# These directories will be at the beginning of the include list, followed by
# INCDIRS
#
XINCDIRS += \
$(APR)/include/arch/netware \
$(APR)/include \
$(APU)/include \
$(APU)/include/private \
$(APR) \
$(DB_INC) \
$(EOLIST)
#
# These flags will come after CFLAGS
#
XCFLAGS += \
$(EOLIST)
#
# These defines will come after DEFINES
#
XDEFINES += \
-DAPU_DSO_MODULE_BUILD \
-DAPU_HAVE_DB=1 \
-DAPU_HAVE_DB_VERSION=4 \
$(EOLIST)
#
# These flags will be added to the link.opt file
#
XLFLAGS += \
$(EOLIST)
ifdef LINK_STATIC
XLFLAGS += \
-l $(DBSDK)/lib \
$(EOLIST)
else
XLFLAGS += \
-l $(DBSDK)/imp \
$(EOLIST)
endif
#
# These values will be appended to the correct variables based on the value of
# RELEASE
#
ifeq "$(RELEASE)" "debug"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
ifeq "$(RELEASE)" "noopt"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
ifeq "$(RELEASE)" "release"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
#
# These are used by the link target if an NLM is being generated
# This is used by the link 'name' directive to name the nlm. If left blank
# TARGET_nlm (see below) will be used.
#
NLM_NAME = dbmdb
#
# This is used by the link '-desc ' directive.
# If left blank, NLM_NAME will be used.
#
NLM_DESCRIPTION = Apache Portability Runtime Library $(VERSION_STR) DBM Berkeley DB Driver Module
#
# This is used by the '-threadname' directive. If left blank,
# NLM_NAME Thread will be used.
#
NLM_THREAD_NAME = dbmdb
#
# If this is specified, it will override VERSION value in
# $(AP_WORK)\build\NWGNUenvironment.inc
#
NLM_VERSION =
#
# If this is specified, it will override the default of 64K
#
NLM_STACK_SIZE = 8192
#
# If this is specified it will be used by the link '-entry' directive
#
NLM_ENTRY_SYM =
#
# If this is specified it will be used by the link '-exit' directive
#
NLM_EXIT_SYM =
#
# If this is specified it will be used by the link '-check' directive
#
NLM_CHECK_SYM =
#
# If these are specified it will be used by the link '-flags' directive
#
NLM_FLAGS =
#
# If this is specified it will be linked in with the XDCData option in the def
# file instead of the default of $(NWOS)/apache.xdc. XDCData can be disabled
# by setting APACHE_UNIPROC in the environment
#
XDCDATA =
#
# If there is an NLM target, put it here
#
TARGET_nlm = \
$(OBJDIR)\$(NLM_NAME).nlm \
$(EOLIST)
#
# If there is an LIB target, put it here
#
TARGET_lib = \
$(EOLIST)
#
# These are the OBJ files needed to create the NLM target above.
# Paths must all use the '/' character
#
FILES_nlm_objs = \
$(OBJDIR)/apr_dbm_berkeleydb.o \
$(EOLIST)
#
# These are the LIB files needed to create the NLM target above.
# These will be added as a library command in the link.opt file.
#
FILES_nlm_libs = \
$(PRELUDE) \
$(EOLIST)
ifeq ($(LINK_STATIC),1)
FILES_nlm_libs += \
$(DB_LIB) \
$(EOLIST)
endif
#
# These are the modules that the above NLM target depends on to load.
# These will be added as a module command in the link.opt file.
#
FILES_nlm_modules = \
aprlib \
libc \
$(EOLIST)
ifneq ($(LINK_STATIC),1)
FILES_nlm_modules += \
$(DB_NLM) \
$(EOLIST)
endif
#
# If the nlm has a msg file, put it's path here
#
FILE_nlm_msg =
#
# If the nlm has a hlp file put it's path here
#
FILE_nlm_hlp =
#
# If this is specified, it will override $(NWOS)\copyright.txt.
#
FILE_nlm_copyright =
#
# Any additional imports go here
#
FILES_nlm_Ximports = \
@aprlib.imp \
@libc.imp \
$(EOLIST)
ifneq ($(LINK_STATIC),1)
FILES_nlm_Ximports += \
@$(DB_IMP) \
$(EOLIST)
endif
#
# Any symbols exported to here
#
FILES_nlm_exports = \
apr_dbm_type_db \
$(EOLIST)
#
# These are the OBJ files needed to create the LIB target above.
# Paths must all use the '/' character
#
FILES_lib_objs = \
$(EOLIST)
#
# implement targets and dependancies (leave this section alone)
#
libs :: $(OBJDIR) $(TARGET_lib)
nlms :: libs $(TARGET_nlm)
#
# Updated this target to create necessary directories and copy files to the
# correct place. (See $(AP_WORK)\build\NWGNUhead.inc for examples)
#
install :: nlms FORCE
#
# Any specialized rules here
#
#
# Include the 'tail' makefile that has targets that depend on variables defined
# in this makefile
#
include $(APRBUILD)/NWGNUtail.inc

298
dbm/NWGNUdbmgdbm Normal file
View File

@ -0,0 +1,298 @@
#
# Declare the sub-directories to be built here
#
SUBDIRS = \
$(EOLIST)
#
# Get the 'head' of the build environment. This includes default targets and
# paths to tools
#
ifndef EnvironmentDefined
include $(APR_WORK)/build/NWGNUhead.inc
endif
#
# build this level's files
#
# Make sure all needed macro's are defined
#
# LINK_STATIC = 1
# for now defined here - should finally go into build/NWGNUenvironment.inc
GDBM_INC = $(GDBMSDK)/inc
GDBM_IMP = libgdbm.imp
GDBM_LIB = libgdbm.lib
GDBM_NLM = libgdbm
#
# These directories will be at the beginning of the include list, followed by
# INCDIRS
#
XINCDIRS += \
$(APR)/include/arch/netware \
$(APR)/include \
$(APU)/include \
$(APU)/include/private \
$(APR) \
$(GDBM_INC) \
$(EOLIST)
#
# These flags will come after CFLAGS
#
XCFLAGS += \
$(EOLIST)
#
# These defines will come after DEFINES
#
XDEFINES += \
-DAPU_DSO_MODULE_BUILD \
-DAPU_HAVE_GDBM=1 \
$(EOLIST)
#
# These flags will be added to the link.opt file
#
XLFLAGS += \
$(EOLIST)
ifdef LINK_STATIC
XLFLAGS += \
-l $(GDBMSDK)/lib \
$(EOLIST)
else
XLFLAGS += \
-l $(GDBMSDK)/imp \
$(EOLIST)
endif
#
# These values will be appended to the correct variables based on the value of
# RELEASE
#
ifeq "$(RELEASE)" "debug"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
ifeq "$(RELEASE)" "noopt"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
ifeq "$(RELEASE)" "release"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
#
# These are used by the link target if an NLM is being generated
# This is used by the link 'name' directive to name the nlm. If left blank
# TARGET_nlm (see below) will be used.
#
NLM_NAME = dbmgdbm
#
# This is used by the link '-desc ' directive.
# If left blank, NLM_NAME will be used.
#
NLM_DESCRIPTION = Apache Portability Runtime Library $(VERSION_STR) GDBM Driver Module
#
# This is used by the '-threadname' directive. If left blank,
# NLM_NAME Thread will be used.
#
NLM_THREAD_NAME = dbmgdbm
#
# If this is specified, it will override VERSION value in
# $(AP_WORK)\build\NWGNUenvironment.inc
#
NLM_VERSION =
#
# If this is specified, it will override the default of 64K
#
NLM_STACK_SIZE = 8192
#
# If this is specified it will be used by the link '-entry' directive
#
NLM_ENTRY_SYM =
#
# If this is specified it will be used by the link '-exit' directive
#
NLM_EXIT_SYM =
#
# If this is specified it will be used by the link '-check' directive
#
NLM_CHECK_SYM =
#
# If these are specified it will be used by the link '-flags' directive
#
NLM_FLAGS =
#
# If this is specified it will be linked in with the XDCData option in the def
# file instead of the default of $(NWOS)/apache.xdc. XDCData can be disabled
# by setting APACHE_UNIPROC in the environment
#
XDCDATA =
#
# If there is an NLM target, put it here
#
TARGET_nlm = \
$(OBJDIR)\$(NLM_NAME).nlm \
$(EOLIST)
#
# If there is an LIB target, put it here
#
TARGET_lib = \
$(EOLIST)
#
# These are the OBJ files needed to create the NLM target above.
# Paths must all use the '/' character
#
FILES_nlm_objs = \
$(OBJDIR)/apr_dbm_gdbm.o \
$(EOLIST)
#
# These are the LIB files needed to create the NLM target above.
# These will be added as a library command in the link.opt file.
#
FILES_nlm_libs = \
$(PRELUDE) \
$(EOLIST)
ifeq ($(LINK_STATIC),1)
FILES_nlm_libs += \
$(GDBM_LIB) \
$(EOLIST)
endif
#
# These are the modules that the above NLM target depends on to load.
# These will be added as a module command in the link.opt file.
#
FILES_nlm_modules = \
aprlib \
libc \
$(EOLIST)
ifneq ($(LINK_STATIC),1)
FILES_nlm_modules += \
$(GDBM_NLM) \
$(EOLIST)
endif
#
# If the nlm has a msg file, put it's path here
#
FILE_nlm_msg =
#
# If the nlm has a hlp file put it's path here
#
FILE_nlm_hlp =
#
# If this is specified, it will override $(NWOS)\copyright.txt.
#
FILE_nlm_copyright =
#
# Any additional imports go here
#
FILES_nlm_Ximports = \
@aprlib.imp \
@libc.imp \
$(EOLIST)
ifneq ($(LINK_STATIC),1)
FILES_nlm_Ximports += \
@$(GDBM_IMP) \
$(EOLIST)
endif
#
# Any symbols exported to here
#
FILES_nlm_exports = \
apr_dbm_type_gdbm \
$(EOLIST)
#
# These are the OBJ files needed to create the LIB target above.
# Paths must all use the '/' character
#
FILES_lib_objs = \
$(EOLIST)
#
# implement targets and dependancies (leave this section alone)
#
libs :: $(OBJDIR) $(TARGET_lib)
nlms :: libs $(TARGET_nlm)
#
# Updated this target to create necessary directories and copy files to the
# correct place. (See $(AP_WORK)\build\NWGNUhead.inc for examples)
#
install :: nlms FORCE
#
# Any specialized rules here
#
#
# Include the 'tail' makefile that has targets that depend on variables defined
# in this makefile
#
include $(APRBUILD)/NWGNUtail.inc

251
dbm/NWGNUmakefile Normal file
View File

@ -0,0 +1,251 @@
#
# Declare the sub-directories to be built here
#
SUBDIRS = \
$(EOLIST)
#
# Get the 'head' of the build environment. This includes default targets and
# paths to tools
#
include $(APR_WORK)/build/NWGNUhead.inc
#
# build this level's files
#
# Make sure all needed macro's are defined
#
#
# These directories will be at the beginning of the include list, followed by
# INCDIRS
#
XINCDIRS += \
$(EOLIST)
#
# These flags will come after CFLAGS
#
XCFLAGS += \
$(EOLIST)
#
# These defines will come after DEFINES
#
XDEFINES += \
$(EOLIST)
#
# These flags will be added to the link.opt file
#
XLFLAGS += \
$(EOLIST)
#
# These values will be appended to the correct variables based on the value of
# RELEASE
#
ifeq "$(RELEASE)" "debug"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
ifeq "$(RELEASE)" "noopt"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
ifeq "$(RELEASE)" "release"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
#
# These are used by the link target if an NLM is being generated
# This is used by the link 'name' directive to name the nlm. If left blank
# TARGET_nlm (see below) will be used.
#
NLM_NAME =
#
# This is used by the link '-desc ' directive.
# If left blank, NLM_NAME will be used.
#
NLM_DESCRIPTION =
#
# This is used by the '-threadname' directive. If left blank,
# NLM_NAME Thread will be used.
#
NLM_THREAD_NAME =
#
# If this is specified, it will override VERSION value in
# $(AP_WORK)\build\NWGNUenvironment.inc
#
NLM_VERSION =
#
# If this is specified, it will override the default of 64K
#
NLM_STACK_SIZE =
#
# If this is specified it will be used by the link '-entry' directive
#
NLM_ENTRY_SYM =
#
# If this is specified it will be used by the link '-exit' directive
#
NLM_EXIT_SYM =
#
# If this is specified it will be used by the link '-check' directive
#
NLM_CHECK_SYM =
#
# If these are specified it will be used by the link '-flags' directive
#
NLM_FLAGS =
#
# If this is specified it will be linked in with the XDCData option in the def
# file instead of the default of $(NWOS)/apache.xdc. XDCData can be disabled
# by setting APACHE_UNIPROC in the environment
#
XDCDATA =
#
# If there is an NLM target, put it here
#
TARGET_nlm = \
$(EOLIST)
ifeq "$(APU_HAVE_DB)" "1"
TARGET_nlm += $(OBJDIR)/dbmdb.nlm $(OBJDIR)/dbmdb.nlm $(EOLIST)
endif
ifeq "$(APU_HAVE_GDBM)" "1"
TARGET_nlm += $(OBJDIR)/dbmgdbm.nlm $(OBJDIR)/dbmgdbm.nlm $(EOLIST)
endif
#
# If there is an LIB target, put it here
#
TARGET_lib = \
$(EOLIST)
#
# These are the OBJ files needed to create the NLM target above.
# Paths must all use the '/' character
#
FILES_nlm_objs = \
$(EOLIST)
#
# These are the LIB files needed to create the NLM target above.
# These will be added as a library command in the link.opt file.
#
FILES_nlm_libs = \
$(EOLIST)
#
# These are the modules that the above NLM target depends on to load.
# These will be added as a module command in the link.opt file.
#
FILES_nlm_modules = \
$(EOLIST)
#
# If the nlm has a msg file, put it's path here
#
FILE_nlm_msg =
#
# If the nlm has a hlp file put it's path here
#
FILE_nlm_hlp =
#
# If this is specified, it will override $(NWOS)\copyright.txt.
#
FILE_nlm_copyright =
#
# Any additional imports go here
#
FILES_nlm_Ximports = \
$(EOLIST)
#
# Any symbols exported to here
#
FILES_nlm_exports = \
$(EOLIST)
#
# These are the OBJ files needed to create the LIB target above.
# Paths must all use the '/' character
#
FILES_lib_objs = \
$(EOLIST)
#
# implement targets and dependancies (leave this section alone)
#
libs :: $(OBJDIR) $(TARGET_lib)
nlms :: libs $(TARGET_nlm)
#
# Updated this target to create necessary directories and copy files to the
# correct place. (See $(AP_WORK)\build\NWGNUhead.inc for examples)
#
install :: nlms $(INSTDIRS) FORCE
copy $(OBJDIR)\*.nlm $(INSTALLBASE)
#
# Any specialized rules here
#
#
# Include the 'tail' makefile that has targets that depend on variables defined
# in this makefile
#
include $(APRBUILD)/NWGNUtail.inc

305
dbm/apr_dbm.c Normal file
View File

@ -0,0 +1,305 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr.h"
#include "apr_dso.h"
#include "apr_hash.h"
#include "apr_errno.h"
#include "apr_pools.h"
#include "apr_strings.h"
#define APR_WANT_MEMFUNC
#define APR_WANT_STRFUNC
#include "apr_want.h"
#include "apr_general.h"
#include "apr_atomic.h"
#include "apu_config.h"
#include "apu.h"
#include "apu_internal.h"
#include "apu_version.h"
#include "apr_dbm_private.h"
#include "apu_select_dbm.h"
#include "apr_dbm.h"
#include "apr_dbm_private.h"
/* ### note: the setting of DBM_VTABLE will go away once we have multiple
### DBMs in here.
### Well, that day is here. So, do we remove DBM_VTABLE and the old
### API entirely? Oh, what to do. We need an APU_DEFAULT_DBM #define.
### Sounds like a job for autoconf. */
#if APU_USE_DB
#define DBM_VTABLE apr_dbm_type_db
#define DBM_NAME "db"
#elif APU_USE_GDBM
#define DBM_VTABLE apr_dbm_type_gdbm
#define DBM_NAME "gdbm"
#elif APU_USE_NDBM
#define DBM_VTABLE apr_dbm_type_ndbm
#define DBM_NAME "ndbm"
#elif APU_USE_SDBM
#define DBM_VTABLE apr_dbm_type_sdbm
#define DBM_NAME "sdbm"
#else /* Not in the USE_xDBM list above */
#error a DBM implementation was not specified
#endif
#if APU_DSO_BUILD
static apr_hash_t *drivers = NULL;
static apr_uint32_t initialised = 0, in_init = 1;
static apr_status_t dbm_term(void *ptr)
{
/* set drivers to NULL so init can work again */
drivers = NULL;
/* Everything else we need is handled by cleanups registered
* when we created mutexes and loaded DSOs
*/
return APR_SUCCESS;
}
#endif /* APU_DSO_BUILD */
static apr_status_t dbm_open_type(apr_dbm_type_t const* * vtable,
const char *type,
apr_pool_t *pool)
{
#if !APU_DSO_BUILD
*vtable = NULL;
if (!strcasecmp(type, "default")) *vtable = &DBM_VTABLE;
#if APU_HAVE_DB
else if (!strcasecmp(type, "db")) *vtable = &apr_dbm_type_db;
#endif
else if (*type && !strcasecmp(type + 1, "dbm")) {
#if APU_HAVE_GDBM
if (*type == 'G' || *type == 'g') *vtable = &apr_dbm_type_gdbm;
#endif
#if APU_HAVE_NDBM
if (*type == 'N' || *type == 'n') *vtable = &apr_dbm_type_ndbm;
#endif
#if APU_HAVE_SDBM
if (*type == 'S' || *type == 's') *vtable = &apr_dbm_type_sdbm;
#endif
/* avoid empty block */ ;
}
if (*vtable)
return APR_SUCCESS;
return APR_ENOTIMPL;
#else /* APU_DSO_BUILD */
char modname[32];
char symname[34];
apr_dso_handle_sym_t symbol;
apr_status_t rv;
int usertype = 0;
if (!strcasecmp(type, "default")) type = DBM_NAME;
else if (!strcasecmp(type, "db")) type = "db";
else if (*type && !strcasecmp(type + 1, "dbm")) {
if (*type == 'G' || *type == 'g') type = "gdbm";
else if (*type == 'N' || *type == 'n') type = "ndbm";
else if (*type == 'S' || *type == 's') type = "sdbm";
}
else usertype = 1;
if (apr_atomic_inc32(&initialised)) {
apr_atomic_set32(&initialised, 1); /* prevent wrap-around */
while (apr_atomic_read32(&in_init)) /* wait until we get fully inited */
;
}
else {
apr_pool_t *parent;
/* Top level pool scope, need process-scope lifetime */
for (parent = pool; parent; parent = apr_pool_parent_get(pool))
pool = parent;
/* deprecate in 2.0 - permit implicit initialization */
apu_dso_init(pool);
drivers = apr_hash_make(pool);
apr_hash_set(drivers, "sdbm", APR_HASH_KEY_STRING, &apr_dbm_type_sdbm);
apr_pool_cleanup_register(pool, NULL, dbm_term,
apr_pool_cleanup_null);
apr_atomic_dec32(&in_init);
}
rv = apu_dso_mutex_lock();
if (rv) {
*vtable = NULL;
return rv;
}
*vtable = apr_hash_get(drivers, type, APR_HASH_KEY_STRING);
if (*vtable) {
apu_dso_mutex_unlock();
return APR_SUCCESS;
}
/* The driver DSO must have exactly the same lifetime as the
* drivers hash table; ignore the passed-in pool */
pool = apr_hash_pool_get(drivers);
#if defined(NETWARE)
apr_snprintf(modname, sizeof(modname), "dbm%s.nlm", type);
#elif defined(WIN32)
apr_snprintf(modname, sizeof(modname),
"apr_dbm_%s-" APU_STRINGIFY(APU_MAJOR_VERSION) ".dll", type);
#else
apr_snprintf(modname, sizeof(modname),
"apr_dbm_%s-" APU_STRINGIFY(APU_MAJOR_VERSION) ".so", type);
#endif
apr_snprintf(symname, sizeof(symname), "apr_dbm_type_%s", type);
rv = apu_dso_load(NULL, &symbol, modname, symname, pool);
if (rv == APR_SUCCESS || rv == APR_EINIT) { /* previously loaded?!? */
*vtable = symbol;
if (usertype)
type = apr_pstrdup(pool, type);
apr_hash_set(drivers, type, APR_HASH_KEY_STRING, *vtable);
rv = APR_SUCCESS;
}
else
*vtable = NULL;
apu_dso_mutex_unlock();
return rv;
#endif /* APU_DSO_BUILD */
}
APU_DECLARE(apr_status_t) apr_dbm_open_ex(apr_dbm_t **pdb, const char *type,
const char *pathname,
apr_int32_t mode,
apr_fileperms_t perm,
apr_pool_t *pool)
{
apr_dbm_type_t const* vtable = NULL;
apr_status_t rv = dbm_open_type(&vtable, type, pool);
if (rv == APR_SUCCESS) {
rv = (vtable->open)(pdb, pathname, mode, perm, pool);
}
return rv;
}
APU_DECLARE(apr_status_t) apr_dbm_open(apr_dbm_t **pdb, const char *pathname,
apr_int32_t mode, apr_fileperms_t perm,
apr_pool_t *pool)
{
return apr_dbm_open_ex(pdb, DBM_NAME, pathname, mode, perm, pool);
}
APU_DECLARE(void) apr_dbm_close(apr_dbm_t *dbm)
{
(*dbm->type->close)(dbm);
}
APU_DECLARE(apr_status_t) apr_dbm_fetch(apr_dbm_t *dbm, apr_datum_t key,
apr_datum_t *pvalue)
{
return (*dbm->type->fetch)(dbm, key, pvalue);
}
APU_DECLARE(apr_status_t) apr_dbm_store(apr_dbm_t *dbm, apr_datum_t key,
apr_datum_t value)
{
return (*dbm->type->store)(dbm, key, value);
}
APU_DECLARE(apr_status_t) apr_dbm_delete(apr_dbm_t *dbm, apr_datum_t key)
{
return (*dbm->type->del)(dbm, key);
}
APU_DECLARE(int) apr_dbm_exists(apr_dbm_t *dbm, apr_datum_t key)
{
return (*dbm->type->exists)(dbm, key);
}
APU_DECLARE(apr_status_t) apr_dbm_firstkey(apr_dbm_t *dbm, apr_datum_t *pkey)
{
return (*dbm->type->firstkey)(dbm, pkey);
}
APU_DECLARE(apr_status_t) apr_dbm_nextkey(apr_dbm_t *dbm, apr_datum_t *pkey)
{
return (*dbm->type->nextkey)(dbm, pkey);
}
APU_DECLARE(void) apr_dbm_freedatum(apr_dbm_t *dbm, apr_datum_t data)
{
(*dbm->type->freedatum)(dbm, data);
}
APU_DECLARE(char *) apr_dbm_geterror(apr_dbm_t *dbm, int *errcode,
char *errbuf, apr_size_t errbufsize)
{
if (errcode != NULL)
*errcode = dbm->errcode;
/* assert: errbufsize > 0 */
if (dbm->errmsg == NULL)
*errbuf = '\0';
else
(void) apr_cpystrn(errbuf, dbm->errmsg, errbufsize);
return errbuf;
}
APU_DECLARE(apr_status_t) apr_dbm_get_usednames_ex(apr_pool_t *p,
const char *type,
const char *pathname,
const char **used1,
const char **used2)
{
apr_dbm_type_t const* vtable;
apr_status_t rv = dbm_open_type(&vtable, type, p);
if (rv == APR_SUCCESS) {
(vtable->getusednames)(p, pathname, used1, used2);
return APR_SUCCESS;
}
return rv;
}
APU_DECLARE(void) apr_dbm_get_usednames(apr_pool_t *p,
const char *pathname,
const char **used1,
const char **used2)
{
apr_dbm_get_usednames_ex(p, DBM_NAME, pathname, used1, used2);
}
/* Most DBM libraries take a POSIX mode for creating files. Don't trust
* the mode_t type, some platforms may not support it, int is safe.
*/
APU_DECLARE(int) apr_posix_perms2mode(apr_fileperms_t perm)
{
int mode = 0;
mode |= 0700 & (perm >> 2); /* User is off-by-2 bits */
mode |= 0070 & (perm >> 1); /* Group is off-by-1 bit */
mode |= 0007 & (perm); /* World maps 1 for 1 */
return mode;
}

404
dbm/apr_dbm_berkeleydb.c Normal file
View File

@ -0,0 +1,404 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr_strings.h"
#define APR_WANT_MEMFUNC
#include "apr_want.h"
#define APU_WANT_DB
#include "apu_want.h"
#if APR_HAVE_STDLIB_H
#include <stdlib.h> /* for abort() */
#endif
#include "apu_config.h"
#include "apu.h"
#if APU_HAVE_DB
#include "apr_dbm_private.h"
/*
* We pick up all varieties of Berkeley DB through db.h (included through
* apu_select_dbm.h). This code has been compiled/tested against DB1,
* DB_185, DB2, DB3, and DB4.
*/
#if defined(DB_VERSION_MAJOR) && (DB_VERSION_MAJOR >= 4)
/* We will treat anything greater than 4.1 as DB4.
* We can treat 4.0 as DB3.
*/
#if DB_VERSION_MAJOR > 4 || (defined(DB_VERSION_MINOR) && (DB_VERSION_MINOR >= 1))
#define DB_VER 4
#elif DB_VERSION_MAJOR == 4
#define DB_VER 3
#endif
#elif defined(DB_VERSION_MAJOR) && (DB_VERSION_MAJOR == 3)
#define DB_VER 3
#elif defined(DB_VERSION_MAJOR) && (DB_VERSION_MAJOR == 2)
#define DB_VER 2
#else
#define DB_VER 1
#endif
typedef struct {
DB *bdb;
#if DB_VER != 1
DBC *curs;
#endif
} real_file_t;
#if DB_VER == 1
#define TXN_ARG
#else
#define TXN_ARG NULL,
#endif
#define GET_BDB(f) (((real_file_t *)(f))->bdb)
#define do_fetch(bdb, k, v) ((*(bdb)->get)(bdb, TXN_ARG &(k), &(v), 0))
#if DB_VER == 1
#include <sys/fcntl.h>
#define APR_DBM_DBMODE_RO O_RDONLY
#define APR_DBM_DBMODE_RW O_RDWR
#define APR_DBM_DBMODE_RWCREATE (O_CREAT | O_RDWR)
#define APR_DBM_DBMODE_RWTRUNC (O_CREAT | O_RDWR | O_TRUNC)
#else
#define APR_DBM_DBMODE_RO DB_RDONLY
#define APR_DBM_DBMODE_RW 0
#define APR_DBM_DBMODE_RWCREATE DB_CREATE
#define APR_DBM_DBMODE_RWTRUNC DB_TRUNCATE
#endif /* DBVER == 1 */
/* --------------------------------------------------------------------------
**
** UTILITY FUNCTIONS
*/
/* map a DB error to an apr_status_t */
static apr_status_t db2s(int dberr)
{
if (dberr != 0) {
/* ### need to fix this */
return APR_OS_START_USEERR + dberr;
}
return APR_SUCCESS;
}
static apr_status_t set_error(apr_dbm_t *dbm, apr_status_t dbm_said)
{
apr_status_t rv = APR_SUCCESS;
/* ### ignore whatever the DBM said (dbm_said); ask it explicitly */
if (dbm_said == APR_SUCCESS) {
dbm->errcode = 0;
dbm->errmsg = NULL;
}
else {
/* ### need to fix. dberr was tossed in db2s(). */
/* ### use db_strerror() */
dbm->errcode = dbm_said;
#if DB_VER == 1 || DB_VER == 2
dbm->errmsg = NULL;
#else
dbm->errmsg = db_strerror(dbm_said - APR_OS_START_USEERR);
#endif
rv = dbm_said;
}
return rv;
}
/* --------------------------------------------------------------------------
**
** DEFINE THE VTABLE FUNCTIONS FOR BERKELEY DB
**
** ### we may need three sets of these: db1, db2, db3
*/
static apr_status_t vt_db_open(apr_dbm_t **pdb, const char *pathname,
apr_int32_t mode, apr_fileperms_t perm,
apr_pool_t *pool)
{
real_file_t file;
int dbmode;
*pdb = NULL;
switch (mode) {
case APR_DBM_READONLY:
dbmode = APR_DBM_DBMODE_RO;
break;
case APR_DBM_READWRITE:
dbmode = APR_DBM_DBMODE_RW;
break;
case APR_DBM_RWCREATE:
dbmode = APR_DBM_DBMODE_RWCREATE;
break;
case APR_DBM_RWTRUNC:
dbmode = APR_DBM_DBMODE_RWTRUNC;
break;
default:
return APR_EINVAL;
}
{
int dberr;
#if DB_VER >= 3
if ((dberr = db_create(&file.bdb, NULL, 0)) == 0) {
if ((dberr = (*file.bdb->open)(file.bdb,
#if DB_VER == 4
NULL,
#endif
pathname, NULL,
DB_HASH, dbmode,
apr_posix_perms2mode(perm))) != 0) {
/* close the DB handler */
(void) (*file.bdb->close)(file.bdb, 0);
}
}
file.curs = NULL;
#elif DB_VER == 2
dberr = db_open(pathname, DB_HASH, dbmode, apr_posix_perms2mode(perm),
NULL, NULL, &file.bdb);
file.curs = NULL;
#else
file.bdb = dbopen(pathname, dbmode, apr_posix_perms2mode(perm),
DB_HASH, NULL);
if (file.bdb == NULL)
return APR_EGENERAL; /* ### need a better error */
dberr = 0;
#endif
if (dberr != 0)
return db2s(dberr);
}
/* we have an open database... return it */
*pdb = apr_pcalloc(pool, sizeof(**pdb));
(*pdb)->pool = pool;
(*pdb)->type = &apr_dbm_type_db;
(*pdb)->file = apr_pmemdup(pool, &file, sizeof(file));
/* ### register a cleanup to close the DBM? */
return APR_SUCCESS;
}
static void vt_db_close(apr_dbm_t *dbm)
{
(*GET_BDB(dbm->file)->close)(GET_BDB(dbm->file)
#if DB_VER != 1
, 0
#endif
);
}
static apr_status_t vt_db_fetch(apr_dbm_t *dbm, apr_datum_t key,
apr_datum_t * pvalue)
{
DBT ckey = { 0 };
DBT rd = { 0 };
int dberr;
ckey.data = key.dptr;
ckey.size = key.dsize;
dberr = do_fetch(GET_BDB(dbm->file), ckey, rd);
/* "not found" is not an error. return zero'd value. */
if (dberr ==
#if DB_VER == 1
RET_SPECIAL
#else
DB_NOTFOUND
#endif
) {
memset(&rd, 0, sizeof(rd));
dberr = 0;
}
pvalue->dptr = rd.data;
pvalue->dsize = rd.size;
/* store the error info into DBM, and return a status code. Also, note
that *pvalue should have been cleared on error. */
return set_error(dbm, db2s(dberr));
}
static apr_status_t vt_db_store(apr_dbm_t *dbm, apr_datum_t key,
apr_datum_t value)
{
apr_status_t rv;
DBT ckey = { 0 };
DBT cvalue = { 0 };
ckey.data = key.dptr;
ckey.size = key.dsize;
cvalue.data = value.dptr;
cvalue.size = value.dsize;
rv = db2s((*GET_BDB(dbm->file)->put)(GET_BDB(dbm->file),
TXN_ARG
&ckey,
&cvalue,
0));
/* store any error info into DBM, and return a status code. */
return set_error(dbm, rv);
}
static apr_status_t vt_db_del(apr_dbm_t *dbm, apr_datum_t key)
{
apr_status_t rv;
DBT ckey = { 0 };
ckey.data = key.dptr;
ckey.size = key.dsize;
rv = db2s((*GET_BDB(dbm->file)->del)(GET_BDB(dbm->file),
TXN_ARG
&ckey,
0));
/* store any error info into DBM, and return a status code. */
return set_error(dbm, rv);
}
static int vt_db_exists(apr_dbm_t *dbm, apr_datum_t key)
{
DBT ckey = { 0 }; /* converted key */
DBT data = { 0 };
int dberr;
ckey.data = key.dptr;
ckey.size = key.dsize;
dberr = do_fetch(GET_BDB(dbm->file), ckey, data);
/* note: the result data is "loaned" to us; we don't need to free it */
/* DB returns DB_NOTFOUND if it doesn't exist. but we want to say
that *any* error means it doesn't exist. */
return dberr == 0;
}
static apr_status_t vt_db_firstkey(apr_dbm_t *dbm, apr_datum_t * pkey)
{
real_file_t *f = dbm->file;
DBT first = { 0 };
DBT data = { 0 };
int dberr;
#if DB_VER == 1
dberr = (*f->bdb->seq)(f->bdb, &first, &data, R_FIRST);
#else
if ((dberr = (*f->bdb->cursor)(f->bdb, NULL, &f->curs
#if DB_VER >= 3 || ((DB_VERSION_MAJOR == 2) && (DB_VERSION_MINOR > 5))
, 0
#endif
)) == 0) {
dberr = (*f->curs->c_get)(f->curs, &first, &data, DB_FIRST);
if (dberr == DB_NOTFOUND) {
memset(&first, 0, sizeof(first));
(*f->curs->c_close)(f->curs);
f->curs = NULL;
dberr = 0;
}
}
#endif
pkey->dptr = first.data;
pkey->dsize = first.size;
/* store any error info into DBM, and return a status code. */
return set_error(dbm, db2s(dberr));
}
static apr_status_t vt_db_nextkey(apr_dbm_t *dbm, apr_datum_t * pkey)
{
real_file_t *f = dbm->file;
DBT ckey = { 0 };
DBT data = { 0 };
int dberr;
ckey.data = pkey->dptr;
ckey.size = pkey->dsize;
#if DB_VER == 1
dberr = (*f->bdb->seq)(f->bdb, &ckey, &data, R_NEXT);
if (dberr == RET_SPECIAL) {
dberr = 0;
ckey.data = NULL;
ckey.size = 0;
}
#else
if (f->curs == NULL)
return APR_EINVAL;
dberr = (*f->curs->c_get)(f->curs, &ckey, &data, DB_NEXT);
if (dberr == DB_NOTFOUND) {
(*f->curs->c_close)(f->curs);
f->curs = NULL;
dberr = 0;
ckey.data = NULL;
ckey.size = 0;
}
#endif
pkey->dptr = ckey.data;
pkey->dsize = ckey.size;
/* store any error info into DBM, and return a status code. */
/* ### or use db2s(dberr) instead of APR_SUCCESS? */
return set_error(dbm, APR_SUCCESS);
}
static void vt_db_freedatum(apr_dbm_t *dbm, apr_datum_t data)
{
/* nothing to do */
}
static void vt_db_usednames(apr_pool_t *pool, const char *pathname,
const char **used1, const char **used2)
{
*used1 = apr_pstrdup(pool, pathname);
*used2 = NULL;
}
APU_MODULE_DECLARE_DATA const apr_dbm_type_t apr_dbm_type_db = {
"db",
vt_db_open,
vt_db_close,
vt_db_fetch,
vt_db_store,
vt_db_del,
vt_db_exists,
vt_db_firstkey,
vt_db_nextkey,
vt_db_freedatum,
vt_db_usednames
};
#endif /* APU_HAVE_DB */

215
dbm/apr_dbm_db.dsp Normal file
View File

@ -0,0 +1,215 @@
# Microsoft Developer Studio Project File - Name="apr_dbm_db" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
CFG=apr_dbm_db - Win32 Release
!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 "apr_dbm_db.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 "apr_dbm_db.mak" CFG="apr_dbm_db - Win32 Release"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "apr_dbm_db - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_dbm_db - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_dbm_db - x64 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_dbm_db - x64 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe
!IF "$(CFG)" == "apr_dbm_db - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
# ADD CPP /nologo /MD /W3 /Zi /O2 /Oy- /I "../include" /I "../../apr/include" /I "../include/private" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_DB=1 /D APU_HAVE_DB_VERSION=4 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbm_db_src" /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /fo"Release/apr_dbm_db-1.res" /d DLL_NAME="apr_dbm_db" /d "NDEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libdb47.lib /nologo /base:"0x6F000000" /subsystem:windows /dll /incremental:no /debug /opt:ref
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libdb47.lib /nologo /base:"0x6F000000" /subsystem:windows /dll /incremental:no /debug /out:"Release\apr_dbm_db-1.dll" /pdb:"Release\apr_dbm_db-1.pdb" /implib:"Release\apr_dbm_db-1.lib" /MACHINE:X86 /opt:ref
# Begin Special Build Tool
TargetPath=Release\apr_dbm_db-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_dbm_db - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /EHsc /c
# ADD CPP /nologo /MDd /W3 /Zi /Od /I "../include" /I "../../apr/include" /I "../include/private" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_DB=1 /D APU_HAVE_DB_VERSION=4 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbm_db_src" /FD /EHsc /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /fo"Debug/apr_dbm_db-1.res" /d DLL_NAME="apr_dbm_db" /d "_DEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libdb47.lib /nologo /base:"0x6F000000" /subsystem:windows /dll /incremental:no /debug
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libdb47.lib /nologo /base:"0x6F000000" /subsystem:windows /dll /incremental:no /debug /out:"Debug\apr_dbm_db-1.dll" /pdb:"Debug\apr_dbm_db-1.pdb" /implib:"Debug\apr_dbm_db-1.lib" /MACHINE:X86
# Begin Special Build Tool
TargetPath=Debug\apr_dbm_db-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_dbm_db - x64 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "x64\Release"
# PROP BASE Intermediate_Dir "x64\Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "x64\Release"
# PROP Intermediate_Dir "x64\Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
# ADD CPP /nologo /MD /W3 /Zi /O2 /Oy- /I "../include" /I "../../apr/include" /I "../include/private" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_DB=1 /D APU_HAVE_DB_VERSION=4 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbm_db_src" /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /fo"x64/Release/apr_dbm_db-1.res" /d DLL_NAME="apr_dbm_db" /d "NDEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libdb47.lib /nologo /base:"0x6F000000" /subsystem:windows /dll /incremental:no /debug /opt:ref
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libdb47.lib /nologo /base:"0x6F000000" /subsystem:windows /dll /incremental:no /debug /out:"x64\Release\apr_dbm_db-1.dll" /pdb:"x64\Release\apr_dbm_db-1.pdb" /implib:"x64\Release\apr_dbm_db-1.lib" /MACHINE:X64 /opt:ref
# Begin Special Build Tool
TargetPath=x64\Release\apr_dbm_db-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_dbm_db - x64 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "x64\Debug"
# PROP BASE Intermediate_Dir "x64\Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "x64\Debug"
# PROP Intermediate_Dir "x64\Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /EHsc /c
# ADD CPP /nologo /MDd /W3 /Zi /Od /I "../include" /I "../../apr/include" /I "../include/private" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_DB=1 /D APU_HAVE_DB_VERSION=4 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbm_db_src" /FD /EHsc /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /fo"x64/Debug/apr_dbm_db-1.res" /d DLL_NAME="apr_dbm_db" /d "_DEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libdb47.lib /nologo /base:"0x6F000000" /subsystem:windows /dll /incremental:no /debug
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libdb47.lib /nologo /base:"0x6F000000" /subsystem:windows /dll /incremental:no /debug /out:"x64\Debug\apr_dbm_db-1.dll" /pdb:"x64\Debug\apr_dbm_db-1.pdb" /implib:"x64\Debug\apr_dbm_db-1.lib" /MACHINE:X64
# Begin Special Build Tool
TargetPath=x64\Debug\apr_dbm_db-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ENDIF
# Begin Target
# Name "apr_dbm_db - Win32 Release"
# Name "apr_dbm_db - Win32 Debug"
# Name "apr_dbm_db - x64 Release"
# Name "apr_dbm_db - x64 Debug"
# Begin Group "Source Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\apr_dbm_berkeleydb.c
# End Source File
# End Group
# Begin Group "Public Header Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=..\include\apr_dbm.h
# End Source File
# End Group
# Begin Group "Internal Header Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=..\include\private\apu_dbm_private.h
# End Source File
# Begin Source File
SOURCE=..\include\private\apu_config.h
# End Source File
# Begin Source File
SOURCE=..\include\private\apu_dbd_internal.h
# End Source File
# Begin Source File
SOURCE=..\include\private\apu_internal.h
# End Source File
# Begin Source File
SOURCE=..\include\private\apu_select_dbm.h
# End Source File
# End Group
# Begin Source File
SOURCE=..\libaprutil.rc
# End Source File
# End Target
# End Project

255
dbm/apr_dbm_gdbm.c Normal file
View File

@ -0,0 +1,255 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apu_config.h"
#include "apu.h"
#include "apr_strings.h"
#if APR_HAVE_STDLIB_H
#include <stdlib.h> /* for free() */
#endif
#if APU_HAVE_GDBM
#include "apr_dbm_private.h"
#include <gdbm.h>
#define APR_DBM_DBMODE_RO GDBM_READER
#define APR_DBM_DBMODE_RW GDBM_WRITER
#define APR_DBM_DBMODE_RWCREATE GDBM_WRCREAT
#define APR_DBM_DBMODE_RWTRUNC GDBM_NEWDB
/* map a GDBM error to an apr_status_t */
static apr_status_t g2s(int gerr)
{
if (gerr == -1) {
/* ### need to fix this */
return APR_EGENERAL;
}
return APR_SUCCESS;
}
static apr_status_t datum_cleanup(void *dptr)
{
if (dptr)
free(dptr);
return APR_SUCCESS;
}
static apr_status_t set_error(apr_dbm_t *dbm, apr_status_t dbm_said)
{
apr_status_t rv = APR_SUCCESS;
/* ### ignore whatever the DBM said (dbm_said); ask it explicitly */
if ((dbm->errcode = gdbm_errno) == GDBM_NO_ERROR) {
dbm->errmsg = NULL;
}
else {
dbm->errmsg = gdbm_strerror(gdbm_errno);
rv = APR_EGENERAL; /* ### need something better */
}
/* captured it. clear it now. */
gdbm_errno = GDBM_NO_ERROR;
return rv;
}
/* --------------------------------------------------------------------------
**
** DEFINE THE VTABLE FUNCTIONS FOR GDBM
*/
static apr_status_t vt_gdbm_open(apr_dbm_t **pdb, const char *pathname,
apr_int32_t mode, apr_fileperms_t perm,
apr_pool_t *pool)
{
GDBM_FILE file;
int dbmode;
*pdb = NULL;
switch (mode) {
case APR_DBM_READONLY:
dbmode = APR_DBM_DBMODE_RO;
break;
case APR_DBM_READWRITE:
dbmode = APR_DBM_DBMODE_RW;
break;
case APR_DBM_RWCREATE:
dbmode = APR_DBM_DBMODE_RWCREATE;
break;
case APR_DBM_RWTRUNC:
dbmode = APR_DBM_DBMODE_RWTRUNC;
break;
default:
return APR_EINVAL;
}
/* Note: stupid cast to get rid of "const" on the pathname */
file = gdbm_open((char *) pathname, 0, dbmode, apr_posix_perms2mode(perm),
NULL);
if (file == NULL)
return APR_EGENERAL; /* ### need a better error */
/* we have an open database... return it */
*pdb = apr_pcalloc(pool, sizeof(**pdb));
(*pdb)->pool = pool;
(*pdb)->type = &apr_dbm_type_gdbm;
(*pdb)->file = file;
/* ### register a cleanup to close the DBM? */
return APR_SUCCESS;
}
static void vt_gdbm_close(apr_dbm_t *dbm)
{
gdbm_close(dbm->file);
}
static apr_status_t vt_gdbm_fetch(apr_dbm_t *dbm, apr_datum_t key,
apr_datum_t *pvalue)
{
datum kd, rd;
kd.dptr = key.dptr;
kd.dsize = key.dsize;
rd = gdbm_fetch(dbm->file, kd);
pvalue->dptr = rd.dptr;
pvalue->dsize = rd.dsize;
if (pvalue->dptr)
apr_pool_cleanup_register(dbm->pool, pvalue->dptr, datum_cleanup,
apr_pool_cleanup_null);
/* store the error info into DBM, and return a status code. Also, note
that *pvalue should have been cleared on error. */
return set_error(dbm, APR_SUCCESS);
}
static apr_status_t vt_gdbm_store(apr_dbm_t *dbm, apr_datum_t key,
apr_datum_t value)
{
int rc;
datum kd, vd;
kd.dptr = key.dptr;
kd.dsize = key.dsize;
vd.dptr = value.dptr;
vd.dsize = value.dsize;
rc = gdbm_store(dbm->file, kd, vd, GDBM_REPLACE);
/* store any error info into DBM, and return a status code. */
return set_error(dbm, g2s(rc));
}
static apr_status_t vt_gdbm_del(apr_dbm_t *dbm, apr_datum_t key)
{
int rc;
datum kd;
kd.dptr = key.dptr;
kd.dsize = key.dsize;
rc = gdbm_delete(dbm->file, kd);
/* store any error info into DBM, and return a status code. */
return set_error(dbm, g2s(rc));
}
static int vt_gdbm_exists(apr_dbm_t *dbm, apr_datum_t key)
{
datum kd;
kd.dptr = key.dptr;
kd.dsize = key.dsize;
return gdbm_exists(dbm->file, kd) != 0;
}
static apr_status_t vt_gdbm_firstkey(apr_dbm_t *dbm, apr_datum_t *pkey)
{
datum rd;
rd = gdbm_firstkey(dbm->file);
pkey->dptr = rd.dptr;
pkey->dsize = rd.dsize;
if (pkey->dptr)
apr_pool_cleanup_register(dbm->pool, pkey->dptr, datum_cleanup,
apr_pool_cleanup_null);
/* store any error info into DBM, and return a status code. */
return set_error(dbm, APR_SUCCESS);
}
static apr_status_t vt_gdbm_nextkey(apr_dbm_t *dbm, apr_datum_t *pkey)
{
datum kd, rd;
kd.dptr = pkey->dptr;
kd.dsize = pkey->dsize;
rd = gdbm_nextkey(dbm->file, kd);
pkey->dptr = rd.dptr;
pkey->dsize = rd.dsize;
if (pkey->dptr)
apr_pool_cleanup_register(dbm->pool, pkey->dptr, datum_cleanup,
apr_pool_cleanup_null);
/* store any error info into DBM, and return a status code. */
return set_error(dbm, APR_SUCCESS);
}
static void vt_gdbm_freedatum(apr_dbm_t *dbm, apr_datum_t data)
{
(void) apr_pool_cleanup_run(dbm->pool, data.dptr, datum_cleanup);
}
static void vt_gdbm_usednames(apr_pool_t *pool, const char *pathname,
const char **used1, const char **used2)
{
*used1 = apr_pstrdup(pool, pathname);
*used2 = NULL;
}
APU_MODULE_DECLARE_DATA const apr_dbm_type_t apr_dbm_type_gdbm = {
"gdbm",
vt_gdbm_open,
vt_gdbm_close,
vt_gdbm_fetch,
vt_gdbm_store,
vt_gdbm_del,
vt_gdbm_exists,
vt_gdbm_firstkey,
vt_gdbm_nextkey,
vt_gdbm_freedatum,
vt_gdbm_usednames
};
#endif /* APU_HAVE_GDBM */

215
dbm/apr_dbm_gdbm.dsp Normal file
View File

@ -0,0 +1,215 @@
# Microsoft Developer Studio Project File - Name="apr_dbm_gdbm" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
CFG=apr_dbm_gdbm - Win32 Release
!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 "apr_dbm_gdbm.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 "apr_dbm_gdbm.mak" CFG="apr_dbm_gdbm - Win32 Release"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "apr_dbm_gdbm - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_dbm_gdbm - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_dbm_gdbm - x64 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "apr_dbm_gdbm - x64 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe
!IF "$(CFG)" == "apr_dbm_gdbm - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
# ADD CPP /nologo /MD /W3 /Zi /O2 /Oy- /I "../include" /I "../../apr/include" /I "../include/private" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_GDBM=1 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbm_gdbm_src" /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /fo"Release/apr_dbm_gdbm-1.res" /d DLL_NAME="apr_dbm_gdbm" /d "NDEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libgdbm.lib /nologo /base:"0x6F010000" /subsystem:windows /dll /incremental:no /debug /opt:ref
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libgdbm.lib /nologo /base:"0x6F010000" /subsystem:windows /dll /incremental:no /debug /out:"Release\apr_dbm_gdbm-1.dll" /pdb:"Release\apr_dbm_gdbm-1.pdb" /implib:"Release\apr_dbm_gdbm-1.lib" /MACHINE:X86 /opt:ref
# Begin Special Build Tool
TargetPath=Release\apr_dbm_gdbm-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_dbm_gdbm - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /EHsc /c
# ADD CPP /nologo /MDd /W3 /Zi /Od /I "../include" /I "../../apr/include" /I "../include/private" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_GDBM=1 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbm_gdbm_src" /FD /EHsc /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /fo"Debug/apr_dbm_gdbm-1.res" /d DLL_NAME="apr_dbm_gdbm" /d "_DEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libgdbm.lib /nologo /base:"0x6F010000" /subsystem:windows /dll /incremental:no /debug
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libgdbm.lib /nologo /base:"0x6F010000" /subsystem:windows /dll /incremental:no /debug /out:"Debug\apr_dbm_gdbm-1.dll" /pdb:"Debug\apr_dbm_gdbm-1.pdb" /implib:"Debug\apr_dbm_gdbm-1.lib" /MACHINE:X86
# Begin Special Build Tool
TargetPath=Debug\apr_dbm_gdbm-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_dbm_gdbm - x64 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "x64\Release"
# PROP BASE Intermediate_Dir "x64\Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "x64\Release"
# PROP Intermediate_Dir "x64\Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
# ADD CPP /nologo /MD /W3 /Zi /O2 /Oy- /I "../include" /I "../../apr/include" /I "../include/private" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_GDBM=1 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbm_gdbm_src" /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /fo"x64/Release/apr_dbm_gdbm-1.res" /d DLL_NAME="apr_dbm_gdbm" /d "NDEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libgdbm.lib /nologo /base:"0x6F010000" /subsystem:windows /dll /incremental:no /debug /opt:ref
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libgdbm.lib /nologo /base:"0x6F010000" /subsystem:windows /dll /incremental:no /debug /out:"x64\Release\apr_dbm_gdbm-1.dll" /pdb:"x64\Release\apr_dbm_gdbm-1.pdb" /implib:"x64\Release\apr_dbm_gdbm-1.lib" /MACHINE:X64 /opt:ref
# Begin Special Build Tool
TargetPath=x64\Release\apr_dbm_gdbm-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "apr_dbm_gdbm - x64 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "x64\Debug"
# PROP BASE Intermediate_Dir "x64\Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "x64\Debug"
# PROP Intermediate_Dir "x64\Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /EHsc /c
# ADD CPP /nologo /MDd /W3 /Zi /Od /I "../include" /I "../../apr/include" /I "../include/private" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "APU_DSO_MODULE_BUILD" /D APU_HAVE_GDBM=1 /Fo"$(INTDIR)\" /Fd"$(INTDIR)\apr_dbm_gdbm_src" /FD /EHsc /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /fo"x64/Debug/apr_dbm_gdbm-1.res" /d DLL_NAME="apr_dbm_gdbm" /d "_DEBUG" /d "APU_VERSION_ONLY" /I "../include" /I "../../apr/include"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libgdbm.lib /nologo /base:"0x6F010000" /subsystem:windows /dll /incremental:no /debug
# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib libgdbm.lib /nologo /base:"0x6F010000" /subsystem:windows /dll /incremental:no /debug /out:"x64\Debug\apr_dbm_gdbm-1.dll" /pdb:"x64\Debug\apr_dbm_gdbm-1.pdb" /implib:"x64\Debug\apr_dbm_gdbm-1.lib" /MACHINE:X64
# Begin Special Build Tool
TargetPath=x64\Debug\apr_dbm_gdbm-1.dll
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ENDIF
# Begin Target
# Name "apr_dbm_gdbm - Win32 Release"
# Name "apr_dbm_gdbm - Win32 Debug"
# Name "apr_dbm_gdbm - x64 Release"
# Name "apr_dbm_gdbm - x64 Debug"
# Begin Group "Source Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\apr_dbm_gdbm.c
# End Source File
# End Group
# Begin Group "Public Header Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=..\include\apr_dbm.h
# End Source File
# End Group
# Begin Group "Internal Header Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=..\include\private\apu_dbm_private.h
# End Source File
# Begin Source File
SOURCE=..\include\private\apu_config.h
# End Source File
# Begin Source File
SOURCE=..\include\private\apu_dbd_internal.h
# End Source File
# Begin Source File
SOURCE=..\include\private\apu_internal.h
# End Source File
# Begin Source File
SOURCE=..\include\private\apu_select_dbm.h
# End Source File
# End Group
# Begin Source File
SOURCE=..\libaprutil.rc
# End Source File
# End Target
# End Project

238
dbm/apr_dbm_ndbm.c Normal file
View File

@ -0,0 +1,238 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr_strings.h"
#if APR_HAVE_STDLIB_H
#include <stdlib.h> /* for free() */
#endif
#include "apu_config.h"
#include "apu.h"
#if APU_HAVE_NDBM
#include "apr_dbm_private.h"
#include <ndbm.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define APR_DBM_DBMODE_RO O_RDONLY
#define APR_DBM_DBMODE_RW O_RDWR
#define APR_DBM_DBMODE_RWCREATE (O_RDWR|O_CREAT)
#define APR_DBM_DBMODE_RWTRUNC (O_RDWR|O_CREAT|O_TRUNC)
/* map a NDBM error to an apr_status_t */
static apr_status_t ndbm2s(int ndbmerr)
{
if (ndbmerr == -1) {
/* ### need to fix this */
return APR_EGENERAL;
}
return APR_SUCCESS;
}
static apr_status_t set_error(apr_dbm_t *dbm, apr_status_t dbm_said)
{
apr_status_t rv = APR_SUCCESS;
/* ### ignore whatever the DBM said (dbm_said); ask it explicitly */
dbm->errmsg = NULL;
if (dbm_error((DBM*)dbm->file)) {
dbm->errmsg = NULL;
rv = APR_EGENERAL; /* ### need something better */
}
/* captured it. clear it now. */
dbm_clearerr((DBM*)dbm->file);
return rv;
}
/* --------------------------------------------------------------------------
**
** DEFINE THE VTABLE FUNCTIONS FOR NDBM
*/
static apr_status_t vt_ndbm_open(apr_dbm_t **pdb, const char *pathname,
apr_int32_t mode, apr_fileperms_t perm,
apr_pool_t *pool)
{
DBM *file;
int dbmode;
*pdb = NULL;
switch (mode) {
case APR_DBM_READONLY:
dbmode = APR_DBM_DBMODE_RO;
break;
case APR_DBM_READWRITE:
dbmode = APR_DBM_DBMODE_RW;
break;
case APR_DBM_RWCREATE:
dbmode = APR_DBM_DBMODE_RWCREATE;
break;
case APR_DBM_RWTRUNC:
dbmode = APR_DBM_DBMODE_RWTRUNC;
break;
default:
return APR_EINVAL;
}
{
file = dbm_open(pathname, dbmode, apr_posix_perms2mode(perm));
if (file == NULL)
return APR_EGENERAL; /* ### need a better error */
}
/* we have an open database... return it */
*pdb = apr_pcalloc(pool, sizeof(**pdb));
(*pdb)->pool = pool;
(*pdb)->type = &apr_dbm_type_ndbm;
(*pdb)->file = file;
/* ### register a cleanup to close the DBM? */
return APR_SUCCESS;
}
static void vt_ndbm_close(apr_dbm_t *dbm)
{
dbm_close(dbm->file);
}
static apr_status_t vt_ndbm_fetch(apr_dbm_t *dbm, apr_datum_t key,
apr_datum_t *pvalue)
{
datum kd, rd;
kd.dptr = key.dptr;
kd.dsize = key.dsize;
rd = dbm_fetch(dbm->file, kd);
pvalue->dptr = rd.dptr;
pvalue->dsize = rd.dsize;
/* store the error info into DBM, and return a status code. Also, note
that *pvalue should have been cleared on error. */
return set_error(dbm, APR_SUCCESS);
}
static apr_status_t vt_ndbm_store(apr_dbm_t *dbm, apr_datum_t key,
apr_datum_t value)
{
int rc;
datum kd, vd;
kd.dptr = key.dptr;
kd.dsize = key.dsize;
vd.dptr = value.dptr;
vd.dsize = value.dsize;
rc = dbm_store(dbm->file, kd, vd, DBM_REPLACE);
/* store any error info into DBM, and return a status code. */
return set_error(dbm, ndbm2s(rc));
}
static apr_status_t vt_ndbm_del(apr_dbm_t *dbm, apr_datum_t key)
{
int rc;
datum kd;
kd.dptr = key.dptr;
kd.dsize = key.dsize;
rc = dbm_delete(dbm->file, kd);
/* store any error info into DBM, and return a status code. */
return set_error(dbm, ndbm2s(rc));
}
static int vt_ndbm_exists(apr_dbm_t *dbm, apr_datum_t key)
{
datum kd, rd;
kd.dptr = key.dptr;
kd.dsize = key.dsize;
rd = dbm_fetch(dbm->file, kd);
return rd.dptr != NULL;
}
static apr_status_t vt_ndbm_firstkey(apr_dbm_t *dbm, apr_datum_t *pkey)
{
datum rd;
rd = dbm_firstkey(dbm->file);
pkey->dptr = rd.dptr;
pkey->dsize = rd.dsize;
/* store any error info into DBM, and return a status code. */
return set_error(dbm, APR_SUCCESS);
}
static apr_status_t vt_ndbm_nextkey(apr_dbm_t *dbm, apr_datum_t *pkey)
{
datum kd, rd;
kd.dptr = pkey->dptr;
kd.dsize = pkey->dsize;
rd = dbm_nextkey(dbm->file);
pkey->dptr = rd.dptr;
pkey->dsize = rd.dsize;
/* store any error info into DBM, and return a status code. */
return set_error(dbm, APR_SUCCESS);
}
static void vt_ndbm_freedatum(apr_dbm_t *dbm, apr_datum_t data)
{
/* nothing to do */
}
static void vt_ndbm_usednames(apr_pool_t *pool, const char *pathname,
const char **used1, const char **used2)
{
*used1 = apr_pstrdup(pool, pathname);
*used2 = NULL;
}
APU_MODULE_DECLARE_DATA const apr_dbm_type_t apr_dbm_type_ndbm = {
"ndbm",
vt_ndbm_open,
vt_ndbm_close,
vt_ndbm_fetch,
vt_ndbm_store,
vt_ndbm_del,
vt_ndbm_exists,
vt_ndbm_firstkey,
vt_ndbm_nextkey,
vt_ndbm_freedatum,
vt_ndbm_usednames
};
#endif /* APU_HAVE_NDBM */

223
dbm/apr_dbm_sdbm.c Normal file
View File

@ -0,0 +1,223 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr_strings.h"
#define APR_WANT_MEMFUNC
#define APR_WANT_STRFUNC
#include "apr_want.h"
#include "apu_config.h"
#include "apu.h"
#if APU_HAVE_SDBM
#include "apr_dbm_private.h"
#include "apr_sdbm.h"
#define APR_DBM_DBMODE_RO (APR_FOPEN_READ | APR_FOPEN_BUFFERED)
#define APR_DBM_DBMODE_RW (APR_FOPEN_READ | APR_FOPEN_WRITE)
#define APR_DBM_DBMODE_RWCREATE (APR_FOPEN_READ | APR_FOPEN_WRITE | APR_FOPEN_CREATE)
#define APR_DBM_DBMODE_RWTRUNC (APR_FOPEN_READ | APR_FOPEN_WRITE | APR_FOPEN_CREATE | \
APR_FOPEN_TRUNCATE)
static apr_status_t set_error(apr_dbm_t *dbm, apr_status_t dbm_said)
{
dbm->errcode = dbm_said;
if (dbm_said != APR_SUCCESS) {
dbm->errmsg = apr_psprintf(dbm->pool, "%pm", &dbm_said);
} else {
dbm->errmsg = NULL;
}
return dbm_said;
}
/* --------------------------------------------------------------------------
**
** DEFINE THE VTABLE FUNCTIONS FOR SDBM
*/
static apr_status_t vt_sdbm_open(apr_dbm_t **pdb, const char *pathname,
apr_int32_t mode, apr_fileperms_t perm,
apr_pool_t *pool)
{
apr_sdbm_t *file;
int dbmode;
*pdb = NULL;
switch (mode) {
case APR_DBM_READONLY:
dbmode = APR_DBM_DBMODE_RO;
break;
case APR_DBM_READWRITE:
dbmode = APR_DBM_DBMODE_RW;
break;
case APR_DBM_RWCREATE:
dbmode = APR_DBM_DBMODE_RWCREATE;
break;
case APR_DBM_RWTRUNC:
dbmode = APR_DBM_DBMODE_RWTRUNC;
break;
default:
return APR_EINVAL;
}
{
apr_status_t rv;
rv = apr_sdbm_open(&file, pathname, dbmode, perm, pool);
if (rv != APR_SUCCESS)
return rv;
}
/* we have an open database... return it */
*pdb = apr_pcalloc(pool, sizeof(**pdb));
(*pdb)->pool = pool;
(*pdb)->type = &apr_dbm_type_sdbm;
(*pdb)->file = file;
/* ### register a cleanup to close the DBM? */
return APR_SUCCESS;
}
static void vt_sdbm_close(apr_dbm_t *dbm)
{
apr_sdbm_close(dbm->file);
}
static apr_status_t vt_sdbm_fetch(apr_dbm_t *dbm, apr_datum_t key,
apr_datum_t *pvalue)
{
apr_status_t rv;
apr_sdbm_datum_t kd, rd;
kd.dptr = key.dptr;
kd.dsize = (int)key.dsize;
rv = apr_sdbm_fetch(dbm->file, &rd, kd);
pvalue->dptr = rd.dptr;
pvalue->dsize = rd.dsize;
/* store the error info into DBM, and return a status code. Also, note
that *pvalue should have been cleared on error. */
return set_error(dbm, rv);
}
static apr_status_t vt_sdbm_store(apr_dbm_t *dbm, apr_datum_t key,
apr_datum_t value)
{
apr_status_t rv;
apr_sdbm_datum_t kd, vd;
kd.dptr = key.dptr;
kd.dsize = (int)key.dsize;
vd.dptr = value.dptr;
vd.dsize = (int)value.dsize;
rv = apr_sdbm_store(dbm->file, kd, vd, APR_SDBM_REPLACE);
/* store any error info into DBM, and return a status code. */
return set_error(dbm, rv);
}
static apr_status_t vt_sdbm_del(apr_dbm_t *dbm, apr_datum_t key)
{
apr_status_t rv;
apr_sdbm_datum_t kd;
kd.dptr = key.dptr;
kd.dsize = (int)key.dsize;
rv = apr_sdbm_delete(dbm->file, kd);
/* store any error info into DBM, and return a status code. */
return set_error(dbm, rv);
}
static int vt_sdbm_exists(apr_dbm_t *dbm, apr_datum_t key)
{
int exists;
apr_sdbm_datum_t vd, kd;
kd.dptr = key.dptr;
kd.dsize = (int)key.dsize;
if (apr_sdbm_fetch(dbm->file, &vd, kd) != APR_SUCCESS)
exists = 0;
else
exists = vd.dptr != NULL;
return exists;
}
static apr_status_t vt_sdbm_firstkey(apr_dbm_t *dbm, apr_datum_t *pkey)
{
apr_status_t rv;
apr_sdbm_datum_t rd;
rv = apr_sdbm_firstkey(dbm->file, &rd);
pkey->dptr = rd.dptr;
pkey->dsize = rd.dsize;
/* store any error info into DBM, and return a status code. */
return set_error(dbm, rv);
}
static apr_status_t vt_sdbm_nextkey(apr_dbm_t *dbm, apr_datum_t *pkey)
{
apr_sdbm_datum_t rd;
(void)apr_sdbm_nextkey(dbm->file, &rd);
pkey->dptr = rd.dptr;
pkey->dsize = rd.dsize;
/* store any error info into DBM, and return a status code. */
return set_error(dbm, APR_SUCCESS);
}
static void vt_sdbm_freedatum(apr_dbm_t *dbm, apr_datum_t data)
{
}
static void vt_sdbm_usednames(apr_pool_t *pool, const char *pathname,
const char **used1, const char **used2)
{
*used1 = apr_pstrcat(pool, pathname, APR_SDBM_DIRFEXT, NULL);
*used2 = apr_pstrcat(pool, pathname, APR_SDBM_PAGFEXT, NULL);
}
APU_MODULE_DECLARE_DATA const apr_dbm_type_t apr_dbm_type_sdbm = {
"sdbm",
vt_sdbm_open,
vt_sdbm_close,
vt_sdbm_fetch,
vt_sdbm_store,
vt_sdbm_del,
vt_sdbm_exists,
vt_sdbm_firstkey,
vt_sdbm_nextkey,
vt_sdbm_freedatum,
vt_sdbm_usednames
};
#endif /* APU_HAVE_SDBM */

584
dbm/sdbm/sdbm.c Normal file
View File

@ -0,0 +1,584 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* sdbm - ndbm work-alike hashed database library
* based on Per-Aake Larson's Dynamic Hashing algorithms. BIT 18 (1978).
* author: oz@nexus.yorku.ca
* ex-public domain, ported to APR for Apache 2
* core routines
*/
#include "apr.h"
#include "apr_file_io.h"
#include "apr_strings.h"
#include "apr_errno.h"
#include "apr_sdbm.h"
#include "sdbm_tune.h"
#include "sdbm_pair.h"
#include "sdbm_private.h"
#include <string.h> /* for memset() */
#include <stdlib.h> /* for malloc() and free() */
/*
* forward
*/
static int getdbit (apr_sdbm_t *, long);
static apr_status_t setdbit(apr_sdbm_t *, long);
static apr_status_t getpage(apr_sdbm_t *db, long);
static apr_status_t getnext(apr_sdbm_datum_t *key, apr_sdbm_t *db);
static apr_status_t makroom(apr_sdbm_t *, long, int);
/*
* useful macros
*/
#define bad(x) ((x).dptr == NULL || (x).dsize <= 0)
#define exhash(item) sdbm_hash((item).dptr, (item).dsize)
#define OFF_PAG(off) (apr_off_t) (off) * PBLKSIZ
#define OFF_DIR(off) (apr_off_t) (off) * DBLKSIZ
static const long masks[] = {
000000000000, 000000000001, 000000000003, 000000000007,
000000000017, 000000000037, 000000000077, 000000000177,
000000000377, 000000000777, 000000001777, 000000003777,
000000007777, 000000017777, 000000037777, 000000077777,
000000177777, 000000377777, 000000777777, 000001777777,
000003777777, 000007777777, 000017777777, 000037777777,
000077777777, 000177777777, 000377777777, 000777777777,
001777777777, 003777777777, 007777777777, 017777777777
};
const apr_sdbm_datum_t sdbm_nullitem = { NULL, 0 };
static apr_status_t database_cleanup(void *data)
{
apr_sdbm_t *db = data;
/*
* Can't rely on apr_sdbm_unlock, since it will merely
* decrement the refcnt if several locks are held.
*/
if (db->flags & (SDBM_SHARED_LOCK | SDBM_EXCLUSIVE_LOCK))
(void) apr_file_unlock(db->dirf);
(void) apr_file_close(db->dirf);
(void) apr_file_close(db->pagf);
free(db);
return APR_SUCCESS;
}
static apr_status_t prep(apr_sdbm_t **pdb, const char *dirname, const char *pagname,
apr_int32_t flags, apr_fileperms_t perms, apr_pool_t *p)
{
apr_sdbm_t *db;
apr_status_t status;
*pdb = NULL;
db = malloc(sizeof(*db));
memset(db, 0, sizeof(*db));
db->pool = p;
/*
* adjust user flags so that WRONLY becomes RDWR,
* as required by this package. Also set our internal
* flag for RDONLY if needed.
*/
if (!(flags & APR_FOPEN_WRITE)) {
db->flags |= SDBM_RDONLY;
}
/*
* adjust the file open flags so that we handle locking
* on our own (don't rely on any locking behavior within
* an apr_file_t, in case it's ever introduced, and set
* our own flag.
*/
if (flags & APR_FOPEN_SHARELOCK) {
db->flags |= SDBM_SHARED;
flags &= ~APR_FOPEN_SHARELOCK;
}
flags |= APR_FOPEN_BINARY | APR_FOPEN_READ;
/*
* open the files in sequence, and stat the dirfile.
* If we fail anywhere, undo everything, return NULL.
*/
if ((status = apr_file_open(&db->dirf, dirname, flags, perms, p))
!= APR_SUCCESS)
goto error;
if ((status = apr_file_open(&db->pagf, pagname, flags, perms, p))
!= APR_SUCCESS)
goto error;
if ((status = apr_sdbm_lock(db, (db->flags & SDBM_RDONLY)
? APR_FLOCK_SHARED
: APR_FLOCK_EXCLUSIVE))
!= APR_SUCCESS)
goto error;
/* apr_pcalloc zeroed the buffers
* apr_sdbm_lock stated the dirf->size and invalidated the cache
*/
/*
* if we are opened in SHARED mode, unlock ourself
*/
if (db->flags & SDBM_SHARED)
if ((status = apr_sdbm_unlock(db)) != APR_SUCCESS)
goto error;
/* make sure that we close the database at some point */
apr_pool_cleanup_register(p, db, database_cleanup, apr_pool_cleanup_null);
/* Done! */
*pdb = db;
return APR_SUCCESS;
error:
if (db->dirf && db->pagf)
(void) apr_sdbm_unlock(db);
if (db->dirf != NULL)
(void) apr_file_close(db->dirf);
if (db->pagf != NULL) {
(void) apr_file_close(db->pagf);
}
free(db);
return status;
}
APU_DECLARE(apr_status_t) apr_sdbm_open(apr_sdbm_t **db, const char *file,
apr_int32_t flags,
apr_fileperms_t perms, apr_pool_t *p)
{
char *dirname = apr_pstrcat(p, file, APR_SDBM_DIRFEXT, NULL);
char *pagname = apr_pstrcat(p, file, APR_SDBM_PAGFEXT, NULL);
return prep(db, dirname, pagname, flags, perms, p);
}
APU_DECLARE(apr_status_t) apr_sdbm_close(apr_sdbm_t *db)
{
return apr_pool_cleanup_run(db->pool, db, database_cleanup);
}
APU_DECLARE(apr_status_t) apr_sdbm_fetch(apr_sdbm_t *db, apr_sdbm_datum_t *val,
apr_sdbm_datum_t key)
{
apr_status_t status;
if (db == NULL || bad(key))
return APR_EINVAL;
if ((status = apr_sdbm_lock(db, APR_FLOCK_SHARED)) != APR_SUCCESS)
return status;
if ((status = getpage(db, exhash(key))) == APR_SUCCESS) {
*val = getpair(db->pagbuf, key);
/* ### do we want a not-found result? */
}
(void) apr_sdbm_unlock(db);
return status;
}
static apr_status_t write_page(apr_sdbm_t *db, const char *buf, long pagno)
{
apr_status_t status;
apr_off_t off = OFF_PAG(pagno);
if ((status = apr_file_seek(db->pagf, APR_SET, &off)) == APR_SUCCESS)
status = apr_file_write_full(db->pagf, buf, PBLKSIZ, NULL);
return status;
}
APU_DECLARE(apr_status_t) apr_sdbm_delete(apr_sdbm_t *db,
const apr_sdbm_datum_t key)
{
apr_status_t status;
if (db == NULL || bad(key))
return APR_EINVAL;
if (apr_sdbm_rdonly(db))
return APR_EINVAL;
if ((status = apr_sdbm_lock(db, APR_FLOCK_EXCLUSIVE)) != APR_SUCCESS)
return status;
if ((status = getpage(db, exhash(key))) == APR_SUCCESS) {
if (!delpair(db->pagbuf, key))
/* ### should we define some APRUTIL codes? */
status = APR_EGENERAL;
else
status = write_page(db, db->pagbuf, db->pagbno);
}
(void) apr_sdbm_unlock(db);
return status;
}
APU_DECLARE(apr_status_t) apr_sdbm_store(apr_sdbm_t *db, apr_sdbm_datum_t key,
apr_sdbm_datum_t val, int flags)
{
int need;
register long hash;
apr_status_t status;
if (db == NULL || bad(key))
return APR_EINVAL;
if (apr_sdbm_rdonly(db))
return APR_EINVAL;
need = key.dsize + val.dsize;
/*
* is the pair too big (or too small) for this database ??
*/
if (need < 0 || need > PAIRMAX)
return APR_EINVAL;
if ((status = apr_sdbm_lock(db, APR_FLOCK_EXCLUSIVE)) != APR_SUCCESS)
return status;
if ((status = getpage(db, (hash = exhash(key)))) == APR_SUCCESS) {
/*
* if we need to replace, delete the key/data pair
* first. If it is not there, ignore.
*/
if (flags == APR_SDBM_REPLACE)
(void) delpair(db->pagbuf, key);
else if (!(flags & APR_SDBM_INSERTDUP) && duppair(db->pagbuf, key)) {
status = APR_EEXIST;
goto error;
}
/*
* if we do not have enough room, we have to split.
*/
if (!fitpair(db->pagbuf, need))
if ((status = makroom(db, hash, need)) != APR_SUCCESS)
goto error;
/*
* we have enough room or split is successful. insert the key,
* and update the page file.
*/
(void) putpair(db->pagbuf, key, val);
status = write_page(db, db->pagbuf, db->pagbno);
}
error:
(void) apr_sdbm_unlock(db);
return status;
}
/*
* makroom - make room by splitting the overfull page
* this routine will attempt to make room for SPLTMAX times before
* giving up.
*/
static apr_status_t makroom(apr_sdbm_t *db, long hash, int need)
{
long newp;
char twin[PBLKSIZ];
char *pag = db->pagbuf;
char *new = twin;
register int smax = SPLTMAX;
apr_status_t status;
do {
/*
* split the current page
*/
(void) splpage(pag, new, db->hmask + 1);
/*
* address of the new page
*/
newp = (hash & db->hmask) | (db->hmask + 1);
/*
* write delay, read avoidence/cache shuffle:
* select the page for incoming pair: if key is to go to the new page,
* write out the previous one, and copy the new one over, thus making
* it the current page. If not, simply write the new page, and we are
* still looking at the page of interest. current page is not updated
* here, as sdbm_store will do so, after it inserts the incoming pair.
*/
if (hash & (db->hmask + 1)) {
if ((status = write_page(db, db->pagbuf, db->pagbno))
!= APR_SUCCESS)
return status;
db->pagbno = newp;
(void) memcpy(pag, new, PBLKSIZ);
}
else {
if ((status = write_page(db, new, newp)) != APR_SUCCESS)
return status;
}
if ((status = setdbit(db, db->curbit)) != APR_SUCCESS)
return status;
/*
* see if we have enough room now
*/
if (fitpair(pag, need))
return APR_SUCCESS;
/*
* try again... update curbit and hmask as getpage would have
* done. because of our update of the current page, we do not
* need to read in anything. BUT we have to write the current
* [deferred] page out, as the window of failure is too great.
*/
db->curbit = 2 * db->curbit
+ ((hash & (db->hmask + 1)) ? 2 : 1);
db->hmask |= db->hmask + 1;
if ((status = write_page(db, db->pagbuf, db->pagbno))
!= APR_SUCCESS)
return status;
} while (--smax);
/*
* if we are here, this is real bad news. After SPLTMAX splits,
* we still cannot fit the key. say goodnight.
*/
#if 0
(void) write(2, "sdbm: cannot insert after SPLTMAX attempts.\n", 44);
#endif
/* ### ENOSPC not really appropriate but better than nothing */
return APR_ENOSPC;
}
/* Reads 'len' bytes from file 'f' at offset 'off' into buf.
* 'off' is given relative to the start of the file.
* If EOF is returned while reading, this is taken as success.
*/
static apr_status_t read_from(apr_file_t *f, void *buf,
apr_off_t off, apr_size_t len)
{
apr_status_t status;
if ((status = apr_file_seek(f, APR_SET, &off)) != APR_SUCCESS ||
((status = apr_file_read_full(f, buf, len, NULL)) != APR_SUCCESS)) {
/* if EOF is reached, pretend we read all zero's */
if (status == APR_EOF) {
memset(buf, 0, len);
status = APR_SUCCESS;
}
}
return status;
}
/*
* the following two routines will break if
* deletions aren't taken into account. (ndbm bug)
*/
APU_DECLARE(apr_status_t) apr_sdbm_firstkey(apr_sdbm_t *db,
apr_sdbm_datum_t *key)
{
apr_status_t status;
if ((status = apr_sdbm_lock(db, APR_FLOCK_SHARED)) != APR_SUCCESS)
return status;
/*
* start at page 0
*/
if ((status = read_from(db->pagf, db->pagbuf, OFF_PAG(0), PBLKSIZ))
== APR_SUCCESS) {
db->pagbno = 0;
db->blkptr = 0;
db->keyptr = 0;
status = getnext(key, db);
}
(void) apr_sdbm_unlock(db);
return status;
}
APU_DECLARE(apr_status_t) apr_sdbm_nextkey(apr_sdbm_t *db,
apr_sdbm_datum_t *key)
{
apr_status_t status;
if ((status = apr_sdbm_lock(db, APR_FLOCK_SHARED)) != APR_SUCCESS)
return status;
status = getnext(key, db);
(void) apr_sdbm_unlock(db);
return status;
}
/*
* all important binary tree traversal
*/
static apr_status_t getpage(apr_sdbm_t *db, long hash)
{
register int hbit;
register long dbit;
register long pagb;
apr_status_t status;
dbit = 0;
hbit = 0;
while (dbit < db->maxbno && getdbit(db, dbit))
dbit = 2 * dbit + ((hash & (1 << hbit++)) ? 2 : 1);
debug(("dbit: %d...", dbit));
db->curbit = dbit;
db->hmask = masks[hbit];
pagb = hash & db->hmask;
/*
* see if the block we need is already in memory.
* note: this lookaside cache has about 10% hit rate.
*/
if (pagb != db->pagbno) {
/*
* note: here, we assume a "hole" is read as 0s.
* if not, must zero pagbuf first.
* ### joe: this assumption was surely never correct? but
* ### we make it so in read_from anyway.
*/
if ((status = read_from(db->pagf, db->pagbuf, OFF_PAG(pagb), PBLKSIZ))
!= APR_SUCCESS)
return status;
if (!chkpage(db->pagbuf))
return APR_ENOSPC; /* ### better error? */
db->pagbno = pagb;
debug(("pag read: %d\n", pagb));
}
return APR_SUCCESS;
}
static int getdbit(apr_sdbm_t *db, long dbit)
{
register long c;
register long dirb;
c = dbit / BYTESIZ;
dirb = c / DBLKSIZ;
if (dirb != db->dirbno) {
if (read_from(db->dirf, db->dirbuf, OFF_DIR(dirb), DBLKSIZ)
!= APR_SUCCESS)
return 0;
db->dirbno = dirb;
debug(("dir read: %d\n", dirb));
}
return db->dirbuf[c % DBLKSIZ] & (1 << dbit % BYTESIZ);
}
static apr_status_t setdbit(apr_sdbm_t *db, long dbit)
{
register long c;
register long dirb;
apr_status_t status;
apr_off_t off;
c = dbit / BYTESIZ;
dirb = c / DBLKSIZ;
if (dirb != db->dirbno) {
if ((status = read_from(db->dirf, db->dirbuf, OFF_DIR(dirb), DBLKSIZ))
!= APR_SUCCESS)
return status;
db->dirbno = dirb;
debug(("dir read: %d\n", dirb));
}
db->dirbuf[c % DBLKSIZ] |= (1 << dbit % BYTESIZ);
if (dbit >= db->maxbno)
db->maxbno += DBLKSIZ * BYTESIZ;
off = OFF_DIR(dirb);
if ((status = apr_file_seek(db->dirf, APR_SET, &off)) == APR_SUCCESS)
status = apr_file_write_full(db->dirf, db->dirbuf, DBLKSIZ, NULL);
return status;
}
/*
* getnext - get the next key in the page, and if done with
* the page, try the next page in sequence
*/
static apr_status_t getnext(apr_sdbm_datum_t *key, apr_sdbm_t *db)
{
apr_status_t status;
for (;;) {
db->keyptr++;
*key = getnkey(db->pagbuf, db->keyptr);
if (key->dptr != NULL)
return APR_SUCCESS;
/*
* we either run out, or there is nothing on this page..
* try the next one... If we lost our position on the
* file, we will have to seek.
*/
db->keyptr = 0;
if (db->pagbno != db->blkptr++) {
apr_off_t off = OFF_PAG(db->blkptr);
if ((status = apr_file_seek(db->pagf, APR_SET, &off))
!= APR_SUCCESS)
return status;
}
db->pagbno = db->blkptr;
/* ### EOF acceptable here too? */
if ((status = apr_file_read_full(db->pagf, db->pagbuf, PBLKSIZ, NULL))
!= APR_SUCCESS)
return status;
if (!chkpage(db->pagbuf))
return APR_EGENERAL; /* ### need better error */
}
/* NOTREACHED */
}
APU_DECLARE(int) apr_sdbm_rdonly(apr_sdbm_t *db)
{
/* ### Should we return true if the first lock is a share lock,
* to reflect that apr_sdbm_store and apr_sdbm_delete will fail?
*/
return (db->flags & SDBM_RDONLY) != 0;
}

63
dbm/sdbm/sdbm_hash.c Normal file
View File

@ -0,0 +1,63 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* sdbm - ndbm work-alike hashed database library
* based on Per-Aake Larson's Dynamic Hashing algorithms. BIT 18 (1978).
* author: oz@nexus.yorku.ca
* status: ex-public domain. keep it that way.
*
* hashing routine
*/
#include "apr_sdbm.h"
#include "sdbm_private.h"
/*
* polynomial conversion ignoring overflows
* [this seems to work remarkably well, in fact better
* then the ndbm hash function. Replace at your own risk]
* use: 65599 nice.
* 65587 even better.
*/
long sdbm_hash(const char *str, int len)
{
register unsigned long n = 0;
#define DUFF /* go ahead and use the loop-unrolled version */
#ifdef DUFF
#define HASHC n = *str++ + 65599 * n
if (len > 0) {
register int loop = (len + 8 - 1) >> 3;
switch(len & (8 - 1)) {
case 0: do {
HASHC; case 7: HASHC;
case 6: HASHC; case 5: HASHC;
case 4: HASHC; case 3: HASHC;
case 2: HASHC; case 1: HASHC;
} while (--loop);
}
}
#else
while (len--)
n = *str++ + 65599 * n;
#endif
return n;
}

79
dbm/sdbm/sdbm_lock.c Normal file
View File

@ -0,0 +1,79 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "apr_file_info.h"
#include "apr_file_io.h"
#include "apr_sdbm.h"
#include "sdbm_private.h"
#include "sdbm_tune.h"
/* NOTE: this function may block until it acquires the lock */
APU_DECLARE(apr_status_t) apr_sdbm_lock(apr_sdbm_t *db, int type)
{
apr_status_t status;
int lock_type = type & APR_FLOCK_TYPEMASK;
if (!(lock_type == APR_FLOCK_SHARED || lock_type == APR_FLOCK_EXCLUSIVE))
return APR_EINVAL;
if (db->flags & SDBM_EXCLUSIVE_LOCK) {
++db->lckcnt;
return APR_SUCCESS;
}
else if (db->flags & SDBM_SHARED_LOCK) {
/*
* Cannot promote a shared lock to an exlusive lock
* in a cross-platform compatibile manner.
*/
if (type == APR_FLOCK_EXCLUSIVE)
return APR_EINVAL;
++db->lckcnt;
return APR_SUCCESS;
}
/*
* zero size: either a fresh database, or one with a single,
* unsplit data page: dirpage is all zeros.
*/
if ((status = apr_file_lock(db->dirf, type)) == APR_SUCCESS)
{
apr_finfo_t finfo;
if ((status = apr_file_info_get(&finfo, APR_FINFO_SIZE, db->dirf))
!= APR_SUCCESS) {
(void) apr_file_unlock(db->dirf);
return status;
}
SDBM_INVALIDATE_CACHE(db, finfo);
++db->lckcnt;
if (type == APR_FLOCK_SHARED)
db->flags |= SDBM_SHARED_LOCK;
else if (type == APR_FLOCK_EXCLUSIVE)
db->flags |= SDBM_EXCLUSIVE_LOCK;
}
return status;
}
APU_DECLARE(apr_status_t) apr_sdbm_unlock(apr_sdbm_t *db)
{
if (!(db->flags & (SDBM_SHARED_LOCK | SDBM_EXCLUSIVE_LOCK)))
return APR_EINVAL;
if (--db->lckcnt > 0)
return APR_SUCCESS;
db->flags &= ~(SDBM_SHARED_LOCK | SDBM_EXCLUSIVE_LOCK);
return apr_file_unlock(db->dirf);
}

319
dbm/sdbm/sdbm_pair.c Normal file
View File

@ -0,0 +1,319 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* sdbm - ndbm work-alike hashed database library
* based on Per-Aake Larson's Dynamic Hashing algorithms. BIT 18 (1978).
* author: oz@nexus.yorku.ca
* status: ex-public domain.
*
* page-level routines
*/
#include "apr_sdbm.h"
#include "sdbm_tune.h"
#include "sdbm_pair.h"
#include "sdbm_private.h"
#include <string.h> /* for memset() */
#define exhash(item) sdbm_hash((item).dptr, (item).dsize)
/*
* forward
*/
static int seepair(char *, int, char *, int);
/*
* page format:
* +------------------------------+
* ino | n | keyoff | datoff | keyoff |
* +------------+--------+--------+
* | datoff | - - - ----> |
* +--------+---------------------+
* | F R E E A R E A |
* +--------------+---------------+
* | <---- - - - | data |
* +--------+-----+----+----------+
* | key | data | key |
* +--------+----------+----------+
*
* calculating the offsets for free area: if the number
* of entries (ino[0]) is zero, the offset to the END of
* the free area is the block size. Otherwise, it is the
* nth (ino[ino[0]]) entry's offset.
*/
int
fitpair(pag, need)
char *pag;
int need;
{
register int n;
register int off;
register int avail;
register short *ino = (short *) pag;
off = ((n = ino[0]) > 0) ? ino[n] : PBLKSIZ;
avail = off - (n + 1) * sizeof(short);
need += 2 * sizeof(short);
debug(("avail %d need %d\n", avail, need));
return need <= avail;
}
void
putpair(pag, key, val)
char *pag;
apr_sdbm_datum_t key;
apr_sdbm_datum_t val;
{
register int n;
register int off;
register short *ino = (short *) pag;
off = ((n = ino[0]) > 0) ? ino[n] : PBLKSIZ;
/*
* enter the key first
*/
off -= key.dsize;
(void) memcpy(pag + off, key.dptr, key.dsize);
ino[n + 1] = off;
/*
* now the data
*/
off -= val.dsize;
(void) memcpy(pag + off, val.dptr, val.dsize);
ino[n + 2] = off;
/*
* adjust item count
*/
ino[0] += 2;
}
apr_sdbm_datum_t
getpair(pag, key)
char *pag;
apr_sdbm_datum_t key;
{
register int i;
register int n;
apr_sdbm_datum_t val;
register short *ino = (short *) pag;
if ((n = ino[0]) == 0)
return sdbm_nullitem;
if ((i = seepair(pag, n, key.dptr, key.dsize)) == 0)
return sdbm_nullitem;
val.dptr = pag + ino[i + 1];
val.dsize = ino[i] - ino[i + 1];
return val;
}
int
duppair(pag, key)
char *pag;
apr_sdbm_datum_t key;
{
register short *ino = (short *) pag;
return ino[0] > 0 && seepair(pag, ino[0], key.dptr, key.dsize) > 0;
}
apr_sdbm_datum_t
getnkey(pag, num)
char *pag;
int num;
{
apr_sdbm_datum_t key;
register int off;
register short *ino = (short *) pag;
num = num * 2 - 1;
if (ino[0] == 0 || num > ino[0])
return sdbm_nullitem;
off = (num > 1) ? ino[num - 1] : PBLKSIZ;
key.dptr = pag + ino[num];
key.dsize = off - ino[num];
return key;
}
int
delpair(pag, key)
char *pag;
apr_sdbm_datum_t key;
{
register int n;
register int i;
register short *ino = (short *) pag;
if ((n = ino[0]) == 0)
return 0;
if ((i = seepair(pag, n, key.dptr, key.dsize)) == 0)
return 0;
/*
* found the key. if it is the last entry
* [i.e. i == n - 1] we just adjust the entry count.
* hard case: move all data down onto the deleted pair,
* shift offsets onto deleted offsets, and adjust them.
* [note: 0 < i < n]
*/
if (i < n - 1) {
register int m;
register char *dst = pag + (i == 1 ? PBLKSIZ : ino[i - 1]);
register char *src = pag + ino[i + 1];
register short zoo = (short) (dst - src);
debug(("free-up %d ", zoo));
/*
* shift data/keys down
*/
m = ino[i + 1] - ino[n];
#undef DUFF /* just use memmove. it should be plenty fast. */
#ifdef DUFF
#define MOVB *--dst = *--src
if (m > 0) {
register int loop = (m + 8 - 1) >> 3;
switch (m & (8 - 1)) {
case 0: do {
MOVB; case 7: MOVB;
case 6: MOVB; case 5: MOVB;
case 4: MOVB; case 3: MOVB;
case 2: MOVB; case 1: MOVB;
} while (--loop);
}
}
#else
dst -= m;
src -= m;
memmove(dst, src, m);
#endif
/*
* adjust offset index up
*/
while (i < n - 1) {
ino[i] = ino[i + 2] + zoo;
i++;
}
}
ino[0] -= 2;
return 1;
}
/*
* search for the key in the page.
* return offset index in the range 0 < i < n.
* return 0 if not found.
*/
static int
seepair(pag, n, key, siz)
char *pag;
register int n;
register char *key;
register int siz;
{
register int i;
register int off = PBLKSIZ;
register short *ino = (short *) pag;
for (i = 1; i < n; i += 2) {
if (siz == off - ino[i] &&
memcmp(key, pag + ino[i], siz) == 0)
return i;
off = ino[i + 1];
}
return 0;
}
void
splpage(pag, new, sbit)
char *pag;
char *new;
long sbit;
{
apr_sdbm_datum_t key;
apr_sdbm_datum_t val;
register int n;
register int off = PBLKSIZ;
char cur[PBLKSIZ];
register short *ino = (short *) cur;
(void) memcpy(cur, pag, PBLKSIZ);
(void) memset(pag, 0, PBLKSIZ);
(void) memset(new, 0, PBLKSIZ);
n = ino[0];
for (ino++; n > 0; ino += 2) {
key.dptr = cur + ino[0];
key.dsize = off - ino[0];
val.dptr = cur + ino[1];
val.dsize = ino[0] - ino[1];
/*
* select the page pointer (by looking at sbit) and insert
*/
(void) putpair((exhash(key) & sbit) ? new : pag, key, val);
off = ino[1];
n -= 2;
}
debug(("%d split %d/%d\n", ((short *) cur)[0] / 2,
((short *) new)[0] / 2,
((short *) pag)[0] / 2));
}
/*
* check page sanity:
* number of entries should be something
* reasonable, and all offsets in the index should be in order.
* this could be made more rigorous.
*/
int
chkpage(pag)
char *pag;
{
register int n;
register int off;
register short *ino = (short *) pag;
if ((n = ino[0]) < 0 || n > PBLKSIZ / sizeof(short))
return 0;
if (n > 0) {
off = PBLKSIZ;
for (ino++; n > 0; ino += 2) {
if (ino[0] > off || ino[1] > off ||
ino[1] > ino[0])
return 0;
off = ino[1];
n -= 2;
}
}
return 1;
}

40
dbm/sdbm/sdbm_pair.h Normal file
View File

@ -0,0 +1,40 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef SDBM_PAIR_H
#define SDBM_PAIR_H
/* Mini EMBED (pair.c) */
#define chkpage apu__sdbm_chkpage
#define delpair apu__sdbm_delpair
#define duppair apu__sdbm_duppair
#define fitpair apu__sdbm_fitpair
#define getnkey apu__sdbm_getnkey
#define getpair apu__sdbm_getpair
#define putpair apu__sdbm_putpair
#define splpage apu__sdbm_splpage
int fitpair(char *, int);
void putpair(char *, apr_sdbm_datum_t, apr_sdbm_datum_t);
apr_sdbm_datum_t getpair(char *, apr_sdbm_datum_t);
int delpair(char *, apr_sdbm_datum_t);
int chkpage (char *);
apr_sdbm_datum_t getnkey(char *, int);
void splpage(char *, char *, long);
int duppair(char *, apr_sdbm_datum_t);
#endif /* SDBM_PAIR_H */

84
dbm/sdbm/sdbm_private.h Normal file
View File

@ -0,0 +1,84 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* sdbm - ndbm work-alike hashed database library
* based on Per-Ake Larson's Dynamic Hashing algorithms. BIT 18 (1978).
* author: oz@nexus.yorku.ca
*/
#ifndef SDBM_PRIVATE_H
#define SDBM_PRIVATE_H
#include "apr.h"
#include "apr_pools.h"
#include "apr_file_io.h"
#include "apr_errno.h" /* for apr_status_t */
#if 0
/* if the block/page size is increased, it breaks perl apr_sdbm_t compatibility */
#define DBLKSIZ 16384
#define PBLKSIZ 8192
#define PAIRMAX 8008 /* arbitrary on PBLKSIZ-N */
#else
#define DBLKSIZ 4096
#define PBLKSIZ 1024
#define PAIRMAX 1008 /* arbitrary on PBLKSIZ-N */
#endif
#define SPLTMAX 10 /* maximum allowed splits */
/* for apr_sdbm_t.flags */
#define SDBM_RDONLY 0x1 /* data base open read-only */
#define SDBM_SHARED 0x2 /* data base open for sharing */
#define SDBM_SHARED_LOCK 0x4 /* data base locked for shared read */
#define SDBM_EXCLUSIVE_LOCK 0x8 /* data base locked for write */
struct apr_sdbm_t {
apr_pool_t *pool;
apr_file_t *dirf; /* directory file descriptor */
apr_file_t *pagf; /* page file descriptor */
apr_int32_t flags; /* status/error flags, see below */
long maxbno; /* size of dirfile in bits */
long curbit; /* current bit number */
long hmask; /* current hash mask */
long blkptr; /* current block for nextkey */
int keyptr; /* current key for nextkey */
long blkno; /* current page to read/write */
long pagbno; /* current page in pagbuf */
char pagbuf[PBLKSIZ]; /* page file block buffer */
long dirbno; /* current block in dirbuf */
char dirbuf[DBLKSIZ]; /* directory file block buffer */
int lckcnt; /* number of calls to sdbm_lock */
};
#define sdbm_hash apu__sdbm_hash
#define sdbm_nullitem apu__sdbm_nullitem
extern const apr_sdbm_datum_t sdbm_nullitem;
long sdbm_hash(const char *str, int len);
/*
* zero the cache
*/
#define SDBM_INVALIDATE_CACHE(db, finfo) \
do { db->dirbno = (!finfo.size) ? 0 : -1; \
db->pagbno = -1; \
db->maxbno = (long)(finfo.size * BYTESIZ); \
} while (0);
#endif /* SDBM_PRIVATE_H */

40
dbm/sdbm/sdbm_tune.h Normal file
View File

@ -0,0 +1,40 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* sdbm - ndbm work-alike hashed database library
* tuning and portability constructs [not nearly enough]
* author: oz@nexus.yorku.ca
*/
#ifndef SDBM_TUNE_H
#define SDBM_TUNE_H
#include "apr_errno.h"
/* ### this might be better off as sizeof(char *) */
#define BYTESIZ 8
/*
* misc
*/
#ifdef DEBUG
#define debug(x) printf x
#else
#define debug(x)
#endif
#endif /* SDBM_TUNE_H */

32
docs/doxygen.conf Normal file
View File

@ -0,0 +1,32 @@
PROJECT_NAME="Apache Portable Runtime Utility Library"
INPUT=.
QUIET=YES
RECURSIVE=YES
FILE_PATTERNS=*.h
OUTPUT_DIRECTORY=docs/dox
MACRO_EXPANSION=YES
EXPAND_ONLY_PREDEF=YES
#EXPAND_AS_DEFINED=
# not sure why this doesn't work as EXPAND_AS_DEFINED, it should!
PREDEFINED="APU_DECLARE(x)=x" \
"APU_DECLARE_NONSTD(x)=x" \
"APU_DECLARE_DATA" \
"APU_MODULE_DECLARE_DATA" \
"APU_DECLARE_LDAP(x)=x" \
"APR_HAS_MMAP" \
"APR_HAS_THREADS" \
"APR_HAS_XLATE" \
"__attribute__(x)=" \
DOXYGEN=
OPTIMIZE_OUTPUT_FOR_C=YES
FULL_PATH_NAMES=YES
CASE_SENSE_NAMES=NO
# some autoconf guru needs to make configure set this correctly...
#STRIP_FROM_PATH=/root/apache/httpd-2.0-8/srclib/apr-util
GENERATE_TAGFILE=docs/dox/apu.tag

268
encoding/apr_base64.c Normal file
View File

@ -0,0 +1,268 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* base64 encoder/decoder. Originally part of main/util.c
* but moved here so that support/ab and apr_sha1.c could
* use it. This meant removing the apr_palloc()s and adding
* ugly 'len' functions, which is quite a nasty cost.
*/
#include "apr_base64.h"
#if APR_CHARSET_EBCDIC
#include "apr_xlate.h"
#endif /* APR_CHARSET_EBCDIC */
/* aaaack but it's fast and const should make it shared text page. */
static const unsigned char pr2six[256] =
{
#if !APR_CHARSET_EBCDIC
/* ASCII table */
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63,
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64,
64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64,
64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
#else /*APR_CHARSET_EBCDIC*/
/* EBCDIC table */
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 63, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 64, 64, 64, 64, 64, 64,
64, 35, 36, 37, 38, 39, 40, 41, 42, 43, 64, 64, 64, 64, 64, 64,
64, 64, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 64, 64, 64, 64, 64, 64,
64, 9, 10, 11, 12, 13, 14, 15, 16, 17, 64, 64, 64, 64, 64, 64,
64, 64, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64, 64,
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64
#endif /*APR_CHARSET_EBCDIC*/
};
#if APR_CHARSET_EBCDIC
static apr_xlate_t *xlate_to_ebcdic;
static unsigned char os_toascii[256];
APU_DECLARE(apr_status_t) apr_base64init_ebcdic(apr_xlate_t *to_ascii,
apr_xlate_t *to_ebcdic)
{
int i;
apr_size_t inbytes_left, outbytes_left;
apr_status_t rv;
int onoff;
/* Only single-byte conversion is supported.
*/
rv = apr_xlate_sb_get(to_ascii, &onoff);
if (rv) {
return rv;
}
if (!onoff) { /* If conversion is not single-byte-only */
return APR_EINVAL;
}
rv = apr_xlate_sb_get(to_ebcdic, &onoff);
if (rv) {
return rv;
}
if (!onoff) { /* If conversion is not single-byte-only */
return APR_EINVAL;
}
xlate_to_ebcdic = to_ebcdic;
for (i = 0; i < sizeof(os_toascii); i++) {
os_toascii[i] = i;
}
inbytes_left = outbytes_left = sizeof(os_toascii);
apr_xlate_conv_buffer(to_ascii, os_toascii, &inbytes_left,
os_toascii, &outbytes_left);
return APR_SUCCESS;
}
#endif /*APR_CHARSET_EBCDIC*/
APU_DECLARE(int) apr_base64_decode_len(const char *bufcoded)
{
int nbytesdecoded;
register const unsigned char *bufin;
register apr_size_t nprbytes;
bufin = (const unsigned char *) bufcoded;
while (pr2six[*(bufin++)] <= 63);
nprbytes = (bufin - (const unsigned char *) bufcoded) - 1;
nbytesdecoded = (((int)nprbytes + 3) / 4) * 3;
return nbytesdecoded + 1;
}
APU_DECLARE(int) apr_base64_decode(char *bufplain, const char *bufcoded)
{
#if APR_CHARSET_EBCDIC
apr_size_t inbytes_left, outbytes_left;
#endif /* APR_CHARSET_EBCDIC */
int len;
len = apr_base64_decode_binary((unsigned char *) bufplain, bufcoded);
#if APR_CHARSET_EBCDIC
inbytes_left = outbytes_left = len;
apr_xlate_conv_buffer(xlate_to_ebcdic, bufplain, &inbytes_left,
bufplain, &outbytes_left);
#endif /* APR_CHARSET_EBCDIC */
bufplain[len] = '\0';
return len;
}
/* This is the same as apr_base64_decode() except on EBCDIC machines, where
* the conversion of the output to ebcdic is left out.
*/
APU_DECLARE(int) apr_base64_decode_binary(unsigned char *bufplain,
const char *bufcoded)
{
int nbytesdecoded;
register const unsigned char *bufin;
register unsigned char *bufout;
register apr_size_t nprbytes;
bufin = (const unsigned char *) bufcoded;
while (pr2six[*(bufin++)] <= 63);
nprbytes = (bufin - (const unsigned char *) bufcoded) - 1;
nbytesdecoded = (((int)nprbytes + 3) / 4) * 3;
bufout = (unsigned char *) bufplain;
bufin = (const unsigned char *) bufcoded;
while (nprbytes > 4) {
*(bufout++) =
(unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);
*(bufout++) =
(unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);
*(bufout++) =
(unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);
bufin += 4;
nprbytes -= 4;
}
/* Note: (nprbytes == 1) would be an error, so just ingore that case */
if (nprbytes > 1) {
*(bufout++) =
(unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);
}
if (nprbytes > 2) {
*(bufout++) =
(unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);
}
if (nprbytes > 3) {
*(bufout++) =
(unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);
}
nbytesdecoded -= (4 - (int)nprbytes) & 3;
return nbytesdecoded;
}
static const char basis_64[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
APU_DECLARE(int) apr_base64_encode_len(int len)
{
return ((len + 2) / 3 * 4) + 1;
}
APU_DECLARE(int) apr_base64_encode(char *encoded, const char *string, int len)
{
#if !APR_CHARSET_EBCDIC
return apr_base64_encode_binary(encoded, (const unsigned char *) string, len);
#else /* APR_CHARSET_EBCDIC */
int i;
char *p;
p = encoded;
for (i = 0; i < len - 2; i += 3) {
*p++ = basis_64[(os_toascii[string[i]] >> 2) & 0x3F];
*p++ = basis_64[((os_toascii[string[i]] & 0x3) << 4) |
((int) (os_toascii[string[i + 1]] & 0xF0) >> 4)];
*p++ = basis_64[((os_toascii[string[i + 1]] & 0xF) << 2) |
((int) (os_toascii[string[i + 2]] & 0xC0) >> 6)];
*p++ = basis_64[os_toascii[string[i + 2]] & 0x3F];
}
if (i < len) {
*p++ = basis_64[(os_toascii[string[i]] >> 2) & 0x3F];
if (i == (len - 1)) {
*p++ = basis_64[((os_toascii[string[i]] & 0x3) << 4)];
*p++ = '=';
}
else {
*p++ = basis_64[((os_toascii[string[i]] & 0x3) << 4) |
((int) (os_toascii[string[i + 1]] & 0xF0) >> 4)];
*p++ = basis_64[((os_toascii[string[i + 1]] & 0xF) << 2)];
}
*p++ = '=';
}
*p++ = '\0';
return p - encoded;
#endif /* APR_CHARSET_EBCDIC */
}
/* This is the same as apr_base64_encode() except on EBCDIC machines, where
* the conversion of the input to ascii is left out.
*/
APU_DECLARE(int) apr_base64_encode_binary(char *encoded,
const unsigned char *string, int len)
{
int i;
char *p;
p = encoded;
for (i = 0; i < len - 2; i += 3) {
*p++ = basis_64[(string[i] >> 2) & 0x3F];
*p++ = basis_64[((string[i] & 0x3) << 4) |
((int) (string[i + 1] & 0xF0) >> 4)];
*p++ = basis_64[((string[i + 1] & 0xF) << 2) |
((int) (string[i + 2] & 0xC0) >> 6)];
*p++ = basis_64[string[i + 2] & 0x3F];
}
if (i < len) {
*p++ = basis_64[(string[i] >> 2) & 0x3F];
if (i == (len - 1)) {
*p++ = basis_64[((string[i] & 0x3) << 4)];
*p++ = '=';
}
else {
*p++ = basis_64[((string[i] & 0x3) << 4) |
((int) (string[i + 1] & 0xF0) >> 4)];
*p++ = basis_64[((string[i + 1] & 0xF) << 2)];
}
*p++ = '=';
}
*p++ = '\0';
return (int)(p - encoded);
}

13
export_vars.sh.in Normal file
View File

@ -0,0 +1,13 @@
#
# export_vars.sh
#
# This shell script is used to export vars to the application using the
# APRUTIL library. This script should be "sourced" to ensure the variable
# values are set within the calling script's context. For example:
#
# $ . path/to/apr-util/export_vars.sh
#
APRUTIL_EXPORT_INCLUDES="@APRUTIL_INCLUDES@"
APRUTIL_EXPORT_LIBS="@APRUTIL_EXPORT_LIBS@"
APRUTIL_LDFLAGS="@APRUTIL_LDFLAGS@"

410
hooks/apr_hooks.c Normal file
View File

@ -0,0 +1,410 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include "apr_pools.h"
#include "apr_tables.h"
#include "apr.h"
#include "apr_hooks.h"
#include "apr_hash.h"
#include "apr_optional_hooks.h"
#include "apr_optional.h"
#define APR_WANT_MEMFUNC
#define APR_WANT_STRFUNC
#include "apr_want.h"
#if 0
#define apr_palloc(pool,size) malloc(size)
#endif
APU_DECLARE_DATA apr_pool_t *apr_hook_global_pool = NULL;
APU_DECLARE_DATA int apr_hook_debug_enabled = 0;
APU_DECLARE_DATA const char *apr_hook_debug_current = NULL;
/** @deprecated @see apr_hook_global_pool */
APU_DECLARE_DATA apr_pool_t *apr_global_hook_pool = NULL;
/** @deprecated @see apr_hook_debug_enabled */
APU_DECLARE_DATA int apr_debug_module_hooks = 0;
/** @deprecated @see apr_hook_debug_current */
APU_DECLARE_DATA const char *apr_current_hooking_module = NULL;
/* NB: This must echo the LINK_##name structure */
typedef struct
{
void (*dummy)(void *);
const char *szName;
const char * const *aszPredecessors;
const char * const *aszSuccessors;
int nOrder;
} TSortData;
typedef struct tsort_
{
void *pData;
int nPredecessors;
struct tsort_ **ppPredecessors;
struct tsort_ *pNext;
} TSort;
#ifdef NETWARE
#include "apr_private.h"
#define get_apd APP_DATA* apd = (APP_DATA*)get_app_data(gLibId);
#define s_aHooksToSort ((apr_array_header_t *)(apd->gs_aHooksToSort))
#define s_phOptionalHooks ((apr_hash_t *)(apd->gs_phOptionalHooks))
#define s_phOptionalFunctions ((apr_hash_t *)(apd->gs_phOptionalFunctions))
#endif
static int crude_order(const void *a_,const void *b_)
{
const TSortData *a=a_;
const TSortData *b=b_;
return a->nOrder-b->nOrder;
}
static TSort *prepare(apr_pool_t *p,TSortData *pItems,int nItems)
{
TSort *pData=apr_palloc(p,nItems*sizeof *pData);
int n;
qsort(pItems,nItems,sizeof *pItems,crude_order);
for(n=0 ; n < nItems ; ++n) {
pData[n].nPredecessors=0;
pData[n].ppPredecessors=apr_pcalloc(p,nItems*sizeof *pData[n].ppPredecessors);
pData[n].pNext=NULL;
pData[n].pData=&pItems[n];
}
for(n=0 ; n < nItems ; ++n) {
int i,k;
for(i=0 ; pItems[n].aszPredecessors && pItems[n].aszPredecessors[i] ; ++i)
for(k=0 ; k < nItems ; ++k)
if(!strcmp(pItems[k].szName,pItems[n].aszPredecessors[i])) {
int l;
for(l=0 ; l < pData[n].nPredecessors ; ++l)
if(pData[n].ppPredecessors[l] == &pData[k])
goto got_it;
pData[n].ppPredecessors[pData[n].nPredecessors]=&pData[k];
++pData[n].nPredecessors;
got_it:
break;
}
for(i=0 ; pItems[n].aszSuccessors && pItems[n].aszSuccessors[i] ; ++i)
for(k=0 ; k < nItems ; ++k)
if(!strcmp(pItems[k].szName,pItems[n].aszSuccessors[i])) {
int l;
for(l=0 ; l < pData[k].nPredecessors ; ++l)
if(pData[k].ppPredecessors[l] == &pData[n])
goto got_it2;
pData[k].ppPredecessors[pData[k].nPredecessors]=&pData[n];
++pData[k].nPredecessors;
got_it2:
break;
}
}
return pData;
}
/* Topologically sort, dragging out-of-order items to the front. Note that
this tends to preserve things that want to be near the front better, and
changing that behaviour might compromise some of Apache's behaviour (in
particular, mod_log_forensic might otherwise get pushed to the end, and
core.c's log open function used to end up at the end when pushing items
to the back was the methedology). Also note that the algorithm could
go back to its original simplicity by sorting from the back instead of
the front.
*/
static TSort *tsort(TSort *pData,int nItems)
{
int nTotal;
TSort *pHead=NULL;
TSort *pTail=NULL;
for(nTotal=0 ; nTotal < nItems ; ++nTotal) {
int n,i,k;
for(n=0 ; ; ++n) {
if(n == nItems)
assert(0); /* we have a loop... */
if(!pData[n].pNext) {
if(pData[n].nPredecessors) {
for(k=0 ; ; ++k) {
assert(k < nItems);
if(pData[n].ppPredecessors[k])
break;
}
for(i=0 ; ; ++i) {
assert(i < nItems);
if(&pData[i] == pData[n].ppPredecessors[k]) {
n=i-1;
break;
}
}
} else
break;
}
}
if(pTail)
pTail->pNext=&pData[n];
else
pHead=&pData[n];
pTail=&pData[n];
pTail->pNext=pTail; /* fudge it so it looks linked */
for(i=0 ; i < nItems ; ++i)
for(k=0 ; k < nItems ; ++k)
if(pData[i].ppPredecessors[k] == &pData[n]) {
--pData[i].nPredecessors;
pData[i].ppPredecessors[k]=NULL;
break;
}
}
pTail->pNext=NULL; /* unfudge the tail */
return pHead;
}
static apr_array_header_t *sort_hook(apr_array_header_t *pHooks,
const char *szName)
{
apr_pool_t *p;
TSort *pSort;
apr_array_header_t *pNew;
int n;
apr_pool_create(&p, apr_hook_global_pool);
pSort=prepare(p,(TSortData *)pHooks->elts,pHooks->nelts);
pSort=tsort(pSort,pHooks->nelts);
pNew=apr_array_make(apr_hook_global_pool,pHooks->nelts,sizeof(TSortData));
if(apr_hook_debug_enabled)
printf("Sorting %s:",szName);
for(n=0 ; pSort ; pSort=pSort->pNext,++n) {
TSortData *pHook;
assert(n < pHooks->nelts);
pHook=apr_array_push(pNew);
memcpy(pHook,pSort->pData,sizeof *pHook);
if(apr_hook_debug_enabled)
printf(" %s",pHook->szName);
}
if(apr_hook_debug_enabled)
fputc('\n',stdout);
return pNew;
}
#ifndef NETWARE
static apr_array_header_t *s_aHooksToSort;
#endif
typedef struct
{
const char *szHookName;
apr_array_header_t **paHooks;
} HookSortEntry;
APU_DECLARE(void) apr_hook_sort_register(const char *szHookName,
apr_array_header_t **paHooks)
{
#ifdef NETWARE
get_apd
#endif
HookSortEntry *pEntry;
if(!s_aHooksToSort)
s_aHooksToSort=apr_array_make(apr_hook_global_pool,1,sizeof(HookSortEntry));
pEntry=apr_array_push(s_aHooksToSort);
pEntry->szHookName=szHookName;
pEntry->paHooks=paHooks;
}
APU_DECLARE(void) apr_hook_sort_all(void)
{
#ifdef NETWARE
get_apd
#endif
int n;
if (!s_aHooksToSort) {
s_aHooksToSort = apr_array_make(apr_hook_global_pool, 1, sizeof(HookSortEntry));
}
for(n=0 ; n < s_aHooksToSort->nelts ; ++n) {
HookSortEntry *pEntry=&((HookSortEntry *)s_aHooksToSort->elts)[n];
*pEntry->paHooks=sort_hook(*pEntry->paHooks,pEntry->szHookName);
}
}
#ifndef NETWARE
static apr_hash_t *s_phOptionalHooks;
static apr_hash_t *s_phOptionalFunctions;
#endif
APU_DECLARE(void) apr_hook_deregister_all(void)
{
#ifdef NETWARE
get_apd
#endif
int n;
if (!s_aHooksToSort) {
return;
}
for(n=0 ; n < s_aHooksToSort->nelts ; ++n) {
HookSortEntry *pEntry=&((HookSortEntry *)s_aHooksToSort->elts)[n];
*pEntry->paHooks=NULL;
}
s_aHooksToSort=NULL;
s_phOptionalHooks=NULL;
s_phOptionalFunctions=NULL;
}
APU_DECLARE(void) apr_hook_debug_show(const char *szName,
const char * const *aszPre,
const char * const *aszSucc)
{
int nFirst;
printf(" Hooked %s",szName);
if(aszPre) {
fputs(" pre(",stdout);
nFirst=1;
while(*aszPre) {
if(!nFirst)
fputc(',',stdout);
nFirst=0;
fputs(*aszPre,stdout);
++aszPre;
}
fputc(')',stdout);
}
if(aszSucc) {
fputs(" succ(",stdout);
nFirst=1;
while(*aszSucc) {
if(!nFirst)
fputc(',',stdout);
nFirst=0;
fputs(*aszSucc,stdout);
++aszSucc;
}
fputc(')',stdout);
}
fputc('\n',stdout);
}
/* Optional hook support */
APR_DECLARE_EXTERNAL_HOOK(apr,APU,void,_optional,(void))
APU_DECLARE(apr_array_header_t *) apr_optional_hook_get(const char *szName)
{
#ifdef NETWARE
get_apd
#endif
apr_array_header_t **ppArray;
if(!s_phOptionalHooks)
return NULL;
ppArray=apr_hash_get(s_phOptionalHooks,szName,strlen(szName));
if(!ppArray)
return NULL;
return *ppArray;
}
APU_DECLARE(void) apr_optional_hook_add(const char *szName,void (*pfn)(void),
const char * const *aszPre,
const char * const *aszSucc,int nOrder)
{
#ifdef NETWARE
get_apd
#endif
apr_array_header_t *pArray=apr_optional_hook_get(szName);
apr_LINK__optional_t *pHook;
if(!pArray) {
apr_array_header_t **ppArray;
pArray=apr_array_make(apr_hook_global_pool,1,
sizeof(apr_LINK__optional_t));
if(!s_phOptionalHooks)
s_phOptionalHooks=apr_hash_make(apr_hook_global_pool);
ppArray=apr_palloc(apr_hook_global_pool,sizeof *ppArray);
*ppArray=pArray;
apr_hash_set(s_phOptionalHooks,szName,strlen(szName),ppArray);
apr_hook_sort_register(szName,ppArray);
}
pHook=apr_array_push(pArray);
pHook->pFunc=pfn;
pHook->aszPredecessors=aszPre;
pHook->aszSuccessors=aszSucc;
pHook->nOrder=nOrder;
pHook->szName=apr_hook_debug_current;
if(apr_hook_debug_enabled)
apr_hook_debug_show(szName,aszPre,aszSucc);
}
/* optional function support */
APU_DECLARE(apr_opt_fn_t *) apr_dynamic_fn_retrieve(const char *szName)
{
#ifdef NETWARE
get_apd
#endif
if(!s_phOptionalFunctions)
return NULL;
return (void(*)(void))apr_hash_get(s_phOptionalFunctions,szName,strlen(szName));
}
/* Deprecated */
APU_DECLARE_NONSTD(void) apr_dynamic_fn_register(const char *szName,
apr_opt_fn_t *pfn)
{
#ifdef NETWARE
get_apd
#endif
if(!s_phOptionalFunctions)
s_phOptionalFunctions=apr_hash_make(apr_hook_global_pool);
apr_hash_set(s_phOptionalFunctions,szName,strlen(szName),(void *)pfn);
}
#if 0
void main()
{
const char *aszAPre[]={"b","c",NULL};
const char *aszBPost[]={"a",NULL};
const char *aszCPost[]={"b",NULL};
TSortData t1[]=
{
{ "a",aszAPre,NULL },
{ "b",NULL,aszBPost },
{ "c",NULL,aszCPost }
};
TSort *pResult;
pResult=prepare(t1,3);
pResult=tsort(pResult,3);
for( ; pResult ; pResult=pResult->pNext)
printf("%s\n",pResult->pData->szName);
}
#endif

128
include/apr_anylock.h Normal file
View File

@ -0,0 +1,128 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @file apr_anylock.h
* @brief APR-Util transparent any lock flavor wrapper
*/
#ifndef APR_ANYLOCK_H
#define APR_ANYLOCK_H
#include "apr_proc_mutex.h"
#include "apr_thread_mutex.h"
#include "apr_thread_rwlock.h"
/** Structure that may contain any APR lock type */
typedef struct apr_anylock_t {
/** Indicates what type of lock is in lock */
enum tm_lock {
apr_anylock_none, /**< None */
apr_anylock_procmutex, /**< Process-based */
apr_anylock_threadmutex, /**< Thread-based */
apr_anylock_readlock, /**< Read lock */
apr_anylock_writelock /**< Write lock */
} type;
/** Union of all possible APR locks */
union apr_anylock_u_t {
apr_proc_mutex_t *pm; /**< Process mutex */
#if APR_HAS_THREADS
apr_thread_mutex_t *tm; /**< Thread mutex */
apr_thread_rwlock_t *rw; /**< Read-write lock */
#endif
} lock;
} apr_anylock_t;
#if APR_HAS_THREADS
/** Lock an apr_anylock_t structure */
#define APR_ANYLOCK_LOCK(lck) \
(((lck)->type == apr_anylock_none) \
? APR_SUCCESS \
: (((lck)->type == apr_anylock_threadmutex) \
? apr_thread_mutex_lock((lck)->lock.tm) \
: (((lck)->type == apr_anylock_procmutex) \
? apr_proc_mutex_lock((lck)->lock.pm) \
: (((lck)->type == apr_anylock_readlock) \
? apr_thread_rwlock_rdlock((lck)->lock.rw) \
: (((lck)->type == apr_anylock_writelock) \
? apr_thread_rwlock_wrlock((lck)->lock.rw) \
: APR_EINVAL)))))
#else /* APR_HAS_THREADS */
#define APR_ANYLOCK_LOCK(lck) \
(((lck)->type == apr_anylock_none) \
? APR_SUCCESS \
: (((lck)->type == apr_anylock_procmutex) \
? apr_proc_mutex_lock((lck)->lock.pm) \
: APR_EINVAL))
#endif /* APR_HAS_THREADS */
#if APR_HAS_THREADS
/** Try to lock an apr_anylock_t structure */
#define APR_ANYLOCK_TRYLOCK(lck) \
(((lck)->type == apr_anylock_none) \
? APR_SUCCESS \
: (((lck)->type == apr_anylock_threadmutex) \
? apr_thread_mutex_trylock((lck)->lock.tm) \
: (((lck)->type == apr_anylock_procmutex) \
? apr_proc_mutex_trylock((lck)->lock.pm) \
: (((lck)->type == apr_anylock_readlock) \
? apr_thread_rwlock_tryrdlock((lck)->lock.rw) \
: (((lck)->type == apr_anylock_writelock) \
? apr_thread_rwlock_trywrlock((lck)->lock.rw) \
: APR_EINVAL)))))
#else /* APR_HAS_THREADS */
#define APR_ANYLOCK_TRYLOCK(lck) \
(((lck)->type == apr_anylock_none) \
? APR_SUCCESS \
: (((lck)->type == apr_anylock_procmutex) \
? apr_proc_mutex_trylock((lck)->lock.pm) \
: APR_EINVAL))
#endif /* APR_HAS_THREADS */
#if APR_HAS_THREADS
/** Unlock an apr_anylock_t structure */
#define APR_ANYLOCK_UNLOCK(lck) \
(((lck)->type == apr_anylock_none) \
? APR_SUCCESS \
: (((lck)->type == apr_anylock_threadmutex) \
? apr_thread_mutex_unlock((lck)->lock.tm) \
: (((lck)->type == apr_anylock_procmutex) \
? apr_proc_mutex_unlock((lck)->lock.pm) \
: ((((lck)->type == apr_anylock_readlock) || \
((lck)->type == apr_anylock_writelock)) \
? apr_thread_rwlock_unlock((lck)->lock.rw) \
: APR_EINVAL))))
#else /* APR_HAS_THREADS */
#define APR_ANYLOCK_UNLOCK(lck) \
(((lck)->type == apr_anylock_none) \
? APR_SUCCESS \
: (((lck)->type == apr_anylock_procmutex) \
? apr_proc_mutex_unlock((lck)->lock.pm) \
: APR_EINVAL))
#endif /* APR_HAS_THREADS */
#endif /* !APR_ANYLOCK_H */

112
include/apr_base64.h Normal file
View File

@ -0,0 +1,112 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* The apr_vsnprintf/apr_snprintf functions are based on, and used with the
* permission of, the SIO stdio-replacement strx_* functions by Panos
* Tsirigotis <panos@alumni.cs.colorado.edu> for xinetd.
*/
/**
* @file apr_base64.h
* @brief APR-UTIL Base64 Encoding
*/
#ifndef APR_BASE64_H
#define APR_BASE64_H
#include "apu.h"
#include "apr_general.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @defgroup APR_Util_Base64 Base64 Encoding
* @ingroup APR_Util
* @{
*/
/* Simple BASE64 encode/decode functions.
*
* As we might encode binary strings, hence we require the length of
* the incoming plain source. And return the length of what we decoded.
*
* The decoding function takes any non valid char (i.e. whitespace, \0
* or anything non A-Z,0-9 etc as terminal.
*
* plain strings/binary sequences are not assumed '\0' terminated. Encoded
* strings are neither. But probably should.
*
*/
/**
* Given the length of an un-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 maximum buffer length required to decode the plain text
* string given the encoded string.
* @param coded_src The encoded string
* @return the maximum required buffer length for the plain text string
*/
APU_DECLARE(int) apr_base64_decode_len(const char * coded_src);
/**
* Decode a string to plain text
* @param plain_dst The destination string for the plain text
* @param coded_src The encoded string
* @return the length of the plain text string
*/
APU_DECLARE(int) apr_base64_decode(char * plain_dst, const char *coded_src);
/**
* Decode an EBCDIC string to plain text
* @param plain_dst The destination string for the plain text
* @param coded_src The encoded string
* @return the length of the plain text string
*/
APU_DECLARE(int) apr_base64_decode_binary(unsigned char * plain_dst,
const char *coded_src);
/** @} */
#ifdef __cplusplus
}
#endif
#endif /* !APR_BASE64_H */

1570
include/apr_buckets.h Normal file

File diff suppressed because it is too large Load Diff

419
include/apr_crypto.h Normal file
View File

@ -0,0 +1,419 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef APR_CRYPTO_H
#define APR_CRYPTO_H
#include "apu.h"
#include "apr_pools.h"
#include "apr_tables.h"
#include "apr_hash.h"
#include "apu_errno.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @file apr_crypto.h
* @brief APR-UTIL Crypto library
*/
/**
* @defgroup APR_Util_Crypto Crypto routines
* @ingroup APR_Util
* @{
*/
#if APU_HAVE_CRYPTO
#ifndef APU_CRYPTO_RECOMMENDED_DRIVER
#if APU_HAVE_OPENSSL
#define APU_CRYPTO_RECOMMENDED_DRIVER "openssl"
#else
#if APU_HAVE_NSS
#define APU_CRYPTO_RECOMMENDED_DRIVER "nss"
#else
#if APU_HAVE_MSCNG
#define APU_CRYPTO_RECOMMENDED_DRIVER "mscng"
#else
#if APU_HAVE_MSCAPI
#define APU_CRYPTO_RECOMMENDED_DRIVER "mscapi"
#else
#endif
#endif
#endif
#endif
#endif
/**
* Symmetric Key types understood by the library.
*
* NOTE: It is expected that this list will grow over time.
*
* Interoperability Matrix:
*
* The matrix is based on the testcrypto.c unit test, which attempts to
* test whether a simple encrypt/decrypt will succeed, as well as testing
* whether an encrypted string by one library can be decrypted by the
* others.
*
* Some libraries will successfully encrypt and decrypt their own data,
* but won't decrypt data from another library. It is hoped that over
* time these anomalies will be found and fixed, but until then it is
* recommended that ciphers are chosen that interoperate across platform.
*
* An X below means the test passes, it does not necessarily mean that
* encryption performed is correct or secure. Applications should stick
* to ciphers that pass the interoperablity tests on the right hand side
* of the table.
*
* Aligned data is data whose length is a multiple of the block size for
* the chosen cipher. Padded data is data that is not aligned by block
* size and must be padded by the crypto library.
*
* OpenSSL NSS Interop
* Align Pad Align Pad Align Pad
* 3DES_192/CBC X X X X X X
* 3DES_192/ECB X X
* AES_256/CBC X X X X X X
* AES_256/ECB X X X X
* AES_192/CBC X X X X
* AES_192/ECB X X X
* AES_128/CBC X X X X
* AES_128/ECB X X X
*
* Conclusion: for padded data, use 3DES_192/CBC or AES_256/CBC. For
* aligned data, use 3DES_192/CBC, AES_256/CBC or AES_256/ECB.
*/
typedef enum
{
APR_KEY_NONE, APR_KEY_3DES_192, /** 192 bit (3-Key) 3DES */
APR_KEY_AES_128, /** 128 bit AES */
APR_KEY_AES_192, /** 192 bit AES */
APR_KEY_AES_256
/** 256 bit AES */
} apr_crypto_block_key_type_e;
typedef enum
{
APR_MODE_NONE, /** An error condition */
APR_MODE_ECB, /** Electronic Code Book */
APR_MODE_CBC
/** Cipher Block Chaining */
} apr_crypto_block_key_mode_e;
/* These are opaque structs. Instantiation is up to each backend */
typedef struct apr_crypto_driver_t apr_crypto_driver_t;
typedef struct apr_crypto_t apr_crypto_t;
typedef struct apr_crypto_config_t apr_crypto_config_t;
typedef struct apr_crypto_key_t apr_crypto_key_t;
typedef struct apr_crypto_block_t apr_crypto_block_t;
/**
* @brief Perform once-only initialisation. Call once only.
*
* @param pool - pool to register any shutdown cleanups, etc
* @return APR_NOTIMPL in case of no crypto support.
*/
APU_DECLARE(apr_status_t) apr_crypto_init(apr_pool_t *pool);
/**
* @brief Register a cleanup to zero out the buffer provided
* when the pool is cleaned up.
*
* @param pool - pool to register the cleanup
* @param buffer - buffer to zero out
* @param size - size of the buffer to zero out
*/
APU_DECLARE(apr_status_t) apr_crypto_clear(apr_pool_t *pool, void *buffer,
apr_size_t size);
/**
* @brief Get the driver struct for a name
*
* @param driver - pointer to driver struct.
* @param name - driver name
* @param params - array of initialisation parameters
* @param result - result and error message on failure
* @param pool - (process) pool to register cleanup
* @return APR_SUCCESS for success
* @return APR_ENOTIMPL for no driver (when DSO not enabled)
* @return APR_EDSOOPEN if DSO driver file can't be opened
* @return APR_ESYMNOTFOUND if the driver file doesn't contain a driver
* @remarks NSS: the params can have "dir", "key3", "cert7" and "secmod"
* keys, each followed by an equal sign and a value. Such key/value pairs can
* be delimited by space or tab. If the value contains a space, surround the
* whole key value pair in quotes: "dir=My Directory".
* @remarks OpenSSL: currently no params are supported.
*/
APU_DECLARE(apr_status_t) apr_crypto_get_driver(
const apr_crypto_driver_t **driver,
const char *name, const char *params, const apu_err_t **result,
apr_pool_t *pool);
/**
* @brief Return the name of the driver.
*
* @param driver - The driver in use.
* @return The name of the driver.
*/
APU_DECLARE(const char *) apr_crypto_driver_name(
const apr_crypto_driver_t *driver);
/**
* @brief Get the result of the last operation on a context. If the result
* is NULL, the operation was successful.
* @param result - the result structure
* @param f - context pointer
* @return APR_SUCCESS for success
*/
APU_DECLARE(apr_status_t) apr_crypto_error(const apu_err_t **result,
const apr_crypto_t *f);
/**
* @brief Create a context for supporting encryption. Keys, certificates,
* algorithms and other parameters will be set per context. More than
* one context can be created at one time. A cleanup will be automatically
* registered with the given pool to guarantee a graceful shutdown.
* @param f - context pointer will be written here
* @param driver - driver to use
* @param params - array of key parameters
* @param pool - process pool
* @return APR_ENOENGINE when the engine specified does not exist. APR_EINITENGINE
* if the engine cannot be initialised.
* @remarks NSS: currently no params are supported.
* @remarks OpenSSL: the params can have "engine" as a key, followed by an equal
* sign and a value.
*/
APU_DECLARE(apr_status_t) apr_crypto_make(apr_crypto_t **f,
const apr_crypto_driver_t *driver, const char *params,
apr_pool_t *pool);
/**
* @brief Get a hash table of key types, keyed by the name of the type against
* an integer pointer constant.
*
* @param types - hashtable of key types keyed to constants.
* @param f - encryption context
* @return APR_SUCCESS for success
*/
APU_DECLARE(apr_status_t) apr_crypto_get_block_key_types(apr_hash_t **types,
const apr_crypto_t *f);
/**
* @brief Get a hash table of key modes, keyed by the name of the mode against
* an integer pointer constant.
*
* @param modes - hashtable of key modes keyed to constants.
* @param f - encryption context
* @return APR_SUCCESS for success
*/
APU_DECLARE(apr_status_t) apr_crypto_get_block_key_modes(apr_hash_t **modes,
const apr_crypto_t *f);
/**
* @brief Create a key from the given passphrase. By default, the PBKDF2
* algorithm is used to generate the key from the passphrase. It is expected
* that the same pass phrase will generate the same key, regardless of the
* backend crypto platform used. The key is cleaned up when the context
* is cleaned, and may be reused with multiple encryption or decryption
* operations.
* @note If *key is NULL, a apr_crypto_key_t will be created from a pool. If
* *key is not NULL, *key must point at a previously created structure.
* @param key The key returned, see note.
* @param ivSize The size of the initialisation vector will be returned, based
* on whether an IV is relevant for this type of crypto.
* @param pass The passphrase to use.
* @param passLen The passphrase length in bytes
* @param salt The salt to use.
* @param saltLen The salt length in bytes
* @param type 3DES_192, AES_128, AES_192, AES_256.
* @param mode Electronic Code Book / Cipher Block Chaining.
* @param doPad Pad if necessary.
* @param iterations Number of iterations to use in algorithm
* @param f The context to use.
* @param p The pool to use.
* @return Returns APR_ENOKEY if the pass phrase is missing or empty, or if a backend
* error occurred while generating the key. APR_ENOCIPHER if the type or mode
* is not supported by the particular backend. APR_EKEYTYPE if the key type is
* not known. APR_EPADDING if padding was requested but is not supported.
* APR_ENOTIMPL if not implemented.
*/
APU_DECLARE(apr_status_t) apr_crypto_passphrase(apr_crypto_key_t **key,
apr_size_t *ivSize, const char *pass, apr_size_t passLen,
const unsigned char * salt, apr_size_t saltLen,
const apr_crypto_block_key_type_e type,
const apr_crypto_block_key_mode_e mode, const int doPad,
const int iterations, const apr_crypto_t *f, apr_pool_t *p);
/**
* @brief Initialise a context for encrypting arbitrary data using the given key.
* @note If *ctx is NULL, a apr_crypto_block_t will be created from a pool. If
* *ctx is not NULL, *ctx must point at a previously created structure.
* @param ctx The block context returned, see note.
* @param iv Optional initialisation vector. If the buffer pointed to is NULL,
* an IV will be created at random, in space allocated from the pool.
* If the buffer pointed to is not NULL, the IV in the buffer will be
* used.
* @param key The key structure to use.
* @param blockSize The block size of the cipher.
* @param p The pool to use.
* @return Returns APR_ENOIV if an initialisation vector is required but not specified.
* Returns APR_EINIT if the backend failed to initialise the context. Returns
* APR_ENOTIMPL if not implemented.
*/
APU_DECLARE(apr_status_t) apr_crypto_block_encrypt_init(
apr_crypto_block_t **ctx, const unsigned char **iv,
const apr_crypto_key_t *key, apr_size_t *blockSize, apr_pool_t *p);
/**
* @brief Encrypt data provided by in, write it to out.
* @note The number of bytes written will be written to outlen. If
* out is NULL, outlen will contain the maximum size of the
* buffer needed to hold the data, including any data
* generated by apr_crypto_block_encrypt_finish below. If *out points
* to NULL, a buffer sufficiently large will be created from
* the pool provided. If *out points to a not-NULL value, this
* value will be used as a buffer instead.
* @param out Address of a buffer to which data will be written,
* see note.
* @param outlen Length of the output will be written here.
* @param in Address of the buffer to read.
* @param inlen Length of the buffer to read.
* @param ctx The block context to use.
* @return APR_ECRYPT if an error occurred. Returns APR_ENOTIMPL if
* not implemented.
*/
APU_DECLARE(apr_status_t) apr_crypto_block_encrypt(unsigned char **out,
apr_size_t *outlen, const unsigned char *in, apr_size_t inlen,
apr_crypto_block_t *ctx);
/**
* @brief Encrypt final data block, write it to out.
* @note If necessary the final block will be written out after being
* padded. Typically the final block will be written to the
* same buffer used by apr_crypto_block_encrypt, offset by the
* number of bytes returned as actually written by the
* apr_crypto_block_encrypt() call. After this call, the context
* is cleaned and can be reused by apr_crypto_block_encrypt_init().
* @param out Address of a buffer to which data will be written. This
* buffer must already exist, and is usually the same
* buffer used by apr_evp_crypt(). See note.
* @param outlen Length of the output will be written here.
* @param ctx The block context to use.
* @return APR_ECRYPT if an error occurred.
* @return APR_EPADDING if padding was enabled and the block was incorrectly
* formatted.
* @return APR_ENOTIMPL if not implemented.
*/
APU_DECLARE(apr_status_t) apr_crypto_block_encrypt_finish(unsigned char *out,
apr_size_t *outlen, apr_crypto_block_t *ctx);
/**
* @brief Initialise a context for decrypting arbitrary data using the given key.
* @note If *ctx is NULL, a apr_crypto_block_t will be created from a pool. If
* *ctx is not NULL, *ctx must point at a previously created structure.
* @param ctx The block context returned, see note.
* @param blockSize The block size of the cipher.
* @param iv Optional initialisation vector.
* @param key The key structure to use.
* @param p The pool to use.
* @return Returns APR_ENOIV if an initialisation vector is required but not specified.
* Returns APR_EINIT if the backend failed to initialise the context. Returns
* APR_ENOTIMPL if not implemented.
*/
APU_DECLARE(apr_status_t) apr_crypto_block_decrypt_init(
apr_crypto_block_t **ctx, apr_size_t *blockSize,
const unsigned char *iv, const apr_crypto_key_t *key, apr_pool_t *p);
/**
* @brief Decrypt data provided by in, write it to out.
* @note The number of bytes written will be written to outlen. If
* out is NULL, outlen will contain the maximum size of the
* buffer needed to hold the data, including any data
* generated by apr_crypto_block_decrypt_finish below. If *out points
* to NULL, a buffer sufficiently large will be created from
* the pool provided. If *out points to a not-NULL value, this
* value will be used as a buffer instead.
* @param out Address of a buffer to which data will be written,
* see note.
* @param outlen Length of the output will be written here.
* @param in Address of the buffer to read.
* @param inlen Length of the buffer to read.
* @param ctx The block context to use.
* @return APR_ECRYPT if an error occurred. Returns APR_ENOTIMPL if
* not implemented.
*/
APU_DECLARE(apr_status_t) apr_crypto_block_decrypt(unsigned char **out,
apr_size_t *outlen, const unsigned char *in, apr_size_t inlen,
apr_crypto_block_t *ctx);
/**
* @brief Decrypt final data block, write it to out.
* @note If necessary the final block will be written out after being
* padded. Typically the final block will be written to the
* same buffer used by apr_crypto_block_decrypt, offset by the
* number of bytes returned as actually written by the
* apr_crypto_block_decrypt() call. After this call, the context
* is cleaned and can be reused by apr_crypto_block_decrypt_init().
* @param out Address of a buffer to which data will be written. This
* buffer must already exist, and is usually the same
* buffer used by apr_evp_crypt(). See note.
* @param outlen Length of the output will be written here.
* @param ctx The block context to use.
* @return APR_ECRYPT if an error occurred.
* @return APR_EPADDING if padding was enabled and the block was incorrectly
* formatted.
* @return APR_ENOTIMPL if not implemented.
*/
APU_DECLARE(apr_status_t) apr_crypto_block_decrypt_finish(unsigned char *out,
apr_size_t *outlen, apr_crypto_block_t *ctx);
/**
* @brief Clean encryption / decryption context.
* @note After cleanup, a context is free to be reused if necessary.
* @param ctx The block context to use.
* @return Returns APR_ENOTIMPL if not supported.
*/
APU_DECLARE(apr_status_t) apr_crypto_block_cleanup(apr_crypto_block_t *ctx);
/**
* @brief Clean encryption / decryption context.
* @note After cleanup, a context is free to be reused if necessary.
* @param f The context to use.
* @return Returns APR_ENOTIMPL if not supported.
*/
APU_DECLARE(apr_status_t) apr_crypto_cleanup(apr_crypto_t *f);
/**
* @brief Shutdown the crypto library.
* @note After shutdown, it is expected that the init function can be called again.
* @param driver - driver to use
* @return Returns APR_ENOTIMPL if not supported.
*/
APU_DECLARE(apr_status_t) apr_crypto_shutdown(
const apr_crypto_driver_t *driver);
#endif /* APU_HAVE_CRYPTO */
/** @} */
#ifdef __cplusplus
}
#endif
#endif

106
include/apr_date.h Normal file
View File

@ -0,0 +1,106 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef APR_DATE_H
#define APR_DATE_H
/**
* @file apr_date.h
* @brief APR-UTIL date routines
*/
/**
* @defgroup APR_Util_Date Date routines
* @ingroup APR_Util
* @{
*/
/*
* apr_date.h: prototypes for date parsing utility routines
*/
#include "apu.h"
#include "apr_time.h"
#ifdef __cplusplus
extern "C" {
#endif
/** A bad date. */
#define APR_DATE_BAD ((apr_time_t)0)
/**
* Compare a string to a mask
* @param data The string to compare
* @param mask Mask characters (arbitrary maximum is 256 characters):
* <PRE>
* '\@' - uppercase letter
* '\$' - lowercase letter
* '\&' - hex digit
* '#' - digit
* '~' - digit or space
* '*' - swallow remaining characters
* </PRE>
* @remark The mask tests for an exact match for any other character
* @return 1 if the string matches, 0 otherwise
*/
APU_DECLARE(int) apr_date_checkmask(const char *data, const char *mask);
/**
* Parses an HTTP date in one of three standard forms:
* <PRE>
* Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123
* Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
* Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format
* </PRE>
* @param date The date in one of the three formats above
* @return the apr_time_t number of microseconds since 1 Jan 1970 GMT, or
* 0 if this would be out of range or if the date is invalid.
*/
APU_DECLARE(apr_time_t) apr_date_parse_http(const char *date);
/**
* Parses a string resembling an RFC 822 date. This is meant to be
* leinent in its parsing of dates. Hence, this will parse a wider
* range of dates than apr_date_parse_http.
*
* The prominent mailer (or poster, if mailer is unknown) that has
* been seen in the wild is included for the unknown formats.
* <PRE>
* Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123
* Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
* Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format
* Sun, 6 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123
* Sun, 06 Nov 94 08:49:37 GMT ; RFC 822
* Sun, 6 Nov 94 08:49:37 GMT ; RFC 822
* Sun, 06 Nov 94 08:49 GMT ; Unknown [drtr\@ast.cam.ac.uk]
* Sun, 6 Nov 94 08:49 GMT ; Unknown [drtr\@ast.cam.ac.uk]
* Sun, 06 Nov 94 8:49:37 GMT ; Unknown [Elm 70.85]
* Sun, 6 Nov 94 8:49:37 GMT ; Unknown [Elm 70.85]
* </PRE>
*
* @param date The date in one of the formats above
* @return the apr_time_t number of microseconds since 1 Jan 1970 GMT, or
* 0 if this would be out of range or if the date is invalid.
*/
APU_DECLARE(apr_time_t) apr_date_parse_rfc(const char *date);
/** @} */
#ifdef __cplusplus
}
#endif
#endif /* !APR_DATE_H */

552
include/apr_dbd.h Normal file
View File

@ -0,0 +1,552 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* Overview of what this is and does:
* http://www.apache.org/~niq/dbd.html
*/
#ifndef APR_DBD_H
#define APR_DBD_H
#include "apu.h"
#include "apr_pools.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @file apr_dbd.h
* @brief APR-UTIL DBD library
*/
/**
* @defgroup APR_Util_DBD DBD routines
* @ingroup APR_Util
* @{
*/
/**
* Mapping of C to SQL types, used for prepared statements.
* @remarks
* For apr_dbd_p[v]query/select functions, in and out parameters are always
* const char * (i.e. regular nul terminated strings). LOB types are passed
* with four (4) arguments: payload, length, table and column, all as const
* char *, where table and column are reserved for future use by Oracle.
* @remarks
* For apr_dbd_p[v]bquery/select functions, in and out parameters are
* described next to each enumeration constant and are generally native binary
* types or some APR data type. LOB types are passed with four (4) arguments:
* payload (char*), length (apr_size_t*), table (char*) and column (char*).
* Table and column are reserved for future use by Oracle.
*/
typedef enum {
APR_DBD_TYPE_NONE,
APR_DBD_TYPE_TINY, /**< \%hhd : in, out: char* */
APR_DBD_TYPE_UTINY, /**< \%hhu : in, out: unsigned char* */
APR_DBD_TYPE_SHORT, /**< \%hd : in, out: short* */
APR_DBD_TYPE_USHORT, /**< \%hu : in, out: unsigned short* */
APR_DBD_TYPE_INT, /**< \%d : in, out: int* */
APR_DBD_TYPE_UINT, /**< \%u : in, out: unsigned int* */
APR_DBD_TYPE_LONG, /**< \%ld : in, out: long* */
APR_DBD_TYPE_ULONG, /**< \%lu : in, out: unsigned long* */
APR_DBD_TYPE_LONGLONG, /**< \%lld : in, out: apr_int64_t* */
APR_DBD_TYPE_ULONGLONG, /**< \%llu : in, out: apr_uint64_t* */
APR_DBD_TYPE_FLOAT, /**< \%f : in, out: float* */
APR_DBD_TYPE_DOUBLE, /**< \%lf : in, out: double* */
APR_DBD_TYPE_STRING, /**< \%s : in: char*, out: char** */
APR_DBD_TYPE_TEXT, /**< \%pDt : in: char*, out: char** */
APR_DBD_TYPE_TIME, /**< \%pDi : in: char*, out: char** */
APR_DBD_TYPE_DATE, /**< \%pDd : in: char*, out: char** */
APR_DBD_TYPE_DATETIME, /**< \%pDa : in: char*, out: char** */
APR_DBD_TYPE_TIMESTAMP, /**< \%pDs : in: char*, out: char** */
APR_DBD_TYPE_ZTIMESTAMP, /**< \%pDz : in: char*, out: char** */
APR_DBD_TYPE_BLOB, /**< \%pDb : in: char* apr_size_t* char* char*, out: apr_bucket_brigade* */
APR_DBD_TYPE_CLOB, /**< \%pDc : in: char* apr_size_t* char* char*, out: apr_bucket_brigade* */
APR_DBD_TYPE_NULL /**< \%pDn : in: void*, out: void** */
} apr_dbd_type_e;
/* These are opaque structs. Instantiation is up to each backend */
typedef struct apr_dbd_driver_t apr_dbd_driver_t;
typedef struct apr_dbd_t apr_dbd_t;
typedef struct apr_dbd_transaction_t apr_dbd_transaction_t;
typedef struct apr_dbd_results_t apr_dbd_results_t;
typedef struct apr_dbd_row_t apr_dbd_row_t;
typedef struct apr_dbd_prepared_t apr_dbd_prepared_t;
/** apr_dbd_init: perform once-only initialisation. Call once only.
*
* @param pool - pool to register any shutdown cleanups, etc
*/
APU_DECLARE(apr_status_t) apr_dbd_init(apr_pool_t *pool);
/** apr_dbd_get_driver: get the driver struct for a name
*
* @param pool - (process) pool to register cleanup
* @param name - driver name
* @param driver - pointer to driver struct.
* @return APR_SUCCESS for success
* @return APR_ENOTIMPL for no driver (when DSO not enabled)
* @return APR_EDSOOPEN if DSO driver file can't be opened
* @return APR_ESYMNOTFOUND if the driver file doesn't contain a driver
*/
APU_DECLARE(apr_status_t) apr_dbd_get_driver(apr_pool_t *pool, const char *name,
const apr_dbd_driver_t **driver);
/** apr_dbd_open_ex: open a connection to a backend
*
* @param pool - working pool
* @param params - arguments to driver (implementation-dependent)
* @param handle - pointer to handle to return
* @param driver - driver struct.
* @param error - descriptive error.
* @return APR_SUCCESS for success
* @return APR_EGENERAL if driver exists but connection failed
* @remarks PostgreSQL: the params is passed directly to the PQconnectdb()
* function (check PostgreSQL documentation for more details on the syntax).
* @remarks SQLite2: the params is split on a colon, with the first part used
* as the filename and second part converted to an integer and used as file
* mode.
* @remarks SQLite3: the params is passed directly to the sqlite3_open()
* function as a filename to be opened (check SQLite3 documentation for more
* details).
* @remarks Oracle: the params can have "user", "pass", "dbname" and "server"
* keys, each followed by an equal sign and a value. Such key/value pairs can
* be delimited by space, CR, LF, tab, semicolon, vertical bar or comma.
* @remarks MySQL: the params can have "host", "port", "user", "pass",
* "dbname", "sock", "flags" "fldsz", "group" and "reconnect" keys, each
* followed by an equal sign and a value. Such key/value pairs can be
* delimited by space, CR, LF, tab, semicolon, vertical bar or comma. For
* now, "flags" can only recognise CLIENT_FOUND_ROWS (check MySQL manual for
* details). The value associated with "fldsz" determines maximum amount of
* memory (in bytes) for each of the fields in the result set of prepared
* statements. By default, this value is 1 MB. The value associated with
* "group" determines which group from configuration file to use (see
* MYSQL_READ_DEFAULT_GROUP option of mysql_options() in MySQL manual).
* Reconnect is set to 1 by default (i.e. true).
* @remarks FreeTDS: the params can have "username", "password", "appname",
* "dbname", "host", "charset", "lang" and "server" keys, each followed by an
* equal sign and a value.
*/
APU_DECLARE(apr_status_t) apr_dbd_open_ex(const apr_dbd_driver_t *driver,
apr_pool_t *pool, const char *params,
apr_dbd_t **handle,
const char **error);
/** apr_dbd_open: open a connection to a backend
*
* @param 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
* @see apr_dbd_open_ex
*/
APU_DECLARE(apr_status_t) apr_dbd_open(const apr_dbd_driver_t *driver,
apr_pool_t *pool, const char *params,
apr_dbd_t **handle);
/** apr_dbd_close: close a connection to a backend
*
* @param 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 Note that transaction modes, set by calling
* apr_dbd_transaction_mode_set(), will affect all query/select calls within
* a transaction. By default, any error in query/select during a transaction
* will cause the transaction to inherit the error code and any further
* query/select calls will fail immediately. Put transaction in "ignore
* errors" mode to avoid that. Use "rollback" mode to do explicit rollback.
*/
APU_DECLARE(int) apr_dbd_transaction_start(const apr_dbd_driver_t *driver,
apr_pool_t *pool,
apr_dbd_t *handle,
apr_dbd_transaction_t **trans);
/** apr_dbd_transaction_end: end a transaction
* (commit on success, rollback on error).
* May be a no-op.
*
* @param driver - the driver
* @param handle - the db connection
* @param trans - the transaction.
* @return 0 for success or error code
*/
APU_DECLARE(int) apr_dbd_transaction_end(const apr_dbd_driver_t *driver,
apr_pool_t *pool,
apr_dbd_transaction_t *trans);
#define APR_DBD_TRANSACTION_COMMIT 0x00 /**< commit the transaction */
#define APR_DBD_TRANSACTION_ROLLBACK 0x01 /**< rollback the transaction */
#define APR_DBD_TRANSACTION_IGNORE_ERRORS 0x02 /**< ignore transaction errors */
/** apr_dbd_transaction_mode_get: get the mode of transaction
*
* @param driver - the driver
* @param trans - the transaction
* @return mode of transaction
*/
APU_DECLARE(int) apr_dbd_transaction_mode_get(const apr_dbd_driver_t *driver,
apr_dbd_transaction_t *trans);
/** apr_dbd_transaction_mode_set: set the mode of transaction
*
* @param driver - the driver
* @param trans - the transaction
* @param mode - new mode of the transaction
* @return the mode of transaction in force after the call
*/
APU_DECLARE(int) apr_dbd_transaction_mode_set(const apr_dbd_driver_t *driver,
apr_dbd_transaction_t *trans,
int mode);
/** apr_dbd_query: execute an SQL query that doesn't return a result set
*
* @param driver - the driver
* @param handle - the connection
* @param nrows - number of rows affected.
* @param statement - the SQL statement to execute
* @return 0 for success or error code
*/
APU_DECLARE(int) apr_dbd_query(const apr_dbd_driver_t *driver, apr_dbd_t *handle,
int *nrows, const char *statement);
/** apr_dbd_select: execute an SQL query that returns a result set
*
* @param driver - the driver
* @param pool - pool to allocate the result set
* @param handle - the connection
* @param res - pointer to result set pointer. May point to NULL on entry
* @param statement - the SQL statement to execute
* @param random - 1 to support random access to results (seek any row);
* 0 to support only looping through results in order
* (async access - faster)
* @return 0 for success or error code
*/
APU_DECLARE(int) apr_dbd_select(const apr_dbd_driver_t *driver, apr_pool_t *pool,
apr_dbd_t *handle, apr_dbd_results_t **res,
const char *statement, int random);
/** apr_dbd_num_cols: get the number of columns in a results set
*
* @param driver - the driver
* @param res - result set.
* @return number of columns
*/
APU_DECLARE(int) apr_dbd_num_cols(const apr_dbd_driver_t *driver,
apr_dbd_results_t *res);
/** apr_dbd_num_tuples: get the number of rows in a results set
* of a synchronous select
*
* @param driver - the driver
* @param res - result set.
* @return number of rows, or -1 if the results are asynchronous
*/
APU_DECLARE(int) apr_dbd_num_tuples(const apr_dbd_driver_t *driver,
apr_dbd_results_t *res);
/** apr_dbd_get_row: get a row from a result set
*
* @param driver - the driver
* @param pool - pool to allocate the row
* @param res - result set pointer
* @param row - pointer to row pointer. May point to NULL on entry
* @param rownum - row number (counting from 1), or -1 for "next row".
* Ignored if random access is not supported.
* @return 0 for success, -1 for rownum out of range or data finished
*/
APU_DECLARE(int) apr_dbd_get_row(const apr_dbd_driver_t *driver, apr_pool_t *pool,
apr_dbd_results_t *res, apr_dbd_row_t **row,
int rownum);
/** apr_dbd_get_entry: get an entry from a row
*
* @param driver - the driver
* @param row - row pointer
* @param col - entry number
* @return value from the row, or NULL if col is out of bounds.
*/
APU_DECLARE(const char*) apr_dbd_get_entry(const apr_dbd_driver_t *driver,
apr_dbd_row_t *row, int col);
/** apr_dbd_get_name: get an entry name from a result set
*
* @param driver - the driver
* @param res - result set pointer
* @param col - entry number
* @return name of the entry, or NULL if col is out of bounds.
*/
APU_DECLARE(const char*) apr_dbd_get_name(const apr_dbd_driver_t *driver,
apr_dbd_results_t *res, int col);
/** apr_dbd_error: get current error message (if any)
*
* @param driver - the driver
* @param handle - the connection
* @param errnum - error code from operation that returned an error
* @return the database current error message, or message for errnum
* (implementation-dependent whether errnum is ignored)
*/
APU_DECLARE(const char*) apr_dbd_error(const apr_dbd_driver_t *driver,
apr_dbd_t *handle, int errnum);
/** apr_dbd_escape: escape a string so it is safe for use in query/select
*
* @param driver - the driver
* @param pool - pool to alloc the result from
* @param string - the string to escape
* @param handle - the connection
* @return the escaped, safe string
*/
APU_DECLARE(const char*) apr_dbd_escape(const apr_dbd_driver_t *driver,
apr_pool_t *pool, const char *string,
apr_dbd_t *handle);
/** apr_dbd_prepare: prepare a statement
*
* @param driver - the driver
* @param pool - pool to alloc the result from
* @param handle - the connection
* @param query - the SQL query
* @param label - A label for the prepared statement.
* use NULL for temporary prepared statements
* (eg within a Request in httpd)
* @param statement - statement to prepare. May point to null on entry.
* @return 0 for success or error code
* @remarks To specify parameters of the prepared query, use \%s, \%d etc.
* (see below for full list) in place of database specific parameter syntax
* (e.g. for PostgreSQL, this would be $1, $2, for SQLite3 this would be ?
* etc.). For instance: "SELECT name FROM customers WHERE name=%s" would be
* a query that this function understands.
* @remarks Here is the full list of format specifiers that this function
* understands and what they map to in SQL: \%hhd (TINY INT), \%hhu (UNSIGNED
* TINY INT), \%hd (SHORT), \%hu (UNSIGNED SHORT), \%d (INT), \%u (UNSIGNED
* INT), \%ld (LONG), \%lu (UNSIGNED LONG), \%lld (LONG LONG), \%llu
* (UNSIGNED LONG LONG), \%f (FLOAT, REAL), \%lf (DOUBLE PRECISION), \%s
* (VARCHAR), \%pDt (TEXT), \%pDi (TIME), \%pDd (DATE), \%pDa (DATETIME),
* \%pDs (TIMESTAMP), \%pDz (TIMESTAMP WITH TIME ZONE), \%pDb (BLOB), \%pDc
* (CLOB) and \%pDn (NULL). Not all databases have support for all these
* types, so the underlying driver will attempt the "best match" where
* possible. A \% followed by any letter not in the above list will be
* interpreted as VARCHAR (i.e. \%s).
*/
APU_DECLARE(int) apr_dbd_prepare(const apr_dbd_driver_t *driver, apr_pool_t *pool,
apr_dbd_t *handle, const char *query,
const char *label,
apr_dbd_prepared_t **statement);
/** apr_dbd_pquery: query using a prepared statement + args
*
* @param driver - the driver
* @param pool - working pool
* @param handle - the connection
* @param nrows - number of rows affected.
* @param statement - the prepared statement to execute
* @param nargs - ignored (for backward compatibility only)
* @param args - args to prepared statement
* @return 0 for success or error code
*/
APU_DECLARE(int) apr_dbd_pquery(const apr_dbd_driver_t *driver, apr_pool_t *pool,
apr_dbd_t *handle, int *nrows,
apr_dbd_prepared_t *statement, int nargs,
const char **args);
/** apr_dbd_pselect: select using a prepared statement + args
*
* @param driver - the driver
* @param pool - working pool
* @param handle - the connection
* @param res - pointer to query results. May point to NULL on entry
* @param statement - the prepared statement to execute
* @param random - Whether to support random-access to results
* @param nargs - ignored (for backward compatibility only)
* @param args - args to prepared statement
* @return 0 for success or error code
*/
APU_DECLARE(int) apr_dbd_pselect(const apr_dbd_driver_t *driver, apr_pool_t *pool,
apr_dbd_t *handle, apr_dbd_results_t **res,
apr_dbd_prepared_t *statement, int random,
int nargs, const char **args);
/** apr_dbd_pvquery: query using a prepared statement + args
*
* @param driver - the driver
* @param pool - working pool
* @param handle - the connection
* @param nrows - number of rows affected.
* @param statement - the prepared statement to execute
* @param ... - varargs list
* @return 0 for success or error code
*/
APU_DECLARE_NONSTD(int) apr_dbd_pvquery(const apr_dbd_driver_t *driver,
apr_pool_t *pool,
apr_dbd_t *handle, int *nrows,
apr_dbd_prepared_t *statement, ...);
/** apr_dbd_pvselect: select using a prepared statement + args
*
* @param driver - the driver
* @param pool - working pool
* @param handle - the connection
* @param res - pointer to query results. May point to NULL on entry
* @param statement - the prepared statement to execute
* @param random - Whether to support random-access to results
* @param ... - varargs list
* @return 0 for success or error code
*/
APU_DECLARE_NONSTD(int) apr_dbd_pvselect(const apr_dbd_driver_t *driver,
apr_pool_t *pool, apr_dbd_t *handle,
apr_dbd_results_t **res,
apr_dbd_prepared_t *statement,
int random, ...);
/** apr_dbd_pbquery: query using a prepared statement + binary args
*
* @param driver - the driver
* @param pool - working pool
* @param handle - the connection
* @param nrows - number of rows affected.
* @param statement - the prepared statement to execute
* @param args - binary args to prepared statement
* @return 0 for success or error code
*/
APU_DECLARE(int) apr_dbd_pbquery(const apr_dbd_driver_t *driver,
apr_pool_t *pool, apr_dbd_t *handle,
int *nrows, apr_dbd_prepared_t *statement,
const void **args);
/** apr_dbd_pbselect: select using a prepared statement + binary args
*
* @param driver - the driver
* @param pool - working pool
* @param handle - the connection
* @param res - pointer to query results. May point to NULL on entry
* @param statement - the prepared statement to execute
* @param random - Whether to support random-access to results
* @param args - binary args to prepared statement
* @return 0 for success or error code
*/
APU_DECLARE(int) apr_dbd_pbselect(const apr_dbd_driver_t *driver,
apr_pool_t *pool,
apr_dbd_t *handle, apr_dbd_results_t **res,
apr_dbd_prepared_t *statement, int random,
const void **args);
/** apr_dbd_pvbquery: query using a prepared statement + binary args
*
* @param driver - the driver
* @param pool - working pool
* @param handle - the connection
* @param nrows - number of rows affected.
* @param statement - the prepared statement to execute
* @param ... - varargs list of binary args
* @return 0 for success or error code
*/
APU_DECLARE_NONSTD(int) apr_dbd_pvbquery(const apr_dbd_driver_t *driver,
apr_pool_t *pool,
apr_dbd_t *handle, int *nrows,
apr_dbd_prepared_t *statement, ...);
/** apr_dbd_pvbselect: select using a prepared statement + binary args
*
* @param driver - the driver
* @param pool - working pool
* @param handle - the connection
* @param res - pointer to query results. May point to NULL on entry
* @param statement - the prepared statement to execute
* @param random - Whether to support random-access to results
* @param ... - varargs list of binary args
* @return 0 for success or error code
*/
APU_DECLARE_NONSTD(int) apr_dbd_pvbselect(const apr_dbd_driver_t *driver,
apr_pool_t *pool, apr_dbd_t *handle,
apr_dbd_results_t **res,
apr_dbd_prepared_t *statement,
int random, ...);
/** apr_dbd_datum_get: get a binary entry from a row
*
* @param driver - the driver
* @param row - row pointer
* @param col - entry number
* @param type - type of data to get
* @param data - pointer to data, allocated by the caller
* @return APR_SUCCESS on success, APR_ENOENT if data is NULL or APR_EGENERAL
*/
APU_DECLARE(apr_status_t) apr_dbd_datum_get(const apr_dbd_driver_t *driver,
apr_dbd_row_t *row, int col,
apr_dbd_type_e type, void *data);
/** @} */
#ifdef __cplusplus
}
#endif
#endif

227
include/apr_dbm.h Normal file
View File

@ -0,0 +1,227 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef APR_DBM_H
#define APR_DBM_H
#include "apu.h"
#include "apr.h"
#include "apr_errno.h"
#include "apr_pools.h"
#include "apr_file_info.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @file apr_dbm.h
* @brief APR-UTIL DBM library
*/
/**
* @defgroup APR_Util_DBM DBM routines
* @ingroup APR_Util
* @{
*/
/**
* Structure for referencing a dbm
*/
typedef struct apr_dbm_t apr_dbm_t;
/**
* Structure for referencing the datum record within a dbm
*/
typedef struct
{
/** pointer to the 'data' to retrieve/store in the DBM */
char *dptr;
/** size of the 'data' to retrieve/store in the DBM */
apr_size_t dsize;
} apr_datum_t;
/* modes to open the DB */
#define APR_DBM_READONLY 1 /**< open for read-only access */
#define APR_DBM_READWRITE 2 /**< open for read-write access */
#define APR_DBM_RWCREATE 3 /**< open for r/w, create if needed */
#define APR_DBM_RWTRUNC 4 /**< open for r/w, truncating an existing
DB if present */
/**
* Open a dbm file by file name and type of DBM
* @param dbm The newly opened database
* @param type The type of the DBM (not all may be available at run time)
* <pre>
* db for Berkeley DB files
* gdbm for GDBM files
* ndbm for NDBM files
* sdbm for SDBM files (always available)
* default for the default DBM type
* </pre>
* @param name The dbm file name to open
* @param mode The flag value
* <PRE>
* APR_DBM_READONLY open for read-only access
* APR_DBM_READWRITE open for read-write access
* APR_DBM_RWCREATE open for r/w, create if needed
* APR_DBM_RWTRUNC open for r/w, truncate if already there
* </PRE>
* @param perm Permissions to apply to if created
* @param cntxt The pool to use when creating the dbm
* @remark The dbm name may not be a true file name, as many dbm packages
* append suffixes for seperate data and index files.
* @bug In apr-util 0.9 and 1.x, the type arg was case insensitive. This
* was highly inefficient, and as of 2.x the dbm name must be provided in
* the correct case (lower case for all bundled providers)
*/
APU_DECLARE(apr_status_t) apr_dbm_open_ex(apr_dbm_t **dbm, const char* type,
const char *name,
apr_int32_t mode, apr_fileperms_t perm,
apr_pool_t *cntxt);
/**
* Open a dbm file by file name
* @param dbm The newly opened database
* @param name The dbm file name to open
* @param mode The flag value
* <PRE>
* APR_DBM_READONLY open for read-only access
* APR_DBM_READWRITE open for read-write access
* APR_DBM_RWCREATE open for r/w, create if needed
* APR_DBM_RWTRUNC open for r/w, truncate if already there
* </PRE>
* @param perm Permissions to apply to if created
* @param cntxt The pool to use when creating the dbm
* @remark The dbm name may not be a true file name, as many dbm packages
* append suffixes for seperate data and index files.
*/
APU_DECLARE(apr_status_t) apr_dbm_open(apr_dbm_t **dbm, const char *name,
apr_int32_t mode, apr_fileperms_t perm,
apr_pool_t *cntxt);
/**
* Close a dbm file previously opened by apr_dbm_open
* @param dbm The database to close
*/
APU_DECLARE(void) apr_dbm_close(apr_dbm_t *dbm);
/**
* Fetch a dbm record value by key
* @param dbm The database
* @param key The key datum to find this record
* @param pvalue The value datum retrieved for this record
*/
APU_DECLARE(apr_status_t) apr_dbm_fetch(apr_dbm_t *dbm, apr_datum_t key,
apr_datum_t *pvalue);
/**
* Store a dbm record value by key
* @param dbm The database
* @param key The key datum to store this record by
* @param value The value datum to store in this record
*/
APU_DECLARE(apr_status_t) apr_dbm_store(apr_dbm_t *dbm, apr_datum_t key,
apr_datum_t value);
/**
* Delete a dbm record value by key
* @param dbm The database
* @param key The key datum of the record to delete
* @remark It is not an error to delete a non-existent record.
*/
APU_DECLARE(apr_status_t) apr_dbm_delete(apr_dbm_t *dbm, apr_datum_t key);
/**
* Search for a key within the dbm
* @param dbm The database
* @param key The datum describing a key to test
*/
APU_DECLARE(int) apr_dbm_exists(apr_dbm_t *dbm, apr_datum_t key);
/**
* Retrieve the first record key from a dbm
* @param dbm The database
* @param pkey The key datum of the first record
*/
APU_DECLARE(apr_status_t) apr_dbm_firstkey(apr_dbm_t *dbm, apr_datum_t *pkey);
/**
* Retrieve the next record key from a dbm
* @param dbm The database
* @param pkey The key datum of the next record
*/
APU_DECLARE(apr_status_t) apr_dbm_nextkey(apr_dbm_t *dbm, apr_datum_t *pkey);
/**
* Proactively toss any memory associated with the apr_datum_t.
* @param dbm The database
* @param data The datum to free.
*/
APU_DECLARE(void) apr_dbm_freedatum(apr_dbm_t *dbm, apr_datum_t data);
/**
* Report more information when an apr_dbm function fails.
* @param dbm The database
* @param errcode A DBM-specific value for the error (for logging). If this
* isn't needed, it may be NULL.
* @param errbuf Location to store the error text
* @param errbufsize The size of the provided buffer
* @return The errbuf parameter, for convenience.
*/
APU_DECLARE(char *) apr_dbm_geterror(apr_dbm_t *dbm, int *errcode,
char *errbuf, apr_size_t errbufsize);
/**
* If the specified file/path were passed to apr_dbm_open(), return the
* actual file/path names which would be (created and) used. At most, two
* files may be used; used2 may be NULL if only one file is used.
* @param pool The pool for allocating used1 and used2.
* @param type The type of DBM you require info on @see apr_dbm_open_ex
* @param pathname The path name to generate used-names from.
* @param used1 The first pathname used by the apr_dbm implementation.
* @param used2 The second pathname used by apr_dbm. If only one file is
* used by the specific implementation, this will be set to NULL.
* @return An error if the specified type is invalid.
* @remark The dbm file(s) don't need to exist. This function only manipulates
* the pathnames.
*/
APU_DECLARE(apr_status_t) apr_dbm_get_usednames_ex(apr_pool_t *pool,
const char *type,
const char *pathname,
const char **used1,
const char **used2);
/**
* If the specified file/path were passed to apr_dbm_open(), return the
* actual file/path names which would be (created and) used. At most, two
* files may be used; used2 may be NULL if only one file is used.
* @param pool The pool for allocating used1 and used2.
* @param pathname The path name to generate used-names from.
* @param used1 The first pathname used by the apr_dbm implementation.
* @param used2 The second pathname used by apr_dbm. If only one file is
* used by the specific implementation, this will be set to NULL.
* @remark The dbm file(s) don't need to exist. This function only manipulates
* the pathnames.
*/
APU_DECLARE(void) apr_dbm_get_usednames(apr_pool_t *pool,
const char *pathname,
const char **used1,
const char **used2);
/** @} */
#ifdef __cplusplus
}
#endif
#endif /* !APR_DBM_H */

358
include/apr_hooks.h Normal file
View File

@ -0,0 +1,358 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef APR_HOOKS_H
#define APR_HOOKS_H
#include "apu.h"
/* For apr_array_header_t */
#include "apr_tables.h"
/**
* @file apr_hooks.h
* @brief Apache hook functions
*/
#ifdef __cplusplus
extern "C" {
#endif
/**
* @defgroup APR_Util_Hook Hook Functions
* @ingroup APR_Util
* @{
*/
/**
* @defgroup apr_hook_probes Hook probe capability
* APR hooks provide a trace probe capability for capturing
* the flow of control and return values with hooks.
*
* In order to use this facility, the application must define
* the symbol APR_HOOK_PROBES_ENABLED and the four APR_HOOK_PROBE_
* macros described below before including apr_hooks.h in files
* that use the APR_IMPLEMENT_EXTERNAL_HOOK_* macros.
*
* This probe facility is not provided for APR optional hooks.
* @{
*/
#ifdef APR_HOOK_PROBES_ENABLED
#define APR_HOOK_INT_DCL_UD void *ud = NULL
#else
/** internal implementation detail to avoid the ud declaration when
* hook probes are not used
*/
#define APR_HOOK_INT_DCL_UD
/**
* User-defined hook probe macro that is invoked when the hook
* is run, before calling any hook functions.
* @param ud A void * user data field that should be filled in by
* this macro, and will be provided to the other hook probe macros.
* @param ns The namespace prefix of the hook functions
* @param name The name of the hook
* @param args The argument list to the hook functions, with enclosing
* parens.
*/
#define APR_HOOK_PROBE_ENTRY(ud,ns,name,args)
/**
* User-defined hook probe macro that is invoked after the hook
* has run.
* @param ud A void * user data field that was filled in by the user-
* provided APR_HOOK_PROBE_ENTRY().
* @param ns The namespace prefix of the hook functions
* @param name The name of the hook
* @param rv The return value of the hook, or 0 if the hook is void.
* @param args The argument list to the hook functions, with enclosing
* parens.
*/
#define APR_HOOK_PROBE_RETURN(ud,ns,name,rv,args)
/**
* User-defined hook probe macro that is invoked before calling a
* hook function.
* @param ud A void * user data field that was filled in by the user-
* provided APR_HOOK_PROBE_ENTRY().
* @param ns The namespace prefix of the hook functions
* @param name The name of the hook
* @param src The value of apr_hook_debug_current at the time the function
* was hooked (usually the source file implementing the hook function).
* @param args The argument list to the hook functions, with enclosing
* parens.
*/
#define APR_HOOK_PROBE_INVOKE(ud,ns,name,src,args)
/**
* User-defined hook probe macro that is invoked after calling a
* hook function.
* @param ud A void * user data field that was filled in by the user-
* provided APR_HOOK_PROBE_ENTRY().
* @param ns The namespace prefix of the hook functions
* @param name The name of the hook
* @param src The value of apr_hook_debug_current at the time the function
* was hooked (usually the source file implementing the hook function).
* @param rv The return value of the hook function, or 0 if the hook is void.
* @param args The argument list to the hook functions, with enclosing
* parens.
*/
#define APR_HOOK_PROBE_COMPLETE(ud,ns,name,src,rv,args)
#endif
/** @} */
/** macro to return the prototype of the hook function */
#define APR_IMPLEMENT_HOOK_GET_PROTO(ns,link,name) \
link##_DECLARE(apr_array_header_t *) ns##_hook_get_##name(void)
/** macro to declare the hook correctly */
#define APR_DECLARE_EXTERNAL_HOOK(ns,link,ret,name,args) \
typedef ret ns##_HOOK_##name##_t args; \
link##_DECLARE(void) ns##_hook_##name(ns##_HOOK_##name##_t *pf, \
const char * const *aszPre, \
const char * const *aszSucc, int nOrder); \
link##_DECLARE(ret) ns##_run_##name args; \
APR_IMPLEMENT_HOOK_GET_PROTO(ns,link,name); \
typedef struct ns##_LINK_##name##_t \
{ \
ns##_HOOK_##name##_t *pFunc; \
const char *szName; \
const char * const *aszPredecessors; \
const char * const *aszSuccessors; \
int nOrder; \
} ns##_LINK_##name##_t;
/** macro to declare the hook structure */
#define APR_HOOK_STRUCT(members) \
static struct { members } _hooks;
/** macro to link the hook structure */
#define APR_HOOK_LINK(name) \
apr_array_header_t *link_##name;
/** macro to implement the hook */
#define APR_IMPLEMENT_EXTERNAL_HOOK_BASE(ns,link,name) \
link##_DECLARE(void) ns##_hook_##name(ns##_HOOK_##name##_t *pf,const char * const *aszPre, \
const char * const *aszSucc,int nOrder) \
{ \
ns##_LINK_##name##_t *pHook; \
if(!_hooks.link_##name) \
{ \
_hooks.link_##name=apr_array_make(apr_hook_global_pool,1,sizeof(ns##_LINK_##name##_t)); \
apr_hook_sort_register(#name,&_hooks.link_##name); \
} \
pHook=apr_array_push(_hooks.link_##name); \
pHook->pFunc=pf; \
pHook->aszPredecessors=aszPre; \
pHook->aszSuccessors=aszSucc; \
pHook->nOrder=nOrder; \
pHook->szName=apr_hook_debug_current; \
if(apr_hook_debug_enabled) \
apr_hook_debug_show(#name,aszPre,aszSucc); \
} \
APR_IMPLEMENT_HOOK_GET_PROTO(ns,link,name) \
{ \
return _hooks.link_##name; \
}
/**
* Implement a hook that has no return code, and therefore runs all of the
* registered functions
* @param ns The namespace prefix of the hook functions
* @param link The linkage declaration prefix of the hook
* @param name The name of the hook
* @param args_decl The declaration of the arguments for the hook
* @param args_use The names for the arguments for the hook
* @note The link prefix FOO corresponds to FOO_DECLARE() macros, which
* provide export linkage from the module that IMPLEMENTs the hook, and
* import linkage from external modules that link to the hook's module.
*/
#define APR_IMPLEMENT_EXTERNAL_HOOK_VOID(ns,link,name,args_decl,args_use) \
APR_IMPLEMENT_EXTERNAL_HOOK_BASE(ns,link,name) \
link##_DECLARE(void) ns##_run_##name args_decl \
{ \
ns##_LINK_##name##_t *pHook; \
int n; \
APR_HOOK_INT_DCL_UD; \
\
APR_HOOK_PROBE_ENTRY(ud, ns, name, args_use); \
\
if(_hooks.link_##name) \
{ \
pHook=(ns##_LINK_##name##_t *)_hooks.link_##name->elts; \
for(n=0 ; n < _hooks.link_##name->nelts ; ++n) \
{ \
APR_HOOK_PROBE_INVOKE(ud, ns, name, (char *)pHook[n].szName, args_use); \
pHook[n].pFunc args_use; \
APR_HOOK_PROBE_COMPLETE(ud, ns, name, (char *)pHook[n].szName, 0, args_use); \
} \
} \
\
APR_HOOK_PROBE_RETURN(ud, ns, name, 0, args_use); \
\
}
/* FIXME: note that this returns ok when nothing is run. I suspect it should
really return decline, but that breaks Apache currently - Ben
*/
/**
* Implement a hook that runs until one of the functions returns something
* other than OK or DECLINE
* @param ns The namespace prefix of the hook functions
* @param link The linkage declaration prefix of the hook
* @param ret Type to return
* @param name The name of the hook
* @param args_decl The declaration of the arguments for the hook
* @param args_use The names for the arguments for the hook
* @param ok Success value
* @param decline Decline value
* @note The link prefix FOO corresponds to FOO_DECLARE() macros, which
* provide export linkage from the module that IMPLEMENTs the hook, and
* import linkage from external modules that link to the hook's module.
*/
#define APR_IMPLEMENT_EXTERNAL_HOOK_RUN_ALL(ns,link,ret,name,args_decl,args_use,ok,decline) \
APR_IMPLEMENT_EXTERNAL_HOOK_BASE(ns,link,name) \
link##_DECLARE(ret) ns##_run_##name args_decl \
{ \
ns##_LINK_##name##_t *pHook; \
int n; \
ret rv = ok; \
APR_HOOK_INT_DCL_UD; \
\
APR_HOOK_PROBE_ENTRY(ud, ns, name, args_use); \
\
if(_hooks.link_##name) \
{ \
pHook=(ns##_LINK_##name##_t *)_hooks.link_##name->elts; \
for(n=0 ; n < _hooks.link_##name->nelts ; ++n) \
{ \
APR_HOOK_PROBE_INVOKE(ud, ns, name, (char *)pHook[n].szName, args_use); \
rv=pHook[n].pFunc args_use; \
APR_HOOK_PROBE_COMPLETE(ud, ns, name, (char *)pHook[n].szName, rv, args_use); \
if(rv != ok && rv != decline) \
break; \
rv = ok; \
} \
} \
\
APR_HOOK_PROBE_RETURN(ud, ns, name, rv, args_use); \
\
return rv; \
}
/**
* Implement a hook that runs until the first function returns something
* other than the value of decline
* @param ns The namespace prefix of the hook functions
* @param link The linkage declaration prefix of the hook
* @param name The name of the hook
* @param ret Type to return
* @param args_decl The declaration of the arguments for the hook
* @param args_use The names for the arguments for the hook
* @param decline Decline value
* @note The link prefix FOO corresponds to FOO_DECLARE() macros, which
* provide export linkage from the module that IMPLEMENTs the hook, and
* import linkage from external modules that link to the hook's module.
*/
#define APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(ns,link,ret,name,args_decl,args_use,decline) \
APR_IMPLEMENT_EXTERNAL_HOOK_BASE(ns,link,name) \
link##_DECLARE(ret) ns##_run_##name args_decl \
{ \
ns##_LINK_##name##_t *pHook; \
int n; \
ret rv = decline; \
APR_HOOK_INT_DCL_UD; \
\
APR_HOOK_PROBE_ENTRY(ud, ns, name, args_use); \
\
if(_hooks.link_##name) \
{ \
pHook=(ns##_LINK_##name##_t *)_hooks.link_##name->elts; \
for(n=0 ; n < _hooks.link_##name->nelts ; ++n) \
{ \
APR_HOOK_PROBE_INVOKE(ud, ns, name, (char *)pHook[n].szName, args_use); \
rv=pHook[n].pFunc args_use; \
APR_HOOK_PROBE_COMPLETE(ud, ns, name, (char *)pHook[n].szName, rv, args_use); \
\
if(rv != decline) \
break; \
} \
} \
\
APR_HOOK_PROBE_RETURN(ud, ns, name, rv, args_use); \
\
return rv; \
}
/* Hook orderings */
/** run this hook first, before ANYTHING */
#define APR_HOOK_REALLY_FIRST (-10)
/** run this hook first */
#define APR_HOOK_FIRST 0
/** run this hook somewhere */
#define APR_HOOK_MIDDLE 10
/** run this hook after every other hook which is defined*/
#define APR_HOOK_LAST 20
/** run this hook last, after EVERYTHING */
#define APR_HOOK_REALLY_LAST 30
/**
* The global pool used to allocate any memory needed by the hooks.
*/
APU_DECLARE_DATA extern apr_pool_t *apr_hook_global_pool;
/**
* A global variable to determine if debugging information about the
* hooks functions should be printed
*/
APU_DECLARE_DATA extern int apr_hook_debug_enabled;
/**
* The name of the module that is currently registering a function
*/
APU_DECLARE_DATA extern const char *apr_hook_debug_current;
/**
* Register a hook function to be sorted
* @param szHookName The name of the Hook the function is registered for
* @param aHooks The array which stores all of the functions for this hook
*/
APU_DECLARE(void) apr_hook_sort_register(const char *szHookName,
apr_array_header_t **aHooks);
/**
* Sort all of the 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 */

197
include/apr_ldap.h.in Normal file
View File

@ -0,0 +1,197 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* apr_ldap.h is generated from apr_ldap.h.in by configure -- do not edit apr_ldap.h
*/
/**
* @file apr_ldap.h
* @brief APR-UTIL LDAP
*/
#ifndef APU_LDAP_H
#define APU_LDAP_H
/**
* @defgroup APR_Util_LDAP LDAP
* @ingroup APR_Util
* @{
*/
/* this will be defined if LDAP support was compiled into apr-util */
#define APR_HAS_LDAP @apu_has_ldap@
/* identify the LDAP toolkit used */
#define APR_HAS_NETSCAPE_LDAPSDK @apu_has_ldap_netscape@
#define APR_HAS_SOLARIS_LDAPSDK @apu_has_ldap_solaris@
#define APR_HAS_NOVELL_LDAPSDK @apu_has_ldap_novell@
#define APR_HAS_MOZILLA_LDAPSDK @apu_has_ldap_mozilla@
#define APR_HAS_OPENLDAP_LDAPSDK @apu_has_ldap_openldap@
#define APR_HAS_MICROSOFT_LDAPSDK @apu_has_ldap_microsoft@
#define APR_HAS_TIVOLI_LDAPSDK @apu_has_ldap_tivoli@
#define APR_HAS_ZOS_LDAPSDK @apu_has_ldap_zos@
#define APR_HAS_OTHER_LDAPSDK @apu_has_ldap_other@
/*
* Handle the case when LDAP is enabled
*/
#if APR_HAS_LDAP
/*
* The following #defines are DEPRECATED and should not be used for
* anything. They remain to maintain binary compatibility.
* The original code defined the OPENLDAP SDK as present regardless
* of what really was there, which was way bogus. In addition, the
* apr_ldap_url_parse*() functions have been rewritten specifically for
* APR, so the APR_HAS_LDAP_URL_PARSE macro is forced to zero.
*/
#if APR_HAS_TIVOLI_LDAPSDK
#define APR_HAS_LDAP_SSL 0
#else
#define APR_HAS_LDAP_SSL 1
#endif
#define APR_HAS_LDAP_URL_PARSE 0
#if APR_HAS_OPENLDAP_LDAPSDK && !defined(LDAP_DEPRECATED)
/* Ensure that the "deprecated" interfaces are still exposed
* with OpenLDAP >= 2.3; these were exposed by default in earlier
* releases. */
#define LDAP_DEPRECATED 1
#endif
/*
* Include the standard LDAP header files.
*/
@lber_h@
@ldap_h@
@ldap_ssl_h@
/*
* Detected standard functions
*/
#define APR_HAS_LDAPSSL_CLIENT_INIT @apu_has_ldapssl_client_init@
#define APR_HAS_LDAPSSL_CLIENT_DEINIT @apu_has_ldapssl_client_deinit@
#define APR_HAS_LDAPSSL_ADD_TRUSTED_CERT @apu_has_ldapssl_add_trusted_cert@
#define APR_HAS_LDAP_START_TLS_S @apu_has_ldap_start_tls_s@
#define APR_HAS_LDAP_SSLINIT @apu_has_ldap_sslinit@
#define APR_HAS_LDAPSSL_INIT @apu_has_ldapssl_init@
#define APR_HAS_LDAPSSL_INSTALL_ROUTINES @apu_has_ldapssl_install_routines@
/*
* Make sure the secure LDAP port is defined
*/
#ifndef LDAPS_PORT
#define LDAPS_PORT 636 /* ldaps:/// default LDAP over TLS port */
#endif
/*
* For ldap function calls that input a size limit on the number of returned elements
* Some SDKs do not have the define for LDAP_DEFAULT_LIMIT (-1) or LDAP_NO_LIMIT (0)
* LDAP_DEFAULT_LIMIT is preferred as it allows inheritance from whatever the SDK
* or process is configured for.
*/
#ifdef LDAP_DEFAULT_LIMIT
#define APR_LDAP_SIZELIMIT LDAP_DEFAULT_LIMIT
#else
#ifdef LDAP_NO_LIMIT
#define APR_LDAP_SIZELIMIT LDAP_NO_LIMIT
#endif
#endif
#ifndef APR_LDAP_SIZELIMIT
#define APR_LDAP_SIZELIMIT 0 /* equivalent to LDAP_NO_LIMIT, and what goes on the wire */
#endif
/*
* z/OS is missing some defines
*/
#ifndef LDAP_VERSION_MAX
#define LDAP_VERSION_MAX LDAP_VERSION
#endif
#if APR_HAS_ZOS_LDAPSDK
#define LDAP_VENDOR_NAME "IBM z/OS"
#endif
/* Note: Macros defining const casting has been removed in APR v1.0,
* pending real support for LDAP v2.0 toolkits.
*
* In the mean time, please use an LDAP v3.0 toolkit.
*/
#if LDAP_VERSION_MAX <= 2
#error Support for LDAP v2.0 toolkits has been removed from apr-util. Please use an LDAP v3.0 toolkit.
#endif
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/**
* This structure allows the C LDAP API error codes to be returned
* along with plain text error messages that explain to us mere mortals
* what really happened.
*/
typedef struct apr_ldap_err_t {
const char *reason;
const char *msg;
int rc;
} apr_ldap_err_t;
#ifdef __cplusplus
}
#endif
/* The MS SDK returns LDAP_UNAVAILABLE when the backend has closed the connection
* between LDAP calls. Protect with APR_HAS_MICROSOFT_LDAPSDK in case someone
* manually chooses another SDK on Windows
*/
#if APR_HAS_MICROSOFT_LDAPSDK
#define APR_LDAP_IS_SERVER_DOWN(s) ((s) == LDAP_SERVER_DOWN \
|| (s) == LDAP_UNAVAILABLE)
#else
#define APR_LDAP_IS_SERVER_DOWN(s) ((s) == LDAP_SERVER_DOWN)
#endif
/* These symbols are not actually exported in a DSO build, but mapped into
* a private exported function array for apr_ldap_stub to bind dynamically.
* Rename them appropriately to protect the global namespace.
*/
#ifdef APU_DSO_LDAP_BUILD
#define apr_ldap_info apr__ldap_info
#define apr_ldap_init apr__ldap_init
#define apr_ldap_ssl_init apr__ldap_ssl_init
#define apr_ldap_ssl_deinit apr__ldap_ssl_deinit
#define apr_ldap_get_option apr__ldap_get_option
#define apr_ldap_set_option apr__ldap_set_option
#define apr_ldap_rebind_init apr__ldap_rebind_init
#define apr_ldap_rebind_add apr__ldap_rebind_add
#define apr_ldap_rebind_remove apr__ldap_rebind_remove
#define APU_DECLARE_LDAP(type) type
#else
#define APU_DECLARE_LDAP(type) APU_DECLARE(type)
#endif
#include "apr_ldap_url.h"
#include "apr_ldap_init.h"
#include "apr_ldap_option.h"
#include "apr_ldap_rebind.h"
#endif /* APR_HAS_LDAP */
/** @} */
#endif /* APU_LDAP_H */

158
include/apr_ldap.hnw Normal file
View File

@ -0,0 +1,158 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* apr_ldap.h is generated from apr_ldap.h.in by configure -- do not edit apr_ldap.h
*/
/**
* @file apr_ldap.h
* @brief APR-UTIL LDAP
*/
#ifndef APU_LDAP_H
#define APU_LDAP_H
/**
* @defgroup APR_Util_LDAP LDAP
* @ingroup APR_Util
* @{
*/
/* this will be defined if LDAP support was compiled into apr-util */
#define APR_HAS_LDAP 1
/* identify the LDAP toolkit used */
#define APR_HAS_NETSCAPE_LDAPSDK 0
#define APR_HAS_SOLARIS_LDAPSDK 0
#define APR_HAS_NOVELL_LDAPSDK 1
#define APR_HAS_MOZILLA_LDAPSDK 0
#define APR_HAS_OPENLDAP_LDAPSDK 0
#define APR_HAS_MICROSOFT_LDAPSDK 0
#define APR_HAS_OTHER_LDAPSDK 0
/*
* Handle the case when LDAP is enabled
*/
#if APR_HAS_LDAP
/*
* The following #defines are DEPRECATED and should not be used for
* anything. They remain to maintain binary compatibility.
* The original code defined the OPENLDAP SDK as present regardless
* of what really was there, which was way bogus. In addition, the
* apr_ldap_url_parse*() functions have been rewritten specifically for
* APR, so the APR_HAS_LDAP_URL_PARSE macro is forced to zero.
*/
#define APR_HAS_LDAP_SSL 1
#define APR_HAS_LDAP_URL_PARSE 0
/*
* Include the standard LDAP header files.
*/
#ifdef GENEXPORTS
#define LDAP_VERSION_MAX 3
#define LDAP_INSUFFICIENT_ACCESS
#else
#include <lber.h>
#include <ldap.h>
#if APR_HAS_LDAP_SSL
#include <ldap_ssl.h>
#endif
#endif
/*
* Detected standard functions
*/
#define APR_HAS_LDAPSSL_CLIENT_INIT 1
#define APR_HAS_LDAPSSL_CLIENT_DEINIT 1
#define APR_HAS_LDAPSSL_ADD_TRUSTED_CERT 1
#define APR_HAS_LDAP_START_TLS_S 0
#define APR_HAS_LDAP_SSLINIT 0
#define APR_HAS_LDAPSSL_INIT 1
#define APR_HAS_LDAPSSL_INSTALL_ROUTINES 0
/*
* Make sure the secure LDAP port is defined
*/
#ifndef LDAPS_PORT
#define LDAPS_PORT 636 /* ldaps:/// default LDAP over TLS port */
#endif
/* Note: Macros defining const casting has been removed in APR v1.0,
* pending real support for LDAP v2.0 toolkits.
*
* In the mean time, please use an LDAP v3.0 toolkit.
*/
#if LDAP_VERSION_MAX <= 2
#error Support for LDAP v2.0 toolkits has been removed from apr-util. Please use an LDAP v3.0 toolkit.
#endif
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/**
* This structure allows the C LDAP API error codes to be returned
* along with plain text error messages that explain to us mere mortals
* what really happened.
*/
typedef struct apr_ldap_err_t {
const char *reason;
const char *msg;
int rc;
} apr_ldap_err_t;
#ifdef __cplusplus
}
#endif
#define APR_LDAP_IS_SERVER_DOWN(s) ((s) == LDAP_SERVER_DOWN)
/* These symbols are not actually exported in a DSO build, but mapped into
* a private exported function array for apr_ldap_stub to bind dynamically.
* Rename them appropriately to protect the global namespace.
*/
#ifdef APU_DSO_LDAP_BUILD
#define apr_ldap_info apr__ldap_info
#define apr_ldap_init apr__ldap_init
#define apr_ldap_ssl_init apr__ldap_ssl_init
#define apr_ldap_ssl_deinit apr__ldap_ssl_deinit
#define apr_ldap_get_option apr__ldap_get_option
#define apr_ldap_set_option apr__ldap_set_option
#define apr_ldap_rebind_init apr__ldap_rebind_init
#define apr_ldap_rebind_add apr__ldap_rebind_add
#define apr_ldap_rebind_remove apr__ldap_rebind_remove
#define APU_DECLARE_LDAP(type) type
#else
#define APU_DECLARE_LDAP(type) APU_DECLARE(type)
#endif
#include "apr_ldap_url.h"
#include "apr_ldap_init.h"
#include "apr_ldap_option.h"
#include "apr_ldap_rebind.h"
/** @} */
#endif /* APR_HAS_LDAP */
#endif /* APU_LDAP_H */

197
include/apr_ldap.hw Normal file
View File

@ -0,0 +1,197 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* apr_ldap.h is generated from apr_ldap.h.in by configure -- do not edit apr_ldap.h
*/
/**
* @file apr_ldap.h
* @brief APR-UTIL LDAP
*/
#ifndef APU_LDAP_H
#define APU_LDAP_H
/**
* @defgroup APR_Util_LDAP LDAP
* @ingroup APR_Util
* @{
*/
/* this will be defined if LDAP support was compiled into apr-util */
#define APR_HAS_LDAP 1
/* identify the LDAP toolkit used */
#define APR_HAS_NETSCAPE_LDAPSDK 0
#define APR_HAS_SOLARIS_LDAPSDK 0
#define APR_HAS_NOVELL_LDAPSDK 0
#define APR_HAS_MOZILLA_LDAPSDK 0
#define APR_HAS_OPENLDAP_LDAPSDK 0
#define APR_HAS_MICROSOFT_LDAPSDK 1
#define APR_HAS_TIVOLI_LDAPSDK 0
#define APR_HAS_ZOS_LDAPSDK 0
#define APR_HAS_OTHER_LDAPSDK 0
/*
* Handle the case when LDAP is enabled
*/
#if APR_HAS_LDAP
/*
* The following #defines are DEPRECATED and should not be used for
* anything. They remain to maintain binary compatibility.
* The original code defined the OPENLDAP SDK as present regardless
* of what really was there, which was way bogus. In addition, the
* apr_ldap_url_parse*() functions have been rewritten specifically for
* APR, so the APR_HAS_LDAP_URL_PARSE macro is forced to zero.
*/
#if APR_HAS_TIVOLI_LDAPSDK
#define APR_HAS_LDAP_SSL 0
#else
#define APR_HAS_LDAP_SSL 1
#endif
#define APR_HAS_LDAP_URL_PARSE 0
#if APR_HAS_OPENLDAP_LDAPSDK && !defined(LDAP_DEPRECATED)
/* Ensure that the "deprecated" interfaces are still exposed
* with OpenLDAP >= 2.3; these were exposed by default in earlier
* releases. */
#define LDAP_DEPRECATED 1
#endif
/*
* Include the standard LDAP header files.
*/
#include <winldap.h>
/*
* Detected standard functions
*/
#define APR_HAS_LDAPSSL_CLIENT_INIT 0
#define APR_HAS_LDAPSSL_CLIENT_DEINIT 0
#define APR_HAS_LDAPSSL_ADD_TRUSTED_CERT 0
#define APR_HAS_LDAP_START_TLS_S 0
#define APR_HAS_LDAP_SSLINIT 1
#define APR_HAS_LDAPSSL_INIT 0
#define APR_HAS_LDAPSSL_INSTALL_ROUTINES 0
/*
* Make sure the secure LDAP port is defined
*/
#ifndef LDAPS_PORT
#define LDAPS_PORT 636 /* ldaps:/// default LDAP over TLS port */
#endif
/*
* For ldap function calls that input a size limit on the number of returned elements
* Some SDKs do not have the define for LDAP_DEFAULT_LIMIT (-1) or LDAP_NO_LIMIT (0)
* LDAP_DEFAULT_LIMIT is preferred as it allows inheritance from whatever the SDK
* or process is configured for.
*/
#ifdef LDAP_DEFAULT_LIMIT
#define APR_LDAP_SIZELIMIT LDAP_DEFAULT_LIMIT
#else
#ifdef LDAP_NO_LIMIT
#define APR_LDAP_SIZELIMIT LDAP_NO_LIMIT
#endif
#endif
#ifndef APR_LDAP_SIZELIMIT
#define APR_LDAP_SIZELIMIT 0 /* equivalent to LDAP_NO_LIMIT, and what goes on the wire */
#endif
/*
* z/OS is missing some defines
*/
#ifndef LDAP_VERSION_MAX
#define LDAP_VERSION_MAX LDAP_VERSION
#endif
#if APR_HAS_ZOS_LDAPSDK
#define LDAP_VENDOR_NAME "IBM z/OS"
#endif
/* Note: Macros defining const casting has been removed in APR v1.0,
* pending real support for LDAP v2.0 toolkits.
*
* In the mean time, please use an LDAP v3.0 toolkit.
*/
#if LDAP_VERSION_MAX <= 2
#error Support for LDAP v2.0 toolkits has been removed from apr-util. Please use an LDAP v3.0 toolkit.
#endif
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/**
* This structure allows the C LDAP API error codes to be returned
* along with plain text error messages that explain to us mere mortals
* what really happened.
*/
typedef struct apr_ldap_err_t {
const char *reason;
const char *msg;
int rc;
} apr_ldap_err_t;
#ifdef __cplusplus
}
#endif
/* The MS SDK returns LDAP_UNAVAILABLE when the backend has closed the connection
* between LDAP calls. Protect with APR_HAS_MICROSOFT_LDAPSDK in case someone
* manually chooses another SDK on Windows
*/
#if APR_HAS_MICROSOFT_LDAPSDK
#define APR_LDAP_IS_SERVER_DOWN(s) ((s) == LDAP_SERVER_DOWN \
|| (s) == LDAP_UNAVAILABLE)
#else
#define APR_LDAP_IS_SERVER_DOWN(s) ((s) == LDAP_SERVER_DOWN)
#endif
/* These symbols are not actually exported in a DSO build, but mapped into
* a private exported function array for apr_ldap_stub to bind dynamically.
* Rename them appropriately to protect the global namespace.
*/
#ifdef APU_DSO_LDAP_BUILD
#define apr_ldap_info apr__ldap_info
#define apr_ldap_init apr__ldap_init
#define apr_ldap_ssl_init apr__ldap_ssl_init
#define apr_ldap_ssl_deinit apr__ldap_ssl_deinit
#define apr_ldap_get_option apr__ldap_get_option
#define apr_ldap_set_option apr__ldap_set_option
#define apr_ldap_rebind_init apr__ldap_rebind_init
#define apr_ldap_rebind_add apr__ldap_rebind_add
#define apr_ldap_rebind_remove apr__ldap_rebind_remove
#define APU_DECLARE_LDAP(type) type
#else
#define APU_DECLARE_LDAP(type) APU_DECLARE(type)
#endif
#include "apr_ldap_url.h"
#include "apr_ldap_init.h"
#include "apr_ldap_option.h"
#include "apr_ldap_rebind.h"
/** @} */
#endif /* APR_HAS_LDAP */
#endif /* APU_LDAP_H */

165
include/apr_ldap_init.h Normal file
View File

@ -0,0 +1,165 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @file apr_ldap_init.h
* @brief APR-UTIL LDAP ldap_init() functions
*/
#ifndef APR_LDAP_INIT_H
#define APR_LDAP_INIT_H
/**
* @addtogroup APR_Util_LDAP
* @{
*/
#include "apr_ldap.h"
#if APR_HAS_LDAP
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/**
* Macro to detect security related return values.
*/
#if defined(LDAP_INSUFFICIENT_ACCESS)
#define APU_LDAP_INSUFFICIENT_ACCESS LDAP_INSUFFICIENT_ACCESS
#elif defined(LDAP_INSUFFICIENT_RIGHTS)
#define APU_LDAP_INSUFFICIENT_ACCESS LDAP_INSUFFICIENT_RIGHTS
#elif defined(APR_HAS_MICROSOFT_LDAPSDK)
/* The macros above fail to contemplate that LDAP_RETCODE values
* may be represented by an enum. autoconf tests would be much
* more robust.
*/
#define APU_LDAP_INSUFFICIENT_ACCESS LDAP_INSUFFICIENT_RIGHTS
#else
#error The security return codes must be added to support this LDAP toolkit.
#endif
#if defined(LDAP_SECURITY_ERROR)
#define APU_LDAP_SECURITY_ERROR LDAP_SECURITY_ERROR
#else
#define APU_LDAP_SECURITY_ERROR(n) \
(LDAP_INAPPROPRIATE_AUTH == n) ? 1 \
: (LDAP_INVALID_CREDENTIALS == n) ? 1 \
: (APU_LDAP_INSUFFICIENT_ACCESS == n) ? 1 \
: 0
#endif
/**
* APR LDAP SSL Initialise function
*
* This function initialises SSL on the underlying LDAP toolkit
* if this is necessary.
*
* If a CA certificate is provided, this is set, however the setting
* of certificates via this method has been deprecated and will be removed in
* APR v2.0.
*
* The apr_ldap_set_option() function with the APR_LDAP_OPT_TLS_CERT option
* should be used instead to set certificates.
*
* If SSL support is not available on this platform, or a problem
* was encountered while trying to set the certificate, the function
* will return APR_EGENERAL. Further LDAP specific error information
* can be found in result_err.
* @param pool The pool to use
* @param cert_auth_file The name of the certificate to use, can be NULL
* @param cert_file_type The type of certificate specified. See the
* apr_ldap_set_option() APR_LDAP_OPT_TLS_CERT option for details.
* @param result_err The returned result
*/
APU_DECLARE_LDAP(int) apr_ldap_ssl_init(apr_pool_t *pool,
const char *cert_auth_file,
int cert_file_type,
apr_ldap_err_t **result_err);
/**
* APR LDAP SSL De-Initialise function
*
* This function tears down any SSL certificate setup previously
* set using apr_ldap_ssl_init(). It should be called to clean
* up if a graceful restart of a service is attempted.
* @todo currently we do not check whether apr_ldap_ssl_init()
* has been called first - we probably should.
*/
APU_DECLARE_LDAP(int) apr_ldap_ssl_deinit(void);
/**
* APR LDAP initialise function
*
* This function is responsible for initialising an LDAP
* connection in a toolkit independant way. It does the
* job of ldap_init() from the C api.
*
* It handles both the SSL and non-SSL case, and attempts
* to hide the complexity setup from the user. This function
* assumes that any certificate setup necessary has already
* been done.
*
* If SSL or STARTTLS needs to be enabled, and the underlying
* toolkit supports it, the following values are accepted for
* secure:
*
* APR_LDAP_NONE: No encryption
* APR_LDAP_SSL: SSL encryption (ldaps://)
* APR_LDAP_STARTTLS: Force STARTTLS on ldap://
* @remark The Novell toolkit is only able to set the SSL mode via this
* function. To work around this limitation, set the SSL mode here if no
* per connection client certificates are present, otherwise set secure
* APR_LDAP_NONE here, then set the per connection client certificates,
* followed by setting the SSL mode via apr_ldap_set_option(). As Novell
* does not support per connection client certificates, this problem is
* worked around while still being compatible with other LDAP toolkits.
* @param pool The pool to use
* @param ldap The LDAP handle
* @param hostname The name of the host to connect to. This can be either a
* DNS name, or an IP address.
* @param portno The port to connect to
* @param secure The security mode to set
* @param result_err The returned result
*/
APU_DECLARE_LDAP(int) apr_ldap_init(apr_pool_t *pool,
LDAP **ldap,
const char *hostname,
int portno,
int secure,
apr_ldap_err_t **result_err);
/**
* APR LDAP info function
*
* This function returns a string describing the LDAP toolkit
* currently in use. The string is placed inside result_err->reason.
* @param pool The pool to use
* @param result_err The returned result
*/
APU_DECLARE_LDAP(int) apr_ldap_info(apr_pool_t *pool,
apr_ldap_err_t **result_err);
#ifdef __cplusplus
}
#endif
#endif /* APR_HAS_LDAP */
/** @} */
#endif /* APR_LDAP_URL_H */

254
include/apr_ldap_option.h Normal file
View File

@ -0,0 +1,254 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @file apr_ldap_option.h
* @brief APR-UTIL LDAP ldap_*_option() functions
*/
#ifndef APR_LDAP_OPTION_H
#define APR_LDAP_OPTION_H
/**
* @addtogroup APR_Util_LDAP
* @{
*/
#include "apr_ldap.h"
#if APR_HAS_LDAP
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/*
* The following defines handle the different TLS certificate
* options available. If these options are missing, APR will try and
* emulate support for this using the deprecated ldap_start_tls_s()
* function.
*/
/**
* Set SSL mode to one of APR_LDAP_NONE, APR_LDAP_SSL, APR_LDAP_STARTTLS
* or APR_LDAP_STOPTLS.
*/
#define APR_LDAP_OPT_TLS 0x6fff
/**
* Set zero or more CA certificates, client certificates or private
* keys globally, or per connection (where supported).
*/
#define APR_LDAP_OPT_TLS_CERT 0x6ffe
/**
* Set the LDAP library to no verify the server certificate. This means
* all servers are considered trusted.
*/
#define APR_LDAP_OPT_VERIFY_CERT 0x6ffd
/**
* Set the LDAP library to indicate if referrals should be chased during
* LDAP searches.
*/
#define APR_LDAP_OPT_REFERRALS 0x6ffc
/**
* Set the LDAP library to indicate a maximum number of referral hops to
* chase before giving up on the search.
*/
#define APR_LDAP_OPT_REFHOPLIMIT 0x6ffb
/**
* Structures for the apr_set_option() cases
*/
/**
* APR_LDAP_OPT_TLS_CERT
*
* This structure includes possible options to set certificates on
* system initialisation. Different SDKs have different certificate
* requirements, and to achieve this multiple certificates must be
* specified at once passed as an (apr_array_header_t *).
*
* Netscape:
* Needs the CA cert database (cert7.db), the client cert database (key3.db)
* and the security module file (secmod.db) set at the system initialisation
* time. Three types are supported: APR_LDAP_CERT7_DB, APR_LDAP_KEY3_DB and
* APR_LDAP_SECMOD.
*
* To specify a client cert connection, a certificate nickname needs to be
* provided with a type of APR_LDAP_CERT.
* int ldapssl_enable_clientauth( LDAP *ld, char *keynickname,
* char *keypasswd, char *certnickname );
* keynickname is currently not used, and should be set to ""
*
* Novell:
* Needs CA certificates and client certificates set at system initialisation
* time. Three types are supported: APR_LDAP_CA*, APR_LDAP_CERT* and
* APR_LDAP_KEY*.
*
* Certificates cannot be specified per connection.
*
* The functions used are:
* ldapssl_add_trusted_cert(serverTrustedRoot, serverTrustedRootEncoding);
* Clients certs and keys are set at system initialisation time with
* int ldapssl_set_client_cert (
* void *cert,
* int type
* void *password);
* type can be LDAPSSL_CERT_FILETYPE_B64 or LDAPSSL_CERT_FILETYPE_DER
* ldapssl_set_client_private_key(clientPrivateKey,
* clientPrivateKeyEncoding,
* clientPrivateKeyPassword);
*
* OpenSSL:
* Needs one or more CA certificates to be set at system initialisation time
* with a type of APR_LDAP_CA*.
*
* May have one or more client certificates set per connection with a type of
* APR_LDAP_CERT*, and keys with APR_LDAP_KEY*.
*/
/** CA certificate type unknown */
#define APR_LDAP_CA_TYPE_UNKNOWN 0
/** binary DER encoded CA certificate */
#define APR_LDAP_CA_TYPE_DER 1
/** PEM encoded CA certificate */
#define APR_LDAP_CA_TYPE_BASE64 2
/** Netscape/Mozilla cert7.db CA certificate database */
#define APR_LDAP_CA_TYPE_CERT7_DB 3
/** Netscape/Mozilla secmod file */
#define APR_LDAP_CA_TYPE_SECMOD 4
/** Client certificate type unknown */
#define APR_LDAP_CERT_TYPE_UNKNOWN 5
/** binary DER encoded client certificate */
#define APR_LDAP_CERT_TYPE_DER 6
/** PEM encoded client certificate */
#define APR_LDAP_CERT_TYPE_BASE64 7
/** Netscape/Mozilla key3.db client certificate database */
#define APR_LDAP_CERT_TYPE_KEY3_DB 8
/** Netscape/Mozilla client certificate nickname */
#define APR_LDAP_CERT_TYPE_NICKNAME 9
/** Private key type unknown */
#define APR_LDAP_KEY_TYPE_UNKNOWN 10
/** binary DER encoded private key */
#define APR_LDAP_KEY_TYPE_DER 11
/** PEM encoded private key */
#define APR_LDAP_KEY_TYPE_BASE64 12
/** PKCS#12 encoded client certificate */
#define APR_LDAP_CERT_TYPE_PFX 13
/** PKCS#12 encoded private key */
#define APR_LDAP_KEY_TYPE_PFX 14
/** Openldap directory full of base64-encoded cert
* authorities with hashes in corresponding .0 directory
*/
#define APR_LDAP_CA_TYPE_CACERTDIR_BASE64 15
/**
* Certificate structure.
*
* This structure is used to store certificate details. An array of
* these structures is passed to apr_ldap_set_option() to set CA
* and client certificates.
* @param type Type of certificate APR_LDAP_*_TYPE_*
* @param path Path, file or nickname of the certificate
* @param password Optional password, can be NULL
*/
typedef struct apr_ldap_opt_tls_cert_t apr_ldap_opt_tls_cert_t;
struct apr_ldap_opt_tls_cert_t {
int type;
const char *path;
const char *password;
};
/**
* APR_LDAP_OPT_TLS
*
* This sets the SSL level on the LDAP handle.
*
* Netscape/Mozilla:
* Supports SSL, but not STARTTLS
* SSL is enabled by calling ldapssl_install_routines().
*
* Novell:
* Supports SSL and STARTTLS.
* SSL is enabled by calling ldapssl_install_routines(). Note that calling
* other ldap functions before ldapssl_install_routines() may cause this
* function to fail.
* STARTTLS is enabled by calling ldapssl_start_tls_s() after calling
* ldapssl_install_routines() (check this).
*
* OpenLDAP:
* Supports SSL and supports STARTTLS, but none of this is documented:
* http://www.openldap.org/lists/openldap-software/200409/msg00618.html
* Documentation for both SSL support and STARTTLS has been deleted from
* the OpenLDAP documentation and website.
*/
/** No encryption */
#define APR_LDAP_NONE 0
/** SSL encryption (ldaps://) */
#define APR_LDAP_SSL 1
/** TLS encryption (STARTTLS) */
#define APR_LDAP_STARTTLS 2
/** end TLS encryption (STOPTLS) */
#define APR_LDAP_STOPTLS 3
/**
* APR LDAP get option function
*
* This function gets option values from a given LDAP session if
* one was specified. It maps to the native ldap_get_option() function.
* @param pool The pool to use
* @param ldap The LDAP handle
* @param option The LDAP_OPT_* option to return
* @param outvalue The value returned (if any)
* @param result_err The apr_ldap_err_t structure contained detailed results
* of the operation.
*/
APU_DECLARE_LDAP(int) apr_ldap_get_option(apr_pool_t *pool,
LDAP *ldap,
int option,
void *outvalue,
apr_ldap_err_t **result_err);
/**
* APR LDAP set option function
*
* This function sets option values to a given LDAP session if
* one was specified. It maps to the native ldap_set_option() function.
*
* Where an option is not supported by an LDAP toolkit, this function
* will try and apply legacy functions to achieve the same effect,
* depending on the platform.
* @param pool The pool to use
* @param ldap The LDAP handle
* @param option The LDAP_OPT_* option to set
* @param invalue The value to set
* @param result_err The apr_ldap_err_t structure contained detailed results
* of the operation.
*/
APU_DECLARE_LDAP(int) apr_ldap_set_option(apr_pool_t *pool,
LDAP *ldap,
int option,
const void *invalue,
apr_ldap_err_t **result_err);
#ifdef __cplusplus
}
#endif
#endif /* APR_HAS_LDAP */
/** @} */
#endif /* APR_LDAP_OPTION_H */

98
include/apr_ldap_rebind.h Normal file
View File

@ -0,0 +1,98 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* The APR LDAP rebind functions provide an implementation of
* a rebind procedure that can be used to allow clients to chase referrals,
* using the same credentials used to log in originally.
*
* Use of this implementation is optional.
*
* @file apr_ldap_rebind.h
* @brief Apache LDAP library
*/
#ifndef APU_LDAP_REBIND_H
#define APU_LDAP_REBIND_H
/**
* @addtogroup APR_Util_LDAP
* @{
**/
#if defined(DOXYGEN)
#include "apr_ldap.h"
#endif
/*
* Handle the case when LDAP is enabled
*/
#if APR_HAS_LDAP
/**
* APR LDAP initialize rebind lock
*
* This function creates the lock for controlling access to the xref list..
* @param pool Pool to use when creating the xref_lock.
*/
APU_DECLARE_LDAP(apr_status_t) apr_ldap_rebind_init(apr_pool_t *pool);
/**
* APR LDAP rebind_add function
*
* This function creates a cross reference entry for the specified ldap
* connection. The rebind callback function will look up this ldap
* connection so it can retrieve the bindDN and bindPW for use in any
* binds while referrals are being chased.
*
* This function will add the callback to the LDAP handle passed in.
*
* A cleanup is registered within the pool provided to remove this
* entry when the pool is removed. Alternatively apr_ldap_rebind_remove()
* can be called to explicitly remove the entry at will.
*
* @param pool The pool to use
* @param ld The LDAP connectionhandle
* @param bindDN The bind DN to be used for any binds while chasing
* referrals on this ldap connection.
* @param bindPW The bind Password to be used for any binds while
* chasing referrals on this ldap connection.
*/
APU_DECLARE_LDAP(apr_status_t) apr_ldap_rebind_add(apr_pool_t *pool,
LDAP *ld,
const char *bindDN,
const char *bindPW);
/**
* APR LDAP rebind_remove function
*
* This function removes the rebind cross reference entry for the
* specified ldap connection.
*
* If not explicitly removed, this function will be called automatically
* when the pool is cleaned up.
*
* @param ld The LDAP connectionhandle
*/
APU_DECLARE_LDAP(apr_status_t) apr_ldap_rebind_remove(LDAP *ld);
#endif /* APR_HAS_LDAP */
/** @} */
#endif /* APU_LDAP_REBIND_H */

120
include/apr_ldap_url.h Normal file
View File

@ -0,0 +1,120 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @file apr_ldap_url.h
* @brief APR-UTIL LDAP ldap_init() functions
*/
#ifndef APR_LDAP_URL_H
#define APR_LDAP_URL_H
/**
* @addtogroup APR_Util_LDAP
* @{
*/
#if defined(DOXYGEN)
#include "apr_ldap.h"
#endif
#if APR_HAS_LDAP
#include "apu.h"
#include "apr_pools.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/** Structure to access an exploded LDAP URL */
typedef struct apr_ldap_url_desc_t {
struct apr_ldap_url_desc_t *lud_next;
char *lud_scheme;
char *lud_host;
int lud_port;
char *lud_dn;
char **lud_attrs;
int lud_scope;
char *lud_filter;
char **lud_exts;
int lud_crit_exts;
} apr_ldap_url_desc_t;
#ifndef APR_LDAP_URL_SUCCESS
#define APR_LDAP_URL_SUCCESS 0x00 /* Success */
#define APR_LDAP_URL_ERR_MEM 0x01 /* can't allocate memory space */
#define APR_LDAP_URL_ERR_PARAM 0x02 /* parameter is bad */
#define APR_LDAP_URL_ERR_BADSCHEME 0x03 /* URL doesn't begin with "ldap[si]://" */
#define APR_LDAP_URL_ERR_BADENCLOSURE 0x04 /* URL is missing trailing ">" */
#define APR_LDAP_URL_ERR_BADURL 0x05 /* URL is bad */
#define APR_LDAP_URL_ERR_BADHOST 0x06 /* host port is bad */
#define APR_LDAP_URL_ERR_BADATTRS 0x07 /* bad (or missing) attributes */
#define APR_LDAP_URL_ERR_BADSCOPE 0x08 /* scope string is invalid (or missing) */
#define APR_LDAP_URL_ERR_BADFILTER 0x09 /* bad or missing filter */
#define APR_LDAP_URL_ERR_BADEXTS 0x0a /* bad or missing extensions */
#endif
/**
* Is this URL an ldap url? ldap://
* @param url The url to test
*/
APU_DECLARE(int) apr_ldap_is_ldap_url(const char *url);
/**
* Is this URL an SSL ldap url? ldaps://
* @param url The url to test
*/
APU_DECLARE(int) apr_ldap_is_ldaps_url(const char *url);
/**
* Is this URL an ldap socket url? ldapi://
* @param url The url to test
*/
APU_DECLARE(int) apr_ldap_is_ldapi_url(const char *url);
/**
* Parse an LDAP URL.
* @param pool The pool to use
* @param url_in The URL to parse
* @param ludpp The structure to return the exploded URL
* @param result_err The result structure of the operation
*/
APU_DECLARE(int) apr_ldap_url_parse_ext(apr_pool_t *pool,
const char *url_in,
apr_ldap_url_desc_t **ludpp,
apr_ldap_err_t **result_err);
/**
* Parse an LDAP URL.
* @param pool The pool to use
* @param url_in The URL to parse
* @param ludpp The structure to return the exploded URL
* @param result_err The result structure of the operation
*/
APU_DECLARE(int) apr_ldap_url_parse(apr_pool_t *pool,
const char *url_in,
apr_ldap_url_desc_t **ludpp,
apr_ldap_err_t **result_err);
#ifdef __cplusplus
}
#endif
#endif /* APR_HAS_LDAP */
/** @} */
#endif /* APR_LDAP_URL_H */

135
include/apr_md4.h Normal file
View File

@ -0,0 +1,135 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* This is derived from material copyright RSA Data Security, Inc.
* Their notice is reproduced below in its entirety.
*
* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
* rights reserved.
*
* License to copy and use this software is granted provided that it
* is identified as the "RSA Data Security, Inc. MD4 Message-Digest
* Algorithm" in all material mentioning or referencing this software
* or this function.
*
* License is also granted to make and use derivative works provided
* that such works are identified as "derived from the RSA Data
* Security, Inc. MD4 Message-Digest Algorithm" in all material
* mentioning or referencing the derived work.
*
* RSA Data Security, Inc. makes no representations concerning either
* the merchantability of this software or the suitability of this
* software for any particular purpose. It is provided "as is"
* without express or implied warranty of any kind.
*
* These notices must be retained in any copies of any part of this
* documentation and/or software.
*/
#ifndef APR_MD4_H
#define APR_MD4_H
#include "apu.h"
#include "apr_xlate.h"
/**
* @file apr_md4.h
* @brief APR-UTIL MD4 Library
*/
#ifdef __cplusplus
extern "C" {
#endif
/**
* @defgroup APR_Util_MD4 MD4 Library
* @ingroup APR_Util
* @{
*/
/** The digestsize for MD4 */
#define APR_MD4_DIGESTSIZE 16
/** @see apr_md4_ctx_t */
typedef struct apr_md4_ctx_t apr_md4_ctx_t;
/** MD4 context. */
struct apr_md4_ctx_t {
/** state (ABCD) */
apr_uint32_t state[4];
/** number of bits, modulo 2^64 (lsb first) */
apr_uint32_t count[2];
/** input buffer */
unsigned char buffer[64];
#if APR_HAS_XLATE
/** translation handle */
apr_xlate_t *xlate;
#endif
};
/**
* MD4 Initialize. Begins an MD4 operation, writing a new context.
* @param context The MD4 context to initialize.
*/
APU_DECLARE(apr_status_t) apr_md4_init(apr_md4_ctx_t *context);
#if APR_HAS_XLATE
/**
* MDr4 translation setup. Provides the APR translation handle to be used
* for translating the content before calculating the digest.
* @param context The MD4 content to set the translation for.
* @param xlate The translation handle to use for this MD4 context
*/
APU_DECLARE(apr_status_t) apr_md4_set_xlate(apr_md4_ctx_t *context,
apr_xlate_t *xlate);
#else
#define apr_md4_set_xlate(context, xlate) APR_ENOTIMPL
#endif
/**
* MD4 block update operation. Continue an MD4 message-digest operation,
* processing another message block, and updating the context.
* @param context The MD4 content to update.
* @param input next message block to update
* @param inputLen The length of the next message block
*/
APU_DECLARE(apr_status_t) apr_md4_update(apr_md4_ctx_t *context,
const unsigned char *input,
apr_size_t inputLen);
/**
* MD4 finalization. Ends an MD4 message-digest operation, writing the
* message digest and zeroing the context
* @param digest The final MD4 digest
* @param context The MD4 content we are finalizing.
*/
APU_DECLARE(apr_status_t) apr_md4_final(
unsigned char digest[APR_MD4_DIGESTSIZE],
apr_md4_ctx_t *context);
/**
* MD4 digest computation
* @param digest The MD4 digest
* @param input message block to use
* @param inputLen The length of the message block
*/
APU_DECLARE(apr_status_t) apr_md4(unsigned char digest[APR_MD4_DIGESTSIZE],
const unsigned char *input,
apr_size_t inputLen);
/** @} */
#ifdef __cplusplus
}
#endif
#endif /* !APR_MD4_H */

162
include/apr_md5.h Normal file
View File

@ -0,0 +1,162 @@
/*
* This is work is derived from material Copyright RSA Data Security, Inc.
*
* The RSA copyright statement and Licence for that original material is
* included below. This is followed by the Apache copyright statement and
* licence for the modifications made to that material.
*/
/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
rights reserved.
License to copy and use this software is granted provided that it
is identified as the "RSA Data Security, Inc. MD5 Message-Digest
Algorithm" in all material mentioning or referencing this software
or this function.
License is also granted to make and use derivative works provided
that such works are identified as "derived from the RSA Data
Security, Inc. MD5 Message-Digest Algorithm" in all material
mentioning or referencing the derived work.
RSA Data Security, Inc. makes no representations concerning either
the merchantability of this software or the suitability of this
software for any particular purpose. It is provided "as is"
without express or implied warranty of any kind.
These notices must be retained in any copies of any part of this
documentation and/or software.
*/
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef APR_MD5_H
#define APR_MD5_H
#include "apu.h"
#include "apr_xlate.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @file apr_md5.h
* @brief APR MD5 Routines
*/
/**
* @defgroup APR_MD5 MD5 Routines
* @ingroup APR
* @{
*/
/** The MD5 digest size */
#define APR_MD5_DIGESTSIZE 16
/** @see apr_md5_ctx_t */
typedef struct apr_md5_ctx_t apr_md5_ctx_t;
/** MD5 context. */
struct apr_md5_ctx_t {
/** state (ABCD) */
apr_uint32_t state[4];
/** number of bits, modulo 2^64 (lsb first) */
apr_uint32_t count[2];
/** input buffer */
unsigned char buffer[64];
/** translation handle
* ignored if xlate is unsupported
*/
apr_xlate_t *xlate;
};
/**
* MD5 Initialize. Begins an MD5 operation, writing a new context.
* @param context The MD5 context to initialize.
*/
APU_DECLARE(apr_status_t) apr_md5_init(apr_md5_ctx_t *context);
/**
* MD5 translation setup. Provides the APR translation handle to be used
* for translating the content before calculating the digest.
* @param context The MD5 content to set the translation for.
* @param xlate The translation handle to use for this MD5 context
*/
APU_DECLARE(apr_status_t) apr_md5_set_xlate(apr_md5_ctx_t *context,
apr_xlate_t *xlate);
/**
* MD5 block update operation. Continue an MD5 message-digest operation,
* processing another message block, and updating the context.
* @param context The MD5 content to update.
* @param input next message block to update
* @param inputLen The length of the next message block
*/
APU_DECLARE(apr_status_t) apr_md5_update(apr_md5_ctx_t *context,
const void *input,
apr_size_t inputLen);
/**
* MD5 finalization. Ends an MD5 message-digest operation, writing the
* message digest and zeroing the context
* @param digest The final MD5 digest
* @param context The MD5 content we are finalizing.
*/
APU_DECLARE(apr_status_t) apr_md5_final(unsigned char digest[APR_MD5_DIGESTSIZE],
apr_md5_ctx_t *context);
/**
* MD5 in one step
* @param digest The final MD5 digest
* @param input The message block to use
* @param inputLen The length of the message block
*/
APU_DECLARE(apr_status_t) apr_md5(unsigned char digest[APR_MD5_DIGESTSIZE],
const void *input,
apr_size_t inputLen);
/**
* Encode a password using an MD5 algorithm
* @param password The password to encode
* @param salt The salt 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 */

Some files were not shown because too many files have changed in this diff Show More