Blame e_os.h

Packit c4476c
/*
Packit c4476c
 * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
Packit c4476c
 *
Packit c4476c
 * Licensed under the OpenSSL license (the "License").  You may not use
Packit c4476c
 * this file except in compliance with the License.  You can obtain a copy
Packit c4476c
 * in the file LICENSE in the source distribution or at
Packit c4476c
 * https://www.openssl.org/source/license.html
Packit c4476c
 */
Packit c4476c
Packit c4476c
#ifndef OSSL_E_OS_H
Packit c4476c
# define OSSL_E_OS_H
Packit c4476c
Packit c4476c
# include <limits.h>
Packit c4476c
# include <openssl/opensslconf.h>
Packit c4476c
Packit c4476c
# include <openssl/e_os2.h>
Packit c4476c
# include <openssl/crypto.h>
Packit c4476c
# include "internal/nelem.h"
Packit c4476c
Packit c4476c
/*
Packit c4476c
 * <openssl/e_os2.h> contains what we can justify to make visible to the
Packit c4476c
 * outside; this file e_os.h is not part of the exported interface.
Packit c4476c
 */
Packit c4476c
Packit c4476c
# ifndef DEVRANDOM
Packit c4476c
/*
Packit c4476c
 * set this to a comma-separated list of 'random' device files to try out. By
Packit c4476c
 * default, we will try to read at least one of these files
Packit c4476c
 */
Packit c4476c
#  define DEVRANDOM "/dev/urandom", "/dev/random", "/dev/hwrng", "/dev/srandom"
Packit c4476c
#  if defined(__linux) && !defined(__ANDROID__)
Packit c4476c
#   ifndef DEVRANDOM_WAIT
Packit c4476c
#    define DEVRANDOM_WAIT   "/dev/random"
Packit c4476c
#   endif
Packit c4476c
/*
Packit c4476c
 * Linux kernels 4.8 and later changes how their random device works and there
Packit c4476c
 * is no reliable way to tell that /dev/urandom has been seeded -- getentropy(2)
Packit c4476c
 * should be used instead.
Packit c4476c
 */
Packit c4476c
#   ifndef DEVRANDOM_SAFE_KERNEL
Packit c4476c
#    define DEVRANDOM_SAFE_KERNEL        4, 8
Packit c4476c
#   endif
Packit c4476c
/*
Packit c4476c
 * Some operating systems do not permit select(2) on their random devices,
Packit c4476c
 * defining this to zero will force the use of read(2) to extract one byte
Packit c4476c
 * from /dev/random.
Packit c4476c
 */
Packit c4476c
#   ifndef DEVRANDM_WAIT_USE_SELECT
Packit c4476c
#    define DEVRANDM_WAIT_USE_SELECT     1
Packit c4476c
#   endif
Packit c4476c
/*
Packit c4476c
 * Define the shared memory identifier used to indicate if the operating
Packit c4476c
 * system has properly seeded the DEVRANDOM source.
Packit c4476c
 */
Packit c4476c
#   ifndef OPENSSL_RAND_SEED_DEVRANDOM_SHM_ID
Packit c4476c
#    define OPENSSL_RAND_SEED_DEVRANDOM_SHM_ID 114
Packit c4476c
#   endif
Packit c4476c
Packit c4476c
#  endif
Packit c4476c
# endif
Packit c4476c
# if !defined(OPENSSL_NO_EGD) && !defined(DEVRANDOM_EGD)
Packit c4476c
/*
Packit c4476c
 * set this to a comma-separated list of 'egd' sockets to try out. These
Packit c4476c
 * sockets will be tried in the order listed in case accessing the device
Packit c4476c
 * files listed in DEVRANDOM did not return enough randomness.
Packit c4476c
 */
