1251876Speter/* Licensed to the Apache Software Foundation (ASF) under one or more
2251876Speter * contributor license agreements.  See the NOTICE file distributed with
3251876Speter * this work for additional information regarding copyright ownership.
4251876Speter * The ASF licenses this file to You under the Apache License, Version 2.0
5251876Speter * (the "License"); you may not use this file except in compliance with
6251876Speter * the License.  You may obtain a copy of the License at
7251876Speter *
8251876Speter *     http://www.apache.org/licenses/LICENSE-2.0
9251876Speter *
10251876Speter * Unless required by applicable law or agreed to in writing, software
11251876Speter * distributed under the License is distributed on an "AS IS" BASIS,
12251876Speter * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13251876Speter * See the License for the specific language governing permissions and
14251876Speter * limitations under the License.
15251876Speter */
16251876Speter
17251876Speter#include "apr.h"
18251876Speter#include "apu.h"
19251876Speter#include "apu_config.h"
20251876Speter#include "apr_ldap.h"
21251876Speter#include "apu_internal.h"
22251876Speter#include "apr_dso.h"
23251876Speter#include "apr_errno.h"
24251876Speter#include "apr_pools.h"
25251876Speter#include "apr_strings.h"
26251876Speter#include "apu_version.h"
27251876Speter
28251876Speter#if APR_HAS_LDAP
29251876Speter
30251876Speter#if APU_DSO_BUILD
31251876Speter
32251876Speterstatic struct apr__ldap_dso_fntable *lfn = NULL;
33251876Speter
34251876Speterstatic apr_status_t load_ldap(apr_pool_t *pool)
35251876Speter{
36251876Speter    char *modname;
37251876Speter    apr_dso_handle_sym_t symbol;
38251876Speter    apr_status_t rv;
39251876Speter
40251876Speter    /* deprecate in 2.0 - permit implicit initialization */
41251876Speter    apu_dso_init(pool);
42251876Speter
43251876Speter    rv = apu_dso_mutex_lock();
44251876Speter    if (rv) {
45251876Speter        return rv;
46251876Speter    }
47251876Speter
48251876Speter#if defined(WIN32)
49251876Speter    modname = "apr_ldap-" APU_STRINGIFY(APU_MAJOR_VERSION) ".dll";
50251876Speter#else
51251876Speter    modname = "apr_ldap-" APU_STRINGIFY(APU_MAJOR_VERSION) ".so";
52251876Speter#endif
53251876Speter    rv = apu_dso_load(NULL, &symbol, modname, "apr__ldap_fns", pool);
54251876Speter    if (rv == APR_SUCCESS) {
55251876Speter        lfn = symbol;
56251876Speter    }
57251876Speter    apu_dso_mutex_unlock();
58251876Speter
59251876Speter    return rv;
60251876Speter}
61251876Speter
62251876Speter#define LOAD_LDAP_STUB(pool, failres) \
63251876Speter    if (!lfn && (load_ldap(pool) != APR_SUCCESS)) \
64251876Speter        return failres;
65251876Speter
66251876SpeterAPU_DECLARE_LDAP(int) apr_ldap_info(apr_pool_t *pool,
67251876Speter                                    apr_ldap_err_t **result_err)
68251876Speter{
69251876Speter    LOAD_LDAP_STUB(pool, -1);
70251876Speter    return lfn->info(pool, result_err);
71251876Speter}
72251876Speter
73251876SpeterAPU_DECLARE_LDAP(int) apr_ldap_init(apr_pool_t *pool,
74251876Speter                                    LDAP **ldap,
75251876Speter                                    const char *hostname,
76251876Speter                                    int portno,
77251876Speter                                    int secure,
78251876Speter                                    apr_ldap_err_t **result_err)
79251876Speter{
80251876Speter    LOAD_LDAP_STUB(pool, -1);
81251876Speter    return lfn->init(pool, ldap, hostname, portno, secure, result_err);
82251876Speter}
83251876Speter
84251876SpeterAPU_DECLARE_LDAP(int) apr_ldap_ssl_init(apr_pool_t *pool,
85251876Speter                                        const char *cert_auth_file,
86251876Speter                                        int cert_file_type,
87251876Speter                                        apr_ldap_err_t **result_err)
88251876Speter{
89251876Speter    LOAD_LDAP_STUB(pool, -1);
90251876Speter    return lfn->ssl_init(pool, cert_auth_file, cert_file_type, result_err);
91251876Speter}
92251876Speter
93251876SpeterAPU_DECLARE_LDAP(int) apr_ldap_ssl_deinit(void)
94251876Speter{
95251876Speter    if (!lfn)
96251876Speter        return -1;
97251876Speter    return lfn->ssl_deinit();
98251876Speter}
99251876Speter
100251876SpeterAPU_DECLARE_LDAP(int) apr_ldap_get_option(apr_pool_t *pool,
101251876Speter                                          LDAP *ldap,
102251876Speter                                          int option,
103251876Speter                                          void *outvalue,
104251876Speter                                          apr_ldap_err_t **result_err)
105251876Speter{
106251876Speter    LOAD_LDAP_STUB(pool, -1);
107251876Speter    return lfn->get_option(pool, ldap, option, outvalue, result_err);
108251876Speter}
109251876Speter
110251876SpeterAPU_DECLARE_LDAP(int) apr_ldap_set_option(apr_pool_t *pool,
111251876Speter                                          LDAP *ldap,
112251876Speter                                          int option,
113251876Speter                                          const void *invalue,
114251876Speter                                          apr_ldap_err_t **result_err)
115251876Speter{
116251876Speter    LOAD_LDAP_STUB(pool, -1);
117251876Speter    return lfn->set_option(pool, ldap, option, invalue, result_err);
118251876Speter}
119251876Speter
120251876SpeterAPU_DECLARE_LDAP(apr_status_t) apr_ldap_rebind_init(apr_pool_t *pool)
121251876Speter{
122251876Speter    LOAD_LDAP_STUB(pool, APR_EGENERAL);
123251876Speter    return lfn->rebind_init(pool);
124251876Speter}
125251876Speter
126251876SpeterAPU_DECLARE_LDAP(apr_status_t) apr_ldap_rebind_add(apr_pool_t *pool,
127251876Speter                                                   LDAP *ld,
128251876Speter                                                   const char *bindDN,
129251876Speter                                                   const char *bindPW)
130251876Speter{
131251876Speter    LOAD_LDAP_STUB(pool, APR_EGENERAL);
132251876Speter    return lfn->rebind_add(pool, ld, bindDN, bindPW);
133251876Speter}
134251876Speter
135251876SpeterAPU_DECLARE_LDAP(apr_status_t) apr_ldap_rebind_remove(LDAP *ld)
136251876Speter{
137251876Speter    if (!lfn)
138251876Speter        return APR_EGENERAL;
139251876Speter    return lfn->rebind_remove(ld);
140251876Speter}
141251876Speter
142251876Speter#endif /* APU_DSO_BUILD */
143251876Speter
144251876Speter#endif /* APR_HAS_LDAP */
145251876Speter
146