]> git.ipfire.org Git - thirdparty/openssl.git/blame - ms/uplink.c
More Borland removal.
[thirdparty/openssl.git] / ms / uplink.c
CommitLineData
ea1b02db 1#if (defined(_WIN64) || defined(_WIN32_WCE)) && !defined(UNICODE)
0f113f3e 2# define UNICODE
3fc378aa
AP
3#endif
4#if defined(UNICODE) && !defined(_UNICODE)
0f113f3e 5# define _UNICODE
3fc378aa
AP
6#endif
7#if defined(_UNICODE) && !defined(UNICODE)
0f113f3e 8# define UNICODE
3fc378aa 9#endif
3fc378aa
AP
10
11#include <windows.h>
12#include <tchar.h>
13#include <stdio.h>
3fc378aa 14#include "uplink.h"
0f113f3e 15void OPENSSL_showfatal(const char *, ...);
3fc378aa
AP
16
17static TCHAR msg[128];
18
0f113f3e
MC
19static void unimplemented(void)
20{
21 OPENSSL_showfatal(sizeof(TCHAR) == sizeof(char) ? "%s\n" : "%S\n", msg);
22 ExitProcess(1);
3fc378aa
AP
23}
24
0f113f3e
MC
25void OPENSSL_Uplink(volatile void **table, int index)
26{
27 static HMODULE volatile apphandle = NULL;
28 static void **volatile applinktable = NULL;
29 int len;
30 void (*func) (void) = unimplemented;
31 HANDLE h;
32 void **p;
ea1b02db 33
0f113f3e
MC
34 /*
35 * Note that the below code is not MT-safe in respect to msg buffer, but
36 * what's the worst thing that can happen? Error message might be
37 * misleading or corrupted. As error condition is fatal and should never
38 * be risen, I accept the risk...
39 */
40 /*
41 * One can argue that I should have used InterlockedExchangePointer or
42 * something to update static variables and table[]. Well, store
43 * instructions are as atomic as they can get and assigned values are
44 * effectively constant... So that volatile qualifier should be
45 * sufficient [it prohibits compiler to reorder memory access
46 * instructions].
47 */
ea1b02db 48 do {
0f113f3e
MC
49 len = _sntprintf(msg, sizeof(msg) / sizeof(TCHAR),
50 _T("OPENSSL_Uplink(%p,%02X): "), table, index);
51 _tcscpy(msg + len, _T("unimplemented function"));
ea1b02db 52
0f113f3e
MC
53 if ((h = apphandle) == NULL) {
54 if ((h = GetModuleHandle(NULL)) == NULL) {
55 apphandle = (HMODULE) - 1;
56 _tcscpy(msg + len, _T("no host application"));
57 break;
58 }
59 apphandle = h;
60 }
61 if ((h = apphandle) == (HMODULE) - 1) /* revalidate */
62 break;
ea1b02db 63
0f113f3e
MC
64 if (applinktable == NULL) {
65 void **(*applink) ();
ea1b02db 66
0f113f3e
MC
67 applink = (void **(*)())GetProcAddress(h, "OPENSSL_Applink");
68 if (applink == NULL) {
69 apphandle = (HMODULE) - 1;
70 _tcscpy(msg + len, _T("no OPENSSL_Applink"));
71 break;
72 }
73 p = (*applink) ();
74 if (p == NULL) {
75 apphandle = (HMODULE) - 1;
76 _tcscpy(msg + len, _T("no ApplinkTable"));
77 break;
78 }
79 applinktable = p;
80 } else
81 p = applinktable;
3fc378aa 82
0f113f3e
MC
83 if (index > (int)p[0])
84 break;
ea1b02db 85
0f113f3e
MC
86 if (p[index])
87 func = p[index];
ea1b02db 88 } while (0);
3fc378aa 89
ea1b02db 90 table[index] = func;
0f113f3e 91}
3fc378aa 92
3fc378aa 93#ifdef SELFTEST
0f113f3e
MC
94main()
95{
96 UP_fprintf(UP_stdout, "hello, world!\n");
97}
3fc378aa 98#endif