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