Packit c4476c
#  define DEVRANDOM_EGD "/var/run/egd-pool", "/dev/egd-pool", "/etc/egd-pool", "/etc/entropy"
Packit c4476c
# endif
Packit c4476c
Packit c4476c
# if defined(OPENSSL_SYS_VXWORKS) || defined(OPENSSL_SYS_UEFI)
Packit c4476c
#  define NO_CHMOD
Packit c4476c
#  define NO_SYSLOG
Packit c4476c
# endif
Packit c4476c
Packit c4476c
# define get_last_sys_error()    errno
Packit c4476c
# define clear_sys_error()       errno=0
Packit c4476c
# define set_sys_error(e)        errno=(e)
Packit c4476c
Packit c4476c
/********************************************************************
Packit c4476c
 The Microsoft section
Packit c4476c
 ********************************************************************/
Packit c4476c
# if defined(OPENSSL_SYS_WIN32) && !defined(WIN32)
Packit c4476c
#  define WIN32
Packit c4476c
# endif
Packit c4476c
# if defined(OPENSSL_SYS_WINDOWS) && !defined(WINDOWS)
Packit c4476c
#  define WINDOWS
Packit c4476c
# endif
Packit c4476c
# if defined(OPENSSL_SYS_MSDOS) && !defined(MSDOS)
Packit c4476c
#  define MSDOS
Packit c4476c
# endif
Packit c4476c
Packit c4476c
# ifdef WIN32
Packit c4476c
#  undef get_last_sys_error
Packit c4476c
#  undef clear_sys_error
Packit c4476c
#  undef set_sys_error
Packit c4476c
#  define get_last_sys_error()    GetLastError()
Packit c4476c
#  define clear_sys_error()       SetLastError(0)
Packit c4476c
#  define set_sys_error(e)        SetLastError(e)
Packit c4476c
#  if !defined(WINNT)
Packit c4476c
#   define WIN_CONSOLE_BUG
Packit c4476c
#  endif
Packit c4476c
# else
Packit c4476c
# endif
Packit c4476c
Packit c4476c
# if (defined(WINDOWS) || defined(MSDOS))
Packit c4476c
Packit c4476c
#  ifdef __DJGPP__
Packit c4476c
#   include <unistd.h>
Packit c4476c
#   include <sys/stat.h>
Packit c4476c
#   define _setmode setmode
Packit c4476c
#   define _O_TEXT O_TEXT
Packit c4476c
#   define _O_BINARY O_BINARY
Packit c4476c
#   define HAS_LFN_SUPPORT(name)  (pathconf((name), _PC_NAME_MAX) > 12)
Packit c4476c
#   undef DEVRANDOM_EGD  /*  Neither MS-DOS nor FreeDOS provide 'egd' sockets.  */
Packit c4476c
#   undef DEVRANDOM
Packit c4476c
#   define DEVRANDOM "/dev/urandom\x24"
Packit c4476c
#  endif                        /* __DJGPP__ */
Packit c4476c
Packit c4476c
#  ifndef S_IFDIR
Packit c4476c
#   define S_IFDIR     _S_IFDIR
Packit c4476c
#  endif
Packit c4476c
Packit c4476c
#  ifndef S_IFMT
Packit c4476c
#   define S_IFMT      _S_IFMT
Packit c4476c
#  endif
Packit c4476c
Packit c4476c
#  if !defined(WINNT) && !defined(__DJGPP__)
Packit c4476c
#   define NO_SYSLOG
Packit c4476c
#  endif
Packit c4476c
Packit c4476c
#  ifdef WINDOWS
Packit c4476c
#   if !defined(_WIN32_WCE) && !defined(_WIN32_WINNT)
Packit c4476c
       /*
Packit c4476c
        * Defining _WIN32_WINNT here in e_os.h implies certain "discipline."
Packit c4476c
        * Most notably we ought to check for availability of each specific
Packit c4476c
        * routine that was introduced after denoted _WIN32_WINNT with
Packit c4476c
        * GetProcAddress(). Normally newer functions are masked with higher
Packit c4476c
        * _WIN32_WINNT in SDK headers. So that if you wish to use them in
Packit c4476c
        * some module, you'd need to override _WIN32_WINNT definition in
Packit c4476c
        * the target module in order to "reach for" prototypes, but replace
Packit c4476c
        * calls to new functions with indirect calls. Alternatively it
Packit c4476c
        * might be possible to achieve the goal by /DELAYLOAD-ing .DLLs
Packit c4476c
        * and check for current OS version instead.
Packit c4476c
        */
