You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
311 lines
9.0 KiB
311 lines
9.0 KiB
/* |
|
* Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. |
|
* |
|
* Licensed under the OpenSSL license (the "License"). You may not use |
|
* this file except in compliance with the License. You can obtain a copy |
|
* in the file LICENSE in the source distribution or at |
|
* https://www.openssl.org/source/license.html |
|
*/ |
|
|
|
#ifndef HEADER_E_OS2_H |
|
# define HEADER_E_OS2_H |
|
|
|
# include <openssl/opensslconf.h> |
|
|
|
#ifdef __cplusplus |
|
extern "C" { |
|
#endif |
|
|
|
/****************************************************************************** |
|
* Detect operating systems. This probably needs completing. |
|
* The result is that at least one OPENSSL_SYS_os macro should be defined. |
|
* However, if none is defined, Unix is assumed. |
|
**/ |
|
|
|
# define OPENSSL_SYS_UNIX |
|
|
|
/* --------------------- Microsoft operating systems ---------------------- */ |
|
|
|
/* |
|
* Note that MSDOS actually denotes 32-bit environments running on top of |
|
* MS-DOS, such as DJGPP one. |
|
*/ |
|
# if defined(OPENSSL_SYS_MSDOS) |
|
# undef OPENSSL_SYS_UNIX |
|
# endif |
|
|
|
/* |
|
* For 32 bit environment, there seems to be the CygWin environment and then |
|
* all the others that try to do the same thing Microsoft does... |
|
*/ |
|
/* |
|
* UEFI lives here because it might be built with a Microsoft toolchain and |
|
* we need to avoid the false positive match on Windows. |
|
*/ |
|
# if defined(OPENSSL_SYS_UEFI) |
|
# undef OPENSSL_SYS_UNIX |
|
# elif defined(OPENSSL_SYS_UWIN) |
|
# undef OPENSSL_SYS_UNIX |
|
# define OPENSSL_SYS_WIN32_UWIN |
|
# else |
|
# if defined(__CYGWIN__) || defined(OPENSSL_SYS_CYGWIN) |
|
# undef OPENSSL_SYS_UNIX |
|
# define OPENSSL_SYS_WIN32_CYGWIN |
|
# else |
|
# if defined(_WIN32) || defined(OPENSSL_SYS_WIN32) |
|
# undef OPENSSL_SYS_UNIX |
|
# if !defined(OPENSSL_SYS_WIN32) |
|
# define OPENSSL_SYS_WIN32 |
|
# endif |
|
# endif |
|
# if defined(_WIN64) || defined(OPENSSL_SYS_WIN64) |
|
# undef OPENSSL_SYS_UNIX |
|
# if !defined(OPENSSL_SYS_WIN64) |
|
# define OPENSSL_SYS_WIN64 |
|
# endif |
|
# endif |
|
# if defined(OPENSSL_SYS_WINNT) |
|
# undef OPENSSL_SYS_UNIX |
|
# endif |
|
# if defined(OPENSSL_SYS_WINCE) |
|
# undef OPENSSL_SYS_UNIX |
|
# endif |
|
# endif |
|
# endif |
|
|
|
/* Anything that tries to look like Microsoft is "Windows" */ |
|
# if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_WIN64) || defined(OPENSSL_SYS_WINNT) || defined(OPENSSL_SYS_WINCE) |
|
# undef OPENSSL_SYS_UNIX |
|
# define OPENSSL_SYS_WINDOWS |
|
# ifndef OPENSSL_SYS_MSDOS |
|
# define OPENSSL_SYS_MSDOS |
|
# 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 |
|
# endif |
|
# endif |
|
# endif |
|
|
|
/* ------------------------------- OpenVMS -------------------------------- */ |
|
# if defined(__VMS) || defined(VMS) || defined(OPENSSL_SYS_VMS) |
|
# if !defined(OPENSSL_SYS_VMS) |
|
# undef OPENSSL_SYS_UNIX |
|
# endif |
|
# define OPENSSL_SYS_VMS |
|
# if defined(__DECC) |
|
# define OPENSSL_SYS_VMS_DECC |
|
# elif defined(__DECCXX) |
|
# define OPENSSL_SYS_VMS_DECC |
|
# define OPENSSL_SYS_VMS_DECCXX |
|
# else |
|
# define OPENSSL_SYS_VMS_NODECC |
|
# endif |
|
# endif |
|
|
|
/* -------------------------------- Unix ---------------------------------- */ |
|
# ifdef OPENSSL_SYS_UNIX |
|
# if defined(linux) || defined(__linux__) && !defined(OPENSSL_SYS_LINUX) |
|
# define OPENSSL_SYS_LINUX |
|
# endif |
|
# if defined(_AIX) && !defined(OPENSSL_SYS_AIX) |
|
# define OPENSSL_SYS_AIX |
|
# endif |
|
# endif |
|
|
|
/* -------------------------------- VOS ----------------------------------- */ |
|
# if defined(__VOS__) && !defined(OPENSSL_SYS_VOS) |
|
# define OPENSSL_SYS_VOS |
|
# ifdef __HPPA__ |
|
# define OPENSSL_SYS_VOS_HPPA |
|
# endif |
|
# ifdef __IA32__ |
|
# define OPENSSL_SYS_VOS_IA32 |
|
# endif |
|
# endif |
|
|
|
/** |
|
* That's it for OS-specific stuff |
|
*****************************************************************************/ |
|
|
|
/* Specials for I/O an exit */ |
|
# ifdef OPENSSL_SYS_MSDOS |
|
# define OPENSSL_UNISTD_IO <io.h> |
|
# define OPENSSL_DECLARE_EXIT extern void exit(int); |
|
# else |
|
# define OPENSSL_UNISTD_IO OPENSSL_UNISTD |
|
# define OPENSSL_DECLARE_EXIT /* declared in unistd.h */ |
|
# endif |
|
|
|
/*- |
|
* Definitions of OPENSSL_GLOBAL and OPENSSL_EXTERN, to define and declare |
|
* certain global symbols that, with some compilers under VMS, have to be |
|
* defined and declared explicitly with globaldef and globalref. |
|
* Definitions of OPENSSL_EXPORT and OPENSSL_IMPORT, to define and declare |
|
* DLL exports and imports for compilers under Win32. These are a little |
|
* more complicated to use. Basically, for any library that exports some |
|
* global variables, the following code must be present in the header file |
|
* that declares them, before OPENSSL_EXTERN is used: |
|
* |
|
* #ifdef SOME_BUILD_FLAG_MACRO |
|
* # undef OPENSSL_EXTERN |
|
* # define OPENSSL_EXTERN OPENSSL_EXPORT |
|
* #endif |
|
* |
|
* The default is to have OPENSSL_EXPORT, OPENSSL_EXTERN and OPENSSL_GLOBAL |
|
* have some generally sensible values. |
|
*/ |
|
|
|
# if defined(OPENSSL_SYS_VMS_NODECC) |
|
# define OPENSSL_EXPORT globalref |
|
# define OPENSSL_EXTERN globalref |
|
# define OPENSSL_GLOBAL globaldef |
|
# elif defined(OPENSSL_SYS_WINDOWS) && defined(OPENSSL_OPT_WINDLL) |
|
# define OPENSSL_EXPORT extern __declspec(dllexport) |
|
# define OPENSSL_EXTERN extern __declspec(dllimport) |
|
# define OPENSSL_GLOBAL |
|
# else |
|
# define OPENSSL_EXPORT extern |
|
# define OPENSSL_EXTERN extern |
|
# define OPENSSL_GLOBAL |
|
# endif |
|
|
|
/*- |
|
* Macros to allow global variables to be reached through function calls when |
|
* required (if a shared library version requires 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,value) \ |
|
type *_shadow_##name(void) \ |
|
{ static type _hide_##name=value; return &_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,value) OPENSSL_GLOBAL type _shadow_##name=value; |
|
# define OPENSSL_DECLARE_GLOBAL(type,name) OPENSSL_EXPORT type _shadow_##name |
|
# define OPENSSL_GLOBAL_REF(name) _shadow_##name |
|
# endif |
|
|
|
# ifdef _WIN32 |
|
# ifdef _WIN64 |
|
# define ossl_ssize_t __int64 |
|
# define OSSL_SSIZE_MAX _I64_MAX |
|
# else |
|
# define ossl_ssize_t int |
|
# define OSSL_SSIZE_MAX INT_MAX |
|
# endif |
|
# endif |
|
|
|
# if defined(OPENSSL_SYS_UEFI) && !defined(ssize_t) |
|
# define ossl_ssize_t int |
|
# define OSSL_SSIZE_MAX INT_MAX |
|
# endif |
|
|
|
# ifndef ossl_ssize_t |
|
# define ossl_ssize_t ssize_t |
|
# if defined(SSIZE_MAX) |
|
# define OSSL_SSIZE_MAX SSIZE_MAX |
|
# elif defined(_POSIX_SSIZE_MAX) |
|
# define OSSL_SSIZE_MAX _POSIX_SSIZE_MAX |
|
# endif |
|
# endif |
|
|
|
# ifdef DEBUG_UNUSED |
|
# define __owur __attribute__((__warn_unused_result__)) |
|
# else |
|
# define __owur |
|
# endif |
|
|
|
/* Standard integer types */ |
|
# if defined(OPENSSL_SYS_UEFI) |
|
typedef INT8 int8_t; |
|
typedef UINT8 uint8_t; |
|
typedef INT16 int16_t; |
|
typedef UINT16 uint16_t; |
|
typedef INT32 int32_t; |
|
typedef UINT32 uint32_t; |
|
typedef INT64 int64_t; |
|
typedef UINT64 uint64_t; |
|
# define PRIu64 "%Lu" |
|
# elif (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \ |
|
defined(__osf__) || defined(__sgi) || defined(__hpux) || \ |
|
defined(OPENSSL_SYS_VMS) || defined (__OpenBSD__) |
|
# include <inttypes.h> |
|
# elif defined(_MSC_VER) && _MSC_VER<=1500 |
|
/* |
|
* minimally required typdefs for systems not supporting inttypes.h or |
|
* stdint.h: currently just older VC++ |
|
*/ |
|
typedef signed char int8_t; |
|
typedef unsigned char uint8_t; |
|
typedef short int16_t; |
|
typedef unsigned short uint16_t; |
|
typedef int int32_t; |
|
typedef unsigned int uint32_t; |
|
typedef __int64 int64_t; |
|
typedef unsigned __int64 uint64_t; |
|
# else |
|
# include <stdint.h> |
|
# endif |
|
|
|
/* |
|
* We need a format operator for some client tools for uint64_t. If inttypes.h |
|
* isn't available or did not define it, just go with hard-coded. |
|
*/ |
|
# ifndef PRIu64 |
|
# ifdef SIXTY_FOUR_BIT_LONG |
|
# define PRIu64 "lu" |
|
# else |
|
# define PRIu64 "llu" |
|
# endif |
|
# endif |
|
|
|
/* ossl_inline: portable inline definition usable in public headers */ |
|
# if !defined(inline) && !defined(__cplusplus) |
|
# if defined(__STDC_VERSION__) && __STDC_VERSION__>=199901L |
|
/* just use inline */ |
|
# define ossl_inline inline |
|
# elif defined(__GNUC__) && __GNUC__>=2 |
|
# define ossl_inline __inline__ |
|
# elif defined(_MSC_VER) |
|
/* |
|
* Visual Studio: inline is available in C++ only, however |
|
* __inline is available for C, see |
|
* http://msdn.microsoft.com/en-us/library/z8y1yy88.aspx |
|
*/ |
|
# define ossl_inline __inline |
|
# else |
|
# define ossl_inline |
|
# endif |
|
# else |
|
# define ossl_inline inline |
|
# endif |
|
|
|
# if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L |
|
# define ossl_noreturn _Noreturn |
|
# elif defined(__GNUC__) && __GNUC__ >= 2 |
|
# define ossl_noreturn __attribute__((noreturn)) |
|
# else |
|
# define ossl_noreturn |
|
# endif |
|
|
|
#ifdef __cplusplus |
|
} |
|
#endif |
|
#endif
|
|
|