I don't like how we detect whether DSO support should be enabled by testing for the possible implementation methods, and then rather than remembering which we found, we have all this #if THIS_OS crap all over dso/unix/dso.c. If we found dlfcn or shl or whatever, that should be what we conditionalize on, and maybe have per-OS mangling for the variant dlopen() hoo-hah out there.

So here is a patch to define macros for the found support for dynamic loading. I imagine that I picked stupid names for the macros, and would welcome a correction. Otherwise, this seem OK?

        -Fred

Index: acconfig.h
===================================================================
RCS file: /home/cvs/apr/acconfig.h,v
retrieving revision 1.41
diff -w -u -d -r1.41 acconfig.h
--- acconfig.h  2001/04/12 07:05:45     1.41
+++ acconfig.h  2001/04/18 21:45:03
@@ -29,6 +29,10 @@
 #undef HAVE_GMTOFF
 #undef USE_THREADS

+#undef DSO_USE_DLFCN
+#undef DSO_USE_SHL
+#undef DSO_USE_DYLD
+
 #undef SIZEOF_SSIZE_T
 #undef SIZEOF_SIZE_T
 #undef SIZEOF_OFF_T
Index: configure.in
===================================================================
RCS file: /home/cvs/apr/configure.in,v
retrieving revision 1.292
diff -w -u -d -r1.292 configure.in
--- configure.in        2001/04/18 17:46:39     1.292
+++ configure.in        2001/04/18 21:45:03
@@ -780,19 +780,19 @@
   [  --enable-dso            Enable dso support ],
   [ tempdso=$enableval],
   [
-    AC_CHECK_FUNCS(NSLinkModule, [ tempdso="yes" ], [ tempdso="no" ])
+    AC_CHECK_FUNCS(NSLinkModule, [ tempdso="dyld" ], [ tempdso="no" ])
     if test "$tempdso" = "no"; then
-      AC_CHECK_LIB(dl, dlopen, [ tempdso="yes" LIBS="$LIBS -ldl" ],
+      AC_CHECK_LIB(dl, dlopen, [ tempdso="dlfcn" LIBS="$LIBS -ldl" ],
                    tempdso="no")
     fi
     if test "$tempdso" = "no"; then
-      AC_CHECK_FUNCS(dlopen, [ tempdso="yes" ], [ tempdso="no" ])
+      AC_CHECK_FUNCS(dlopen, [ tempdso="dlfcn" ], [ tempdso="no" ])
     fi
     if test "$tempdso" = "no"; then
       AC_CHECK_LIB(root, load_image, tempdso="yes", tempdso="no")
     fi
     if test "$tempdso" = "no"; then
-      AC_CHECK_LIB(dld, shl_load, [ tempdso="yes" LIBS="$LIBS -ldld" ],
+      AC_CHECK_LIB(dld, shl_load, [ tempdso="shl" LIBS="$LIBS -ldld" ],
                    tempdso="no")
     fi
     if test "$tempdso" = "no"; then
@@ -807,6 +807,11 @@
 if test "$tempdso" = "no"; then
     aprdso="0"
 else
+    case "$tempdso" in
+       dlfcn) AC_DEFINE(DSO_USE_DLFCN);;
+       shl)   AC_DEFINE(DSO_USE_SHL);;
+       dyld)  AC_DEFINE(DSO_USE_DYLD);;
+    esac
     aprdso="1"
     apr_modules="$apr_modules dso"
 fi
Index: dso/unix/dso.c
===================================================================
RCS file: /home/cvs/apr/dso/unix/dso.c,v
retrieving revision 1.34
diff -w -u -d -r1.34 dso.c
--- dso/unix/dso.c      2001/04/18 17:47:10     1.34
+++ dso/unix/dso.c      2001/04/18 21:45:06
@@ -57,6 +57,10 @@

 #if APR_HAS_DSO

+#if !defined(DSO_USE_DLFCN) && !defined(DSO_USE_SHL) && !defined(DSO_USE_DYLD)
+#error No DSO implementation specified.
+#endif
+
#ifdef HAVE_STDDEF_H
#include <stddef.h>
#endif
@@ -71,11 +75,11 @@
if (dso->handle == NULL)
return APR_SUCCESS;


