1 /* 2 * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the OpenSSL license (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 10 #ifndef HEADER_E_OS_H 11 # define HEADER_E_OS_H 12 13 # include <limits.h> 14 # include <openssl/opensslconf.h> 15 16 # include <openssl/e_os2.h> 17 # include <openssl/crypto.h> 18 # include "internal/nelem.h" 19 20 /* 21 * <openssl/e_os2.h> contains what we can justify to make visible to the 22 * outside; this file e_os.h is not part of the exported interface. 23 */ 24 25 # ifndef DEVRANDOM 26 /* 27 * set this to a comma-separated list of 'random' device files to try out. By 28 * default, we will try to read at least one of these files 29 */ 30 # if defined(__s390__) 31 # define DEVRANDOM "/dev/prandom","/dev/urandom","/dev/hwrng","/dev/random" 32 # else 33 # define DEVRANDOM "/dev/urandom","/dev/random","/dev/srandom" 34 # endif 35 # endif 36 # if !defined(OPENSSL_NO_EGD) && !defined(DEVRANDOM_EGD) 37 /* 38 * set this to a comma-separated list of 'egd' sockets to try out. These 39 * sockets will be tried in the order listed in case accessing the device 40 * files listed in DEVRANDOM did not return enough randomness. 41 */ 42 # define DEVRANDOM_EGD "/var/run/egd-pool","/dev/egd-pool","/etc/egd-pool","/etc/entropy" 43 # endif 44 45 # if defined(OPENSSL_SYS_VXWORKS) || defined(OPENSSL_SYS_UEFI) 46 # define NO_CHMOD 47 # define NO_SYSLOG 48 # endif 49 50 # define get_last_sys_error() errno 51 # define clear_sys_error() errno=0 52 53 /******************************************************************** 54 The Microsoft section 55 ********************************************************************/ 56 # if defined(OPENSSL_SYS_WIN32) && !defined(WIN32) 57 # define WIN32 58 # endif 59 # if defined(OPENSSL_SYS_WINDOWS) && !defined(WINDOWS) 60 # define WINDOWS 61 # endif 62 # if defined(OPENSSL_SYS_MSDOS) && !defined(MSDOS) 63 # define MSDOS 64 # endif 65 66 # ifdef WIN32 67 # undef get_last_sys_error 68 # undef clear_sys_error 69 # define get_last_sys_error() GetLastError() 70 # define clear_sys_error() SetLastError(0) 71 # if !defined(WINNT) 72 # define WIN_CONSOLE_BUG 73 # endif 74 # else 75 # endif 76 77 # if (defined(WINDOWS) || defined(MSDOS)) 78 79 # ifdef __DJGPP__ 80 # include <unistd.h> 81 # include <sys/stat.h> 82 # define _setmode setmode 83 # define _O_TEXT O_TEXT 84 # define _O_BINARY O_BINARY 85 # define HAS_LFN_SUPPORT(name) (pathconf((name), _PC_NAME_MAX) > 12) 86 # undef DEVRANDOM_EGD /* Neither MS-DOS nor FreeDOS provide 'egd' sockets. */ 87 # undef DEVRANDOM 88 # define DEVRANDOM "/dev/urandom\x24" 89 # endif /* __DJGPP__ */ 90 91 # ifndef S_IFDIR 92 # define S_IFDIR _S_IFDIR 93 # endif 94 95 # ifndef S_IFMT 96 # define S_IFMT _S_IFMT 97 # endif 98 99 # if !defined(WINNT) && !defined(__DJGPP__) 100 # define NO_SYSLOG 101 # endif 102 103 # ifdef WINDOWS 104 # if !defined(_WIN32_WCE) && !defined(_WIN32_WINNT) 105 /* 106 * Defining _WIN32_WINNT here in e_os.h implies certain "discipline." 107 * Most notably we ought to check for availability of each specific 108 * routine that was introduced after denoted _WIN32_WINNT with 109 * GetProcAddress(). Normally newer functions are masked with higher 110 * _WIN32_WINNT in SDK headers. So that if you wish to use them in 111 * some module, you'd need to override _WIN32_WINNT definition in 112 * the target module in order to "reach for" prototypes, but replace 113 * calls to new functions with indirect calls. Alternatively it 114 * might be possible to achieve the goal by /DELAYLOAD-ing .DLLs 115 * and check for current OS version instead. 116 */ 117 # define _WIN32_WINNT 0x0501 118 # endif 119 # if defined(_WIN32_WINNT) || defined(_WIN32_WCE) 120 /* 121 * Just like defining _WIN32_WINNT including winsock2.h implies 122 * certain "discipline" for maintaining [broad] binary compatibility. 123 * As long as structures are invariant among Winsock versions, 124 * it's sufficient to check for specific Winsock2 API availability 125 * at run-time [DSO_global_lookup is recommended]... 126 */ 127 # include <winsock2.h> 128 # include <ws2tcpip.h> 129 /* yes, they have to be #included prior to <windows.h> */ 130 # endif 131 # include <windows.h> 132 # include <stdio.h> 133 # include <stddef.h> 134 # include <errno.h> 135 # if defined(_WIN32_WCE) && !defined(EACCES) 136 # define EACCES 13 137 # endif 138 # include <string.h> 139 # ifdef _WIN64 140 # define strlen(s) _strlen31(s) 141 /* cut strings to 2GB */ 142 static __inline unsigned int _strlen31(const char *str) 143 { 144 unsigned int len = 0; 145 while (*str && len < 0x80000000U) 146 str++, len++; 147 return len & 0x7FFFFFFF; 148 } 149 # endif 150 # include <malloc.h> 151 # if defined(_MSC_VER) && !defined(_WIN32_WCE) && !defined(_DLL) && defined(stdin) 152 # if _MSC_VER>=1300 && _MSC_VER<1600 153 # undef stdin 154 # undef stdout 155 # undef stderr 156 FILE *__iob_func(); 157 # define stdin (&__iob_func()[0]) 158 # define stdout (&__iob_func()[1]) 159 # define stderr (&__iob_func()[2]) 160 # elif _MSC_VER<1300 && defined(I_CAN_LIVE_WITH_LNK4049) 161 # undef stdin 162 # undef stdout 163 # undef stderr 164 /* 165 * pre-1300 has __p__iob(), but it's available only in msvcrt.lib, 166 * or in other words with /MD. Declaring implicit import, i.e. with 167 * _imp_ prefix, works correctly with all compiler options, but 168 * without /MD results in LINK warning LNK4049: 'locally defined 169 * symbol "__iob" imported'. 170 */ 171 extern FILE *_imp___iob; 172 # define stdin (&_imp___iob[0]) 173 # define stdout (&_imp___iob[1]) 174 # define stderr (&_imp___iob[2]) 175 # endif 176 # endif 177 # endif 178 # include <io.h> 179 # include <fcntl.h> 180 181 # ifdef OPENSSL_SYS_WINCE 182 # define OPENSSL_NO_POSIX_IO 183 # endif 184 185 # define EXIT(n) exit(n) 186 # define LIST_SEPARATOR_CHAR ';' 187 # ifndef W_OK 188 # define W_OK 2 189 # endif 190 # ifndef R_OK 191 # define R_OK 4 192 # endif 193 # ifdef OPENSSL_SYS_WINCE 194 # define DEFAULT_HOME "" 195 # else 196 # define DEFAULT_HOME "C:" 197 # endif 198 199 /* Avoid Visual Studio 13 GetVersion deprecated problems */ 200 # if defined(_MSC_VER) && _MSC_VER>=1800 201 # define check_winnt() (1) 202 # define check_win_minplat(x) (1) 203 # else 204 # define check_winnt() (GetVersion() < 0x80000000) 205 # define check_win_minplat(x) (LOBYTE(LOWORD(GetVersion())) >= (x)) 206 # endif 207 208 # else /* The non-microsoft world */ 209 210 # if defined(OPENSSL_SYS_VXWORKS) 211 # include <sys/times.h> 212 # else 213 # include <sys/time.h> 214 # endif 215 216 # ifdef OPENSSL_SYS_VMS 217 # define VMS 1 218 /* 219 * some programs don't include stdlib, so exit() and others give implicit 220 * function warnings 221 */ 222 # include <stdlib.h> 223 # if defined(__DECC) 224 # include <unistd.h> 225 # else 226 # include <unixlib.h> 227 # endif 228 # define LIST_SEPARATOR_CHAR ',' 229 /* We don't have any well-defined random devices on VMS, yet... */ 230 # undef DEVRANDOM 231 /*- 232 We need to do this since VMS has the following coding on status codes: 233 234 Bits 0-2: status type: 0 = warning, 1 = success, 2 = error, 3 = info ... 235 The important thing to know is that odd numbers are considered 236 good, while even ones are considered errors. 237 Bits 3-15: actual status number 238 Bits 16-27: facility number. 0 is considered "unknown" 239 Bits 28-31: control bits. If bit 28 is set, the shell won't try to 240 output the message (which, for random codes, just looks ugly) 241 242 So, what we do here is to change 0 to 1 to get the default success status, 243 and everything else is shifted up to fit into the status number field, and 244 the status is tagged as an error, which is what is wanted here. 245 246 Finally, we add the VMS C facility code 0x35a000, because there are some 247 programs, such as Perl, that will reinterpret the code back to something 248 POSIX. 'man perlvms' explains it further. 249 250 NOTE: the perlvms manual wants to turn all codes 2 to 255 into success 251 codes (status type = 1). I couldn't disagree more. Fortunately, the 252 status type doesn't seem to bother Perl. 253 -- Richard Levitte 254 */ 255 # define EXIT(n) exit((n) ? (((n) << 3) | 2 | 0x10000000 | 0x35a000) : 1) 256 257 # define DEFAULT_HOME "SYS$LOGIN:" 258 259 # else 260 /* !defined VMS */ 261 # ifdef OPENSSL_UNISTD 262 # include OPENSSL_UNISTD 263 # else 264 # include <unistd.h> 265 # endif 266 # include <sys/types.h> 267 # ifdef OPENSSL_SYS_WIN32_CYGWIN 268 # include <io.h> 269 # include <fcntl.h> 270 # endif 271 272 # define LIST_SEPARATOR_CHAR ':' 273 # define EXIT(n) exit(n) 274 # endif 275 276 # endif 277 278 /***********************************************/ 279 280 # if defined(OPENSSL_SYS_WINDOWS) 281 # define strcasecmp _stricmp 282 # define strncasecmp _strnicmp 283 # if (_MSC_VER >= 1310) 284 # define open _open 285 # define fdopen _fdopen 286 # define close _close 287 # ifndef strdup 288 # define strdup _strdup 289 # endif 290 # define unlink _unlink 291 # define fileno _fileno 292 # endif 293 # else 294 # include <strings.h> 295 # endif 296 297 /* vxworks */ 298 # if defined(OPENSSL_SYS_VXWORKS) 299 # include <ioLib.h> 300 # include <tickLib.h> 301 # include <sysLib.h> 302 # include <vxWorks.h> 303 # include <sockLib.h> 304 # include <taskLib.h> 305 306 # define TTY_STRUCT int 307 # define sleep(a) taskDelay((a) * sysClkRateGet()) 308 309 /* 310 * NOTE: these are implemented by helpers in database app! if the database is 311 * not linked, we need to implement them elsewhere 312 */ 313 struct hostent *gethostbyname(const char *name); 314 struct hostent *gethostbyaddr(const char *addr, int length, int type); 315 struct servent *getservbyname(const char *name, const char *proto); 316 317 # endif 318 /* end vxworks */ 319 320 # ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION 321 # define CRYPTO_memcmp memcmp 322 # endif 323 324 /* unistd.h defines _POSIX_VERSION */ 325 # if !defined(OPENSSL_NO_SECURE_MEMORY) && defined(OPENSSL_SYS_UNIX) \ 326 && ( (defined(_POSIX_VERSION) && _POSIX_VERSION >= 200112L) \ 327 || defined(__sun) || defined(__hpux) || defined(__sgi) \ 328 || defined(__osf__) ) 329 # define OPENSSL_SECURE_MEMORY /* secure memory is implemented */ 330 # endif 331 #endif 332