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.
This commit is contained in:
Richard Levitte 2000-10-26 18:30:34 +00:00
parent 51c8dc37dd
commit d9efa3616a
3 changed files with 40 additions and 17 deletions

View File

@ -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

View File

@ -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);

View File

@ -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);