2 * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
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
11 # define HEADER_E_OS_H
13 # include <openssl/opensslconf.h>
15 # include <openssl/e_os2.h>
17 * <openssl/e_os2.h> contains what we can justify to make visible to the
18 * outside; this file e_os.h is not part of the exported interface.
25 /* Used to checking reference counts, most while doing perl5 stuff :-) */
26 # if defined(OPENSSL_NO_STDIO)
27 # if defined(REF_PRINT)
28 # error "REF_PRINT requires stdio"
33 * We need a format operator for some client tools for uint64_t. If inttypes.h
34 * isn't available or did not define it, just go with hard-coded.
36 # if defined(OPENSSL_SYS_UEFI)
40 # ifdef SIXTY_FOUR_BIT_LONG
47 # if !defined(NDEBUG) && !defined(OPENSSL_NO_STDIO)
48 # define REF_ASSERT_ISNT(test) \
49 (void)((test) ? (OPENSSL_die("refcount error", __FILE__, __LINE__), 1) : 0)
51 # define REF_ASSERT_ISNT(i)
54 # define REF_PRINT_COUNT(a, b) \
55 fprintf(stderr, "%p:%4d:%s\n", b, b->references, a)
57 # define REF_PRINT_COUNT(a, b)
60 # define osslargused(x) (void)x
61 # define OPENSSL_CONF "openssl.cnf"
65 * set this to a comma-separated list of 'random' device files to try out. My
66 * default, we will try to read at least one of these files
68 # define DEVRANDOM "/dev/urandom","/dev/random","/dev/srandom"
70 # if !defined(OPENSSL_NO_EGD) && !defined(DEVRANDOM_EGD)
72 * set this to a comma-separated list of 'egd' sockets to try out. These
73 * sockets will be tried in the order listed in case accessing the device
74 * files listed in DEVRANDOM did not return enough entropy.
76 # define DEVRANDOM_EGD "/var/run/egd-pool","/dev/egd-pool","/etc/egd-pool","/etc/entropy"
79 # if defined(OPENSSL_SYS_VXWORKS)
80 # define NO_SYS_PARAM_H
85 /********************************************************************
87 ********************************************************************/
88 # if defined(OPENSSL_SYS_WIN32) && !defined(WIN32)
91 # if defined(OPENSSL_SYS_WINDOWS) && !defined(WINDOWS)
94 # if defined(OPENSSL_SYS_MSDOS) && !defined(MSDOS)
98 # if (defined(MSDOS) || defined(OPENSSL_SYS_UEFI)) && !defined(GETPID_IS_MEANINGLESS)
99 # define GETPID_IS_MEANINGLESS
104 # define get_last_sys_error() GetLastError()
105 # define clear_sys_error() SetLastError(0)
107 # define WIN_CONSOLE_BUG
110 # define get_last_sys_error() errno
111 # define clear_sys_error() errno=0
114 # if defined(WINDOWS)
115 # define get_last_socket_error() WSAGetLastError()
116 # define clear_socket_error() WSASetLastError(0)
117 # define readsocket(s,b,n) recv((s),(b),(n),0)
118 # define writesocket(s,b,n) send((s),(b),(n),0)
119 # elif defined(__DJGPP__)
121 # define WATT32_NO_OLDIES
122 # define get_last_socket_error() errno
123 # define clear_socket_error() errno=0
124 # define closesocket(s) close_s(s)
125 # define readsocket(s,b,n) read_s(s,b,n)
126 # define writesocket(s,b,n) send(s,b,n,0)
127 # elif defined(OPENSSL_SYS_VMS)
128 # define get_last_socket_error() errno
129 # define clear_socket_error() errno=0
130 # define ioctlsocket(a,b,c) ioctl(a,b,c)
131 # define closesocket(s) close(s)
132 # define readsocket(s,b,n) recv((s),(b),(n),0)
133 # define writesocket(s,b,n) send((s),(b),(n),0)
134 # elif defined(OPENSSL_SYS_VXWORKS)
135 # define get_last_socket_error() errno
136 # define clear_socket_error() errno=0
137 # define ioctlsocket(a,b,c) ioctl((a),(b),(int)(c))
138 # define closesocket(s) close(s)
139 # define readsocket(s,b,n) read((s),(b),(n))
140 # define writesocket(s,b,n) write((s),(char *)(b),(n))
142 # define get_last_socket_error() errno
143 # define clear_socket_error() errno=0
144 # define ioctlsocket(a,b,c) ioctl(a,b,c)
145 # define closesocket(s) close(s)
146 # define readsocket(s,b,n) read((s),(b),(n))
147 # define writesocket(s,b,n) write((s),(b),(n))
150 # if (defined(WINDOWS) || defined(MSDOS))
154 # include <sys/stat.h>
155 # include <sys/socket.h>
159 # define _setmode setmode
160 # define _O_TEXT O_TEXT
161 # define _O_BINARY O_BINARY
162 # define HAS_LFN_SUPPORT(name) (pathconf((name), _PC_NAME_MAX) > 12)
163 # undef DEVRANDOM_EGD /* Neither MS-DOS nor FreeDOS provide 'egd' sockets. */
165 # define DEVRANDOM "/dev/urandom\x24"
166 # endif /* __DJGPP__ */
169 # define S_IFDIR _S_IFDIR
173 # define S_IFMT _S_IFMT
176 # if !defined(WINNT) && !defined(__DJGPP__)
182 # if !defined(_WIN32_WCE) && !defined(_WIN32_WINNT)
184 * Defining _WIN32_WINNT here in e_os.h implies certain "discipline."
185 * Most notably we ought to check for availability of each specific
186 * routine that was introduced after denoted _WIN32_WINNT with
187 * GetProcAddress(). Normally newer functions are masked with higher
188 * _WIN32_WINNT in SDK headers. So that if you wish to use them in
189 * some module, you'd need to override _WIN32_WINNT definition in
190 * the target module in order to "reach for" prototypes, but replace
191 * calls to new functions with indirect calls. Alternatively it
192 * might be possible to achieve the goal by /DELAYLOAD-ing .DLLs
193 * and check for current OS version instead.
195 # define _WIN32_WINNT 0x0501
197 # if defined(_WIN32_WINNT) || defined(_WIN32_WCE)
199 * Just like defining _WIN32_WINNT including winsock2.h implies
200 * certain "discipline" for maintaining [broad] binary compatibility.
201 * As long as structures are invariant among Winsock versions,
202 * it's sufficient to check for specific Winsock2 API availability
203 * at run-time [DSO_global_lookup is recommended]...
205 # include <winsock2.h>
206 # include <ws2tcpip.h>
207 /* yes, they have to be #included prior to <windows.h> */
209 # include <windows.h>
213 # if defined(_WIN32_WCE) && !defined(EACCES)
218 # define strlen(s) _strlen31(s)
219 /* cut strings to 2GB */
220 static __inline unsigned int _strlen31(const char *str)
222 unsigned int len = 0;
223 while (*str && len < 0x80000000U)
225 return len & 0x7FFFFFFF;
229 # if defined(_MSC_VER) && _MSC_VER<=1200 && defined(_MT) && defined(isspace)
230 /* compensate for bug in VC6 ctype.h */
237 # if defined(_MSC_VER) && !defined(_WIN32_WCE) && !defined(_DLL) && defined(stdin)
238 # if _MSC_VER>=1300 && _MSC_VER<1600
243 # define stdin (&__iob_func()[0])
244 # define stdout (&__iob_func()[1])
245 # define stderr (&__iob_func()[2])
246 # elif _MSC_VER<1300 && defined(I_CAN_LIVE_WITH_LNK4049)
251 * pre-1300 has __p__iob(), but it's available only in msvcrt.lib,
252 * or in other words with /MD. Declaring implicit import, i.e. with
253 * _imp_ prefix, works correctly with all compiler options, but
254 * without /MD results in LINK warning LNK4049: 'locally defined
255 * symbol "__iob" imported'.
257 extern FILE *_imp___iob;
258 # define stdin (&_imp___iob[0])
259 # define stdout (&_imp___iob[1])
260 # define stderr (&_imp___iob[2])
267 # ifdef OPENSSL_SYS_WINCE
268 # define OPENSSL_NO_POSIX_IO
271 # define EXIT(n) exit(n)
272 # define LIST_SEPARATOR_CHAR ';'
282 # ifdef OPENSSL_SYS_WINCE
283 # define DEFAULT_HOME ""
285 # define DEFAULT_HOME "C:"
288 /* Avoid Visual Studio 13 GetVersion deprecated problems */
289 # if defined(_MSC_VER) && _MSC_VER>=1800
290 # define check_winnt() (1)
291 # define check_win_minplat(x) (1)
293 # define check_winnt() (GetVersion() < 0x80000000)
294 # define check_win_minplat(x) (LOBYTE(LOWORD(GetVersion())) >= (x))
297 # else /* The non-microsoft world */
299 # ifdef OPENSSL_SYS_VMS
302 * some programs don't include stdlib, so exit() and others give implicit
309 # include <unixlib.h>
311 # define LIST_SEPARATOR_CHAR ','
312 /* We don't have any well-defined random devices on VMS, yet... */
315 We need to do this since VMS has the following coding on status codes:
317 Bits 0-2: status type: 0 = warning, 1 = success, 2 = error, 3 = info ...
318 The important thing to know is that odd numbers are considered
319 good, while even ones are considered errors.
320 Bits 3-15: actual status number
321 Bits 16-27: facility number. 0 is considered "unknown"
322 Bits 28-31: control bits. If bit 28 is set, the shell won't try to
323 output the message (which, for random codes, just looks ugly)
325 So, what we do here is to change 0 to 1 to get the default success status,
326 and everything else is shifted up to fit into the status number field, and
327 the status is tagged as an error, which is what is wanted here.
329 Finally, we add the VMS C facility code 0x35a000, because there are some
330 programs, such as Perl, that will reinterpret the code back to something
331 POSIXly. 'man perlvms' explains it further.
333 NOTE: the perlvms manual wants to turn all codes 2 to 255 into success
334 codes (status type = 1). I couldn't disagree more. Fortunately, the
335 status type doesn't seem to bother Perl.
338 # define EXIT(n) exit((n) ? (((n) << 3) | 2 | 0x10000000 | 0x35a000) : 1)
340 # define NO_SYS_PARAM_H
343 # define DEFAULT_HOME "SYS$LOGIN:"
347 # ifdef OPENSSL_UNISTD
348 # include OPENSSL_UNISTD
352 # ifndef NO_SYS_TYPES_H
353 # include <sys/types.h>
355 # ifdef OPENSSL_SYS_WIN32_CYGWIN
360 # define LIST_SEPARATOR_CHAR ':'
361 # define EXIT(n) exit(n)
369 # ifdef OPENSSL_NO_SOCK
370 # elif defined(WINDOWS) || defined(MSDOS)
372 # if !defined(__DJGPP__)
373 # if defined(_WIN32_WCE) && _WIN32_WCE<410
374 # define getservbyname _masked_declaration_getservbyname
376 # if !defined(IPPROTO_IP)
377 /* winsock[2].h was included already? */
378 # include <winsock.h>
380 # ifdef getservbyname
381 # undef getservbyname
382 /* this is used to be wcecompat/include/winsock_extras.h */
383 struct servent *PASCAL getservbyname(const char *, const char *);
388 * Even though sizeof(SOCKET) is 8, it's safe to cast it to int, because
389 * the value constitutes an index in per-process table of limited size
390 * and not a real pointer. And we also depend on fact that all processors
391 * Windows run on happen to be two's-complement, which allows to
392 * interchange INVALID_SOCKET and -1.
394 # define socket(d,t,p) ((int)socket(d,t,p))
395 # define accept(s,f,l) ((int)accept(s,f,l))
402 # ifndef NO_SYS_PARAM_H
403 # include <sys/param.h>
405 # ifdef OPENSSL_SYS_VXWORKS
410 # if defined(OPENSSL_SYS_VMS_NODECC)
415 # include <sys/socket.h>
417 # ifdef OPENSSL_SYS_VXWORKS
418 # include <streams/un.h>
422 # ifndef UNIX_PATH_MAX
423 # define UNIX_PATH_MAX sizeof(((struct sockaddr_un *)NULL)->sun_path)
427 # include <sys/filio.h> /* FIONBIO in some SVR4, e.g. unixware, solaris */
429 # include <netinet/in.h>
430 # include <arpa/inet.h>
431 # include <netinet/tcp.h>
434 # ifdef OPENSSL_SYS_AIX
435 # include <sys/select.h>
439 # include <sys/select.h>
443 # include <sys/ioctl.h>
445 /* ioctl is only in VMS > 7.0 and when socketshr is not used */
446 # if !defined(TCPIP_TYPE_SOCKETSHR) && defined(__VMS_VER) && (__VMS_VER > 70000000)
447 # include <sys/ioctl.h>
453 # if defined(TCPIP_TYPE_SOCKETSHR)
454 # include <socketshr.h>
458 # ifndef INVALID_SOCKET
459 # define INVALID_SOCKET (-1)
460 # endif /* INVALID_SOCKET */
464 * Some IPv6 implementations are broken, disable them in known bad versions.
466 # if !defined(OPENSSL_USE_IPV6)
467 # if defined(AF_INET6) && !defined(NETWARE_CLIB)
468 # define OPENSSL_USE_IPV6 1
470 # define OPENSSL_USE_IPV6 0
476 # ifndef OPENSSL_EXIT
477 # if defined(MONOLITH) && !defined(OPENSSL_C)
478 # define OPENSSL_EXIT(n) return(n)
480 # define OPENSSL_EXIT(n) do { EXIT(n); return(n); } while(0)
484 /***********************************************/
486 # if defined(OPENSSL_SYS_WINDOWS)
487 # define strcasecmp _stricmp
488 # define strncasecmp _strnicmp
489 # if (_MSC_VER >= 1310)
491 # define fdopen _fdopen
492 # define close _close
494 # define strdup _strdup
496 # define unlink _unlink
499 # include <strings.h>
503 # if defined(OPENSSL_SYS_VXWORKS)
505 # include <tickLib.h>
508 # define TTY_STRUCT int
510 # define sleep(a) taskDelay((a) * sysClkRateGet())
512 # include <vxWorks.h>
513 # include <sockLib.h>
514 # include <taskLib.h>
516 # define getpid taskIdSelf
519 * NOTE: these are implemented by helpers in database app! if the database is
520 * not linked, we need to implement them elswhere
522 struct hostent *gethostbyname(const char *name);
523 struct hostent *gethostbyaddr(const char *addr, int length, int type);
524 struct servent *getservbyname(const char *name, const char *proto);
529 #define OSSL_NELEM(x) (sizeof(x)/sizeof(x[0]))