summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/dso
diff options
context:
space:
mode:
authorcvs2svn <admin@example.com>2002-05-15 02:29:23 +0000
committercvs2svn <admin@example.com>2002-05-15 02:29:23 +0000
commitfd9566423b542798f5c8b06e68101a9ea5bb9885 (patch)
treef2cc037857a260afc5aaaaaa6cf62d06923c6273 /src/lib/libcrypto/dso
parent536c76cbb863bab152f19842ab88772c01e922c7 (diff)
downloadopenbsd-fd9566423b542798f5c8b06e68101a9ea5bb9885.tar.gz
openbsd-fd9566423b542798f5c8b06e68101a9ea5bb9885.tar.bz2
openbsd-fd9566423b542798f5c8b06e68101a9ea5bb9885.zip
This commit was manufactured by cvs2git to create branch 'openssl'.
Diffstat (limited to 'src/lib/libcrypto/dso')
-rw-r--r--src/lib/libcrypto/dso/README24
-rw-r--r--src/lib/libcrypto/dso/dso_dl.c251
-rw-r--r--src/lib/libcrypto/dso/dso_vms.c371
-rw-r--r--src/lib/libcrypto/dso/dso_win32.c273
4 files changed, 919 insertions, 0 deletions
diff --git a/src/lib/libcrypto/dso/README b/src/lib/libcrypto/dso/README
new file mode 100644
index 0000000000..6ba03c5631
--- /dev/null
+++ b/src/lib/libcrypto/dso/README
@@ -0,0 +1,24 @@
1TODO
2----
3
4Find a way where name-translation can be done in a way that is
5sensitive to particular methods (ie. generic code could still do
6different path/filename substitutions on win32 to what it does on
7*nix) but doesn't assume some canonical form. Already one case
8exists where the "blah -> (libblah.so,blah.dll)" mapping doesn't
9suffice. I suspect a callback with an enumerated (or string?)
10parameter could be the way to go here ... DSO_ctrl the callback
11into place and it can be invoked to handle name translation with
12some clue to the calling code as to what kind of system it is.
13
14NOTES
15-----
16
17I've checked out HPUX (well, version 11 at least) and shl_t is
18a pointer type so it's safe to use in the way it has been in
19dso_dl.c. On the other hand, HPUX11 support dlfcn too and
20according to their man page, prefer developers to move to that.
21I'll leave Richard's changes there as I guess dso_dl is needed
22for HPUX10.20.
23
24
diff --git a/src/lib/libcrypto/dso/dso_dl.c b/src/lib/libcrypto/dso/dso_dl.c
new file mode 100644
index 0000000000..69810fc3bb
--- /dev/null
+++ b/src/lib/libcrypto/dso/dso_dl.c
@@ -0,0 +1,251 @@
1/* dso_dl.c */
2/* Written by Richard Levitte (levitte@openssl.org) for the OpenSSL
3 * project 2000.
4 */
5/* ====================================================================
6 * Copyright (c) 2000 The OpenSSL Project. All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 *
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 *
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in
17 * the documentation and/or other materials provided with the
18 * distribution.
19 *
20 * 3. All advertising materials mentioning features or use of this
21 * software must display the following acknowledgment:
22 * "This product includes software developed by the OpenSSL Project
23 * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24 *
25 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26 * endorse or promote products derived from this software without
27 * prior written permission. For written permission, please contact
28 * licensing@OpenSSL.org.
29 *
30 * 5. Products derived from this software may not be called "OpenSSL"
31 * nor may "OpenSSL" appear in their names without prior written
32 * permission of the OpenSSL Project.
33 *
34 * 6. Redistributions of any form whatsoever must retain the following
35 * acknowledgment:
36 * "This product includes software developed by the OpenSSL Project
37 * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38 *
39 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
43 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50 * OF THE POSSIBILITY OF SUCH DAMAGE.
51 * ====================================================================
52 *
53 * This product includes cryptographic software written by Eric Young
54 * (eay@cryptsoft.com). This product includes software written by Tim
55 * Hudson (tjh@cryptsoft.com).
56 *
57 */
58
59#include <stdio.h>
60#include "cryptlib.h"
61#include <openssl/dso.h>
62
63#ifndef DSO_DL
64DSO_METHOD *DSO_METHOD_dl(void)
65 {
66 return NULL;
67 }
68#else
69
70#include <dl.h>
71
72/* Part of the hack in "dl_load" ... */
73#define DSO_MAX_TRANSLATED_SIZE 256
74
75static int dl_load(DSO *dso, const char *filename);
76static int dl_unload(DSO *dso);
77static void *dl_bind_var(DSO *dso, const char *symname);
78static DSO_FUNC_TYPE dl_bind_func(DSO *dso, const char *symname);
79#if 0
80static int dl_unbind_var(DSO *dso, char *symname, void *symptr);
81static int dl_unbind_func(DSO *dso, char *symname, DSO_FUNC_TYPE symptr);
82static int dl_init(DSO *dso);
83static int dl_finish(DSO *dso);
84#endif
85static int dl_ctrl(DSO *dso, int cmd, long larg, void *parg);
86
87static DSO_METHOD dso_meth_dl = {
88 "OpenSSL 'dl' shared library method",
89 dl_load,
90 dl_unload,
91 dl_bind_var,
92 dl_bind_func,
93/* For now, "unbind" doesn't exist */
94#if 0
95 NULL, /* unbind_var */
96 NULL, /* unbind_func */
97#endif
98 dl_ctrl,
99 NULL, /* init */
100 NULL /* finish */
101 };
102
103DSO_METHOD *DSO_METHOD_dl(void)
104 {
105 return(&dso_meth_dl);
106 }
107
108/* For this DSO_METHOD, our meth_data STACK will contain;
109 * (i) the handle (shl_t) returned from shl_load().
110 * NB: I checked on HPUX11 and shl_t is itself a pointer
111 * type so the cast is safe.
112 */
113
114static int dl_load(DSO *dso, const char *filename)
115 {
116 shl_t ptr;
117 char translated[DSO_MAX_TRANSLATED_SIZE];
118 int len;
119
120 /* The same comment as in dlfcn_load applies here. bleurgh. */
121 len = strlen(filename);
122 if((dso->flags & DSO_FLAG_NAME_TRANSLATION) &&
123 (len + 6 < DSO_MAX_TRANSLATED_SIZE) &&
124 (strstr(filename, "/") == NULL))
125 {
126 sprintf(translated, "lib%s.so", filename);
127 ptr = shl_load(translated, BIND_IMMEDIATE, NULL);
128 }
129 else
130 ptr = shl_load(filename, BIND_IMMEDIATE, NULL);
131 if(ptr == NULL)
132 {
133 DSOerr(DSO_F_DL_LOAD,DSO_R_LOAD_FAILED);
134 return(0);
135 }
136 if(!sk_push(dso->meth_data, (char *)ptr))
137 {
138 DSOerr(DSO_F_DL_LOAD,DSO_R_STACK_ERROR);
139 shl_unload(ptr);
140 return(0);
141 }
142 return(1);
143 }
144
145static int dl_unload(DSO *dso)
146 {
147 shl_t ptr;
148 if(dso == NULL)
149 {
150 DSOerr(DSO_F_DL_UNLOAD,ERR_R_PASSED_NULL_PARAMETER);
151 return(0);
152 }
153 if(sk_num(dso->meth_data) < 1)
154 return(1);
155 /* Is this statement legal? */
156 ptr = (shl_t)sk_pop(dso->meth_data);
157 if(ptr == NULL)
158 {
159 DSOerr(DSO_F_DL_UNLOAD,DSO_R_NULL_HANDLE);
160 /* Should push the value back onto the stack in
161 * case of a retry. */
162 sk_push(dso->meth_data, (char *)ptr);
163 return(0);
164 }
165 shl_unload(ptr);
166 return(1);
167 }
168
169static void *dl_bind_var(DSO *dso, const char *symname)
170 {
171 shl_t ptr;
172 void *sym;
173
174 if((dso == NULL) || (symname == NULL))
175 {
176 DSOerr(DSO_F_DL_BIND_VAR,ERR_R_PASSED_NULL_PARAMETER);
177 return(NULL);
178 }
179 if(sk_num(dso->meth_data) < 1)
180 {
181 DSOerr(DSO_F_DL_BIND_VAR,DSO_R_STACK_ERROR);
182 return(NULL);
183 }
184 ptr = (shl_t)sk_value(dso->meth_data, sk_num(dso->meth_data) - 1);
185 if(ptr == NULL)
186 {
187 DSOerr(DSO_F_DL_BIND_VAR,DSO_R_NULL_HANDLE);
188 return(NULL);
189 }
190 if (shl_findsym(ptr, symname, TYPE_UNDEFINED, &sym) < 0)
191 {
192 DSOerr(DSO_F_DL_BIND_VAR,DSO_R_SYM_FAILURE);
193 return(NULL);
194 }
195 return(sym);
196 }
197
198static DSO_FUNC_TYPE dl_bind_func(DSO *dso, const char *symname)
199 {
200 shl_t ptr;
201 void *sym;
202
203 if((dso == NULL) || (symname == NULL))
204 {
205 DSOerr(DSO_F_DL_BIND_FUNC,ERR_R_PASSED_NULL_PARAMETER);
206 return(NULL);
207 }
208 if(sk_num(dso->meth_data) < 1)
209 {
210 DSOerr(DSO_F_DL_BIND_FUNC,DSO_R_STACK_ERROR);
211 return(NULL);
212 }
213 ptr = (shl_t)sk_value(dso->meth_data, sk_num(dso->meth_data) - 1);
214 if(ptr == NULL)
215 {
216 DSOerr(DSO_F_DL_BIND_FUNC,DSO_R_NULL_HANDLE);
217 return(NULL);
218 }
219 if (shl_findsym(ptr, symname, TYPE_UNDEFINED, &sym) < 0)
220 {
221 DSOerr(DSO_F_DL_BIND_FUNC,DSO_R_SYM_FAILURE);
222 return(NULL);
223 }
224 return((DSO_FUNC_TYPE)sym);
225 }
226
227static int dl_ctrl(DSO *dso, int cmd, long larg, void *parg)
228 {
229 if(dso == NULL)
230 {
231 DSOerr(DSO_F_DL_CTRL,ERR_R_PASSED_NULL_PARAMETER);
232 return(-1);
233 }
234 switch(cmd)
235 {
236 case DSO_CTRL_GET_FLAGS:
237 return dso->flags;
238 case DSO_CTRL_SET_FLAGS:
239 dso->flags = (int)larg;
240 return(0);
241 case DSO_CTRL_OR_FLAGS:
242 dso->flags |= (int)larg;
243 return(0);
244 default:
245 break;
246 }
247 DSOerr(DSO_F_DL_CTRL,DSO_R_UNKNOWN_COMMAND);
248 return(-1);
249 }
250
251#endif /* DSO_DL */
diff --git a/src/lib/libcrypto/dso/dso_vms.c b/src/lib/libcrypto/dso/dso_vms.c
new file mode 100644
index 0000000000..8ff7090129
--- /dev/null
+++ b/src/lib/libcrypto/dso/dso_vms.c
@@ -0,0 +1,371 @@
1/* dso_vms.c */
2/* Written by Richard Levitte (richard@levitte.org) for the OpenSSL
3 * project 2000.
4 */
5/* ====================================================================
6 * Copyright (c) 2000 The OpenSSL Project. All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 *
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 *
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in
17 * the documentation and/or other materials provided with the
18 * distribution.
19 *
20 * 3. All advertising materials mentioning features or use of this
21 * software must display the following acknowledgment:
22 * "This product includes software developed by the OpenSSL Project
23 * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24 *
25 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26 * endorse or promote products derived from this software without
27 * prior written permission. For written permission, please contact
28 * licensing@OpenSSL.org.
29 *
30 * 5. Products derived from this software may not be called "OpenSSL"
31 * nor may "OpenSSL" appear in their names without prior written
32 * permission of the OpenSSL Project.
33 *
34 * 6. Redistributions of any form whatsoever must retain the following
35 * acknowledgment:
36 * "This product includes software developed by the OpenSSL Project
37 * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38 *
39 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
43 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50 * OF THE POSSIBILITY OF SUCH DAMAGE.
51 * ====================================================================
52 *
53 * This product includes cryptographic software written by Eric Young
54 * (eay@cryptsoft.com). This product includes software written by Tim
55 * Hudson (tjh@cryptsoft.com).
56 *
57 */
58
59#include <stdio.h>
60#include <string.h>
61#include <errno.h>
62#ifdef VMS
63#pragma message disable DOLLARID
64#include <lib$routines.h>
65#include <libfisdef.h>
66#include <stsdef.h>
67#include <descrip.h>
68#include <starlet.h>
69#endif
70#include "cryptlib.h"
71#include <openssl/dso.h>
72
73#ifndef VMS
74DSO_METHOD *DSO_METHOD_vms(void)
75 {
76 return NULL;
77 }
78#else
79#pragma message disable DOLLARID
80
81static int vms_load(DSO *dso, const char *filename);
82static int vms_unload(DSO *dso);
83static void *vms_bind_var(DSO *dso, const char *symname);
84static DSO_FUNC_TYPE vms_bind_func(DSO *dso, const char *symname);
85#if 0
86static int vms_unbind_var(DSO *dso, char *symname, void *symptr);
87static int vms_unbind_func(DSO *dso, char *symname, DSO_FUNC_TYPE symptr);
88static int vms_init(DSO *dso);
89static int vms_finish(DSO *dso);
90#endif
91static long vms_ctrl(DSO *dso, int cmd, long larg, void *parg);
92
93static DSO_METHOD dso_meth_vms = {
94 "OpenSSL 'VMS' shared library method",
95 vms_load,
96 NULL, /* unload */
97 vms_bind_var,
98 vms_bind_func,
99/* For now, "unbind" doesn't exist */
100#if 0
101 NULL, /* unbind_var */
102 NULL, /* unbind_func */
103#endif
104 vms_ctrl,
105 NULL, /* init */
106 NULL /* finish */
107 };
108
109/* On VMS, the only "handle" is the file name. LIB$FIND_IMAGE_SYMBOL depends
110 * on the reference to the file name being the same for all calls regarding
111 * one shared image, so we'll just store it in an instance of the following
112 * structure and put a pointer to that instance in the meth_data stack.
113 */
114typedef struct dso_internal_st
115 {
116 /* This should contain the name only, no directory,
117 * no extension, nothing but a name. */
118 struct dsc$descriptor_s filename_dsc;
119 char filename[FILENAME_MAX+1];
120 /* This contains whatever is not in filename, if needed.
121 * Normally not defined. */
122 struct dsc$descriptor_s imagename_dsc;
123 char imagename[FILENAME_MAX+1];
124 } DSO_VMS_INTERNAL;
125
126
127DSO_METHOD *DSO_METHOD_vms(void)
128 {
129 return(&dso_meth_vms);
130 }
131
132static int vms_load(DSO *dso, const char *filename)
133 {
134 DSO_VMS_INTERNAL *p;
135 const char *sp1, *sp2; /* Search result */
136
137 /* A file specification may look like this:
138 *
139 * node::dev:[dir-spec]name.type;ver
140 *
141 * or (for compatibility with TOPS-20):
142 *
143 * node::dev:<dir-spec>name.type;ver
144 *
145 * and the dir-spec uses '.' as separator. Also, a dir-spec
146 * may consist of several parts, with mixed use of [] and <>:
147 *
148 * [dir1.]<dir2>
149 *
150 * We need to split the file specification into the name and
151 * the rest (both before and after the name itself).
152 */
153 /* Start with trying to find the end of a dir-spec, and save the
154 position of the byte after in sp1 */
155 sp1 = strrchr(filename, ']');
156 sp2 = strrchr(filename, '>');
157 if (sp1 == NULL) sp1 = sp2;
158 if (sp2 != NULL && sp2 > sp1) sp1 = sp2;
159 if (sp1 == NULL) sp1 = strrchr(filename, ':');
160 if (sp1 == NULL)
161 sp1 = filename;
162 else
163 sp1++; /* The byte after the found character */
164 /* Now, let's see if there's a type, and save the position in sp2 */
165 sp2 = strchr(sp1, '.');
166 /* If we found it, that's where we'll cut. Otherwise, look for a
167 version number and save the position in sp2 */
168 if (sp2 == NULL) sp2 = strchr(sp1, ';');
169 /* If there was still nothing to find, set sp2 to point at the end of
170 the string */
171 if (sp2 == NULL) sp2 = sp1 + strlen(sp1);
172
173 /* Check that we won't get buffer overflows */
174 if (sp2 - sp1 > FILENAME_MAX
175 || (sp1 - filename) + strlen(sp2) > FILENAME_MAX)
176 {
177 DSOerr(DSO_F_VMS_LOAD,DSO_R_FILENAME_TOO_BIG);
178 return(0);
179 }
180
181 p = (DSO_VMS_INTERNAL *)OPENSSL_malloc(sizeof(DSO_VMS_INTERNAL));
182 if(p == NULL)
183 {
184 DSOerr(DSO_F_VMS_LOAD,ERR_R_MALLOC_FAILURE);
185 return(0);
186 }
187
188 strncpy(p->filename, sp1, sp2-sp1);
189 p->filename[sp2-sp1] = '\0';
190
191 strncpy(p->imagename, filename, sp1-filename);
192 p->imagename[sp1-filename] = '\0';
193 strcat(p->imagename, sp2);
194
195 p->filename_dsc.dsc$w_length = strlen(p->filename);
196 p->filename_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
197 p->filename_dsc.dsc$b_class = DSC$K_CLASS_S;
198 p->filename_dsc.dsc$a_pointer = p->filename;
199 p->imagename_dsc.dsc$w_length = strlen(p->imagename);
200 p->imagename_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
201 p->imagename_dsc.dsc$b_class = DSC$K_CLASS_S;
202 p->imagename_dsc.dsc$a_pointer = p->imagename;
203
204 if(!sk_push(dso->meth_data, (char *)p))
205 {
206 DSOerr(DSO_F_VMS_LOAD,DSO_R_STACK_ERROR);
207 OPENSSL_free(p);
208 return(0);
209 }
210 return(1);
211 }
212
213/* Note that this doesn't actually unload the shared image, as there is no
214 * such thing in VMS. Next time it get loaded again, a new copy will
215 * actually be loaded.
216 */
217static int vms_unload(DSO *dso)
218 {
219 DSO_VMS_INTERNAL *p;
220 if(dso == NULL)
221 {
222 DSOerr(DSO_F_VMS_UNLOAD,ERR_R_PASSED_NULL_PARAMETER);
223 return(0);
224 }
225 if(sk_num(dso->meth_data) < 1)
226 return(1);
227 p = (DSO_VMS_INTERNAL *)sk_pop(dso->meth_data);
228 if(p == NULL)
229 {
230 DSOerr(DSO_F_VMS_UNLOAD,DSO_R_NULL_HANDLE);
231 return(0);
232 }
233 /* Cleanup */
234 OPENSSL_free(p);
235 return(1);
236 }
237
238/* We must do this in a separate function because of the way the exception
239 handler works (it makes this function return */
240static int do_find_symbol(DSO_VMS_INTERNAL *ptr,
241 struct dsc$descriptor_s *symname_dsc, void **sym,
242 unsigned long flags)
243 {
244 /* Make sure that signals are caught and returned instead of
245 aborting the program. The exception handler gets unestablished
246 automatically on return from this function. */
247 lib$establish(lib$sig_to_ret);
248
249 if(ptr->imagename_dsc.dsc$w_length)
250 return lib$find_image_symbol(&ptr->filename_dsc,
251 symname_dsc, sym,
252 &ptr->imagename_dsc, flags);
253 else
254 return lib$find_image_symbol(&ptr->filename_dsc,
255 symname_dsc, sym,
256 0, flags);
257 }
258
259void vms_bind_sym(DSO *dso, const char *symname, void **sym)
260 {
261 DSO_VMS_INTERNAL *ptr;
262 int status;
263 int flags = LIB$M_FIS_MIXEDCASE;
264 struct dsc$descriptor_s symname_dsc;
265 *sym = NULL;
266
267 symname_dsc.dsc$w_length = strlen(symname);
268 symname_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
269 symname_dsc.dsc$b_class = DSC$K_CLASS_S;
270 symname_dsc.dsc$a_pointer = (char *)symname; /* The cast is needed */
271
272 if((dso == NULL) || (symname == NULL))
273 {
274 DSOerr(DSO_F_VMS_BIND_VAR,ERR_R_PASSED_NULL_PARAMETER);
275 return;
276 }
277 if(sk_num(dso->meth_data) < 1)
278 {
279 DSOerr(DSO_F_VMS_BIND_VAR,DSO_R_STACK_ERROR);
280 return;
281 }
282 ptr = (DSO_VMS_INTERNAL *)sk_value(dso->meth_data,
283 sk_num(dso->meth_data) - 1);
284 if(ptr == NULL)
285 {
286 DSOerr(DSO_F_VMS_BIND_VAR,DSO_R_NULL_HANDLE);
287 return;
288 }
289
290 if(dso->flags & DSO_FLAG_UPCASE_SYMBOL) flags = 0;
291
292 status = do_find_symbol(ptr, &symname_dsc, sym, flags);
293
294 if(!$VMS_STATUS_SUCCESS(status))
295 {
296 unsigned short length;
297 char errstring[257];
298 struct dsc$descriptor_s errstring_dsc;
299
300 errstring_dsc.dsc$w_length = sizeof(errstring);
301 errstring_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
302 errstring_dsc.dsc$b_class = DSC$K_CLASS_S;
303 errstring_dsc.dsc$a_pointer = errstring;
304
305 *sym = NULL;
306
307 status = sys$getmsg(status, &length, &errstring_dsc, 1, 0);
308
309 if (!$VMS_STATUS_SUCCESS(status))
310 lib$signal(status); /* This is really bad. Abort! */
311 else
312 {
313 errstring[length] = '\0';
314
315 DSOerr(DSO_F_VMS_BIND_VAR,DSO_R_SYM_FAILURE);
316 if (ptr->imagename_dsc.dsc$w_length)
317 ERR_add_error_data(9,
318 "Symbol ", symname,
319 " in ", ptr->filename,
320 " (", ptr->imagename, ")",
321 ": ", errstring);
322 else
323 ERR_add_error_data(6,
324 "Symbol ", symname,
325 " in ", ptr->filename,
326 ": ", errstring);
327 }
328 return;
329 }
330 return;
331 }
332
333static void *vms_bind_var(DSO *dso, const char *symname)
334 {
335 void *sym = 0;
336 vms_bind_sym(dso, symname, &sym);
337 return sym;
338 }
339
340static DSO_FUNC_TYPE vms_bind_func(DSO *dso, const char *symname)
341 {
342 DSO_FUNC_TYPE sym = 0;
343 vms_bind_sym(dso, symname, (void **)&sym);
344 return sym;
345 }
346
347static long vms_ctrl(DSO *dso, int cmd, long larg, void *parg)
348 {
349 if(dso == NULL)
350 {
351 DSOerr(DSO_F_VMS_CTRL,ERR_R_PASSED_NULL_PARAMETER);
352 return(-1);
353 }
354 switch(cmd)
355 {
356 case DSO_CTRL_GET_FLAGS:
357 return dso->flags;
358 case DSO_CTRL_SET_FLAGS:
359 dso->flags = (int)larg;
360 return(0);
361 case DSO_CTRL_OR_FLAGS:
362 dso->flags |= (int)larg;
363 return(0);
364 default:
365 break;
366 }
367 DSOerr(DSO_F_VMS_CTRL,DSO_R_UNKNOWN_COMMAND);
368 return(-1);
369 }
370
371#endif /* VMS */
diff --git a/src/lib/libcrypto/dso/dso_win32.c b/src/lib/libcrypto/dso/dso_win32.c
new file mode 100644
index 0000000000..7f1d904806
--- /dev/null
+++ b/src/lib/libcrypto/dso/dso_win32.c
@@ -0,0 +1,273 @@
1/* dso_win32.c */
2/* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL
3 * project 2000.
4 */
5/* ====================================================================
6 * Copyright (c) 2000 The OpenSSL Project. All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 *
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 *
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in
17 * the documentation and/or other materials provided with the
18 * distribution.
19 *
20 * 3. All advertising materials mentioning features or use of this
21 * software must display the following acknowledgment:
22 * "This product includes software developed by the OpenSSL Project
23 * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24 *
25 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26 * endorse or promote products derived from this software without
27 * prior written permission. For written permission, please contact
28 * licensing@OpenSSL.org.
29 *
30 * 5. Products derived from this software may not be called "OpenSSL"
31 * nor may "OpenSSL" appear in their names without prior written
32 * permission of the OpenSSL Project.
33 *
34 * 6. Redistributions of any form whatsoever must retain the following
35 * acknowledgment:
36 * "This product includes software developed by the OpenSSL Project
37 * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38 *
39 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
43 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50 * OF THE POSSIBILITY OF SUCH DAMAGE.
51 * ====================================================================
52 *
53 * This product includes cryptographic software written by Eric Young
54 * (eay@cryptsoft.com). This product includes software written by Tim
55 * Hudson (tjh@cryptsoft.com).
56 *
57 */
58
59#include <stdio.h>
60#include <string.h>
61#include "cryptlib.h"
62#include <openssl/dso.h>
63
64#ifndef WIN32
65DSO_METHOD *DSO_METHOD_win32(void)
66 {
67 return NULL;
68 }
69#else
70
71/* Part of the hack in "win32_load" ... */
72#define DSO_MAX_TRANSLATED_SIZE 256
73
74static int win32_load(DSO *dso, const char *filename);
75static int win32_unload(DSO *dso);
76static void *win32_bind_var(DSO *dso, const char *symname);
77static DSO_FUNC_TYPE win32_bind_func(DSO *dso, const char *symname);
78#if 0
79static int win32_unbind_var(DSO *dso, char *symname, void *symptr);
80static int win32_unbind_func(DSO *dso, char *symname, DSO_FUNC_TYPE symptr);
81static int win32_init(DSO *dso);
82static int win32_finish(DSO *dso);
83#endif
84static long win32_ctrl(DSO *dso, int cmd, long larg, void *parg);
85
86static DSO_METHOD dso_meth_win32 = {
87 "OpenSSL 'win32' shared library method",
88 win32_load,
89 win32_unload,
90 win32_bind_var,
91 win32_bind_func,
92/* For now, "unbind" doesn't exist */
93#if 0
94 NULL, /* unbind_var */
95 NULL, /* unbind_func */
96#endif
97 win32_ctrl,
98 NULL, /* init */
99 NULL /* finish */
100 };
101
102DSO_METHOD *DSO_METHOD_win32(void)
103 {
104 return(&dso_meth_win32);
105 }
106
107/* For this DSO_METHOD, our meth_data STACK will contain;
108 * (i) a pointer to the handle (HINSTANCE) returned from
109 * LoadLibrary(), and copied.
110 */
111
112static int win32_load(DSO *dso, const char *filename)
113 {
114 HINSTANCE h, *p;
115 char translated[DSO_MAX_TRANSLATED_SIZE];
116 int len;
117
118 /* NB: This is a hideous hack, but I'm not yet sure what
119 * to replace it with. This attempts to convert any filename,
120 * that looks like it has no path information, into a
121 * translated form, e. "blah" -> "blah.dll" ... I'm more
122 * comfortable putting hacks into win32 code though ;-) */
123 len = strlen(filename);
124 if((dso->flags & DSO_FLAG_NAME_TRANSLATION) &&
125 (len + 4 < DSO_MAX_TRANSLATED_SIZE) &&
126 (strstr(filename, "/") == NULL) &&
127 (strstr(filename, "\\") == NULL) &&
128 (strstr(filename, ":") == NULL))
129 {
130 sprintf(translated, "%s.dll", filename);
131 h = LoadLibrary(translated);
132 }
133 else
134 h = LoadLibrary(filename);
135 if(h == NULL)
136 {
137 DSOerr(DSO_F_WIN32_LOAD,DSO_R_LOAD_FAILED);
138 return(0);
139 }
140 p = (HINSTANCE *)OPENSSL_malloc(sizeof(HINSTANCE));
141 if(p == NULL)
142 {
143 DSOerr(DSO_F_WIN32_LOAD,ERR_R_MALLOC_FAILURE);
144 FreeLibrary(h);
145 return(0);
146 }
147 *p = h;
148 if(!sk_push(dso->meth_data, (char *)p))
149 {
150 DSOerr(DSO_F_WIN32_LOAD,DSO_R_STACK_ERROR);
151 FreeLibrary(h);
152 OPENSSL_free(p);
153 return(0);
154 }
155 return(1);
156 }
157
158static int win32_unload(DSO *dso)
159 {
160 HINSTANCE *p;
161 if(dso == NULL)
162 {
163 DSOerr(DSO_F_WIN32_UNLOAD,ERR_R_PASSED_NULL_PARAMETER);
164 return(0);
165 }
166 if(sk_num(dso->meth_data) < 1)
167 return(1);
168 p = (HINSTANCE *)sk_pop(dso->meth_data);
169 if(p == NULL)
170 {
171 DSOerr(DSO_F_WIN32_UNLOAD,DSO_R_NULL_HANDLE);
172 return(0);
173 }
174 if(!FreeLibrary(*p))
175 {
176 DSOerr(DSO_F_WIN32_UNLOAD,DSO_R_UNLOAD_FAILED);
177 /* We should push the value back onto the stack in
178 * case of a retry. */
179 sk_push(dso->meth_data, (char *)p);
180 return(0);
181 }
182 /* Cleanup */
183 OPENSSL_free(p);
184 return(1);
185 }
186
187/* Using GetProcAddress for variables? TODO: Check this out in
188 * the Win32 API docs, there's probably a variant for variables. */
189static void *win32_bind_var(DSO *dso, const char *symname)
190 {
191 HINSTANCE *ptr;
192 void *sym;
193
194 if((dso == NULL) || (symname == NULL))
195 {
196 DSOerr(DSO_F_WIN32_BIND_VAR,ERR_R_PASSED_NULL_PARAMETER);
197 return(NULL);
198 }
199 if(sk_num(dso->meth_data) < 1)
200 {
201 DSOerr(DSO_F_WIN32_BIND_VAR,DSO_R_STACK_ERROR);
202 return(NULL);
203 }
204 ptr = (HINSTANCE *)sk_value(dso->meth_data, sk_num(dso->meth_data) - 1);
205 if(ptr == NULL)
206 {
207 DSOerr(DSO_F_WIN32_BIND_VAR,DSO_R_NULL_HANDLE);
208 return(NULL);
209 }
210 sym = GetProcAddress(*ptr, symname);
211 if(sym == NULL)
212 {
213 DSOerr(DSO_F_WIN32_BIND_VAR,DSO_R_SYM_FAILURE);
214 return(NULL);
215 }
216 return(sym);
217 }
218
219static DSO_FUNC_TYPE win32_bind_func(DSO *dso, const char *symname)
220 {
221 HINSTANCE *ptr;
222 void *sym;
223
224 if((dso == NULL) || (symname == NULL))
225 {
226 DSOerr(DSO_F_WIN32_BIND_FUNC,ERR_R_PASSED_NULL_PARAMETER);
227 return(NULL);
228 }
229 if(sk_num(dso->meth_data) < 1)
230 {
231 DSOerr(DSO_F_WIN32_BIND_FUNC,DSO_R_STACK_ERROR);
232 return(NULL);
233 }
234 ptr = (HINSTANCE *)sk_value(dso->meth_data, sk_num(dso->meth_data) - 1);
235 if(ptr == NULL)
236 {
237 DSOerr(DSO_F_WIN32_BIND_FUNC,DSO_R_NULL_HANDLE);
238 return(NULL);
239 }
240 sym = GetProcAddress(*ptr, symname);
241 if(sym == NULL)
242 {
243 DSOerr(DSO_F_WIN32_BIND_FUNC,DSO_R_SYM_FAILURE);
244 return(NULL);
245 }
246 return((DSO_FUNC_TYPE)sym);
247 }
248
249static long win32_ctrl(DSO *dso, int cmd, long larg, void *parg)
250 {
251 if(dso == NULL)
252 {
253 DSOerr(DSO_F_WIN32_CTRL,ERR_R_PASSED_NULL_PARAMETER);
254 return(-1);
255 }
256 switch(cmd)
257 {
258 case DSO_CTRL_GET_FLAGS:
259 return dso->flags;
260 case DSO_CTRL_SET_FLAGS:
261 dso->flags = (int)larg;
262 return(0);
263 case DSO_CTRL_OR_FLAGS:
264 dso->flags |= (int)larg;
265 return(0);
266 default:
267 break;
268 }
269 DSOerr(DSO_F_WIN32_CTRL,DSO_R_UNKNOWN_COMMAND);
270 return(-1);
271 }
272
273#endif /* WIN32 */