/* e_os.h */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ #ifndef HEADER_E_OS_H #define HEADER_E_OS_H #include #include /* contains what we can justify to make visible * to the outside; this file e_os.h is not part of the exported * interface. */ #ifdef __cplusplus extern "C" { #endif /* Used to checking reference counts, most while doing perl5 stuff :-) */ #ifdef REF_PRINT #undef REF_PRINT #define REF_PRINT(a,b) fprintf(stderr,"%08X:%4d:%s\n",(int)b,b->references,a) #endif #ifndef DEVRANDOM /* set this to a comma-separated list of 'random' device files to try out. * My default, we will try to read at least one of these files */ #define DEVRANDOM "/dev/urandom","/dev/random","/dev/srandom" #endif #ifndef DEVRANDOM_EGD /* set this to a comma-separated list of 'egd' sockets to try out. These * sockets will be tried in the order listed in case accessing the device files * listed in DEVRANDOM did not return enough entropy. */ #define DEVRANDOM_EGD "/var/run/egd-pool","/dev/egd-pool","/etc/egd-pool","/etc/entropy" #endif #if defined(OPENSSL_SYS_VXWORKS) # define NO_SYS_PARAM_H # define NO_CHMOD # define NO_SYSLOG #endif /******************************************************************** The Microsoft section ********************************************************************/ /* The following is used because of the small stack in some * Microsoft operating systems */ #if defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYSNAME_WIN32) # define MS_STATIC static #else # define MS_STATIC #endif #if defined(OPENSSL_SYS_WIN32) && !defined(WIN32) # define WIN32 #endif #if defined(OPENSSL_SYS_WINDOWS) && !defined(WINDOWS) # define WINDOWS #endif #if defined(OPENSSL_SYS_MSDOS) && !defined(MSDOS) # define MSDOS #endif #if defined(MSDOS) && !defined(GETPID_IS_MEANINGLESS) # define GETPID_IS_MEANINGLESS #endif #ifdef WIN32 #define NO_SYS_UN_H #define get_last_sys_error() GetLastError() #define clear_sys_error() SetLastError(0) #if !defined(WINNT) #define WIN_CONSOLE_BUG #endif #else #define get_last_sys_error() errno #define clear_sys_error() errno=0 #endif #if defined(WINDOWS) #define get_last_socket_error() WSAGetLastError() #define clear_socket_error() WSASetLastError(0) #define readsocket(s,b,n) recv((s),(b),(n),0) #define writesocket(s,b,n) send((s),(b),(n),0) #elif defined(__DJGPP__) #define WATT32 #define get_last_socket_error() errno #define clear_socket_error() errno=0 #define closesocket(s) close_s(s) #define readsocket(s,b,n) read_s(s,b,n) #define writesocket(s,b,n) send(s,b,n,0) #elif defined(OPENSSL_SYS_VMS) #define get_last_socket_error() errno #define clear_socket_error() errno=0 #define ioctlsocket(a,b,c) ioctl(a,b,c) #define closesocket(s) close(s) #define readsocket(s,b,n) recv((s),(b),(n),0) #define writesocket(s,b,n) send((s),(b),(n),0) #elif defined(OPENSSL_SYS_VXWORKS) #define get_last_socket_error() errno #define clear_socket_error() errno=0 #define ioctlsocket(a,b,c) ioctl((a),(b),(int)(c)) #define closesocket(s) close(s) #define readsocket(s,b,n) read((s),(b),(n)) #define writesocket(s,b,n) write((s),(char *)(b),(n)) #elif defined(OPENSSL_SYS_NETWARE) #if defined(NETWARE_BSDSOCK) #define get_last_socket_error() errno #define clear_socket_error() errno=0 #define closesocket(s) close(s) #define ioctlsocket(a,b,c) ioctl(a,b,c) #if defined(NETWARE_LIBC) #define readsocket(s,b,n) recv((s),(b),(n),0) #define writesocket(s,b,n) send((s),(b),(n),0) #else #define readsocket(s,b,n) recv((s),(char*)(b),(n),0) #define writesocket(s,b,n) send((s),(char*)(b),(n),0) #endif #else #define get_last_socket_error() WSAGetLastError() #define clear_socket_error() WSASetLastError(0) #define readsocket(s,b,n) recv((s),(b),(n),0) #define writesocket(s,b,n) send((s),(b),(n),0) #endif #else #define get_last_socket_error() errno #define clear_socket_error() errno=0 #define ioctlsocket(a,b,c) ioctl(a,b,c) #define closesocket(s) close(s) #define readsocket(s,b,n) read((s),(b),(n)) #define writesocket(s,b,n) write((s),(b),(n)) #endif #ifdef WIN16 /* never the case */ # define MS_CALLBACK _far _loadds # define MS_FAR _far #else # define MS_CALLBACK # define MS_FAR #endif #ifdef OPENSSL_NO_STDIO # undef OPENSSL_NO_FP_API # define OPENSSL_NO_FP_API #endif #if (defined(WINDOWS) || defined(MSDOS)) # ifdef __DJGPP__ # include # include # include # include # include # define _setmode setmode # define _O_TEXT O_TEXT # define _O_BINARY O_BINARY # undef DEVRANDOM # define DEVRANDOM "/dev/urandom\x24" # endif /* __DJGPP__ */ # ifndef S_IFDIR # define S_IFDIR _S_IFDIR # endif # ifndef S_IFMT # define S_IFMT _S_IFMT # endif # if !defined(WINNT) && !defined(__DJGPP__) # define NO_SYSLOG # endif # define NO_DIRENT # ifdef WINDOWS # if !defined(_WIN32_WCE) && !defined(_WIN32_WINNT) /* * Defining _WIN32_WINNT here in e_os.h implies certain "discipline." * Most notably we ought to check for availability of each specific * routine with GetProcAddress() and/or guard NT-specific calls with * GetVersion() < 0x80000000. One can argue that in latter "or" case * we ought to /DELAYLOAD some .DLLs in order to protect ourselves * against run-time link errors. This doesn't seem to be necessary, * because it turned out that already Windows 95, first non-NT Win32 * implementation, is equipped with at least NT 3.51 stubs, dummy * routines with same name, but which do nothing. Meaning that it's * apparently sufficient to guard "vanilla" NT calls with GetVersion * alone, while NT 4.0 and above interfaces ought to be linked with * GetProcAddress at run-time. */ # define _WIN32_WINNT 0x0400 # endif # if !defined(OPENSSL_NO_SOCK) && (defined(_WIN32_WINNT) || defined(_WIN32_WCE)) /* * Just like defining _WIN32_WINNT including winsock2.h implies * certain "discipline" for maintaining [broad] binary compatibility. * As long as structures are invariant among Winsock versions, * it's sufficient to check for specific Winsock2 API availability * at run-time [DSO_global_lookup is recommended]... */ # include # include /* yes, they have to be #included prior to */ # endif # include # include # include # include # if defined(_WIN32_WCE) && !defined(EACCES) # define EACCES 13 # endif # include # ifdef _WIN64 # define strlen(s) _strlen31(s) /* cut strings to 2GB */ static __inline unsigned int _strlen31(const char *str) { unsigned int len=0; while (*str && len<0x80000000U) str++, len++; return len&0x7FFFFFFF; } # endif # include # if defined(_MSC_VER) && _MSC_VER<=1200 && defined(_MT) && defined(isspace) /* compensate for bug in VC6 ctype.h */ # undef isspace # undef isdigit # undef isalnum # undef isupper # undef isxdigit # endif # if defined(_MSC_VER) && !defined(_WIN32_WCE) && !defined(_DLL) && defined(stdin) # if _MSC_VER>=1300 && _MSC_VER<1600 # undef stdin # undef stdout # undef stderr FILE *__iob_func(); # define stdin (&__iob_func()[0]) # define stdout (&__iob_func()[1]) # define stderr (&__iob_func()[2]) # elif _MSC_VER<1300 && defined(I_CAN_LIVE_WITH_LNK4049) # undef stdin # undef stdout # undef stderr /* pre-1300 has __p__iob(), but it's available only in msvcrt.lib, * or in other words with /MD. Declaring implicit import, i.e. * with _imp_ prefix, works correctly with all compiler options, * but without /MD results in LINK warning LNK4049: * 'locally defined symbol "__iob" imported'. */ extern FILE *_imp___iob; # define stdin (&_imp___iob[0]) # define stdout (&_imp___iob[1]) # define stderr (&_imp___iob[2]) # endif # endif # endif # include # include # ifdef OPENSSL_SYS_WINCE # define OPENSSL_NO_POSIX_IO # endif # if defined (__BORLANDC__) # define _setmode setmode # define _O_TEXT O_TEXT # define _O_BINARY O_BINARY # define _int64 __int64 # define _kbhit kbhit # endif # define EXIT(n) exit(n) # define LIST_SEPARATOR_CHAR ';' # ifndef X_OK # define X_OK 0 # endif # ifndef W_OK # define W_OK 2 # endif # ifndef R_OK # define R_OK 4 # endif # define OPENSSL_CONF "openssl.cnf" # define SSLEAY_CONF OPENSSL_CONF # define NUL_DEV "nul" # define RFILE ".rnd" # ifdef OPENSSL_SYS_WINCE # define DEFAULT_HOME "" # else # define DEFAULT_HOME "C:" # endif /* Avoid Windows 8 SDK GetVersion deprecated problems */ #if defined(_MSC_VER) && _MSC_VER>=1800 # define check_winnt() (1) #else # define check_winnt() (GetVersion() < 0x80000000) #endif #else /* The non-microsoft world */ # ifdef OPENSSL_SYS_VMS # define VMS 1 /* some programs don't include stdlib, so exit() and others give implicit function warnings */ # include # if defined(__DECC) # include # else # include # endif # define OPENSSL_CONF "openssl.cnf" # define SSLEAY_CONF OPENSSL_CONF # define RFILE ".rnd" # define LIST_SEPARATOR_CHAR ',' # define NUL_DEV "NLA0:" /* We don't have any well-defined random devices on VMS, yet... */ # undef DEVRANDOM /* We need to do this since VMS has the following coding on status codes: Bits 0-2: status type: 0 = warning, 1 = success, 2 = error, 3 = info ... The important thing to know is that odd numbers are considered good, while even ones are considered errors. Bits 3-15: actual status number Bits 16-27: facility number. 0 is considered "unknown" Bits 28-31: control bits. If bit 28 is set, the shell won't try to output the message (which, for random codes, just looks ugly) So, what we do here is to change 0 to 1 to get the default success status, and everything else is shifted up to fit into the status number field, and the status is tagged as an error, which I believe is what is wanted here. -- Richard Levitte */ # define EXIT(n) do { int __VMS_EXIT = n; \ if (__VMS_EXIT == 0) \ __VMS_EXIT = 1; \ else \ __VMS_EXIT = (n << 3) | 2; \ __VMS_EXIT |= 0x10000000; \ exit(__VMS_EXIT); } while(0) # define NO_SYS_PARAM_H # elif defined(OPENSSL_SYS_NETWARE) # include # include # define NO_SYS_TYPES_H # undef DEVRANDOM # ifdef NETWARE_CLIB # define getpid GetThreadID extern int GetThreadID(void); /* # include */ extern int kbhit(void); # else # include # endif # define NO_SYSLOG # define _setmode setmode # define _kbhit kbhit # define _O_TEXT O_TEXT # define _O_BINARY O_BINARY # define OPENSSL_CONF "openssl.cnf" # define SSLEAY_CONF OPENSSL_CONF # define RFILE ".rnd" # define LIST_SEPARATOR_CHAR ';' # define EXIT(n) { if (n) printf("ERROR: %d\n", (int)n); exit(n); } # else /* !defined VMS */ # ifdef OPENSSL_SYS_MPE # define NO_SYS_PARAM_H # endif # ifdef OPENSSL_UNISTD # include OPENSSL_UNISTD # else # include # endif # ifndef NO_SYS_TYPES_H # include # endif # if defined(NeXT) # define pid_t int /* pid_t is missing on NEXTSTEP/OPENSTEP * (unless when compiling with -D_POSIX_SOURCE, * which doesn't work for us) */ # endif # ifdef OPENSSL_SYS_WIN32_CYGWIN # include # include # endif # define OPENSSL_CONF "openssl.cnf" # define SSLEAY_CONF OPENSSL_CONF # define RFILE ".rnd" # define LIST_SEPARATOR_CHAR ':' # define NUL_DEV "/dev/null" # define EXIT(n) exit(n) # endif # define SSLeay_getpid() getpid() #endif /*************/ #if defined(OPENSSL_NO_SOCK) && !defined(OPENSSL_NO_DGRAM) # define OPENSSL_NO_DGRAM #endif #ifdef USE_SOCKETS # if defined(WINDOWS) || defined(MSDOS) /* windows world */ # ifdef OPENSSL_NO_SOCK # define SSLeay_Write(a,b,c) (-1) # define SSLeay_Read(a,b,c) (-1) # define SHUTDOWN(fd) close(fd) # define SHUTDOWN2(fd) close(fd) # elif !defined(__DJGPP__) # if defined(_WIN32_WCE) && _WIN32_WCE<410 # define getservbyname _masked_declaration_getservbyname # endif # if !defined(IPPROTO_IP) /* winsock[2].h was included already? */ # include # endif # ifdef getservbyname # undef getservbyname /* this is used to be wcecompat/include/winsock_extras.h */ struct servent* PASCAL getservbyname(const char*,const char*); # endif # ifdef _WIN64 /* * Even though sizeof(SOCKET) is 8, it's safe to cast it to int, because * the value constitutes an index in per-process table of limited size * and not a real pointer. */ # define socket(d,t,p) ((int)socket(d,t,p)) # define accept(s,f,l) ((int)accept(s,f,l)) # endif # define SSLeay_Write(a,b,c) send((a),(b),(c),0) # define SSLeay_Read(a,b,c) recv((a),(b),(c),0) # define SHUTDOWN(fd) { shutdown((fd),0); closesocket(fd); } # define SHUTDOWN2(fd) { shutdown((fd),2); closesocket(fd); } # else # define SSLeay_Write(a,b,c) write_s(a,b,c,0) # define SSLeay_Read(a,b,c) read_s(a,b,c) # define SHUTDOWN(fd) close_s(fd) # define SHUTDOWN2(fd) close_s(fd) # endif # elif defined(OPENSSL_SYS_NETWARE) /* NetWare uses the WinSock2 interfaces by default, but can be configured for BSD */ # if defined(NETWARE_BSDSOCK) # include # include # include # if defined(NETWARE_CLIB) # include # else # include # endif # define INVALID_SOCKET (int)(~0) # else # include # endif # define SSLeay_Write(a,b,c) send((a),(b),(c),0) # define SSLeay_Read(a,b,c) recv((a),(b),(c),0) # define SHUTDOWN(fd) { shutdown((fd),0); closesocket(fd); } # define SHUTDOWN2(fd) { shutdown((fd),2); closesocket(fd); } # else # ifndef NO_SYS_PARAM_H # include # endif # ifdef OPENSSL_SYS_VXWORKS # include # elif !defined(OPENSSL_SYS_MPE) # include /* Needed under linux for FD_XXX */ # endif # include # if defined(OPENSSL_SYS_VMS_NODECC) # include # include # include # else # include # ifndef NO_SYS_UN_H # ifdef OPENSSL_SYS_VXWORKS # include # else # include # endif # ifndef UNIX_PATH_MAX # define UNIX_PATH_MAX sizeof(((struct sockaddr_un *)NULL)->sun_path) # endif # endif # ifdef FILIO_H # include /* Added for FIONBIO under unixware */ # endif # include # include # endif # if defined(NeXT) || defined(_NEXT_SOURCE) # include # include # endif # ifdef OPENSSL_SYS_AIX # include # endif # ifdef __QNX__ # include # endif # if defined(sun) # include # else # ifndef VMS # include # else /* ioctl is only in VMS > 7.0 and when socketshr is not used */ # if !defined(TCPIP_TYPE_SOCKETSHR) && defined(__VMS_VER) && (__VMS_VER > 70000000) # include # endif # endif # endif # ifdef VMS # include # if defined(TCPIP_TYPE_SOCKETSHR) # include # endif # endif # define SSLeay_Read(a,b,c) read((a),(b),(c)) # define SSLeay_Write(a,b,c) write((a),(b),(c)) # define SHUTDOWN(fd) { shutdown((fd),0); closesocket((fd)); } # define SHUTDOWN2(fd) { shutdown((fd),2); closesocket((fd)); } # ifndef INVALID_SOCKET # define INVALID_SOCKET (-1) # endif /* INVALID_SOCKET */ # endif /* Some IPv6 implementations are broken, disable them in known bad * versions. */ # if !defined(OPENSSL_USE_IPV6) # if defined(AF_INET6) && !defined(NETWARE_CLIB) # define OPENSSL_USE_IPV6 1 # else # define OPENSSL_USE_IPV6 0 # endif # endif #endif #if defined(sun) && !defined(__svr4__) && !defined(__SVR4) /* include headers first, so our defines don't break it */ #include #include /* bcopy can handle overlapping moves according to SunOS 4.1.4 manpage */ # define memmove(s1,s2,n) bcopy((s2),(s1),(n)) # define strtoul(s,e,b) ((unsigned long int)strtol((s),(e),(b))) extern char *sys_errlist[]; extern int sys_nerr; # define strerror(errnum) \ (((errnum)<0 || (errnum)>=sys_nerr) ? NULL : sys_errlist[errnum]) /* Being signed SunOS 4.x memcpy breaks ASN1_OBJECT table lookup */ #include "crypto/o_str.h" # define memcmp OPENSSL_memcmp #endif #ifndef OPENSSL_EXIT # if defined(MONOLITH) && !defined(OPENSSL_C) # define OPENSSL_EXIT(n) return(n) # else # define OPENSSL_EXIT(n) do { EXIT(n); return(n); } while(0) # endif #endif /***********************************************/ #define DG_GCC_BUG /* gcc < 2.6.3 on DGUX */ #ifdef sgi #define IRIX_CC_BUG /* all version of IRIX I've tested (4.* 5.*) */ #endif #ifdef OPENSSL_SYS_SNI #define IRIX_CC_BUG /* CDS++ up to V2.0Bsomething suffered from the same bug.*/ #endif #if defined(OPENSSL_SYS_WINDOWS) # define strcasecmp _stricmp # define strncasecmp _strnicmp #elif defined(OPENSSL_SYS_VMS) /* VMS below version 7.0 doesn't have strcasecmp() */ # include "o_str.h" # define strcasecmp OPENSSL_strcasecmp # define strncasecmp OPENSSL_strncasecmp # define OPENSSL_IMPLEMENTS_strncasecmp #elif defined(OPENSSL_SYS_OS2) && defined(__EMX__) # define strcasecmp stricmp # define strncasecmp strnicmp #elif defined(OPENSSL_SYS_NETWARE) # include # if defined(NETWARE_CLIB) # define strcasecmp stricmp # define strncasecmp strnicmp # endif /* NETWARE_CLIB */ #endif #if defined(OPENSSL_SYS_OS2) && defined(__EMX__) # include # include # define NO_SYSLOG #endif /* vxworks */ #if defined(OPENSSL_SYS_VXWORKS) #include #include #include #define TTY_STRUCT int #define sleep(a) taskDelay((a) * sysClkRateGet()) #include #include #include #define getpid taskIdSelf /* NOTE: these are implemented by helpers in database app! * if the database is not linked, we need to implement them * elswhere */ struct hostent *gethostbyname(const char *name); struct hostent *gethostbyaddr(const char *addr, int length, int type); struct servent *getservbyname(const char *name, const char *proto); #endif /* end vxworks */ #if !defined(inline) && !defined(__cplusplus) # if defined(__STDC_VERSION__) && __STDC_VERSION__>=199901L /* do nothing, inline works */ # elif defined(__GNUC__) && __GNUC__>=2 # define 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 inline __inline # else # define inline # endif #endif #ifdef __cplusplus } #endif #endif