1/* e_os2.h */ 2/* ==================================================================== 3 * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in 14 * the documentation and/or other materials provided with the 15 * distribution. 16 * 17 * 3. All advertising materials mentioning features or use of this 18 * software must display the following acknowledgment: 19 * "This product includes software developed by the OpenSSL Project 20 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" 21 * 22 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 23 * endorse or promote products derived from this software without 24 * prior written permission. For written permission, please contact 25 * openssl-core@openssl.org. 26 * 27 * 5. Products derived from this software may not be called "OpenSSL" 28 * nor may "OpenSSL" appear in their names without prior written 29 * permission of the OpenSSL Project. 30 * 31 * 6. Redistributions of any form whatsoever must retain the following 32 * acknowledgment: 33 * "This product includes software developed by the OpenSSL Project 34 * for use in the OpenSSL Toolkit (http://www.openssl.org/)" 35 * 36 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 37 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 38 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 39 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 40 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 41 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 42 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 43 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 44 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 45 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 46 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 47 * OF THE POSSIBILITY OF SUCH DAMAGE. 48 * ==================================================================== 49 * 50 * This product includes cryptographic software written by Eric Young 51 * (eay@cryptsoft.com). This product includes software written by Tim 52 * Hudson (tjh@cryptsoft.com). 53 * 54 */ 55 56#include "opensslconf.h" 57 58#ifndef HEADER_E_OS2_H 59#define HEADER_E_OS2_H 60 61#ifdef __cplusplus 62extern "C" { 63#endif 64 65/****************************************************************************** 66 * Detect operating systems. This probably needs completing. 67 * The result is that at least one OPENSSL_SYS_os macro should be defined. 68 * However, if none is defined, Unix is assumed. 69 **/ 70 71#define OPENSSL_SYS_UNIX 72 73/* ----------------------- Macintosh, before MacOS X ----------------------- */ 74#if defined(__MWERKS__) && defined(macintosh) || defined(OPENSSL_SYSNAME_MAC) 75# undef OPENSSL_SYS_UNIX 76# define OPENSSL_SYS_MACINTOSH_CLASSIC 77#endif 78 79/* ----------------------- NetWare ----------------------------------------- */ 80#if defined(NETWARE) || defined(OPENSSL_SYSNAME_NETWARE) 81# undef OPENSSL_SYS_UNIX 82# define OPENSSL_SYS_NETWARE 83#endif 84 85/* ---------------------- Microsoft operating systems ---------------------- */ 86 87/* For 32 bit environment, there seems to be the CygWin environment and then 88 all the others that try to do the same thing Microsoft does... */ 89#if defined(OPENSSL_SYSNAME_UWIN) 90# undef OPENSSL_SYS_UNIX 91# define OPENSSL_SYS_WIN32_UWIN 92#else 93# if defined(__CYGWIN32__) || defined(OPENSSL_SYSNAME_CYGWIN32) 94# undef OPENSSL_SYS_UNIX 95# define OPENSSL_SYS_WIN32_CYGWIN 96# else 97# if defined(_WIN32) || defined(OPENSSL_SYSNAME_WIN32) 98# undef OPENSSL_SYS_UNIX 99# define OPENSSL_SYS_WIN32 100# endif 101# if defined(OPENSSL_SYSNAME_WINNT) 102# undef OPENSSL_SYS_UNIX 103# define OPENSSL_SYS_WINNT 104# endif 105# if defined(OPENSSL_SYSNAME_WINCE) 106# undef OPENSSL_SYS_UNIX 107# define OPENSSL_SYS_WINCE 108# endif 109# endif 110#endif 111 112/* Anything that tries to look like Microsoft is "Windows" */ 113#if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_WINNT) || defined(OPENSSL_SYS_WINCE) 114# undef OPENSSL_SYS_UNIX 115# define OPENSSL_SYS_WINDOWS 116# ifndef OPENSSL_SYS_MSDOS 117# define OPENSSL_SYS_MSDOS 118# endif 119#endif 120 121/* DLL settings. This part is a bit tough, because it's up to the application 122 implementor how he or she will link the application, so it requires some 123 macro to be used. */ 124#ifdef OPENSSL_SYS_WINDOWS 125# ifndef OPENSSL_OPT_WINDLL 126# if defined(_WINDLL) /* This is used when building OpenSSL to indicate that 127 DLL linkage should be used */ 128# define OPENSSL_OPT_WINDLL 129# endif 130# endif 131#endif 132 133/* -------------------------------- OpenVMS -------------------------------- */ 134#if defined(__VMS) || defined(VMS) || defined(OPENSSL_SYSNAME_VMS) 135# undef OPENSSL_SYS_UNIX 136# define OPENSSL_SYS_VMS 137# if defined(__DECC) 138# define OPENSSL_SYS_VMS_DECC 139# elif defined(__DECCXX) 140# define OPENSSL_SYS_VMS_DECC 141# define OPENSSL_SYS_VMS_DECCXX 142# else 143# define OPENSSL_SYS_VMS_NODECC 144# endif 145#endif 146 147/* --------------------------------- OS/2 ---------------------------------- */ 148#if defined(__EMX__) || defined(__OS2__) 149# undef OPENSSL_SYS_UNIX 150# define OPENSSL_SYS_OS2 151#endif 152 153/* --------------------------------- Unix ---------------------------------- */ 154#ifdef OPENSSL_SYS_UNIX 155# if defined(linux) || defined(__linux__) || defined(OPENSSL_SYSNAME_LINUX) 156# define OPENSSL_SYS_LINUX 157# endif 158# ifdef OPENSSL_SYSNAME_MPE 159# define OPENSSL_SYS_MPE 160# endif 161# ifdef OPENSSL_SYSNAME_SNI 162# define OPENSSL_SYS_SNI 163# endif 164# ifdef OPENSSL_SYSNAME_ULTRASPARC 165# define OPENSSL_SYS_ULTRASPARC 166# endif 167# ifdef OPENSSL_SYSNAME_NEWS4 168# define OPENSSL_SYS_NEWS4 169# endif 170# ifdef OPENSSL_SYSNAME_MACOSX 171# define OPENSSL_SYS_MACOSX 172# endif 173# ifdef OPENSSL_SYSNAME_MACOSX_RHAPSODY 174# define OPENSSL_SYS_MACOSX_RHAPSODY 175# define OPENSSL_SYS_MACOSX 176# endif 177# ifdef OPENSSL_SYSNAME_SUNOS 178# define OPENSSL_SYS_SUNOS 179#endif 180# if defined(_CRAY) || defined(OPENSSL_SYSNAME_CRAY) 181# define OPENSSL_SYS_CRAY 182# endif 183# if defined(_AIX) || defined(OPENSSL_SYSNAME_AIX) 184# define OPENSSL_SYS_AIX 185# endif 186#endif 187 188/* --------------------------------- VOS ----------------------------------- */ 189#ifdef OPENSSL_SYSNAME_VOS 190# define OPENSSL_SYS_VOS 191#endif 192 193/* ------------------------------- VxWorks --------------------------------- */ 194#ifdef OPENSSL_SYSNAME_VXWORKS 195# define OPENSSL_SYS_VXWORKS 196#endif 197 198/** 199 * That's it for OS-specific stuff 200 *****************************************************************************/ 201 202 203/* Specials for I/O an exit */ 204#ifdef OPENSSL_SYS_MSDOS 205# define OPENSSL_UNISTD_IO <io.h> 206# define OPENSSL_DECLARE_EXIT extern void exit(int); 207#else 208# define OPENSSL_UNISTD_IO OPENSSL_UNISTD 209# define OPENSSL_DECLARE_EXIT /* declared in unistd.h */ 210#endif 211 212/* Definitions of OPENSSL_GLOBAL and OPENSSL_EXTERN, to define and declare 213 certain global symbols that, with some compilers under VMS, have to be 214 defined and declared explicitely with globaldef and globalref. 215 Definitions of OPENSSL_EXPORT and OPENSSL_IMPORT, to define and declare 216 DLL exports and imports for compilers under Win32. These are a little 217 more complicated to use. Basically, for any library that exports some 218 global variables, the following code must be present in the header file 219 that declares them, before OPENSSL_EXTERN is used: 220 221 #ifdef SOME_BUILD_FLAG_MACRO 222 # undef OPENSSL_EXTERN 223 # define OPENSSL_EXTERN OPENSSL_EXPORT 224 #endif 225 226 The default is to have OPENSSL_EXPORT, OPENSSL_IMPORT and OPENSSL_GLOBAL 227 have some generally sensible values, and for OPENSSL_EXTERN to have the 228 value OPENSSL_IMPORT. 229*/ 230 231#if defined(OPENSSL_SYS_VMS_NODECC) 232# define OPENSSL_EXPORT globalref 233# define OPENSSL_IMPORT globalref 234# define OPENSSL_GLOBAL globaldef 235#elif defined(OPENSSL_SYS_WINDOWS) && defined(OPENSSL_OPT_WINDLL) 236# define OPENSSL_EXPORT extern __declspec(dllexport) 237# define OPENSSL_IMPORT extern __declspec(dllimport) 238# define OPENSSL_GLOBAL 239#else 240# define OPENSSL_EXPORT extern 241# define OPENSSL_IMPORT extern 242# define OPENSSL_GLOBAL 243#endif 244#define OPENSSL_EXTERN OPENSSL_IMPORT 245 246/* Macros to allow global variables to be reached through function calls when 247 required (if a shared library version requvres it, for example. 248 The way it's done allows definitions like this: 249 250 // in foobar.c 251 OPENSSL_IMPLEMENT_GLOBAL(int,foobar) = 0; 252 // in foobar.h 253 OPENSSL_DECLARE_GLOBAL(int,foobar); 254 #define foobar OPENSSL_GLOBAL_REF(foobar) 255*/ 256#ifdef OPENSSL_EXPORT_VAR_AS_FUNCTION 257# define OPENSSL_IMPLEMENT_GLOBAL(type,name) \ 258 extern type _hide_##name; \ 259 type *_shadow_##name(void) { return &_hide_##name; } \ 260 static type _hide_##name 261# define OPENSSL_DECLARE_GLOBAL(type,name) type *_shadow_##name(void) 262# define OPENSSL_GLOBAL_REF(name) (*(_shadow_##name())) 263#else 264# define OPENSSL_IMPLEMENT_GLOBAL(type,name) OPENSSL_GLOBAL type _shadow_##name 265# define OPENSSL_DECLARE_GLOBAL(type,name) OPENSSL_EXPORT type _shadow_##name 266# define OPENSSL_GLOBAL_REF(name) _shadow_##name 267#endif 268 269#ifdef __cplusplus 270} 271#endif 272#endif 273