1 | /*
|
---|
2 | * Copyright 2004-2016 The OpenSSL Project Authors. All Rights Reserved.
|
---|
3 | *
|
---|
4 | * Licensed under the OpenSSL license (the "License"). You may not use
|
---|
5 | * this file except in compliance with the License. You can obtain a copy
|
---|
6 | * in the file LICENSE in the source distribution or at
|
---|
7 | * https://www.openssl.org/source/license.html
|
---|
8 | */
|
---|
9 |
|
---|
10 | #define APPLINK_STDIN 1
|
---|
11 | #define APPLINK_STDOUT 2
|
---|
12 | #define APPLINK_STDERR 3
|
---|
13 | #define APPLINK_FPRINTF 4
|
---|
14 | #define APPLINK_FGETS 5
|
---|
15 | #define APPLINK_FREAD 6
|
---|
16 | #define APPLINK_FWRITE 7
|
---|
17 | #define APPLINK_FSETMOD 8
|
---|
18 | #define APPLINK_FEOF 9
|
---|
19 | #define APPLINK_FCLOSE 10 /* should not be used */
|
---|
20 |
|
---|
21 | #define APPLINK_FOPEN 11 /* solely for completeness */
|
---|
22 | #define APPLINK_FSEEK 12
|
---|
23 | #define APPLINK_FTELL 13
|
---|
24 | #define APPLINK_FFLUSH 14
|
---|
25 | #define APPLINK_FERROR 15
|
---|
26 | #define APPLINK_CLEARERR 16
|
---|
27 | #define APPLINK_FILENO 17 /* to be used with below */
|
---|
28 |
|
---|
29 | #define APPLINK_OPEN 18 /* formally can't be used, as flags can vary */
|
---|
30 | #define APPLINK_READ 19
|
---|
31 | #define APPLINK_WRITE 20
|
---|
32 | #define APPLINK_LSEEK 21
|
---|
33 | #define APPLINK_CLOSE 22
|
---|
34 | #define APPLINK_MAX 22 /* always same as last macro */
|
---|
35 |
|
---|
36 | #ifndef APPMACROS_ONLY
|
---|
37 | # include <stdio.h>
|
---|
38 | # include <io.h>
|
---|
39 | # include <fcntl.h>
|
---|
40 |
|
---|
41 | static void *app_stdin(void)
|
---|
42 | {
|
---|
43 | return stdin;
|
---|
44 | }
|
---|
45 |
|
---|
46 | static void *app_stdout(void)
|
---|
47 | {
|
---|
48 | return stdout;
|
---|
49 | }
|
---|
50 |
|
---|
51 | static void *app_stderr(void)
|
---|
52 | {
|
---|
53 | return stderr;
|
---|
54 | }
|
---|
55 |
|
---|
56 | static int app_feof(FILE *fp)
|
---|
57 | {
|
---|
58 | return feof(fp);
|
---|
59 | }
|
---|
60 |
|
---|
61 | static int app_ferror(FILE *fp)
|
---|
62 | {
|
---|
63 | return ferror(fp);
|
---|
64 | }
|
---|
65 |
|
---|
66 | static void app_clearerr(FILE *fp)
|
---|
67 | {
|
---|
68 | clearerr(fp);
|
---|
69 | }
|
---|
70 |
|
---|
71 | static int app_fileno(FILE *fp)
|
---|
72 | {
|
---|
73 | return _fileno(fp);
|
---|
74 | }
|
---|
75 |
|
---|
76 | static int app_fsetmod(FILE *fp, char mod)
|
---|
77 | {
|
---|
78 | return _setmode(_fileno(fp), mod == 'b' ? _O_BINARY : _O_TEXT);
|
---|
79 | }
|
---|
80 |
|
---|
81 | #ifdef __cplusplus
|
---|
82 | extern "C" {
|
---|
83 | #endif
|
---|
84 |
|
---|
85 | __declspec(dllexport)
|
---|
86 | void **
|
---|
87 | # if defined(__BORLANDC__)
|
---|
88 | /*
|
---|
89 | * __stdcall appears to be the only way to get the name
|
---|
90 | * decoration right with Borland C. Otherwise it works
|
---|
91 | * purely incidentally, as we pass no parameters.
|
---|
92 | */
|
---|
93 | __stdcall
|
---|
94 | # else
|
---|
95 | __cdecl
|
---|
96 | # endif
|
---|
97 | OPENSSL_Applink(void)
|
---|
98 | {
|
---|
99 | static int once = 1;
|
---|
100 | static void *OPENSSL_ApplinkTable[APPLINK_MAX + 1] =
|
---|
101 | { (void *)APPLINK_MAX };
|
---|
102 |
|
---|
103 | if (once) {
|
---|
104 | OPENSSL_ApplinkTable[APPLINK_STDIN] = app_stdin;
|
---|
105 | OPENSSL_ApplinkTable[APPLINK_STDOUT] = app_stdout;
|
---|
106 | OPENSSL_ApplinkTable[APPLINK_STDERR] = app_stderr;
|
---|
107 | OPENSSL_ApplinkTable[APPLINK_FPRINTF] = fprintf;
|
---|
108 | OPENSSL_ApplinkTable[APPLINK_FGETS] = fgets;
|
---|
109 | OPENSSL_ApplinkTable[APPLINK_FREAD] = fread;
|
---|
110 | OPENSSL_ApplinkTable[APPLINK_FWRITE] = fwrite;
|
---|
111 | OPENSSL_ApplinkTable[APPLINK_FSETMOD] = app_fsetmod;
|
---|
112 | OPENSSL_ApplinkTable[APPLINK_FEOF] = app_feof;
|
---|
113 | OPENSSL_ApplinkTable[APPLINK_FCLOSE] = fclose;
|
---|
114 |
|
---|
115 | OPENSSL_ApplinkTable[APPLINK_FOPEN] = fopen;
|
---|
116 | OPENSSL_ApplinkTable[APPLINK_FSEEK] = fseek;
|
---|
117 | OPENSSL_ApplinkTable[APPLINK_FTELL] = ftell;
|
---|
118 | OPENSSL_ApplinkTable[APPLINK_FFLUSH] = fflush;
|
---|
119 | OPENSSL_ApplinkTable[APPLINK_FERROR] = app_ferror;
|
---|
120 | OPENSSL_ApplinkTable[APPLINK_CLEARERR] = app_clearerr;
|
---|
121 | OPENSSL_ApplinkTable[APPLINK_FILENO] = app_fileno;
|
---|
122 |
|
---|
123 | OPENSSL_ApplinkTable[APPLINK_OPEN] = _open;
|
---|
124 | OPENSSL_ApplinkTable[APPLINK_READ] = _read;
|
---|
125 | OPENSSL_ApplinkTable[APPLINK_WRITE] = _write;
|
---|
126 | OPENSSL_ApplinkTable[APPLINK_LSEEK] = _lseek;
|
---|
127 | OPENSSL_ApplinkTable[APPLINK_CLOSE] = _close;
|
---|
128 |
|
---|
129 | once = 0;
|
---|
130 | }
|
---|
131 |
|
---|
132 | return OPENSSL_ApplinkTable;
|
---|
133 | }
|
---|
134 |
|
---|
135 | #ifdef __cplusplus
|
---|
136 | }
|
---|
137 | #endif
|
---|
138 | #endif
|
---|