RT3548: Remvoe unsupported platforms
[openssl.git] / crypto / dso / dso_dlfcn.c
index 168c25b9e8cb989cf24f05fd22d56879bb8786d8..0135cc1cd3f485c89735d819915911bf57e149dd 100644 (file)
@@ -78,11 +78,16 @@ DSO_METHOD *DSO_METHOD_dlfcn(void)
 #else
 
 #ifdef HAVE_DLFCN_H
+# ifdef __osf__
+#  define __EXTENSIONS__
+# endif
 # include <dlfcn.h>
 # define HAVE_DLINFO 1
 # if defined(_AIX) || defined(__CYGWIN__) || \
      defined(__SCO_VERSION__) || defined(_SCO_ELF) || \
-     (defined(__OpenBSD__) && !defined(RTLD_SELF))
+     (defined(__osf__) && !defined(RTLD_NEXT))     || \
+     (defined(__OpenBSD__) && !defined(RTLD_SELF)) || \
+       defined(__ANDROID__)
 #  undef HAVE_DLINFO
 # endif
 #endif
@@ -148,11 +153,7 @@ DSO_METHOD *DSO_METHOD_dlfcn(void)
 #              endif
 #      endif
 #else
-#      ifdef OPENSSL_SYS_SUNOS
-#              define DLOPEN_FLAG 1
-#      else
-#              define DLOPEN_FLAG RTLD_NOW /* Hope this works everywhere else */
-#      endif
+#      define DLOPEN_FLAG RTLD_NOW /* Hope this works everywhere else */
 #endif
 
 /* For this DSO_METHOD, our meth_data STACK will contain;
@@ -257,7 +258,10 @@ static void *dlfcn_bind_var(DSO *dso, const char *symname)
 static DSO_FUNC_TYPE dlfcn_bind_func(DSO *dso, const char *symname)
        {
        void *ptr;
-       DSO_FUNC_TYPE sym, *tsym = &sym;
+       union {
+               DSO_FUNC_TYPE sym;
+               void *dlret;
+       } u;
 
        if((dso == NULL) || (symname == NULL))
                {
@@ -275,14 +279,14 @@ static DSO_FUNC_TYPE dlfcn_bind_func(DSO *dso, const char *symname)
                DSOerr(DSO_F_DLFCN_BIND_FUNC,DSO_R_NULL_HANDLE);
                return(NULL);
                }
-       *(void **)(tsym) = dlsym(ptr, symname);
-       if(sym == NULL)
+       u.dlret = dlsym(ptr, symname);
+       if(u.dlret == NULL)
                {
                DSOerr(DSO_F_DLFCN_BIND_FUNC,DSO_R_SYM_FAILURE);
                ERR_add_error_data(4, "symname(", symname, "): ", dlerror());
                return(NULL);
                }
-       return(sym);
+       return u.sym;
        }
 
 static char *dlfcn_merger(DSO *dso, const char *filespec1,
@@ -351,6 +355,15 @@ static char *dlfcn_merger(DSO *dso, const char *filespec1,
        return(merged);
        }
 
+#ifdef OPENSSL_SYS_MACOSX
+#define DSO_ext        ".dylib"
+#define DSO_extlen 6
+#else
+#define DSO_ext        ".so"
+#define DSO_extlen 3
+#endif
+
+
 static char *dlfcn_name_converter(DSO *dso, const char *filename)
        {
        char *translated;
@@ -361,8 +374,8 @@ static char *dlfcn_name_converter(DSO *dso, const char *filename)
        transform = (strstr(filename, "/") == NULL);
        if(transform)
                {
-               /* We will convert this to "%s.so" or "lib%s.so" */
-               rsize += 3;     /* The length of ".so" */
+               /* We will convert this to "%s.so" or "lib%s.so" etc */
+               rsize += DSO_extlen;    /* The length of ".so" */
                if ((DSO_flags(dso) & DSO_FLAG_NAME_TRANSLATION_EXT_ONLY) == 0)
                        rsize += 3; /* The length of "lib" */
                }
@@ -376,9 +389,9 @@ static char *dlfcn_name_converter(DSO *dso, const char *filename)
        if(transform)
                {
                if ((DSO_flags(dso) & DSO_FLAG_NAME_TRANSLATION_EXT_ONLY) == 0)
-                       sprintf(translated, "lib%s.so", filename);
+                       sprintf(translated, "lib%s" DSO_ext, filename);
                else
-                       sprintf(translated, "%s.so", filename);
+                       sprintf(translated, "%s" DSO_ext, filename);
                }
        else
                sprintf(translated, "%s", filename);
@@ -447,7 +460,7 @@ static int dlfcn_pathbyaddr(void *addr,char *path,int sz)
                return len;
                }
 
-       ERR_add_error_data(4, "dlfcn_pathbyaddr(): ", dlerror());
+       ERR_add_error_data(2, "dlfcn_pathbyaddr(): ", dlerror());
 #endif
        return -1;
        }