Integrate ectest.c (which does not yet do anything).
[openssl.git] / e_os2.h
diff --git a/e_os2.h b/e_os2.h
index be20eac623e1e15a9ae3064816ad3739bfcbf718..ed90f222e2180c2c5b20cc5660cd8acfb69ad58a 100644 (file)
--- 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
@@ -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