1*549b59edSchristos /* $NetBSD: ldap_cdefs.h,v 1.3 2021/08/14 16:14:55 christos Exp $ */ 24e6df137Slukem 3d11b170bStron /* $OpenLDAP$ */ 42de962bdSlukem /* This work is part of OpenLDAP Software <http://www.openldap.org/>. 52de962bdSlukem * 6*549b59edSchristos * Copyright 1998-2021 The OpenLDAP Foundation. 72de962bdSlukem * All rights reserved. 82de962bdSlukem * 92de962bdSlukem * Redistribution and use in source and binary forms, with or without 102de962bdSlukem * modification, are permitted only as authorized by the OpenLDAP 112de962bdSlukem * Public License. 122de962bdSlukem * 132de962bdSlukem * A copy of this license is available in file LICENSE in the 142de962bdSlukem * top-level directory of the distribution or, alternatively, at 152de962bdSlukem * <http://www.OpenLDAP.org/license.html>. 162de962bdSlukem */ 172de962bdSlukem /* LDAP C Defines */ 182de962bdSlukem 192de962bdSlukem #ifndef _LDAP_CDEFS_H 202de962bdSlukem #define _LDAP_CDEFS_H 212de962bdSlukem 222de962bdSlukem #if defined(__cplusplus) || defined(c_plusplus) 232de962bdSlukem # define LDAP_BEGIN_DECL extern "C" { 242de962bdSlukem # define LDAP_END_DECL } 252de962bdSlukem #else 262de962bdSlukem # define LDAP_BEGIN_DECL /* begin declarations */ 272de962bdSlukem # define LDAP_END_DECL /* end declarations */ 282de962bdSlukem #endif 292de962bdSlukem 302de962bdSlukem #if !defined(LDAP_NO_PROTOTYPES) && ( defined(LDAP_NEEDS_PROTOTYPES) || \ 312de962bdSlukem defined(__STDC__) || defined(__cplusplus) || defined(c_plusplus) ) 322de962bdSlukem 332de962bdSlukem /* ANSI C or C++ */ 342de962bdSlukem # define LDAP_P(protos) protos 352de962bdSlukem # define LDAP_CONCAT1(x,y) x ## y 362de962bdSlukem # define LDAP_CONCAT(x,y) LDAP_CONCAT1(x,y) 372de962bdSlukem # define LDAP_STRING(x) #x /* stringify without expanding x */ 382de962bdSlukem # define LDAP_XSTRING(x) LDAP_STRING(x) /* expand x, then stringify */ 392de962bdSlukem 402de962bdSlukem #ifndef LDAP_CONST 412de962bdSlukem # define LDAP_CONST const 422de962bdSlukem #endif 432de962bdSlukem 442de962bdSlukem #else /* no prototypes */ 452de962bdSlukem 462de962bdSlukem /* traditional C */ 472de962bdSlukem # define LDAP_P(protos) () 482de962bdSlukem # define LDAP_CONCAT(x,y) x/**/y 492de962bdSlukem # define LDAP_STRING(x) "x" 502de962bdSlukem 512de962bdSlukem #ifndef LDAP_CONST 522de962bdSlukem # define LDAP_CONST /* no const */ 532de962bdSlukem #endif 542de962bdSlukem 552de962bdSlukem #endif /* no prototypes */ 562de962bdSlukem 572de962bdSlukem #if (__GNUC__) * 1000 + (__GNUC_MINOR__) >= 2006 582de962bdSlukem # define LDAP_GCCATTR(attrs) __attribute__(attrs) 592de962bdSlukem #else 602de962bdSlukem # define LDAP_GCCATTR(attrs) 612de962bdSlukem #endif 622de962bdSlukem 632de962bdSlukem /* 642de962bdSlukem * Support for Windows DLLs. 652de962bdSlukem * 662de962bdSlukem * When external source code includes header files for dynamic libraries, 672de962bdSlukem * the external source code is "importing" DLL symbols into its resulting 682de962bdSlukem * object code. On Windows, symbols imported from DLLs must be explicitly 692de962bdSlukem * indicated in header files with the __declspec(dllimport) directive. 702de962bdSlukem * This is not totally necessary for functions because the compiler 712de962bdSlukem * (gcc or MSVC) will generate stubs when this directive is absent. 722de962bdSlukem * However, this is required for imported variables. 732de962bdSlukem * 742de962bdSlukem * The LDAP libraries, i.e. liblber and libldap, can be built as 752de962bdSlukem * static or shared, based on configuration. Just about all other source 762de962bdSlukem * code in OpenLDAP use these libraries. If the LDAP libraries 772de962bdSlukem * are configured as shared, 'configure' defines the LDAP_LIBS_DYNAMIC 782de962bdSlukem * macro. When other source files include LDAP library headers, the 792de962bdSlukem * LDAP library symbols will automatically be marked as imported. When 802de962bdSlukem * the actual LDAP libraries are being built, the symbols will not 812de962bdSlukem * be marked as imported because the LBER_LIBRARY or LDAP_LIBRARY macros 822de962bdSlukem * will be respectively defined. 832de962bdSlukem * 842de962bdSlukem * Any project outside of OpenLDAP with source code wanting to use 852de962bdSlukem * LDAP dynamic libraries should explicitly define LDAP_LIBS_DYNAMIC. 862de962bdSlukem * This will ensure that external source code appropriately marks symbols 872de962bdSlukem * that will be imported. 882de962bdSlukem * 892de962bdSlukem * The slapd executable, itself, can be used as a dynamic library. 902de962bdSlukem * For example, if a backend module is compiled as shared, it will 912de962bdSlukem * import symbols from slapd. When this happens, the slapd symbols 922de962bdSlukem * must be marked as imported in header files that the backend module 932de962bdSlukem * includes. Remember that slapd links with various static libraries. 942de962bdSlukem * If the LDAP libraries were configured as static, their object 952de962bdSlukem * code is also part of the monolithic slapd executable. Thus, when 962de962bdSlukem * a backend module imports symbols from slapd, it imports symbols from 972de962bdSlukem * all of the static libraries in slapd as well. Thus, the SLAP_IMPORT 982de962bdSlukem * macro, when defined, will appropriately mark symbols as imported. 992de962bdSlukem * This macro should be used by shared backend modules as well as any 1002de962bdSlukem * other external source code that imports symbols from the slapd 1012de962bdSlukem * executable as if it were a DLL. 1022de962bdSlukem * 1032de962bdSlukem * Note that we don't actually have to worry about using the 1042de962bdSlukem * __declspec(dllexport) directive anywhere. This is because both 1052de962bdSlukem * MSVC and Mingw provide alternate (more effective) methods for exporting 1062de962bdSlukem * symbols out of binaries, i.e. the use of a DEF file. 1072de962bdSlukem * 1082de962bdSlukem * NOTE ABOUT BACKENDS: Backends can be configured as static or dynamic. 1092de962bdSlukem * When a backend is configured as dynamic, slapd will load the backend 1102de962bdSlukem * explicitly and populate function pointer structures by calling 1112de962bdSlukem * the backend's well-known initialization function. Because of this 1122de962bdSlukem * procedure, slapd never implicitly imports symbols from dynamic backends. 1132de962bdSlukem * This makes it unnecessary to tag various backend functions with the 1142de962bdSlukem * __declspec(dllimport) directive. This is because neither slapd nor 1152de962bdSlukem * any other external binary should ever be implicitly loading a backend 1162de962bdSlukem * dynamic module. 1172de962bdSlukem * 1182de962bdSlukem * Backends are supposed to be self-contained. However, it appears that 1192de962bdSlukem * back-meta DOES implicitly import symbols from back-ldap. This means 1202de962bdSlukem * that the __declspec(dllimport) directive should be marked on back-ldap 1212de962bdSlukem * functions (in its header files) if and only if we're compiling for 1222de962bdSlukem * windows AND back-ldap has been configured as dynamic AND back-meta 1232de962bdSlukem * is the client of back-ldap. When client is slapd, there is no effect 1242de962bdSlukem * since slapd does not implicitly import symbols. 1252de962bdSlukem * 1262de962bdSlukem * TODO(?): Currently, back-meta nor back-ldap is supported for Mingw32. 1272de962bdSlukem * Thus, there's no need to worry about this right now. This is something that 1282de962bdSlukem * may or may not have to be addressed in the future. 1292de962bdSlukem */ 1302de962bdSlukem 1312de962bdSlukem /* LBER library */ 1322de962bdSlukem #if defined(_WIN32) && \ 1332de962bdSlukem ((defined(LDAP_LIBS_DYNAMIC) && !defined(LBER_LIBRARY)) || \ 1342de962bdSlukem (!defined(LDAP_LIBS_DYNAMIC) && defined(SLAPD_IMPORT))) 1352de962bdSlukem # define LBER_F(type) extern __declspec(dllimport) type 1362de962bdSlukem # define LBER_V(type) extern __declspec(dllimport) type 1372de962bdSlukem #else 1382de962bdSlukem # define LBER_F(type) extern type 1392de962bdSlukem # define LBER_V(type) extern type 1402de962bdSlukem #endif 1412de962bdSlukem 1422de962bdSlukem /* LDAP library */ 1432de962bdSlukem #if defined(_WIN32) && \ 1442de962bdSlukem ((defined(LDAP_LIBS_DYNAMIC) && !defined(LDAP_LIBRARY)) || \ 1452de962bdSlukem (!defined(LDAP_LIBS_DYNAMIC) && defined(SLAPD_IMPORT))) 1462de962bdSlukem # define LDAP_F(type) extern __declspec(dllimport) type 1472de962bdSlukem # define LDAP_V(type) extern __declspec(dllimport) type 1482de962bdSlukem #else 1492de962bdSlukem # define LDAP_F(type) extern type 1502de962bdSlukem # define LDAP_V(type) extern type 1512de962bdSlukem #endif 1522de962bdSlukem 1532de962bdSlukem /* AVL library */ 1542de962bdSlukem #if defined(_WIN32) && defined(SLAPD_IMPORT) 1552de962bdSlukem # define LDAP_AVL_F(type) extern __declspec(dllimport) type 1562de962bdSlukem # define LDAP_AVL_V(type) extern __declspec(dllimport) type 1572de962bdSlukem #else 1582de962bdSlukem # define LDAP_AVL_F(type) extern type 1592de962bdSlukem # define LDAP_AVL_V(type) extern type 1602de962bdSlukem #endif 1612de962bdSlukem 1622de962bdSlukem /* LDIF library */ 1632de962bdSlukem #if defined(_WIN32) && defined(SLAPD_IMPORT) 1642de962bdSlukem # define LDAP_LDIF_F(type) extern __declspec(dllimport) type 1652de962bdSlukem # define LDAP_LDIF_V(type) extern __declspec(dllimport) type 1662de962bdSlukem #else 1672de962bdSlukem # define LDAP_LDIF_F(type) extern type 1682de962bdSlukem # define LDAP_LDIF_V(type) extern type 1692de962bdSlukem #endif 1702de962bdSlukem 1712de962bdSlukem /* LUNICODE library */ 1722de962bdSlukem #if defined(_WIN32) && defined(SLAPD_IMPORT) 1732de962bdSlukem # define LDAP_LUNICODE_F(type) extern __declspec(dllimport) type 1742de962bdSlukem # define LDAP_LUNICODE_V(type) extern __declspec(dllimport) type 1752de962bdSlukem #else 1762de962bdSlukem # define LDAP_LUNICODE_F(type) extern type 1772de962bdSlukem # define LDAP_LUNICODE_V(type) extern type 1782de962bdSlukem #endif 1792de962bdSlukem 1802de962bdSlukem /* LUTIL library */ 1812de962bdSlukem #if defined(_WIN32) && defined(SLAPD_IMPORT) 1822de962bdSlukem # define LDAP_LUTIL_F(type) extern __declspec(dllimport) type 1832de962bdSlukem # define LDAP_LUTIL_V(type) extern __declspec(dllimport) type 1842de962bdSlukem #else 1852de962bdSlukem # define LDAP_LUTIL_F(type) extern type 1862de962bdSlukem # define LDAP_LUTIL_V(type) extern type 1872de962bdSlukem #endif 1882de962bdSlukem 1892de962bdSlukem /* REWRITE library */ 1902de962bdSlukem #if defined(_WIN32) && defined(SLAPD_IMPORT) 1912de962bdSlukem # define LDAP_REWRITE_F(type) extern __declspec(dllimport) type 1922de962bdSlukem # define LDAP_REWRITE_V(type) extern __declspec(dllimport) type 1932de962bdSlukem #else 1942de962bdSlukem # define LDAP_REWRITE_F(type) extern type 1952de962bdSlukem # define LDAP_REWRITE_V(type) extern type 1962de962bdSlukem #endif 1972de962bdSlukem 1982de962bdSlukem /* SLAPD (as a dynamic library exporting symbols) */ 1992de962bdSlukem #if defined(_WIN32) && defined(SLAPD_IMPORT) 2002de962bdSlukem # define LDAP_SLAPD_F(type) extern __declspec(dllimport) type 2012de962bdSlukem # define LDAP_SLAPD_V(type) extern __declspec(dllimport) type 2022de962bdSlukem #else 2032de962bdSlukem # define LDAP_SLAPD_F(type) extern type 2042de962bdSlukem # define LDAP_SLAPD_V(type) extern type 2052de962bdSlukem #endif 2062de962bdSlukem 2072de962bdSlukem /* SLAPD (as a dynamic library exporting symbols) */ 2082de962bdSlukem #if defined(_WIN32) && defined(SLAPD_IMPORT) 2092de962bdSlukem # define LDAP_SLAPI_F(type) extern __declspec(dllimport) type 2102de962bdSlukem # define LDAP_SLAPI_V(type) extern __declspec(dllimport) type 2112de962bdSlukem #else 2122de962bdSlukem # define LDAP_SLAPI_F(type) extern type 2132de962bdSlukem # define LDAP_SLAPI_V(type) extern type 2142de962bdSlukem #endif 2152de962bdSlukem 2162de962bdSlukem /* SLAPD (as a dynamic library exporting symbols) */ 2172de962bdSlukem #if defined(_WIN32) && defined(SLAPD_IMPORT) 2182de962bdSlukem # define SLAPI_F(type) extern __declspec(dllimport) type 2192de962bdSlukem # define SLAPI_V(type) extern __declspec(dllimport) type 2202de962bdSlukem #else 2212de962bdSlukem # define SLAPI_F(type) extern type 2222de962bdSlukem # define SLAPI_V(type) extern type 2232de962bdSlukem #endif 2242de962bdSlukem 2252de962bdSlukem /* 2262de962bdSlukem * C library. Mingw32 links with the dynamic C run-time library by default, 2272de962bdSlukem * so the explicit definition of CSTATIC will keep dllimport from 2282de962bdSlukem * being defined, if desired. 2292de962bdSlukem * 2302de962bdSlukem * MSVC defines the _DLL macro when the compiler is invoked with /MD or /MDd, 2312de962bdSlukem * which means the resulting object code will be linked with the dynamic 2322de962bdSlukem * C run-time library. 2332de962bdSlukem * 2342de962bdSlukem * Technically, it shouldn't be necessary to redefine any functions that 2352de962bdSlukem * the headers for the C library should already contain. Nevertheless, this 2362de962bdSlukem * is here as a safe-guard. 2372de962bdSlukem * 2382de962bdSlukem * TODO: Determine if these macros ever get expanded for Windows. If not, 2392de962bdSlukem * the declspec expansion can probably be removed. 2402de962bdSlukem */ 2412de962bdSlukem #if (defined(__MINGW32__) && !defined(CSTATIC)) || \ 2422de962bdSlukem (defined(_MSC_VER) && defined(_DLL)) 2432de962bdSlukem # define LDAP_LIBC_F(type) extern __declspec(dllimport) type 2442de962bdSlukem # define LDAP_LIBC_V(type) extern __declspec(dllimport) type 2452de962bdSlukem #else 2462de962bdSlukem # define LDAP_LIBC_F(type) extern type 2472de962bdSlukem # define LDAP_LIBC_V(type) extern type 2482de962bdSlukem #endif 2492de962bdSlukem 2502de962bdSlukem #endif /* _LDAP_CDEFS_H */ 251