char *str;
int i;
-#if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_WIN16)
- /* A hack to make Visual C++ 5.0 work correctly when linking as
- * a DLL using /MT. Without this, the application cannot use
- * any floating point printf's.
- * It also seems to be needed for Visual C 1.5 (win16) */
- SSLeay_MSVC5_hack = (double)name[0]*(double)name[1];
-#endif
-
if ((app_locks == NULL) && ((app_locks = sk_OPENSSL_STRING_new_null()) == NULL)) {
CRYPTOerr(CRYPTO_F_CRYPTO_GET_NEW_LOCKID, ERR_R_MALLOC_FAILURE);
return (0);
}
#endif
/* Else pick a backup */
-#ifdef OPENSSL_SYS_WIN16
- CRYPTO_THREADID_set_numeric(id, (unsigned long)GetCurrentTask());
-#elif defined(OPENSSL_SYS_WIN32)
- CRYPTO_THREADID_set_numeric(id, (unsigned long)GetCurrentThreadId());
-#elif defined(OPENSSL_SYS_BEOS)
- CRYPTO_THREADID_set_numeric(id, (unsigned long)find_thread(NULL));
-#else
/* For everything else, default to using the address of 'errno' */
CRYPTO_THREADID_set_pointer(id, (void*)&errno);
-#endif
}
int
unsigned long ret = 0;
if (id_callback == NULL) {
-#ifdef OPENSSL_SYS_WIN16
- ret = (unsigned long)GetCurrentTask();
-#elif defined(OPENSSL_SYS_WIN32)
- ret = (unsigned long)GetCurrentThreadId();
-#elif defined(GETPID_IS_MEANINGLESS)
- ret = 1L;
-#elif defined(OPENSSL_SYS_BEOS)
- ret = (unsigned long)find_thread(NULL);
-#else
ret = (unsigned long)getpid();
-#endif
} else
ret = id_callback();
return (ret);
OPENSSL_cpuid_setup(void) {}
#endif
-#if (defined(_WIN32) || defined(__CYGWIN__)) && defined(_WINDLL)
-#ifdef __CYGWIN__
-/* pick DLL_[PROCESS|THREAD]_[ATTACH|DETACH] definitions */
-#include <windows.h>
-/* this has side-effect of _WIN32 getting defined, which otherwise
- * is mutually exclusive with __CYGWIN__... */
-#endif
-
-/* All we really need to do is remove the 'error' state when a thread
- * detaches */
-
-BOOL WINAPI
-DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
-{
- switch (fdwReason) {
- case DLL_PROCESS_ATTACH:
- OPENSSL_cpuid_setup();
-#if defined(_WIN32_WINNT)
- {
- IMAGE_DOS_HEADER *dos_header = (IMAGE_DOS_HEADER *)hinstDLL;
- IMAGE_NT_HEADERS *nt_headers;
-
- if (dos_header->e_magic == IMAGE_DOS_SIGNATURE) {
- nt_headers = (IMAGE_NT_HEADERS *)((char *)dos_header
- + dos_header->e_lfanew);
- if (nt_headers->Signature == IMAGE_NT_SIGNATURE &&
- hinstDLL != (HINSTANCE)(nt_headers->OptionalHeader.ImageBase))
- OPENSSL_NONPIC_relocated = 1;
- }
- }
-#endif
- break;
- case DLL_THREAD_ATTACH:
- break;
- case DLL_THREAD_DETACH:
- break;
- case DLL_PROCESS_DETACH:
- break;
- }
- return (TRUE);
-}
-#endif
-
-#if defined(_WIN32) && !defined(__CYGWIN__)
-#include <tchar.h>
-#include <signal.h>
-#ifdef __WATCOMC__
-#if defined(_UNICODE) || defined(__UNICODE__)
-#define _vsntprintf _vsnwprintf
-#else
-#define _vsntprintf _vsnprintf
-#endif
-#endif
-#ifdef _MSC_VER
-#define alloca _alloca
-#endif
-
-#if defined(_WIN32_WINNT) && _WIN32_WINNT>=0x0333
-int
-OPENSSL_isservice(void)
- { HWINSTA h;
- DWORD len;
- WCHAR *name;
- static union { void *p;
- int (*f)(void);
- } _OPENSSL_isservice = { NULL };
-
- if (_OPENSSL_isservice.p == NULL) {
- HANDLE h = GetModuleHandle(NULL);
- if (h != NULL)
- _OPENSSL_isservice.p = GetProcAddress(h, "_OPENSSL_isservice");
- if (_OPENSSL_isservice.p == NULL)
- _OPENSSL_isservice.p = (void *) - 1;
- }
- if (_OPENSSL_isservice.p != (void *) - 1)
- return (*_OPENSSL_isservice.f)();
-
- (void)GetDesktopWindow(); /* return value is ignored */
-
- h = GetProcessWindowStation();
- if (h == NULL)
- return -1;
-
- if (GetUserObjectInformationW (h, UOI_NAME, NULL, 0, &len) ||
- GetLastError() != ERROR_INSUFFICIENT_BUFFER)
- return -1;
-
- if (len > 512)
- return -1;
- /* paranoia */
- len++, len&=~1;
- /* paranoia */
- name = (WCHAR *)alloca(len + sizeof(WCHAR));
- if (!GetUserObjectInformationW (h, UOI_NAME, name, len, &len))
- return -1;
-
- len++, len&=~1;
- /* paranoia */
- name[len/sizeof(WCHAR)]=L'\0'; /* paranoia */
-#if 1
- /* This doesn't cover "interactive" services [working with real
- * WinSta0's] nor programs started non-interactively by Task
- * Scheduler [those are working with SAWinSta]. */
- if (wcsstr(name, L"Service-0x")) return 1;
-#else
- /* This covers all non-interactive programs such as services. */
- if (!wcsstr(name, L"WinSta0")) return 1;
-#endif
- else return 0;
-}
-#else
- int OPENSSL_isservice(void) { return 0;
-}
-#endif
-
-void OPENSSL_showfatal (const char *fmta,...)
- { va_list ap;
- TCHAR buf[256];
- const TCHAR *fmt;
-#ifdef STD_ERROR_HANDLE /* what a dirty trick! */
- HANDLE h;
-
- if ((h = GetStdHandle(STD_ERROR_HANDLE)) != NULL &&
- GetFileType(h) != FILE_TYPE_UNKNOWN)
- { /* must be console application */
- va_start (ap, fmta);
- vfprintf (stderr, fmta, ap);
- va_end (ap);
- return;
- }
-#endif
-
- if (sizeof(TCHAR) == sizeof(char))
- fmt = (const TCHAR *)fmta;
- else do
- { int keepgoing;
- size_t len_0 = strlen(fmta) + 1, i;
- WCHAR *fmtw;
-
- fmtw = (WCHAR *)alloca(len_0*sizeof(WCHAR));
- if (fmtw == NULL) {
- fmt = (const TCHAR *)L"no stack?";
- break;
- }
-
-#ifndef OPENSSL_NO_MULTIBYTE
- if (!MultiByteToWideChar(CP_ACP, 0, fmta, len_0, fmtw, len_0))
-#endif
- for (i = 0;i < len_0;i++) fmtw[i] = (WCHAR)fmta[i];
-
- for (i = 0; i < len_0; i++)
- { if (fmtw[i]==L'%') do
- { keepgoing = 0;
- switch (fmtw[i + 1])
- { case L'0': case L'1': case L'2': case L'3': case L'4':
- case L'5': case L'6': case L'7': case L'8': case L'9':
- case L'.': case L'*':
- case L'-':
- i++;
- keepgoing = 1;
- break;
- case L's':
- fmtw[i + 1] = L'S';
- break;
- case L'S':
- fmtw[i + 1] = L's';
- break;
- case L'c':
- fmtw[i + 1] = L'C';
- break;
- case L'C':
- fmtw[i + 1] = L'c';
- break;
- }
- } while (keepgoing);
- }
- fmt = (const TCHAR *)fmtw;
- } while (0);
-
- va_start (ap, fmta);
- _vsntprintf (buf, sizeof(buf)/sizeof(TCHAR) - 1, fmt, ap);
- buf [sizeof(buf)/sizeof(TCHAR) - 1] = _T('\0');
- va_end (ap);
-
-#if defined(_WIN32_WINNT) && _WIN32_WINNT>=0x0333
- /* this -------------v--- guards NT-specific calls */
- if (check_winnt() && OPENSSL_isservice() > 0)
- { HANDLE h = RegisterEventSource(0, _T("OPENSSL"));
- const TCHAR *pmsg = buf;
- ReportEvent(h, EVENTLOG_ERROR_TYPE, 0, 0, 0, 1, 0, &pmsg, 0);
- DeregisterEventSource(h);
- } else
-#endif
- MessageBox (NULL, buf, _T("OpenSSL: FATAL"), MB_OK|MB_ICONSTOP);
-}
-#else
void OPENSSL_showfatal(const char *fmta, ...)
{
va_list ap;
{
return 0;
}
-#endif
void
OpenSSLDie(const char *file, int line, const char *assertion)
OPENSSL_showfatal(
"%s(%d): OpenSSL internal error, assertion failed: %s\n",
file, line, assertion);
-#if !defined(_WIN32) || defined(__CYGWIN__)
abort();
-#else
- /* Win32 abort() customarily shows a dialog, but we just did that... */
- raise(SIGABRT);
- _exit(3);
-#endif
}
void *OPENSSL_stderr(void)
char *str;
int i;
-#if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_WIN16)
- /* A hack to make Visual C++ 5.0 work correctly when linking as
- * a DLL using /MT. Without this, the application cannot use
- * any floating point printf's.
- * It also seems to be needed for Visual C 1.5 (win16) */
- SSLeay_MSVC5_hack = (double)name[0]*(double)name[1];
-#endif
-
if ((app_locks == NULL) && ((app_locks = sk_OPENSSL_STRING_new_null()) == NULL)) {
CRYPTOerr(CRYPTO_F_CRYPTO_GET_NEW_LOCKID, ERR_R_MALLOC_FAILURE);
return (0);
}
#endif
/* Else pick a backup */
-#ifdef OPENSSL_SYS_WIN16
- CRYPTO_THREADID_set_numeric(id, (unsigned long)GetCurrentTask());
-#elif defined(OPENSSL_SYS_WIN32)
- CRYPTO_THREADID_set_numeric(id, (unsigned long)GetCurrentThreadId());
-#elif defined(OPENSSL_SYS_BEOS)
- CRYPTO_THREADID_set_numeric(id, (unsigned long)find_thread(NULL));
-#else
/* For everything else, default to using the address of 'errno' */
CRYPTO_THREADID_set_pointer(id, (void*)&errno);
-#endif
}
int
unsigned long ret = 0;
if (id_callback == NULL) {
-#ifdef OPENSSL_SYS_WIN16
- ret = (unsigned long)GetCurrentTask();
-#elif defined(OPENSSL_SYS_WIN32)
- ret = (unsigned long)GetCurrentThreadId();
-#elif defined(GETPID_IS_MEANINGLESS)
- ret = 1L;
-#elif defined(OPENSSL_SYS_BEOS)
- ret = (unsigned long)find_thread(NULL);
-#else
ret = (unsigned long)getpid();
-#endif
} else
ret = id_callback();
return (ret);
OPENSSL_cpuid_setup(void) {}
#endif
-#if (defined(_WIN32) || defined(__CYGWIN__)) && defined(_WINDLL)
-#ifdef __CYGWIN__
-/* pick DLL_[PROCESS|THREAD]_[ATTACH|DETACH] definitions */
-#include <windows.h>
-/* this has side-effect of _WIN32 getting defined, which otherwise
- * is mutually exclusive with __CYGWIN__... */
-#endif
-
-/* All we really need to do is remove the 'error' state when a thread
- * detaches */
-
-BOOL WINAPI
-DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
-{
- switch (fdwReason) {
- case DLL_PROCESS_ATTACH:
- OPENSSL_cpuid_setup();
-#if defined(_WIN32_WINNT)
- {
- IMAGE_DOS_HEADER *dos_header = (IMAGE_DOS_HEADER *)hinstDLL;
- IMAGE_NT_HEADERS *nt_headers;
-
- if (dos_header->e_magic == IMAGE_DOS_SIGNATURE) {
- nt_headers = (IMAGE_NT_HEADERS *)((char *)dos_header
- + dos_header->e_lfanew);
- if (nt_headers->Signature == IMAGE_NT_SIGNATURE &&
- hinstDLL != (HINSTANCE)(nt_headers->OptionalHeader.ImageBase))
- OPENSSL_NONPIC_relocated = 1;
- }
- }
-#endif
- break;
- case DLL_THREAD_ATTACH:
- break;
- case DLL_THREAD_DETACH:
- break;
- case DLL_PROCESS_DETACH:
- break;
- }
- return (TRUE);
-}
-#endif
-
-#if defined(_WIN32) && !defined(__CYGWIN__)
-#include <tchar.h>
-#include <signal.h>
-#ifdef __WATCOMC__
-#if defined(_UNICODE) || defined(__UNICODE__)
-#define _vsntprintf _vsnwprintf
-#else
-#define _vsntprintf _vsnprintf
-#endif
-#endif
-#ifdef _MSC_VER
-#define alloca _alloca
-#endif
-
-#if defined(_WIN32_WINNT) && _WIN32_WINNT>=0x0333
-int
-OPENSSL_isservice(void)
- { HWINSTA h;
- DWORD len;
- WCHAR *name;
- static union { void *p;
- int (*f)(void);
- } _OPENSSL_isservice = { NULL };
-
- if (_OPENSSL_isservice.p == NULL) {
- HANDLE h = GetModuleHandle(NULL);
- if (h != NULL)
- _OPENSSL_isservice.p = GetProcAddress(h, "_OPENSSL_isservice");
- if (_OPENSSL_isservice.p == NULL)
- _OPENSSL_isservice.p = (void *) - 1;
- }
- if (_OPENSSL_isservice.p != (void *) - 1)
- return (*_OPENSSL_isservice.f)();
-
- (void)GetDesktopWindow(); /* return value is ignored */
-
- h = GetProcessWindowStation();
- if (h == NULL)
- return -1;
-
- if (GetUserObjectInformationW (h, UOI_NAME, NULL, 0, &len) ||
- GetLastError() != ERROR_INSUFFICIENT_BUFFER)
- return -1;
-
- if (len > 512)
- return -1;
- /* paranoia */
- len++, len&=~1;
- /* paranoia */
- name = (WCHAR *)alloca(len + sizeof(WCHAR));
- if (!GetUserObjectInformationW (h, UOI_NAME, name, len, &len))
- return -1;
-
- len++, len&=~1;
- /* paranoia */
- name[len/sizeof(WCHAR)]=L'\0'; /* paranoia */
-#if 1
- /* This doesn't cover "interactive" services [working with real
- * WinSta0's] nor programs started non-interactively by Task
- * Scheduler [those are working with SAWinSta]. */
- if (wcsstr(name, L"Service-0x")) return 1;
-#else
- /* This covers all non-interactive programs such as services. */
- if (!wcsstr(name, L"WinSta0")) return 1;
-#endif
- else return 0;
-}
-#else
- int OPENSSL_isservice(void) { return 0;
-}
-#endif
-
-void OPENSSL_showfatal (const char *fmta,...)
- { va_list ap;
- TCHAR buf[256];
- const TCHAR *fmt;
-#ifdef STD_ERROR_HANDLE /* what a dirty trick! */
- HANDLE h;
-
- if ((h = GetStdHandle(STD_ERROR_HANDLE)) != NULL &&
- GetFileType(h) != FILE_TYPE_UNKNOWN)
- { /* must be console application */
- va_start (ap, fmta);
- vfprintf (stderr, fmta, ap);
- va_end (ap);
- return;
- }
-#endif
-
- if (sizeof(TCHAR) == sizeof(char))
- fmt = (const TCHAR *)fmta;
- else do
- { int keepgoing;
- size_t len_0 = strlen(fmta) + 1, i;
- WCHAR *fmtw;
-
- fmtw = (WCHAR *)alloca(len_0*sizeof(WCHAR));
- if (fmtw == NULL) {
- fmt = (const TCHAR *)L"no stack?";
- break;
- }
-
-#ifndef OPENSSL_NO_MULTIBYTE
- if (!MultiByteToWideChar(CP_ACP, 0, fmta, len_0, fmtw, len_0))
-#endif
- for (i = 0;i < len_0;i++) fmtw[i] = (WCHAR)fmta[i];
-
- for (i = 0; i < len_0; i++)
- { if (fmtw[i]==L'%') do
- { keepgoing = 0;
- switch (fmtw[i + 1])
- { case L'0': case L'1': case L'2': case L'3': case L'4':
- case L'5': case L'6': case L'7': case L'8': case L'9':
- case L'.': case L'*':
- case L'-':
- i++;
- keepgoing = 1;
- break;
- case L's':
- fmtw[i + 1] = L'S';
- break;
- case L'S':
- fmtw[i + 1] = L's';
- break;
- case L'c':
- fmtw[i + 1] = L'C';
- break;
- case L'C':
- fmtw[i + 1] = L'c';
- break;
- }
- } while (keepgoing);
- }
- fmt = (const TCHAR *)fmtw;
- } while (0);
-
- va_start (ap, fmta);
- _vsntprintf (buf, sizeof(buf)/sizeof(TCHAR) - 1, fmt, ap);
- buf [sizeof(buf)/sizeof(TCHAR) - 1] = _T('\0');
- va_end (ap);
-
-#if defined(_WIN32_WINNT) && _WIN32_WINNT>=0x0333
- /* this -------------v--- guards NT-specific calls */
- if (check_winnt() && OPENSSL_isservice() > 0)
- { HANDLE h = RegisterEventSource(0, _T("OPENSSL"));
- const TCHAR *pmsg = buf;
- ReportEvent(h, EVENTLOG_ERROR_TYPE, 0, 0, 0, 1, 0, &pmsg, 0);
- DeregisterEventSource(h);
- } else
-#endif
- MessageBox (NULL, buf, _T("OpenSSL: FATAL"), MB_OK|MB_ICONSTOP);
-}
-#else
void OPENSSL_showfatal(const char *fmta, ...)
{
va_list ap;
{
return 0;
}
-#endif
void
OpenSSLDie(const char *file, int line, const char *assertion)
OPENSSL_showfatal(
"%s(%d): OpenSSL internal error, assertion failed: %s\n",
file, line, assertion);
-#if !defined(_WIN32) || defined(__CYGWIN__)
abort();
-#else
- /* Win32 abort() customarily shows a dialog, but we just did that... */
- raise(SIGABRT);
- _exit(3);
-#endif
}
void *OPENSSL_stderr(void)