httpd-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Randy Terbush <ra...@covalent.net>
Subject Re: [PATCH] merge mod_so and mod_dll (fwd)
Date Mon, 09 Feb 1998 16:40:37 GMT
+1 untested

Paul Sutton <paul@awe.com> wrote:
> > 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