(linenum→info "unix/slp.c:2238")

openssl/0.9.8g/e_os.h

    1: /* e_os.h */
    2: /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
    3:  * All rights reserved.
    4:  *
    5:  * This package is an SSL implementation written
    6:  * by Eric Young (eay@cryptsoft.com).
    7:  * The implementation was written so as to conform with Netscapes SSL.
    8:  * 
    9:  * This library is free for commercial and non-commercial use as long as
   10:  * the following conditions are aheared to.  The following conditions
   11:  * apply to all code found in this distribution, be it the RC4, RSA,
   12:  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
   13:  * included with this distribution is covered by the same copyright terms
   14:  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
   15:  * 
   16:  * Copyright remains Eric Young's, and as such any Copyright notices in
   17:  * the code are not to be removed.
   18:  * If this package is used in a product, Eric Young should be given attribution
   19:  * as the author of the parts of the library used.
   20:  * This can be in the form of a textual message at program startup or
   21:  * in documentation (online or textual) provided with the package.
   22:  * 
   23:  * Redistribution and use in source and binary forms, with or without
   24:  * modification, are permitted provided that the following conditions
   25:  * are met:
   26:  * 1. Redistributions of source code must retain the copyright
   27:  *    notice, this list of conditions and the following disclaimer.
   28:  * 2. Redistributions in binary form must reproduce the above copyright
   29:  *    notice, this list of conditions and the following disclaimer in the
   30:  *    documentation and/or other materials provided with the distribution.
   31:  * 3. All advertising materials mentioning features or use of this software
   32:  *    must display the following acknowledgement:
   33:  *    "This product includes cryptographic software written by
   34:  *     Eric Young (eay@cryptsoft.com)"
   35:  *    The word 'cryptographic' can be left out if the rouines from the library
   36:  *    being used are not cryptographic related :-).
   37:  * 4. If you include any Windows specific code (or a derivative thereof) from 
   38:  *    the apps directory (application code) you must include an acknowledgement:
   39:  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
   40:  * 
   41:  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
   42:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   43:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   44:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   45:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   46:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   47:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   48:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   49:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   50:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   51:  * SUCH DAMAGE.
   52:  * 
   53:  * The licence and distribution terms for any publically available version or
   54:  * derivative of this code cannot be changed.  i.e. this code cannot simply be
   55:  * copied and put under another distribution licence
   56:  * [including the GNU Public Licence.]
   57:  */
   58: 
   59: #ifndef HEADER_E_OS_H
   60: #define HEADER_E_OS_H
   61: 
   62: #include <openssl/opensslconf.h>
   63: 
   64: #include <openssl/e_os2.h>
   65: /* <openssl/e_os2.h> contains what we can justify to make visible
   66:  * to the outside; this file e_os.h is not part of the exported
   67:  * interface. */
   68: 
   69: #ifdef  __cplusplus
   70: extern "C" {
   71: #endif
   72: 
   73: /* Used to checking reference counts, most while doing perl5 stuff :-) */
   74: #ifdef REF_PRINT
   75: #undef REF_PRINT
   76: #define REF_PRINT(a,b)  fprintf(stderr,"%08X:%4d:%s\n",(int)b,b->references,a)
   77: #endif
   78: 
   79: #ifndef DEVRANDOM
   80: /* set this to a comma-separated list of 'random' device files to try out.
   81:  * My default, we will try to read at least one of these files */
   82: #define DEVRANDOM "/dev/urandom","/dev/random","/dev/srandom"
   83: #endif
   84: #ifndef DEVRANDOM_EGD
   85: /* set this to a comma-seperated list of 'egd' sockets to try out. These
   86:  * sockets will be tried in the order listed in case accessing the device files
   87:  * listed in DEVRANDOM did not return enough entropy. */
   88: #define DEVRANDOM_EGD "/var/run/egd-pool","/dev/egd-pool","/etc/egd-pool","/etc/entropy"
   89: #endif
   90: 
   91: #if defined(OPENSSL_SYS_VXWORKS)
   92: #  define NO_SYS_PARAM_H
   93: #  define NO_CHMOD
   94: #  define NO_SYSLOG
   95: #endif
   96:   
   97: #if defined(OPENSSL_SYS_MACINTOSH_CLASSIC)
   98: # if macintosh==1
   99: #  ifndef MAC_OS_GUSI_SOURCE
  100: #    define MAC_OS_pre_X
  101: #    define NO_SYS_TYPES_H
  102:      typedef long ssize_t;
  103: #  endif
  104: #  define NO_SYS_PARAM_H
  105: #  define NO_CHMOD
  106: #  define NO_SYSLOG
  107: #  undef  DEVRANDOM
  108: #  define GETPID_IS_MEANINGLESS
  109: # endif
  110: #endif
  111: 
  112: /********************************************************************
  113:  The Microsoft section
  114:  ********************************************************************/
  115: /* The following is used becaue of the small stack in some
  116:  * Microsoft operating systems */
  117: #if defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYSNAME_WIN32)
  118: #  define MS_STATIC     static
  119: #else
  120: #  define MS_STATIC
  121: #endif
  122: 
  123: #if defined(OPENSSL_SYS_WIN32) && !defined(WIN32)
  124: #  define WIN32
  125: #endif
  126: #if defined(OPENSSL_SYS_WIN16) && !defined(WIN16)
  127: #  define WIN16
  128: #endif
  129: #if defined(OPENSSL_SYS_WINDOWS) && !defined(WINDOWS)
  130: #  define WINDOWS
  131: #endif
  132: #if defined(OPENSSL_SYS_MSDOS) && !defined(MSDOS)
  133: #  define MSDOS
  134: #endif
  135: 
  136: #if defined(MSDOS) && !defined(GETPID_IS_MEANINGLESS)
  137: #  define GETPID_IS_MEANINGLESS
  138: #endif
  139: 
  140: #ifdef WIN32
  141: #define get_last_sys_error()    GetLastError()
  142: #define clear_sys_error()       SetLastError(0)
  143: #if !defined(WINNT)
  144: #define WIN_CONSOLE_BUG
  145: #endif
  146: #else
  147: #define get_last_sys_error()    errno
  148: #define clear_sys_error()       errno=0
  149: #endif
  150: 
  151: #if defined(WINDOWS)
  152: #define get_last_socket_error() WSAGetLastError()
  153: #define clear_socket_error()    WSASetLastError(0)
  154: #define readsocket(s,b,n)       recv((s),(b),(n),0)
  155: #define writesocket(s,b,n)      send((s),(b),(n),0)
  156: #define EADDRINUSE              WSAEADDRINUSE
  157: #elif defined(__DJGPP__)
  158: #define WATT32
  159: #define get_last_socket_error() errno
  160: #define clear_socket_error()    errno=0
  161: #define closesocket(s)          close_s(s)
  162: #define readsocket(s,b,n)       read_s(s,b,n)
  163: #define writesocket(s,b,n)      send(s,b,n,0)
  164: #elif defined(MAC_OS_pre_X)
  165: #define get_last_socket_error() errno
  166: #define clear_socket_error()    errno=0
  167: #define closesocket(s)          MacSocket_close(s)
  168: #define readsocket(s,b,n)       MacSocket_recv((s),(b),(n),true)
  169: #define writesocket(s,b,n)      MacSocket_send((s),(b),(n))
  170: #elif defined(OPENSSL_SYS_VMS)
  171: #define get_last_socket_error() errno
  172: #define clear_socket_error()    errno=0
  173: #define ioctlsocket(a,b,c)      ioctl(a,b,c)
  174: #define closesocket(s)          close(s)
  175: #define readsocket(s,b,n)       recv((s),(b),(n),0)
  176: #define writesocket(s,b,n)      send((s),(b),(n),0)
  177: #elif defined(OPENSSL_SYS_VXWORKS)
  178: #define get_last_socket_error() errno
  179: #define clear_socket_error()    errno=0
  180: #define ioctlsocket(a,b,c)          ioctl((a),(b),(int)(c))
  181: #define closesocket(s)              close(s)
  182: #define readsocket(s,b,n)           read((s),(b),(n))
  183: #define writesocket(s,b,n)          write((s),(char *)(b),(n))
  184: #elif defined(OPENSSL_SYS_NETWARE)
  185: #if defined(NETWARE_BSDSOCK)
  186: #define get_last_socket_error() errno
  187: #define clear_socket_error()    errno=0
  188: #define closesocket(s)          close(s)
  189: #define readsocket(s,b,n)       recv((s),(b),(n),0)
  190: #define writesocket(s,b,n)      send((s),(b),(n),0)
  191: #else
  192: #define get_last_socket_error() WSAGetLastError()
  193: #define clear_socket_error()    WSASetLastError(0)
  194: #define readsocket(s,b,n)               recv((s),(b),(n),0)
  195: #define writesocket(s,b,n)              send((s),(b),(n),0)
  196: #endif
  197: #else
  198: #define get_last_socket_error() errno
  199: #define clear_socket_error()    errno=0
  200: #define ioctlsocket(a,b,c)      ioctl(a,b,c)
  201: #define closesocket(s)          close(s)
  202: #define readsocket(s,b,n)       read((s),(b),(n))
  203: #define writesocket(s,b,n)      write((s),(b),(n))
  204: #endif
  205: 
  206: #ifdef WIN16
  207: #  define MS_CALLBACK   _far _loadds
  208: #  define MS_FAR        _far
  209: #else
  210: #  define MS_CALLBACK
  211: #  define MS_FAR
  212: #endif
  213: 
  214: #ifdef OPENSSL_NO_STDIO
  215: #  undef OPENSSL_NO_FP_API
  216: #  define OPENSSL_NO_FP_API
  217: #endif
  218: 
  219: #if (defined(WINDOWS) || defined(MSDOS))
  220: 
  221: #  ifdef __DJGPP__
  222: #    include <unistd.h>
  223: #    include <sys/stat.h>
  224: #    include <sys/socket.h>
  225: #    include <tcp.h>
  226: #    include <netdb.h>
  227: #    define _setmode setmode
  228: #    define _O_TEXT O_TEXT
  229: #    define _O_BINARY O_BINARY
  230: #    undef DEVRANDOM
  231: #    define DEVRANDOM "/dev/urandom\x24"
  232: #  endif /* __DJGPP__ */
  233: 
  234: #  ifndef S_IFDIR
  235: #    define S_IFDIR     _S_IFDIR
  236: #  endif
  237: 
  238: #  ifndef S_IFMT
  239: #    define S_IFMT      _S_IFMT
  240: #  endif
  241: 
  242: #  if !defined(WINNT) && !defined(__DJGPP__)
  243: #    define NO_SYSLOG
  244: #  endif
  245: #  define NO_DIRENT
  246: 
  247: #  ifdef WINDOWS
  248: #    if !defined(_WIN32_WCE) && !defined(_WIN32_WINNT)
  249:        /*
  250:         * Defining _WIN32_WINNT here in e_os.h implies certain "discipline."
  251:         * Most notably we ought to check for availability of each specific
  252:         * routine with GetProcAddress() and/or quard NT-specific calls with
  253:         * GetVersion() < 0x80000000. One can argue that in latter "or" case
  254:         * we ought to /DELAYLOAD some .DLLs in order to protect ourselves
  255:         * against run-time link errors. This doesn't seem to be necessary,
  256:         * because it turned out that already Windows 95, first non-NT Win32
  257:         * implementation, is equipped with at least NT 3.51 stubs, dummy
  258:         * routines with same name, but which do nothing. Meaning that it's
  259:         * apparently appropriate to guard generic NT calls with GetVersion
  260:         * alone, while NT 4.0 and above calls ought to be additionally
  261:         * checked upon with GetProcAddress.
  262:         */
  263: #      define _WIN32_WINNT 0x0400
  264: #    endif
  265: #    include <windows.h>
  266: #    include <stddef.h>
  267: #    include <errno.h>
  268: #    include <string.h>
  269: #    ifdef _WIN64
  270: #      define strlen(s) _strlen31(s)
  271: /* cut strings to 2GB */
  272: static unsigned int _strlen31(const char *str)
  273:         {
  274:         unsigned int len=0;
  275:         while (*str && len<0x80000000U) str++, len++;
  276:         return len&0x7FFFFFFF;
  277:         }
  278: #    endif
  279: #    include <malloc.h>
  280: #  endif
  281: #  include <io.h>
  282: #  include <fcntl.h>
  283: 
  284: #  ifdef OPENSSL_SYS_WINCE
  285: #    include <winsock_extras.h>
  286: #  endif
  287: 
  288: #  define ssize_t long
  289: 
  290: #  if defined (__BORLANDC__)
  291: #    define _setmode setmode
  292: #    define _O_TEXT O_TEXT
  293: #    define _O_BINARY O_BINARY
  294: #    define _int64 __int64
  295: #    define _kbhit kbhit
  296: #  endif
  297: 
  298: #  if defined(WIN16) && defined(SSLEAY) && defined(_WINEXITNOPERSIST)
  299: #    define EXIT(n) _wsetexit(_WINEXITNOPERSIST)
  300: #    define OPENSSL_EXIT(n) do { if (n == 0) EXIT(n); return(n); } while(0)
  301: #  else
  302: #    define EXIT(n) exit(n)
  303: #  endif
  304: #  define LIST_SEPARATOR_CHAR ';'
  305: #  ifndef X_OK
  306: #    define X_OK        0
  307: #  endif
  308: #  ifndef W_OK
  309: #    define W_OK        2
  310: #  endif
  311: #  ifndef R_OK
  312: #    define R_OK        4
  313: #  endif
  314: #  define OPENSSL_CONF  "openssl.cnf"
  315: #  define SSLEAY_CONF   OPENSSL_CONF
  316: #  define NUL_DEV       "nul"
  317: #  define RFILE         ".rnd"
  318: #  ifdef OPENSSL_SYS_WINCE
  319: #    define DEFAULT_HOME  ""
  320: #  else
  321: #    define DEFAULT_HOME  "C:"
  322: #  endif
  323: 
  324: #else /* The non-microsoft world world */
  325: 
  326: #  ifdef OPENSSL_SYS_VMS
  327: #    define VMS 1
  328:   /* some programs don't include stdlib, so exit() and others give implicit 
  329:      function warnings */
  330: #    include <stdlib.h>
  331: #    if defined(__DECC)
  332: #      include <unistd.h>
  333: #    else
  334: #      include <unixlib.h>
  335: #    endif
  336: #    define OPENSSL_CONF        "openssl.cnf"
  337: #    define SSLEAY_CONF         OPENSSL_CONF
  338: #    define RFILE               ".rnd"
  339: #    define LIST_SEPARATOR_CHAR ','
  340: #    define NUL_DEV             "NLA0:"
  341:   /* We don't have any well-defined random devices on VMS, yet... */
  342: #    undef DEVRANDOM
  343:   /* We need to do this since VMS has the following coding on status codes:
  344: 
  345:      Bits 0-2: status type: 0 = warning, 1 = success, 2 = error, 3 = info ...
  346:                The important thing to know is that odd numbers are considered
  347:                good, while even ones are considered errors.
  348:      Bits 3-15: actual status number
  349:      Bits 16-27: facility number.  0 is considered "unknown"
  350:      Bits 28-31: control bits.  If bit 28 is set, the shell won't try to
  351:                  output the message (which, for random codes, just looks ugly)
  352: 
  353:      So, what we do here is to change 0 to 1 to get the default success status,
  354:      and everything else is shifted up to fit into the status number field, and
  355:      the status is tagged as an error, which I believe is what is wanted here.
  356:      -- Richard Levitte
  357:   */
  358: #    define EXIT(n)             do { int __VMS_EXIT = n; \
  359:                                      if (__VMS_EXIT == 0) \
  360:                                        __VMS_EXIT = 1; \
  361:                                      else \
  362:                                        __VMS_EXIT = (n << 3) | 2; \
  363:                                      __VMS_EXIT |= 0x10000000; \
  364:                                      exit(__VMS_EXIT); } while(0)
  365: #    define NO_SYS_PARAM_H
  366: 
  367: #  elif defined(OPENSSL_SYS_NETWARE)
  368: #    include <fcntl.h>
  369: #    include <unistd.h>
  370: #    define NO_SYS_TYPES_H
  371: #    undef  DEVRANDOM
  372: #    ifdef NETWARE_CLIB
  373: #      define getpid GetThreadID
  374: #    endif
  375: #    define NO_SYSLOG
  376: #    define _setmode setmode
  377: #    define _kbhit kbhit
  378: #    define _O_TEXT O_TEXT
  379: #    define _O_BINARY O_BINARY
  380: #    define OPENSSL_CONF   "openssl.cnf"
  381: #    define SSLEAY_CONF    OPENSSL_CONF
  382: #    define RFILE    ".rnd"
  383: #    define LIST_SEPARATOR_CHAR ';'
  384: #    define EXIT(n)  { if (n) printf("ERROR: %d\n", (int)n); exit(n); }
  385: 
  386: #  else
  387:      /* !defined VMS */
  388: #    ifdef OPENSSL_SYS_MPE
  389: #      define NO_SYS_PARAM_H
  390: #    endif
  391: #    ifdef OPENSSL_UNISTD
  392: #      include OPENSSL_UNISTD
  393: #    else
  394: #      include <unistd.h>
  395: #    endif
  396: #    ifndef NO_SYS_TYPES_H
  397: #      include <sys/types.h>
  398: #    endif
  399: #    if defined(NeXT) || defined(OPENSSL_SYS_NEWS4)
  400: #      define pid_t int /* pid_t is missing on NEXTSTEP/OPENSTEP
  401:                          * (unless when compiling with -D_POSIX_SOURCE,
  402:                          * which doesn't work for us) */
  403: #    endif
  404: #    if defined(NeXT) || defined(OPENSSL_SYS_NEWS4) || defined(OPENSSL_SYS_SUNOS)
  405: #      define ssize_t int /* ditto */
  406: #    endif
  407: #    ifdef OPENSSL_SYS_NEWS4 /* setvbuf is missing on mips-sony-bsd */
  408: #      define setvbuf(a, b, c, d) setbuffer((a), (b), (d))
  409:        typedef unsigned long clock_t;
  410: #    endif
  411: 
  412: #    define OPENSSL_CONF        "openssl.cnf"
  413: #    define SSLEAY_CONF         OPENSSL_CONF
  414: #    define RFILE               ".rnd"
  415: #    define LIST_SEPARATOR_CHAR ':'
  416: #    define NUL_DEV             "/dev/null"
  417: #    define EXIT(n)             exit(n)
  418: #  endif
  419: 
  420: #  define SSLeay_getpid()       getpid()
  421: 
  422: #endif
  423: 
  424: 
  425: /*************/
  426: 
  427: #ifdef USE_SOCKETS
  428: #  if defined(WINDOWS) || defined(MSDOS)
  429:       /* windows world */
  430: 
  431: #    ifdef OPENSSL_NO_SOCK
  432: #      define SSLeay_Write(a,b,c)       (-1)
  433: #      define SSLeay_Read(a,b,c)        (-1)
  434: #      define SHUTDOWN(fd)              close(fd)
  435: #      define SHUTDOWN2(fd)             close(fd)
  436: #    elif !defined(__DJGPP__)
  437: #      include <winsock.h>
  438: extern HINSTANCE _hInstance;
  439: #      ifdef _WIN64
  440: /*
  441:  * Even though sizeof(SOCKET) is 8, it's safe to cast it to int, because
  442:  * the value constitutes an index in per-process table of limited size
  443:  * and not a real pointer.
  444:  */
  445: #        define socket(d,t,p)   ((int)socket(d,t,p))
  446: #        define accept(s,f,l)   ((int)accept(s,f,l))
  447: #      endif
  448: #      define SSLeay_Write(a,b,c)       send((a),(b),(c),0)
  449: #      define SSLeay_Read(a,b,c)        recv((a),(b),(c),0)
  450: #      define SHUTDOWN(fd)              { shutdown((fd),0); closesocket(fd); }
  451: #      define SHUTDOWN2(fd)             { shutdown((fd),2); closesocket(fd); }
  452: #    else
  453: #      define SSLeay_Write(a,b,c)       write_s(a,b,c,0)
  454: #      define SSLeay_Read(a,b,c)        read_s(a,b,c)
  455: #      define SHUTDOWN(fd)              close_s(fd)
  456: #      define SHUTDOWN2(fd)             close_s(fd)
  457: #    endif
  458: 
  459: #  elif defined(MAC_OS_pre_X)
  460: 
  461: #    include "MacSocket.h"
  462: #    define SSLeay_Write(a,b,c)         MacSocket_send((a),(b),(c))
  463: #    define SSLeay_Read(a,b,c)          MacSocket_recv((a),(b),(c),true)
  464: #    define SHUTDOWN(fd)                MacSocket_close(fd)
  465: #    define SHUTDOWN2(fd)               MacSocket_close(fd)
  466: 
  467: #  elif defined(OPENSSL_SYS_NETWARE)
  468:          /* NetWare uses the WinSock2 interfaces by default, but can be configured for BSD
  469:          */
  470: #      if defined(NETWARE_BSDSOCK)
  471: #        include <sys/