PR: 2589
[openssl.git] / crypto / dso / dso_beos.c
1 /* dso_beos.c */
2 /* Written by Marcin Konicki (ahwayakchih@neoni.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 #if !defined(OPENSSL_SYS_BEOS)
65 DSO_METHOD *DSO_METHOD_beos(void)
66         {
67         return NULL;
68         }
69 #else
70
71 #include <kernel/image.h>
72
73 static int beos_load(DSO *dso);
74 static int beos_unload(DSO *dso);
75 static void *beos_bind_var(DSO *dso, const char *symname);
76 static DSO_FUNC_TYPE beos_bind_func(DSO *dso, const char *symname);
77 #if 0
78 static int beos_unbind_var(DSO *dso, char *symname, void *symptr);
79 static int beos_unbind_func(DSO *dso, char *symname, DSO_FUNC_TYPE symptr);
80 static int beos_init(DSO *dso);
81 static int beos_finish(DSO *dso);
82 static long beos_ctrl(DSO *dso, int cmd, long larg, void *parg);
83 #endif
84 static char *beos_name_converter(DSO *dso, const char *filename);
85
86 static DSO_METHOD dso_meth_beos = {
87         "OpenSSL 'beos' shared library method",
88         beos_load,
89         beos_unload,
90         beos_bind_var,
91         beos_bind_func,
92 /* For now, "unbind" doesn't exist */
93 #if 0
94         NULL, /* unbind_var */
95         NULL, /* unbind_func */
96 #endif
97         NULL, /* ctrl */
98         beos_name_converter,
99         NULL, /* init */
100         NULL  /* finish */
101         };
102
103 DSO_METHOD *DSO_METHOD_beos(void)
104         {
105         return(&dso_meth_beos);
106         }
107
108 /* For this DSO_METHOD, our meth_data STACK will contain;
109  * (i) a pointer to the handle (image_id) returned from
110  *     load_add_on().
111  */
112
113 static int beos_load(DSO *dso)
114         {
115         image_id id;
116         /* See applicable comments from dso_dl.c */
117         char *filename = DSO_convert_filename(dso, NULL);
118
119         if(filename == NULL)
120                 {
121                 DSOerr(DSO_F_BEOS_LOAD,DSO_R_NO_FILENAME);
122                 goto err;
123                 }
124         id = load_add_on(filename);
125         if(id < 1)
126                 {
127                 DSOerr(DSO_F_BEOS_LOAD,DSO_R_LOAD_FAILED);
128                 ERR_add_error_data(3, "filename(", filename, ")");
129                 goto err;
130                 }
131         if(!sk_push(dso->meth_data, (char *)id))
132                 {
133                 DSOerr(DSO_F_BEOS_LOAD,DSO_R_STACK_ERROR);
134                 goto err;
135                 }
136         /* Success */
137         dso->loaded_filename = filename;
138         return(1);
139 err:
140         /* Cleanup !*/
141         if(filename != NULL)
142                 OPENSSL_free(filename);
143         if(id > 0)
144                 unload_add_on(id);
145         return(0);
146         }
147
148 static int beos_unload(DSO *dso)
149         {
150         image_id id;
151         if(dso == NULL)
152                 {
153                 DSOerr(DSO_F_BEOS_UNLOAD,ERR_R_PASSED_NULL_PARAMETER);
154                 return(0);
155                 }
156         if(sk_num(dso->meth_data) < 1)
157                 return(1);
158         id = (image_id)sk_pop(dso->meth_data);
159         if(id < 1)
160                 {
161                 DSOerr(DSO_F_BEOS_UNLOAD,DSO_R_NULL_HANDLE);
162                 return(0);
163                 }
164         if(unload_add_on(id) != B_OK)
165                 {
166                 DSOerr(DSO_F_BEOS_UNLOAD,DSO_R_UNLOAD_FAILED);
167                 /* We should push the value back onto the stack in
168                  * case of a retry. */
169                 sk_push(dso->meth_data, (char *)id);
170                 return(0);
171                 }
172         return(1);
173         }
174
175 static void *beos_bind_var(DSO *dso, const char *symname)
176         {
177         image_id id;
178         void *sym;
179
180         if((dso == NULL) || (symname == NULL))
181                 {
182                 DSOerr(DSO_F_BEOS_BIND_VAR,ERR_R_PASSED_NULL_PARAMETER);
183                 return(NULL);
184                 }
185         if(sk_num(dso->meth_data) < 1)
186                 {
187                 DSOerr(DSO_F_BEOS_BIND_VAR,DSO_R_STACK_ERROR);
188                 return(NULL);
189                 }
190         id = (image_id)sk_value(dso->meth_data, sk_num(dso->meth_data) - 1);
191         if(id < 1)
192                 {
193                 DSOerr(DSO_F_BEOS_BIND_VAR,DSO_R_NULL_HANDLE);
194                 return(NULL);
195                 }
196         if(get_image_symbol(id, symname, B_SYMBOL_TYPE_DATA, &sym) != B_OK)
197                 {
198                 DSOerr(DSO_F_BEOS_BIND_VAR,DSO_R_SYM_FAILURE);
199                 ERR_add_error_data(3, "symname(", symname, ")");
200                 return(NULL);
201                 }
202         return(sym);
203         }
204
205 static DSO_FUNC_TYPE beos_bind_func(DSO *dso, const char *symname)
206         {
207         image_id id;
208         void *sym;
209
210         if((dso == NULL) || (symname == NULL))
211                 {
212                 DSOerr(DSO_F_BEOS_BIND_FUNC,ERR_R_PASSED_NULL_PARAMETER);
213                 return(NULL);
214                 }
215         if(sk_num(dso->meth_data) < 1)
216                 {
217                 DSOerr(DSO_F_BEOS_BIND_FUNC,DSO_R_STACK_ERROR);
218                 return(NULL);
219                 }
220         id = (image_id)sk_value(dso->meth_data, sk_num(dso->meth_data) - 1);
221         if(id < 1)
222                 {
223                 DSOerr(DSO_F_BEOS_BIND_FUNC,DSO_R_NULL_HANDLE);
224                 return(NULL);
225                 }
226         if(get_image_symbol(id, symname, B_SYMBOL_TYPE_TEXT, &sym) != B_OK)
227                 {
228                 DSOerr(DSO_F_BEOS_BIND_FUNC,DSO_R_SYM_FAILURE);
229                 ERR_add_error_data(3, "symname(", symname, ")");
230                 return(NULL);
231                 }
232         return((DSO_FUNC_TYPE)sym);
233         }
234
235 /* This one is the same as the one in dlfcn */
236 static char *beos_name_converter(DSO *dso, const char *filename)
237         {
238         char *translated;
239         int len, rsize, transform;
240
241         len = strlen(filename);
242         rsize = len + 1;
243         transform = (strstr(filename, "/") == NULL);
244         if(transform)
245                 {
246                 /* We will convert this to "%s.so" or "lib%s.so" */
247                 rsize += 3;     /* The length of ".so" */
248                 if ((DSO_flags(dso) & DSO_FLAG_NAME_TRANSLATION_EXT_ONLY) == 0)
249                         rsize += 3; /* The length of "lib" */
250                 }
251         translated = OPENSSL_malloc(rsize);
252         if(translated == NULL)
253                 {
254                 DSOerr(DSO_F_BEOS_NAME_CONVERTER,
255                                 DSO_R_NAME_TRANSLATION_FAILED);
256                 return(NULL);
257                 }
258         if(transform)
259                 {
260                 if ((DSO_flags(dso) & DSO_FLAG_NAME_TRANSLATION_EXT_ONLY) == 0)
261                         sprintf(translated, "lib%s.so", filename);
262                 else
263                         sprintf(translated, "%s.so", filename);
264                 }
265         else
266                 sprintf(translated, "%s", filename);
267         return(translated);
268         }
269
270 #endif