Provisional DTLS 1.2 support.
[openssl.git] / ms / applink.c
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
32 static void *app_stdin(void)            { return stdin;  }
33 static void *app_stdout(void)           { return stdout; }
34 static void *app_stderr(void)           { return stderr; }
35 static int   app_feof(FILE *fp)         { return feof(fp); }
36 static int   app_ferror(FILE *fp)       { return ferror(fp); }
37 static void  app_clearerr(FILE *fp)     { clearerr(fp); }
38 static int   app_fileno(FILE *fp)       { return _fileno(fp); }
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
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