| 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 | |