Packit c4476c
#    define _WIN32_WINNT 0x0501
Packit c4476c
#   endif
Packit c4476c
#   if defined(_WIN32_WINNT) || defined(_WIN32_WCE)
Packit c4476c
       /*
Packit c4476c
        * Just like defining _WIN32_WINNT including winsock2.h implies
Packit c4476c
        * certain "discipline" for maintaining [broad] binary compatibility.
Packit c4476c
        * As long as structures are invariant among Winsock versions,
Packit c4476c
        * it's sufficient to check for specific Winsock2 API availability
Packit c4476c
        * at run-time [DSO_global_lookup is recommended]...
Packit c4476c
        */
Packit c4476c
#    include <winsock2.h>
Packit c4476c
#    include <ws2tcpip.h>
Packit c4476c
       /* yes, they have to be #included prior to <windows.h> */
Packit c4476c
#   endif
Packit c4476c
#   include <windows.h>
Packit c4476c
#   include <stdio.h>
Packit c4476c
#   include <stddef.h>
Packit c4476c
#   include <errno.h>
Packit c4476c
#   if defined(_WIN32_WCE) && !defined(EACCES)
Packit c4476c
#    define EACCES   13
Packit c4476c
#   endif
Packit c4476c
#   include <string.h>
Packit c4476c
#   ifdef _WIN64
Packit c4476c
#    define strlen(s) _strlen31(s)
Packit c4476c
/* cut strings to 2GB */
Packit c4476c
static __inline unsigned int _strlen31(const char *str)
Packit c4476c
{
Packit c4476c
    unsigned int len = 0;
Packit c4476c
    while (*str && len < 0x80000000U)
Packit c4476c
        str++, len++;
Packit c4476c
    return len & 0x7FFFFFFF;
Packit c4476c
}
Packit c4476c
#   endif
Packit c4476c
#   include <malloc.h>
Packit c4476c
#   if defined(_MSC_VER) && !defined(_WIN32_WCE) && !defined(_DLL) && defined(stdin)
Packit c4476c
#    if _MSC_VER>=1300 && _MSC_VER<1600
Packit c4476c
#     undef stdin
Packit c4476c
#     undef stdout
Packit c4476c
#     undef stderr
Packit c4476c
FILE *__iob_func();
Packit c4476c
#     define stdin  (&__iob_func()[0])
Packit c4476c
#     define stdout (&__iob_func()[1])
Packit c4476c
#     define stderr (&__iob_func()[2])
Packit c4476c
#    elif _MSC_VER<1300 && defined(I_CAN_LIVE_WITH_LNK4049)
Packit c4476c
#     undef stdin
Packit c4476c
#     undef stdout
Packit c4476c
#     undef stderr
Packit c4476c
         /*
Packit c4476c
          * pre-1300 has __p__iob(), but it's available only in msvcrt.lib,
Packit c4476c
          * or in other words with /MD. Declaring implicit import, i.e. with
Packit c4476c
          * _imp_ prefix, works correctly with all compiler options, but
Packit c4476c
          * without /MD results in LINK warning LNK4049: 'locally defined
Packit c4476c
          * symbol "__iob" imported'.
Packit c4476c
          */
