From e527201f6be3c295358bcc8b6bafec598f02dc97 Mon Sep 17 00:00:00 2001 From: Andy Polyakov Date: Mon, 22 Dec 2008 13:54:12 +0000 Subject: [PATCH] This _WIN32-specific patch makes it possible to "wrap" OpenSSL in another .DLL, in particular static build. The issue has been discussed in RT#1230 and later on openssl-dev, and mutually exclusive approaches were suggested. This completes compromise solution suggested in RT#1230. PR: 1230 --- crypto/bio/bss_file.c | 2 +- crypto/des/enc_read.c | 4 ++++ crypto/des/enc_writ.c | 4 ++++ crypto/ocsp/ocsp_ht.c | 3 ++- crypto/rand/randfile.c | 7 +++++++ crypto/ui/ui_openssl.c | 2 ++ crypto/x509/by_dir.c | 3 +++ e_os.h | 28 +++++++++++++++++++++++++++- engines/e_aep.c | 8 +++++--- 9 files changed, 55 insertions(+), 6 deletions(-) diff --git a/crypto/bio/bss_file.c b/crypto/bio/bss_file.c index 545c1b2bdd..480208a315 100644 --- a/crypto/bio/bss_file.c +++ b/crypto/bio/bss_file.c @@ -279,7 +279,7 @@ static long MS_CALLBACK file_ctrl(BIO *b, int cmd, long num, void *ptr) #endif { #if defined(OPENSSL_SYS_WINDOWS) - int fd = fileno((FILE*)ptr); + int fd = _fileno((FILE*)ptr); if (num & BIO_FP_TEXT) _setmode(fd,_O_TEXT); else diff --git a/crypto/des/enc_read.c b/crypto/des/enc_read.c index b86620f568..372ef667b8 100644 --- a/crypto/des/enc_read.c +++ b/crypto/des/enc_read.c @@ -150,7 +150,11 @@ int DES_enc_read(int fd, void *buf, int len, DES_key_schedule *sched, /* first - get the length */ while (net_num < HDRSIZE) { +#ifndef _WIN32 i=read(fd,(void *)&(net[net_num]),HDRSIZE-net_num); +#else + i=_read(fd,(void *)&(net[net_num]),HDRSIZE-net_num); +#endif #ifdef EINTR if ((i == -1) && (errno == EINTR)) continue; #endif diff --git a/crypto/des/enc_writ.c b/crypto/des/enc_writ.c index 6e25b6d4f0..2353ac1e89 100644 --- a/crypto/des/enc_writ.c +++ b/crypto/des/enc_writ.c @@ -156,7 +156,11 @@ int DES_enc_write(int fd, const void *_buf, int len, { /* eay 26/08/92 I was not doing writing from where we * got up to. */ +#ifndef _WIN32 i=write(fd,(void *)&(outbuf[j]),outnum-j); +#else + i=_write(fd,(void *)&(outbuf[j]),outnum-j); +#endif if (i == -1) { #ifdef EINTR diff --git a/crypto/ocsp/ocsp_ht.c b/crypto/ocsp/ocsp_ht.c index dd25f5c85f..38602fae4a 100644 --- a/crypto/ocsp/ocsp_ht.c +++ b/crypto/ocsp/ocsp_ht.c @@ -56,11 +56,12 @@ * */ -#include #include #include #include #include +#include "e_os.h" +#include #include #include #include diff --git a/crypto/rand/randfile.c b/crypto/rand/randfile.c index c4e6160779..4723feecaf 100644 --- a/crypto/rand/randfile.c +++ b/crypto/rand/randfile.c @@ -79,6 +79,13 @@ # include #endif +#ifdef _WIN32 +#define stat _stat +#define chmod _chmod +#define open _open +#define fdopen _fdopen +#endif + #undef BUFSIZE #define BUFSIZE 1024 #define RAND_DATA 1024 diff --git a/crypto/ui/ui_openssl.c b/crypto/ui/ui_openssl.c index 8eabb850ff..1c2dcc406e 100644 --- a/crypto/ui/ui_openssl.c +++ b/crypto/ui/ui_openssl.c @@ -677,6 +677,8 @@ static int noecho_fgets(char *buf, int size, FILE *tty) size--; #ifdef WIN16TTY i=_inchar(); +#elif defined(_WIN32) + i=_getch(); #else i=getch(); #endif diff --git a/crypto/x509/by_dir.c b/crypto/x509/by_dir.c index b355de9b1c..170cd89608 100644 --- a/crypto/x509/by_dir.c +++ b/crypto/x509/by_dir.c @@ -392,6 +392,9 @@ static int get_cert_by_subject(X509_LOOKUP *xl, int type, X509_NAME *name, postfix,k); } #ifndef OPENSSL_NO_POSIX_IO +#ifdef _WIN32 +#define stat _stat +#endif { struct stat st; if (stat(b->data,&st) < 0) diff --git a/e_os.h b/e_os.h index 01d7963ecc..c6c6082c83 100644 --- a/e_os.h +++ b/e_os.h @@ -285,6 +285,7 @@ extern "C" { /* yes, they have to be #included prior */ # endif # include +# include # include # include # include @@ -300,13 +301,38 @@ static unsigned int _strlen31(const char *str) # endif # include # if defined(_MSC_VER) && _MSC_VER<=1200 && defined(_MT) && defined(isspace) - /* compensate for bug is VC6 ctype.h */ + /* compensate for bug in VC6 ctype.h */ # undef isspace # undef isdigit # undef isalnum # undef isupper # undef isxdigit # endif +# if defined(_MSC_VER) && !defined(_DLL) && defined(stdin) +# if _MSC_VER>=1300 +# undef stdin +# undef stdout +# undef stderr + FILE *__iob_func(); +# define stdin (&__iob_func()[0]) +# define stdout (&__iob_func()[1]) +# define stderr (&__iob_func()[2]) +# elif defined(I_CAN_LIVE_WITH_LNK4049) +# undef stdin +# undef stdout +# undef stderr + /* pre-1300 has __p__iob(), but it's available only in msvcrt.lib, + * or in other words with /MD. Declaring implicit import, i.e. + * with _imp_ prefix, works correctly with all compiler options, + * but without /MD results in LINK warning LNK4049: + * 'locally defined symbol "__iob" imported'. + */ + extern FILE *_imp___iob; +# define stdin (&_imp___iob[0]) +# define stdout (&_imp___iob[1]) +# define stderr (&_imp___iob[2]) +# endif +# endif # endif # include # include diff --git a/engines/e_aep.c b/engines/e_aep.c index a91a39f018..742b4f9b18 100644 --- a/engines/e_aep.c +++ b/engines/e_aep.c @@ -867,10 +867,12 @@ static AEP_RV aep_get_connection(AEP_CONNECTION_HNDL_PTR phConnection) CRYPTO_w_lock(CRYPTO_LOCK_ENGINE); -#ifndef NETWARE_CLIB - curr_pid = getpid(); -#else +#ifdef NETWARE_CLIB curr_pid = GetThreadID(); +#elif defined(_WIN32) + curr_pid = _getpid(); +#else + curr_pid = getpid(); #endif /*Check if this is the first time this is being called from the current