OpenSSL  1.0.1c
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros
dso_beos.c
Go to the documentation of this file.
1 /* dso_beos.c */
2 /* Written by Marcin Konicki ([email protected]) 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
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  * ([email protected]). This product includes software written by Tim
55  * Hudson ([email protected]).
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)
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 
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  {
122  goto err;
123  }
124  id = load_add_on(filename);
125  if(id < 1)
126  {
128  ERR_add_error_data(3, "filename(", filename, ")");
129  goto err;
130  }
131  if(!sk_push(dso->meth_data, (char *)id))
132  {
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  {
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  {
162  return(0);
163  }
164  if(unload_add_on(id) != B_OK)
165  {
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  {
183  return(NULL);
184  }
185  if(sk_num(dso->meth_data) < 1)
186  {
188  return(NULL);
189  }
190  id = (image_id)sk_value(dso->meth_data, sk_num(dso->meth_data) - 1);
191  if(id < 1)
192  {
194  return(NULL);
195  }
196  if(get_image_symbol(id, symname, B_SYMBOL_TYPE_DATA, &sym) != B_OK)
197  {
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  {
213  return(NULL);
214  }
215  if(sk_num(dso->meth_data) < 1)
216  {
218  return(NULL);
219  }
220  id = (image_id)sk_value(dso->meth_data, sk_num(dso->meth_data) - 1);
221  if(id < 1)
222  {
224  return(NULL);
225  }
226  if(get_image_symbol(id, symname, B_SYMBOL_TYPE_TEXT, &sym) != B_OK)
227  {
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" */
249  rsize += 3; /* The length of "lib" */
250  }
251  translated = OPENSSL_malloc(rsize);
252  if(translated == NULL)
253  {
256  return(NULL);
257  }
258  if(transform)
259  {
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