From 4904558cf737d47b91d4eaffada7301c6cf09a2a Mon Sep 17 00:00:00 2001 From: Carlin St Pierre Date: Sun, 21 Dec 2014 14:54:43 +1300 Subject: [PATCH 1/5] Added converted version of applink.c to be compatiable with D for use with Windows DLLs --- deimos/openssl/applink.d | 116 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 deimos/openssl/applink.d diff --git a/deimos/openssl/applink.d b/deimos/openssl/applink.d new file mode 100644 index 0000000..e99844e --- /dev/null +++ b/deimos/openssl/applink.d @@ -0,0 +1,116 @@ +module deimos.openssl.applink; +import core.stdc.stdio; +import std.stdio : _fileno, _setmode, _O_BINARY; +import core.sys.posix.fcntl; +import core.sys.posix.unistd; +import core.stdc.stdio; + +enum APPLINK_STDIN =1; +enum APPLINK_STDOUT =2; +enum APPLINK_STDERR =3; +enum APPLINK_FPRINTF =4; +enum APPLINK_FGETS =5; +enum APPLINK_FREAD =6; +enum APPLINK_FWRITE =7; +enum APPLINK_FSETMOD =8; +enum APPLINK_FEOF =9; +enum APPLINK_FCLOSE =10; /* should not be used */ + +enum APPLINK_FOPEN =11; /* solely for completeness */ +enum APPLINK_FSEEK =12; +enum APPLINK_FTELL =13; +enum APPLINK_FFLUSH =14; +enum APPLINK_FERROR =15; +enum APPLINK_CLEARERR =16; +enum APPLINK_FILENO =17; /* to be used with below */ + +enum APPLINK_OPEN =18; /* formally can't be used, as flags can vary */ +enum APPLINK_READ =19; +enum APPLINK_WRITE =20; +enum APPLINK_LSEEK =21; +enum APPLINK_CLOSE =22; +enum APPLINK_MAX =22; /* always same as last macro */ + +enum _O_TEXT = 0x4000; + +export extern(C) +{ + void *app_stdin() + { + return cast(void*)stdin; + } + + void *app_stdout() + { + return cast(void*)stdout; + } + + void *app_stderr() + { + return cast(void*)stderr; + } + + int app_feof(FILE *fp) + { + return feof(fp); + } + + int app_ferror(FILE *fp) + { + return ferror(fp); + } + + void app_clearerr(FILE *fp) + { + clearerr(fp); + } + + int app_fileno(FILE *fp) + { + return _fileno(fp); + } + + int app_fsetmod(FILE *fp, char mod) + { + return _setmode (_fileno(fp),mod=='b'?_O_BINARY:_O_TEXT); + } + + int once = 1; + void*[APPLINK_MAX+1] OPENSSL_ApplinkTable; + + void** OPENSSL_Applink() + { + if (once) + { + OPENSSL_ApplinkTable[0] = cast(void*)APPLINK_MAX; + OPENSSL_ApplinkTable[APPLINK_STDIN] = &app_stdin; + OPENSSL_ApplinkTable[APPLINK_STDOUT] = &app_stdout; + OPENSSL_ApplinkTable[APPLINK_STDERR] = &app_stderr; + OPENSSL_ApplinkTable[APPLINK_FPRINTF] = &fprintf; + OPENSSL_ApplinkTable[APPLINK_FGETS] = &fgets; + OPENSSL_ApplinkTable[APPLINK_FREAD] = &fread; + OPENSSL_ApplinkTable[APPLINK_FWRITE] = &fwrite; + OPENSSL_ApplinkTable[APPLINK_FSETMOD] = &app_fsetmod; + OPENSSL_ApplinkTable[APPLINK_FEOF] = &app_feof; + OPENSSL_ApplinkTable[APPLINK_FCLOSE] = &fclose; + + OPENSSL_ApplinkTable[APPLINK_FOPEN] = &fopen; + OPENSSL_ApplinkTable[APPLINK_FSEEK] = &fseek; + OPENSSL_ApplinkTable[APPLINK_FTELL] = &ftell; + OPENSSL_ApplinkTable[APPLINK_FFLUSH] = &fflush; + OPENSSL_ApplinkTable[APPLINK_FERROR] = &app_ferror; + OPENSSL_ApplinkTable[APPLINK_CLEARERR] = &app_clearerr; + OPENSSL_ApplinkTable[APPLINK_FILENO] = &app_fileno; + + OPENSSL_ApplinkTable[APPLINK_OPEN] = &fopen; + OPENSSL_ApplinkTable[APPLINK_READ] = &fread; + OPENSSL_ApplinkTable[APPLINK_WRITE] = &fwrite; + OPENSSL_ApplinkTable[APPLINK_LSEEK] = &fseek; + OPENSSL_ApplinkTable[APPLINK_CLOSE] = &fclose; + + once = 0; + } + + return OPENSSL_ApplinkTable.ptr; + } +} \ No newline at end of file From 641ebc08248cd2eb01f5a13573d983dc9056d9c4 Mon Sep 17 00:00:00 2001 From: Carlin St Pierre Date: Sun, 21 Dec 2014 17:51:52 +1300 Subject: [PATCH 2/5] Added original C file for reference --- C/applink.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 C/applink.c diff --git a/C/applink.c b/C/applink.c new file mode 100644 index 0000000..d7faeb2 --- /dev/null +++ b/C/applink.c @@ -0,0 +1,94 @@ +#define APPLINK_STDIN 1 +#define APPLINK_STDOUT 2 +#define APPLINK_STDERR 3 +#define APPLINK_FPRINTF 4 +#define APPLINK_FGETS 5 +#define APPLINK_FREAD 6 +#define APPLINK_FWRITE 7 +#define APPLINK_FSETMOD 8 +#define APPLINK_FEOF 9 +#define APPLINK_FCLOSE 10 /* should not be used */ + +#define APPLINK_FOPEN 11 /* solely for completeness */ +#define APPLINK_FSEEK 12 +#define APPLINK_FTELL 13 +#define APPLINK_FFLUSH 14 +#define APPLINK_FERROR 15 +#define APPLINK_CLEARERR 16 +#define APPLINK_FILENO 17 /* to be used with below */ + +#define APPLINK_OPEN 18 /* formally can't be used, as flags can vary */ +#define APPLINK_READ 19 +#define APPLINK_WRITE 20 +#define APPLINK_LSEEK 21 +#define APPLINK_CLOSE 22 +#define APPLINK_MAX 22 /* always same as last macro */ + +#ifndef APPMACROS_ONLY +#include +#include +#include + +static void *app_stdin(void) { return stdin; } +static void *app_stdout(void) { return stdout; } +static void *app_stderr(void) { return stderr; } +static int app_feof(FILE *fp) { return feof(fp); } +static int app_ferror(FILE *fp) { return ferror(fp); } +static void app_clearerr(FILE *fp) { clearerr(fp); } +static int app_fileno(FILE *fp) { return _fileno(fp); } +static int app_fsetmod(FILE *fp,char mod) +{ return _setmode (_fileno(fp),mod=='b'?_O_BINARY:_O_TEXT); } + +#ifdef __cplusplus +extern "C" { +#endif + +__declspec(dllexport) +void ** +#if defined(__BORLANDC__) +__stdcall /* __stdcall appears to be the only way to get the name + * decoration right with Borland C. Otherwise it works + * purely incidentally, as we pass no parameters. */ +#else +__cdecl +#endif +OPENSSL_Applink(void) +{ static int once=1; + static void *OPENSSL_ApplinkTable[APPLINK_MAX+1]={(void *)APPLINK_MAX}; + + if (once) + { OPENSSL_ApplinkTable[APPLINK_STDIN] = app_stdin; + OPENSSL_ApplinkTable[APPLINK_STDOUT] = app_stdout; + OPENSSL_ApplinkTable[APPLINK_STDERR] = app_stderr; + OPENSSL_ApplinkTable[APPLINK_FPRINTF] = fprintf; + OPENSSL_ApplinkTable[APPLINK_FGETS] = fgets; + OPENSSL_ApplinkTable[APPLINK_FREAD] = fread; + OPENSSL_ApplinkTable[APPLINK_FWRITE] = fwrite; + OPENSSL_ApplinkTable[APPLINK_FSETMOD] = app_fsetmod; + OPENSSL_ApplinkTable[APPLINK_FEOF] = app_feof; + OPENSSL_ApplinkTable[APPLINK_FCLOSE] = fclose; + + OPENSSL_ApplinkTable[APPLINK_FOPEN] = fopen; + OPENSSL_ApplinkTable[APPLINK_FSEEK] = fseek; + OPENSSL_ApplinkTable[APPLINK_FTELL] = ftell; + OPENSSL_ApplinkTable[APPLINK_FFLUSH] = fflush; + OPENSSL_ApplinkTable[APPLINK_FERROR] = app_ferror; + OPENSSL_ApplinkTable[APPLINK_CLEARERR] = app_clearerr; + OPENSSL_ApplinkTable[APPLINK_FILENO] = app_fileno; + + OPENSSL_ApplinkTable[APPLINK_OPEN] = _open; + OPENSSL_ApplinkTable[APPLINK_READ] = _read; + OPENSSL_ApplinkTable[APPLINK_WRITE] = _write; + OPENSSL_ApplinkTable[APPLINK_LSEEK] = _lseek; + OPENSSL_ApplinkTable[APPLINK_CLOSE] = _close; + + once = 0; + } + + return OPENSSL_ApplinkTable; +} + +#ifdef __cplusplus +} +#endif +#endif \ No newline at end of file From 30f5a4c48b64a5672ed7541646cf97e63c23eb65 Mon Sep 17 00:00:00 2001 From: Carlin St Pierre Date: Sun, 21 Dec 2014 17:53:46 +1300 Subject: [PATCH 3/5] Added newline to the end of the file --- C/applink.c | 2 +- deimos/openssl/applink.d | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/C/applink.c b/C/applink.c index d7faeb2..54a0a64 100644 --- a/C/applink.c +++ b/C/applink.c @@ -91,4 +91,4 @@ OPENSSL_Applink(void) #ifdef __cplusplus } #endif -#endif \ No newline at end of file +#endif diff --git a/deimos/openssl/applink.d b/deimos/openssl/applink.d index e99844e..c7d40ad 100644 --- a/deimos/openssl/applink.d +++ b/deimos/openssl/applink.d @@ -113,4 +113,4 @@ export extern(C) return OPENSSL_ApplinkTable.ptr; } -} \ No newline at end of file +} From 3bfac4bd6c2a592e61db617289a1b00720463289 Mon Sep 17 00:00:00 2001 From: Carlin St Pierre Date: Tue, 23 Dec 2014 12:16:17 +1300 Subject: [PATCH 4/5] Removed unnecessary exports, added __gshared, 'once' is now boolean --- deimos/openssl/applink.d | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/deimos/openssl/applink.d b/deimos/openssl/applink.d index c7d40ad..6d659d9 100644 --- a/deimos/openssl/applink.d +++ b/deimos/openssl/applink.d @@ -1,4 +1,4 @@ -module deimos.openssl.applink; +module openssl.applink; import core.stdc.stdio; import std.stdio : _fileno, _setmode, _O_BINARY; import core.sys.posix.fcntl; @@ -33,7 +33,7 @@ enum APPLINK_MAX =22; /* always same as last macro */ enum _O_TEXT = 0x4000; -export extern(C) +extern(C) { void *app_stdin() { @@ -75,14 +75,13 @@ export extern(C) return _setmode (_fileno(fp),mod=='b'?_O_BINARY:_O_TEXT); } - int once = 1; - void*[APPLINK_MAX+1] OPENSSL_ApplinkTable; + __gshared bool once = true; + __gshared void*[APPLINK_MAX+1] OPENSSL_ApplinkTable = cast(void*)APPLINK_MAX; - void** OPENSSL_Applink() + export void** OPENSSL_Applink() { if (once) { - OPENSSL_ApplinkTable[0] = cast(void*)APPLINK_MAX; OPENSSL_ApplinkTable[APPLINK_STDIN] = &app_stdin; OPENSSL_ApplinkTable[APPLINK_STDOUT] = &app_stdout; OPENSSL_ApplinkTable[APPLINK_STDERR] = &app_stderr; @@ -108,9 +107,9 @@ export extern(C) OPENSSL_ApplinkTable[APPLINK_LSEEK] = &fseek; OPENSSL_ApplinkTable[APPLINK_CLOSE] = &fclose; - once = 0; + once = false; } return OPENSSL_ApplinkTable.ptr; } -} +} \ No newline at end of file From e57bba7ab578204045dc8632bb9a1959208632d6 Mon Sep 17 00:00:00 2001 From: Carlin St Pierre Date: Tue, 23 Dec 2014 12:17:39 +1300 Subject: [PATCH 5/5] Corrected module name --- deimos/openssl/applink.d | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deimos/openssl/applink.d b/deimos/openssl/applink.d index 6d659d9..22f7056 100644 --- a/deimos/openssl/applink.d +++ b/deimos/openssl/applink.d @@ -1,4 +1,4 @@ -module openssl.applink; +module deimos.openssl.applink; import core.stdc.stdio; import std.stdio : _fileno, _setmode, _O_BINARY; import core.sys.posix.fcntl;