Packit c4476c
extern FILE *_imp___iob;
Packit c4476c
#     define stdin  (&_imp___iob[0])
Packit c4476c
#     define stdout (&_imp___iob[1])
Packit c4476c
#     define stderr (&_imp___iob[2])
Packit c4476c
#    endif
Packit c4476c
#   endif
Packit c4476c
#  endif
Packit c4476c
#  include <io.h>
Packit c4476c
#  include <fcntl.h>
Packit c4476c
Packit c4476c
#  ifdef OPENSSL_SYS_WINCE
Packit c4476c
#   define OPENSSL_NO_POSIX_IO
Packit c4476c
#  endif
Packit c4476c
Packit c4476c
#  define EXIT(n) exit(n)
Packit c4476c
#  define LIST_SEPARATOR_CHAR ';'
Packit c4476c
#  ifndef W_OK
Packit c4476c
#   define W_OK        2
Packit c4476c
#  endif
Packit c4476c
#  ifndef R_OK
Packit c4476c
#   define R_OK        4
Packit c4476c
#  endif
Packit c4476c
#  ifdef OPENSSL_SYS_WINCE
Packit c4476c
#   define DEFAULT_HOME  ""
Packit c4476c
#  else
Packit c4476c
#   define DEFAULT_HOME  "C:"
Packit c4476c
#  endif
Packit c4476c
Packit c4476c
/* Avoid Visual Studio 13 GetVersion deprecated problems */
Packit c4476c
#  if defined(_MSC_VER) && _MSC_VER>=1800
Packit c4476c
#   define check_winnt() (1)
Packit c4476c
#   define check_win_minplat(x) (1)
Packit c4476c
#  else
Packit c4476c
#   define check_winnt() (GetVersion() < 0x80000000)
Packit c4476c
#   define check_win_minplat(x) (LOBYTE(LOWORD(GetVersion())) >= (x))
Packit c4476c
#  endif
Packit c4476c
Packit c4476c
# else                          /* The non-microsoft world */
Packit c4476c
Packit c4476c
#  if defined(OPENSSL_SYS_VXWORKS)
Packit c4476c
#   include <sys/times.h>
Packit c4476c
#  else
Packit c4476c
#   include <sys/time.h>
Packit c4476c
#  endif
Packit c4476c
Packit c4476c
#  ifdef OPENSSL_SYS_VMS
Packit c4476c
#   define VMS 1
Packit c4476c
  /*
Packit c4476c
   * some programs don't include stdlib, so exit() and others give implicit
Packit c4476c
   * function warnings
Packit c4476c
   */
Packit c4476c
#   include <stdlib.h>
Packit c4476c
#   if defined(__DECC)
Packit c4476c
#    include <unistd.h>
Packit c4476c
#   else
Packit c4476c
#    include <unixlib.h>
Packit c4476c
#   endif
Packit c4476c
#   define LIST_SEPARATOR_CHAR ','
Packit c4476c
  /* We don't have any well-defined random devices on VMS, yet... */
Packit c4476c
#   undef DEVRANDOM
Packit c4476c
  /*-
Packit c4476c
     We need to do this since VMS has the following coding on status codes:
Packit c4476c
Packit c4476c
     Bits 0-2: status type: 0 = warning, 1 = success, 2 = error, 3 = info ...
Packit c4476c
               The important thing to know is that odd numbers are considered
Packit c4476c
               good, while even ones are considered errors.
Packit c4476c
     Bits 3-15: actual status number
Packit c4476c
     Bits 16-27: facility number.  0 is considered "unknown"
Packit c4476c
     Bits 28-31: control bits.  If bit 28 is set, the shell won't try to
Packit c4476c
                 output the message (which, for random codes, just looks ugly)
Packit c4476c
Packit c4476c
     So, what we do here is to change 0 to 1 to get the default success status,
Packit c4476c
     and everything else is shifted up to fit into the status number field, and
Packit c4476c
     the status is tagged as an error, which is what is wanted here.
Packit c4476c
Packit c4476c
     Finally, we add the VMS C facility code 0x35a000, because there are some
Packit c4476c
     programs, such as Perl, that will reinterpret the code back to something
Packit c4476c
     POSIX.  'man perlvms' explains it further.
Packit c4476c
Packit c4476c
     NOTE: the perlvms manual wants to turn all codes 2 to 255 into success
Packit c4476c
     codes (status type = 1).  I couldn't disagree more.  Fortunately, the
Packit c4476c
     status type doesn't seem to bother Perl.
Packit c4476c
     -- Richard Levitte
Packit c4476c
  */
