1238384Sjkim/* dso_beos.c */ 2280304Sjkim/* 3280304Sjkim * Written by Marcin Konicki (ahwayakchih@neoni.net) for the OpenSSL project 4280304Sjkim * 2000. 5238384Sjkim */ 6238384Sjkim/* ==================================================================== 7238384Sjkim * Copyright (c) 2000 The OpenSSL Project. All rights reserved. 8238384Sjkim * 9238384Sjkim * Redistribution and use in source and binary forms, with or without 10238384Sjkim * modification, are permitted provided that the following conditions 11238384Sjkim * are met: 12238384Sjkim * 13238384Sjkim * 1. Redistributions of source code must retain the above copyright 14280304Sjkim * notice, this list of conditions and the following disclaimer. 15238384Sjkim * 16238384Sjkim * 2. Redistributions in binary form must reproduce the above copyright 17238384Sjkim * notice, this list of conditions and the following disclaimer in 18238384Sjkim * the documentation and/or other materials provided with the 19238384Sjkim * distribution. 20238384Sjkim * 21238384Sjkim * 3. All advertising materials mentioning features or use of this 22238384Sjkim * software must display the following acknowledgment: 23238384Sjkim * "This product includes software developed by the OpenSSL Project 24238384Sjkim * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 25238384Sjkim * 26238384Sjkim * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 27238384Sjkim * endorse or promote products derived from this software without 28238384Sjkim * prior written permission. For written permission, please contact 29238384Sjkim * licensing@OpenSSL.org. 30238384Sjkim * 31238384Sjkim * 5. Products derived from this software may not be called "OpenSSL" 32238384Sjkim * nor may "OpenSSL" appear in their names without prior written 33238384Sjkim * permission of the OpenSSL Project. 34238384Sjkim * 35238384Sjkim * 6. Redistributions of any form whatsoever must retain the following 36238384Sjkim * acknowledgment: 37238384Sjkim * "This product includes software developed by the OpenSSL Project 38238384Sjkim * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 39238384Sjkim * 40238384Sjkim * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 41238384Sjkim * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 42238384Sjkim * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 43238384Sjkim * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 44238384Sjkim * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 45238384Sjkim * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 46238384Sjkim * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 47238384Sjkim * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48238384Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 49238384Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 50238384Sjkim * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 51238384Sjkim * OF THE POSSIBILITY OF SUCH DAMAGE. 52238384Sjkim * ==================================================================== 53238384Sjkim * 54238384Sjkim * This product includes cryptographic software written by Eric Young 55238384Sjkim * (eay@cryptsoft.com). This product includes software written by Tim 56238384Sjkim * Hudson (tjh@cryptsoft.com). 57238384Sjkim * 58238384Sjkim */ 59238384Sjkim 60238384Sjkim#include <stdio.h> 61238384Sjkim#include <string.h> 62238384Sjkim#include "cryptlib.h" 63238384Sjkim#include <openssl/dso.h> 64238384Sjkim 65238384Sjkim#if !defined(OPENSSL_SYS_BEOS) 66238384SjkimDSO_METHOD *DSO_METHOD_beos(void) 67280304Sjkim{ 68280304Sjkim return NULL; 69280304Sjkim} 70238384Sjkim#else 71238384Sjkim 72280304Sjkim# include <kernel/image.h> 73238384Sjkim 74238384Sjkimstatic int beos_load(DSO *dso); 75238384Sjkimstatic int beos_unload(DSO *dso); 76238384Sjkimstatic void *beos_bind_var(DSO *dso, const char *symname); 77238384Sjkimstatic DSO_FUNC_TYPE beos_bind_func(DSO *dso, const char *symname); 78280304Sjkim# if 0 79238384Sjkimstatic int beos_unbind_var(DSO *dso, char *symname, void *symptr); 80238384Sjkimstatic int beos_unbind_func(DSO *dso, char *symname, DSO_FUNC_TYPE symptr); 81238384Sjkimstatic int beos_init(DSO *dso); 82238384Sjkimstatic int beos_finish(DSO *dso); 83238384Sjkimstatic long beos_ctrl(DSO *dso, int cmd, long larg, void *parg); 84280304Sjkim# endif 85238384Sjkimstatic char *beos_name_converter(DSO *dso, const char *filename); 86238384Sjkim 87238384Sjkimstatic DSO_METHOD dso_meth_beos = { 88280304Sjkim "OpenSSL 'beos' shared library method", 89280304Sjkim beos_load, 90280304Sjkim beos_unload, 91280304Sjkim beos_bind_var, 92280304Sjkim beos_bind_func, 93238384Sjkim/* For now, "unbind" doesn't exist */ 94280304Sjkim# if 0 95280304Sjkim NULL, /* unbind_var */ 96280304Sjkim NULL, /* unbind_func */ 97280304Sjkim# endif 98280304Sjkim NULL, /* ctrl */ 99280304Sjkim beos_name_converter, 100280304Sjkim NULL, /* init */ 101280304Sjkim NULL /* finish */ 102280304Sjkim}; 103238384Sjkim 104238384SjkimDSO_METHOD *DSO_METHOD_beos(void) 105280304Sjkim{ 106280304Sjkim return (&dso_meth_beos); 107280304Sjkim} 108238384Sjkim 109280304Sjkim/* 110280304Sjkim * For this DSO_METHOD, our meth_data STACK will contain; (i) a pointer to 111280304Sjkim * the handle (image_id) returned from load_add_on(). 112238384Sjkim */ 113238384Sjkim 114238384Sjkimstatic int beos_load(DSO *dso) 115280304Sjkim{ 116280304Sjkim image_id id; 117280304Sjkim /* See applicable comments from dso_dl.c */ 118280304Sjkim char *filename = DSO_convert_filename(dso, NULL); 119238384Sjkim 120280304Sjkim if (filename == NULL) { 121280304Sjkim DSOerr(DSO_F_BEOS_LOAD, DSO_R_NO_FILENAME); 122280304Sjkim goto err; 123280304Sjkim } 124280304Sjkim id = load_add_on(filename); 125280304Sjkim if (id < 1) { 126280304Sjkim DSOerr(DSO_F_BEOS_LOAD, DSO_R_LOAD_FAILED); 127280304Sjkim ERR_add_error_data(3, "filename(", filename, ")"); 128280304Sjkim goto err; 129280304Sjkim } 130280304Sjkim if (!sk_push(dso->meth_data, (char *)id)) { 131280304Sjkim DSOerr(DSO_F_BEOS_LOAD, DSO_R_STACK_ERROR); 132280304Sjkim goto err; 133280304Sjkim } 134280304Sjkim /* Success */ 135280304Sjkim dso->loaded_filename = filename; 136280304Sjkim return (1); 137280304Sjkim err: 138280304Sjkim /* Cleanup ! */ 139280304Sjkim if (filename != NULL) 140280304Sjkim OPENSSL_free(filename); 141280304Sjkim if (id > 0) 142280304Sjkim unload_add_on(id); 143280304Sjkim return (0); 144280304Sjkim} 145238384Sjkim 146238384Sjkimstatic int beos_unload(DSO *dso) 147280304Sjkim{ 148280304Sjkim image_id id; 149280304Sjkim if (dso == NULL) { 150280304Sjkim DSOerr(DSO_F_BEOS_UNLOAD, ERR_R_PASSED_NULL_PARAMETER); 151280304Sjkim return (0); 152280304Sjkim } 153280304Sjkim if (sk_num(dso->meth_data) < 1) 154280304Sjkim return (1); 155280304Sjkim id = (image_id) sk_pop(dso->meth_data); 156280304Sjkim if (id < 1) { 157280304Sjkim DSOerr(DSO_F_BEOS_UNLOAD, DSO_R_NULL_HANDLE); 158280304Sjkim return (0); 159280304Sjkim } 160280304Sjkim if (unload_add_on(id) != B_OK) { 161280304Sjkim DSOerr(DSO_F_BEOS_UNLOAD, DSO_R_UNLOAD_FAILED); 162280304Sjkim /* 163280304Sjkim * We should push the value back onto the stack in case of a retry. 164280304Sjkim */ 165280304Sjkim sk_push(dso->meth_data, (char *)id); 166280304Sjkim return (0); 167280304Sjkim } 168280304Sjkim return (1); 169280304Sjkim} 170238384Sjkim 171238384Sjkimstatic void *beos_bind_var(DSO *dso, const char *symname) 172280304Sjkim{ 173280304Sjkim image_id id; 174280304Sjkim void *sym; 175238384Sjkim 176280304Sjkim if ((dso == NULL) || (symname == NULL)) { 177280304Sjkim DSOerr(DSO_F_BEOS_BIND_VAR, ERR_R_PASSED_NULL_PARAMETER); 178280304Sjkim return (NULL); 179280304Sjkim } 180280304Sjkim if (sk_num(dso->meth_data) < 1) { 181280304Sjkim DSOerr(DSO_F_BEOS_BIND_VAR, DSO_R_STACK_ERROR); 182280304Sjkim return (NULL); 183280304Sjkim } 184280304Sjkim id = (image_id) sk_value(dso->meth_data, sk_num(dso->meth_data) - 1); 185280304Sjkim if (id < 1) { 186280304Sjkim DSOerr(DSO_F_BEOS_BIND_VAR, DSO_R_NULL_HANDLE); 187280304Sjkim return (NULL); 188280304Sjkim } 189280304Sjkim if (get_image_symbol(id, symname, B_SYMBOL_TYPE_DATA, &sym) != B_OK) { 190280304Sjkim DSOerr(DSO_F_BEOS_BIND_VAR, DSO_R_SYM_FAILURE); 191280304Sjkim ERR_add_error_data(3, "symname(", symname, ")"); 192280304Sjkim return (NULL); 193280304Sjkim } 194280304Sjkim return (sym); 195280304Sjkim} 196238384Sjkim 197238384Sjkimstatic DSO_FUNC_TYPE beos_bind_func(DSO *dso, const char *symname) 198280304Sjkim{ 199280304Sjkim image_id id; 200280304Sjkim void *sym; 201238384Sjkim 202280304Sjkim if ((dso == NULL) || (symname == NULL)) { 203280304Sjkim DSOerr(DSO_F_BEOS_BIND_FUNC, ERR_R_PASSED_NULL_PARAMETER); 204280304Sjkim return (NULL); 205280304Sjkim } 206280304Sjkim if (sk_num(dso->meth_data) < 1) { 207280304Sjkim DSOerr(DSO_F_BEOS_BIND_FUNC, DSO_R_STACK_ERROR); 208280304Sjkim return (NULL); 209280304Sjkim } 210280304Sjkim id = (image_id) sk_value(dso->meth_data, sk_num(dso->meth_data) - 1); 211280304Sjkim if (id < 1) { 212280304Sjkim DSOerr(DSO_F_BEOS_BIND_FUNC, DSO_R_NULL_HANDLE); 213280304Sjkim return (NULL); 214280304Sjkim } 215280304Sjkim if (get_image_symbol(id, symname, B_SYMBOL_TYPE_TEXT, &sym) != B_OK) { 216280304Sjkim DSOerr(DSO_F_BEOS_BIND_FUNC, DSO_R_SYM_FAILURE); 217280304Sjkim ERR_add_error_data(3, "symname(", symname, ")"); 218280304Sjkim return (NULL); 219280304Sjkim } 220280304Sjkim return ((DSO_FUNC_TYPE)sym); 221280304Sjkim} 222238384Sjkim 223238384Sjkim/* This one is the same as the one in dlfcn */ 224238384Sjkimstatic char *beos_name_converter(DSO *dso, const char *filename) 225280304Sjkim{ 226280304Sjkim char *translated; 227280304Sjkim int len, rsize, transform; 228238384Sjkim 229280304Sjkim len = strlen(filename); 230280304Sjkim rsize = len + 1; 231280304Sjkim transform = (strstr(filename, "/") == NULL); 232280304Sjkim if (transform) { 233280304Sjkim /* We will convert this to "%s.so" or "lib%s.so" */ 234280304Sjkim rsize += 3; /* The length of ".so" */ 235280304Sjkim if ((DSO_flags(dso) & DSO_FLAG_NAME_TRANSLATION_EXT_ONLY) == 0) 236280304Sjkim rsize += 3; /* The length of "lib" */ 237280304Sjkim } 238280304Sjkim translated = OPENSSL_malloc(rsize); 239280304Sjkim if (translated == NULL) { 240280304Sjkim DSOerr(DSO_F_BEOS_NAME_CONVERTER, DSO_R_NAME_TRANSLATION_FAILED); 241280304Sjkim return (NULL); 242280304Sjkim } 243280304Sjkim if (transform) { 244280304Sjkim if ((DSO_flags(dso) & DSO_FLAG_NAME_TRANSLATION_EXT_ONLY) == 0) 245280304Sjkim sprintf(translated, "lib%s.so", filename); 246280304Sjkim else 247280304Sjkim sprintf(translated, "%s.so", filename); 248280304Sjkim } else 249280304Sjkim sprintf(translated, "%s", filename); 250280304Sjkim return (translated); 251280304Sjkim} 252238384Sjkim 253238384Sjkim#endif 254