httpd-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Paul Sutton <p...@awe.com>
Subject [PATCH] merge mod_so and mod_dll (fwd)
Date Mon, 09 Feb 1998 12:05:49 GMT
> So this patch updates mod_so.c to support building on NT. It provides a

Um, the past message contained a virtual patch. Here is the real patch.

//pcs

Index: mod_so.c
===================================================================
RCS file: /export/home/cvs/apache-1.3/src/modules/standard/mod_so.c,v
retrieving revision 1.4
diff -u -r1.4 mod_so.c
--- mod_so.c	1998/02/07 01:07:11	1.4
+++ mod_so.c	1998/02/09 11:53:13
@@ -114,7 +114,7 @@
 */
 
 /*
- * Module definition information
+ * Module definition information used by Configure
  *
  * MODULE-DEFINITION-START
  * Name: so_module
@@ -139,39 +139,57 @@
 #include "http_config.h"
 #include "http_log.h"
 
-     /* Os-specific stuff that goes in conf.h */
+/* Os-specific stuff that goes in conf.h */
 
-#if defined(LINUX) || defined(__FreeBSD__) || defined(SOLARIS) || \
+#ifdef WIN32
+
+# define os_dl_module_handle_type HINSTANCE
+# define os_dl_load(l)   LoadLibraryEx(l, NULL, LOAD_WITH_ALTERED_SEARCH_PATH)
+# define os_dl_unload(l) FreeLibrary(l)
+# define os_dl_sym(h,s)  GetProcAddress(h,s)
+# define os_dl_error()   ""	/* for now */
+
+#else
+
+# if defined(LINUX) || defined(__FreeBSD__) || defined(SOLARIS) || \
     defined(__bsdi__) || defined(IRIX)
-#define HAS_DLFCN
-#endif
+#  define HAS_DLFCN
+# endif
 
-#if defined(__FreeBSD__)
-#define NEED_UNDERSCORE_SYM
-#endif
+# if defined(__FreeBSD__)
+#  define NEED_UNDERSCORE_SYM
+# endif
 
      /* OSes that don't support dlopen */
-#if defined(UW) || defined(ULTRIX)
-#define NO_DL
-#endif
+# if defined(UW) || defined(ULTRIX)
+#  define NO_DL
+# endif
 
      /* Start of real module */
-#ifdef HAS_DLFCN
-#include <dlfcn.h>
-#else
+# ifdef HAS_DLFCN
+#  include <dlfcn.h>
+# else
 void * dlopen (__const char * __filename, int __flag);
 __const char * dlerror (void);
 void * dlsym (void *, __const char *);
 int dlclose (void *);
-#endif
+# endif
 
-#ifndef RTLD_NOW
+# ifndef RTLD_NOW
 /* 
  * probably on an older system that doesn't support RTLD_NOW or RTLD_LAZY.
  * The below define is a lie since we are really doing RTLD_LAZY since the
  * system doesn't support RTLD_NOW.
  */
-#define RTLD_NOW 1
+#  define RTLD_NOW 1
+# endif
+
+# define os_dl_module_handle_type void *
+# define os_dl_load(l)   dlopen(l, RTLD_NOW)
+# define os_dl_unload(l) dlclose(l)
+# define os_dl_sym(h,s)  dlsym(h,s)
+# define os_dl_error()   dlerror()
+
 #endif
 
 static int have_symbol_table = 0;
@@ -195,7 +213,7 @@
 
     /* The Linux manpage doesn't give any way to check the success of
      * dlclose() */
-    dlclose(modp->dynamic_load_handle);
+    os_dl_unload((os_dl_module_handle_type)modp->dynamic_load_handle);
 
     aplog_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, NULL,
 		"unloaded module %s", mod_name);
@@ -211,7 +229,16 @@
 {
     /* The Linux manpage doesn't give any way to check the success of
      * dlclose() */
-    dlclose(handle);
+    os_dl_unload((os_dl_module_handle_type)handle);
+}
+
+/* This is a cleanup which does nothing. It would be nicer to use
+ * the API-provided null_cleanup() gives a "pointers to functions 
+ * with different attributes" error when compiling on Win32.
+ */
+void mod_so_null_cleanup(module *modp)
+{
+    /* This function left intentionally blank */
 }
 
 /* load_module is called for the directive LoadModule 
@@ -223,11 +250,12 @@
     module *modp;
     const char *szModuleFile=server_root_relative(cmd->pool, filename);
 
-    if (!(modhandle = dlopen(szModuleFile, RTLD_NOW)))
+    if (!(modhandle = os_dl_load(szModuleFile)))
       {
-	const char *my_error = dlerror();
+	const char *my_error = os_dl_error();
 	return pstrcat (cmd->pool, "Cannot load ", szModuleFile,
-			" into server: ", my_error,
+			" into server: ", 
+			my_error ? my_error : "(reason unknown)",
 			NULL);
       }
  
@@ -238,9 +266,9 @@
     modname = pstrcat(cmd->pool, "_", modname, NULL);
 #endif
 
-    if (!(modp = (module *)(dlsym (modhandle, modname)))) {
+    if (!(modp = (module *)(os_dl_sym (modhandle, modname)))) {
 	return pstrcat (cmd->pool, "Can't find module ", modname,
-			" in file ", filename, ":", dlerror(), NULL);
+			" in file ", filename, ":", os_dl_error(), NULL);
     }
 	
     modp->dynamic_load_handle = modhandle;
@@ -252,7 +280,7 @@
      * DLL to be unloaded.
      */
     register_cleanup(cmd->pool, modp, 
-		     (void (*)(void*))unload_module, null_cleanup);
+		     (void (*)(void*))unload_module, mod_so_null_cleanup);
 
     /* Alethea Patch (rws,djw2) - need to run configuration functions
        in new modules */
@@ -278,16 +306,18 @@
 
     file = server_root_relative(cmd->pool, filename);
     
-    if (!(handle = dlopen(file, 1))) {
-	const char *my_error = dlerror();
+    if (!(handle = os_dl_load(file))) {
+	const char *my_error = os_dl_error();
 	return pstrcat (cmd->pool, "Cannot load ", filename, 
-			" into server:", my_error, NULL);
+			" into server:", 
+			my_error ? my_error : "(reason unknown)",
+			NULL);
     }
     
     aplog_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, NULL,
 		"loaded file %s", filename);
 
-    register_cleanup(cmd->pool, handle, unload_file, null_cleanup);
+    register_cleanup(cmd->pool, handle, unload_file, mod_so_null_cleanup);
 
     return NULL;
 }



Mime
View raw message