From d9efa3616a46c4f5ab10ee54ae8b68061774bf2b Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Thu, 26 Oct 2000 18:30:34 +0000 Subject: [PATCH] For the operating systems where it matters, it is sometimes good to translate library names by only adding ".so" to them without prepending them with "lib". Add the flag DSO_FLAG_NAME_TRANSLATION_EXT_ONLY for that purpose. --- crypto/dso/dso.h | 12 ++++++++++-- crypto/dso/dso_dl.c | 23 +++++++++++++++-------- crypto/dso/dso_dlfcn.c | 22 +++++++++++++++------- 3 files changed, 40 insertions(+), 17 deletions(-) diff --git a/crypto/dso/dso.h b/crypto/dso/dso.h index add6858de8..8c495b1b24 100644 --- a/crypto/dso/dso.h +++ b/crypto/dso/dso.h @@ -81,12 +81,19 @@ extern "C" { * DSO to prevent *any* native name-translation at all - eg. if the caller has * prompted the user for a path to a driver library so the filename should be * interpreted as-is. */ -#define DSO_FLAG_NO_NAME_TRANSLATION 0x01 +#define DSO_FLAG_NO_NAME_TRANSLATION 0x01 +/* An extra flag to give if only the extension should be added as + * translation. This is obviously only of importance on Unix and + * other operating systems where the translation also may prefix + * the name with something, like 'lib', and ignored everywhere else. + * This flag is also ignored if DSO_FLAG_NO_NAME_TRANSLATION is used + * at the same time. */ +#define DSO_FLAG_NAME_TRANSLATION_EXT_ONLY 0x02 /* The following flag controls the translation of symbol names to upper * case. This is currently only being implemented for OpenVMS. */ -#define DSO_FLAG_UPCASE_SYMBOL 0x02 +#define DSO_FLAG_UPCASE_SYMBOL 0x10 typedef void (*DSO_FUNC_TYPE)(void); @@ -182,6 +189,7 @@ int DSO_free(DSO *dso); int DSO_flags(DSO *dso); int DSO_up(DSO *dso); long DSO_ctrl(DSO *dso, int cmd, long larg, void *parg); + /* This function sets the DSO's name_converter callback. If it is non-NULL, * then it will be used instead of the associated DSO_METHOD's function. If * oldcb is non-NULL then it is set to the function pointer value being diff --git a/crypto/dso/dso_dl.c b/crypto/dso/dso_dl.c index 6dd1b19755..43078604af 100644 --- a/crypto/dso/dso_dl.c +++ b/crypto/dso/dso_dl.c @@ -240,16 +240,18 @@ static DSO_FUNC_TYPE dl_bind_func(DSO *dso, const char *symname) static char *dl_name_converter(DSO *dso, const char *filename) { char *translated; - int len, transform; + int len, rsize, transform; len = strlen(filename); + rsize = len + 1; transform = (strstr(filename, "/") == NULL); - if(transform) - /* We will convert this to "lib%s.so" */ - translated = OPENSSL_malloc(len + 7); - else - /* We will simply duplicate filename */ - translated = OPENSSL_malloc(len + 1); + { + /* We will convert this to "%s.so" or "lib%s.so" */ + rsize += 3; /* The length of ".so" */ + if ((DSO_flags(dso) & DSO_FLAG_NAME_TRANSLATION_EXT_ONLY) == 0) + rsize += 3; /* The length of "lib" */ + } + translated = OPENSSL_malloc(rsize); if(translated == NULL) { DSOerr(DSO_F_DL_NAME_CONVERTER, @@ -257,7 +259,12 @@ static char *dl_name_converter(DSO *dso, const char *filename) return(NULL); } if(transform) - sprintf(translated, "lib%s.so", filename); + { + if ((DSO_flags(dso) & DSO_FLAG_NAME_TRANSLATION_EXT_ONLY) == 0) + sprintf(translated, "lib%s.so", filename); + else + sprintf(translated, "%s.so", filename); + } else sprintf(translated, "%s", filename); return(translated); diff --git a/crypto/dso/dso_dlfcn.c b/crypto/dso/dso_dlfcn.c index 279b37b0c8..22e5059dd8 100644 --- a/crypto/dso/dso_dlfcn.c +++ b/crypto/dso/dso_dlfcn.c @@ -252,16 +252,19 @@ static DSO_FUNC_TYPE dlfcn_bind_func(DSO *dso, const char *symname) static char *dlfcn_name_converter(DSO *dso, const char *filename) { char *translated; - int len, transform; + int len, rsize, transform; len = strlen(filename); + rsize = len + 1; transform = (strstr(filename, "/") == NULL); if(transform) - /* We will convert this to "lib%s.so" */ - translated = OPENSSL_malloc(len + 7); - else - /* We will simply duplicate filename */ - translated = OPENSSL_malloc(len + 1); + { + /* We will convert this to "%s.so" or "lib%s.so" */ + rsize += 3; /* The length of ".so" */ + if ((DSO_flags(dso) & DSO_FLAG_NAME_TRANSLATION_EXT_ONLY) == 0) + rsize += 3; /* The length of "lib" */ + } + translated = OPENSSL_malloc(rsize); if(translated == NULL) { DSOerr(DSO_F_DLFCN_NAME_CONVERTER, @@ -269,7 +272,12 @@ static char *dlfcn_name_converter(DSO *dso, const char *filename) return(NULL); } if(transform) - sprintf(translated, "lib%s.so", filename); + { + if ((DSO_flags(dso) & DSO_FLAG_NAME_TRANSLATION_EXT_ONLY) == 0) + sprintf(translated, "lib%s.so", filename); + else + sprintf(translated, "%s.so", filename); + } else sprintf(translated, "%s", filename); return(translated); -- 2.25.1