Warning: That file was not part of the compilation database. It may have many parsing errors.

1/* $OpenLDAP$ */
2/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
3 *
4 * Copyright 1998-2014 The OpenLDAP Foundation.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted only as authorized by the OpenLDAP
9 * Public License.
10 *
11 * A copy of this license is available in file LICENSE in the
12 * top-level directory of the distribution or, alternatively, at
13 * <http://www.OpenLDAP.org/license.html>.
14 */
15/* LDAP C Defines */
16
17#ifndef _LDAP_CDEFS_H
18#define _LDAP_CDEFS_H
19
20#if defined(__cplusplus) || defined(c_plusplus)
21# define LDAP_BEGIN_DECL extern "C" {
22# define LDAP_END_DECL }
23#else
24# define LDAP_BEGIN_DECL /* begin declarations */
25# define LDAP_END_DECL /* end declarations */
26#endif
27
28#if !defined(LDAP_NO_PROTOTYPES) && ( defined(LDAP_NEEDS_PROTOTYPES) || \
29 defined(__STDC__) || defined(__cplusplus) || defined(c_plusplus) )
30
31 /* ANSI C or C++ */
32# define LDAP_P(protos) protos
33# define LDAP_CONCAT1(x,y) x ## y
34# define LDAP_CONCAT(x,y) LDAP_CONCAT1(x,y)
35# define LDAP_STRING(x) #x /* stringify without expanding x */
36# define LDAP_XSTRING(x) LDAP_STRING(x) /* expand x, then stringify */
37
38#ifndef LDAP_CONST
39# define LDAP_CONST const
40#endif
41
42#else /* no prototypes */
43
44 /* traditional C */
45# define LDAP_P(protos) ()
46# define LDAP_CONCAT(x,y) x/**/y
47# define LDAP_STRING(x) "x"
48
49#ifndef LDAP_CONST
50# define LDAP_CONST /* no const */
51#endif
52
53#endif /* no prototypes */
54
55#if (__GNUC__) * 1000 + (__GNUC_MINOR__) >= 2006
56# define LDAP_GCCATTR(attrs) __attribute__(attrs)
57#else
58# define LDAP_GCCATTR(attrs)
59#endif
60
61/*
62 * Support for Windows DLLs.
63 *
64 * When external source code includes header files for dynamic libraries,
65 * the external source code is "importing" DLL symbols into its resulting
66 * object code. On Windows, symbols imported from DLLs must be explicitly
67 * indicated in header files with the __declspec(dllimport) directive.
68 * This is not totally necessary for functions because the compiler
69 * (gcc or MSVC) will generate stubs when this directive is absent.
70 * However, this is required for imported variables.
71 *
72 * The LDAP libraries, i.e. liblber and libldap, can be built as
73 * static or shared, based on configuration. Just about all other source
74 * code in OpenLDAP use these libraries. If the LDAP libraries
75 * are configured as shared, 'configure' defines the LDAP_LIBS_DYNAMIC
76 * macro. When other source files include LDAP library headers, the
77 * LDAP library symbols will automatically be marked as imported. When
78 * the actual LDAP libraries are being built, the symbols will not
79 * be marked as imported because the LBER_LIBRARY or LDAP_LIBRARY macros
80 * will be respectively defined.
81 *
82 * Any project outside of OpenLDAP with source code wanting to use
83 * LDAP dynamic libraries should explicitly define LDAP_LIBS_DYNAMIC.
84 * This will ensure that external source code appropriately marks symbols
85 * that will be imported.
86 *
87 * The slapd executable, itself, can be used as a dynamic library.
88 * For example, if a backend module is compiled as shared, it will
89 * import symbols from slapd. When this happens, the slapd symbols
90 * must be marked as imported in header files that the backend module
91 * includes. Remember that slapd links with various static libraries.
92 * If the LDAP libraries were configured as static, their object
93 * code is also part of the monolithic slapd executable. Thus, when
94 * a backend module imports symbols from slapd, it imports symbols from
95 * all of the static libraries in slapd as well. Thus, the SLAP_IMPORT
96 * macro, when defined, will appropriately mark symbols as imported.
97 * This macro should be used by shared backend modules as well as any
98 * other external source code that imports symbols from the slapd
99 * executable as if it were a DLL.
100 *
101 * Note that we don't actually have to worry about using the
102 * __declspec(dllexport) directive anywhere. This is because both
103 * MSVC and Mingw provide alternate (more effective) methods for exporting
104 * symbols out of binaries, i.e. the use of a DEF file.
105 *
106 * NOTE ABOUT BACKENDS: Backends can be configured as static or dynamic.
107 * When a backend is configured as dynamic, slapd will load the backend
108 * explicitly and populate function pointer structures by calling
109 * the backend's well-known initialization function. Because of this
110 * procedure, slapd never implicitly imports symbols from dynamic backends.
111 * This makes it unnecessary to tag various backend functions with the
112 * __declspec(dllimport) directive. This is because neither slapd nor
113 * any other external binary should ever be implicitly loading a backend
114 * dynamic module.
115 *
116 * Backends are supposed to be self-contained. However, it appears that
117 * back-meta DOES implicitly import symbols from back-ldap. This means
118 * that the __declspec(dllimport) directive should be marked on back-ldap
119 * functions (in its header files) if and only if we're compiling for
120 * windows AND back-ldap has been configured as dynamic AND back-meta
121 * is the client of back-ldap. When client is slapd, there is no effect
122 * since slapd does not implicitly import symbols.
123 *
124 * TODO(?): Currently, back-meta nor back-ldap is supported for Mingw32.
125 * Thus, there's no need to worry about this right now. This is something that
126 * may or may not have to be addressed in the future.
127 */
128
129/* LBER library */
130#if defined(_WIN32) && \
131 ((defined(LDAP_LIBS_DYNAMIC) && !defined(LBER_LIBRARY)) || \
132 (!defined(LDAP_LIBS_DYNAMIC) && defined(SLAPD_IMPORT)))
133# define LBER_F(type) extern __declspec(dllimport) type
134# define LBER_V(type) extern __declspec(dllimport) type
135#else
136# define LBER_F(type) extern type
137# define LBER_V(type) extern type
138#endif
139
140/* LDAP library */
141#if defined(_WIN32) && \
142 ((defined(LDAP_LIBS_DYNAMIC) && !defined(LDAP_LIBRARY)) || \
143 (!defined(LDAP_LIBS_DYNAMIC) && defined(SLAPD_IMPORT)))
144# define LDAP_F(type) extern __declspec(dllimport) type
145# define LDAP_V(type) extern __declspec(dllimport) type
146#else
147# define LDAP_F(type) extern type
148# define LDAP_V(type) extern type
149#endif
150
151/* AVL library */
152#if defined(_WIN32) && defined(SLAPD_IMPORT)
153# define LDAP_AVL_F(type) extern __declspec(dllimport) type
154# define LDAP_AVL_V(type) extern __declspec(dllimport) type
155#else
156# define LDAP_AVL_F(type) extern type
157# define LDAP_AVL_V(type) extern type
158#endif
159
160/* LDIF library */
161#if defined(_WIN32) && defined(SLAPD_IMPORT)
162# define LDAP_LDIF_F(type) extern __declspec(dllimport) type
163# define LDAP_LDIF_V(type) extern __declspec(dllimport) type
164#else
165# define LDAP_LDIF_F(type) extern type
166# define LDAP_LDIF_V(type) extern type
167#endif
168
169/* LUNICODE library */
170#if defined(_WIN32) && defined(SLAPD_IMPORT)
171# define LDAP_LUNICODE_F(type) extern __declspec(dllimport) type
172# define LDAP_LUNICODE_V(type) extern __declspec(dllimport) type
173#else
174# define LDAP_LUNICODE_F(type) extern type
175# define LDAP_LUNICODE_V(type) extern type
176#endif
177
178/* LUTIL library */
179#if defined(_WIN32) && defined(SLAPD_IMPORT)
180# define LDAP_LUTIL_F(type) extern __declspec(dllimport) type
181# define LDAP_LUTIL_V(type) extern __declspec(dllimport) type
182#else
183# define LDAP_LUTIL_F(type) extern type
184# define LDAP_LUTIL_V(type) extern type
185#endif
186
187/* REWRITE library */
188#if defined(_WIN32) && defined(SLAPD_IMPORT)
189# define LDAP_REWRITE_F(type) extern __declspec(dllimport) type
190# define LDAP_REWRITE_V(type) extern __declspec(dllimport) type
191#else
192# define LDAP_REWRITE_F(type) extern type
193# define LDAP_REWRITE_V(type) extern type
194#endif
195
196/* SLAPD (as a dynamic library exporting symbols) */
197#if defined(_WIN32) && defined(SLAPD_IMPORT)
198# define LDAP_SLAPD_F(type) extern __declspec(dllimport) type
199# define LDAP_SLAPD_V(type) extern __declspec(dllimport) type
200#else
201# define LDAP_SLAPD_F(type) extern type
202# define LDAP_SLAPD_V(type) extern type
203#endif
204
205/* SLAPD (as a dynamic library exporting symbols) */
206#if defined(_WIN32) && defined(SLAPD_IMPORT)
207# define LDAP_SLAPI_F(type) extern __declspec(dllimport) type
208# define LDAP_SLAPI_V(type) extern __declspec(dllimport) type
209#else
210# define LDAP_SLAPI_F(type) extern type
211# define LDAP_SLAPI_V(type) extern type
212#endif
213
214/* SLAPD (as a dynamic library exporting symbols) */
215#if defined(_WIN32) && defined(SLAPD_IMPORT)
216# define SLAPI_F(type) extern __declspec(dllimport) type
217# define SLAPI_V(type) extern __declspec(dllimport) type
218#else
219# define SLAPI_F(type) extern type
220# define SLAPI_V(type) extern type
221#endif
222
223/*
224 * C library. Mingw32 links with the dynamic C run-time library by default,
225 * so the explicit definition of CSTATIC will keep dllimport from
226 * being defined, if desired.
227 *
228 * MSVC defines the _DLL macro when the compiler is invoked with /MD or /MDd,
229 * which means the resulting object code will be linked with the dynamic
230 * C run-time library.
231 *
232 * Technically, it shouldn't be necessary to redefine any functions that
233 * the headers for the C library should already contain. Nevertheless, this
234 * is here as a safe-guard.
235 *
236 * TODO: Determine if these macros ever get expanded for Windows. If not,
237 * the declspec expansion can probably be removed.
238 */
239#if (defined(__MINGW32__) && !defined(CSTATIC)) || \
240 (defined(_MSC_VER) && defined(_DLL))
241# define LDAP_LIBC_F(type) extern __declspec(dllimport) type
242# define LDAP_LIBC_V(type) extern __declspec(dllimport) type
243#else
244# define LDAP_LIBC_F(type) extern type
245# define LDAP_LIBC_V(type) extern type
246#endif
247
248#endif /* _LDAP_CDEFS_H */
249

Warning: That file was not part of the compilation database. It may have many parsing errors.