1 module deimos.openssl.applink; 2 import core.stdc.stdio; 3 import std.stdio : _fileno, _setmode, _O_BINARY; 4 import core.sys.posix.fcntl; 5 import core.sys.posix.unistd; 6 import core.stdc.stdio; 7 8 enum APPLINK_STDIN =1; 9 enum APPLINK_STDOUT =2; 10 enum APPLINK_STDERR =3; 11 enum APPLINK_FPRINTF =4; 12 enum APPLINK_FGETS =5; 13 enum APPLINK_FREAD =6; 14 enum APPLINK_FWRITE =7; 15 enum APPLINK_FSETMOD =8; 16 enum APPLINK_FEOF =9; 17 enum APPLINK_FCLOSE =10; /* should not be used */ 18 19 enum APPLINK_FOPEN =11; /* solely for completeness */ 20 enum APPLINK_FSEEK =12; 21 enum APPLINK_FTELL =13; 22 enum APPLINK_FFLUSH =14; 23 enum APPLINK_FERROR =15; 24 enum APPLINK_CLEARERR =16; 25 enum APPLINK_FILENO =17; /* to be used with below */ 26 27 enum APPLINK_OPEN =18; /* formally can't be used, as flags can vary */ 28 enum APPLINK_READ =19; 29 enum APPLINK_WRITE =20; 30 enum APPLINK_LSEEK =21; 31 enum APPLINK_CLOSE =22; 32 enum APPLINK_MAX =22; /* always same as last macro */ 33 34 enum _O_TEXT = 0x4000; 35 36 extern(C) 37 { 38 void *app_stdin() 39 { 40 return cast(void*)stdin; 41 } 42 43 void *app_stdout() 44 { 45 return cast(void*)stdout; 46 } 47 48 void *app_stderr() 49 { 50 return cast(void*)stderr; 51 } 52 53 int app_feof(FILE *fp) 54 { 55 return feof(fp); 56 } 57 58 int app_ferror(FILE *fp) 59 { 60 return ferror(fp); 61 } 62 63 void app_clearerr(FILE *fp) 64 { 65 clearerr(fp); 66 } 67 68 int app_fileno(FILE *fp) 69 { 70 return _fileno(fp); 71 } 72 73 int app_fsetmod(FILE *fp, char mod) 74 { 75 return _setmode (_fileno(fp),mod=='b'?_O_BINARY:_O_TEXT); 76 } 77 78 __gshared bool once = true; 79 __gshared void*[APPLINK_MAX+1] OPENSSL_ApplinkTable = cast(void*)APPLINK_MAX; 80 81 export void** OPENSSL_Applink() 82 { 83 if (once) 84 { 85 OPENSSL_ApplinkTable[APPLINK_STDIN] = &app_stdin; 86 OPENSSL_ApplinkTable[APPLINK_STDOUT] = &app_stdout; 87 OPENSSL_ApplinkTable[APPLINK_STDERR] = &app_stderr; 88 OPENSSL_ApplinkTable[APPLINK_FPRINTF] = &fprintf; 89 OPENSSL_ApplinkTable[APPLINK_FGETS] = &fgets; 90 OPENSSL_ApplinkTable[APPLINK_FREAD] = &fread; 91 OPENSSL_ApplinkTable[APPLINK_FWRITE] = &fwrite; 92 OPENSSL_ApplinkTable[APPLINK_FSETMOD] = &app_fsetmod; 93 OPENSSL_ApplinkTable[APPLINK_FEOF] = &app_feof; 94 OPENSSL_ApplinkTable[APPLINK_FCLOSE] = &fclose; 95 96 OPENSSL_ApplinkTable[APPLINK_FOPEN] = &fopen; 97 OPENSSL_ApplinkTable[APPLINK_FSEEK] = &fseek; 98 OPENSSL_ApplinkTable[APPLINK_FTELL] = &ftell; 99 OPENSSL_ApplinkTable[APPLINK_FFLUSH] = &fflush; 100 OPENSSL_ApplinkTable[APPLINK_FERROR] = &app_ferror; 101 OPENSSL_ApplinkTable[APPLINK_CLEARERR] = &app_clearerr; 102 OPENSSL_ApplinkTable[APPLINK_FILENO] = &app_fileno; 103 104 OPENSSL_ApplinkTable[APPLINK_OPEN] = &fopen; 105 OPENSSL_ApplinkTable[APPLINK_READ] = &fread; 106 OPENSSL_ApplinkTable[APPLINK_WRITE] = &fwrite; 107 OPENSSL_ApplinkTable[APPLINK_LSEEK] = &fseek; 108 OPENSSL_ApplinkTable[APPLINK_CLOSE] = &fclose; 109 110 once = false; 111 } 112 113 return OPENSSL_ApplinkTable.ptr; 114 } 115 }