Home | History | Annotate | Line # | Download | only in include
      1 /*	$NetBSD: ldap_cdefs.h,v 1.4 2025/09/05 21:16:19 christos Exp $	*/
      2 
      3 /* $OpenLDAP$ */
      4 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
      5  *
      6  * Copyright 1998-2024 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