Packit c4476c
#   define EXIT(n)  exit((n) ? (((n) << 3) | 2 | 0x10000000 | 0x35a000) : 1)
Packit c4476c
Packit c4476c
#   define DEFAULT_HOME "SYS$LOGIN:"
Packit c4476c
Packit c4476c
#  else
Packit c4476c
     /* !defined VMS */
Packit c4476c
#   ifdef OPENSSL_UNISTD
Packit c4476c
#    include OPENSSL_UNISTD
Packit c4476c
#   else
Packit c4476c
#    include <unistd.h>
Packit c4476c
#   endif
Packit c4476c
#   include <sys/types.h>
Packit c4476c
#   ifdef OPENSSL_SYS_WIN32_CYGWIN
Packit c4476c
#    include <io.h>
Packit c4476c
#    include <fcntl.h>
Packit c4476c
#   endif
Packit c4476c
Packit c4476c
#   define LIST_SEPARATOR_CHAR ':'
Packit c4476c
#   define EXIT(n)             exit(n)
Packit c4476c
#  endif
Packit c4476c
Packit c4476c
# endif
Packit c4476c
Packit c4476c
/***********************************************/
Packit c4476c
Packit c4476c
# if defined(OPENSSL_SYS_WINDOWS)
Packit c4476c
#  define strcasecmp _stricmp
Packit c4476c
#  define strncasecmp _strnicmp
Packit c4476c
#  if (_MSC_VER >= 1310)
Packit c4476c
#   define open _open
Packit c4476c
#   define fdopen _fdopen
Packit c4476c
#   define close _close
Packit c4476c
#   ifndef strdup
Packit c4476c
#    define strdup _strdup
Packit c4476c
#   endif
Packit c4476c
#   define unlink _unlink
Packit c4476c
#   define fileno _fileno
Packit c4476c
#  endif
Packit c4476c
# else
Packit c4476c
#  include <strings.h>
Packit c4476c
# endif
Packit c4476c
Packit c4476c
/* vxworks */
Packit c4476c
# if defined(OPENSSL_SYS_VXWORKS)
Packit c4476c
#  include <ioLib.h>
Packit c4476c
#  include <tickLib.h>
Packit c4476c
#  include <sysLib.h>
Packit c4476c
#  include <vxWorks.h>
Packit c4476c
#  include <sockLib.h>
Packit c4476c
#  include <taskLib.h>
Packit c4476c
Packit c4476c
#  define TTY_STRUCT int
Packit c4476c
#  define sleep(a) taskDelay((a) * sysClkRateGet())
Packit c4476c
Packit c4476c
/*
Packit c4476c
 * NOTE: these are implemented by helpers in database app! if the database is
Packit c4476c
 * not linked, we need to implement them elsewhere
Packit c4476c
 */
Packit c4476c
struct hostent *gethostbyname(const char *name);
Packit c4476c
struct hostent *gethostbyaddr(const char *addr, int length, int type);
Packit c4476c
struct servent *getservbyname(const char *name, const char *proto);
Packit c4476c
Packit c4476c
# endif
Packit c4476c
/* end vxworks */
Packit c4476c
Packit c4476c
# ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
Packit c4476c
#  define CRYPTO_memcmp memcmp
Packit c4476c
# endif
Packit c4476c
Packit c4476c
/* unistd.h defines _POSIX_VERSION */
Packit c4476c
# if !defined(OPENSSL_NO_SECURE_MEMORY) && defined(OPENSSL_SYS_UNIX) \
Packit c4476c
     && ( (defined(_POSIX_VERSION) && _POSIX_VERSION >= 200112L)      \
Packit c4476c
          || defined(__sun) || defined(__hpux) || defined(__sgi)      \
Packit c4476c
          || defined(__osf__) )
Packit c4476c
#  define OPENSSL_SECURE_MEMORY  /* secure memory is implemented */
Packit c4476c
# endif
Packit c4476c
#endif