Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wine-mirror
GitHub Repository: wine-mirror/wine
Path: blob/master/libs/ldap/include/ldap_cdefs.h
4394 views
1
/* $OpenLDAP$ */
2
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
3
*
4
* Copyright 1998-2024 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
250