X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=e_os2.h;h=1b71fba7077592b7f4809dce0e28b32b816a29ad;hp=be20eac623e1e15a9ae3064816ad3739bfcbf718;hb=77dd9c1850a35c504c5cfcb2d62c4f362bf9691f;hpb=1961b327eb0e019cedd48c6b2f907ff6c2e3ad17 diff --git a/e_os2.h b/e_os2.h index be20eac623..1b71fba707 100644 --- a/e_os2.h +++ b/e_os2.h @@ -113,6 +113,21 @@ extern "C" { # endif #endif +/* DLL settings. This part is a bit tough, because it's up to the application + implementor how he or she will link the application, so it requires some + macro to be used. */ +#ifdef OPENSSL_SYS_WINDOWS +# ifndef OPENSSL_OPT_WINDLL +# if defined(_WINDLL) /* This is used when building OpenSSL to indicate that + DLL linkage should be used */ +# define OPENSSL_OPT_WINDLL +# elif defined(_DLL) /* This one is used quite much in the VC++ header + files */ +# define OPENSSL_OPT_WINDLL +# endif +# endif +#endif + /* -------------------------------- OpenVMS -------------------------------- */ #if defined(__VMS) || defined(VMS) || defined(OPENSSL_SYSNAME_VMS) # undef OPENSSL_SYS_UNIX @@ -126,7 +141,7 @@ extern "C" { /* --------------------------------- Unix ---------------------------------- */ #ifdef OPENSSL_SYS_UNIX -# if defined(linus) || defined(OPENSSL_SYSNAME_LINUX) +# if defined(linux) || defined(OPENSSL_SYSNAME_LINUX) # define OPENSSL_SYS_LINUX # endif # ifdef OPENSSL_SYSNAME_MPE @@ -189,7 +204,7 @@ extern "C" { # define OPENSSL_EXPORT globalref # define OPENSSL_IMPORT globalref # define OPENSSL_GLOBAL globaldef -#elif defined(OPENSSL_SYS_WINDOWS) +#elif defined(OPENSSL_SYS_WINDOWS) && defined(OPENSSL_OPT_WINDLL) # define OPENSSL_EXPORT extern _declspec(dllexport) # define OPENSSL_IMPORT extern _declspec(dllimport) # define OPENSSL_GLOBAL @@ -200,6 +215,28 @@ extern "C" { #endif #define OPENSSL_EXTERN OPENSSL_IMPORT +/* Macros to allow global variables to be reached through function calls when + required (if a shared library version requvres it, for example. + The way it's done allows definitions like this: + + // in foobar.c + OPENSSL_IMPLEMENT_GLOBAL(int,foobar) = 0; + // in foobar.h + OPENSSL_DECLARE_GLOBAL(int,foobar); + #define foobar OPENSSL_GLOBAL_REF(foobar) +*/ +#ifdef OPENSSL_EXPORT_VAR_AS_FUNCTION +# define OPENSSL_IMPLEMENT_GLOBAL(type,name) extern static type _hide_##name; \ + type *_shadow_##name(void) { static type local_var; return &local_var; } \ + static type _hide_##name +# define OPENSSL_DECLARE_GLOBAL(type,name) type *_shadow_##name(void) +# define OPENSSL_GLOBAL_REF(name) (*(_shadow_##name())) +#else +# define OPENSSL_IMPLEMENT_GLOBAL(type,name) OPENSSL_GLOBAL type _shadow_##name +# define OPENSSL_DECLARE_GLOBAL(type,name) OPENSSL_EXPORT type _shadow_##name +# define OPENSSL_GLOBAL_REF(name) _shadow_##name +#endif + #ifdef __cplusplus } #endif