-#if defined(HPUX) || defined(HPUX10) || defined(HPUX11)
+#if defined(DSO_USE_SHL)
shl_unload((shl_t)dso->handle);
-#elif defined(DARWIN)
+#elif defined(DSO_USE_DYLD)
NSUnLinkModule(dso->handle, FALSE);
-#else
+#elif defined(DSO_USE_DLFCN)
if (dlclose(dso->handle) != 0)
return APR_EINIT;
#endif
@@ -87,10 +91,10 @@
APR_DECLARE(apr_status_t) apr_dso_load(apr_dso_handle_t **res_handle,
const char *path, apr_pool_t *ctx)
{
-#if defined(HPUX) || defined(HPUX10) || defined(HPUX11)
+#if defined(DSO_USE_SHL)
shl_t os_handle = shl_load(path, BIND_IMMEDIATE|BIND_VERBOSE|BIND_NOSTART, 0L);


-#elif defined(DARWIN)
+#elif defined(DSO_USE_DYLD)
     NSObjectFileImage image;
     NSModule os_handle;
     char* err_msg = NULL;
@@ -107,24 +111,26 @@
 #endif
     }

-#elif defined(OSF1) || defined(SEQUENT) || defined(SNI) ||\
+#elif defined(DSO_USE_DLFCN)
+#if defined(OSF1) || defined(SEQUENT) || defined(SNI) ||\
     (defined(__FreeBSD_version) && (__FreeBSD_version >= 220000))
     void *os_handle = dlopen((char *)path, RTLD_NOW | RTLD_GLOBAL);

 #else
     void *os_handle = dlopen(path, RTLD_NOW | RTLD_GLOBAL);
 #endif
+#endif /* DSO_USE_x */

     *res_handle = apr_pcalloc(ctx, sizeof(**res_handle));

     if(os_handle == NULL) {
-#if defined(HPUX) || defined(HPUX10) || defined(HPUX11)
+#if defined(DSO_USE_SHL)
         (*res_handle)->errormsg = strerror(errno);
         return errno;
-#elif defined(DARWIN)
+#elif defined(DSO_USE_DYLD)
         (*res_handle)->errormsg = (err_msg) ? err_msg : "link failed";
         return APR_EDSOOPEN;
-#else
+#elif defined(DSO_USE_DLFCN)
         (*res_handle)->errormsg = dlerror();
         return APR_EDSOOPEN;
 #endif
@@ -148,7 +154,7 @@
                                       apr_dso_handle_t *handle,
                                       const char *symname)
 {
-#if defined(HPUX) || defined(HPUX10) || defined(HPUX11)
+#if defined(DSO_USE_SHL)
     void *symaddr = NULL;
     int status;

@@ -161,7 +167,7 @@
     *ressym = symaddr;
     return APR_SUCCESS;

-#elif defined(DARWIN)
+#elif defined(DSO_USE_DYLD)
     void *retval = NULL;
     NSSymbol symbol;
     char *symname2 = (char*)malloc(sizeof(char)*(strlen(symname)+2));
@@ -182,7 +188,7 @@
        return APR_EINIT;
     }

-#else /* use dlsym()/dlerror() */
+#elif defined(DSO_USE_DLFCN)

 #if defined(DLSYM_NEEDS_UNDERSCORE)
     void *retval;
@@ -190,12 +196,11 @@
     sprintf(symbol, "_%s", symname);
     retval = dlsym(handle->handle, symbol);
     free(symbol);
-
 #elif defined(SEQUENT) || defined(SNI)
     void *retval = dlsym(handle->handle, (char *)symname);
 #else
     void *retval = dlsym(handle->handle, symname);
-#endif
+#endif /* DLSYM_NEEDS_UNDERSCORE */

     if (retval == NULL) {
         handle->errormsg = dlerror();
@@ -205,7 +210,7 @@
     *ressym = retval;

     return APR_SUCCESS;
-#endif /* use dlsym()/dlerror() */
+#endif /* DSO_USE_x */
 }

APR_DECLARE(const char *) apr_dso_error(apr_dso_handle_t *dso, char *buffer, apr_size_t buflen)

Reply via email to