1 /* e_os.h */ 2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 3 * All rights reserved. 4 * 5 * This package is an SSL implementation written 6 * by Eric Young (eay@cryptsoft.com). 7 * The implementation was written so as to conform with Netscapes SSL. 8 * 9 * This library is free for commercial and non-commercial use as long as 10 * the following conditions are aheared to. The following conditions 11 * apply to all code found in this distribution, be it the RC4, RSA, 12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation 13 * included with this distribution is covered by the same copyright terms 14 * except that the holder is Tim Hudson (tjh@cryptsoft.com). 15 * 16 * Copyright remains Eric Young's, and as such any Copyright notices in 17 * the code are not to be removed. 18 * If this package is used in a product, Eric Young should be given attribution 19 * as the author of the parts of the library used. 20 * This can be in the form of a textual message at program startup or 21 * in documentation (online or textual) provided with the package. 22 * 23 * Redistribution and use in source and binary forms, with or without 24 * modification, are permitted provided that the following conditions 25 * are met: 26 * 1. Redistributions of source code must retain the copyright 27 * notice, this list of conditions and the following disclaimer. 28 * 2. Redistributions in binary form must reproduce the above copyright 29 * notice, this list of conditions and the following disclaimer in the 30 * documentation and/or other materials provided with the distribution. 31 * 3. All advertising materials mentioning features or use of this software 32 * must display the following acknowledgement: 33 * "This product includes cryptographic software written by 34 * Eric Young (eay@cryptsoft.com)" 35 * The word 'cryptographic' can be left out if the rouines from the library 36 * being used are not cryptographic related :-). 37 * 4. If you include any Windows specific code (or a derivative thereof) from 38 * the apps directory (application code) you must include an acknowledgement: 39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 40 * 41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51 * SUCH DAMAGE. 52 * 53 * The licence and distribution terms for any publically available version or 54 * derivative of this code cannot be changed. i.e. this code cannot simply be 55 * copied and put under another distribution licence 56 * [including the GNU Public Licence.] 57 */ 58 59 #ifndef HEADER_E_OS_H 60 #define HEADER_E_OS_H 61 62 #include <openssl/opensslconf.h> 63 64 #include <openssl/e_os2.h> 65 /* <openssl/e_os2.h> contains what we can justify to make visible 66 * to the outside; this file e_os.h is not part of the exported 67 * interface. */ 68 69 #ifdef __cplusplus 70 extern "C" { 71 #endif 72 73 /* Used to checking reference counts, most while doing perl5 stuff :-) */ 74 #ifdef REF_PRINT 75 #undef REF_PRINT 76 #define REF_PRINT(a,b) fprintf(stderr,"%08X:%4d:%s\n",(int)b,b->references,a) 77 #endif 78 79 #ifndef DEVRANDOM 80 /* set this to your 'random' device if you have one. 81 * My default, we will try to read this file */ 82 #define DEVRANDOM "/dev/urandom" 83 #endif 84 85 #if defined(__MWERKS__) && defined(macintosh) 86 # if macintosh==1 87 # ifndef MAC_OS_GUSI_SOURCE 88 # define MAC_OS_pre_X 89 # define NO_SYS_TYPES_H 90 typedef long ssize_t; 91 # endif 92 # define NO_SYS_PARAM_H 93 # define NO_CHMOD 94 # define NO_SYSLOG 95 # undef DEVRANDOM 96 # define GETPID_IS_MEANINGLESS 97 # endif 98 #endif 99 100 /******************************************************************** 101 The Microsoft section 102 ********************************************************************/ 103 /* The following is used becaue of the small stack in some 104 * Microsoft operating systems */ 105 #if defined(WIN16) || defined(MSDOS) 106 # define MS_STATIC static 107 #else 108 # define MS_STATIC 109 #endif 110 111 #if defined(_WIN32) && !defined(WIN32) && !defined(__CYGWIN32__) 112 # define WIN32 113 #endif 114 115 #if (defined(WIN32) || defined(WIN16)) && !defined(__CYGWIN32__) 116 # ifndef WINDOWS 117 # define WINDOWS 118 # endif 119 # ifndef MSDOS 120 # define MSDOS 121 # endif 122 #endif 123 124 #if defined(MSDOS) && !defined(GETPID_IS_MEANINGLESS) 125 # define GETPID_IS_MEANINGLESS 126 #endif 127 128 #ifdef WIN32 129 #define get_last_sys_error() GetLastError() 130 #define clear_sys_error() SetLastError(0) 131 #if !defined(WINNT) 132 #define WIN_CONSOLE_BUG 133 #endif 134 #else 135 #define get_last_sys_error() errno 136 #define clear_sys_error() errno=0 137 #endif 138 139 #if defined(WINDOWS) && !defined(__CYGWIN32__) 140 #define get_last_socket_error() WSAGetLastError() 141 #define clear_socket_error() WSASetLastError(0) 142 #define readsocket(s,b,n) recv((s),(b),(n),0) 143 #define writesocket(s,b,n) send((s),(b),(n),0) 144 #define EADDRINUSE WSAEADDRINUSE 145 #elif defined(MAC_OS_pre_X) 146 #define get_last_socket_error() errno 147 #define clear_socket_error() errno=0 148 #define closesocket(s) MacSocket_close(s) 149 #define readsocket(s,b,n) MacSocket_recv((s),(b),(n),true) 150 #define writesocket(s,b,n) MacSocket_send((s),(b),(n)) 151 #else 152 #define get_last_socket_error() errno 153 #define clear_socket_error() errno=0 154 #define ioctlsocket(a,b,c) ioctl(a,b,c) 155 #define closesocket(s) close(s) 156 #define readsocket(s,b,n) read((s),(b),(n)) 157 #define writesocket(s,b,n) write((s),(b),(n)) 158 #endif 159 160 #ifdef WIN16 161 # define NO_FP_API 162 # define MS_CALLBACK _far _loadds 163 # define MS_FAR _far 164 #else 165 # define MS_CALLBACK 166 # define MS_FAR 167 #endif 168 169 #ifdef NO_STDIO 170 # define NO_FP_API 171 #endif 172 173 #if (defined(WINDOWS) || defined(MSDOS)) && !defined(__CYGWIN32__) 174 175 # ifndef S_IFDIR 176 # define S_IFDIR _S_IFDIR 177 # endif 178 179 # ifndef S_IFMT 180 # define S_IFMT _S_IFMT 181 # endif 182 183 # if !defined(WINNT) 184 # define NO_SYSLOG 185 # endif 186 # define NO_DIRENT 187 188 # ifdef WINDOWS 189 # include <windows.h> 190 # include <stddef.h> 191 # include <errno.h> 192 # include <string.h> 193 # include <malloc.h> 194 # endif 195 # include <io.h> 196 # include <fcntl.h> 197 198 # define ssize_t long 199 200 # if defined (__BORLANDC__) 201 # define _setmode setmode 202 # define _O_TEXT O_TEXT 203 # define _O_BINARY O_BINARY 204 # define _int64 __int64 205 # define _kbhit kbhit 206 # endif 207 208 # if defined(WIN16) && !defined(MONOLITH) && defined(SSLEAY) && defined(_WINEXITNOPERSIST) 209 # define EXIT(n) { if (n == 0) _wsetexit(_WINEXITNOPERSIST); return(n); } 210 # else 211 # define EXIT(n) return(n); 212 # endif 213 # define LIST_SEPARATOR_CHAR ';' 214 # ifndef X_OK 215 # define X_OK 0 216 # endif 217 # ifndef W_OK 218 # define W_OK 2 219 # endif 220 # ifndef R_OK 221 # define R_OK 4 222 # endif 223 # define OPENSSL_CONF "openssl.cnf" 224 # define SSLEAY_CONF OPENSSL_CONF 225 # define NUL_DEV "nul" 226 # define RFILE ".rnd" 227 228 #else /* The non-microsoft world world */ 229 230 # if defined(__VMS) && !defined(VMS) 231 # define VMS 1 232 # endif 233 234 # ifdef VMS 235 /* some programs don't include stdlib, so exit() and others give implicit 236 function warnings */ 237 # include <stdlib.h> 238 # if defined(__DECC) 239 # include <unistd.h> 240 # else 241 # include <unixlib.h> 242 # endif 243 # define OPENSSL_CONF "openssl.cnf" 244 # define SSLEAY_CONF OPENSSL_CONF 245 # define RFILE ".rnd" 246 # define LIST_SEPARATOR_CHAR ',' 247 # define NUL_DEV "NLA0:" 248 /* We need to do this since VMS has the following coding on status codes: 249 250 Bits 0-2: status type: 0 = warning, 1 = success, 2 = error, 3 = info ... 251 The important thing to know is that odd numbers are considered 252 good, while even ones are considered errors. 253 Bits 3-15: actual status number 254 Bits 16-27: facility number. 0 is considered "unknown" 255 Bits 28-31: control bits. If bit 28 is set, the shell won't try to 256 output the message (which, for random codes, just looks ugly) 257 258 So, what we do here is to change 0 to 1 to get the default success status, 259 and everything else is shifted up to fit into the status number field, and 260 the status is tagged as an error, which I believe is what is wanted here. 261 -- Richard Levitte 262 */ 263 # if !defined(MONOLITH) || defined(OPENSSL_C) 264 # define EXIT(n) do { int __VMS_EXIT = n; \ 265 if (__VMS_EXIT == 0) \ 266 __VMS_EXIT = 1; \ 267 else \ 268 __VMS_EXIT = (n << 3) | 2; \ 269 __VMS_EXIT |= 0x10000000; \ 270 exit(__VMS_EXIT); \ 271 return(__VMS_EXIT); } while(0) 272 # else 273 # define EXIT(n) return(n) 274 # endif 275 # define NO_SYS_PARAM_H 276 # else 277 /* !defined VMS */ 278 # ifdef MPE 279 # define NO_SYS_PARAM_H 280 # endif 281 # ifdef OPENSSL_UNISTD 282 # include OPENSSL_UNISTD 283 # else 284 # include <unistd.h> 285 # endif 286 # ifndef NO_SYS_TYPES_H 287 # include <sys/types.h> 288 # endif 289 # if defined(NeXT) || defined(NEWS4) 290 # define pid_t int /* pid_t is missing on NEXTSTEP/OPENSTEP 291 * (unless when compiling with -D_POSIX_SOURCE, 292 * which doesn't work for us) */ 293 # define ssize_t int /* ditto */ 294 # endif 295 # ifdef NEWS4 /* setvbuf is missing on mips-sony-bsd */ 296 # define setvbuf(a, b, c, d) setbuffer((a), (b), (d)) 297 typedef unsigned long clock_t; 298 # endif 299 300 # define OPENSSL_CONF "openssl.cnf" 301 # define SSLEAY_CONF OPENSSL_CONF 302 # define RFILE ".rnd" 303 # define LIST_SEPARATOR_CHAR ':' 304 # define NUL_DEV "/dev/null" 305 # ifndef MONOLITH 306 # define EXIT(n) exit(n); return(n) 307 # else 308 # define EXIT(n) return(n) 309 # endif 310 # endif 311 312 # define SSLeay_getpid() getpid() 313 314 #endif 315 316 317 /*************/ 318 319 #ifdef USE_SOCKETS 320 # if defined(WINDOWS) || defined(MSDOS) 321 /* windows world */ 322 323 # ifdef NO_SOCK 324 # define SSLeay_Write(a,b,c) (-1) 325 # define SSLeay_Read(a,b,c) (-1) 326 # define SHUTDOWN(fd) close(fd) 327 # define SHUTDOWN2(fd) close(fd) 328 # else 329 # include <winsock.h> 330 extern HINSTANCE _hInstance; 331 # define SSLeay_Write(a,b,c) send((a),(b),(c),0) 332 # define SSLeay_Read(a,b,c) recv((a),(b),(c),0) 333 # define SHUTDOWN(fd) { shutdown((fd),0); closesocket(fd); } 334 # define SHUTDOWN2(fd) { shutdown((fd),2); closesocket(fd); } 335 # endif 336 337 # elif defined(MAC_OS_pre_X) 338 339 # include "MacSocket.h" 340 # define SSLeay_Write(a,b,c) MacSocket_send((a),(b),(c)) 341 # define SSLeay_Read(a,b,c) MacSocket_recv((a),(b),(c),true) 342 # define SHUTDOWN(fd) MacSocket_close(fd) 343 # define SHUTDOWN2(fd) MacSocket_close(fd) 344 345 # else 346 347 # ifndef NO_SYS_PARAM_H 348 # include <sys/param.h> 349 # endif 350 # ifndef MPE 351 # include <sys/time.h> /* Needed under linux for FD_XXX */ 352 # endif 353 354 # include <netdb.h> 355 # if defined(VMS) && !defined(__DECC) 356 # include <socket.h> 357 # include <in.h> 358 # include <inet.h> 359 # else 360 # include <sys/socket.h> 361 # ifdef FILIO_H 362 # include <sys/filio.h> /* Added for FIONBIO under unixware */ 363 # endif 364 # include <netinet/in.h> 365 # include <arpa/inet.h> 366 # endif 367 368 # if defined(NeXT) || defined(_NEXT_SOURCE) 369 # include <sys/fcntl.h> 370 # include <sys/types.h> 371 # endif 372 373 # ifdef AIX 374 # include <sys/select.h> 375 # endif 376 377 # ifdef __QNX__ 378 # include <sys/select.h> 379 # endif 380 381 # if defined(sun) 382 # include <sys/filio.h> 383 # else 384 # ifndef VMS 385 # include <sys/ioctl.h> 386 # else 387 /* ioctl is only in VMS > 7.0 and when socketshr is not used */ 388 # if !defined(TCPIP_TYPE_SOCKETSHR) && defined(__VMS_VER) && (__VMS_VER > 70000000) 389 # include <sys/ioctl.h> 390 # endif 391 # endif 392 # endif 393 394 # ifdef VMS 395 # include <unixio.h> 396 # if defined(TCPIP_TYPE_SOCKETSHR) 397 # include <socketshr.h> 398 # endif 399 # endif 400 401 # define SSLeay_Read(a,b,c) read((a),(b),(c)) 402 # define SSLeay_Write(a,b,c) write((a),(b),(c)) 403 # define SHUTDOWN(fd) { shutdown((fd),0); closesocket((fd)); } 404 # define SHUTDOWN2(fd) { shutdown((fd),2); closesocket((fd)); } 405 # define INVALID_SOCKET (-1) 406 # endif 407 #endif 408 409 #if defined(__ultrix) 410 # ifndef ssize_t 411 # define ssize_t int 412 # endif 413 #endif 414 415 #if defined(THREADS) || defined(sun) 416 #ifndef _REENTRANT 417 #define _REENTRANT 418 #endif 419 #endif 420 421 #if defined(sun) && !defined(__svr4__) && !defined(__SVR4) 422 /* bcopy can handle overlapping moves according to SunOS 4.1.4 manpage */ 423 # define memmove(s1,s2,n) bcopy((s2),(s1),(n)) 424 # define strtoul(s,e,b) ((unsigned long int)strtol((s),(e),(b))) 425 extern char *sys_errlist[]; extern int sys_nerr; 426 # define strerror(errnum) \ 427 (((errnum)<0 || (errnum)>=sys_nerr) ? NULL : sys_errlist[errnum]) 428 #endif 429 430 /***********************************************/ 431 432 /* do we need to do this for getenv. 433 * Just define getenv for use under windows */ 434 435 #ifdef WIN16 436 /* How to do this needs to be thought out a bit more.... */ 437 /*char *GETENV(char *); 438 #define Getenv GETENV*/ 439 #define Getenv getenv 440 #else 441 #define Getenv getenv 442 #endif 443 444 #define DG_GCC_BUG /* gcc < 2.6.3 on DGUX */ 445 446 #ifdef sgi 447 #define IRIX_CC_BUG /* all version of IRIX I've tested (4.* 5.*) */ 448 #endif 449 #ifdef SNI 450 #define IRIX_CC_BUG /* CDS++ up to V2.0Bsomething suffered from the same bug.*/ 451 #endif 452 453 #ifdef NO_MD2 454 #define MD2_Init MD2Init 455 #define MD2_Update MD2Update 456 #define MD2_Final MD2Final 457 #define MD2_DIGEST_LENGTH 16 458 #endif 459 #ifdef NO_MD5 460 #define MD5_Init MD5Init 461 #define MD5_Update MD5Update 462 #define MD5_Final MD5Final 463 #define MD5_DIGEST_LENGTH 16 464 #endif 465 466 #ifdef __cplusplus 467 } 468 #endif 469 470 #endif 471 472