mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-08 01:20:40 +00:00
Import apache apr-util 1.4.1
This commit is contained in:
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
62
CHANGES
Normal file
62
CHANGES
Normal 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
443
LICENSE
Normal 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
123
Makefile.in
Normal 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
365
Makefile.win
Normal 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
14
NOTICE
Normal 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
306
NWGNUmakefile
Normal 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
111
README
Normal 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
13
apr-util.pc.in
Normal 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
214
apr-util.spec
Normal 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
794
aprutil.dsp
Normal 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
479
aprutil.dsw
Normal 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
225
apu-config.in
Normal 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
739
buckets/apr_brigade.c
Normal 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
46
buckets/apr_buckets.c
Normal 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
193
buckets/apr_buckets_alloc.c
Normal 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
54
buckets/apr_buckets_eos.c
Normal 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
228
buckets/apr_buckets_file.c
Normal 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
|
||||
};
|
54
buckets/apr_buckets_flush.c
Normal file
54
buckets/apr_buckets_flush.c
Normal 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
|
||||
};
|
96
buckets/apr_buckets_heap.c
Normal file
96
buckets/apr_buckets_heap.c
Normal 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
144
buckets/apr_buckets_mmap.c
Normal 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
119
buckets/apr_buckets_pipe.c
Normal 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
142
buckets/apr_buckets_pool.c
Normal 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
|
||||
};
|
64
buckets/apr_buckets_refcount.c
Normal file
64
buckets/apr_buckets_refcount.c
Normal 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;
|
||||
}
|
137
buckets/apr_buckets_simple.c
Normal file
137
buckets/apr_buckets_simple.c
Normal 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
|
||||
};
|
114
buckets/apr_buckets_socket.c
Normal file
114
buckets/apr_buckets_socket.c
Normal 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
148
build-outputs.mk
Normal 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
100
build.conf
Normal 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
116
buildconf
Executable 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
232
config.layout
Normal 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>
|
272
configure.in
Normal file
272
configure.in
Normal 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
523
crypto/apr_crypto.c
Normal 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
865
crypto/apr_crypto_nss.c
Normal 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
203
crypto/apr_crypto_nss.dsp
Normal 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
797
crypto/apr_crypto_openssl.c
Normal 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
|
203
crypto/apr_crypto_openssl.dsp
Normal file
203
crypto/apr_crypto_openssl.dsp
Normal 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
404
crypto/apr_md4.c
Normal 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
756
crypto/apr_md5.c
Normal 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
368
crypto/apr_sha1.c
Normal 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
208
crypto/getuuid.c
Normal 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(×tamp);
|
||||
|
||||
/* time_low, uint32 */
|
||||
d[3] = (unsigned char)timestamp;
|
||||
d[2] = (unsigned char)(timestamp >> 8);
|
||||
d[1] = (unsigned char)(timestamp >> 16);
|
||||
d[0] = (unsigned char)(timestamp >> 24);
|
||||
/* time_mid, uint16 */
|
||||
d[5] = (unsigned char)(timestamp >> 32);
|
||||
d[4] = (unsigned char)(timestamp >> 40);
|
||||
/* time_hi_and_version, uint16 */
|
||||
d[7] = (unsigned char)(timestamp >> 48);
|
||||
d[6] = (unsigned char)(((timestamp >> 56) & 0x0F) | 0x10);
|
||||
/* clock_seq_hi_and_reserved, uint8 */
|
||||
d[8] = (unsigned char)(((uuid_state_seqnum >> 8) & 0x3F) | 0x80);
|
||||
/* clock_seq_low, uint8 */
|
||||
d[9] = (unsigned char)uuid_state_seqnum;
|
||||
/* node, byte[6] */
|
||||
memcpy(&d[10], uuid_state_node, NODE_LENGTH);
|
||||
}
|
130
crypto/uuid.c
Normal file
130
crypto/uuid.c
Normal 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
296
dbd/NWGNUdbdfreetds
Normal 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
292
dbd/NWGNUdbdmysql
Normal 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
301
dbd/NWGNUdbdpgsql
Normal 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
296
dbd/NWGNUdbdsqli2
Normal 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
298
dbd/NWGNUdbdsqli3
Normal 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
262
dbd/NWGNUmakefile
Normal 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
574
dbd/apr_dbd.c
Normal 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
805
dbd/apr_dbd_freetds.c
Normal 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
207
dbd/apr_dbd_freetds.dsp
Normal 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
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
207
dbd/apr_dbd_mysql.dsp
Normal 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
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
191
dbd/apr_dbd_odbc.dsp
Normal 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
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
207
dbd/apr_dbd_oracle.dsp
Normal 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
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
207
dbd/apr_dbd_pgsql.dsp
Normal 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
566
dbd/apr_dbd_sqlite2.c
Normal 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
207
dbd/apr_dbd_sqlite2.dsp
Normal 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
914
dbd/apr_dbd_sqlite3.c
Normal 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
207
dbd/apr_dbd_sqlite3.dsp
Normal 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
299
dbm/NWGNUdbmdb
Normal 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
298
dbm/NWGNUdbmgdbm
Normal 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
251
dbm/NWGNUmakefile
Normal 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
305
dbm/apr_dbm.c
Normal 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
404
dbm/apr_dbm_berkeleydb.c
Normal 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
215
dbm/apr_dbm_db.dsp
Normal 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
255
dbm/apr_dbm_gdbm.c
Normal 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
215
dbm/apr_dbm_gdbm.dsp
Normal 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
238
dbm/apr_dbm_ndbm.c
Normal 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
223
dbm/apr_dbm_sdbm.c
Normal 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
584
dbm/sdbm/sdbm.c
Normal 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
63
dbm/sdbm/sdbm_hash.c
Normal 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
79
dbm/sdbm/sdbm_lock.c
Normal 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
319
dbm/sdbm/sdbm_pair.c
Normal 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
40
dbm/sdbm/sdbm_pair.h
Normal 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
84
dbm/sdbm/sdbm_private.h
Normal 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
40
dbm/sdbm/sdbm_tune.h
Normal 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
32
docs/doxygen.conf
Normal 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
268
encoding/apr_base64.c
Normal 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
13
export_vars.sh.in
Normal 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
410
hooks/apr_hooks.c
Normal 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
128
include/apr_anylock.h
Normal 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
112
include/apr_base64.h
Normal 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
1570
include/apr_buckets.h
Normal file
File diff suppressed because it is too large
Load diff
419
include/apr_crypto.h
Normal file
419
include/apr_crypto.h
Normal 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
106
include/apr_date.h
Normal 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
552
include/apr_dbd.h
Normal 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
227
include/apr_dbm.h
Normal 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
358
include/apr_hooks.h
Normal 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
197
include/apr_ldap.h.in
Normal 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
158
include/apr_ldap.hnw
Normal 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
197
include/apr_ldap.hw
Normal 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
165
include/apr_ldap_init.h
Normal 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
254
include/apr_ldap_option.h
Normal 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
98
include/apr_ldap_rebind.h
Normal 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
120
include/apr_ldap_url.h
Normal 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
135
include/apr_md4.h
Normal 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
162
include/apr_md5.h
Normal 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
Loading…
Reference in a new issue