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