1 #define APPLINK_STDIN	1
2 #define APPLINK_STDOUT	2
3 #define APPLINK_STDERR	3
4 #define APPLINK_FPRINTF	4
5 #define APPLINK_FGETS	5
6 #define APPLINK_FREAD	6
7 #define APPLINK_FWRITE	7
8 #define APPLINK_FSETMOD	8
9 #define APPLINK_FEOF	9
10 #define APPLINK_FCLOSE 	10	/* should not be used */
11 
12 #define APPLINK_FOPEN	11	/* solely for completeness */
13 #define APPLINK_FSEEK	12
14 #define APPLINK_FTELL	13
15 #define APPLINK_FFLUSH	14
16 #define APPLINK_FERROR	15
17 #define APPLINK_CLEARERR 16
18 #define APPLINK_FILENO	17	/* to be used with below */
19 
20 #define APPLINK_OPEN	18	/* formally can't be used, as flags can vary */
21 #define APPLINK_READ	19
22 #define APPLINK_WRITE	20
23 #define APPLINK_LSEEK	21
24 #define APPLINK_CLOSE	22
25 #define APPLINK_MAX	22	/* always same as last macro */
26 
27 #ifndef APPMACROS_ONLY
28 #include <stdio.h>
29 #include <io.h>
30 #include <fcntl.h>
31 
app_stdin(void)32 static void *app_stdin(void)		{ return stdin;  }
app_stdout(void)33 static void *app_stdout(void)		{ return stdout; }
app_stderr(void)34 static void *app_stderr(void)		{ return stderr; }
app_feof(FILE * fp)35 static int   app_feof(FILE *fp)		{ return feof(fp); }
app_ferror(FILE * fp)36 static int   app_ferror(FILE *fp)	{ return ferror(fp); }
app_clearerr(FILE * fp)37 static void  app_clearerr(FILE *fp)	{ clearerr(fp); }
app_fileno(FILE * fp)38 static int   app_fileno(FILE *fp)	{ return _fileno(fp); }
app_fsetmod(FILE * fp,char mod)39 static int   app_fsetmod(FILE *fp,char mod)
40 { return _setmode (_fileno(fp),mod=='b'?_O_BINARY:_O_TEXT); }
41 
42 #ifdef __cplusplus
43 extern "C" {
44 #endif
45 
46 __declspec(dllexport)
47 void **
48 #if defined(__BORLANDC__)
49 __stdcall	/* __stdcall appears to be the only way to get the name
50 		 * decoration right with Borland C. Otherwise it works
51 		 * purely incidentally, as we pass no parameters. */
52 #else
53 __cdecl
54 #endif
OPENSSL_Applink(void)55 OPENSSL_Applink(void)
56 { static int once=1;
57   static void *OPENSSL_ApplinkTable[APPLINK_MAX+1]={(void *)APPLINK_MAX};
58 
59     if (once)
60     {	OPENSSL_ApplinkTable[APPLINK_STDIN]	= app_stdin;
61 	OPENSSL_ApplinkTable[APPLINK_STDOUT]	= app_stdout;
62 	OPENSSL_ApplinkTable[APPLINK_STDERR]	= app_stderr;
63 	OPENSSL_ApplinkTable[APPLINK_FPRINTF]	= fprintf;
64 	OPENSSL_ApplinkTable[APPLINK_FGETS]	= fgets;
65 	OPENSSL_ApplinkTable[APPLINK_FREAD]	= fread;
66 	OPENSSL_ApplinkTable[APPLINK_FWRITE]	= fwrite;
67 	OPENSSL_ApplinkTable[APPLINK_FSETMOD]	= app_fsetmod;
68 	OPENSSL_ApplinkTable[APPLINK_FEOF]	= app_feof;
69 	OPENSSL_ApplinkTable[APPLINK_FCLOSE]	= fclose;
70 
71 	OPENSSL_ApplinkTable[APPLINK_FOPEN]	= fopen;
72 	OPENSSL_ApplinkTable[APPLINK_FSEEK]	= fseek;
73 	OPENSSL_ApplinkTable[APPLINK_FTELL]	= ftell;
74 	OPENSSL_ApplinkTable[APPLINK_FFLUSH]	= fflush;
75 	OPENSSL_ApplinkTable[APPLINK_FERROR]	= app_ferror;
76 	OPENSSL_ApplinkTable[APPLINK_CLEARERR]	= app_clearerr;
77 	OPENSSL_ApplinkTable[APPLINK_FILENO]	= app_fileno;
78 
79 	OPENSSL_ApplinkTable[APPLINK_OPEN]	= _open;
80 	OPENSSL_ApplinkTable[APPLINK_READ]	= _read;
81 	OPENSSL_ApplinkTable[APPLINK_WRITE]	= _write;
82 	OPENSSL_ApplinkTable[APPLINK_LSEEK]	= _lseek;
83 	OPENSSL_ApplinkTable[APPLINK_CLOSE]	= _close;
84 
85 	once = 0;
86     }
87 
88   return OPENSSL_ApplinkTable;
89 }
90 
91 #ifdef __cplusplus
92 }
93 #endif
94 #endif
95