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