1/* Licensed to the Apache Software Foundation (ASF) under one or more
2 * contributor license agreements.  See the NOTICE file distributed with
3 * this work for additional information regarding copyright ownership.
4 * The ASF licenses this file to You under the Apache License, Version 2.0
5 * (the "License"); you may not use this file except in compliance with
6 * the License.  You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "apr.h"
18#include "apu.h"
19#include "apu_config.h"
20#include "apr_ldap.h"
21#include "apu_internal.h"
22#include "apr_dso.h"
23#include "apr_errno.h"
24#include "apr_pools.h"
25#include "apr_strings.h"
26#include "apu_version.h"
27
28#if APR_HAS_LDAP
29
30#if APU_DSO_BUILD
31
32static struct apr__ldap_dso_fntable *lfn = NULL;
33
34static apr_status_t load_ldap(apr_pool_t *pool)
35{
36    char *modname;
37    apr_dso_handle_sym_t symbol;
38    apr_status_t rv;
39
40    /* deprecate in 2.0 - permit implicit initialization */
41    apu_dso_init(pool);
42
43    rv = apu_dso_mutex_lock();
44    if (rv) {
45        return rv;
46    }
47
48#if defined(WIN32)
49    modname = "apr_ldap-" APU_STRINGIFY(APU_MAJOR_VERSION) ".dll";
50#else
51    modname = "apr_ldap-" APU_STRINGIFY(APU_MAJOR_VERSION) ".so";
52#endif
53    rv = apu_dso_load(NULL, &symbol, modname, "apr__ldap_fns", pool);
54    if (rv == APR_SUCCESS) {
55        lfn = symbol;
56    }
57    apu_dso_mutex_unlock();
58
59    return rv;
60}
61
62#define LOAD_LDAP_STUB(pool, failres) \
63    if (!lfn && (load_ldap(pool) != APR_SUCCESS)) \
64        return failres;
65
66APU_DECLARE_LDAP(int) apr_ldap_info(apr_pool_t *pool,
67                                    apr_ldap_err_t **result_err)
68{
69    LOAD_LDAP_STUB(pool, -1);
70    return lfn->info(pool, result_err);
71}
72
73APU_DECLARE_LDAP(int) apr_ldap_init(apr_pool_t *pool,
74                                    LDAP **ldap,
75                                    const char *hostname,
76                                    int portno,
77                                    int secure,
78                                    apr_ldap_err_t **result_err)
79{
80    LOAD_LDAP_STUB(pool, -1);
81    return lfn->init(pool, ldap, hostname, portno, secure, result_err);
82}
83
84APU_DECLARE_LDAP(int) apr_ldap_ssl_init(apr_pool_t *pool,
85                                        const char *cert_auth_file,
86                                        int cert_file_type,
87                                        apr_ldap_err_t **result_err)
88{
89    LOAD_LDAP_STUB(pool, -1);
90    return lfn->ssl_init(pool, cert_auth_file, cert_file_type, result_err);
91}
92
93APU_DECLARE_LDAP(int) apr_ldap_ssl_deinit(void)
94{
95    if (!lfn)
96        return -1;
97    return lfn->ssl_deinit();
98}
99
100APU_DECLARE_LDAP(int) apr_ldap_get_option(apr_pool_t *pool,
101                                          LDAP *ldap,
102                                          int option,
103                                          void *outvalue,
104                                          apr_ldap_err_t **result_err)
105{
106    LOAD_LDAP_STUB(pool, -1);
107    return lfn->get_option(pool, ldap, option, outvalue, result_err);
108}
109
110APU_DECLARE_LDAP(int) apr_ldap_set_option(apr_pool_t *pool,
111                                          LDAP *ldap,
112                                          int option,
113                                          const void *invalue,
114                                          apr_ldap_err_t **result_err)
115{
116    LOAD_LDAP_STUB(pool, -1);
117    return lfn->set_option(pool, ldap, option, invalue, result_err);
118}
119
120APU_DECLARE_LDAP(apr_status_t) apr_ldap_rebind_init(apr_pool_t *pool)
121{
122    LOAD_LDAP_STUB(pool, APR_EGENERAL);
123    return lfn->rebind_init(pool);
124}
125
126APU_DECLARE_LDAP(apr_status_t) apr_ldap_rebind_add(apr_pool_t *pool,
127                                                   LDAP *ld,
128                                                   const char *bindDN,
129                                                   const char *bindPW)
130{
131    LOAD_LDAP_STUB(pool, APR_EGENERAL);
132    return lfn->rebind_add(pool, ld, bindDN, bindPW);
133}
134
135APU_DECLARE_LDAP(apr_status_t) apr_ldap_rebind_remove(LDAP *ld)
136{
137    if (!lfn)
138        return APR_EGENERAL;
139    return lfn->rebind_remove(ld);
140}
141
142#endif /* APU_DSO_BUILD */
143
144#endif /* APR_HAS_LDAP */
145
146