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:
parent
51c8dc37dd
commit
d9efa3616a
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user