summaryrefslogtreecommitdiff
path: root/ldap/apr_ldap_stub.c
diff options
context:
space:
mode:
Diffstat (limited to 'ldap/apr_ldap_stub.c')
-rw-r--r--ldap/apr_ldap_stub.c145
1 files changed, 145 insertions, 0 deletions
diff --git a/ldap/apr_ldap_stub.c b/ldap/apr_ldap_stub.c
new file mode 100644
index 0000000..97c1551
--- /dev/null
+++ b/ldap/apr_ldap_stub.c
@@ -0,0 +1,145 @@
+/* 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 "apu.h"
+#include "apu_config.h"
+#include "apr_ldap.h"
+#include "apu_internal.h"
+#include "apr_dso.h"
+#include "apr_errno.h"
+#include "apr_pools.h"
+#include "apr_strings.h"
+#include "apu_version.h"
+
+#if APR_HAS_LDAP
+
+#if APU_DSO_BUILD
+
+static struct apr__ldap_dso_fntable *lfn = NULL;
+
+static apr_status_t load_ldap(apr_pool_t *pool)
+{
+ char *modname;
+ apr_dso_handle_sym_t symbol;
+ apr_status_t rv;
+
+ /* deprecate in 2.0 - permit implicit initialization */
+ apu_dso_init(pool);
+
+ rv = apu_dso_mutex_lock();
+ if (rv) {
+ return rv;
+ }
+
+#if defined(WIN32)
+ modname = "apr_ldap-" APU_STRINGIFY(APU_MAJOR_VERSION) ".dll";
+#else
+ modname = "apr_ldap-" APU_STRINGIFY(APU_MAJOR_VERSION) ".so";
+#endif
+ rv = apu_dso_load(NULL, &symbol, modname, "apr__ldap_fns", pool);
+ if (rv == APR_SUCCESS) {
+ lfn = symbol;
+ }
+ apu_dso_mutex_unlock();
+
+ return rv;
+}
+
+#define LOAD_LDAP_STUB(pool, failres) \
+ if (!lfn && (load_ldap(pool) != APR_SUCCESS)) \
+ return failres;
+
+APU_DECLARE_LDAP(int) apr_ldap_info(apr_pool_t *pool,
+ apr_ldap_err_t **result_err)
+{
+ LOAD_LDAP_STUB(pool, -1);
+ return lfn->info(pool, result_err);
+}
+
+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)
+{
+ LOAD_LDAP_STUB(pool, -1);
+ return lfn->init(pool, ldap, hostname, portno, secure, result_err);
+}
+
+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)
+{
+ LOAD_LDAP_STUB(pool, -1);
+ return lfn->ssl_init(pool, cert_auth_file, cert_file_type, result_err);
+}
+
+APU_DECLARE_LDAP(int) apr_ldap_ssl_deinit(void)
+{
+ if (!lfn)
+ return -1;
+ return lfn->ssl_deinit();
+}
+
+APU_DECLARE_LDAP(int) apr_ldap_get_option(apr_pool_t *pool,
+ LDAP *ldap,
+ int option,
+ void *outvalue,
+ apr_ldap_err_t **result_err)
+{
+ LOAD_LDAP_STUB(pool, -1);
+ return lfn->get_option(pool, ldap, option, outvalue, result_err);
+}
+
+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)
+{
+ LOAD_LDAP_STUB(pool, -1);
+ return lfn->set_option(pool, ldap, option, invalue, result_err);
+}
+
+APU_DECLARE_LDAP(apr_status_t) apr_ldap_rebind_init(apr_pool_t *pool)
+{
+ LOAD_LDAP_STUB(pool, APR_EGENERAL);
+ return lfn->rebind_init(pool);
+}
+
+APU_DECLARE_LDAP(apr_status_t) apr_ldap_rebind_add(apr_pool_t *pool,
+ LDAP *ld,
+ const char *bindDN,
+ const char *bindPW)
+{
+ LOAD_LDAP_STUB(pool, APR_EGENERAL);
+ return lfn->rebind_add(pool, ld, bindDN, bindPW);
+}
+
+APU_DECLARE_LDAP(apr_status_t) apr_ldap_rebind_remove(LDAP *ld)
+{
+ if (!lfn)
+ return APR_EGENERAL;
+ return lfn->rebind_remove(ld);
+}
+
+#endif /* APU_DSO_BUILD */
+
+#endif /* APR_HAS_LDAP */
+