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 * 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 * prompted the user for a path to a driver library so the filename should be
* interpreted as-is. */ * 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 /* The following flag controls the translation of symbol names to upper
* case. This is currently only being implemented for OpenVMS. * 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); typedef void (*DSO_FUNC_TYPE)(void);
@ -182,6 +189,7 @@ int DSO_free(DSO *dso);
int DSO_flags(DSO *dso); int DSO_flags(DSO *dso);
int DSO_up(DSO *dso); int DSO_up(DSO *dso);
long DSO_ctrl(DSO *dso, int cmd, long larg, void *parg); 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, /* 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 * 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 * 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) static char *dl_name_converter(DSO *dso, const char *filename)
{ {
char *translated; char *translated;
int len, transform; int len, rsize, transform;
len = strlen(filename); len = strlen(filename);
rsize = len + 1;
transform = (strstr(filename, "/") == NULL); transform = (strstr(filename, "/") == NULL);
if(transform) {
/* We will convert this to "lib%s.so" */ /* We will convert this to "%s.so" or "lib%s.so" */
translated = OPENSSL_malloc(len + 7); rsize += 3; /* The length of ".so" */
else if ((DSO_flags(dso) & DSO_FLAG_NAME_TRANSLATION_EXT_ONLY) == 0)
/* We will simply duplicate filename */ rsize += 3; /* The length of "lib" */
translated = OPENSSL_malloc(len + 1); }
translated = OPENSSL_malloc(rsize);
if(translated == NULL) if(translated == NULL)
{ {
DSOerr(DSO_F_DL_NAME_CONVERTER, DSOerr(DSO_F_DL_NAME_CONVERTER,
@ -257,7 +259,12 @@ static char *dl_name_converter(DSO *dso, const char *filename)
return(NULL); return(NULL);
} }
if(transform) 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 else
sprintf(translated, "%s", filename); sprintf(translated, "%s", filename);
return(translated); 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) static char *dlfcn_name_converter(DSO *dso, const char *filename)
{ {
char *translated; char *translated;
int len, transform; int len, rsize, transform;
len = strlen(filename); len = strlen(filename);
rsize = len + 1;
transform = (strstr(filename, "/") == NULL); transform = (strstr(filename, "/") == NULL);
if(transform) if(transform)
/* We will convert this to "lib%s.so" */ {
translated = OPENSSL_malloc(len + 7); /* We will convert this to "%s.so" or "lib%s.so" */
else rsize += 3; /* The length of ".so" */
/* We will simply duplicate filename */ if ((DSO_flags(dso) & DSO_FLAG_NAME_TRANSLATION_EXT_ONLY) == 0)
translated = OPENSSL_malloc(len + 1); rsize += 3; /* The length of "lib" */
}
translated = OPENSSL_malloc(rsize);
if(translated == NULL) if(translated == NULL)
{ {
DSOerr(DSO_F_DLFCN_NAME_CONVERTER, DSOerr(DSO_F_DLFCN_NAME_CONVERTER,
@ -269,7 +272,12 @@ static char *dlfcn_name_converter(DSO *dso, const char *filename)
return(NULL); return(NULL);
} }
if(transform) 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 else
sprintf(translated, "%s", filename); sprintf(translated, "%s", filename);
return(translated); return(translated);