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