1 /* 2 * Copyright 1995-2024 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the Apache License 2.0 (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 # if defined(OPENSSL_SYS_VXWORKS) || defined(OPENSSL_SYS_UEFI) 26 # define NO_CHMOD 27 # define NO_SYSLOG 28 # endif 29 30 # define get_last_sys_error() errno 31 # define clear_sys_error() errno=0 32 # define set_sys_error(e) errno=(e) 33 34 /******************************************************************** 35 The Microsoft section 36 ********************************************************************/ 37 # if defined(OPENSSL_SYS_WIN32) && !defined(WIN32) 38 # define WIN32 39 # endif 40 # if defined(OPENSSL_SYS_WINDOWS) && !defined(WINDOWS) 41 # define WINDOWS 42 # endif 43 # if defined(OPENSSL_SYS_MSDOS) && !defined(MSDOS) 44 # define MSDOS 45 # endif 46 47 # ifdef WIN32 48 # undef get_last_sys_error 49 # undef clear_sys_error 50 # undef set_sys_error 51 # define get_last_sys_error() GetLastError() 52 # define clear_sys_error() SetLastError(0) 53 # define set_sys_error(e) SetLastError(e) 54 # if !defined(WINNT) 55 # define WIN_CONSOLE_BUG 56 # endif 57 # else 58 # endif 59 60 # if (defined(WINDOWS) || defined(MSDOS)) 61 62 # ifdef __DJGPP__ 63 # include <unistd.h> 64 # include <sys/stat.h> 65 # define _setmode setmode 66 # define _O_TEXT O_TEXT 67 # define _O_BINARY O_BINARY 68 # undef DEVRANDOM_EGD /* Neither MS-DOS nor FreeDOS provide 'egd' sockets. */ 69 # undef DEVRANDOM 70 # define DEVRANDOM "/dev/urandom\x24" 71 # endif /* __DJGPP__ */ 72 73 # ifndef S_IFDIR 74 # define S_IFDIR _S_IFDIR 75 # endif 76 77 # ifndef S_IFMT 78 # define S_IFMT _S_IFMT 79 # endif 80 81 # if !defined(WINNT) && !defined(__DJGPP__) 82 # define NO_SYSLOG 83 # endif 84 85 # ifdef WINDOWS 86 # if !defined(_WIN32_WCE) && !defined(_WIN32_WINNT) 87 /* 88 * Defining _WIN32_WINNT here in e_os.h implies certain "discipline." 89 * Most notably we ought to check for availability of each specific 90 * routine that was introduced after denoted _WIN32_WINNT with 91 * GetProcAddress(). Normally newer functions are masked with higher 92 * _WIN32_WINNT in SDK headers. So that if you wish to use them in 93 * some module, you'd need to override _WIN32_WINNT definition in 94 * the target module in order to "reach for" prototypes, but replace 95 * calls to new functions with indirect calls. Alternatively it 96 * might be possible to achieve the goal by /DELAYLOAD-ing .DLLs 97 * and check for current OS version instead. 98 */ 99 # define _WIN32_WINNT 0x0501 100 # endif 101 # if defined(_WIN32_WINNT) || defined(_WIN32_WCE) 102 /* 103 * Just like defining _WIN32_WINNT including winsock2.h implies 104 * certain "discipline" for maintaining [broad] binary compatibility. 105 * As long as structures are invariant among Winsock versions, 106 * it's sufficient to check for specific Winsock2 API availability 107 * at run-time [DSO_global_lookup is recommended]... 108 */ 109 # include <winsock2.h> 110 # include <ws2tcpip.h> 111 /* 112 * Clang-based C++Builder 10.3.3 toolchains cannot find C inline 113 * definitions at link-time. This header defines WspiapiLoad() as an 114 * __inline function. https://quality.embarcadero.com/browse/RSP-33806 115 */ 116 # if !defined(__BORLANDC__) || !defined(__clang__) 117 # include <wspiapi.h> 118 # endif 119 /* yes, they have to be #included prior to <windows.h> */ 120 # endif 121 # include <windows.h> 122 # include <stdio.h> 123 # include <stddef.h> 124 # include <errno.h> 125 # if defined(_WIN32_WCE) && !defined(EACCES) 126 # define EACCES 13 127 # endif 128 # include <string.h> 129 # ifdef _WIN64 130 # define strlen(s) _strlen31(s) 131 /* cut strings to 2GB */ 132 static __inline unsigned int _strlen31(const char *str) 133 { 134 unsigned int len = 0; 135 while (*str && len < 0x80000000U) 136 str++, len++; 137 return len & 0x7FFFFFFF; 138 } 139 # endif 140 # include <malloc.h> 141 # if defined(_MSC_VER) && !defined(_WIN32_WCE) && !defined(_DLL) && defined(stdin) 142 # if _MSC_VER>=1300 && _MSC_VER<1600 143 # undef stdin 144 # undef stdout 145 # undef stderr 146 FILE *__iob_func(); 147 # define stdin (&__iob_func()[0]) 148 # define stdout (&__iob_func()[1]) 149 # define stderr (&__iob_func()[2]) 150 # endif 151 # endif 152 # endif 153 # include <io.h> 154 # include <fcntl.h> 155 156 # ifdef OPENSSL_SYS_WINCE 157 # define OPENSSL_NO_POSIX_IO 158 # endif 159 160 # define EXIT(n) exit(n) 161 # define LIST_SEPARATOR_CHAR ';' 162 # ifndef W_OK 163 # define W_OK 2 164 # endif 165 # ifndef R_OK 166 # define R_OK 4 167 # endif 168 # ifdef OPENSSL_SYS_WINCE 169 # define DEFAULT_HOME "" 170 # else 171 # define DEFAULT_HOME "C:" 172 # endif 173 174 /* Avoid Visual Studio 13 GetVersion deprecated problems */ 175 # if defined(_MSC_VER) && _MSC_VER>=1800 176 # define check_winnt() (1) 177 # define check_win_minplat(x) (1) 178 # else 179 # define check_winnt() (GetVersion() < 0x80000000) 180 # define check_win_minplat(x) (LOBYTE(LOWORD(GetVersion())) >= (x)) 181 # endif 182 183 # else /* The non-microsoft world */ 184 185 # if defined(OPENSSL_SYS_VXWORKS) 186 # include <time.h> 187 # else 188 # include <sys/time.h> 189 # endif 190 191 # ifdef OPENSSL_SYS_VMS 192 # define VMS 1 193 /* 194 * some programs don't include stdlib, so exit() and others give implicit 195 * function warnings 196 */ 197 # include <stdlib.h> 198 # if defined(__DECC) 199 # include <unistd.h> 200 # else 201 # include <unixlib.h> 202 # endif 203 # define LIST_SEPARATOR_CHAR ',' 204 /* We don't have any well-defined random devices on VMS, yet... */ 205 # undef DEVRANDOM 206 /*- 207 We need to do this since VMS has the following coding on status codes: 208 209 Bits 0-2: status type: 0 = warning, 1 = success, 2 = error, 3 = info ... 210 The important thing to know is that odd numbers are considered 211 good, while even ones are considered errors. 212 Bits 3-15: actual status number 213 Bits 16-27: facility number. 0 is considered "unknown" 214 Bits 28-31: control bits. If bit 28 is set, the shell won't try to 215 output the message (which, for random codes, just looks ugly) 216 217 So, what we do here is to change 0 to 1 to get the default success status, 218 and everything else is shifted up to fit into the status number field, and 219 the status is tagged as an error, which is what is wanted here. 220 221 Finally, we add the VMS C facility code 0x35a000, because there are some 222 programs, such as Perl, that will reinterpret the code back to something 223 POSIX. 'man perlvms' explains it further. 224 225 NOTE: the perlvms manual wants to turn all codes 2 to 255 into success 226 codes (status type = 1). I couldn't disagree more. Fortunately, the 227 status type doesn't seem to bother Perl. 228 -- Richard Levitte 229 */ 230 # define EXIT(n) exit((n) ? (((n) << 3) | 2 | 0x10000000 | 0x35a000) : 1) 231 232 # define DEFAULT_HOME "SYS$LOGIN:" 233 234 # else 235 /* !defined VMS */ 236 # include <unistd.h> 237 # include <sys/types.h> 238 # ifdef OPENSSL_SYS_WIN32_CYGWIN 239 # include <io.h> 240 # include <fcntl.h> 241 # endif 242 243 # define LIST_SEPARATOR_CHAR ':' 244 # define EXIT(n) exit(n) 245 # endif 246 247 # endif 248 249 /***********************************************/ 250 251 # if defined(OPENSSL_SYS_WINDOWS) 252 # if (_MSC_VER >= 1310) && !defined(_WIN32_WCE) 253 # define open _open 254 # define fdopen _fdopen 255 # define close _close 256 # ifndef strdup 257 # define strdup _strdup 258 # endif 259 # define unlink _unlink 260 # define fileno _fileno 261 # endif 262 # else 263 # include <strings.h> 264 # endif 265 266 /* vxworks */ 267 # if defined(OPENSSL_SYS_VXWORKS) 268 # include <ioLib.h> 269 # include <tickLib.h> 270 # include <sysLib.h> 271 # include <vxWorks.h> 272 # include <sockLib.h> 273 # include <taskLib.h> 274 275 # define TTY_STRUCT int 276 # define sleep(a) taskDelay((a) * sysClkRateGet()) 277 278 /* 279 * NOTE: these are implemented by helpers in database app! if the database is 280 * not linked, we need to implement them elsewhere 281 */ 282 struct hostent *gethostbyname(const char *name); 283 struct hostent *gethostbyaddr(const char *addr, int length, int type); 284 struct servent *getservbyname(const char *name, const char *proto); 285 286 # endif 287 /* end vxworks */ 288 289 /* system-specific variants defining ossl_sleep() */ 290 #if defined(OPENSSL_SYS_UNIX) || defined(__DJGPP__) 291 # include <unistd.h> 292 static ossl_inline void ossl_sleep(unsigned long millis) 293 { 294 # ifdef OPENSSL_SYS_VXWORKS 295 struct timespec ts; 296 ts.tv_sec = (long int) (millis / 1000); 297 ts.tv_nsec = (long int) (millis % 1000) * 1000000ul; 298 nanosleep(&ts, NULL); 299 # elif defined(__TANDEM) && !defined(_REENTRANT) 300 # include <cextdecs.h(PROCESS_DELAY_)> 301 302 /* HPNS does not support usleep for non threaded apps */ 303 PROCESS_DELAY_(millis * 1000); 304 # else 305 unsigned int s = (unsigned int)(millis / 1000); 306 unsigned int us = (unsigned int)((millis % 1000) * 1000); 307 308 if (s > 0) 309 sleep(s); 310 usleep(us); 311 # endif 312 } 313 #elif defined(_WIN32) 314 # include <windows.h> 315 static ossl_inline void ossl_sleep(unsigned long millis) 316 { 317 Sleep(millis); 318 } 319 #else 320 /* Fallback to a busy wait */ 321 static ossl_inline void ossl_sleep(unsigned long millis) 322 { 323 struct timeval start, now; 324 unsigned long elapsedms; 325 326 gettimeofday(&start, NULL); 327 do { 328 gettimeofday(&now, NULL); 329 elapsedms = (((now.tv_sec - start.tv_sec) * 1000000) 330 + now.tv_usec - start.tv_usec) / 1000; 331 } while (elapsedms < millis); 332 } 333 #endif /* defined OPENSSL_SYS_UNIX */ 334 335 /* ----------------------------- HP NonStop -------------------------------- */ 336 /* Required to support platform variant without getpid() and pid_t. */ 337 # if defined(__TANDEM) && defined(_GUARDIAN_TARGET) 338 # include <strings.h> 339 # include <netdb.h> 340 # define getservbyname(name,proto) getservbyname((char*)name,proto) 341 # define gethostbyname(name) gethostbyname((char*)name) 342 # define ioctlsocket(a,b,c) ioctl(a,b,c) 343 # ifdef NO_GETPID 344 inline int nssgetpid(); 345 # ifndef NSSGETPID_MACRO 346 # define NSSGETPID_MACRO 347 # include <cextdecs.h(PROCESSHANDLE_GETMINE_)> 348 # include <cextdecs.h(PROCESSHANDLE_DECOMPOSE_)> 349 inline int nssgetpid() 350 { 351 short phandle[10]={0}; 352 union pseudo_pid { 353 struct { 354 short cpu; 355 short pin; 356 } cpu_pin ; 357 int ppid; 358 } ppid = { 0 }; 359 PROCESSHANDLE_GETMINE_(phandle); 360 PROCESSHANDLE_DECOMPOSE_(phandle, &ppid.cpu_pin.cpu, &ppid.cpu_pin.pin); 361 return ppid.ppid; 362 } 363 # define getpid(a) nssgetpid(a) 364 # endif /* NSSGETPID_MACRO */ 365 # endif /* NO_GETPID */ 366 /*# define setsockopt(a,b,c,d,f) setsockopt(a,b,c,(char*)d,f)*/ 367 /*# define getsockopt(a,b,c,d,f) getsockopt(a,b,c,(char*)d,f)*/ 368 /*# define connect(a,b,c) connect(a,(struct sockaddr *)b,c)*/ 369 /*# define bind(a,b,c) bind(a,(struct sockaddr *)b,c)*/ 370 /*# define sendto(a,b,c,d,e,f) sendto(a,(char*)b,c,d,(struct sockaddr *)e,f)*/ 371 # if defined(OPENSSL_THREADS) && !defined(_PUT_MODEL_) 372 /* 373 * HPNS SPT threads 374 */ 375 # define SPT_THREAD_SIGNAL 1 376 # define SPT_THREAD_AWARE 1 377 # include <spthread.h> 378 # undef close 379 # define close spt_close 380 /* 381 # define get_last_socket_error() errno 382 # define clear_socket_error() errno=0 383 # define ioctlsocket(a,b,c) ioctl(a,b,c) 384 # define closesocket(s) close(s) 385 # define readsocket(s,b,n) read((s),(char*)(b),(n)) 386 # define writesocket(s,b,n) write((s),(char*)(b),(n) 387 */ 388 # define accept(a,b,c) accept(a,(struct sockaddr *)b,c) 389 # define recvfrom(a,b,c,d,e,f) recvfrom(a,b,(socklen_t)c,d,e,f) 390 # endif 391 # endif 392 393 # ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION 394 # define CRYPTO_memcmp memcmp 395 # endif 396 397 # ifndef OPENSSL_NO_SECURE_MEMORY 398 /* unistd.h defines _POSIX_VERSION */ 399 # if (defined(OPENSSL_SYS_UNIX) \ 400 && ( (defined(_POSIX_VERSION) && _POSIX_VERSION >= 200112L) \ 401 || defined(__sun) || defined(__hpux) || defined(__sgi) \ 402 || defined(__osf__) )) \ 403 || defined(_WIN32) 404 /* secure memory is implemented */ 405 # else 406 # define OPENSSL_NO_SECURE_MEMORY 407 # endif 408 # endif 409 410 /* 411 * str[n]casecmp_l is defined in POSIX 2008-01. Value is taken accordingly 412 * https://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html 413 * There are also equivalent functions on Windows. 414 * There is no locale_t on NONSTOP. 415 */ 416 # if defined(OPENSSL_SYS_WINDOWS) 417 # define locale_t _locale_t 418 # define freelocale _free_locale 419 # define strcasecmp_l _stricmp_l 420 # define strncasecmp_l _strnicmp_l 421 # define strcasecmp _stricmp 422 # define strncasecmp _strnicmp 423 # elif !defined(_POSIX_C_SOURCE) || _POSIX_C_SOURCE < 200809L \ 424 || defined(OPENSSL_SYS_TANDEM) 425 # ifndef OPENSSL_NO_LOCALE 426 # define OPENSSL_NO_LOCALE 427 # endif 428 # endif 429 430 #endif 431