pcs 98/02/24 02:30:57
Modified: src ApacheCore.dsp ApacheCore.mak src/modules/standard mod_so.c src/os/unix os.h src/os/win32 modules.c os.h Log: Replace os/win32/mod_dll.c and modules/standard/mod_so.c with a single unified mod_so. The required dynamic loading functions are abstracted in os/{win32,unix}/os.h to these manifest constants: os_dl_module_handle_type type of handle returned by os_dl_load os_dl_load(l) load a file os_dl_unload(l) unload a file os_dl_sym(h,s) find address of a symbol os_dl_error() get last os_dl_*() call error as a string Reviewed by: Randy Terbush and Martin Kraemer (untested) Revision Changes Path 1.20 +4 -4 apache-1.3/src/ApacheCore.dsp Index: ApacheCore.dsp =================================================================== RCS file: /export/home/cvs/apache-1.3/src/ApacheCore.dsp,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- ApacheCore.dsp 1998/02/24 09:23:46 1.19 +++ ApacheCore.dsp 1998/02/24 10:30:52 1.20 @@ -185,10 +185,6 @@ # End Source File # Begin Source File -SOURCE=.\os\win32\mod_dll.c -# End Source File -# Begin Source File - SOURCE=.\modules\standard\mod_env.c # End Source File # Begin Source File @@ -218,6 +214,10 @@ # Begin Source File SOURCE=.\modules\standard\mod_setenvif.c +# End Source File +# Begin Source File + +SOURCE=.\modules\standard\mod_so.c # End Source File # Begin Source File 1.30 +58 -50 apache-1.3/src/ApacheCore.mak Index: ApacheCore.mak =================================================================== RCS file: /export/home/cvs/apache-1.3/src/ApacheCore.mak,v retrieving revision 1.29 retrieving revision 1.30 diff -u -r1.29 -r1.30 --- ApacheCore.mak 1998/02/24 09:23:47 1.29 +++ ApacheCore.mak 1998/02/24 10:30:52 1.30 @@ -73,7 +73,6 @@ [EMAIL PROTECTED] "$(INTDIR)\mod_autoindex.obj" [EMAIL PROTECTED] "$(INTDIR)\mod_cgi.obj" [EMAIL PROTECTED] "$(INTDIR)\mod_dir.obj" - [EMAIL PROTECTED] "$(INTDIR)\mod_dll.obj" [EMAIL PROTECTED] "$(INTDIR)\mod_env.obj" [EMAIL PROTECTED] "$(INTDIR)\mod_imap.obj" [EMAIL PROTECTED] "$(INTDIR)\mod_include.obj" @@ -82,6 +81,7 @@ [EMAIL PROTECTED] "$(INTDIR)\mod_mime.obj" [EMAIL PROTECTED] "$(INTDIR)\mod_negotiation.obj" [EMAIL PROTECTED] "$(INTDIR)\mod_setenvif.obj" + [EMAIL PROTECTED] "$(INTDIR)\mod_so.obj" [EMAIL PROTECTED] "$(INTDIR)\mod_userdir.obj" [EMAIL PROTECTED] "$(INTDIR)\modules.obj" [EMAIL PROTECTED] "$(INTDIR)\multithread.obj" @@ -143,7 +143,6 @@ "$(INTDIR)\mod_autoindex.obj" \ "$(INTDIR)\mod_cgi.obj" \ "$(INTDIR)\mod_dir.obj" \ - "$(INTDIR)\mod_dll.obj" \ "$(INTDIR)\mod_env.obj" \ "$(INTDIR)\mod_imap.obj" \ "$(INTDIR)\mod_include.obj" \ @@ -152,6 +151,7 @@ "$(INTDIR)\mod_mime.obj" \ "$(INTDIR)\mod_negotiation.obj" \ "$(INTDIR)\mod_setenvif.obj" \ + "$(INTDIR)\mod_so.obj" \ "$(INTDIR)\mod_userdir.obj" \ "$(INTDIR)\modules.obj" \ "$(INTDIR)\multithread.obj" \ @@ -232,8 +232,6 @@ [EMAIL PROTECTED] "$(INTDIR)\mod_cgi.sbr" [EMAIL PROTECTED] "$(INTDIR)\mod_dir.obj" [EMAIL PROTECTED] "$(INTDIR)\mod_dir.sbr" - [EMAIL PROTECTED] "$(INTDIR)\mod_dll.obj" - [EMAIL PROTECTED] "$(INTDIR)\mod_dll.sbr" [EMAIL PROTECTED] "$(INTDIR)\mod_env.obj" [EMAIL PROTECTED] "$(INTDIR)\mod_env.sbr" [EMAIL PROTECTED] "$(INTDIR)\mod_imap.obj" @@ -250,6 +248,8 @@ [EMAIL PROTECTED] "$(INTDIR)\mod_negotiation.sbr" [EMAIL PROTECTED] "$(INTDIR)\mod_setenvif.obj" [EMAIL PROTECTED] "$(INTDIR)\mod_setenvif.sbr" + [EMAIL PROTECTED] "$(INTDIR)\mod_so.obj" + [EMAIL PROTECTED] "$(INTDIR)\mod_so.sbr" [EMAIL PROTECTED] "$(INTDIR)\mod_userdir.obj" [EMAIL PROTECTED] "$(INTDIR)\mod_userdir.sbr" [EMAIL PROTECTED] "$(INTDIR)\modules.obj" @@ -315,7 +315,6 @@ "$(INTDIR)\mod_autoindex.sbr" \ "$(INTDIR)\mod_cgi.sbr" \ "$(INTDIR)\mod_dir.sbr" \ - "$(INTDIR)\mod_dll.sbr" \ "$(INTDIR)\mod_env.sbr" \ "$(INTDIR)\mod_imap.sbr" \ "$(INTDIR)\mod_include.sbr" \ @@ -324,6 +323,7 @@ "$(INTDIR)\mod_mime.sbr" \ "$(INTDIR)\mod_negotiation.sbr" \ "$(INTDIR)\mod_setenvif.sbr" \ + "$(INTDIR)\mod_so.sbr" \ "$(INTDIR)\mod_userdir.sbr" \ "$(INTDIR)\modules.sbr" \ "$(INTDIR)\multithread.sbr" \ @@ -373,7 +373,6 @@ "$(INTDIR)\mod_autoindex.obj" \ "$(INTDIR)\mod_cgi.obj" \ "$(INTDIR)\mod_dir.obj" \ - "$(INTDIR)\mod_dll.obj" \ "$(INTDIR)\mod_env.obj" \ "$(INTDIR)\mod_imap.obj" \ "$(INTDIR)\mod_include.obj" \ @@ -382,6 +381,7 @@ "$(INTDIR)\mod_mime.obj" \ "$(INTDIR)\mod_negotiation.obj" \ "$(INTDIR)\mod_setenvif.obj" \ + "$(INTDIR)\mod_so.obj" \ "$(INTDIR)\mod_userdir.obj" \ "$(INTDIR)\modules.obj" \ "$(INTDIR)\multithread.obj" \ @@ -1439,47 +1439,6 @@ !ENDIF -SOURCE=.\os\win32\mod_dll.c - -!IF "$(CFG)" == "ApacheCore - Win32 Release" - -DEP_CPP_MOD_DL=\ - ".\include\alloc.h"\ - ".\include\ap.h"\ - ".\include\buff.h"\ - ".\include\conf.h"\ - ".\include\hsregex.h"\ - ".\include\http_config.h"\ - ".\include\httpd.h"\ - ".\os\win32\os.h"\ - ".\os\win32\readdir.h"\ - - -"$(INTDIR)\mod_dll.obj" : $(SOURCE) $(DEP_CPP_MOD_DL) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ELSEIF "$(CFG)" == "ApacheCore - Win32 Debug" - -DEP_CPP_MOD_DL=\ - ".\include\alloc.h"\ - ".\include\ap.h"\ - ".\include\buff.h"\ - ".\include\conf.h"\ - ".\include\hsregex.h"\ - ".\include\http_config.h"\ - ".\include\httpd.h"\ - ".\os\win32\os.h"\ - ".\os\win32\readdir.h"\ - - -"$(INTDIR)\mod_dll.obj" "$(INTDIR)\mod_dll.sbr" : $(SOURCE) $(DEP_CPP_MOD_DL)\ - "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -!ENDIF - SOURCE=.\modules\standard\mod_env.c !IF "$(CFG)" == "ApacheCore - Win32 Release" @@ -1860,6 +1819,49 @@ !ENDIF +SOURCE=.\modules\standard\mod_so.c + +!IF "$(CFG)" == "ApacheCore - Win32 Release" + +DEP_CPP_MOD_SO=\ + ".\include\alloc.h"\ + ".\include\ap.h"\ + ".\include\buff.h"\ + ".\include\conf.h"\ + ".\include\hsregex.h"\ + ".\include\http_config.h"\ + ".\include\http_log.h"\ + ".\include\httpd.h"\ + ".\os\win32\os.h"\ + ".\os\win32\readdir.h"\ + + +"$(INTDIR)\mod_so.obj" : $(SOURCE) $(DEP_CPP_MOD_SO) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ELSEIF "$(CFG)" == "ApacheCore - Win32 Debug" + +DEP_CPP_MOD_SO=\ + ".\include\alloc.h"\ + ".\include\ap.h"\ + ".\include\buff.h"\ + ".\include\conf.h"\ + ".\include\hsregex.h"\ + ".\include\http_config.h"\ + ".\include\http_log.h"\ + ".\include\httpd.h"\ + ".\os\win32\os.h"\ + ".\os\win32\readdir.h"\ + + +"$(INTDIR)\mod_so.obj" "$(INTDIR)\mod_so.sbr" : $(SOURCE) $(DEP_CPP_MOD_SO)\ + "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ENDIF + SOURCE=.\modules\standard\mod_userdir.c !IF "$(CFG)" == "ApacheCore - Win32 Release" @@ -1943,6 +1945,9 @@ !ENDIF SOURCE=.\os\win32\multithread.c + +!IF "$(CFG)" == "ApacheCore - Win32 Release" + DEP_CPP_MULTI=\ ".\include\conf.h"\ ".\include\hsregex.h"\ @@ -1950,15 +1955,18 @@ ".\os\win32\os.h"\ -!IF "$(CFG)" == "ApacheCore - Win32 Release" - - "$(INTDIR)\multithread.obj" : $(SOURCE) $(DEP_CPP_MULTI) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "ApacheCore - Win32 Debug" +DEP_CPP_MULTI=\ + ".\include\conf.h"\ + ".\include\hsregex.h"\ + ".\include\multithread.h"\ + ".\os\win32\os.h"\ + "$(INTDIR)\multithread.obj" "$(INTDIR)\multithread.sbr" : $(SOURCE)\ $(DEP_CPP_MULTI) "$(INTDIR)" 1.5 +29 -50 apache-1.3/src/modules/standard/mod_so.c Index: mod_so.c =================================================================== RCS file: /export/home/cvs/apache-1.3/src/modules/standard/mod_so.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- mod_so.c 1998/02/07 01:07:11 1.4 +++ mod_so.c 1998/02/24 10:30:54 1.5 @@ -114,7 +114,7 @@ */ /* - * Module definition information + * Module definition information used by Configure * * MODULE-DEFINITION-START * Name: so_module @@ -139,43 +139,6 @@ #include "http_config.h" #include "http_log.h" - /* Os-specific stuff that goes in conf.h */ - -#if defined(LINUX) || defined(__FreeBSD__) || defined(SOLARIS) || \ - defined(__bsdi__) || defined(IRIX) -#define HAS_DLFCN -#endif - -#if defined(__FreeBSD__) -#define NEED_UNDERSCORE_SYM -#endif - - /* OSes that don't support dlopen */ -#if defined(UW) || defined(ULTRIX) -#define NO_DL -#endif - - /* Start of real module */ -#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 - -#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 -#endif - -static int have_symbol_table = 0; - #ifndef NO_DLOPEN /* This is the cleanup for a loaded DLL. It unloads the module. @@ -195,7 +158,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,8 +174,21 @@ { /* 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); +} + +#ifdef WIN32 +/* This is a cleanup which does nothing. On Win32 using the API-provided + * null_cleanup() function gives a "pointers to functions + * with different attributes" error during compilation. + */ +void mod_so_null_cleanup(module *modp) +{ + /* This function left intentionally blank */ } +#else +# define mod_so_null_cleanup null_cleanup +#endif /* load_module is called for the directive LoadModule */ @@ -223,11 +199,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 +215,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 +229,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 +255,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; } 1.6 +43 -0 apache-1.3/src/os/unix/os.h Index: os.h =================================================================== RCS file: /export/home/cvs/apache-1.3/src/os/unix/os.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- os.h 1998/02/14 03:07:58 1.5 +++ os.h 1998/02/24 10:30:55 1.6 @@ -18,3 +18,46 @@ */ extern int os_is_path_absolute(const char *f); #endif + +/* + * Abstraction layer for dynamic loading of modules (mod_so.c) + */ + +#if defined(LINUX) || defined(__FreeBSD__) || defined(SOLARIS) || \ + defined(__bsdi__) || defined(IRIX) +# define HAS_DLFCN +#endif + +#if defined(__FreeBSD__) +# define NEED_UNDERSCORE_SYM +#endif + + /* OSes that don't support dlopen */ +#if defined(UW) || defined(ULTRIX) +# define NO_DL +#endif + + /* Start of real module */ +#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 + +#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 +#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() 1.7 +3 -3 apache-1.3/src/os/win32/modules.c Index: modules.c =================================================================== RCS file: /export/home/cvs/apache-1.3/src/os/win32/modules.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- modules.c 1997/08/13 08:37:34 1.6 +++ modules.c 1998/02/24 10:30:56 1.7 @@ -6,7 +6,7 @@ #include "http_config.h" extern module core_module; -extern module dll_module; +extern module so_module; extern module mime_module; extern module access_module; extern module auth_module; @@ -27,7 +27,7 @@ module *prelinked_modules[] = { &core_module, - &dll_module, + &so_module, &mime_module, &access_module, &auth_module, @@ -49,7 +49,7 @@ }; module *preloaded_modules[] = { &core_module, - &dll_module, + &so_module, &mime_module, &access_module, &auth_module, 1.13 +9 -0 apache-1.3/src/os/win32/os.h Index: os.h =================================================================== RCS file: /export/home/cvs/apache-1.3/src/os/win32/os.h,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- os.h 1998/02/14 03:08:00 1.12 +++ os.h 1998/02/24 10:30:56 1.13 @@ -95,3 +95,12 @@ #define _spawnle os_spawnle #define spawnle os_spawnle API_EXPORT(int) os_spawnle(int mode,const char *cmdname,...); + +/* Abstractions for dealing with shared object files (DLLs on Win32). + * These are used by mod_so.c + */ +#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 */