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);