Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Windows OPENSSL_Applink error patch #29

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 94 additions & 0 deletions C/applink.c
Original file line number Diff line number Diff line change
@@ -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 <stdio.h>
#include <io.h>
#include <fcntl.h>

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
116 changes: 116 additions & 0 deletions deimos/openssl/applink.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
module deimos.openssl.applink;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We want a version (Windows) here.

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)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You don't want to export the implementations, only OPENSSL_Applink.

{
return _setmode (_fileno(fp),mod=='b'?_O_BINARY:_O_TEXT);
}

int once = 1;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Needs to be __gshared and can be a boolean.

void*[APPLINK_MAX+1] OPENSSL_ApplinkTable;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here, use __gshared.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You should also initialize this with cast(void*)APPLINK_MAX, so that the pattern is clear.


void** OPENSSL_Applink()
{
if (once)
{
OPENSSL_ApplinkTable[0] = cast(void*)APPLINK_MAX;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should be default, see above.

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;
}
}