williamr@2: /* e_os2.h */ williamr@2: /* ==================================================================== williamr@2: * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved. williamr@2: * williamr@2: * Redistribution and use in source and binary forms, with or without williamr@2: * modification, are permitted provided that the following conditions williamr@2: * are met: williamr@2: * williamr@2: * 1. Redistributions of source code must retain the above copyright williamr@2: * notice, this list of conditions and the following disclaimer. williamr@2: * williamr@2: * 2. Redistributions in binary form must reproduce the above copyright williamr@2: * notice, this list of conditions and the following disclaimer in williamr@2: * the documentation and/or other materials provided with the williamr@2: * distribution. williamr@2: * williamr@2: * 3. All advertising materials mentioning features or use of this williamr@2: * software must display the following acknowledgment: williamr@2: * "This product includes software developed by the OpenSSL Project williamr@2: * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" williamr@2: * williamr@2: * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to williamr@2: * endorse or promote products derived from this software without williamr@2: * prior written permission. For written permission, please contact williamr@2: * openssl-core@openssl.org. williamr@2: * williamr@2: * 5. Products derived from this software may not be called "OpenSSL" williamr@2: * nor may "OpenSSL" appear in their names without prior written williamr@2: * permission of the OpenSSL Project. williamr@2: * williamr@2: * 6. Redistributions of any form whatsoever must retain the following williamr@2: * acknowledgment: williamr@2: * "This product includes software developed by the OpenSSL Project williamr@2: * for use in the OpenSSL Toolkit (http://www.openssl.org/)" williamr@2: * williamr@2: * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY williamr@2: * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE williamr@2: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR williamr@2: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR williamr@2: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, williamr@2: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT williamr@2: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; williamr@2: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) williamr@2: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, williamr@2: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) williamr@2: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED williamr@2: * OF THE POSSIBILITY OF SUCH DAMAGE. williamr@2: * ==================================================================== williamr@2: * williamr@2: * This product includes cryptographic software written by Eric Young williamr@2: * (eay@cryptsoft.com). This product includes software written by Tim williamr@2: * Hudson (tjh@cryptsoft.com). williamr@2: * williamr@2: */ williamr@2: /* williamr@2: © Portions copyright (c) 2006 Nokia Corporation. All rights reserved. williamr@2: */ williamr@2: williamr@2: #include williamr@2: williamr@2: williamr@2: #ifndef HEADER_E_OS2_H williamr@2: #define HEADER_E_OS2_H williamr@2: williamr@2: #if (defined(__SYMBIAN32__) && !defined(SYMBIAN)) williamr@2: #define SYMBIAN williamr@2: #endif williamr@2: williamr@2: #ifdef __cplusplus williamr@2: extern "C" { williamr@2: #endif williamr@2: williamr@2: /****************************************************************************** williamr@2: * Detect operating systems. This probably needs completing. williamr@2: * The result is that at least one OPENSSL_SYS_os macro should be defined. williamr@2: * However, if none is defined, Unix is assumed. williamr@2: **/ williamr@2: williamr@2: #define OPENSSL_SYS_UNIX williamr@2: #ifndef SYMBIAN williamr@2: /* ----------------------- Macintosh, before MacOS X ----------------------- */ williamr@2: #if defined(__MWERKS__) && defined(macintosh) || defined(OPENSSL_SYSNAME_MAC) williamr@2: # undef OPENSSL_SYS_UNIX williamr@2: # define OPENSSL_SYS_MACINTOSH_CLASSIC williamr@2: #endif williamr@2: williamr@2: /* ----------------------- NetWare ----------------------------------------- */ williamr@2: #if defined(NETWARE) || defined(OPENSSL_SYSNAME_NETWARE) williamr@2: # undef OPENSSL_SYS_UNIX williamr@2: # define OPENSSL_SYS_NETWARE williamr@2: #endif williamr@2: williamr@2: /* ---------------------- Microsoft operating systems ---------------------- */ williamr@2: williamr@2: /* For 32 bit environment, there seems to be the CygWin environment and then williamr@2: all the others that try to do the same thing Microsoft does... */ williamr@2: #if defined(OPENSSL_SYSNAME_UWIN) williamr@2: # undef OPENSSL_SYS_UNIX williamr@2: # define OPENSSL_SYS_WIN32_UWIN williamr@2: #else williamr@2: # if defined(__CYGWIN32__) || defined(OPENSSL_SYSNAME_CYGWIN32) williamr@2: # undef OPENSSL_SYS_UNIX williamr@2: # define OPENSSL_SYS_WIN32_CYGWIN williamr@2: # else williamr@2: # if defined(_WIN32) || defined(OPENSSL_SYSNAME_WIN32) williamr@2: # undef OPENSSL_SYS_UNIX williamr@2: # define OPENSSL_SYS_WIN32 williamr@2: # endif williamr@2: # if defined(OPENSSL_SYSNAME_WINNT) williamr@2: # undef OPENSSL_SYS_UNIX williamr@2: # define OPENSSL_SYS_WINNT williamr@2: # endif williamr@2: # if defined(OPENSSL_SYSNAME_WINCE) williamr@2: # undef OPENSSL_SYS_UNIX williamr@2: # define OPENSSL_SYS_WINCE williamr@2: # endif williamr@2: # endif williamr@2: #endif williamr@2: williamr@2: /* Anything that tries to look like Microsoft is "Windows" */ williamr@2: #if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_WINNT) || defined(OPENSSL_SYS_WINCE) williamr@2: # undef OPENSSL_SYS_UNIX williamr@2: # define OPENSSL_SYS_WINDOWS williamr@2: # ifndef OPENSSL_SYS_MSDOS williamr@2: # define OPENSSL_SYS_MSDOS williamr@2: # endif williamr@2: #endif williamr@2: williamr@2: /* DLL settings. This part is a bit tough, because it's up to the application williamr@2: implementor how he or she will link the application, so it requires some williamr@2: macro to be used. */ williamr@2: #ifdef OPENSSL_SYS_WINDOWS williamr@2: # ifndef OPENSSL_OPT_WINDLL williamr@2: # if defined(_WINDLL) /* This is used when building OpenSSL to indicate that williamr@2: DLL linkage should be used */ williamr@2: # define OPENSSL_OPT_WINDLL williamr@2: # endif williamr@2: # endif williamr@2: #endif williamr@2: williamr@2: /* -------------------------------- OpenVMS -------------------------------- */ williamr@2: #if defined(__VMS) || defined(VMS) || defined(OPENSSL_SYSNAME_VMS) williamr@2: # undef OPENSSL_SYS_UNIX williamr@2: # define OPENSSL_SYS_VMS williamr@2: # if defined(__DECC) williamr@2: # define OPENSSL_SYS_VMS_DECC williamr@2: # elif defined(__DECCXX) williamr@2: # define OPENSSL_SYS_VMS_DECC williamr@2: # define OPENSSL_SYS_VMS_DECCXX williamr@2: # else williamr@2: # define OPENSSL_SYS_VMS_NODECC williamr@2: # endif williamr@2: #endif williamr@2: williamr@2: /* --------------------------------- OS/2 ---------------------------------- */ williamr@2: #if defined(__EMX__) || defined(__OS2__) williamr@2: # undef OPENSSL_SYS_UNIX williamr@2: # define OPENSSL_SYS_OS2 williamr@2: #endif williamr@2: williamr@2: /* --------------------------------- Unix ---------------------------------- */ williamr@2: #ifdef OPENSSL_SYS_UNIX williamr@2: # if defined(linux) || defined(__linux__) || defined(OPENSSL_SYSNAME_LINUX) williamr@2: # define OPENSSL_SYS_LINUX williamr@2: # endif williamr@2: # ifdef OPENSSL_SYSNAME_MPE williamr@2: # define OPENSSL_SYS_MPE williamr@2: # endif williamr@2: # ifdef OPENSSL_SYSNAME_SNI williamr@2: # define OPENSSL_SYS_SNI williamr@2: # endif williamr@2: # ifdef OPENSSL_SYSNAME_ULTRASPARC williamr@2: # define OPENSSL_SYS_ULTRASPARC williamr@2: # endif williamr@2: # ifdef OPENSSL_SYSNAME_NEWS4 williamr@2: # define OPENSSL_SYS_NEWS4 williamr@2: # endif williamr@2: # ifdef OPENSSL_SYSNAME_MACOSX williamr@2: # define OPENSSL_SYS_MACOSX williamr@2: # endif williamr@2: # ifdef OPENSSL_SYSNAME_MACOSX_RHAPSODY williamr@2: # define OPENSSL_SYS_MACOSX_RHAPSODY williamr@2: # define OPENSSL_SYS_MACOSX williamr@2: # endif williamr@2: # ifdef OPENSSL_SYSNAME_SUNOS williamr@2: # define OPENSSL_SYS_SUNOS williamr@2: #endif williamr@2: # if defined(_CRAY) || defined(OPENSSL_SYSNAME_CRAY) williamr@2: # define OPENSSL_SYS_CRAY williamr@2: # endif williamr@2: # if defined(_AIX) || defined(OPENSSL_SYSNAME_AIX) williamr@2: # define OPENSSL_SYS_AIX williamr@2: # endif williamr@2: #endif williamr@2: williamr@2: /* --------------------------------- VOS ----------------------------------- */ williamr@2: #ifdef OPENSSL_SYSNAME_VOS williamr@2: # define OPENSSL_SYS_VOS williamr@2: #endif williamr@2: williamr@2: /* ------------------------------- VxWorks --------------------------------- */ williamr@2: #ifdef OPENSSL_SYSNAME_VXWORKS williamr@2: # define OPENSSL_SYS_VXWORKS williamr@2: #endif williamr@2: williamr@2: #endif //#ifndef SYMBAIN williamr@2: /** williamr@2: * That's it for OS-specific stuff williamr@2: *****************************************************************************/ williamr@2: williamr@2: williamr@2: /* Specials for I/O an exit */ williamr@2: #ifdef OPENSSL_SYS_MSDOS williamr@2: # define OPENSSL_UNISTD_IO williamr@2: # define OPENSSL_DECLARE_EXIT extern void exit(int); williamr@2: #else williamr@2: # define OPENSSL_UNISTD_IO OPENSSL_UNISTD williamr@2: # define OPENSSL_DECLARE_EXIT /* declared in unistd.h */ williamr@2: #endif williamr@2: williamr@2: /* Definitions of OPENSSL_GLOBAL and OPENSSL_EXTERN, to define and declare williamr@2: certain global symbols that, with some compilers under VMS, have to be williamr@2: defined and declared explicitely with globaldef and globalref. williamr@2: Definitions of OPENSSL_EXPORT and OPENSSL_IMPORT, to define and declare williamr@2: DLL exports and imports for compilers under Win32. These are a little williamr@2: more complicated to use. Basically, for any library that exports some williamr@2: global variables, the following code must be present in the header file williamr@2: that declares them, before OPENSSL_EXTERN is used: williamr@2: williamr@2: #ifdef SOME_BUILD_FLAG_MACRO williamr@2: # undef OPENSSL_EXTERN williamr@2: # define OPENSSL_EXTERN OPENSSL_EXPORT williamr@2: #endif williamr@2: williamr@2: The default is to have OPENSSL_EXPORT, OPENSSL_IMPORT and OPENSSL_GLOBAL williamr@2: have some generally sensible values, and for OPENSSL_EXTERN to have the williamr@2: value OPENSSL_IMPORT. williamr@2: */ williamr@2: williamr@2: #if defined(OPENSSL_SYS_VMS_NODECC) williamr@2: # define OPENSSL_EXPORT globalref williamr@2: # define OPENSSL_IMPORT globalref williamr@2: # define OPENSSL_GLOBAL globaldef williamr@2: #elif defined(OPENSSL_SYS_WINDOWS) && defined(OPENSSL_OPT_WINDLL) williamr@2: # define OPENSSL_EXPORT extern __declspec(dllexport) williamr@2: # define OPENSSL_IMPORT extern __declspec(dllimport) williamr@2: # define OPENSSL_GLOBAL williamr@2: #else williamr@2: # define OPENSSL_EXPORT extern williamr@2: # define OPENSSL_IMPORT extern williamr@2: # define OPENSSL_GLOBAL williamr@2: #endif williamr@2: #define OPENSSL_EXTERN OPENSSL_IMPORT williamr@2: williamr@2: /* Macros to allow global variables to be reached through function calls when williamr@2: required (if a shared library version requvres it, for example. williamr@2: The way it's done allows definitions like this: williamr@2: williamr@2: // in foobar.c williamr@2: OPENSSL_IMPLEMENT_GLOBAL(int,foobar) = 0; williamr@2: // in foobar.h williamr@2: OPENSSL_DECLARE_GLOBAL(int,foobar); williamr@2: #define foobar OPENSSL_GLOBAL_REF(foobar) williamr@2: */ williamr@2: williamr@2: #ifdef OPENSSL_EXPORT_VAR_AS_FUNCTION williamr@2: # define OPENSSL_IMPLEMENT_GLOBAL(type,name) \ williamr@2: extern type _hide_##name; \ williamr@2: type *_shadow_##name(void) { return &_hide_##name; } \ williamr@2: static type _hide_##name williamr@2: # define OPENSSL_DECLARE_GLOBAL(type,name) type *_shadow_##name(void) williamr@2: # define OPENSSL_GLOBAL_REF(name) (*(_shadow_##name())) williamr@2: #else williamr@2: #ifndef EMULATOR williamr@2: # define OPENSSL_IMPLEMENT_GLOBAL(type,name) OPENSSL_GLOBAL type _shadow_##name williamr@2: # define OPENSSL_DECLARE_GLOBAL(type,name) OPENSSL_EXPORT type _shadow_##name williamr@2: # define OPENSSL_GLOBAL_REF(name) _shadow_##name williamr@2: #else williamr@2: # define OPENSSL_IMPLEMENT_GLOBAL(type,name) williamr@2: # define OPENSSL_DECLARE_GLOBAL(type,name) williamr@2: # define OPENSSL_GLOBAL_REF(name) libcrypto_ImpurePtr()->_shadow_##name williamr@2: #endif williamr@2: #endif williamr@2: williamr@2: #ifdef __cplusplus williamr@2: } williamr@2: #endif williamr@2: #endif