From: Richard Levitte Date: Thu, 26 Oct 2000 18:30:34 +0000 (+0000) Subject: For the operating systems where it matters, it is sometimes good to X-Git-Tag: BEFORE_engine~2 X-Git-Url: https://git.openssl.org/?p=openssl.git;a=commitdiff_plain;h=d9efa3616a46c4f5ab10ee54ae8b68061774bf2b 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. --- 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);