xref: /netbsd-src/external/bsd/openldap/dist/include/ldap_cdefs.h (revision 549b59ed3ccf0d36d3097190a0db27b770f3a839)
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