summaryrefslogtreecommitdiffstats
path: root/crypto/dso
diff options
context:
space:
mode:
authorRichard Levitte <levitte@openssl.org>2000-10-26 18:30:34 +0000
committerRichard Levitte <levitte@openssl.org>2000-10-26 18:30:34 +0000
commitd9efa3616a46c4f5ab10ee54ae8b68061774bf2b (patch)
treee7e4c7a395a90babe09fcb9e38193f2773b4b77c /crypto/dso
parent51c8dc37dd4d655cf44f07d16dc985627a8e3577 (diff)
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.
Diffstat (limited to 'crypto/dso')
-rw-r--r--crypto/dso/dso.h12
-rw-r--r--crypto/dso/dso_dl.c23
-rw-r--r--crypto/dso/dso_dlfcn.c22
3 files changed, 40 insertions, 17 deletions
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);