| 1 | /*	$NetBSD: ldap_cdefs.h,v 1.1.1.6 2018/02/06 01:53:05 christos Exp $	*/ | 
| 2 |  | 
| 3 | /* $OpenLDAP$ */ | 
| 4 | /* This work is part of OpenLDAP Software <http://www.openldap.org/>. | 
| 5 |  *  | 
| 6 |  * Copyright 1998-2017 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 |  |