rse 98/03/10 01:22:32
Modified: src/modules/standard mod_so.c
Log:
And finally a bunch of new comments and cosmetics for mod_so.
Revision Changes Path
1.8 +102 -77 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.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- mod_so.c 1998/03/10 08:52:58 1.7
+++ mod_so.c 1998/03/10 09:22:32 1.8
@@ -52,66 +52,70 @@
*/
/*
- * This module is used to load Apache modules at runtime. This means
- * that the server functionality can be extended without recompiling
- * and even without taking the server down at all!
+ * This module is used to load Apache modules at runtime. This means that the
+ * server functionality can be extended without recompiling and even without
+ * taking the server down at all. Only a HUP or USR1 signal needs to be send
+ * to the server to reload the dynamically loaded modules.
*
* To use, you'll first need to build your module as a shared library, then
- * update your configuration (httpd.conf) to get the Apache core to
- * load the module at start-up.
+ * update your configuration (httpd.conf) to get the Apache core to load the
+ * module at start-up.
*
* The easiest way to build a module as a shared library is to use the
- * "SharedModule" command in the Configuration file, instead of AddModule.
- * You should also change the file extension from .o to .so. So, for example,
- * to build the status module as a shared library edit Configuration
+ * `SharedModule' command in the Configuration file, instead of `AddModule'.
+ * You should also change the file extension from `.o' to `.so'. So, for
+ * example, to build the status module as a shared library edit Configuration
* and change
* AddModule modules/standard/mod_status.o
* to
* SharedModule modules/standard/mod_status.so
*
- * Run Configure and make. Now Apache's httpd will _not_ include
- * mod_status. Instead a shared library called mod_status.so will be
- * build, in the modules/standard directory. You can build any or all
- * modules as shared libraries like this.
+ * Run Configure and make. Now Apache's httpd binary will _not_ include
+ * mod_status. Instead a shared object called mod_status.so will be build, in
+ * the modules/standard directory. You can build most of the modules as
shared
+ * libraries like this.
*
* To use the shared module, move the .so file(s) into an appropriate
- * directory. You might like to create a directory called "modules" under
- * you server root for this (e.g. /usr/local/httpd/modules).
+ * directory. You might like to create a directory called "modules" under you
+ * server root for this (e.g. /usr/local/httpd/modules).
*
* Then edit your conf/httpd.conf file, and add LoadModule lines. For
* example
* LoadModule status_module modules/mod_status.so
*
- * The first argument is the module's structure name (look at the
- * end of the module source to find this). The second option is
- * the path to the module file, relative to the server root.
- * Put these directives right at the top of your httpd.conf file.
- *
- * Now you can start Apache. A message will be logged at "debug" level
- * to your error_log to confirm that the module(s) are loaded (use
- * "LogLevel debug" directive to get these log messages).
- *
- * If you edit the LoadModule directives while the server is live you
- * can get Apache to re-load the modules by sending it a HUP or USR1
- * signal as normal. You can use this to dynamically change the
- * capability of your server without bringing it down.
+ * The first argument is the module's structure name (look at the end of the
+ * module source to find this). The second option is the path to the module
+ * file, relative to the server root. Put these directives right at the top
+ * of your httpd.conf file.
+ *
+ * Now you can start Apache. A message will be logged at "debug" level to
your
+ * error_log to confirm that the module(s) are loaded (use "LogLevel debug"
+ * directive to get these log messages).
+ *
+ * If you edit the LoadModule directives while the server is live you can get
+ * Apache to re-load the modules by sending it a HUP or USR1 signal as
normal.
+ * You can use this to dynamically change the capability of your server
+ * without bringing it down.
+ *
+ * Because currently there is only limited built-in support in the Configure
+ * script for creating the shared library files (`.so'), please consult your
+ * vendors cc(1), ld(1) and dlopen(3) manpages to find out the appropriate
+ * compiler and linker flags and insert them manually into the Configuration
+ * file under CFLAGS_SHLIB, LDFLAGS_SHLIB and LDFLAGS_SHLIB_EXPORT.
+ *
+ * If you still have problems figuring out the flags both try the paper
+ * http://developer.netscape.com/library/documentation/enterprise
+ * /unix/svrplug.htm#1013807
+ * or install a Perl 5 interpreter on your platform and then run the command
+ *
+ * $ perl -V:usedl -V:ccdlflags -V:cccdlflags -V:lddlflags
+ *
+ * This gives you what type of dynamic loading Perl 5 uses on your platform
+ * and which compiler and linker flags Perl 5 uses to create the shared
object
+ * files.
*
- * Apache's Configure currently only creates shared modules on
- * Linux 2 and FreeBSD systems.
*/
-/* More details about shared libraries:
- *
- * How to create .so files on various platforms:
-
- FreeBSD:
- "gcc -fpic" to compile
- "ld -Bshareable" to link
-
- See for instructions on more platforms:
-http://developer.netscape.com/library/documentation/enterprise/unix/svrplug.htm#1013807
-
-*/
/*
* Module definition information used by Configure
@@ -168,8 +172,9 @@
#ifndef NO_DLOPEN
-/* This is the cleanup for a loaded DLL. It unloads the module.
- * This is called as a cleanup function.
+/*
+ * This is the cleanup for a loaded shared object. It unloads the module.
+ * This is called as a cleanup function from the core.
*/
void unload_module(moduleinfo *modi)
@@ -189,7 +194,8 @@
modi->name = NULL;
}
-/* unload_file is the cleanup routine for files loaded by
+/*
+ * This is the cleanup routine for files loaded by
* load_file(). Unfortunately we don't keep a record of the filename
* that was loaded, so we can't report the unload for debug purposes
* or include the filename in error message.
@@ -203,7 +209,8 @@
}
#ifdef WIN32
-/* This is a cleanup which does nothing. On Win32 using the API-provided
+/*
+ * 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.
*/
@@ -215,10 +222,13 @@
# define mod_so_null_cleanup null_cleanup
#endif
-/* load_module is called for the directive LoadModule
+/*
+ * This is called for the directive LoadModule and actually loads
+ * a shared object file into the address space of the server process.
*/
-static const char *load_module (cmd_parms *cmd, void *dummy, char *modname,
char *filename)
+static const char *load_module(cmd_parms *cmd, void *dummy,
+ char *modname, char *filename)
{
void *modhandle;
module *modp;
@@ -228,7 +238,8 @@
moduleinfo *modie;
int i;
- /* check for already existing module
+ /*
+ * check for already existing module
* If it already exists, we have nothing to do
*/
sconf = (so_server_conf *)get_module_config(cmd->server->module_config,
@@ -242,15 +253,16 @@
modi = push_array(sconf->loaded_modules);
modi->name = pstrdup(cmd->pool, modname);
- if (!(modhandle = os_dl_load(szModuleFile)))
- {
+ /*
+ * Actually load the file into the address space
+ */
+ if (!(modhandle = os_dl_load(szModuleFile))) {
const char *my_error = os_dl_error();
return pstrcat (cmd->pool, "Cannot load ", szModuleFile,
" into server: ",
my_error ? my_error : "(reason unknown)",
NULL);
- }
-
+ }
aplog_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, NULL,
"loaded module %s", modname);
@@ -258,41 +270,50 @@
modname = pstrcat(cmd->pool, "_", modname, NULL);
#endif
+ /*
+ * Retrieve the pointer to the module structure
+ * through the module name
+ */
if (!(modp = (module *)(os_dl_sym (modhandle, modname)))) {
- return pstrcat (cmd->pool, "Can't find module ", modname,
- " in file ", filename, ":", os_dl_error(), NULL);
+ return pstrcat(cmd->pool, "Can't find module ", modname,
+ " in file ", filename, ":", os_dl_error(), NULL);
}
modi->modp = modp;
-
modp->dynamic_load_handle = modhandle;
+ /*
+ * Add this module to the Apache core structures
+ */
add_module(modp);
- /* Register a cleanup in the config pool (normally pconf). When
+ /*
+ * Register a cleanup in the config pool (normally pconf). When
* we do a restart (or shutdown) this cleanup will cause the
- * DLL to be unloaded.
+ * shared object to be unloaded.
*/
register_cleanup(cmd->pool, modi,
(void (*)(void*))unload_module, mod_so_null_cleanup);
- /* Alethea Patch (rws,djw2) - need to run configuration functions
- in new modules */
-
+ /*
+ * Finally we need to run the configuration functions
+ * in new modules now.
+ */
if (modp->create_server_config)
- ((void**)cmd->server->module_config)[modp->module_index]=
+ ((void**)cmd->server->module_config)[modp->module_index] =
(*modp->create_server_config)(cmd->pool, cmd->server);
-
if (modp->create_dir_config)
- ((void**)cmd->server->lookup_defaults)[modp->module_index]=
+ ((void**)cmd->server->lookup_defaults)[modp->module_index] =
(*modp->create_dir_config)(cmd->pool, NULL);
return NULL;
}
-/* load_file implements the LoadFile directive.
+/*
+ * This implements the LoadFile directive and loads an arbitrary
+ * shared object file into the adress space of the server process.
*/
-static const char *load_file (cmd_parms *cmd, void *dummy, char *filename)
+static const char *load_file(cmd_parms *cmd, void *dummy, char *filename)
{
void *handle;
char *file;
@@ -314,26 +335,30 @@
return NULL;
}
-#else
+
+#else /* not NO_DLOPEN */
+
static const char *load_file(cmd_parms *cmd, void *dummy, char *filename)
{
- fprintf(stderr, "WARNING: LoadFile not supported\n");
- return NULL;
+ fprintf(stderr, "WARNING: LoadFile not supported on this platform\n");
+ return NULL;
}
-static const char *load_module(cmd_parms *cmd, void *dummy, char *modname,
char *filename)
+static const char *load_module(cmd_parms *cmd, void *dummy,
+ char *modname, char *filename)
{
- fprintf(stderr, "WARNING: LoadModule not supported\n");
- return NULL;
+ fprintf(stderr, "WARNING: LoadModule not supported on this platform\n");
+ return NULL;
}
-#endif
+
+#endif /* NO_DLOPEN */
command_rec so_cmds[] = {
-{ "LoadModule", load_module, NULL, RSRC_CONF, TAKE2,
- "a module name, and the name of a file to load it from"},
-{ "LoadFile", load_file, NULL, RSRC_CONF, ITERATE,
- "files or libraries to link into the server at runtime"},
-{ NULL }
+ { "LoadModule", load_module, NULL, RSRC_CONF, TAKE2,
+ "a module name, and the name of a shared object file to load it from"},
+ { "LoadFile", load_file, NULL, RSRC_CONF, ITERATE,
+ "share object files or libraries to link into the server at runtime"},
+ { NULL }
};
module MODULE_VAR_EXPORT so_module = {