提交 d9efa361 编写于 作者: R Richard Levitte

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.
上级 51c8dc37
......@@ -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
......
......@@ -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);
......
......@@ -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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册