Attached is patch add a new command line option to httpd:
'-t -D DUMP_MODULES'
This will print a list of all loaded shared modules and all statically
compiled modules.
My only question is, what should the command be called?
'-t -D DUMP_MODULES' vs '-M' vs some other argument.
I based DUMP_MODULES on the existing DUMP_VHOSTS command, but I am not
sure if the DUMP_VHOSTS is supposed to be a standard or not?
-Paul Querna
Index: modules/mappers/mod_so.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/modules/mappers/mod_so.c,v
retrieving revision 1.57
diff -u -r1.57 mod_so.c
--- modules/mappers/mod_so.c 4 Jun 2004 22:40:46 -0000 1.57
+++ modules/mappers/mod_so.c 20 Jun 2004 01:35:44 -0000
@@ -347,6 +347,39 @@
return NULL;
}
+static void ap_dump_loaded_modules(apr_pool_t* p, server_rec* s)
+{
+ ap_module_symbol_t *modie;
+ ap_module_symbol_t *modi;
+ so_server_conf *sconf;
+ module *modp;
+ int i;
+ apr_file_t *out = NULL;
+ apr_file_open_stderr(&out, p);
+
+ apr_file_printf(out, "Available Modules:\n");
+
+ sconf = (so_server_conf *)ap_get_module_config(s->module_config,
+ &so_module);
+ for (i = 0; ; i++) {
+ modi = &ap_prelinked_module_symbols[i];
+ if (modi->name != NULL) {
+ apr_file_printf(out, " %s (static)\n", modi->name);
+ }
+ else {
+ break;
+ }
+ }
+
+ modie = (ap_module_symbol_t *)sconf->loaded_modules->elts;
+ for (i = 0; i < sconf->loaded_modules->nelts; i++) {
+ modi = &modie[i];
+ if (modi->name != NULL) {
+ apr_file_printf(out, " %s (shared)\n", modi->name);
+ }
+ }
+}
+
#else /* not NO_DLOPEN */
static const char *load_file(cmd_parms *cmd, void *dummy, const char *filename)
@@ -370,6 +403,7 @@
{
#ifndef NO_DLOPEN
APR_REGISTER_OPTIONAL_FN(ap_find_loaded_module_symbol);
+ APR_REGISTER_OPTIONAL_FN(ap_dump_loaded_modules);
#endif
}
Index: modules/mappers/mod_so.h
===================================================================
RCS file: /home/cvspublic/httpd-2.0/modules/mappers/mod_so.h,v
retrieving revision 1.1
diff -u -r1.1 mod_so.h
--- modules/mappers/mod_so.h 4 Jun 2004 22:40:47 -0000 1.1
+++ modules/mappers/mod_so.h 20 Jun 2004 01:35:44 -0000
@@ -22,6 +22,8 @@
/* optional function declaration */
APR_DECLARE_OPTIONAL_FN(module *, ap_find_loaded_module_symbol,
(server_rec *s, const char *modname));
+APR_DECLARE_OPTIONAL_FN(void, ap_dump_loaded_modules,
+ (apr_pool_t* p, server_rec *s));
#endif /* MOD_SO_H */
Index: server/main.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/server/main.c,v
retrieving revision 1.157
diff -u -r1.157 main.c
--- server/main.c 25 Apr 2004 17:23:31 -0000 1.157
+++ server/main.c 20 Jun 2004 01:35:49 -0000
@@ -36,6 +36,8 @@
#include "ap_mpm.h"
#include "mpm_common.h"
+#include "mod_so.h" /* for dumping loaded modules */
+
/* WARNING: Win32 binds http_main.c dynamically to the server. Please place
* extern functions and global data in another appropriate module.
*
@@ -319,75 +321,77 @@
#ifdef SHARED_CORE
ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
- " -R directory : specify an alternate location for "
+ " -R directory : specify an alternate location for "
"shared object files");
#endif
ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
- " -D name : define a name for use in "
+ " -D name : define a name for use in "
"<IfDefine name> directives");
ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
- " -d directory : specify an alternate initial "
+ " -d directory : specify an alternate initial "
"ServerRoot");
ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
- " -f file : specify an alternate ServerConfigFile");
+ " -f file : specify an alternate ServerConfigFile");
ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
- " -C \"directive\" : process directive before reading "
+ " -C \"directive\" : process directive before reading "
"config files");
ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
- " -c \"directive\" : process directive after reading "
+ " -c \"directive\" : process directive after reading "
"config files");
#ifdef NETWARE
ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
- " -n name : set screen name");
+ " -n name : set screen name");
#endif
#ifdef WIN32
ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
- " -n name : set service name and use its "
+ " -n name : set service name and use its "
"ServerConfigFile");
ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
- " -k start : tell Apache to start");
+ " -k start : tell Apache to start");
ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
- " -k restart : tell running Apache to do a graceful "
+ " -k restart : tell running Apache to do a graceful "
"restart");
ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
- " -k stop|shutdown : tell running Apache to shutdown");
+ " -k stop|shutdown : tell running Apache to shutdown");
ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
- " -k install : install an Apache service");
+ " -k install : install an Apache service");
ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
- " -k config : change startup Options of an Apache "
+ " -k config : change startup Options of an Apache "
"service");
ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
- " -k uninstall : uninstall an Apache service");
+ " -k uninstall : uninstall an Apache service");
ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
- " -w : hold open the console window on error");
+ " -w : hold open the console window on error");
#endif
ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
- " -e level : show startup errors of level "
+ " -e level : show startup errors of level "
"(see LogLevel)");
ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
- " -E file : log startup errors to file");
+ " -E file : log startup errors to file");
ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
- " -v : show version number");
+ " -v : show version number");
ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
- " -V : show compile settings");
+ " -V : show compile settings");
ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
- " -h : list available command line options "
+ " -h : list available command line options "
"(this page)");
ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
- " -l : list compiled in modules");
+ " -l : list compiled in modules");
ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
- " -L : list available configuration "
+ " -L : list available configuration "
"directives");
ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
- " -t -D DUMP_VHOSTS : show parsed settings (currently only "
+ " -t -D DUMP_VHOSTS : show parsed settings (currently only "
"vhost settings)");
ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
- " -S : a synonym for -t -D DUMP_VHOSTS");
+ " -t -D DUMP_MODULES : show all loaded modules ");
+ ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
+ " -S : a synonym for -t -D DUMP_VHOSTS");
ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
- " -t : run syntax check for config files");
+ " -t : run syntax check for config files");
destroy_and_exit_process(process, 1);
}
@@ -473,6 +477,8 @@
/* Setting -D DUMP_VHOSTS is equivalent to setting -S */
if (strcmp(optarg, "DUMP_VHOSTS") == 0)
configtestonly = 1;
+ if (strcmp(optarg, "DUMP_MODULES") == 0)
+ configtestonly = 1;
break;
case 'e':
@@ -585,9 +591,17 @@
rv = ap_process_config_tree(server_conf, ap_conftree,
process->pconf, ptemp);
if (rv == OK) {
+ APR_OPTIONAL_FN_TYPE(ap_dump_loaded_modules) *dump_modules =
+ APR_RETRIEVE_OPTIONAL_FN(ap_dump_loaded_modules);
+
ap_fixup_virtual_hosts(pconf, server_conf);
ap_fini_vhost_config(pconf, server_conf);
apr_hook_sort_all();
+
+ if (dump_modules && ap_exists_config_define("DUMP_MODULES")) {
+ dump_modules(pconf, server_conf);
+ }
+
if (configtestonly) {
ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, "Syntax OK");
destroy_and_exit_process(process, 0);