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