Re: svn commit: r1919997 [1/3] - in /apr/apr-util/branches/1.7.x: ./ build/ crypto/ dbd/ dbm/ include/ include/private/ ldap/ misc/ test/
Rainer Jung <[email protected]> Thu, 23 Jan 2025 01:09:28 +0100
| Newsgroups | gmane.comp.apache.apr.devel |
|---|---|
| Message-ID | <[email protected]> |
Furthermore: when compiling httpd against this apr-util 1.7.x on SLES
12-15 and RHEL 7-9 I get errors during compilation of the generated
server/exports.c:
exports.c:1175:57: error: 'apr_ldap_get_driver' undeclared here (not in
a function)
const void *ap_hack_apr_ldap_get_driver = (const void
*)apr_ldap_get_driver;
^
exports.c:1176:57: error: 'apr_ldap_initialise' undeclared here (not in
a function)
const void *ap_hack_apr_ldap_initialise = (const void
*)apr_ldap_initialise;
^
exports.c:1177:57: error: 'apr_ldap_option_get' undeclared here (not in
a function)
const void *ap_hack_apr_ldap_option_get = (const void
*)apr_ldap_option_get;
^
exports.c:1178:57: error: 'apr_ldap_option_set' undeclared here (not in
a function)
const void *ap_hack_apr_ldap_option_set = (const void
*)apr_ldap_option_set;
^
exports.c:1179:54: error: 'apr_ldap_connect' undeclared here (not in a
function)
const void *ap_hack_apr_ldap_connect = (const void *)apr_ldap_connect;
^
exports.c:1180:54: error: 'apr_ldap_prepare' undeclared here (not in a
function)
const void *ap_hack_apr_ldap_prepare = (const void *)apr_ldap_prepare;
^
exports.c:1181:54: error: 'apr_ldap_process' undeclared here (not in a
function)
const void *ap_hack_apr_ldap_process = (const void *)apr_ldap_process;
^
exports.c:1182:53: error: 'apr_ldap_result' undeclared here (not in a
function)
const void *ap_hack_apr_ldap_result = (const void *)apr_ldap_result;
^
exports.c:1183:51: error: 'apr_ldap_poll' undeclared here (not in a
function)
const void *ap_hack_apr_ldap_poll = (const void *)apr_ldap_poll;
^
exports.c:1187:51: error: 'apr_ldap_bind' undeclared here (not in a
function)
const void *ap_hack_apr_ldap_bind = (const void *)apr_ldap_bind;
^
exports.c:1188:54: error: 'apr_ldap_compare' undeclared here (not in a
function)
const void *ap_hack_apr_ldap_compare = (const void *)apr_ldap_compare;
^
exports.c:1189:53: error: 'apr_ldap_search' undeclared here (not in a
function)
const void *ap_hack_apr_ldap_search = (const void *)apr_ldap_search;
^
exports.c:1190:53: error: 'apr_ldap_unbind' undeclared here (not in a
function)
const void *ap_hack_apr_ldap_unbind = (const void *)apr_ldap_unbind;
^
The relevant parts of exports.c look like this:
...
1171 /*
1172 *
/path/to/install/apr-util/1.7.x/r1923080/xxx/include/apr-1/apr_ldap_common.h
1173 */
1174 #if APR_HAS_LDAP || defined(DOXYGEN)
1175 const void *ap_hack_apr_ldap_get_driver = (const void
*)apr_ldap_get_driver;
1176 const void *ap_hack_apr_ldap_initialise = (const void
*)apr_ldap_initialise;
1177 const void *ap_hack_apr_ldap_option_get = (const void
*)apr_ldap_option_get;
1178 const void *ap_hack_apr_ldap_option_set = (const void
*)apr_ldap_option_set;
1179 const void *ap_hack_apr_ldap_connect = (const void
*)apr_ldap_connect;
1180 const void *ap_hack_apr_ldap_prepare = (const void
*)apr_ldap_prepare;
1181 const void *ap_hack_apr_ldap_process = (const void
*)apr_ldap_process;
1182 const void *ap_hack_apr_ldap_result = (const void
*)apr_ldap_result;
1183 const void *ap_hack_apr_ldap_poll = (const void *)apr_ldap_poll;
1184 #if 0
1185 const void *ap_hack_apr_ldap_cancel = (const void
*)apr_ldap_cancel;
1186 #endif
1187 const void *ap_hack_apr_ldap_bind = (const void *)apr_ldap_bind;
1188 const void *ap_hack_apr_ldap_compare = (const void
*)apr_ldap_compare;
1189 const void *ap_hack_apr_ldap_search = (const void
*)apr_ldap_search;
1190 const void *ap_hack_apr_ldap_unbind = (const void
*)apr_ldap_unbind;
1191 #endif /* APU_HAS_LDAP */
1192
...
Best regards,
Rainer
Am 18.08.24 um 18:12 schrieb [email protected]:
> Author: minfrin
> Date: Sun Aug 18 16:12:50 2024
> New Revision: 1919997
>
> URL: http://svn.apache.org/viewvc?rev=1919997&view=rev
> Log:
> apr_ldap: Backport the new APR LDAP API.
>
> Added:
> apr/apr-util/branches/1.7.x/include/apr_ldap_common.h
> apr/apr-util/branches/1.7.x/ldap/apr_ldap.c
> Modified:
> apr/apr-util/branches/1.7.x/CHANGES
> apr/apr-util/branches/1.7.x/build.conf
> apr/apr-util/branches/1.7.x/build/apu-conf.m4
> apr/apr-util/branches/1.7.x/crypto/apr_crypto.c
> apr/apr-util/branches/1.7.x/dbd/apr_dbd.c
> apr/apr-util/branches/1.7.x/dbm/apr_dbm.c
> apr/apr-util/branches/1.7.x/include/apr_ldap.h.in
> apr/apr-util/branches/1.7.x/include/apr_ldap.hw
> apr/apr-util/branches/1.7.x/include/apu_errno.h
> apr/apr-util/branches/1.7.x/include/private/apu_internal.h
> apr/apr-util/branches/1.7.x/ldap/apr_ldap_init.c
> apr/apr-util/branches/1.7.x/ldap/apr_ldap_stub.c
> apr/apr-util/branches/1.7.x/misc/apr_error.c
> apr/apr-util/branches/1.7.x/misc/apu_dso.c
> apr/apr-util/branches/1.7.x/test/testldap.c
>
> Modified: apr/apr-util/branches/1.7.x/CHANGES
> URL: http://svn.apache.org/viewvc/apr/apr-util/branches/1.7.x/CHANGES?rev=1919997&r1=1919996&r2=1919997&view=diff
> ==============================================================================
> --- apr/apr-util/branches/1.7.x/CHANGES [utf-8] (original)
> +++ apr/apr-util/branches/1.7.x/CHANGES [utf-8] Sun Aug 18 16:12:50 2024
> @@ -1,6 +1,8 @@
> -*- coding: utf-8 -*-
> Changes with APR-util 1.7.0
>
> + *) apr_ldap: Add the new APR LDAP API. [Graham Leggett]
> +
> *) apr_buffer: Add the apr_buffer API. [Graham Leggett]
>
> *) apr_memcache: Check sockets from connection pool before using them and try
>
> Modified: apr/apr-util/branches/1.7.x/build.conf
> URL: http://svn.apache.org/viewvc/apr/apr-util/branches/1.7.x/build.conf?rev=1919997&r1=1919996&r2=1919997&view=diff
> ==============================================================================
> --- apr/apr-util/branches/1.7.x/build.conf (original)
> +++ apr/apr-util/branches/1.7.x/build.conf Sun Aug 18 16:12:50 2024
> @@ -104,5 +104,6 @@ target = dbm/apr_dbm_ndbm.la
> paths = ldap/apr_ldap_init.c
> ldap/apr_ldap_option.c
> ldap/apr_ldap_rebind.c
> + ldap/apr_ldap.c
> target = ldap/apr_ldap.la
>
>
> Modified: apr/apr-util/branches/1.7.x/build/apu-conf.m4
> URL: http://svn.apache.org/viewvc/apr/apr-util/branches/1.7.x/build/apu-conf.m4?rev=1919997&r1=1919996&r2=1919997&view=diff
> ==============================================================================
> --- apr/apr-util/branches/1.7.x/build/apu-conf.m4 (original)
> +++ apr/apr-util/branches/1.7.x/build/apu-conf.m4 Sun Aug 18 16:12:50 2024
> @@ -274,6 +274,8 @@ if test "$apu_has_ldap_openldap" = "1";
> LIBS="$save_libs"
> fi
>
> +AC_CHECK_HEADERS([sasl.h sasl/sasl.h])
> +
> AC_SUBST(ldap_h)
> AC_SUBST(lber_h)
> AC_SUBST(ldap_ssl_h)
>
> Modified: apr/apr-util/branches/1.7.x/crypto/apr_crypto.c
> URL: http://svn.apache.org/viewvc/apr/apr-util/branches/1.7.x/crypto/apr_crypto.c?rev=1919997&r1=1919996&r2=1919997&view=diff
> ==============================================================================
> --- apr/apr-util/branches/1.7.x/crypto/apr_crypto.c (original)
> +++ apr/apr-util/branches/1.7.x/crypto/apr_crypto.c Sun Aug 18 16:12:50 2024
> @@ -258,7 +258,7 @@ APU_DECLARE(apr_status_t) apr_crypto_get
> "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, rootp);
> + rv = apu_dso_load(&dso, &symbol, modname, symname, rootp, NULL);
> if (rv == APR_SUCCESS || rv == APR_EINIT) { /* previously loaded?!? */
> apr_crypto_driver_t *d = symbol;
> rv = APR_SUCCESS;
>
> Modified: apr/apr-util/branches/1.7.x/dbd/apr_dbd.c
> URL: http://svn.apache.org/viewvc/apr/apr-util/branches/1.7.x/dbd/apr_dbd.c?rev=1919997&r1=1919996&r2=1919997&view=diff
> ==============================================================================
> --- apr/apr-util/branches/1.7.x/dbd/apr_dbd.c (original)
> +++ apr/apr-util/branches/1.7.x/dbd/apr_dbd.c Sun Aug 18 16:12:50 2024
> @@ -191,7 +191,7 @@ APU_DECLARE(apr_status_t) apr_dbd_get_dr
> "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);
> + rv = apu_dso_load(NULL, &symbol, modname, symname, pool, NULL);
> if (rv == APR_SUCCESS || rv == APR_EINIT) { /* previously loaded?!? */
> *driver = symbol;
> name = apr_pstrdup(pool, name);
>
> Modified: apr/apr-util/branches/1.7.x/dbm/apr_dbm.c
> URL: http://svn.apache.org/viewvc/apr/apr-util/branches/1.7.x/dbm/apr_dbm.c?rev=1919997&r1=1919996&r2=1919997&view=diff
> ==============================================================================
> --- apr/apr-util/branches/1.7.x/dbm/apr_dbm.c (original)
> +++ apr/apr-util/branches/1.7.x/dbm/apr_dbm.c Sun Aug 18 16:12:50 2024
> @@ -203,7 +203,7 @@ APU_DECLARE(apr_status_t) apr_dbm_get_dr
> #endif
> apr_snprintf(symname, sizeof(symname), "apr_dbm_type_%s", type);
>
> - rv = apu_dso_load(&dso, &symbol, modname, symname, pool);
> + rv = apu_dso_load(&dso, &symbol, modname, symname, pool, NULL);
> if (rv == APR_SUCCESS || rv == APR_EINIT) { /* previously loaded?!? */
> *vtable = symbol;
> if (usertype)
>
> Modified: apr/apr-util/branches/1.7.x/include/apr_ldap.h.in
> URL: http://svn.apache.org/viewvc/apr/apr-util/branches/1.7.x/include/apr_ldap.h.in?rev=1919997&r1=1919996&r2=1919997&view=diff
> ==============================================================================
> --- apr/apr-util/branches/1.7.x/include/apr_ldap.h.in (original)
> +++ apr/apr-util/branches/1.7.x/include/apr_ldap.h.in Sun Aug 18 16:12:50 2024
> @@ -192,6 +192,8 @@ typedef struct apr_ldap_err_t {
> #include "apr_ldap_option.h"
> #include "apr_ldap_rebind.h"
>
> +#include "apr_ldap_common.h"
> +
> #endif /* APR_HAS_LDAP */
> /** @} */
> #endif /* APU_LDAP_H */
>
> Modified: apr/apr-util/branches/1.7.x/include/apr_ldap.hw
> URL: http://svn.apache.org/viewvc/apr/apr-util/branches/1.7.x/include/apr_ldap.hw?rev=1919997&r1=1919996&r2=1919997&view=diff
> ==============================================================================
> --- apr/apr-util/branches/1.7.x/include/apr_ldap.hw (original)
> +++ apr/apr-util/branches/1.7.x/include/apr_ldap.hw Sun Aug 18 16:12:50 2024
> @@ -192,6 +192,8 @@ typedef struct apr_ldap_err_t {
> #include "apr_ldap_option.h"
> #include "apr_ldap_rebind.h"
>
> +#include "apr_ldap_common.h"
> +
> /** @} */
> #endif /* APR_HAS_LDAP */
> #endif /* APU_LDAP_H */
>
> Added: apr/apr-util/branches/1.7.x/include/apr_ldap_common.h
> URL: http://svn.apache.org/viewvc/apr/apr-util/branches/1.7.x/include/apr_ldap_common.h?rev=1919997&view=auto
> ==============================================================================
> --- apr/apr-util/branches/1.7.x/include/apr_ldap_common.h (added)
> +++ apr/apr-util/branches/1.7.x/include/apr_ldap_common.h Sun Aug 18 16:12:50 2024
> @@ -0,0 +1,1359 @@
> +/* 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.h
> + * @brief APR-UTIL LDAP routines
> + */
> +#ifndef APR_LDAP_COMMON_H
> +#define APR_LDAP_COMMON_H
> +
> +/**
> + * @defgroup APR_Util_LDAP LDAP routines
> + *
> + * The APR LDAP routines provide a common, cross platform, ability to connect
> + * to and search an LDAP server.
> + *
> + * The goals of the API are:
> + *
> + * - Work within the functionality of APR pools. Requests from different pools
> + * can make LDAP requests of a common connection, and when the connection
> + * pool or the request pool goes away, the connection and/or LDAP requests
> + * are cleaned up gracefully.
> + *
> + * - Offer an asynchronous API that can be used for non blocking access to an
> + * LDAP server. The responses APR_WANT_READ and APR_WANT_WRITE make it clear
> + * whether the API wants to read or write to the LDAP server in the next API
> + * call.
> + *
> + * - Be as simple as possible. Data is returned fully processed in callbacks,
> + * removing the need for API calls to access data, and intermediate data
> + * structures.
> + *
> + * In typical use, the following calls are used:
> + *
> + * - apr_ldap_initialise() - create a handle to keep track of a connection.
> + * - apr_ldap_option_set() - set the URL, or the socket descriptor for the
> + * connextion to the server.
> + * - apr_ldap_connect() - if an URL was specified, connect to the server and
> + * confirm success.
> + * - apr_ldap_bind() - initiate a bind, and specify a callback when done.
> + *
> + * Enter the event loop, where we do the following until the connection is
> + * closed.
> + *
> + * - apr_ldap_process() - when writable, perform tasks that require writing to
> + * the LDAP server.
> + * - apr_ldap_result() - when readable, perform tasks that require reading from
> + * the LDAP server.
> + *
> + * Respond appropriately to callbacks, lining up calls to apr_ldap_compare() and
> + * apr_ldap_search() as needed.
> + *
> + * @ingroup APR
> + * @{
> + */
> +
> +#include "apr.h"
> +
> +/*
> + * Handle the case when LDAP is enabled
> + */
> +#if APR_HAS_LDAP || defined(DOXYGEN)
> +
> +#include "apu.h"
> +#include "apr_poll.h"
> +#include "apr_pools.h"
> +#include "apr_network_io.h"
> +#include "apu_errno.h"
> +#include "apr_escape.h"
> +#include "apr_buffer.h"
> +
> +
> +
> +
> +
> +
> +
> +/* 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.
> + */
> +#if defined(APU_DSO_LDAP_BUILD)
> +
> +#define apr_ldap_initialise apr__ldap_initialise
> +#define apr_ldap_option_get apr__ldap_option_get
> +#define apr_ldap_option_set apr__ldap_option_set
> +#define apr_ldap_connect apr__ldap_connect
> +#define apr_ldap_prepare apr__ldap_prepare
> +#define apr_ldap_process apr__ldap_process
> +#define apr_ldap_result apr__ldap_result
> +#define apr_ldap_poll apr__ldap_poll
> +#define apr_ldap_bind apr__ldap_bind
> +#define apr_ldap_compare apr__ldap_compare
> +#define apr_ldap_search apr__ldap_search
> +#define apr_ldap_unbind apr__ldap_unbind
> +
> +#endif
> +
> +/**
> + * Opaque structure representing the LDAP driver.
> + * @see apr_ldap_get_driver
> + */
> +typedef struct apr_ldap_driver_t apr_ldap_driver_t;
> +
> +
> +/** apr_ldap_get_driver: get the driver struct for a name
> + *
> + * The LDAP driver is unique in that LDAP libraries are almost exclusively
> + * derived from RFC1823 "The LDAP Application Program Interface".
> + *
> + * As a result, unlike other drivers for other subsystems in APR, two
> + * different drivers cannot be loaded at once, as the underlying libraries
> + * share common symbols with one another.
> + *
> + * For this reason we have exactly one driver available at a time.
> + *
> + * This function loads the library, and registers a cleanup with the pool
> + * provided to unload the library.
> + *
> + * This function can be called multiple times by independent code, cleanups
> + * are reference counted so the last pool cleanup unloads the library.
> + *
> + * Calling this function explicitly is optional, and would be done to have
> + * complete control over the lifetime of the driver.
> + *
> + * If this function is not called explicitly, this function will be called
> + * if needed before the apr_ldap_info(), apr_ldap_initialise(),
> + * apr_ldap_option_get(), and apr_ldap_option_set() functions,
> + * registering cleanups in the pools provided to those functions if needed.
> + *
> + * @param pool (process) pool to register cleanup that will unload the
> + * library. Cleanup is reference counted so the driver is
> + * unloaded on last access.
> + * @param driver Pointer to driver struct. Can be NULL.
> + * @param err Human readable error messages
> + * @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
> + */
> +APR_DECLARE(apr_status_t) apr_ldap_get_driver(apr_pool_t *pool,
> + const apr_ldap_driver_t **driver,
> + apu_err_t *err)
> + __attribute__((nonnull(1)));
> +
> +
> +
> +/**
> + * Opaque structure tracking the state of an LDAP connection.
> + *
> + * @see apr_ldap_initialise
> + */
> +typedef struct apr_ldap_t apr_ldap_t;
> +
> +
> +
> +/**
> + * Ports used by LDAP.
> + */
> +/** ldap:/// default LDAP port */
> +#define APR_LDAP_PORT 389
> +/** ldaps:/// default LDAP over TLS port */
> +#define APR_LDAPS_PORT 636
> +
> +
> +/**
> + * APR LDAP initialise function
> + *
> + * This function is responsible for initialising an LDAP
> + * connection in a toolkit independant way. It does the
> + * job of ldap_initialize() from the C api.
> + *
> + * The setting of the LDAP server to connect is made after
> + * this function returns, using the apr_ldap_option_set()
> + * call with APR_LDAP_OPT_DESC or APR_LDAP_OPT_URI.
> + *
> + * A cleanup for the connection is registered in the given pool.
> + *
> + * @param pool The pool to use
> + * @param ldap The ldap context returned
> + * @param err On error, error details are written to the
> + * structure.
> + * @see apr_ldap_option_set
> + * @see APR_LDAP_OPT_DESC
> + * @see APR_LDAP_OPT_URI
> + */
> +APU_DECLARE_LDAP(apr_status_t) apr_ldap_initialise(apr_pool_t *pool,
> + apr_ldap_t **ldap,
> + apu_err_t *err)
> + __attribute__((nonnull(1,2,3)));
> +
> +
> +/*
> + * LDAP options.
> + */
> +
> +/**
> + * Structure returned by passing APR_LDAP_OPT_API_INFO to
> + * apr_ldap_option_get().
> + *
> + * Use to return information about the underlying LDAP API.
> + *
> + * @see apr_ldap_option_get
> + * @see APR_LDAP_OPT_API_INFO
> + */
> +typedef struct apr_ldap_apiinfo_t {
> + /** revision of API supported */
> + int api_version;
> + /** highest LDAP version supported */
> + int protocol_version;
> + /** names of API extensions */
> + const char **extensions;
> + /** name of supplier */
> + const char *vendor_name;
> + /** supplier-specific version * 100 */
> + int vendor_version;
> +} apr_ldap_apiinfo_t;
> +
> +
> +/**
> + * Structure returned by passing APR_LDAP_OPT_API_FEATURE_INFO to
> + * apr_ldap_option_get().
> + *
> + * Use to return details of extensions supported by the underlying API.
> + *
> + * @see apr_ldap_option_get
> + * @see APR_LDAP_OPT_API_FEATURE_INFO
> + */
> +typedef struct apr_ldap_apifeature_info_t {
> + /** LDAP_API_FEATURE_* (less prefix) */
> + const char *name;
> + /** value of LDAP_API_FEATURE_... */
> + int version;
> +} apr_ldap_apifeature_info_t;
> +
> +
> +/**
> + * LDAP Protocol Versions.
> + *
> + * @see apr_ldap_option_set
> + * @see APR_LDAP_OPT_PROTOCOL_VERSION
> + */
> +typedef enum {
> + /** LDAP version 1 */
> + APR_LDAP_VERSION1 = 1,
> + /** LDAP version 2 */
> + APR_LDAP_VERSION2 = 2,
> + /** LDAP version 3 */
> + APR_LDAP_VERSION3 = 3
> +} apr_ldap_protocol_version_e;
> +
> +/**
> + * LDAP debug settings
> + *
> + * @see apr_ldap_option_get
> + * @see apr_ldap_option_set
> + * @see APR_LDAP_OPT_DEBUG_LEVEL
> + */
> +typedef enum {
> + /** LDAP trace debug */
> + LDAP_DEBUG_TRACE = 0x0001,
> + /** LDAP packet debug */
> + LDAP_DEBUG_PACKETS = 0x0002,
> + /** LDAP arguments debug */
> + LDAP_DEBUG_ARGS = 0x0004,
> + /** LDAP connections debug */
> + LDAP_DEBUG_CONNS = 0x0008,
> + /** LDAP BER debug */
> + LDAP_DEBUG_BER = 0x0010,
> + /** LDAP filter debug */
> + LDAP_DEBUG_FILTER = 0x0020,
> + /** LDAP configuration debug */
> + LDAP_DEBUG_CONFIG = 0x0040,
> + /** LDAP acl debug */
> + LDAP_DEBUG_ACL = 0x0080,
> + /** LDAP statistics debug */
> + LDAP_DEBUG_STATS = 0x0100,
> + /** LDAP more statistics debug */
> + LDAP_DEBUG_STATS2 = 0x0200,
> + /** LDAP shell debug */
> + LDAP_DEBUG_SHELL = 0x0400,
> + /** LDAP parse debug */
> + LDAP_DEBUG_PARSE = 0x0800,
> + /** LDAP synchronise debug */
> + LDAP_DEBUG_SYNC = 0x4000,
> + /** LDAP no debug */
> + LDAP_DEBUG_NONE = 0x8000,
> + /** LDAP all debug */
> + LDAP_DEBUG_ANY = (-1)
> +} apr_ldap_debug_e;
> +
> +/**
> + * LDAP deref settings
> + *
> + * @see apr_ldap_option_set
> + * @see APR_LDAP_OPT_DEREF
> + */
> +typedef enum {
> + APR_LDAP_DEREF_NEVER = 0, /**< Aliases should never be dereferenced */
> + APR_LDAP_DEREF_SEARCHING = 1, /**< Aliases should be dereferenced during the search, but not when locating the base object of the search. */
> + APR_LDAP_DEREF_FINDING = 2, /**< Aliases should be dereferenced when locating the base object, but not during the search. */
> + APR_LDAP_DEREF_ALWAYS = 3 /**< Aliases should always be dereferenced */
> +} apr_ldap_deref_e;
> +
> +/**
> + * LDAP options on or off
> + *
> + * @see apr_ldap_option_set
> + * @see APR_LDAP_OPT_REFERRALS
> + */
> +typedef enum {
> + APR_LDAP_OPT_OFF = 0, /**< Option set off */
> + APR_LDAP_OPT_ON = 1 /**< Option set on */
> +} apr_ldap_switch_e;
> +
> +
> +/**
> + * Set SSL mode to one of APR_LDAP_NONE, APR_LDAP_SSL, APR_LDAP_STARTTLS
> + * or APR_LDAP_STOPTLS.
> + * @see apr_ldap_option_set
> + * @see apr_ldap_option_get
> + * @see apr_ldap_tls_e
> + */
> +#define APR_LDAP_OPT_TLS 0x6fff
> +/**
> + * Set zero or more CA certificates, client certificates or private
> + * keys globally, or per connection (where supported).
> + *
> + * @see apr_ldap_option_set
> + * @see apr_ldap_opt_tls_cert_t
> + */
> +#define APR_LDAP_OPT_TLS_CERT 0x6ffe
> +/**
> + * Set the LDAP library to not verify the server certificate. This means
> + * all servers are considered trusted.
> + * @see apr_ldap_option_set
> + * @see apr_ldap_verify_e
> + */
> +#define APR_LDAP_OPT_VERIFY_CERT 0x6ffd
> +/**
> + * Set the LDAP library to indicate if referrals should be chased during
> + * LDAP searches.
> + * @see apr_ldap_option_get
> + * @see apr_ldap_option_set
> + * @see apr_ldap_switch_e
> + */
> +#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.
> + * @see apr_ldap_option_get
> + * @see apr_ldap_option_set
> + */
> +#define APR_LDAP_OPT_REFHOPLIMIT 0x6ffb
> +/**
> + * Get the underlying native LDAP handle.
> + * @see apr_ldap_option_get
> + */
> +#define APR_LDAP_OPT_HANDLE 0x6ffa
> +/**
> + * Get/Set the LDAP protocol version.
> + * @see apr_ldap_option_get
> + * @see apr_ldap_option_set
> + * @see apr_ldap_protocol_version_e
> + */
> +#define APR_LDAP_OPT_PROTOCOL_VERSION 0x6ff9
> +/**
> + * Get the LDAP API info.
> + * @see apr_ldap_option_get
> + * @see apr_ldap_apiinfo_t
> + */
> +#define APR_LDAP_OPT_API_INFO 0x6ff8
> +/**
> + * Get the LDAP API feature info.
> + * @see apr_ldap_option_get
> + * @see apr_ldap_apifeature_info_t
> + */
> +#define APR_LDAP_OPT_API_FEATURE_INFO 0x6ff7
> +/**
> + * Get or set the debug level.
> + * @see apr_ldap_option_get
> + * @see apr_ldap_option_set
> + * @see apr_ldap_debug_e
> + */
> +#define APR_LDAP_OPT_DEBUG_LEVEL 0x5001
> +/**
> + * Get the dereference setting.
> + * @see apr_ldap_option_get
> + * @see apr_ldap_option_set
> + * @see apr_ldap_deref_e
> + */
> +#define APR_LDAP_OPT_DEREF 0x6ff6
> +/**
> + * Get the most recent result code.
> + * @see apr_ldap_option_get
> + */
> +#define APR_LDAP_OPT_RESULT_CODE 0x6ff5
> +/**
> + * Get or set the underlying socket.
> + *
> + * Use this to get the underlying socket so as to perform select/poll
> + * before attempting to read or write.
> + *
> + * Note that LDAP libraries like OpenLDAP will successfully return an
> + * invalid socket if a previous attempt to connect failed. In this
> + * case, you will obtain an error the next time you use the socket.
> + *
> + * This option can also be used to set the underlying socket, as an
> + * alternative to specifying a URI. This is typically done to perform
> + * non blocking DNS lookups, or non blocking TLS negotiation, neither
> + * of which is supported natively by LDAP APIs.
> + *
> + * @warning Either APR_LDAP_OPT_DESC or APR_LDAP_OPT_URI must be set
> + * before any other options are set, for the LDAP handle to be
> + * initialised internally.
> + * @see apr_ldap_option_get
> + * @see apr_ldap_option_set
> + * @see apr_socket_t
> + */
> +#define APR_LDAP_OPT_DESC 0x6ff4
> +/**
> + * Set the URI to connect to.
> + *
> + * @warning This option (or APR_LDAP_OPT_DESC) must be set before other options,
> + * as this initialises the underlying LDAP API.
> + * @see apr_ldap_option_set
> + */
> +#define APR_LDAP_OPT_URI 0x5006
> +/**
> + * Get/set the network timeout.
> + * @see apr_ldap_option_get
> + * @see apr_ldap_option_set
> + */
> +#define APR_LDAP_OPT_NETWORK_TIMEOUT 0x5005
> +/**
> + * Get/set the timeout.
> + * @see apr_ldap_option_get
> + * @see apr_ldap_option_set
> + */
> +#define APR_LDAP_OPT_TIMEOUT 0x5002
> +
> +/**
> + * CA certificate type unknown
> + * @see APR_LDAP_OPT_TLS_CERT
> + * @see apr_ldap_opt_tls_cert_t
> + */
> +#define APR_LDAP_CA_TYPE_UNKNOWN 0
> +/**
> + * Binary DER encoded CA certificate
> + * @see APR_LDAP_OPT_TLS_CERT
> + * @see apr_ldap_opt_tls_cert_t
> + */
> +#define APR_LDAP_CA_TYPE_DER 1
> +/**
> + * PEM encoded CA certificate
> + * @see APR_LDAP_OPT_TLS_CERT
> + * @see apr_ldap_opt_tls_cert_t
> + */
> +#define APR_LDAP_CA_TYPE_BASE64 2
> +/**
> + * Openldap directory full of base64-encoded cert
> + * authorities with hashes in corresponding .0 directory
> + * @see APR_LDAP_OPT_TLS_CERT
> + * @see apr_ldap_opt_tls_cert_t
> + */
> +#define APR_LDAP_CA_TYPE_CACERTDIR_BASE64 15
> +/**
> + * CA Certificate at the given URI
> + * @see APR_LDAP_OPT_TLS_CERT
> + * @see apr_ldap_opt_tls_cert_t
> + */
> +#define APR_LDAP_CA_TYPE_URI 18
> +/**
> + * Client certificate type unknown
> + * @see APR_LDAP_OPT_TLS_CERT
> + * @see apr_ldap_opt_tls_cert_t
> + */
> +#define APR_LDAP_CERT_TYPE_UNKNOWN 5
> +/**
> + * Binary DER encoded client certificate
> + * @see APR_LDAP_OPT_TLS_CERT
> + * @see apr_ldap_opt_tls_cert_t
> + */
> +#define APR_LDAP_CERT_TYPE_DER 6
> +/**
> + * PEM encoded client certificate
> + * @see APR_LDAP_OPT_TLS_CERT
> + * @see apr_ldap_opt_tls_cert_t
> + */
> +#define APR_LDAP_CERT_TYPE_BASE64 7
> +/**
> + * PKCS#12 encoded client certificate
> + * @see APR_LDAP_OPT_TLS_CERT
> + * @see apr_ldap_opt_tls_cert_t
> + */
> +#define APR_LDAP_CERT_TYPE_PFX 13
> +/**
> + * Certificate at the given URI
> + * @see APR_LDAP_OPT_TLS_CERT
> + * @see apr_ldap_opt_tls_cert_t
> + */
> +#define APR_LDAP_CERT_TYPE_URI 16
> +/**
> + * Private key type unknown
> + * @see APR_LDAP_OPT_TLS_CERT
> + * @see apr_ldap_opt_tls_cert_t
> + */
> +#define APR_LDAP_KEY_TYPE_UNKNOWN 10
> +/**
> + * Binary DER encoded private key
> + * @see APR_LDAP_OPT_TLS_CERT
> + * @see apr_ldap_opt_tls_cert_t
> + */
> +#define APR_LDAP_KEY_TYPE_DER 11
> +/**
> + * PEM encoded private key
> + * @see APR_LDAP_OPT_TLS_CERT
> + * @see apr_ldap_opt_tls_cert_t
> + */
> +#define APR_LDAP_KEY_TYPE_BASE64 12
> +/**
> + * PKCS#12 encoded private key
> + * @see APR_LDAP_OPT_TLS_CERT
> + * @see apr_ldap_opt_tls_cert_t
> + */
> +#define APR_LDAP_KEY_TYPE_PFX 14
> +/**
> + * Private key at the given URI
> + * @see APR_LDAP_OPT_TLS_CERT
> + * @see apr_ldap_opt_tls_cert_t
> + */
> +#define APR_LDAP_KEY_TYPE_URI 17
> +
> +
> +
> +
> +/**
> + * APR_LDAP_OPT_TLS
> + *
> + * This sets the SSL level on the LDAP handle.
> + *
> + * @see APR_LDAP_OPT_TLS
> + * @see apr_ldap_option_set
> + */
> +typedef enum {
> + APR_LDAP_TLS_NONE = 0, /**< No encryption */
> + APR_LDAP_TLS_SSL = 1, /**< SSL encryption (ldaps://) */
> + APR_LDAP_TLS_STARTTLS = 2, /**< TLS encryption (STARTTLS) */
> + APR_LDAP_TLS_STOPTLS = 3 /**< end TLS encryption (STOPTLS) */
> +} apr_ldap_tls_e;
> +
> +
> +/**
> + * LDAP TLS verify options
> + *
> + * @see APR_LDAP_OPT_VERIFY_CERT
> + * @see apr_ldap_option_set
> + */
> +typedef enum {
> + /** Disable TLS verification (this is an insecure setting) */
> + APR_LDAP_VERIFY_OFF = 0,
> + /** Enable TLS verification */
> + APR_LDAP_VERIFY_ON = 1
> +} apr_ldap_verify_e;
> +
> +
> +/**
> + * Union of all possible options to be passed to apr_ldap_option_get()
> + * and apr_ldap_option_set().
> + *
> + * @see apr_ldap_option_set
> + * @see apr_ldap_option_get
> + */
> +typedef union apr_ldap_opt_t {
> + /**
> + * LDAP native handle
> + * @see APR_LDAP_OPT_HANDLE
> + */
> + void *handle;
> + /**
> + * LDAP native option
> + */
> + void *opt;
> + /**
> + * LDAP underlying socket
> + *
> + * @see APR_LDAP_OPT_DESC
> + */
> + apr_socket_t *socket;
> + /**
> + * LDAP uri
> + *
> + * @see APR_LDAP_OPT_URI
> + */
> + const char *uri;
> + /**
> + * LDAP API information
> + *
> + * @see APR_LDAP_OPT_API_INFO
> + */
> + apr_ldap_apiinfo_t info;
> + /**
> + * LDAP API feature information
> + *
> + * @see APR_LDAP_OPT_API_FEATURE_INFO
> + */
> + apr_ldap_apifeature_info_t ldfi;
> + /**
> + * Protocol version
> + *
> + * @see APR_LDAP_OPT_PROTOCOL_VERSION
> + */
> + apr_ldap_protocol_version_e pv;
> + /**
> + * TLS certificates
> + *
> + * @see APR_LDAP_OPT_TLS_CERT
> + */
> + apr_array_header_t *certs;
> + /**
> + * Timeouts
> + *
> + * @see APR_LDAP_OPT_NETWORK_TIMEOUT
> + * @see APR_LDAP_OPT_TIMEOUT
> + */
> + apr_interval_time_t timeout;
> + /**
> + * TLS on/off/starttls
> + *
> + * @see APR_LDAP_OPT_TLS
> + */
> + apr_ldap_tls_e tls;
> + /**
> + * TLS verification
> + *
> + * @see APR_LDAP_OPT_VERIFY_CERT
> + */
> + apr_ldap_verify_e verify;
> + /**
> + * Alias dereference
> + *
> + * @see APR_LDAP_OPT_DEREF
> + */
> + apr_ldap_deref_e deref;
> + /**
> + * Referrals chased
> + *
> + * @see APR_LDAP_OPT_REFERRALS
> + */
> + apr_ldap_switch_e refs;
> + /**
> + * Referral hop limit
> + *
> + * @see APR_LDAP_OPT_REFHOPLIMIT
> + */
> + int refhoplimit;
> + /**
> + * Result code
> + *
> + * @see APR_LDAP_OPT_RESULT_CODE
> + */
> + int result;
> + /**
> + * Debug level
> + *
> + * @see APR_LDAP_OPT_DEBUG_LEVEL
> + */
> + apr_ldap_debug_e debug;
> +} apr_ldap_opt_t;
> +
> +
> +/**
> + * 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 where needed
> + * @param ldap The LDAP handle
> + * @param option The LDAP_OPT_* option to return
> + * @param outvalue The value returned (if any)
> + * @param result_err On error, error details are written to the
> + * structure.
> + * @see APR_LDAP_OPT_API_FEATURE_INFO
> + * @see APR_LDAP_OPT_API_INFO
> + * @see APR_LDAP_OPT_DEBUG_LEVEL
> + * @see APR_LDAP_OPT_DEREF
> + * @see APR_LDAP_OPT_DESC
> + * @see APR_LDAP_OPT_HANDLE
> + * @see APR_LDAP_OPT_NETWORK_TIMEOUT
> + * @see APR_LDAP_OPT_PROTOCOL_VERSION
> + * @see APR_LDAP_OPT_REFERRALS
> + * @see APR_LDAP_OPT_REFHOPLIMIT
> + * @see APR_LDAP_OPT_RESULT_CODE
> + * @see APR_LDAP_OPT_TIMEOUT
> + */
> +APU_DECLARE_LDAP(apr_status_t) apr_ldap_option_get(apr_pool_t *pool, apr_ldap_t *ldap,
> + int option,
> + apr_ldap_opt_t *outvalue,
> + apu_err_t *result_err)
> + __attribute__((nonnull(1,4,5)));
> +
> +/**
> + * 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 where needed
> + * @param ldap The LDAP handle
> + * @param option The LDAP_OPT_* option to set
> + * @param invalue The value to set
> + * @param result_err On error, error details are written to the
> + * structure.
> + * @see APR_LDAP_OPT_DEBUG_LEVEL
> + * @see APR_LDAP_OPT_DEREF
> + * @see APR_LDAP_OPT_DESC
> + * @see APR_LDAP_OPT_NETWORK_TIMEOUT
> + * @see APR_LDAP_OPT_PROTOCOL_VERSION
> + * @see APR_LDAP_OPT_REFERRALS
> + * @see APR_LDAP_OPT_REFHOPLIMIT
> + * @see APR_LDAP_OPT_TIMEOUT
> + * @see APR_LDAP_OPT_TLS
> + * @see APR_LDAP_OPT_TLS_CERT
> + * @see APR_LDAP_OPT_URI
> + * @see APR_LDAP_OPT_VERIFY_CERT
> + */
> +APU_DECLARE_LDAP(apr_status_t) apr_ldap_option_set(apr_pool_t *pool, apr_ldap_t *ldap,
> + int option,
> + const apr_ldap_opt_t *invalue,
> + apu_err_t *result_err)
> + __attribute__((nonnull(1,5)));
> +
> +/**
> + * LDAP interaction identifiers during LDAP binding
> + *
> + * @see apr_ldap_bind_interact_t
> + * @see apr_ldap_bind
> + */
> +typedef enum {
> + APR_LDAP_INTERACT_DN = 0, /**< Distinguished name to use for simple bind */
> + APR_LDAP_INTERACT_GETREALM = 0x4008, /**< SASL realm for the authentication attempt */
> + APR_LDAP_INTERACT_AUTHNAME = 0x4002, /**< SASL username to authenticate */
> + APR_LDAP_INTERACT_USER = 0x4001, /**< SASL username to use for proxy authorization */
> + APR_LDAP_INTERACT_PASS = 0x4004, /**< SASL password for the provided username / Simple password for a simple bind */
> + APR_LDAP_INTERACT_NOECHOPROMPT = 0x4006, /**< SASL generic prompt for input with input echoing disabled */
> + APR_LDAP_INTERACT_ECHOPROMPT = 0x4005, /**< SASL generic prompt for input with input echoing enabled */
> +} apr_ldap_bind_interact_e;
> +
> +
> +/**
> + * During apr_ldap_bind(), a callback is passed this structure
> + * requesting authentication and authorisation details. The callback
> + * is expected to fill the buffer with the information requested.
> + *
> + * This is used to obtain the information needed for SASL binds.
> + *
> + * @see apr_ldap_bind_interact_e
> + * @see apr_ldap_bind
> + */
> +typedef struct apr_ldap_bind_interact_t {
> + /** An enum indicating what information is requested. */
> + apr_ldap_bind_interact_e id;
> + /** Presented to user (e.g. OTP challenge) */
> + const char *challenge;
> + /** Presented to user (e.g. "Username: ") */
> + const char *prompt;
> + /** Default result string */
> + const char *defresult;
> + /** Buffer to be filled in by the callback with the information requested */
> + apr_buffer_t result;
> +} apr_ldap_bind_interact_t;
> +
> +/**
> + * Bind SASL interact callback.
> + *
> + * Depending on the type of SASL mechanism chosen, this callback is called
> + * to request details needed for each bind.
> + *
> + * @see apr_ldap_bind_interact_t
> + * @see apr_ldap_bind
> + */
> +typedef apr_status_t (apr_ldap_bind_interact_cb)(
> + apr_ldap_t *ld, unsigned int flags, apr_ldap_bind_interact_t *interact, void *ctx);
> +
> +
> +
> +
> +
> +#if 0
> +
> +typedef struct apr_ldap_rebind_t {
> + /** presented to user (e.g. OTP challenge) */
> + const char *challenge;
> + /** presented to user (e.g. "Username: ") */
> + const char *prompt;
> +} apr_ldap_rebind_t;
> +
> +typedef apr_status_t (apr_ldap_rebind_proc)(
> + apr_ldap_t *ld, apr_ldap_rebind_t *rebind, void *ctx);
> +
> +#endif
> +
> +
> +
> +/**
> + * LDAP Control structure
> + *
> + * @see apr_ldap_bind_cb
> + * @see apr_ldap_compare_cb
> + * @see apr_ldap_search_result_cb
> + * @see apr_ldap_compare
> + * @see apr_ldap_search
> + */
> +typedef struct apr_ldap_control_t apr_ldap_control_t;
> +
> +
> +
> +
> +/**
> + * APR LDAP connect function.
> + *
> + * This function makes an attempt to connect to the server initialised
> + * by apr_ldap_initialise().
> + *
> + * While other functions will connect if not connected, use this
> + * function to explicitly handle errors in the connect case.
> + *
> + * This function will synchronously perform DNS lookups and TLS negotiation
> + * and will block if needed.
> + *
> + * If you need asynchronous handling, perform the DNS and TLS handling
> + * yourself, and then pass the socket with APR_LDAP_OPT_DESC.
> + *
> + * @return APR_SUCCESS means that the connection connected successfully.
> + * Other error codes indicate that the connect was not successful.
> + */
> +APU_DECLARE_LDAP(apr_status_t) apr_ldap_connect(apr_pool_t *pool,
> + apr_ldap_t *ldap,
> + apr_interval_time_t timeout,
> + apu_err_t *result_err)
> + __attribute__((nonnull(1,2,4)));
> +
> +/**
> + * Callback to prepare an LDAP request.
> + *
> + * This callback is scheduled to be fired when the LDAP socket is next
> + * writable, from within apr_ldap_process().
> + *
> + * When complete, return APR_SUCCESS to indicate you want to continue, or
> + * a different code if you want the event loop to give up. This code will
> + * be returned from apr_ldap_process().
> + * @see apr_ldap_prepare
> + * @see apr_ldap_process
> + */
> +typedef apr_status_t (*apr_ldap_prepare_cb)(apr_ldap_t *ldap, apr_status_t status,
> + void *ctx, apu_err_t *err);
> +
> +
> +/**
> + * APR LDAP prepare function
> + *
> + * This function schedules a generic callback, fired the next time the LDAP
> + * socket is writable.
> + *
> + * This callback can be used to prepare the initial LDAP request, or to
> + * prepare additional requests as needed without blocking.
> + *
> + * @param pool The pool that keeps track of the lifetime of the callback.
> + * If this pool is cleaned up, the callback will be will be gracefully
> + * removed without affecting other LDAP requests in progress. This pool need
> + * not have any relationship with the LDAP connection pool.
> + * @param ldap The ldap handle
> + * @param prepare_cb The prepare callback function. When apr_ldap_process() is
> + * next called this callback will be triggered in the expectation of the next
> + * LDAP request.
> + * @param prepare_ctx Context passed to the prepare callback.
> + * @param err Error structure for reporting detailed results.
> + *
> + * @return APR_SUCCESS means the callback was successfully prepared. Other error
> + * codes indicate that the attept to send the cancellation was not successful.
> + */
> +APU_DECLARE_LDAP(apr_status_t) apr_ldap_prepare(apr_pool_t *pool,
> + apr_ldap_t *ldap,
> + apr_ldap_prepare_cb prepare_cb,
> + void *prepare_ctx)
> + __attribute__((nonnull(1,2,3)));
> +
> +
> +/**
> + * APR process function.
> + *
> + * This function performs outstanding processing of any LDAP conversations
> + * currently in progress.
> + *
> + * When a request tells you that further processing is needed, schedule this
> + * call the next time the socket is writable.
> + *
> + * Most callbacks are fired from within apr_ldap_process() so that we are
> + * ready to write the next LDAP query should that be needed.
> + *
> + * @param pool The pool to use
> + * @param ldap The LDAP handle
> + * @param timeout The timeout to use for writes.
> + * @param err Error structure for reporting detailed results.
> + *
> + * @return APR_WANT_WRITE means that at least one further process is outstanding
> + * and a further write callback should be scheduled. APR_WANTS_READ indicates
> + * the a request has been sent and we're waiting for the response. APR_SUCCESS
> + * means that no further processing is needed. Other error codes indicate that
> + * the processing of outstanding conversations was not successful.
> + */
> +APU_DECLARE_LDAP(apr_status_t) apr_ldap_process(apr_pool_t *pool,
> + apr_ldap_t *ldap,
> + apr_interval_time_t timeout,
> + apu_err_t *err)
> + __attribute__((nonnull(1,2,4)));
> +
> +
> +/**
> + * APR result function.
> + *
> + * This function returns the result of a previous request, ready for further
> + * processing.
> + *
> + * @param pool The pool to use
> + * @param ldap The LDAP handle
> + * @param timeout The timeout to use for writes.
> + * @param err Error structure for reporting detailed results.
> + *
> + * @return APR_WANT_WRITE means that at least one further process is outstanding
> + * and a further write callback should be scheduled. APR_WANTS_READ indicates
> + * more responses are expected and we're waiting for the response. APR_SUCCESS
> + * means that no further processing is needed. Other error codes indicate that
> + * the processing of outstanding conversations was not successful.
> + */
> +APU_DECLARE_LDAP(apr_status_t) apr_ldap_result(apr_pool_t *pool,
> + apr_ldap_t *ldap,
> + apr_interval_time_t timeout,
> + apu_err_t *err)
> + __attribute__((nonnull(1,2,4)));
> +
> +
> +/**
> + * APR LDAP poll function.
> + *
> + * For applications that need simple set of queries, this function provides
> + * an event loop that can handle a series of LDAP requests.
> + *
> + * This function calls apr_ldap_process() and apr_ldap_result() as needed.
> + *
> + * @param pool The pool to use
> + * @param ldap The LDAP handle
> + * @param timeout The timeout to use for reads and writes.
> + * @param err Error structure for reporting detailed results.
> + *
> + * @return APR_SUCCESS means that no further processing is needed. Other error
> + * codes indicate that processing was not successful.
> + */
> +APU_DECLARE_LDAP(apr_status_t) apr_ldap_poll(apr_pool_t *pool,
> + apr_ldap_t *ldap,
> + apr_pollcb_t *poll,
> + apr_interval_time_t timeout,
> + apu_err_t *err)
> + __attribute__((nonnull(1,2,3,5)));
> +
> +
> +/**
> + * Callback to receive the results of a bind operation.
> + *
> + * When a bind is successful, this function is called with a status of
> + * APR_SUCCESS.
> + *
> + * Bind success is returned from within apr_ldap_process(), and therefore
> + * it can be safely assumed that the underlying socket is writable ready
> + * for exactly one further LDAP operation like apr_ldap_search() or
> + * apr_ldap_compare().
> + *
> + * If the bind fails, status will carry the error code, and err will return
> + * the human readable details.
> + *
> + * If the underlying LDAP connection has failed, status will return details
> + * of the error, allowing an opportunity to clean up.
> + *
> + * When complete, return APR_SUCCESS to indicate you want to continue, or
> + * a different code if you want the event loop to give up. This code will
> + * be returned from apr_ldap_process().
> + *
> + * If this callback was called during a pool cleanup, the return value is
> + * ignored.
> + * @see apr_ldap_bind
> + * @see apr_ldap_process
> + * @see apr_ldap_result
> + */
> +typedef apr_status_t (*apr_ldap_bind_cb)(apr_ldap_t *ldap, apr_status_t status,
> + const char *matcheddn,
> + apr_ldap_control_t **serverctrls,
> + void *ctx, apu_err_t *err);
> +
> +
> +#if 0
> +/**
> + * Function called to report cancel results.
> + */
> +typedef void (*apr_ldap_cancel_cb)(apr_ldap_t *ldap, apr_ldap_message_t *msg, void *ctx);
> +
> +/**
> + * APR LDAP cancel function
> + *
> + * This function cancels a previously sent LDAP operation, identified by
> + * the callback function and callback context.
> + *
> + * Cancellations are attempted asynchronously. The result of the cancellation
> + * will be retrieved and handled by the apr_ldap_result() function, and the
> + * outcome is passed to the callback provided.
> + *
> + * @return APR_INCOMPLETE means that the cancellation was sent, and the message
> + * in reply needs to be fetched using apr_ldap_result(). Other error
> + * codes indicate that the attept to send the cancellation was not successful.
> + */
> +APU_DECLARE_LDAP(apr_status_t) apr_ldap_cancel(apr_pool_t *pool,
> + apr_ldap_t *ldap,
> + apr_ldap_control_t **serverctrls,
> + apr_ldap_control_t **clientctrls,
> + apr_interval_time_t timeout,
> + apr_ldap_cancel_cb cancel_cb, void *cancel_ctx,
> + apu_err_t *err)
> + __attribute__((nonnull(1,2,6,8)));
> +#endif
> +
> +/**
> + * APR LDAP bind function
> + *
> + * This function initiates a bind on a previously initialised LDAP connection
> + * to the directory.
> + *
> + * Pass the required SASL mechanism in mech, or set to NULL for a simple
> + * bind.
> + *
> + * Unlike the native LDAP APIs, this function muct be called just once.
> + * The job of binding is done inside apr_ldap_process() and apr_ldap_result().
> + *
> + * Binds are attempted asynchronously. For non blocking behaviour, this function
> + * must be called after the underlying socket has indicated that it is ready to
> + * write.
> + *
> + * In the absence of an error, apr_ldap_bind will return APR_WANT_READ to
> + * indicate that the next message in the conversation be retrieved using
> + * apr_ldap_result().
> + *
> + * The outcome of the bind will be retrieved and handled by the
> + * apr_ldap_process() function, and the outcome is passed to the
> + * apr_ldap_bind_cb provided.
> + *
> + * @param pool The pool that keeps track of the lifetime of the bind conversation.
> + * If this pool is cleaned up, the bind conversation will be gracefully
> + * abandoned without affecting other LDAP requests in progress. This pool need
> + * not have any relationship with the LDAP connection pool.
> + * @param ldap The ldap handle
> + * @param mech The SASL mechanism. Pass NULL for simple bind.
> + * @param interact_cb The SASL interactive callback function. This function is
> + * is called to request credentials for the bind, depending on the mechanism.
> + * @param interact_ctx Context passed to the interactive callback.
> + * @param timeout The timeout to use for writes.
> + * @param bind_cb The bind result callback function. When the bind process has
> + * completed the success or failure of the bind is returned here. The callback
> + * is triggered from inside apr_ldap_process() so that it is safe to write the
> + * next LDAP request.
> + * @param bind_ctx Context passed to the bind callback.
> + * @param err Error structure for reporting detailed results.
> + * @return APR_WANT_READ means that processing has occurred, and
> + * the message in reply needs to be fetched using apr_ldap_result().
> + * APR_WANT_WRITE means that processing has occurred, and the
> + * conversation needs to be continued with a call to apr_ldap_process().
> + * APR_SUCCESS means that the processing is complete, and the bind
> + * has been successful. Other error codes indicate that the bind
> + * was not successful.
> + * @see apr_ldap_bind_interact_cb
> + * @see apr_ldap_bind_cb
> + * @see apr_ldap_process
> + * @see apr_ldap_result
> + */
> +APU_DECLARE_LDAP(apr_status_t) apr_ldap_bind(apr_pool_t *pool, apr_ldap_t *ldap,
> + const char *mech,
> + apr_ldap_bind_interact_cb *interact_cb,
> + void *interact_ctx,
> + apr_interval_time_t timeout,
> + apr_ldap_bind_cb bind_cb, void *bind_ctx,
> + apu_err_t *err)
> + __attribute__((nonnull(1,2,4,9)));
> +
> +
> +/**
> + * Callback to receive the results of a compare operation.
> + *
> + * When a compare is successful, this function is called with a status of
> + * APR_COMPARE_TRUE or APR_COMPARE_FALSE.
> + *
> + * If the compare fails, status will carry the error code, and err will return
> + * the human readable details.
> + *
> + * If the underlying LDAP connection has failed, status will return details
> + * of the error, allowing an opportunity to clean up.
> + *
> + * When complete, return APR_SUCCESS to indicate you want to continue, or
> + * a different code if you want the event loop to give up. This code will
> + * be returned from apr_ldap_result().
> + *
> + * If this callback was called during a pool cleanup, the return value is
> + * ignored.
> + * @see apr_ldap_compare
> + * @see apr_ldap_result
> + */
> +typedef apr_status_t (*apr_ldap_compare_cb)(apr_ldap_t *ldap, apr_status_t status,
> + const char *matcheddn,
> + apr_ldap_control_t **serverctrls,
> + void *ctx, apu_err_t *err);
> +
> +
> +
> +/**
> + * APR LDAP compare function
> + *
> + * This function compares a string or binary value of an attribute
> + * within an entry described by the given distinguished name against
> + * a previously initialised LDAP connection to the directory.
> + *
> + * Compares are attempted asynchronously. For non blocking behaviour, this function
> + * must be called after the underlying socket has indicated that it is ready to
> + * write.
> + *
> + * In the absence of an error, apr_ldap_compare will return APR_WANT_READ to
> + * indicate that the next message in the conversation be retrieved using
> + * apr_ldap_result().
> + *
> + * The outcome of the compare will be retrieved and handled by the
> + * apr_ldap_process() function, and the outcome is passed to the
> + * apr_ldap_compare_cb provided.
> + *
> + * @param pool The pool that keeps track of the lifetime of the compare conversation.
> + * If this pool is cleaned up, the compare conversation will be gracefully
> + * abandoned without affecting other LDAP requests in progress. This pool need
> + * not have any relationship with the LDAP connection pool.
> + * @param ldap The ldap handle
> + * @param dn The distinguished named of the object to compare.
> + * @param attr The attribute of the object to compare.
> + * @param val The value to be compared to the attribute. The value can be zero
> + * terminated text, or binary.
> + * @param serverctrls NULL terminated array of server controls.
> + * @param clientctrls NULL terminated array of client controls.
> + * @param timeout The timeout to use for writes.
> + * @param compare_cb The compare result callback function. When the compare process has
> + * completed the success or failure of the compare is returned here. The callback
> + * is triggered from inside apr_ldap_process() so that it is safe to write the
> + * next LDAP request.
> + * @param ctx Context passed to the compare callback.
> + * @param err Error structure for reporting detailed results.
> + *
> + * @return APR_WANT_READ means that processing has occurred, and
> + * the message in reply needs to be fetched using apr_ldap_result().
> + * APR_SUCCESS means that the processing is complete, and the bind
> + * has been successful. Other error codes indicate that the bind
> + * was not successful.
> + * @see apr_ldap_compare_cb
> + * @see apr_ldap_process
> + * @see apr_ldap_result
> + */
> +APU_DECLARE_LDAP(apr_status_t) apr_ldap_compare(apr_pool_t *pool,
> + apr_ldap_t *ldap,
> + const char *dn,
> + const char *attr,
> + const apr_buffer_t *val,
> + apr_ldap_control_t **serverctrls,
> + apr_ldap_control_t **clientctrls,
> + apr_interval_time_t timeout,
> + apr_ldap_compare_cb compare_cb, void *ctx,
> + apu_err_t *err)
> + __attribute__((nonnull(1,2,3,4,5,11)));
> +
> +
> +/**
> + * APR search scopes
> + *
> + * @see apr_ldap_search
> + */
> +typedef enum {
> + /** base object search */
> + APR_LDAP_SCOPE_BASE = 0x0000,
> + /** one-level search */
> + APR_LDAP_SCOPE_ONELEVEL = 0x0001,
> + /** subtree search */
> + APR_LDAP_SCOPE_SUBTREE = 0x0002,
> + /** subordinate search */
> + APR_LDAP_SCOPE_SUBORDINATE = 0x0003
> +} apr_ldap_search_scope_e;
> +
> +
> +/**
> + * Callback to receive the results of a search operation.
> + *
> + * This callback is fired once for every search.
> + *
> + * When a search is complete, this function is called with a status of
> + * APR_SUCCESS or APR_NO_RESULTS_RETURNED.
> + *
> + * If the search fails, status will carry the error code, and err will return
> + * the human readable details.
> + *
> + * If the underlying LDAP connection has failed, status will return details
> + * of the error, allowing an opportunity to clean up.
> + *
> + * When complete, return APR_SUCCESS to indicate you want to continue, or
> + * a different code if you want the event loop to give up. This code will
> + * be returned from apr_ldap_result().
> + *
> + * If this callback was called during a pool cleanup, the return value is
> + * ignored.
> + * @see apr_ldap_search
> + * @see apr_ldap_result
> + */
> +typedef apr_status_t (*apr_ldap_search_result_cb)(apr_ldap_t *ldap, apr_status_t status,
> + apr_size_t count, const char *matcheddn,
> + apr_ldap_control_t **serverctrls,
> + void *ctx, apu_err_t *err);
> +
> +/**
> + * Callback to receive the entries of a search operation.
> + *
> + * This callback is fired once for every attribute and value combination,
> + * and then once for each entry to indicate the entry is complete.
> + *
> + * When complete, return APR_SUCCESS to indicate you want to continue, or
> + * a different code if you want the event loop to give up. This code will
> + * be returned from apr_ldap_result().
> + *
> + * @see apr_ldap_search
> + * @see apr_ldap_result
> + */
> +typedef apr_status_t (*apr_ldap_search_entry_cb)(apr_ldap_t *ldap, const char *dn,
> + int eidx, int nattrs, int aidx,
> + const char *attr, int nvals,
> + int vidx, apr_buffer_t *val, int binary,
> + void *ctx, apu_err_t *err);
> +
> +
> +/**
> + * APR LDAP search function
> + *
> + * This function searches a previously initialised LDAP connection to the directory.
> + *
> + * Searches are attempted asynchronously. For non blocking behaviour, this function
> + * must be called after the underlying socket has indicated that it is ready to
> + * write.
> + *
> + * In the absence of an error, apr_ldap_search will return APR_WANT_READ to
> + * indicate that the next message in the conversation be retrieved using
> + * apr_ldap_result().
> + *
> + * The outcome of the search will be retrieved and handled by the
> + * apr_ldap_result() function as each result arrives.
> + *
> + * If one or more results are returned, the apr_ldap_search_entry_cb callback
> + * is called once for each attribute and value combination.
> + *
> + * At the end of each entry, apr_ldap_search_entry_cb will be called with no
> + * attribute or value, giving code an opportunity to perform any processing only
> + * possible after all of the entries have been retrieved.
> + *
> + * Once all entries have been processed, apr_ldap_search_result_cb is called to
> + * indicate the final result of the search.
> + *
> + * If no entries are returned, only apr_ldap_search_result_cb will be called.
> + *
> + * @param pool The pool that keeps track of the lifetime of the search conversation.
> + * If this pool is cleaned up, the search conversation will be gracefully
> + * abandoned without affecting other LDAP requests in progress. This pool need
> + * not have any relationship with the LDAP connection pool.
> + * @param ldap The ldap handle
> + * @param dn The base distinguished named of the search.
> + * @param scope The scope of the search.
> + * @param filter The search filter string.
> + * @param attrs NULL terminated array of attributes to return.
> + * @param attrsonly If on, attributes will be returned without values.
> + * @param serverctrls NULL terminated array of server controls.
> + * @param clientctrls NULL terminated array of client controls.
> + * @param timeout The timeout to use for writes.
> + * @param sizelimit The maximum number of entries to return in the search.
> + * @param search_result_cb The search result callback function. When the search
> + * process has completed the success or failure of the search is returned here.
> + * The callback is triggered from inside apr_ldap_process() so that it is safe to
> + * write the next LDAP request.
> + * @param search_entry_cb The search entry callback function. For each value of
> + * each attribute of each entry, this callback is called with each value. This
> + * callback is then fired off one more time at the end of each entry, giving the
> + * chance to handle that entry. The callback is triggered from inside
> + * apr_ldap_result().
> + * @param ctx Context passed to the search result and search entry callbacks.
> + * @param err Error structure for reporting detailed results.
> + *
> + * @return APR_WANT_READ means that processing has occurred, and
> + * the message in reply needs to be fetched using apr_ldap_result().
> + * Other error codes indicate that the search attempt was not successful.
> + * @see apr_ldap_search_entry_cb
> + * @see apr_ldap_search_result_cb
> + * @see apr_ldap_result
> + */
> +APU_DECLARE_LDAP(apr_status_t) apr_ldap_search(apr_pool_t *pool,
> + apr_ldap_t *ldap,
> + const char *dn,
> + apr_ldap_search_scope_e scope,
> + const char *filter,
> + const char **attrs,
> + apr_ldap_switch_e attrsonly,
> + apr_ldap_control_t **serverctrls,
> + apr_ldap_control_t **clientctrls,
> + apr_interval_time_t timeout,
> + apr_ssize_t sizelimit,
> + apr_ldap_search_result_cb search_result_cb,
> + apr_ldap_search_entry_cb search_entry_cb,
> + void *ctx,
> + apu_err_t *err)
> + __attribute__((nonnull(1,2,3,15)));
> +
> +/**
> + * APR LDAP unbind function
> + *
> + * This function unbinds from the LDAP server, and frees the connection handle.
> + *
> + * Calling this function is optional, the same effect can be achieved by cleaning up
> + * the pool passed to apr_ldap_initialise().
> + *
> + * @see apr_ldap_initialise
> + */
> +APU_DECLARE_LDAP(apr_status_t) apr_ldap_unbind(apr_ldap_t *ldap,
> + apr_ldap_control_t **serverctrls,
> + apr_ldap_control_t **clientctrls,
> + apu_err_t *err)
> + __attribute__((nonnull(1,4)));
> +
> +
> +#endif /* APU_HAS_LDAP */
> +/** @} */
> +#endif /* APR_LDAP_COMMON_H */
> +
>
> Modified: apr/apr-util/branches/1.7.x/include/apu_errno.h
> URL: http://svn.apache.org/viewvc/apr/apr-util/branches/1.7.x/include/apu_errno.h?rev=1919997&r1=1919996&r2=1919997&view=diff
> ==============================================================================
> --- apr/apr-util/branches/1.7.x/include/apu_errno.h (original)
> +++ apr/apr-util/branches/1.7.x/include/apu_errno.h Sun Aug 18 16:12:50 2024
> @@ -54,6 +54,23 @@ extern "C" {
> * APR_EINITENGINE The engine could not be initialised
> * APR_EREINIT Underlying crypto has already been initialised
> * APR_ENOVERIFY The signature verification failed
> + * APR_SERVER_DOWN The server is down
> + * APR_AUTH_UNKNOWN Unknown SASL mechanism
> + * APR_PROXY_AUTH Proxy authorization has failed
> + * APR_INAPPROPRIATE_AUTH Authentication not appropriate for this entry
> + * APR_INVALID_CREDENTIALS Invalid credentials were presented
> + * APR_INSUFFICIENT_ACCESS The user has insufficient access
> + * APR_INSUFFICIENT_RIGHTS The user has insufficient rights
> + * APR_CONSTRAINT_VIOLATION A constraint was violated
> + * APR_FILTER_ERROR The filter was malformed
> + * APR_NO_SUCH_OBJECT The object does not exist
> + * APR_NO_SUCH_ATTRIBUTE The attribute does not exist
> + * APR_COMPARE_TRUE The comparison returned true
> + * APR_COMPARE_FALSE The comparison returned false
> + * APR_NO_RESULTS_RETURNED No results were returned
> + * APR_WANT_READ Call me again when the socket is ready for reading
> + * APR_WANT_WRITE Call me again when the socket is ready for writing
> + * APR_USER_CANCELLED User has cancelled the request
> * </PRE>
> *
> * <PRE>
> @@ -88,6 +105,40 @@ extern "C" {
> #define APR_EREINIT (APR_UTIL_START_STATUS + 12)
> /** @see APR_STATUS_IS_ENOVERIFY */
> #define APR_ENOVERIFY (APR_UTIL_START_STATUS + 13)
> +/** @see APR_STATUS_IS_SERVER_DOWN */
> +#define APR_SERVER_DOWN (APR_UTIL_START_STATUS + 101)
> +/** @see APR_STATUS_IS_AUTH_UNKNOWN */
> +#define APR_AUTH_UNKNOWN (APR_UTIL_START_STATUS + 102)
> +/** @see APR_STATUS_IS_PROXY_AUTH */
> +#define APR_PROXY_AUTH (APR_UTIL_START_STATUS + 103)
> +/** @see APR_STATUS_IS_INAPPROPRIATE_AUTH */
> +#define APR_INAPPROPRIATE_AUTH (APR_UTIL_START_STATUS + 104)
> +/** @see APR_STATUS_IS_INVALID_CREDENTIALS */
> +#define APR_INVALID_CREDENTIALS (APR_UTIL_START_STATUS + 105)
> +/** @see APR_STATUS_IS_INSUFFICIENT_ACCESS */
> +#define APR_INSUFFICIENT_ACCESS (APR_UTIL_START_STATUS + 106)
> +/** @see APR_STATUS_IS_INSUFFICIENT_RIGHTS */
> +#define APR_INSUFFICIENT_RIGHTS (APR_UTIL_START_STATUS + 107)
> +/** @see APR_STATUS_IS_CONSTRAINT_VIOLATION */
> +#define APR_CONSTRAINT_VIOLATION (APR_UTIL_START_STATUS + 108)
> +/** @see APR_STATUS_IS_FILTER_ERROR */
> +#define APR_FILTER_ERROR (APR_UTIL_START_STATUS + 109)
> +/** @see APR_STATUS_IS_NO_SUCH_OBJECT */
> +#define APR_NO_SUCH_OBJECT (APR_UTIL_START_STATUS + 110)
> +/** @see APR_STATUS_IS_NO_SUCH_ATTRIBUTE */
> +#define APR_NO_SUCH_ATTRIBUTE (APR_UTIL_START_STATUS + 111)
> +/** @see APR_STATUS_IS_COMPARE_TRUE */
> +#define APR_COMPARE_TRUE (APR_UTIL_START_STATUS + 112)
> +/** @see APR_STATUS_IS_COMPARE_FALSE */
> +#define APR_COMPARE_FALSE (APR_UTIL_START_STATUS + 113)
> +/** @see APR_STATUS_IS_NO_RESULTS_RETURNED */
> +#define APR_NO_RESULTS_RETURNED (APR_UTIL_START_STATUS + 114)
> +/** @see APR_STATUS_IS_WANT_READ */
> +#define APR_WANT_READ (APR_UTIL_START_STATUS + 115)
> +/** @see APR_STATUS_IS_WANT_WRITE */
> +#define APR_WANT_WRITE (APR_UTIL_START_STATUS + 116)
> +/** @see APR_STATUS_IS_USER_CANCELLED */
> +#define APR_USER_CANCELLED (APR_UTIL_START_STATUS + 117)
> /** @} */
>
> /**
> @@ -160,6 +211,75 @@ extern "C" {
> * The signature verification failed
> */
> #define APR_STATUS_IS_ENOVERIFY(s) ((s) == APR_ENOVERIFY)
> +/**
> + * The server is down
> + */
> +#define APR_STATUS_IS_SERVER_DOWN(s) ((s) == APR_SERVER_DOWN)
> +/**
> + * Authentication mechanism not supoorted by this server
> + */
> +#define APR_STATUS_IS_AUTH_UNKNOWN(s) ((s) == APR_AUTH_UNKNOWN)
> +/**
> + * Proxy authorization has failed
> + */
> +#define APR_STATUS_IS_PROXY_AUTH(s) ((s) == APR_PROXY_AUTH)
> +/**
> + * Inappropriate authentication was specified (e.g., simple auth
> + * was specified but the entry does not have a userPassword attribute).
> + */
> +#define APR_STATUS_IS_INAPPROPRIATE_AUTH(s) ((s) == APR_INAPPROPRIATE_AUTH)
> +/**
> + * Invalid credentials were presented (e.g., the wrong password).
> + */
> +#define APR_STATUS_IS_INVALID_CREDENTIALS(s) ((s) == APR_INVALID_CREDENTIALS)
> +/**
> + * The user has insufficient access to perform the operation.
> + */
> +#define APR_STATUS_IS_INSUFFICIENT_ACCESS(s) ((s) == APR_INSUFFICIENT_ACCESS)
> +/**
> + * The user has insufficient rights to perform the operation.
> + */
> +#define APR_STATUS_IS_INSUFFICIENT_RIGHTS(s) ((s) == APR_INSUFFICIENT_RIGHTS)
> +/**
> + * A constraint was violated.
> + */
> +#define APR_STATUS_IS_CONSTRAINT_VIOLATION(s) ((s) == APR_CONSTRAINT_VIOLATION)
> +/**
> + * The filter was malformed.
> + */
> +#define APR_STATUS_IS_FILTER_ERROR(s) ((s) == APR_FILTER_ERROR)
> +/**
> + * No such object.
> + */
> +#define APR_STATUS_IS_NO_SUCH_OBJECT(s) ((s) == APR_NO_SUCH_OBJECT)
> +/**
> + * No such attribute.
> + */
> +#define APR_STATUS_IS_NO_SUCH_ATTRIBUTE(s) ((s) == APR_NO_SUCH_ATTRIBUTE)
> +/**
> + * Comparison is true.
> + */
> +#define APR_STATUS_IS_COMPARE_TRUE(s) ((s) == APR_COMPARE_TRUE)
> +/**
> + * Comparison is false.
> + */
> +#define APR_STATUS_IS_COMPARE_FALSE(s) ((s) == APR_COMPARE_FALSE)
> +/**
> + * No results were returned.
> + */
> +#define APR_STATUS_IS_NO_RESULTS_RETURNED(s) ((s) == APR_NO_RESULTS_RETURNED)
> +/**
> + * Call us back when the socket is ready for a read.
> + */
> +#define APR_STATUS_IS_WANT_READ(s) ((s) == APR_WANT_READ)
> +/**
> + * Call us back when the socket is ready for a write.
> + */
> +#define APR_STATUS_IS_WANT_WRITE(s) ((s) == APR_WANT_WRITE)
> +/**
> + * User has cancelled the request.
> + */
> +#define APR_STATUS_IS_USER_CANCELLED(s) ((s) == APR_USER_CANCELLED)
> /** @} */
>
> /**
> @@ -194,6 +314,16 @@ APU_DECLARE_NONSTD(apu_err_t *) apr_errp
> __attribute__((format(printf,5,6)))
> __attribute__((nonnull(2)));
>
> +/**
> + * Return a human readable string describing the specified error.
> + * @param statcode The error code to get a string for.
> + * @param buf A buffer to hold the error string.
> + * @param bufsize Size of the buffer to hold the string.
> + */
> +APU_DECLARE(char *) apu_strerror(apr_status_t statcode, char *buf,
> + apr_size_t bufsize);
> +
> +
> /** @} */
>
> #ifdef __cplusplus
>
> Modified: apr/apr-util/branches/1.7.x/include/private/apu_internal.h
> URL: http://svn.apache.org/viewvc/apr/apr-util/branches/1.7.x/include/private/apu_internal.h?rev=1919997&r1=1919996&r2=1919997&view=diff
> ==============================================================================
> --- apr/apr-util/branches/1.7.x/include/private/apu_internal.h (original)
> +++ apr/apr-util/branches/1.7.x/include/private/apu_internal.h Sun Aug 18 16:12:50 2024
> @@ -17,6 +17,7 @@
> #include "apr.h"
> #include "apr_dso.h"
> #include "apu.h"
> +#include "apu_errno.h"
>
> #ifndef APU_INTERNAL_H
> #define APU_INTERNAL_H
> @@ -38,13 +39,14 @@ apr_status_t apu_dso_mutex_lock(void);
> apr_status_t apu_dso_mutex_unlock(void);
>
> apr_status_t apu_dso_load(apr_dso_handle_t **dso, apr_dso_handle_sym_t *dsoptr, const char *module,
> - const char *modsym, apr_pool_t *pool);
> + const char *modsym, apr_pool_t *pool, apu_err_t *err);
>
> #if APR_HAS_LDAP
>
> /* For LDAP internal builds, wrap our LDAP namespace */
>
> struct apr__ldap_dso_fntable {
> + /* legacy API */
> int (*info)(apr_pool_t *pool, apr_ldap_err_t **result_err);
> int (*init)(apr_pool_t *pool, LDAP **ldap, const char *hostname,
> int portno, int secure, apr_ldap_err_t **result_err);
> @@ -59,6 +61,47 @@ struct apr__ldap_dso_fntable {
> apr_status_t (*rebind_add)(apr_pool_t *pool, LDAP *ld,
> const char *bindDN, const char *bindPW);
> apr_status_t (*rebind_remove)(LDAP *ld);
> + /* current API */
> + apr_status_t (*initialise)(apr_pool_t *pool, apr_ldap_t **ldap,
> + apu_err_t *err);
> + apr_status_t (*option_get)(apr_pool_t *pool, apr_ldap_t *ldap, int option,
> + apr_ldap_opt_t *outvalue, apu_err_t *err);
> + apr_status_t (*option_set)(apr_pool_t *pool, apr_ldap_t *ldap, int option,
> + const apr_ldap_opt_t *invalue, apu_err_t *err);
> + apr_status_t (*connect)(apr_pool_t *pool, apr_ldap_t *ldap,
> + apr_interval_time_t timeout, apu_err_t *err);
> + apr_status_t (*prepare)(apr_pool_t *pool, apr_ldap_t *ldap,
> + apr_ldap_prepare_cb prepare_cb,
> + void *prepare_ctx);
> + apr_status_t (*process)(apr_pool_t *pool, apr_ldap_t *ldap,
> + apr_interval_time_t timeout, apu_err_t *err);
> + apr_status_t (*result)(apr_pool_t *pool, apr_ldap_t *ldap,
> + apr_interval_time_t timeout, apu_err_t *err);
> + apr_status_t (*poll)(apr_pool_t *pool, apr_ldap_t *ldap, apr_pollcb_t *poll,
> + apr_interval_time_t timeout, apu_err_t *err);
> + apr_status_t (*bind)(apr_pool_t *pool, apr_ldap_t *ldap,
> + const char *mech, apr_ldap_bind_interact_cb *interact_cb,
> + void *interact_ctx, apr_interval_time_t timeout,
> + apr_ldap_bind_cb bind_cb, void *bind_ctx,
> + apu_err_t *err);
> + apr_status_t (*compare)(apr_pool_t *pool, apr_ldap_t *ldap,
> + const char *dn, const char *attr,
> + const apr_buffer_t *bval,
> + apr_ldap_control_t **serverctrls,
> + apr_ldap_control_t **clientctrls,
> + apr_interval_time_t timeout,
> + apr_ldap_compare_cb compare_cb, void *ctx, apu_err_t *err);
> + apr_status_t (*search)(apr_pool_t *pool, apr_ldap_t *ldap, const char *dn,
> + apr_ldap_search_scope_e scope, const char *filter,
> + const char **attrs, apr_ldap_switch_e attrsonly,
> + apr_ldap_control_t **serverctrls,
> + apr_ldap_control_t **clientctrls,
> + apr_interval_time_t timeout, apr_ssize_t sizelimit,
> + apr_ldap_search_result_cb search_result_cb,
> + apr_ldap_search_entry_cb search_entry_cb,
> + void *search_ctx, apu_err_t *err);
> + apr_status_t (*unbind)(apr_ldap_t *ldap, apr_ldap_control_t **serverctrls,
> + apr_ldap_control_t **clientctrls, apu_err_t *err);
> };
>
> #endif /* APR_HAS_LDAP */
>
>
--
kippdata
informationstechnologie GmbH Tel: 0228 98549 -0
Bornheimer Str. 33a Fax: 0228 98549 -50
53111 Bonn www.kippdata.de
HRB 8018 Amtsgericht Bonn / USt.-IdNr. DE 196 457 417
Geschäftsführer: Dr. Thomas Höfer, Rainer Jung, Sven Maurmann